Различие между C++ и процессом компиляции Java [дубликат]

11
задан LilianBr 6 September 2017 в 15:26
поделиться

6 ответов

Мне приходит в голову несколько различий высокого уровня. Некоторые из них являются обобщениями и должны быть префиксованы с помощью "Часто ..." или "Некоторые компиляторы ...", но для удобочитаемости я это пропущу.

  • Компиляция C/C++ не читает информацию из бинарных файлов, а читает определения методов/типов только из заголовочных файлов, которые нужно полностью разобрать (исключение: прекомпилированные заголовки)
  • Компиляция C/C++ включает в себя шаг препроцессора, который может сделать широкий диапазон замены текста (что усложняет прекомпиляцию заголовков)
  • Синтаксис C++ намного сложнее, чем синтаксис Java
  • Система типов C++ намного сложнее, чем система типов Java
  • Компиляция C++ обычно производит нативный ассемблерный код, что намного сложнее, чем относительно простой байтовый код
  • C++ компиляторам нужно делать оптимизацию, потому что нет ничего другого, что могло бы их сделать. Компилятор Java практически выполняет простую трансляцию исходного кода Java в байтовый код Java в соотношении 1:1, никаких оптимизаций на этом этапе не производится (это остаётся на усмотрение JVM).
  • C++ имеет язык шаблонов, который Тьюринг закончен! (Строго говоря, C++ код должен быть run для создания исполняемого кода, и C++ компилятор должен решить проблему остановки, чтобы сказать вам, является ли произвольный C++ код компилируемым).
11
ответ дан 3 December 2019 в 04:52
поделиться

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

9
ответ дан 3 December 2019 в 04:52
поделиться

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

0
ответ дан 3 December 2019 в 04:52
поделиться

Единственное, с чем я столкнулся, это убедиться, что разрешение существует на другой схеме. Обычные вещи - если эти разрешения исчезнут по какой-либо причине, вы услышите об этом.

-121--1105175-

Есть несколько различий высокого уровня, которые приходят мне на ум. Некоторые из них являются обобщениями и должны иметь префикс «Часто»... или «Некоторые компиляторы»..., но ради читаемости я оставлю это.

  • Компиляция C/C + + не считывает никакой информации из двоичных файлов, но считывает определения методов/типов только из заголовочных файлов, которые должны быть проанализированы полностью (исключение: предкомпилированные заголовки)
  • Компиляция C/C + + включает в себя предпроцессорный шаг, который может выполнять широкий массив замены текста (что затрудняет предварительную компиляцию заголовка)
  • Синтаксис C++ намного сложнее синтаксиса Java
  • Система типов C++ намного сложнее, чем система типов Java
  • компиляция C++ обычно производит собственный код ассемблера, который гораздо сложнее производить, чем относительно простой байт-код
  • компиляторы C++ должны делать оптимизации, потому что нет ничего другого, что могло бы их сделать. Компилятор Java в значительной степени выполняет простую трансляцию исходного кода Java в байтовый код Java в формате 1:1, на этом этапе оптимизация не выполняется (это остается за JVM).
  • C++ имеет язык шаблона, завершенный Тьюрингом! (строго говоря, код C++ необходимо запустить для создания исполняемого кода, а компилятор C++ должен решить проблему остановки, чтобы определить, является ли произвольный код C++ компилируемым).
-121--3090714-

Глоссирование множества деталей, в Java вы компилируете файлы .java в один или несколько файлов .class. В C++ вы компилируете исходные файлы .cc (или что угодно) в файлы .o, а затем соедините файлы .o в исполняемый файл или библиотеку. Процесс связывания обычно убивает вас, особенно в случае незначительных изменений, поскольку объем работы по связыванию примерно пропорционален размеру всего проекта. (Это игнорирование инкрементных линкеров, которые специально разработаны, чтобы не вести себя так плохо для небольших изменений)

Другой фактор заключается в том, что механизм # include означает, что при изменении файла .h все зависящие от него файлы .o должны быть перестроены. В Java файл .class может зависеть от нескольких файлов .java (например, из-за постоянного встраивания), но, как правило, этих «горячих точек» гораздо меньше, где изменение одного исходного файла требует перестраивания многих других исходных файлов.

Кроме того, если вы используете среду IDE, такую как Eclipse, то вы постоянно строите код Java в фоновом режиме, поэтому к тому времени, когда вы скажете, что строить ее уже в основном (если не полностью).

0
ответ дан 3 December 2019 в 04:52
поделиться

Java компилирует любой исходный код в Bytecode, который интерпретируется JVM. Из-за этой функции его можно использовать в нескольких платформе.

0
ответ дан 3 December 2019 в 04:52
поделиться

Я не уверен, что вы ожидаете, что скорость компиляции Java и C ++ будет сопоставимы, поскольку они являются разными языками с совершенно разными дизайнами Gaols и реализациями.

Это сказало, что несколько конкретных различий, чтобы иметь в виду, есть:

  • Java составляется для байтового кода, а не в режиме прямого машинного кода. Компиляция этой абстрактной виртуальной машины проще.
  • Компиляция C ++ включает в себя не только компиляцию , но и связывание . Таким образом, это обычно многоэтапный процесс.
  • Java выполняет некоторое поздние привязки, это ассоциация вызова функции и фактическим кодом для запуска выполняется во время выполнения. Таким образом, небольшое изменение в одной области не нужно вызывать компиляцию всей программы. В C ++ эта ассоциация должна быть выполнена во время компиляции, которое называется ранним связыванием.
3
ответ дан 3 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: