Re[38]: 32/64/AnyCPU - что за @$^%$?
От: tranzit  
Дата: 03.11.16 00:47
Оценка:
Здравствуйте, Serginio1, Вы писали:

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


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

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

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

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

Совершенно верно любой байт код (код исполнения) является инструкцией машины следовательно кто-то должен исполнить
эту инструкцию но напрямую процессор не понимает, поэтому исполнение этой инструкции берет на себя виртуальная машина.
для каждого языка есть стандарт, так же как и стандарт для кода который получается путем компиляции.
Но нигде не говорится как должны компилироваться текст программы в код, ГЛАВНОЕ чтоб этот код был понимаем виртуальной машиной или процессором. Поэтому одни производители компиляторов лучше других т.к. генерируют код более оптимально.
Если этот код получен путем компиляции из языка java то и байт код может выполняться на виртуальной машине java.
если код был получен из .Net далее применен транслятор на язык CLI/CIL а к нему применили компилятор ilasm для получения байт кода CIL который будет исполняться в среде CLR который и содержит виртуальную машину CLR.
Если питон-то питон виртуальная машина исполняет байт код. Если Perl то виртуальная машина PERL исполняет
байт код. Если язык Erlang то компиляция erlang(в байт код) то виртуальная машина ERLANG выполняет этот код. Но нам все равно как CLR виртуальная машина будет выполнять этот код. Если хочет то пускай вызывает JIT для ускорения исполнения или сами запускайте ngen для компиляции из байт кода в машинный.
ТОЛЬКО не путайте CLR как среду исполнения (который может предлагать массу дополнительных утилит в том числе глубокую интеграцию с OS или с внешними библиотеками dll) и CLR как виртуальную машину которая исполняет CIL байт код.
Виртуальная машина CLR содержится в сред исполнения CLR и она для вас прозрачно т.к. вы взаимодействуете со средой
а не напрямую на виртуальную машину.
Но надо понимать различие между средой исполнения и контейнером, об этом чуть позже.
Я это говорю из-за того что CLR среда очень сильно подошла к понятию контейнер.


из WIKI

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

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

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


из WIKI

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

как понимаем виртуальной машины .NET-не существует т.к. из языка .Net идет трансляция на язык CLI/CIL и потом компиляция в CIL байт код (а можно и напрямую в CIL байт код). следовательно виртуальная машина не .NET а CLR.
"Assembler" компилятор для языка CLI/CIL называется ilasm а на выходе CIL байт код. есть disassembler для CIL посмотрите проект mono.
ОБратите внимание мы говорим об assemblere который из текста программы на языке CLI/CIL(assembler) делает байт код CIL для виртуальной машины CLR
Читать инфу надо задумываясь.
Вы рассматриваете строго один из возможных вариантов исключая остальные
Давайте еще раз рассмотрим весь процесс.

https://ru.wikipedia.org/wiki/.NET_Framework
https://en.wikipedia.org/wiki/Common_Language_Infrastructure
https://en.wikipedia.org/wiki/Common_Intermediate_Language

https://ru.wikipedia.org/wiki/Common_Language_Infrastructure
https://ru.wikipedia.org/wiki/Common_Language_Runtime
https://ru.wikipedia.org/wiki/Ngen


https://www.microsoft.com/net/core
https://www.microsoft.com/net
https://docs.microsoft.com/en-us/dotnet/articles/core/tools/dotnet
https://docs.microsoft.com/en-us/dotnet/articles/core/tools/dotnet-build
https://docs.microsoft.com/ru-ru/dotnet/articles/core/tutorials/target-dotnetcore-with-msbuild

CLI https://docs.microsoft.com/en-us/dotnet/articles/core/tools/
CLR https://msdn.microsoft.com/en-us/library/8bs2ecf4%28v=vs.110%29.aspx

C/C++ опции для CLR
cl.exe /clr
https://msdn.microsoft.com/en-us/library/9s7c9wdw.aspx
https://msdn.microsoft.com/en-us/library/fwkeyyhe.aspx
https://msdn.microsoft.com/en-us/library/k8d11d4s.aspx

для компиляции проекта
http://superuser.com/questions/604953/how-can-i-compile-a-net-project-without-having-visual-studio-installed
msbuild "C:\Users\Oliver\Documents\My Project\My Project.sln" /t:Rebuild /p:Configuration=Release /p:Platform="Any CPU"

для linux
https://en.wikipedia.org/wiki/Mono_%28software%29
https://github.com/dotnet/coreclr
http://www.mono-project.com/




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

