CIL - это язык ассемблера, а JIT - ассемблер

Действительно ли Just In Time Compiler(JIT) сопоставляет каждую из инструкций Common Intermediate Language(CIL) в программе с opcodes базового процессора?

И если это так, можем ли мы называть CIL языком ассемблера, а JIT - ассемблером

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


person Anirudha    schedule 28.07.2012    source источник
comment
интересный вопрос, я попытался ответить, но это не так просто. Я думаю, вы не можете считать это языком ассемблера, поскольку на самом деле нет реального процессора, который запускал бы его напрямую.   -  person Felice Pollano    schedule 28.07.2012
comment
@FelicePollano, затем CIL, возможно, частичный язык ассемблера .. :)   -  person Anirudha    schedule 28.07.2012
comment
Мнемоника языка ассемблера соотносится 1: 1 с инструкциями машинного кода, специфичными для ЦП. Ассемблер просто сопоставляет (вроде) понятный человеку код сборки с этими инструкциями. Это определенно не относится к CIL. Это не частично, это просто не так - язык ассемблера имеет очень четкое определение.   -  person Jamie Treworgy    schedule 28.07.2012
comment
@jamietre, вы правы, но люди называют это объектно-ориентированным языком ассемблера.   -  person Anirudha    schedule 28.07.2012
comment
Я не слышал, чтобы это называлось раньше, я думаю, что объектно-ориентированный байт-код был бы более точным   -  person Jamie Treworgy    schedule 28.07.2012
comment
Я даже не уверен, что объектно-ориентированный подход так важен для CIL (хотя архитектура CLI явно отдает предпочтение парадигме объектно-ориентированного программирования). Его модель оценки на основе стека гораздо более заметна, как и акцент на предоставлении метаданных помимо байт-кода. ваш типичный язык ассемблера вообще не заботится о метаданных.   -  person stakx - no longer contributing    schedule 28.07.2012
comment
@stakx Я бы сказал, что наличие отдельных статических, экземпляров и виртуальных методов и даже инструкции, специально предназначенной для виртуальных вызовов, делает объектно-ориентированный объект весьма заметным.   -  person svick    schedule 28.07.2012
comment
IL == Intermediatary Language, так что нет.   -  person leppie    schedule 28.07.2012


Ответы (4)


Сборка состоит из мнемоник инструкций машинного кода конкретного процессора. Прямое представление единиц и нулей, которые заставляют ядро ​​выполнять код, но написанное в тексте, чтобы облегчить работу человеку. Что очень не похоже на CIL:

  • вы не можете купить процессор, который выполняет CIL
  • CIL не нацелен на конкретный процессор, а на дрожание
  • CIL предполагает модель исполнения на основе стека, процессоры в основном основаны на регистрах.
  • Код CIL оптимизирован по сравнению с исходной формой
  • нет однозначного перевода инструкции CIL в инструкцию процессора

Этот последний пункт является ключевым, дизайнерское решение, которое отличает CIL от байт-кода, состоит в том, что инструкции CIL не имеют типов. Есть только одна инструкция ADD, но у процессоров есть много ее версий. Конкретные, которые принимают операнды byte, short, int, long, float и double. Требуется, поскольку для выполнения добавления используются разные части ядра процессора. Джиттер выбирает правильный в зависимости от типа операндов, которые он выводит из предыдущих инструкций CIL.

Как и оператор + в языке C #, он также может работать с разными типами операндов. Что действительно делает L в CIL значимым, это язык. Простой, но простой, чтобы упростить запись для него джиттера.

person Hans Passant    schedule 28.07.2012
comment
Почему имеет значение наличие физического процессора? Что, если кто-то в будущем создаст физический процессор для байт-кода CIL, не сделает ли это внезапно CIL языком ассемблера? Кроме того, означает ли это, что MIXAL не является языком ассемблера? - person svick; 28.07.2012
comment
Такая вот что, если игра не очень продуктивна. Дело в том, что такого процессора нет, последняя часть моего ответа указала на вероятную причину, по которой у нас его до сих пор нет. Даже Java нет, Jazelle выполняет не все байтовые коды. Я обещаю, что как только у меня будет один на моей машине, который позволит мне публиковать сообщения в SO, я использую его для редактирования этого ответа. Может случиться, посмотрим, что производит Мидори. - person Hans Passant; 28.07.2012
comment
Я считаю, что определение, основанное на существовании определенного оборудования, глупо. Конкретное оборудование не создает язык ассемблера, а механика его компиляции делает. - person svick; 28.07.2012
comment
Хм, нет, в случае сборки. Ваш пример MIXAL требует эмулятора, части программного обеспечения, которое имитирует оборудование. В данном случае - фиктивный процессор Кнута. Это только когда-либо представляет академический интерес (например, студенты, изучающие MIPS) или интересные для выполнения ПЗУ старых игр, эмуляторы слишком медленны, чтобы когда-либо быть полезными в вычислениях общего назначения. - person Hans Passant; 28.07.2012
comment
Итак, вы говорите, что язык ассемблера MIX не является языком ассемблера и что Кнут не знает, что означает «язык ассемблера»? - person svick; 28.07.2012
comment
Эмуляторы исполняют единицы и нули, созданные ассемблером. Мне не особенно нравится направление, в котором идет этот след комментариев, давайте назовем его закрытым. - person Hans Passant; 28.07.2012

Этот вопрос касается определений, поэтому давайте определим термины должным образом. Во-первых, язык ассемблера:

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

Теперь CIL:

Common Intermediate Language - это язык программирования нижнего уровня, понятный человеку, определенный спецификацией Common Language Infrastructure (CLI) и используется .NET Framework и Mono. Языки, нацеленные на CLI-совместимую среду выполнения, компилируются в CIL, который собирается в объектный код, имеющий формат в стиле байт-кода.

