Форма набора инструкций, предназначенная для выполнения программным интерпретатором
Байт-код (также называемый переносимым кодом или p-кодом ) — это форма набора инструкций, разработанная для эффективного выполнения программным интерпретатором . В отличие от исходного кода , читаемого человеком [1] , байт-коды представляют собой компактные числовые коды, константы и ссылки (обычно числовые адреса), которые кодируют результат синтаксического анализа компилятором и выполнения семантического анализа таких вещей, как тип, область действия и глубина вложенности объектов программы.
Название байт-код происходит от наборов инструкций, которые имеют однобайтовые коды операций, за которыми следуют необязательные параметры. Промежуточные представления, такие как байт-код, могут выводиться реализациями языка программирования для облегчения интерпретации , или они могут использоваться для уменьшения зависимости от оборудования и операционной системы , позволяя одному и тому же коду работать кроссплатформенно , на разных устройствах. Байт-код часто может быть либо напрямую выполнен на виртуальной машине ( машина p-кода , т. е. интерпретатор), либо он может быть дополнительно скомпилирован в машинный код для лучшей производительности.
Поскольку инструкции байт-кода обрабатываются программным обеспечением, они могут быть произвольно сложными, но тем не менее часто схожи с традиционными аппаратными инструкциями: виртуальные стековые машины являются наиболее распространенными, но были также построены виртуальные регистровые машины . [2] [3] Различные части часто могут храниться в отдельных файлах, похожих на объектные модули , но динамически загружаемых во время выполнения.
Исполнение
Программа байт-кода может быть выполнена путем разбора и непосредственного выполнения инструкций по одной за раз. Этот вид интерпретатора байт-кода очень портативен. Некоторые системы, называемые динамическими трансляторами или компиляторами just-in-time (JIT), транслируют байт-код в машинный код по мере необходимости во время выполнения . Это делает виртуальную машину аппаратно-зависимой, но не теряет переносимости байт-кода. Например, код Java и Smalltalk обычно хранится в формате байт-кода, который обычно затем компилируется JIT для трансляции байт-кода в машинный код перед выполнением. Это вносит задержку перед запуском программы, когда байт-код компилируется в машинный код, но значительно повышает скорость выполнения по сравнению с интерпретацией исходного кода напрямую, обычно примерно на порядок (в 10 раз). [4]
Из-за его преимущества в производительности, сегодня многие реализации языка выполняют программу в два этапа, сначала компилируя исходный код в байт-код, а затем передавая байт-код в виртуальную машину. Существуют виртуальные машины на основе байт-кода такого рода для Java , Raku , Python , PHP , [a] Tcl , mawk и Forth (однако Forth редко компилируется через байт-коды таким образом, и его виртуальная машина вместо этого более общая). Реализации Perl и Ruby 1.8 вместо этого работают, проходя по абстрактному синтаксическому древовидному представлению, полученному из исходного кода.
Совсем недавно авторы V8 [1] и Dart [7] оспорили идею о том, что промежуточный байт-код необходим для быстрой и эффективной реализации VM. Обе эти реализации языка в настоящее время выполняют прямую JIT-компиляцию из исходного кода в машинный код без промежуточного байт-кода. [8]
Примеры
- ActionScript выполняется в ActionScript Virtual Machine (AVM), которая является частью Flash Player и AIR . Код ActionScript обычно преобразуется в формат байт-кода компилятором . Примеры компиляторов включают один, встроенный в Adobe Flash Professional, и один, встроенный в Adobe Flash Builder и доступный в Adobe Flex SDK .
- Объекты Adobe Flash
- BANCStar, изначально байт-код для инструмента создания интерфейса, но также используемый как язык
- Фильтр пакетов Беркли
- ЕБПФ
- Беркли Паскаль [9]
- Библиотека инженерного байт-кода
- Компиляторы виртуальных машин C в Java
- Реализация Common Lisp на языке CLISP долгие годы компилировалась только в байт-код; однако теперь она также поддерживает компиляцию в машинный код с помощью GNU Lightning.
- Реализации Common Lisp в CMUCL и Scieneer Common Lisp могут компилироваться либо в машинный код, либо в байт-код, который гораздо компактнее.
- Common Intermediate Language, выполняемый Common Language Runtime , используемый языками .NET , такими как C#
- Байт-код Dalvik , разработанный для платформы Android , выполняется виртуальной машиной Dalvik.
- Байт-код Dis, разработанный для Inferno (операционная система) , выполняется виртуальной машиной Dis
- EiffelStudio для языка программирования Eiffel
- EM, виртуальная машина Amsterdam Compiler Kit, используемая как промежуточный язык компиляции и как современный язык байт-кода
- Emacs — текстовый редактор, большинство функций которого реализовано с помощью Emacs Lisp , встроенного диалекта Lisp . Эти функции компилируются в байт-код. Такая архитектура позволяет пользователям настраивать редактор с помощью языка высокого уровня, который после компиляции в байт-код обеспечивает приемлемую производительность.
- Встраиваемая реализация Common Lisp может компилироваться в байт-код или код C
- Common Lisp предоставляет
disassemble
функцию [10] , которая выводит на стандартный вывод базовый код указанной функции. Результат зависит от реализации и может быть разрешен или не разрешен в байт-код. Его проверка может использоваться для отладки и оптимизации. [11] Steel Bank Common Lisp , например, выдает:
( дизассемблировать ' ( lambda ( x ) ( print x ))) ; дизассемблирование для (LAMBDA (X)) ; 2436F6DF: 850500000F22 TEST EAX, [#x220F0000] ; точка входа без аргументов для анализа ; E5: 8BD6 MOV EDX, ESI ; E7: 8B05A8F63624 MOV EAX, [#x2436F6A8] ; #<объект FDEFINITION для PRINT> ; ED: B904000000 MOV ECX, 4 ; F2: FF7504 PUSH DWORD PTR [EBP+4] ; F5: FF6005 JMP DWORD PTR [EAX+5] ; F8: CC0A BREAK 10 ; ловушка ошибки ; FA: 02 БАЙТ #X02 ; FB: 18 БАЙТ #X18 ; НЕВЕРНЫЙ-АРГ-СЧЕТЧИК-ОШИБКА ; FC: 4F БАЙТ #X4F ; ECX
- Реализация Erlang от Ericsson использует байт-коды BEAM
- Виртуальная машина Ethereum (EVM) — это среда выполнения, использующая собственный байт-код для выполнения транзакций в Ethereum (смарт-контракты).
- Языки программирования Icon [12] и Unicon [13]
- Компания Infocom использовала Z-машину , чтобы сделать свои программные приложения более портативными.
- Байт-код Java , который выполняется виртуальной машиной Java
- Байт-код Keiko, используемый языком программирования Oberon-2 для того, чтобы сделать его и операционную систему Oberon более переносимыми.
- KEYB , драйвер клавиатуры MS-DOS / PC DOS с файлом ресурсов KEYBOARD.SYS, содержащим информацию о раскладке и короткие последовательности p-кодов, выполняемые интерпретатором внутри резидентного драйвера. [14] [15]
- LLVM ИК
- LSL, скриптовый язык, используемый в виртуальных мирах, компилируется в байт-код, работающий на виртуальной машине. В Second Life есть оригинальная версия Mono, Inworldz разработала версию Phlox.
- Язык Lua использует виртуальную машину байт-кода на основе регистров.
- m-код языка MATLAB [ 16]
- Malbolge — это эзотерический машинный язык для троичной виртуальной машины.
- Microsoft P-код, используемый в Visual C++ и Visual Basic
- Мультиплан [17]
- O-код языка программирования BCPL
- Язык OCaml опционально компилируется в компактную форму байт-кода
- p-код UCSD Pascal реализация языка Pascal
- Виртуальная машина Parrot
- Pick BASIC также называется Data BASIC или MultiValue BASIC
- Среда R для статистических вычислений предлагает компилятор байт-кода через пакет компилятора, который теперь является стандартным с версией R 2.13.0. Можно скомпилировать эту версию R так, чтобы базовые и рекомендуемые пакеты использовали это. [18]
- Пирамида 2000 приключенческая игра
- Скрипты Python компилируются при выполнении в байт-код языка Python, а скомпилированные файлы (.pyc) кэшируются внутри папки скрипта.
- Скомпилированный код можно анализировать и исследовать с помощью встроенного инструмента для отладки низкоуровневого байт-кода. Инструмент можно инициализировать из оболочки, например:
>>> import dis # "dis" - Дизассемблер байт-кода Python в мнемонические символы. >>> dis . dis ( 'print("Hello, World!")' ) 1 0 LOAD_NAME 0 (print) 2 LOAD_CONST 0 ('Hello, World!') 4 CALL_FUNCTION 1 6 RETURN_VALUE
Смотрите также
Найдите байт-код в Викисловаре, бесплатном словаре.
Примечания
- ^ PHP имеет компиляцию just-in-time в PHP 8, [5] [6] и более ранних версиях, хотя и не включена в версию по умолчанию, имела такие опции, как HHVM . Для более старых версий PHP: Хотя коды операций PHP генерируются каждый раз при запуске программы и всегда интерпретируются, а не компилируются just-in-time .
Ссылки
- ^ ab "Dynamic Machine Code Generation". Google Inc. Архивировано из оригинала 2017-03-05 . Получено 2023-02-21 .
{{cite web}}
: CS1 maint: bot: original URL status unknown (link) - ^ «Реализация Lua 5.0».(Примечание. Здесь задействована виртуальная машина на основе регистров.)
- ^ "Dalvik VM". Архивировано из оригинала 2013-05-18 . Получено 2012-10-29 .(Примечание. Эта виртуальная машина основана на регистрах.)
- ^ "Байт-код против машинного кода". www.allaboutcomputing.net . Получено 2017-10-23 .
- ^ О'Финни, Мэтью Вейер. «Изучение нового PHP JIT-компилятора». Zend by Perforce . Получено 19.02.2021 .
- ^ "PHP 8: JIT - stitcher.io". stitcher.io . Получено 2021-02-19 .
- ^ Лойч, Флориан. "Почему не байткодовая виртуальная машина?". Google . Архивировано из оригинала 2013-05-12.
- ^ «Миф о JavaScript: JavaScript нуждается в стандартном байт-коде». 2ality.com .
- ^ G., Adam Y. (2022-07-11). "Berkeley Pascal". GitHub . Получено 2022-01-08 .
- ^ "CLHS: Функция DISASSEMBLE". www.lispworks.com .
- ^ "Настройка производительности и советы". lispcookbook.github.io .
- ^ "Реализация языка программирования иконок" (PDF) . Архивировано из оригинала (PDF) 2016-03-05 . Получено 2011-09-09 .
- ^ "The Implementation of Icon and Unicon a Compendium" (PDF) . Архивировано (PDF) из оригинала 2022-10-09.
- ^ Пол, Маттиас Р. (2001-12-30). "KEYBOARD.SYS внутренняя структура". Группа новостей : comp.os.msdos.programmer. Архивировано из оригинала 2017-09-09 . Получено 2016-09-17 .
[…] Фактически, формат в основном тот же самый в
MS-DOS
3.3 - 8.0,
PC DOS
3.3 - 2000, включая русские, литовские, китайские и японские выпуски, а также в Windows NT, 2000 и XP […]. Есть незначительные различия и несовместимости, но общий формат не менялся на протяжении многих лет. […] Некоторые записи данных содержат обычные таблицы […] Однако большинство записей содержат
исполняемый код
, интерпретируемый каким-либо
интерпретатором p-кода
во *
время выполнения
*, включая условные переходы и тому подобное. Вот почему драйвер
KEYB
занимает такой большой объем памяти по сравнению с табличными драйверами клавиатуры, которые можно реализовать за 3–4 Кб, получив тот же уровень функциональности, за исключением интерпретатора. […]
- ^ Mendelson, Edward (2001-07-20). "Как отобразить евро в MS-DOS и Windows DOS". Отображение символа евро в полноэкранном режиме MS-DOS (включая полноэкранный режим DOS в Windows 95 или Windows 98). Архивировано из оригинала 2016-09-17 . Получено 2016-09-17 .
[…] Маттиас [Р.] Пол […] предупреждает, что версия драйвера клавиатуры
для IBM PC DOS
использует некоторые внутренние процедуры, которые не распознаются драйвером
Microsoft
, поэтому, если возможно, следует использовать
версии
IBM
KEYB.COM
и
KEYBOARD.SYS
вместо смешивания версий Microsoft и IBM […]
(Примечание. Под «процедурами» здесь подразумеваются некоторые дополнительные байт-коды в файле IBM KEYBOARD.SYS, не поддерживаемые версией драйвера KEYB от Microsoft.) - ^ "United States Patent 6,973,644". Архивировано из оригинала 2017-03-05 . Получено 2009-05-21 .
- ^ Microsoft C Pcode Specifications . стр. 13.
Multiplan
не был скомпилирован в
машинный код
, а в своего рода байт-код, который запускался интерпретатором
,
чтобы сделать Multiplan переносимым на широко варьирующееся оборудование того времени. Этот байт-код различал машинно-специфический
формат с плавающей точкой
для вычислений и внешний (стандартный) формат, который был
двоично-десятичным
(BCD). Инструкции PACK и UNPACK преобразовывались между ними.
- ^ "Установка и администрирование R". cran.r-project.org .
- ^ "The SQLite Bytecode Engine". Архивировано из оригинала 2017-04-14 . Получено 2016-08-29 .