Если C # не интерпретируется, то зачем нужна ВМ? - PullRequest
6 голосов
/ 04 марта 2012

Я читал много споров о C #, где некоторые говорят, что это интерпретируется, некоторые говорят, что это не так.Я знаю, что он скомпилирован в MSIL, а затем JITed при запуске, в зависимости от процессора и т. Д., Но разве он не интерпретируется так, как для работы нужна виртуальная машина (.NET)?

Ответы [ 3 ]

28 голосов
/ 04 марта 2012

ВМ - это просто абстракция микропроцессора.Это всего лишь определение и на самом деле не существует.Т.е. вы не можете запустить код на виртуальной машине;тем не менее, вы можете сгенерировать код IL для него.Преимущество заключается в том, что языковым компиляторам не нужно знать подробности о различных типах реальных процессоров.Поскольку разные языки .NET, такие как C # или VB (и многие другие), генерируют IL, они совместимы на этом уровне.Это, вместе с другими соглашениями, такими как система общих типов, позволяет вам использовать DLL, сгенерированную из кода VB, например, в программе на C #.

IL компилируется как раз вовремя в Windows при запуске.NET приложение, а также может быть скомпилировано заранее в Mono.В обоих случаях генерируется машинный код native для фактического процессора.Этот полностью скомпилированный код выполняется на микропроцессоре REAL!


Другой аспект - количество компиляторов, которые вы должны написать.Если у вас есть n языков, и вы хотите запустить их на m процессорных архитектурах, вам необходимо n компиляторы языка для IL + m Компиляторы IL-to-native .Без этого промежуточного уровня абстракции вам бы понадобилось иметь n × m компиляторов, и это может быть намного большее число, чем просто n + m !

2 голосов
/ 04 марта 2012

Вы, вероятно, ссылаетесь на CLR (реализация спецификации CLI ).

CLI определяет конкретную систему типов, семантику всехоперации над этими типами, моделью памяти и метаданными времени выполнения.

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

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

Цитата из Википедии, например:

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

1 голос
/ 04 марта 2012

Короткий ответ - нет, требование к ВМ не означает, что оно интерпретируется.

Виртуальная машина содержит JIT-компилятор, который переводит IL в машинный код. Он также содержит библиотеку классов .NET, от которой зависят программы на C #. Он также содержит некоторые другие механизмы, участвующие в динамическом связывании и тому подобное (определенно построенный на основе механизма Windows DLL, но .NET обладает функциями, выходящими за рамки того, что Windows предоставляет самостоятельно, которые реализованы в ВМ).

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