Хорошо, эта часть технически неверна: например, компилятор C # компилируется непосредственно в байт-код, он не проходит через CIL (язык, читаемый человеком), но теоретически мы можем представить, что происходит.

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

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


О JIT: JIT-компилятор нельзя считать ассемблером: он не выполняет преобразование 1: 1 из удобочитаемой формы в байт-код, это делает ilasm.

Компилятор JIT - это оптимизирующий компилятор, который компилирует байт-код в машинный код (для любого ISA / CPU, на котором он работает), одновременно выполняя оптимизацию.

person svick    schedule 28.07.2012
comment
Виртуальные машины выполняют JIT-компиляцию для определенных машинных инструкций (x86, x64, ia64 и т. Д.). - person Peter Ritchie; 28.07.2012
comment
Часть вопроса OP задана о JIT. - person Peter Ritchie; 28.07.2012
comment
@PeterRitchie Хорошо, спасибо, я добавил короткие абзацы о JIT. - person svick; 28.07.2012
comment
@svick ilasm генерирует переносимый исполняемый файл (PE), который содержит MSIL и необходимые метаданные .. Как он может быть ассемблером! - person Anirudha; 28.07.2012
comment
@Anirudha Строго говоря, сгенерированный файл не содержит CIL, он содержит CIL байт-код. Именно это и должен делать ассемблер (программа): переводить удобочитаемую программу 1: 1 в машиночитаемый код. Ассемблер не должен компилироваться в машинный код x86. - person svick; 28.07.2012
comment
@Anirudha Кроме того, как вы думаете, почему это должно означать, что это не ассемблер? Какой части определения языка ассемблера, которое я дал выше, это противоречит? Или вы не согласны с определением? - person svick; 28.07.2012
comment
@svick, как мы можем использовать ilasm для создания машинного кода x86 и x64. нужно ли нам использовать некоторые параметры при использовании ilasm - person Anirudha; 28.07.2012
comment
@Anirudha Что делает машинный код x86 особенным? Ассемблер не должен создавать код x86, например, ARM также этого не делает. И, например, некоторые компиляторы C действительно производят машинный код x86, но они не ассемблеры. Ассемблер не имеет ничего общего с машинным кодом x86. - person svick; 28.07.2012
comment
Отличный ответ. +1 за то, чтобы начать с терминологии и работать над логическим выводом оттуда. Возможно, было бы хорошо сказать что-нибудь. о том, как дополнительная генерация метаданных помимо инструкций влияет на то, что ilasm является ассемблером (и, следовательно, CIL - языком ассемблера), согласно определениям терминов ...? - person stakx - no longer contributing; 28.07.2012

Граница на самом деле довольно расплывчата ... аргументы, которые я видел против вызова CIL "языка ассемблера", почти так же применимы к _2 _ / _ 3_ на практике.

Intel и AMD не создали процессоры, которые выполняют инструкции сборки в точности так, как они были выпущены десятилетиями (если вообще когда-либо), поэтому даже так называемый «собственный» код не сильно отличается от работы на виртуальной машине, байт-код которой указан в _4 _ / _ 5_.

_6 _ / _ 7_ - это элемент нижнего уровня, к которому имеют доступ типичные разработчики, поэтому, если бы нам пришлось остановиться и называть что-то в нашей экосистеме «языком ассемблера», это бы победило, а поскольку CIL байт-код в конечном итоге требует _9 _ / _ 10_ инструкций чтобы иметь возможность работать на процессоре из этого семейства, тогда есть довольно веские аргументы в пользу того, что он действительно не «чувствует», что он должен считаться.

Так что в каком-то смысле, возможно, ни один из них не может считаться «языком ассемблера». Говоря о _11 _ / _ 12_ процессорах, мы почти никогда не говорим о процессорах, которые выполняют _13 _ / _ 14_, не переводя его во что-то другое (т.е. что бы ни делал микрокод).

Чтобы добавить еще одну сложность, способ, которым процессор _15 _ / _ 16_ выполняет заданную последовательность инструкций, может измениться, просто обновив микрокод. Быстрый поиск показывает, что Linux может даже сделать это самостоятельно в программном обеспечении!

Итак, я думаю, вот критерии, которые могут оправдать разделение их на две отдельные категории:

  1. Имеет ли значение, что все текущие машины, на которых выполняется CIL байт-код, реализованы программно?
  2. Имеет ли значение, что одно и то же оборудование может интерпретировать одни и те же _18 _ / _ 19_ инструкции по-разному после того, как получило указание сделать это в программном обеспечении?
  3. Имеет ли значение, что в настоящее время у нас нет способа обойти микрокод и отдать команды напрямую физическим модулям _20 _ / _ 21_ процессоров?

Итак, что касается вопроса «является ли CIL языком ассемблера», лучшие ответы, которые я могу дать, - это «зависит от обстоятельств» (для ученых) и «в значительной степени» (для инженеров).

person Joe Amenta    schedule 27.01.2017

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

MSIL JIT - это реализация виртуальной машины для этого байт-кода. То, как реализации (от Microsoft или Mono) переводят CIL в машинный код, является деталью реализации, которая на самом деле не имеет значения для вы (и учитывая, что виртуальная машина Microsoft, вероятно, проприетарная, то не скажу вам, как это делается). Я думаю, что Mono - бесплатная программная реализация CIL- использует LLVM, поэтому, вероятно, не переводите каждый байт-код за раз. но, вероятно, целые методы или функции.

person Basile Starynkevitch    schedule 28.07.2012
comment
байт-код - это физическое представление или скомпилированная версия CIL. CIL - это не байт-код. - person Peter Ritchie; 28.07.2012