каждый язык в конечном счете скомпилирован на язык программирования низкого уровня?

Разве каждый язык не компилируется на язык программирования низкого уровня?

Если так, разве все языки не должны иметь той же производительности?

Просто удивление...

7
задан Dan McGrath 6 June 2010 в 01:18
поделиться

6 ответов

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

Но даже среди языков, которые переводятся в машинный код,

  • Некоторые переводчики лучше других
  • Некоторые языковые функции легче перевести в высокопроизводительный код, чем другие.

Пример переводчика, который является лучше, чем некоторые другие, компилятор GCC C. В создание хорошего кода он вложил много лет работы, и его переводы превосходят, например, переводы более простых компиляторов lcc и tcc .

Примером функции, которую трудно преобразовать в высокопроизводительный код, является способность C выполнять арифметические операции с указателями и разыменовывать указатели: когда программа сохраняет данные с помощью указателя, компилятору очень трудно узнать, какие ячейки памяти под действием. Точно так же, когда вызывается неизвестная функция, компилятор должен делать очень пессимистические предположения о том, что может случиться с содержимым объектов, размещенных в куче. В таком языке, как Java, компилятор может лучше выполнять перевод, потому что система типов обеспечивает большее разделение между указателями разных типов. В таких языках, как ML или Haskell, компилятор может работать еще лучше, потому что в этих языках большая часть данных, размещенных в памяти , не может быть изменена вызовом функции.Но, конечно, объектно-ориентированные языки и функциональные языки создают свои собственные проблемы перевода.

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

15
ответ дан 6 December 2019 в 05:05
поделиться

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

Другая аналогия: "Ну, законы физики определяют, как движется каждое животное, так почему же некоторые животные движутся намного быстрее других? Разве не должны они все двигаться с одинаковой скоростью?".

14
ответ дан 6 December 2019 в 05:05
поделиться

Да, все программы в конечном итоге переводятся в машинный код. НО:

  1. Некоторые программы переводятся во время компиляции, а другие переводятся "на лету" интерпретатором (например, Perl) или виртуальной машиной (например, оригинальная Java)

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

  2. Разные языки могут быть переведены в РАЗНЫЙ машинный код. Даже при выполнении одной и той же задачи программирования. Поэтому машинный код может быть быстрее или медленнее в зависимости от языка.

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

Вы должны понимать разницу между компиляцией (которая является трансляцией) и интерпретацией (которая является симуляцией). Вы также должны понимать концепцию универсальной основы для вычислений.

Язык или набор инструкций является универсальным, если его можно использовать для написания интерпретатора (или симулятора) для любого другого языка или набора инструкций. Большинство компьютеров - электронные, но они могут быть созданы и другими способами, например, с помощью жидкостей, механических деталей или даже с помощью людей, следующих инструкциям. Хорошее учебное упражнение - написать небольшую программу на BASIC, а затем попросить класс учеников "выполнить" эту программу, следуя ее шагам. Поскольку BASIC универсален (в первом приближении), вы можете использовать его для написания программы, которая имитирует набор инструкций для любого другого компьютера.

Таким образом, вы можете взять программу на вашем любимом языке, скомпилировать (перевести) ее на машинный язык для вашей любимой машины, иметь интерпретатор для этой машины, написанный на BASIC, а затем (в принципе) заставить класс, полный учеников, "выполнить" ее. Таким образом, он сначала сводится к набору инструкций для "быстрой" машины, а затем выполняется очень очень очень очень медленным "компьютером". Он все равно получит тот же ответ, только примерно в триллион раз медленнее".

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

2
ответ дан 6 December 2019 в 05:05
поделиться

Нет, некоторые языки просто интерпретируются. На самом деле они никогда не превращаются в машинный код. Таким образом, эти языки обычно работают медленнее, чем языки низкого уровня, такие как C.

Даже для языков, которые скомпилированы в машинный код, иногда то, что выходит из компилятора, не является наиболее эффективным из возможных способов написания данной программы. Поэтому часто можно писать программы, скажем, на языке ассемблера, которые работают быстрее, чем их эквиваленты на C, и программы на C, которые работают быстрее, чем их JIT-скомпилированные эквиваленты Java, и т. Д. (Однако современные компиляторы довольно хороши, так что это не так большая проблема в наши дни)

4
ответ дан 6 December 2019 в 05:05
поделиться

Нет, некоторые языки запускаются «программным интерпретатором» как байт-код .

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

1
ответ дан 6 December 2019 в 05:05
поделиться
Другие вопросы по тегам:

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