Динамически скомпилированный язык и статически скомпилированный язык

Первая строка этой статьи статьи Брайана Гетца заставила меня опубликовать этот вопрос в формате SO. Здесь снова строка:

Написание и интерпретация тестов производительности для динамического скомпилированные языки, такие как Java, намного сложнее, чем для статически скомпилированные языки, такие как C или С++.

Я знаю ответ статически типизированного и динамически типизированного языка. Но в чем разница между динамически скомпилированным языком и статически скомпилированным языком?

Ответ 1

Динамически скомпилированные и динамически типизированные не имеют большого отношения друг к другу. Ввод текста является частью синтаксиса языка, в то время как стратегия компиляции является частью реализации языка.

Динамическое типирование означает, что вам необязательно объявлять тип при объявлении переменной и что преобразование между типами происходит автоматически в большинстве случаев.

Динамическое компиляция означает, что язык компилируется в машинный код во время выполнения программы, а не раньше. Это позволяет, например, оптимизировать "точно в срок" - код оптимизируется во время работы приложения. Оптимизатор JIT имеет то преимущество, что он имеет гораздо более достоверную информацию о том, какие ветки кода используются чаще всего и как они обычно используются, поскольку он может наблюдать приложение в действии перед применением оптимизации.

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

Ответ 2

Исходный код C и С++ обычно компилируется компилятором на собственный машинный код.

Java компилируется в байт-код с помощью компилятора Java. Когда вы запускаете свою Java-программу, компилятор точно в срок (JIT) может скомпилировать байт-код Java для собственного машинного кода для ЦП, программа работает.

Компиляция программы на собственный машинный код при запуске программ также называется динамическая компиляция.

Ответ 3

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

Статическая компиляция не допускает такой манипуляции, поскольку все адреса и переходы фиксированы (если вы сами не пишете код, чтобы изменить порядок инструкций во время выполнения).

Динамическая компиляция позволяет проверять во время выполнения программы, и собранная информация может использоваться для ускорения работы. Статья в Википедии - это легкое чтение и довольно информативное.

Ответ 4

Разница, с точки зрения теста, заключается в том, что время выполнения динамически скомпилированной программы может сильно измениться во время выполнения. Обычно сначала интерпретируется код Java, а затем, когда интерпретатор обнаруживает, что некоторый метод вызывается много раз, он вызывает компилятор JIT для преобразования их в собственный код. Скомпилированный код по-прежнему контролируется и, когда определяются часто исполняемые части кода ( "горячие точки" ), они оптимизируются далее.

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