каждый язык в конечном итоге компилируется в компьютерный язык низкого уровня? - PullRequest
7 голосов
/ 06 июня 2010

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

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

Просто интересно ...

Ответы [ 6 ]

15 голосов
/ 06 июня 2010

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

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

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

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

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

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

14 голосов
/ 06 июня 2010

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

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

4 голосов
/ 06 июня 2010

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

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

3 голосов
/ 06 июня 2010

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

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

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

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

2 голосов
/ 06 июня 2010

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

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

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

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

1 голос
/ 06 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...