Компилирует / выполняет ли программа, написанная с использованием платформы Microsoft .NET, собственный код? - PullRequest
7 голосов
/ 17 января 2009

Новый вопрос:

Компилирует / выполняет ли программа, написанная на платформе Microsoft .NET, собственный код?

Я не имею в виду, если есть способ не устанавливать .net framework на машину. Проще говоря: приложение .net запускается на другом слое, таком как Java (т.е. байт-код).

Ответы [ 8 ]

26 голосов
/ 17 января 2009

Приложение .NET должно выполняться в режиме Common Language Runtime (CLR).

CLR - это реализация Microsoft CLI стандарта. (А кроме Microsoft .NET Framework есть и другие реализации CLR, т.е. Mono , Portable.NET ).

CLR выполняет тип байт-кода, известный как общий промежуточный язык ( CIL ).

CIL

7 голосов
/ 17 января 2009

Вроде. Компилятор .NET компилирует ваш исходный код в IL (промежуточный язык) и упаковывает его в сборку (обычно один файл .DLL или .EXE), которую вы развертываете. Во время выполнения он размещается в CLR (общеязыковой среде выполнения), которая отвечает за выполнение кода, обеспечение соблюдения правил безопасности и т. Д. CLR основного рабочего стола для Windows (есть и другие, такие как Mono и Silverlight) не интерпретирует IL, а скорее «JIT» (просто выполняет своевременную компиляцию) кода IL в собственный код перед выполнением методов (функций).

Обратите внимание, что на самом деле у есть некоторые преимущества в производительности как раз во время компиляции . Например, CLR может оптимизировать собственный код, который он генерирует, основываясь на характеристиках производительности машины, на которой он работает, например, тип процессора, размер кэша процессора, количество процессоров, размер оперативной памяти и т. Д. Традиционные компиляторы не могут сделать это, поскольку они не знаю, на какой машине в конечном итоге будет сгенерирован код, который они генерируют.

Кроме того, сборки могут быть «предварительно JITted» с помощью инструмента под названием ngen . В этом процессе нативный код компилируется из IL перед выполнением сборки и кэшируется на диске. Таким образом, во время выполнения не возникают накладные расходы JITting.

1 голос
/ 17 января 2009

Когда вы компилируете программу .NET, она компилируется в IL (Intermediate Language). IL очень похож на ассемблер. Затем этот IL преобразуется в собственный код во время выполнения с помощью компилятора JIT (Just In Time).

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

1 голос
/ 17 января 2009

Краткий ответ (на ваш второй вопрос): Да. Это называется Common Language Runtime (CLR).

Краткий обзор структуры доступен в Википедии: http://en.wikipedia.org/wiki/.NET_Framework#Architecture

0 голосов
/ 16 апреля 2009

во время выполнения компилятор генерирует код IL, который является кодом промежуточного языка, затем код преобразуется в собственный код компилятором JIT

0 голосов
/ 17 января 2009

C ++ - это единственный язык .Net, который не нужно компилировать в IL, но вы не можете иметь ЛЮБЫХ ссылок .NET или кода из .Net, если выберете эту опцию.

Еще одна вещь, на которую стоит обратить внимание, - это то, на что указал дракон - ngen.exe, который может иметь некоторые замечательные улучшения для многих приложений на основе Windows / консолей .Net

0 голосов
/ 17 января 2009

Я думаю, что вы должны быть осторожны, спрашивая, является ли он «скомпилированным» и предполагая, что это означает, что полученный результат должен быть «нативным кодом». Это не то, что означает «скомпилированный»:

«Обычно мы говорим, что язык« интерпретируется », когда первоначальный переводчик прост. Если переводчик сложен, мы говорим, что язык« скомпилирован ». Различие может сбивать с толку, поскольку« простой » «сложными» являются субъективные термины, и поскольку компилятор может создавать код, который затем выполняется сложной виртуальной машиной (интерпретатором) ... Эти две характеристики - тщательный анализ и нетривиальное преобразование - являются отличительными признаками компиляции ».

Из "Прагматика языка программирования" Майкл Л. Скотт. Как ни странно, это учебник по теории языка программирования, который я только что прочитал сегодня днем ​​со страницей, открытой для этой цитаты.

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

0 голосов
/ 17 января 2009

Ну, по крайней мере, с mono я знаю, что вы можете генерировать собственный код вместо управляемых сборок. Я думаю, что есть инструменты OpenSource для Windows, которые тоже могут это делать.

...