Эта статья требует дополнительных ссылок для проверки . ( январь 2009 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
Байт-код , также называемый переносимым кодом или p-кодом , представляет собой форму набора команд, разработанную для эффективного выполнения программным интерпретатором . В отличие от исходного кода , доступного для чтения человеком [1] , байт-коды представляют собой компактные числовые коды, константы и ссылки (обычно числовые адреса), которые кодируют результат синтаксического анализа компилятора и выполнения семантического анализа таких вещей, как тип, область действия и глубина вложенности программных объектов.
Выполнение программы |
---|
Общие понятия |
Типы кода |
Стратегии компиляции |
Заметное время выполнения |
|
Известные компиляторы и инструментальные средства |
|
Найдите байт-код в Викисловаре, бесплатном словаре. |
Байт-код имени происходит от наборов инструкций, которые имеют однобайтовые коды операций, за которыми следуют необязательные параметры. Промежуточные представления, такие как байт-код, могут выводиться реализациями языков программирования для облегчения интерпретации , или они могут использоваться для уменьшения зависимости от оборудования и операционной системы , позволяя одному и тому же коду работать на разных платформах на разных устройствах. Байт-код часто может быть либо непосредственно выполнен на виртуальной машине ( машина p-кода, т. Е. Интерпретатор), либо он может быть дополнительно скомпилирован в машинный код для повышения производительности.
Поскольку инструкции байт-кода обрабатываются программным обеспечением, они могут быть сколь угодно сложными, но, тем не менее, часто похожи на традиционные аппаратные инструкции: машины с виртуальным стеком являются наиболее распространенными, но также были созданы машины с виртуальными регистрами . [2] [3] Различные части часто могут храниться в отдельных файлах, подобно объектным модулям , но динамически загружаться во время выполнения.
Казнь [ править ]
Программа байт-кода может выполняться путем синтаксического анализа и непосредственного выполнения инструкций по одной за раз. Этот вид интерпретатора байт-кода очень портативен. Некоторые системы, называемые динамические переводчики, или просто в срок (JIT) компиляторы, переводить байт - код в машинный код по мере необходимости в режиме исполнения . Это делает виртуальную машину зависимой от оборудования, но не теряет переносимость байт-кода. Например, Java и Smalltalkкод обычно хранится в формате байт-кода, который обычно затем JIT-компилируется для преобразования байт-кода в машинный код перед выполнением. Это вводит задержку перед запуском программы, когда байт-код компилируется в собственный машинный код, но значительно увеличивает скорость выполнения по сравнению с интерпретацией исходного кода напрямую, обычно примерно на порядок (10x). [4]
Из-за преимущества в производительности сегодня многие языковые реализации выполняют программу в два этапа, сначала компилируя исходный код в байт-код, а затем передавая байт-код в виртуальную машину. Такие виртуальные машины на основе байт-кода существуют для Java , Raku , Python , PHP , [a] Tcl , mawk и Forth (однако Forth редко компилируется с помощью байт-кодов таким образом, и его виртуальная машина вместо этого является более общей). Реализация Perl и Ruby 1.8 вместо этого работает путем обхода представления абстрактного синтаксического дерева, полученного из исходного кода.
Совсем недавно авторы V8 [1] и Dart [7] поставили под сомнение представление о том, что промежуточный байт-код необходим для быстрой и эффективной реализации виртуальной машины. Обе эти языковые реализации в настоящее время выполняют прямую JIT-компиляцию из исходного кода в машинный код без промежуточного байт-кода. [8]
Примеры [ править ]
>>> import dis # "dis" - Дизассемблер байтового кода Python в мнемонику. >>> дис . dis ( 'print ("Hello, World!")' ) 1 0 LOAD_NAME 0 (print) 2 LOAD_CONST 0 ('Hello, World!') 4 CALL_FUNCTION 1 6 RETURN_VALUE
- ActionScript выполняется на виртуальной машине ActionScript (AVM), которая является частью Flash Player и AIR. Код ActionScript обычно преобразуется компилятором в формат байт-кода . Примеры компиляторов включают один, встроенный в Adobe Flash Professional, и один, встроенный в Adobe Flash Builder, и доступный в Adobe Flex SDK.
- Объекты Adobe Flash
- BANCStar , первоначально байт-код для инструмента построения интерфейса, но также используемый как язык
- Пакетный фильтр Беркли
- Инженерная библиотека байтового кода
- Компиляторы виртуальных машин C в Java
- Реализация CLISP Common Lisp много лет использовалась для компиляции только в байт-код; однако теперь он также поддерживает компиляцию в собственный код с помощью GNU lightning.
- CMUCL и Scieneer Common Lisp реализаций Common Lisp может составить либо в машинный код или байт - код, который является гораздо более компактным
- Common Intermediate Language, выполняемый Common Language Runtime , используемый языками .NET Framework, такими как C #
- Байт-код Dalvik, разработанный для платформы Android , выполняется виртуальной машиной Dalvik.
- Байт-код Dis, разработанный для Inferno (операционная система) , выполняется виртуальной машиной Dis
- EiffelStudio для языка программирования Eiffel
- EM, виртуальная машина Amsterdam Compiler Kit, используемая как промежуточный язык компиляции и как современный язык байт-кода.
- Emacs - это текстовый редактор, большинство функций которого реализовано Emacs Lisp , его встроенным диалектом Lisp . Эти функции скомпилированы в байт-код. Эта архитектура позволяет пользователям настраивать редактор с использованием языка высокого уровня, который после компиляции в байт-код дает разумную производительность.
- Встраиваемая реализация Common Lisp Common Lisp может компилироваться в байт-код или код C
- Реализация Erlang от Ericsson использует байт-коды BEAM
- Языки программирования Icon [9] и Unicon [10]
- Компания Infocom использовала Z-машину, чтобы сделать свои программные приложения более портативными
- Байт-код Java , который выполняется виртуальной машиной Java.
- КАК М
- BCEL
- Javassist
- JMangler
- KEYB , драйвер клавиатуры MS-DOS / PC DOS с файлом ресурсов KEYBOARD.SYS, содержащим информацию о макете и короткие последовательности p-кода , выполняемые интерпретатором внутри резидентного драйвера. [11] [12]
- LSL, язык сценариев, используемый в виртуальных мирах, компилируется в байт-код, выполняемый на виртуальной машине. Second Life имеет оригинальную версию Mono, Inworldz разработал версию Phlox.
- В языке Lua используется виртуальная машина с байт-кодом на основе регистров.
- м-код MATLAB языка [13]
- Мультиплан [14]
- O-код на BCPL языке программирования
- Язык OCaml дополнительно компилируется в компактную форму байт-кода
- р-код из UCSD Pascal реализации Паскаля языка
- Виртуальная машина Parrot
- Выберите BASIC, также называемый Data BASIC или MultiValue BASIC.
- Среда R для статистических вычислений предлагает компилятор байт-кода через пакет компилятора, который теперь является стандартным для R версии 2.13.0. Эту версию R можно скомпилировать, чтобы использовать ее в базовых и рекомендуемых пакетах. [15]
- Пирамида 2000 приключенческая игра
- Схема 48 реализация схемы с использованием интерпретатора байт-кода
- Байт - многих реализаций Smalltalk языка
- Спин переводчик , встроенный в Parallax Propeller микроконтроллера
- SQLite движок базы данных переводит SQL заявления в формате заказных байт-кода. [16]
- СЛАДКИЕ 16
- Tcl
- Tiny BASIC
- Visual FoxPro компилируется в байт-код
- WebAssembly
- YARV и Rubinius для Ruby
См. Также [ править ]
- Система выполнения
- ZCODE
Заметки [ править ]
- ^ PHP имеет своевременную компиляцию в PHP 8, [5] [6] и раньше, хотя он не был включен в версии по умолчанию, имел такие параметры, как HHVM . Для более старых версий PHP: хотякоды операций PHP генерируются каждый раз при запуске программы и всегда интерпретируются, а не компилируются вовремя .
Ссылки [ править ]
- ^ a b «Генерация динамического машинного кода» . Google .
- ^ «Реализация Lua 5.0» . (NB. Это касается виртуальной машины на основе регистров.)
- ^ "Дальвик В.М." . Архивировано из оригинала на 2013-05-18 . Проверено 29 октября 2012 . (NB. Эта виртуальная машина основана на регистре.)
- ^ «Байт-код против машинного кода» . www.allaboutcomputing.net . Проверено 23 октября 2017 .
- ^ О'Финни, Мэтью Вейер. «Изучение нового компилятора PHP JIT» . Zend от Perforce . Источник 2021-02-19 .
- ^ «PHP 8: JIT - stitcher.io» . stitcher.io . Источник 2021-02-19 .
- ^ Loitsch, Флориан. "Почему не виртуальная машина с байт-кодом?" . Google . Архивировано из оригинала на 2013-05-12.
- ^ «Миф о JavaScript: JavaScript нужен стандартный байт-код» . 2ality.com .
- ^ "Реализация языка программирования иконок" (PDF) . Архивировано из оригинального (PDF) 05 марта 2016 года . Проверено 9 сентября 2011 .
- ^ «Реализация Icon и Unicon a Compendium» (PDF) .
- ^ Пол, Матиас Р. (2001-12-30). "Внутренняя структура KEYBOARD.SYS" . Группа новостей : comp.os.msdos.programmer . Архивировано 9 сентября 2017 года . Проверено 17 сентября 2016 .
[…] Фактически, формат в основном тот же в
MS-DOS
3.3 - 8.0,
PC DOS
3.3 - 2000, включая выпуски для России, Литвы, Китая и Японии, а также в Windows NT, 2000 и XP […] . Есть незначительные отличия и несовместимости, но общий формат с годами не изменился. […] Некоторые записи данных содержат обычные таблицы […] Однако большинство записей содержат
исполняемый код,
интерпретируемый каким-либо
Интерпретатор p-кода во время выполнения *, включая условные переходы и т.п. Вот почему драйвер KEYB имеет такой огромный объем памяти по сравнению с драйверами клавиатуры, управляемыми таблицами, которые могут быть выполнены за 3–4 Кбайта с тем же уровнем функций, за исключением интерпретатора. […]
- ^ Мендельсон, Эдвард (2001-07-20). «Как отобразить евро в MS-DOS и Windows DOS» . Отображение символа евро в полноэкранном режиме MS-DOS (включая полноэкранный режим DOS в Windows 95 или Windows 98). Архивировано 17 сентября 2016 года . Проверено 17 сентября 2016 .
[...] Matthias [Р.] Пол [...] предупреждает ,
что
IBM PC DOS
версии драйвера клавиатуры использует некоторые внутренние процедуры, которые не распознаются в
Microsoft
драйвера, поэтому, если это
возможно, следует использовать
IBM
версии обоих
KEYB .COM
и
KEYBOARD.SYS
вместо смешивания версий Microsoft и IBM […]
(NB. Под «процедурами» понимаются некоторые дополнительные байт-коды в файле IBM KEYBOARD.SYS, не поддерживаемые версией Microsoft драйвера KEYB.) - ^ "Патент США 6,973,644" .
- ^ Спецификации Microsoft C Pcode . п. 13.
Multiplan
был скомпилирован не в
машинный код
, а в своего рода байт-код, который запускался
интерпретатором
, чтобы сделать Multiplan переносимым на самые разные аппаратные средства того времени.
Этот байт-код различает машинно-
зависимый формат
с
плавающей запятой
для вычисления и внешний (стандартный) формат, представляющий собой
десятичный двоичный код
(BCD).
Инструкции PACK и UNPACK преобразуются между ними.
- ^ «Установка и администрирование R» . cran.r-project.org .
- ^ "Механизм байт-кода SQLite" . Архивировано из оригинала на 2017-04-14 . Проверено 29 августа 2016 .