C# частично интерпретируется или действительно компилируется?

существует много противоречивой информации об этом. В то время как некоторые говорят, что c# компилируется (поскольку он компилируется в IL, а затем в собственный код при запуске), другие говорят, что он интерпретируется так, как ему нужно .Сеть. EN Wiki говорит:

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

Так что я совсем запутался. Может кто-нибудь объяснить это ясно?

12 ответов


C# компилируется в IL компилятором c#.

этот IL затем компилируется точно вовремя (JIT) по мере необходимости на родной язык сборки хост-машины. Было бы возможно написать среду выполнения .NET, которая интерпретировала IL вместо этого. Даже если бы это было сделано, я бы все равно утверждал, что c# - это скомпилированный язык.


чисто компилируемый язык имеет некоторые преимущества. Скорость, как правило, и часто рабочий размер набора. Чисто интерпретируемый язык имеет некоторые преимущества. Гибкость не нуждается в явной стадии компиляции, которая позволяет редактировать на месте, и часто легче переносимость.

jitted язык вписывается в середину в этом случае.

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

C# также может быть скомпилирован при первом запуске, как это происходит в ASP.NET, что делает его близким к интерпретируемому в этом случае (хотя он все еще компилируется в IL, а затем jitted в этом случае). Конечно, в этом случае он имеет почти все преимущества интерпретации (сравните с VBScript или JScript, используемыми в классическом ASP), а также многие преимущества компиляции.

строго говоря, нет язык jitted, интерпретируется или компилируется qua язык. Мы можем NGen C# в собственный код (хотя, если он делает что-то вроде динамической загрузки сборки, он все равно будет использовать IL и jitting). Мы могли бы написать intepretter для C или c++ (несколько человек сделали это). Однако в наиболее распространенном случае использования C# компилируется в IL, который затем jitted, что не совсем классическое определение интерпретируемого или компилируемого.


смотрите сюда:http://msdn.microsoft.com/library/z1zx9t92

исходный код, написанный на C# компилируется в промежуточный язык (IL) это соответствует спецификации CLI.

(...)

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


слишком много семантики и утверждений, основанных на мнении.

во-первых: C# не является интерпретируемым языком; CLR и JVM считаются "временем выполнения" или "промежуточным ПО", но то же имя применяется к таким вещам, как Perl. Это создает много путаницы среди людей, связанных с именами.

термин "интерпретатор", ссылающийся на среду выполнения, обычно означает, что существующий код интерпретирует некоторый неродной код. Существует две большие парадигмы: синтаксический анализ считывает исходный код и выполняет логические действия; выполнение байт-кода сначала компилирует код в неродное двоичное представление, для интерпретации которого требуется гораздо меньше циклов процессора.

Java первоначально скомпилирован в байт-код, затем прошел через интерпретатор; теперь JVM читает байт-код и точно вовремя компилирует его в собственный код. CIL делает то же самое: среда CLR использует компиляцию just-in-time для собственного кода.

рассмотрим все комбинации запуска исходного кода, запуска байт-кода, компиляции в native, just-in-time compilation, запуск исходного кода через компилятор в Just-in-time native и т. д. Семантика того, компилируется ли язык или интерпретируется, становится бессмысленной.

в качестве примера: многие интерпретируемые языки используют компиляцию байт-кода just-in-time. C# компилируется в CIL, который JIT компилируется в native; напротив, Perl немедленно компилирует сценарий в байт-код, а затем запускает этот байт-код через интерпретатор. Вы можете запустить сборку C# только в CIL формат байт-кода; Вы можете запустить скрипт Perl только в формате исходного кода.

