Что делает компилятор Java настолько быстро?

Я полагаю, вы пытаетесь запустить команду из неправильного места. Вы должны запустить 'ng serve' из каталога проектов.

Итак, в основном вы должны выполнить следующие шаги:

  1. ng new my-project
  2. cd my-project
  3. ng serve

Это должно сработать.

11
задан Lawand 31 December 2008 в 13:39
поделиться

10 ответов

На тот вопрос приятно ответили в этом: Почему компиляция C++ занимает много времени? (как jalf указанный в разделе комментариев)

В основном это - недостающее понятие модулей C++ и агрессивная оптимизация, сделанная компилятором.

16
ответ дан 3 December 2019 в 01:30
поделиться

Я думаю, что самая трудная часть не является потребностью скомпилировать заголовочные файлы (если они не являются действительно большими, но можно использовать предварительно скомпилированные заголовки в этом случае). Худшая часть всегда является тем, что грамматика C++ слишком дико контекстно-зависима. Несмотря на факт мне нравится C++, я чувствую жалость к кому-либо, кто должен записать синтаксический анализатор C++.

6
ответ дан 3 December 2019 в 01:30
поделиться

Существует несколько вещей, которые делают компилятор C++ медленнее, чем те из Java/C#. Грамматика намного более сложна, универсальное программное обеспечение намного более мощно в C++, но в то же время более дорого скомпилировать. Включение файлов работает по-другому, чем импорт модулей.

Inclussion заголовочных файлов

Во-первых, каждый раз, когда Вы включаете файл в C++, содержание файла (.h обычно) введено в текущей единице компиляции (включайте защиту, стараются не повторно вводить тот же заголовок дважды), и это является переходным. Таким образом, при включении заголовка a.h который по очереди включает b.h, единица компиляции будет включать весь код в a.h и весь код в b.h.

Java (или C#, я буду говорить о Java, но они подобны в этом), не имеют, включают файлы, они зависят от двоичных файлов от компиляции используемых классов. Это означает, что каждый раз, когда Вы компилируете a.java, который использует объект B определенный в b.java, он просто проверяет двоичный файл b.class, он не должен идти глубже для проверки зависимостей B, таким образом, он может сократить процесс ранее (со всего одним уровнем проверки).

В то же время, включая файлы только включает определения языка, и обработка его требует времени. Когда компилятор Java/C# читает двоичный файл, он имеет ту же информацию, но уже обработанный шагом компиляции, который генерировал его.

Таким образом в конце, в C/C++ больше файлов включено, и в то же время обработав тех, включает, является более дорогим, чем обработка двоичных модулей.

Шаблоны

Шаблоны являются особенными своим собственным способом. Они могут быть предварительно скомпилированы, но они обычно не (для хорошего набора причин). Это означает, что во всех единицах компиляции, которые используют станд.:: векторизуйте полный набор векторных используемых методов (неиспользованные шаблонные методы не становятся скомпилированными), обрабатывается и двоичный код, сгенерированный компилятором. На более позднем шаге, во время соединения, будут отброшены избыточные определения того же метода, но во время компиляции они должны быть обработаны.

Поддержка в Java для дженериков более ограничена во многих отношениях. В конце, например, существует только один Векторный двоичный файл класса, и каждый раз, когда компилятор видит Вектор в Java, что он делает генерирует код проверки типа прежде, чем делегировать к реализации действительного вектора (который хранит простой объект), и это не универсально. Компилятор действительно предоставляет гарантии типа, но не компилирует Вектор для каждого типа.

В C# это, еще раз, отличается. Поддержка C# дженериков более сложна, чем поддержка Java, и в конце универсальные классы отличаются, чем простые классы, но так или иначе они компилируются только однажды, поскольку двоичный формат все запросил информацию.

5
ответ дан 3 December 2019 в 01:30
поделиться

Поскольку они делают что-то, что очень отличающийся компилятор C++ производит оптимизированный собственный код, тогда как C#, VB, .NET и компилятор Java производят intermidiate язык чем тогда, когда Вы сначала выполняете приложение, превращены в собственный код, и именно поэтому Вы получаете медленную загрузку приложения в Java и т.д. в первый раз, когда Вы выполняете приложение.

Компилятор C++ должен сделать полную оптимизацию, где языки JITed оптимизируют при выполнении приложения.

Кто-то утверждал бы, что необходимо измерить время компиляции C++ = время компиляции Java + время для JITing в первый раз, когда Вы загружаете приложение, если бы Вы хотите быть корректными, но я не думаю, что это было бы правильно и справедливо, потому что Вы сравниваете родные языки с JITed или иначе апельсины к яблокам.

3
ответ дан 3 December 2019 в 01:30
поделиться

Компилятор C++ должен неоднократно компилировать все заголовочные файлы и существуют многие из них, таким образом, это - одна вещь, которая замедляет его.

2
ответ дан 3 December 2019 в 01:30
поделиться

Если Вы думаете, что javac является быстрой попыткой Jikes.... (см. http://jikes.sourceforge.net/), Это - Компилятор Java, записанный в C++. К сожалению, они не не отставали от последних спецификаций Компилятора Java, но если Вы хотите видеть быстро, что это - это.

Tony

2
ответ дан 3 December 2019 в 01:30
поделиться

Вы разобрались в нем в своем последнем предложении: это не Java или C#, который это быстро для компиляции, это - C++, который исключительно не спешит компилировать, из-за его сложной грамматики и функций, самое главное шаблоны

2
ответ дан 3 December 2019 в 01:30
поделиться

Одна из более трудоемких задач, когда компиляция является оптимизацией кода.

Javac делает очень мало оптимизации на коде при выполнении компиляции. Оптимизация вместо этого сделана JVM при запуске приложения.

C/C++ должен быть оптимизирован при компиляции, так как оптимизация скомпилированного машинного кода трудна.

2
ответ дан 3 December 2019 в 01:30
поделиться

Я думаю, что часть его является сложностью языков. C++ невероятно изменяем со способностью переопределить в значительной степени любой оператор или часть синтаксиса (как переопределение () оператор). Это означает, что компилятор должен сделать намного больше работы только для определения что операции на самом деле работать, даже для простых вещей. Java и C# не имеют этой проблемы, поскольку синтаксис фиксируется, и они обычно намного более просты проанализировать.

1
ответ дан 3 December 2019 в 01:30
поделиться

Это - немного трудные языки байт-кода сравнения как Java с исходно скомпилированными языками как C++. Лучшее сравнение является Delphi по сравнению с C++, где Delphi намного быстрее для компиляции. Так как это не имеет никакого отношения к оптимизации или коду байта, это должно произойти из-за различий в синтаксисе языка, и относительная производительность включает по сравнению с модулями/единицами.

1
ответ дан 3 December 2019 в 01:30
поделиться