Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

В этом случае в средней области помещается нужный язык.

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

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

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

Ответ 3

Слишком много семантики и высказываний, основанных на мнении.

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

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

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

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

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

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

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

Ответ 4

Посмотрите здесь: http://msdn.microsoft.com/library/z1zx9t92

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

(...)

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

Ответ 5

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

Ответ 6

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

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

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

Просто чтобы быть понятным
Исходный код → Компилятор → Машинный код
Исходный код → Компилятор → Байт-код → Интерпретатор → Машинный код

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

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

Ответ 7

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

Путаница проистекает из нечеткой концепции "Скомпилированного языка".

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

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

Ответ 8

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

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

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

Ответ 9

С# является компилируемым языком.

Вероятно, я повторяю, наверное, так как я встречал слишком подобные мнения, тот факт, что кто-то думает, что есть язык Interpreter для языка С#, связан с такими проектами, как

Консоль интерпретатора С#

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

LinqPAD

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

Интерпретатор в Википедии

Ответ 13

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

Каждый язык обрабатывает процесс перевода по-своему!

Например, "AutoIt" - это то, что мы можем описать как язык, интерпретируемый на 100%!

Зачем?

Потому что интерпретатор "AutoIt" постоянно нужен, пока выполняется его скрипт! Смотрите пример ниже:

Loop, 1000
Any-Code

Интерпретатор "AutoIt" должен будет переводить "Any-Code" 1000 раз в машинный код, что автоматически делает "AutoIt" медленным языком!

С другой стороны, С# по-разному обрабатывает процесс перевода, интерпретатор С# требуется только один раз, перед выполнением сценария, после этого он больше не требуется во время выполнения сценария!

Интерпретатору С# придется переводить "Any-Code" только один раз в машинный код, что автоматически делает "С#" быстрым языком!

В общем,

  • Язык, который требует своего интерпретатора во время выполнения скрипта, является "Интерпретируемым языком"!

  • Язык, который требует интерпретатора только один раз (перед выполнением скрипта), является "Скомпилированным языком"!

В заключение,

  • "AutoIt" - это "Интерпретированный язык"!

  • "С#" - это "скомпилированный язык"!