Информация об изменениях

Сообщение Re[39]: 32/64/AnyCPU - что за @$^%$? от 03.11.2016 8:43

Изменено 03.11.2016 9:07 Serginio1

Здравствуйте, tranzit, Вы писали:

T>Здравствуйте, Serginio1, Вы писали:


S>>Здравствуйте, tranzit, Вы писали:


S>> Что CLR эмулирует? Он просто компилирует код. Там никакого понятия эмуляции не существут.

T>CLR не компилирует ничего это среда исполнения для байт кода. т.е. эта среда содержит
T>виртуальную машину и вспомогательные утилиты и функции.
T>CLR не компилирует а исполняет байт код

То есть JIT компиляция, это не компиляция вовсе?
Еще раз как обстоит дела с NGEN, что выполняет CLR?

Что бы ло понятно

https://msdn.microsoft.com/ru-ru/library/dn807190(v=vs.110).aspx


.NET Native и NGEN

Генератор образов в машинном коде (NGEN) компилирует сборки в машинный код и устанавливает их в кэш образов в машинном коде на локальном компьютере. Однако хотя NGEN, как и .NET Native, создает машинный код, NGEN имеет существенные отличия от .NET Native:

• Если для конкретного метода нет образа в машинном коде, NGEN переключается на JIT-компиляцию кода. Это означает, что образы в машинном коде должны продолжать включать метаданные и IL-код для того случая, если генератору NGEN необходимо переключиться на JIT-компиляцию. В противоположность этому .NET Native только создает образы в машинном коде и не переключается на JIT-компиляцию. В результате должны сохраняться метаданные, необходимые только для некоторых сценариев отражения, сериализации и взаимодействия.


• NGEN по-прежнему полагается на полную среду CLR для таких сервисов, как загрузка сборок, удаленное и локальное взаимодействие, управление памятью, сбор мусора и, при необходимости, JIT-компиляция. В .NET Native многие из этих сервисов являются либо ненужными (JIT-компиляции), либо разрешаются во время построения и включаются в сборку приложения. Остальные сервисы, наиболее важным из которых является сбор мусора, включены в гораздо более компактную, оптимизированную среду выполнения mrt100_app.dll.


• Образы NGEN, как правило, хрупкие. Например, обновление или изменение зависимости обычно требует, чтобы сборки, которые его используют, также были пересозданы NGEN. Это особенно верно для системных сборок в библиотеке классов .NET Framework. В противоположность этому .NET Native позволяет обслуживать приложения независимо друг от друга.


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

S>> Прочитал. Где в CLR какая либо замена? CIL это язык, аналог ассемблера.

S>>Опять же байт код выполняет не только Java, но и на питон и 1С и еще куча интерпритаторов. Если убрать JIT,
S>>то по сути они тоже VM? Отличие от Java только в статической типизации и сборщике мусора.
S>> трехадресный код это тоже VM

T>Совершенно верно любой байт код (код исполнения) является инструкцией машины следовательно кто-то должен исполнить

T>эту инструкцию но напрямую процессор не понимает, поэтому исполнение этой инструкции берет на себя виртуальная машина.
T>для каждого языка есть стандарт, так же как и стандарт для кода который получается путем компиляции.
T>Но нигде не говорится как должны компилироваться текст программы в код, ГЛАВНОЕ чтоб этот код был понимаем виртуальной машиной или процессором. Поэтому одни производители компиляторов лучше других т.к. генерируют код более оптимально.
T>Если этот код получен путем компиляции из языка java то и байт код может выполняться на виртуальной машине java.
T>если код был получен из .Net далее применен транслятор на язык CLI/CIL а к нему применили компилятор ilasm для получения байт кода CIL который будет исполняться в среде CLR который и содержит виртуальную машину CLR.
T>Если питон-то питон виртуальная машина исполняет байт код. Если Perl то виртуальная машина PERL исполняет

Еще раз NGEN нет там никакого байт кода. Другое дело, что CLR может подгрузить сборку и откомпилировать её например при reflection. Но если нет Рефлексии то и CLR ни какой байткодом не бедет исполнять.

ооооо. Теперь у нас все интерпритаторы стали VM. И трех адресный код это уже VM. Пишем интерпретатор трехадресного кода
https://habrahabr.ru/post/117173/