Далее производители процессоров создают свои компиляторы в первую очередь ассемблеры. и часто С/C++
эти компиляторы формируют код из ТЕКСТА программы в КОД машины. Процесс этот не регламентируется
главное требование чтоб код был исполняемым на процессоре и был как можно оптимален т.е. чтоб
выполнял как можно более передовые и оптимальные инструкции машины для увеличения производительности
например для x86_64 можно выполнять как одиночные команды сложения умножения так и для sse4 который
манипулирует 256bit регистрами и одна инструкция выполняет сразу действия над 4Хarg1 + 4xarg2 = 4 числа
для sse5 уже регистры имеют размер 512 бит и одна команда манипулирует уде 8 числами double float
производительность возврастает но только при условии что эти инструкции будут задействованы компилятором
Аналогично и с компиляторами байт кода, но байт код пока не меняется и виртуальная машина тоже
но виртуальная машина может выполнять инструкции байт кода как от своего имени и при этом задействует
новы возможности процессора или же может вызвать jit компиляцию. Но нам все равно как будет выполняться
эти виртуальные коды. Главное что мы может взять эти виртуальные коды и перенести на другую машину
и даже на машину с другой платформой(CPU+OS) и этот код должен выполняться.
CIL код должен так же исполняться на виртуальной машине CLR. Но проблема в Microsoft они не хотят
чтобы их клиенты которые покупают IDE уходили на другие платформы т.к. потеряют доход.
Т.к. сегодня opensource предлагает CLR среду
https://habrahabr.ru/post/243065/
https://github.com/dotnet/core
https://en.wikipedia.org/wiki/Mono_%28software%29

Не забываете что CLR был регламентирован как машинно независимый код.


Давайте теперь рассмотрим варианты компиляции
их очень много. Но сначала для Perl

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

2
можно текст программы на perl скомпилировать в PERL байт код, например так
perl -MO=Bytecode,-H,-oexample.bl example.pl
в результате мы имеем PERL байт код и находится в файле example.bl
и если мы выполним инструкцию
perl example.bl — то perl программа уже выступает в роли PERL виртуальной машины которая исполняет PERL byte code

3
теперь попробуем выполнить следующую инструкцию perlcc (устанавливается отдельно)
perlcc -o example example.pl
perlcc скомпилирует example.pl в исполнимый файл на машинном коде
тогда ./example становится самоcтоятельным приложением и уже с perl никак не связан

4
мы можем выполнить следующую инструкцию
perlcc -c example.pl
на выходе будем иметь example.c и опять никак не связан уже с perl, данная
процедура называется трансляцией

5
если выполнить perljvm то получим из perl текста программы байт код для java виртуальной машины
и этот код надо будет выполнять уже на JAVA виртуальной машине а не PERL виртуальной машине

можно продолжать и далее, очень гибкий инструмент
Тоже самое можно делать и с "с/c++"

ну и чтоб совсем было весело с компиляторами можно рассмотреть gcc в качестве кросс компилятора
опции --build=x86_64 --host=sparc-sun-solaris2.10 --target=arm позволяют скомпилировать gcc на текущем компьютере например на x86_64 для sparc машины (т.е. программа gcc будет выполняться на spark) а компиляцию делать
для arm процессора

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

Теперь разберем .Net

перевод из одного языка в другой называется трансляцией
на самом деле можно трансляцию делать из одного языка в другой или из байт кода java в другой байт код
или из одного процессорного кода (бинарный уровень) в другой машинный код совершенно другого процессора.
например С текст программы можно преобразовать в assembler-ный текст программы
gcc -S -o exemple.s example.c
из машинного кода в другой машинный код objdump
или из перл в С
точно также .Net может сделать трансляцию на CLI/CIL(язык ассемблера)
далее применяя команду ilasm текст программы на assembler CIL в объектный код CIL
этот объектный код может выполнить CLR виртуальная машина возможно даже он применит
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)
прочтите доконца
Мы имеем CIL код(не путать с текстом на assembler CIL) но мы можем применить для этого кода команду
ngen для получения машинного кода.
https://en.wikipedia.org/wiki/Native_Image_Generator
https://ru.wikipedia.org/wiki/Ngen

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



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

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


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

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


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

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

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

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

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

S> А в чем различие? Уже есть WebAssembly по твоей териналогии тот же байт код.
Совершенно верно это байт код и для выполнения нужна виртуальная машина WebAssembly который может применить jit компиляцию
некоторые люди уже попробовали запустить, сам пока не компилил
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, сетям, сенсорам, устройствам ввода и т.п. За это придется кое чем пожертвовать. Например, как будут процессы в виртуальной машине распределять между собой имеющиеся ресурсы? Ответить на этот вопрос сложнее, чем кажется.

Для javascript уже давно делают контейнер(а не встроенная виртуальная машина) который содержит javascript виртуальную машину и jit
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.