2014-12-02 8 views
2

CIL - это объектно-ориентированный язык ассемблера и полностью содержит на основе стека. Его байт-код преобразуется в собственный код или - большинство обычно - выполняется виртуальной машиной.Почему C# не компилируется непосредственно в машинный код?

Зачем нам нужен CIL? Невозможно ли перевести C# в собственный код вместо CIL? Если все .Net-языки скомпилированы для CIL, почему C# не используется вместо IL? Является ли CIL более выразительным, чем C# или VB?

+0

«Почему CIL более выразителен, чем C# или VB?» - Откуда вы понимаете, что CIL более выразителен, чем C# или VB, и что именно вы подразумеваете под * экспрессивным * здесь? –

+0

@ O.R.Mapper - есть * конструкции, которые можно выразить в IL, но не реализованы ни в одном из этих IIRC. –

+0

@ O.R.Mapper CIL позволяет вам взаимодействовать с всеми конструкциями программирования, разрешенными CTS –

ответ

7

Вопрос более общий: Почему нам нужны промежуточные языки вообще? Почему многие современные языки высокого уровня компилируются в промежуточную форму, которая затем интерпретируется/JITed в собственный код?

Во-первых, обратите внимание, что не только .NET использует свой собственный промежуточный язык. Java has one as well as many, many other languages/platforms.

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

Абстрагирование означает, что гораздо легче рассуждать о безопасности и производительность. Например, у них есть формальная теорема о том, что CIL является безопасным по типу, доказанным Дж. Кеннеди и Д. Симе. Кроме того, абстрактная промежуточная форма потенциально может быть более компактной, чем собственный код платформы. Другим преимуществом является то, что фактическое выполнение может использовать информацию о текущей системе, например, тот же самый CIL, выполненный в 32-разрядной среде с 64-разрядной средой, может быть JITed на другой собственный код, что отражает доступность 64-разрядных регистров.

http://en.wikipedia.org/wiki/P-code_machine

C# не является хорошим выбором для промежуточного языка. Хотя оба CIL и C#: Turing-complete, что означает, что любой другой язык программирования может быть скомпилирован как на C#, так и на CIL, C# просто слишком абстрактно, слишком высокоуровневый. Таким образом, компиляция некоторых неъектных языков в C# (функциональные языки, декларативные языки) может потенциально потребовать много кода C#, и фактическое выполнение будет медленнее по сравнению со сценарием, где все языки высокого уровня нацелены на те же самые, абстрактные, но все же довольно низкий уровень промежуточного языка, который может быть эффективно привязан к собственному коду.

Вот почему CIL содержит функции, отсутствующие в C#, и наоборот. Например, CIL поддерживает указатели метода и хвост вызывает, тогда как C# не нуждается в обоим - но таким образом некоторые функциональные языки могут быть переведены более эффективным способом. С другой стороны, у C# есть понятие свойства, которого нет в CIL - это потому, что свойства можно рассматривать только как синтаксический сахар , не представляя никакой выразительности, а скорее своего рода удобство на язык ,

+0

"в CIL нет регистров, хотя у физического компилятора есть регистры" Вы имели в виду "физический компьютер"? – svick

+2

Кроме того, CIL-тип имеет свойства (см. §II.17 ECMA-335). Хотя это всего лишь метаданные, вы не можете получить доступ к свойству в CIL, вы должны вызвать метод accessor. – svick

+0

@svick: да, опечатка, спасибо. –