T>байт код. Если язык Erlang то компиляция erlang(в байт код) то виртуальная машина ERLANG выполняет этот код. Но нам все равно как CLR виртуальная машина будет выполнять этот код. Если хочет то пускай вызывает JIT для ускорения исполнения или сами запускайте ngen для компиляции из байт кода в машинный.

То есть assembler это байт код? Тот же LLVM
https://ru.wikipedia.org/wiki/Low_Level_Virtual_Machine

В основе LLVM лежит промежуточное представление кода (Intermediate Representation, IR), над которым можно производить трансформации во время компиляции, компоновки и выполнения. Из этого представления генерируется оптимизированный машинный код для целого ряда платформ, как статически, так и динамически (JIT-компиляция). LLVM 3.6 поддерживает статическую генерацию кода для x86, x86-64, ARM, PowerPC, SPARC, MIPS, Qualcomm Hexagon, NVPTX, SystemZ, Xcore. JIT-компиляция (генерация машинного кода во время исполнения) поддержана для архитектур x86, x86_64, PowerPC, MIPS, SystemZ, и частично ARM[4].



То есть статически скомпилированный LLVM или CIL в .Net Native это тоже VM?

T>ТОЛЬКО не путайте CLR как среду исполнения (который может предлагать массу дополнительных утилит в том числе глубокую интеграцию с OS или с внешними библиотеками dll) и CLR как виртуальную машину которая исполняет CIL байт код.

T>Виртуальная машина CLR содержится в сред исполнения CLR и она для вас прозрачно т.к. вы взаимодействуете со средой
T>а не напрямую на виртуальную машину.
T>Но надо понимать различие между средой исполнения и контейнером, об этом чуть позже.
T>Я это говорю из-за того что CLR среда очень сильно подошла к понятию контейнер.

Во наконец то. Еще раз CLR это среда выполнения. Она может вообще не иметь дела с CIL.


T>из WIKI

