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


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

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

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

12 55

12 ответов:

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

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

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

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

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

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

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

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

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

(...)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

LinqPAD

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

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

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

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