c# - Зачем компилировать в промежуточный код?




java actionscript (4)

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

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

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

Кроме того, какова польза от компиляции в собственный код?


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

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

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


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


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

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

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


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

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





compiler-construction