компиляторы Just-in-time также запускают множество внешних и внутренних инструментов. Среда выполнения отслеживает выполнение различных функций, а затем настраивает макет кода для оптимизации ветвей и организации кода для конкретного потока выполнения. Это означает, что JIT-код может работать быстрее, чем нативно скомпилированный код (например, C++ обычно есть или C# выполняется через IL2CPP), потому что JIT настраивает свою оптимизацию стратегия к фактическому случаю выполнения кода по мере его выполнения.

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


Если вы чувствуете, узнали или старой школы, что скомпилированный EXE идет от источника к машинному коду, то c# интерпретируется. Если вы считаете, что compiled означает преобразование исходного кода в другой код, такой как байтовый код, то да его преобразование. Для меня интерпретируется все, что требует обработки во время выполнения для работы в ОС, для которой она была построена.


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

"Compile" (при обращении к коду) означает, что для перевода кода с одного языка на другой. Обычно из читаемого человеком исходного кода в машинный код, который может целевой обработчик... процесс.

"Interpret" (при обращении к коду) также означает перевод кода с одного языка на другой. Но на этот раз он обычно используется, чтобы перейти от человека читаемого исходный код в промежуточный код, который берется виртуальной машиной, которая интерпретирует его в машинный код.

просто для ясности
Исходный код - > компилятор - > машинный код
Исходный код - > компилятор - > байтовый код - > интерпретатор - > машинный код

любой язык может, теоретически, быть понял или составлен. Обычно Java компилируется в байт-код, который интерпретируется виртуальной машиной Java в машинный код. C# is обычно интерпретируется в байт-код, который компилируется средой CLR, общеязыковой средой выполнения, другой виртуальной машиной.

на сегодняшний день все это маркетинговый трюк. Термин "интерпретированный" был добавлен (или, по крайней мере, увеличен в использовании), чтобы показать, как аккуратно just-in-time compiling было. Но они могли просто использовать "скомпилированный". Различие заключается скорее в изучении английского языка и бизнес-тенденций, чем в чем-либо техническом.


C# is и интерпретируется и компилируется в своей жизни. C# компилируется на виртуальный язык, который интерпретируется виртуальной машиной.

путаница проистекает из нечеткого понятия "язык".

"скомпилированный язык" - это неправильное название, в некотором смысле, потому что скомпилированный или интерпретируемый не является свойством языка, а среды выполнения.

например, можно написать интерпретатор C, но люди обычно называют это "язык", потому что реализации компилируются в машинный код, и язык был разработан с учетом компиляции.


Я считаю, что это довольно старая тема.

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

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


C# - это язык компилируемый.

вероятно, я повторяю, вероятно, поскольку я тоже встречал такого рода мнения, тот факт, что кто-то думает, что есть интерпретатор для языка C#, связан с такими проектами, как

Консоль Интерпретатора C#

или, например, знаменитый

помощью linqpad

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


C#, как и Java, имеет гибридный языковой процессор. Гибридные процессоры выполняют задания как интерпретации, так и компиляции.


поскольку компьютер может выполнять только двоичный код, любой язык приведет к созданию двоичного кода в той или иной точке. Вопрос в том, позволяет ли язык создавать программу в двоичном коде? Если да, то это скомпилированный язык : по определению "скомпилированный" в "скомпилированном языке" означает компиляцию в двоичный код, а не преобразование в некоторый промежуточный код. Если язык приведет к созданию такого промежуточного кода для программы, ему потребуется дополнительное программное обеспечение для выполнения двоичной компиляции из этого кода: это интерпретируемый язык. Является ли программа "скомпилирована" C# непосредственно исполняемой на машине без какого-либо другого программного обеспечения, установленного на этой машине? если нет, то это интерпретируемый язык. На интерпретируемом языке, то интерпретатор, который будет генерировать основной бинарный код, большую часть времени в динамике, поскольку этот механизм является основой гибкости таких языков. бэр. : иногда это не выглядит очевидным, потому что интерпретатор в комплекте в ОС


Если мы согласны с определением переводчик "в информатике интерпретатор-это компьютерная программа, которая непосредственно выполняет, т. е. выполняет инструкции, написанные на языке программирования или сценариев, не требуя, чтобы они ранее были скомпилированы в программу машинного языка. " нет сомнений: C# не является интерпретируемым языком.

переводчик в Википедии