Зачем компилировать в промежуточный код? - PullRequest
5 голосов
/ 22 июня 2011

Почему Actionscript, Java, C # и т. Д. Компилируются в промежуточный код?Я знаю о кросс-платформенных преимуществах использования промежуточного кода.

Вопрос заключается в следующем: каково преимущество компиляции в промежуточный код по сравнению со сценариями (JS, Python, PHP, Perl и т. Д.), Которыеинтерпретируются?

Это только для обфускации кода?Или что?

Кроме того, в чем преимущество по сравнению с компиляцией в нативный код?

Ответы [ 6 ]

12 голосов
/ 22 июня 2011

Гораздо быстрее анализировать и JIT-компилировать код IL, чем синтаксический анализ языка высокого уровня, такого как Java или особенно C # (который имеет больше возможностей).

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

6 голосов
/ 22 июня 2011

Во-первых, исторически Java был нацелен на мобильные и встраиваемые устройства с очень ограниченным ЦП / памятью, и JVM на таких устройствах не может выполнять какую-либо интенсивную оптимизацию, как это делают современные JIT. Поэтому инженеры Java решили перенести оптимизацию на этап компиляции.

Далее, наличие «байтового кода» / IL позволяет вам иметь в одном байтовом коде много компиляторов из разных языков - и только одну JVM / JIT. Это гораздо эффективнее, чем создавать отдельные VM + JIT для каждого языка. Помните, у вас есть Java, JRuby, JPython, Groovy и т. Д. В мире JVM, и C #, VB #, ASP.NET, F # и т. Д. В мире .NET, и только одна среда выполнения / ВМ для каждого.

1 голос
/ 22 июня 2011

В дополнение к ответу SLaks, компиляция в IL обеспечивает степень межъязыковой совместимости, которая обычно отсутствует в интерпретируемых языках.

Это преимущество может быть огромным для новых языков. Scala существует только с 2003 года, и она уже набрала огромную популярность. Ruby, с другой стороны, за 1,5 десятилетия своего существования не вышел далеко за рамки использования для приложений Rails. Это, по крайней мере, частично, потому что Scala совместим с байт-кодом со всем существующим ранее Java-кодом и библиотеками, что дает ему огромную поддержку: его сообщество может сосредоточить большую часть своих усилий на самом языке, а у потенциальных пользователей нет беспокоиться о том, чтобы пройти через любые специальные искажения (или, что еще хуже, заменить всю их кодовую базу), чтобы начать использовать Scala. История F # почти идентична, но для другой крупной управляемой среды.

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

1 голос
/ 22 июня 2011

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

Например, z = a + b - (c * d) необходимо перевести в загрузку четырех значений в регистры, затем сложить, умножить и вычесть, а затем записать в другое место в памяти. Таким образом, у нас есть по крайней мере 8 инструкций или около того только для этой строки!

Промежуточный код является лучшим из обоих миров - кроссплатформенный, но также ближе к тому, как машинный код обычно пишется.

1 голос
/ 22 июня 2011

Компиляция в .NET для MSIL обеспечивает взаимодействие между различными языками, такими как C #, VB.NET и т. Д.

1 голос
/ 22 июня 2011

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

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