T>Common Language Runtime (англ. CLR — общеязыковая исполняющая среда) — исполняющая среда для байт-кода CIL (MSIL), в который компилируются программы, написанные на .NET-совместимых языках программирования (C#, Managed C++, Visual Basic .NET, F# и прочие). CLR является одним из основных компонентов пакета Microsoft .NET Framework.

T>В отличие от переносимых виртуальных машин Java, абстрагирующихся от нижележащих операционных систем, CLR позиционируется как не «виртуализированная» платформа, тесно связанная с операционной системой Microsoft Windows (в том числе для целей сохранения инвестиций Microsoft в операционную систему)[1]

Угу. Уже как 4 месяца .Net Core в релизе https://habrahabr.ru/users/serginio1/topics/

T>Среда CLR является реализацией спецификации CLI (англ. Common Language Infrastructure), спецификации общеязыковой инфраструктуры компании Microsoft.


T>из WIKI

T>

T>Common Intermediate Language (сокращённо CIL) — «высокоуровневый ассемблер» виртуальной машины .NET. Промежуточный язык, разработанный фирмой «Microsoft» для платформы .NET Framework.

T>как понимаем виртуальной машины .NET-не существует т.к. из языка .Net идет трансляция на язык CLI/CIL и потом компиляция в CIL байт код (а можно и напрямую в CIL байт код). следовательно виртуальная машина не .NET а CLR.
CLR это среда выполнения. А выполняется не байт код, а скомпилированный код из него. Это может быть заранее скомпилированный код. В том числе и для .Net Native где СДК не используется.
CIL это просто язык.

T>"Assembler" компилятор для языка CLI/CIL называется ilasm а на выходе CIL байт код. есть disassembler для CIL посмотрите проект mono.

T>ОБратите внимание мы говорим об assemblere который из текста программы на языке CLI/CIL(assembler) делает байт код CIL для виртуальной машины CLR
T>Читать инфу надо задумываясь.

TT>для linux

T>https://en.wikipedia.org/wiki/Mono_%28software%29
T>https://github.com/dotnet/coreclr
T>http://www.mono-project.com/

Вот ты бы сам ссылки почитал, а то утверждаешь, что

T>Давайте теперь рассмотрим варианты компиляции

T>их очень много. Но сначала для Perl

T>1

T>после того как вы записали текст программы можно его выполнить
T>perl example.pl — в этом случает perl выступает как интерпретатор, но есть одно но. Дело в в том
T>что на лету perl формирует байт код в памяти (т.е. компиляция) и только потом ее исполняет.
T>но нам не интересно как выполняет perl текст написанный на языке perl, главное что мы передаем текст,
T>а perl интерпретатор выдает результат.

T>2

T>все это я привел для того чтобы было четкое понимание где текст программы, интерпретатор, виртуальная машина, транслятор

T>точно также .Net может сделать трансляцию на CLI/CIL(язык ассемблера)

T>далее применяя команду ilasm текст программы на assembler CIL в объектный код CIL
T>этот объектный код может выполнить CLR виртуальная машина возможно даже он применит
T>jit компиляцию (https://ru.wikipedia.org/wiki/JIT-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F)
T>прочтите доконца
T>Мы имеем CIL код(не путать с текстом на assembler CIL) но мы можем применить для этого кода команду
T>ngen для получения машинного кода.
T>https://en.wikipedia.org/wiki/Native_Image_Generator
T>https://ru.wikipedia.org/wiki/Ngen

T>но не забываем что можно сразу компилировать из любого языка CLI (https://en.wikipedia.org/wiki/List_of_CLI_languages) в CIL код

T>Также можно компилировать сразу в машинный код
T>ngen может компилировать и из текста программы на CIL assembler в машинный код

Какой нафиг текст программы на CIL? Посмотри что такое Сборка. https://msdn.microsoft.com/ru-ru/library/k3677y81(v=vs.110).aspx
Там много счего содержится для компиляции.

Смотри различие .Net Native и NGEN. Мало того я из С++ могу вызвть статический метод класса https://habrahabr.ru/post/304482/
https://habrahabr.ru/post/304542/

Например получив адрес функции я вызываю её по ссигнатуре например есть метод в .Net
public static void SetDelegate(IntPtr ДляВыделенияПамяти,IntPtr ДляВызоваОшибки)


Описываю аналог в C++
typedef void(STDMETHODCALLTYPE *ManagedSetDelegate)(void*(*) (long), void(*) (const wchar_t*));


Получа адрес метода и вызваю его.
if (!CreateDelegate(domainId, L"SetDelegate", (INT_PTR*)&pSetDelegate)) return false;

// Передадим ссылки на нужные методы
        pSetDelegate(ManagedDomainLoader::GetMem, ManagedDomainLoader::AddError);



Внутри .Net я получаю ссылки на статические методы

public static void SetDelegate(IntPtr ДляВыделенияПамяти,IntPtr ДляВызоваОшибки)
        {
            ВыделитьПямять = Marshal.GetDelegateForFunctionPointer<ВыделитьПамятьDelegate>(ДляВыделенияПамяти);
            ИнформацияОбОшибке = Marshal.GetDelegateForFunctionPointer<ИнформацияОбОшибкеDelegate>(ДляВызоваОшибки);

        }


Где здесь VM? Выполнение машинного кода.

S>> Так объясни мне где в .Net эмуляция, Весь код перед выполнением компилируется.

S>>Ты так и не ответил про NGEN, Net Native.
T>надеюсь ответил


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

S>> В VS полно таких эмуляторо и бот они как раз и являются VM.
S>> При этом код компилируется под определенную ось и процессор.


T>>>к ТЕРМИНАМ язык программирования, интерпретатор, компилятор, среда исполнения, байт код, виртуальная машина

T>>>надо добавить
T>>>трансляцию, песочницу, дебагеры, КОНТЕЙНЕРЫ.

S>> Вот CLR это как раз среда выполнения, но в ней никакой эмуляции не происходит. Все компилируется в машинный код.

T>да CLR есть виртуальная машина и нам не интересно что применяет jit компиляцию
S>>Эмуляция происходит только в Hyper-V
T>>>Текст длинный получился.
T>>>Попробую чуть позже написать про все эти термины и где лежит граница между терминами

T>>>Замечу что в браузере для javascript работает не виртуальная машина а контейнере

S>> А в чем различие? Уже есть WebAssembly по твоей териналогии тот же байт код.
T>Совершенно верно это байт код и для выполнения нужна виртуальная машина WebAssembly который может применить jit компиляцию
T>некоторые люди уже попробовали запустить, сам пока не компилил
T>https://habrahabr.ru/company/infopulse/blog/304362/

S>>

S>>WebAssembly определяет абстрактное синтаксическое дерево(AST), которое хранится в бинарном формате. Бинарность это здорово, так как позволяет создавать меньшие приложения. Наверняка вы задаетесь вопросом, как можно отлаживать бинарный код.



S>> Опять же https://habrahabr.ru/post/261205/

S>>

S>>В: Почему бы не использовать JVM?
S>> О: Попытки добавить JVM в браузеры с помощью плагинов были и не раз. К сожалению, ничего хорошего из этого не вышло. В JavaScript есть встроенная виртуальная машина, поэтому добавление еще одной приводит к появлению второго набора API подключений, чтобы дать виртуальной машине доступ к DOM, сетям, сенсорам, устройствам ввода и т.п. За это придется кое чем пожертвовать. Например, как будут процессы в виртуальной машине распределять между собой имеющиеся ресурсы? Ответить на этот вопрос сложнее, чем кажется.

T>Для javascript уже давно делают контейнер(а не встроенная виртуальная машина) который содержит javascript виртуальную машину и jit
WebAssembly это продолжение asm.js

asm.js — это подмножество JavaScript. Скрипты, написанные на этом подмножестве, подлежат эффективной компиляции: типы данных переменных определяются статически с использованием вывода типов. Используется в основном в качестве промежуточного языка для компиляции с таких языков как C/C++ и используется в связке с такими инструментами, как Emscripten или Mandreel.

AOT-компиляция значительно ускоряет выполнение скриптов, написанных с использованием asm.js (в частности, такие скрипты не зависят от сборщика мусора).
asm.js — это подмножество JavaScript. Скрипты, написанные на этом подмножестве, подлежат эффективной компиляции: типы данных переменных определяются статически с использованием вывода типов. Используется в основном в качестве промежуточного языка для компиляции с таких языков как C/C++ и используется в связке с такими инструментами, как Emscripten или Mandreel.

AOT-компиляция значительно ускоряет выполнение скриптов, написанных с использованием asm.js (в частности, такие скрипты не зависят от сборщика мусора).

Вот у кого мешанина в голове так это ....
Re[39]: 32/64/AnyCPU - что за @$^%$?
Здравствуйте, tranzit, Вы писали:

T>Здравствуйте, Serginio1, Вы писали:


S>>Здравствуйте, tranzit, Вы писали:


S>> Что CLR эмулирует? Он просто компилирует код. Там никакого понятия эмуляции не существут.

T>CLR не компилирует ничего это среда исполнения для байт кода. т.е. эта среда содержит
T>виртуальную машину и вспомогательные утилиты и функции.
T>CLR не компилирует а исполняет байт код

То есть JIT компиляция, это не компиляция вовсе?
Еще раз как обстоит дела с NGEN, что выполняет CLR?

Что бы ло понятно

https://msdn.microsoft.com/ru-ru/library/dn807190(v=vs.110).aspx


.NET Native и NGEN

Генератор образов в машинном коде (NGEN) компилирует сборки в машинный код и устанавливает их в кэш образов в машинном коде на локальном компьютере. Однако хотя NGEN, как и .NET Native, создает машинный код, NGEN имеет существенные отличия от .NET Native:

• Если для конкретного метода нет образа в машинном коде, NGEN переключается на JIT-компиляцию кода. Это означает, что образы в машинном коде должны продолжать включать метаданные и IL-код для того случая, если генератору NGEN необходимо переключиться на JIT-компиляцию. В противоположность этому .NET Native только создает образы в машинном коде и не переключается на JIT-компиляцию. В результате должны сохраняться метаданные, необходимые только для некоторых сценариев отражения, сериализации и взаимодействия.


• NGEN по-прежнему полагается на полную среду CLR для таких сервисов, как загрузка сборок, удаленное и локальное взаимодействие, управление памятью, сбор мусора и, при необходимости, JIT-компиляция. В .NET Native многие из этих сервисов являются либо ненужными (JIT-компиляции), либо разрешаются во время построения и включаются в сборку приложения. Остальные сервисы, наиболее важным из которых является сбор мусора, включены в гораздо более компактную, оптимизированную среду выполнения mrt100_app.dll.


• Образы NGEN, как правило, хрупкие. Например, обновление или изменение зависимости обычно требует, чтобы сборки, которые его используют, также были пересозданы NGEN. Это особенно верно для системных сборок в библиотеке классов .NET Framework. В противоположность этому .NET Native позволяет обслуживать приложения независимо друг от друга.


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

S>> Прочитал. Где в CLR какая либо замена? CIL это язык, аналог ассемблера.

S>>Опять же байт код выполняет не только Java, но и на питон и 1С и еще куча интерпритаторов. Если убрать JIT,
S>>то по сути они тоже VM? Отличие от Java только в статической типизации и сборщике мусора.
S>> трехадресный код это тоже VM

T>Совершенно верно любой байт код (код исполнения) является инструкцией машины следовательно кто-то должен исполнить

T>эту инструкцию но напрямую процессор не понимает, поэтому исполнение этой инструкции берет на себя виртуальная машина.
T>для каждого языка есть стандарт, так же как и стандарт для кода который получается путем компиляции.
T>Но нигде не говорится как должны компилироваться текст программы в код, ГЛАВНОЕ чтоб этот код был понимаем виртуальной машиной или процессором. Поэтому одни производители компиляторов лучше других т.к. генерируют код более оптимально.
T>Если этот код получен путем компиляции из языка java то и байт код может выполняться на виртуальной машине java.
T>если код был получен из .Net далее применен транслятор на язык CLI/CIL а к нему применили компилятор ilasm для получения байт кода CIL который будет исполняться в среде CLR который и содержит виртуальную машину CLR.
T>Если питон-то питон виртуальная машина исполняет байт код. Если Perl то виртуальная машина PERL исполняет

Еще раз NGEN нет там никакого байт кода. Другое дело, что CLR может подгрузить сборку и откомпилировать её например при reflection. Но если нет Рефлексии то и CLR ни какой байткодом не бедет исполнять.

ооооо. Теперь у нас все интерпритаторы стали VM. И трех адресный код это уже VM. Пишем интерпретатор трехадресного кода
https://habrahabr.ru/post/117173/

T>байт код. Если язык Erlang то компиляция erlang(в байт код) то виртуальная машина ERLANG выполняет этот код. Но нам все равно как CLR виртуальная машина будет выполнять этот код. Если хочет то пускай вызывает JIT для ускорения исполнения или сами запускайте ngen для компиляции из байт кода в машинный.

То есть assembler это байт код? Тот же LLVM
https://ru.wikipedia.org/wiki/Low_Level_Virtual_Machine

В основе LLVM лежит промежуточное представление кода (Intermediate Representation, IR), над которым можно производить трансформации во время компиляции, компоновки и выполнения. Из этого представления генерируется оптимизированный машинный код для целого ряда платформ, как статически, так и динамически (JIT-компиляция). LLVM 3.6 поддерживает статическую генерацию кода для x86, x86-64, ARM, PowerPC, SPARC, MIPS, Qualcomm Hexagon, NVPTX, SystemZ, Xcore. JIT-компиляция (генерация машинного кода во время исполнения) поддержана для архитектур x86, x86_64, PowerPC, MIPS, SystemZ, и частично ARM[4].



То есть статически скомпилированный LLVM или CIL в .Net Native это тоже VM?

T>ТОЛЬКО не путайте CLR как среду исполнения (который может предлагать массу дополнительных утилит в том числе глубокую интеграцию с OS или с внешними библиотеками dll) и CLR как виртуальную машину которая исполняет CIL байт код.

T>Виртуальная машина CLR содержится в сред исполнения CLR и она для вас прозрачно т.к. вы взаимодействуете со средой
T>а не напрямую на виртуальную машину.
T>Но надо понимать различие между средой исполнения и контейнером, об этом чуть позже.
T>Я это говорю из-за того что CLR среда очень сильно подошла к понятию контейнер.

Во наконец то. Еще раз CLR это среда выполнения. Она может вообще не иметь дела с CIL.


T>из WIKI

T>Common Language Runtime (англ. CLR — общеязыковая исполняющая среда) — исполняющая среда для байт-кода CIL (MSIL), в который компилируются программы, написанные на .NET-совместимых языках программирования (C#, Managed C++, Visual Basic .NET, F# и прочие). CLR является одним из основных компонентов пакета Microsoft .NET Framework.

T>В отличие от переносимых виртуальных машин Java, абстрагирующихся от нижележащих операционных систем, CLR позиционируется как не «виртуализированная» платформа, тесно связанная с операционной системой Microsoft Windows (в том числе для целей сохранения инвестиций Microsoft в операционную систему)[1]

Угу. Уже как 4 месяца .Net Core в релизе https://habrahabr.ru/users/serginio1/topics/

T>Среда CLR является реализацией спецификации CLI (англ. Common Language Infrastructure), спецификации общеязыковой инфраструктуры компании Microsoft.


T>из WIKI

T>

T>Common Intermediate Language (сокращённо CIL) — «высокоуровневый ассемблер» виртуальной машины .NET. Промежуточный язык, разработанный фирмой «Microsoft» для платформы .NET Framework.

T>как понимаем виртуальной машины .NET-не существует т.к. из языка .Net идет трансляция на язык CLI/CIL и потом компиляция в CIL байт код (а можно и напрямую в CIL байт код). следовательно виртуальная машина не .NET а CLR.
CLR это среда выполнения. А выполняется не байт код, а скомпилированный код из него. Это может быть заранее скомпилированный код. В том числе и для .Net Native где СДК не используется.
CIL это просто язык.

T>"Assembler" компилятор для языка CLI/CIL называется ilasm а на выходе CIL байт код. есть disassembler для CIL посмотрите проект mono.

T>ОБратите внимание мы говорим об assemblere который из текста программы на языке CLI/CIL(assembler) делает байт код CIL для виртуальной машины CLR
T>Читать инфу надо задумываясь.

TT>для linux

T>https://en.wikipedia.org/wiki/Mono_%28software%29
T>https://github.com/dotnet/coreclr
T>http://www.mono-project.com/

Вот ты бы сам ссылки почитал, а то утверждаешь, что .Net только для Windows

T>Давайте теперь рассмотрим варианты компиляции

T>их очень много. Но сначала для Perl

T>1

T>после того как вы записали текст программы можно его выполнить
T>perl example.pl — в этом случает perl выступает как интерпретатор, но есть одно но. Дело в в том
T>что на лету perl формирует байт код в памяти (т.е. компиляция) и только потом ее исполняет.
T>но нам не интересно как выполняет perl текст написанный на языке perl, главное что мы передаем текст,
T>а perl интерпретатор выдает результат.

T>2

T>все это я привел для того чтобы было четкое понимание где текст программы, интерпретатор, виртуальная машина, транслятор

T>точно также .Net может сделать трансляцию на CLI/CIL(язык ассемблера)

T>далее применяя команду ilasm текст программы на assembler CIL в объектный код CIL
T>этот объектный код может выполнить CLR виртуальная машина возможно даже он применит
T>jit компиляцию (https://ru.wikipedia.org/wiki/JIT-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D1%8F)
T>прочтите доконца
T>Мы имеем CIL код(не путать с текстом на assembler CIL) но мы можем применить для этого кода команду
T>ngen для получения машинного кода.
T>https://en.wikipedia.org/wiki/Native_Image_Generator
T>https://ru.wikipedia.org/wiki/Ngen

T>но не забываем что можно сразу компилировать из любого языка CLI (https://en.wikipedia.org/wiki/List_of_CLI_languages) в CIL код

T>Также можно компилировать сразу в машинный код
T>ngen может компилировать и из текста программы на CIL assembler в машинный код

Какой нафиг текст программы на CIL? Посмотри что такое Сборка. https://msdn.microsoft.com/ru-ru/library/k3677y81(v=vs.110).aspx
Там много счего содержится для компиляции.

Сборка обладает следующими свойствами.
• Содержит код, выполняемый общеязыковой исполняющей средой. При отсутствии манифеста сборки код на промежуточном языке MSIL, находящийся в переносимом исполняемом (PE) файле, выполняться не будет. Имейте в виду, что каждая сборка может иметь только одну точку входа (т. е. DllMain, WinMain или Main).



Смотри различие .Net Native и NGEN. Мало того я из С++ могу вызвть статический метод класса https://habrahabr.ru/post/304482/
https://habrahabr.ru/post/304542/

Например получив адрес функции я вызываю её по ссигнатуре например есть метод в .Net
public static void SetDelegate(IntPtr ДляВыделенияПамяти,IntPtr ДляВызоваОшибки)


Описываю аналог в C++
typedef void(STDMETHODCALLTYPE *ManagedSetDelegate)(void*(*) (long), void(*) (const wchar_t*));


Получа адрес метода и вызваю его.
if (!CreateDelegate(domainId, L"SetDelegate", (INT_PTR*)&pSetDelegate)) return false;

// Передадим ссылки на нужные методы
        pSetDelegate(ManagedDomainLoader::GetMem, ManagedDomainLoader::AddError);



Внутри .Net я получаю ссылки на статические методы

public static void SetDelegate(IntPtr ДляВыделенияПамяти,IntPtr ДляВызоваОшибки)
        {
            ВыделитьПямять = Marshal.GetDelegateForFunctionPointer<ВыделитьПамятьDelegate>(ДляВыделенияПамяти);
            ИнформацияОбОшибке = Marshal.GetDelegateForFunctionPointer<ИнформацияОбОшибкеDelegate>(ДляВызоваОшибки);

        }


Где здесь VM? Выполнение машинного кода.

S>> Так объясни мне где в .Net эмуляция, Весь код перед выполнением компилируется.

S>>Ты так и не ответил про NGEN, Net Native.
T>надеюсь ответил


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

S>> В VS полно таких эмуляторо и бот они как раз и являются VM.
S>> При этом код компилируется под определенную ось и процессор.


T>>>к ТЕРМИНАМ язык программирования, интерпретатор, компилятор, среда исполнения, байт код, виртуальная машина

T>>>надо добавить
T>>>трансляцию, песочницу, дебагеры, КОНТЕЙНЕРЫ.

S>> Вот CLR это как раз среда выполнения, но в ней никакой эмуляции не происходит. Все компилируется в машинный код.

T>да CLR есть виртуальная машина и нам не интересно что применяет jit компиляцию
S>>Эмуляция происходит только в Hyper-V
T>>>Текст длинный получился.
T>>>Попробую чуть позже написать про все эти термины и где лежит граница между терминами

T>>>Замечу что в браузере для javascript работает не виртуальная машина а контейнере

S>> А в чем различие? Уже есть WebAssembly по твоей териналогии тот же байт код.
T>Совершенно верно это байт код и для выполнения нужна виртуальная машина WebAssembly который может применить jit компиляцию
T>некоторые люди уже попробовали запустить, сам пока не компилил
T>https://habrahabr.ru/company/infopulse/blog/304362/

S>>

S>>WebAssembly определяет абстрактное синтаксическое дерево(AST), которое хранится в бинарном формате. Бинарность это здорово, так как позволяет создавать меньшие приложения. Наверняка вы задаетесь вопросом, как можно отлаживать бинарный код.



S>> Опять же https://habrahabr.ru/post/261205/

S>>

S>>В: Почему бы не использовать JVM?
S>> О: Попытки добавить JVM в браузеры с помощью плагинов были и не раз. К сожалению, ничего хорошего из этого не вышло. В JavaScript есть встроенная виртуальная машина, поэтому добавление еще одной приводит к появлению второго набора API подключений, чтобы дать виртуальной машине доступ к DOM, сетям, сенсорам, устройствам ввода и т.п. За это придется кое чем пожертвовать. Например, как будут процессы в виртуальной машине распределять между собой имеющиеся ресурсы? Ответить на этот вопрос сложнее, чем кажется.

T>Для javascript уже давно делают контейнер(а не встроенная виртуальная машина) который содержит javascript виртуальную машину и jit
WebAssembly это продолжение asm.js

asm.js — это подмножество JavaScript. Скрипты, написанные на этом подмножестве, подлежат эффективной компиляции: типы данных переменных определяются статически с использованием вывода типов. Используется в основном в качестве промежуточного языка для компиляции с таких языков как C/C++ и используется в связке с такими инструментами, как Emscripten или Mandreel.

AOT-компиляция значительно ускоряет выполнение скриптов, написанных с использованием asm.js (в частности, такие скрипты не зависят от сборщика мусора).
asm.js — это подмножество JavaScript. Скрипты, написанные на этом подмножестве, подлежат эффективной компиляции: типы данных переменных определяются статически с использованием вывода типов. Используется в основном в качестве промежуточного языка для компиляции с таких языков как C/C++ и используется в связке с такими инструментами, как Emscripten или Mandreel.

AOT-компиляция значительно ускоряет выполнение скриптов, написанных с использованием asm.js (в частности, такие скрипты не зависят от сборщика мусора).

Вот у кого мешанина в голове так это ....