Форма набора команд, предназначенная для запуска программным интерпретатором.
Байт-код (также называемый переносимым кодом или p-кодом ) — это форма набора команд , предназначенная для эффективного выполнения программным интерпретатором . В отличие от исходного кода , читаемого человеком [1] , байт-коды представляют собой компактные числовые коды, константы и ссылки (обычно числовые адреса), которые кодируют результат синтаксического анализа компилятора и выполнения семантического анализа таких вещей, как тип, область действия и глубина вложенности программных объектов.
Название «байт-код» происходит от наборов команд, в которых за однобайтовыми кодами операций следуют необязательные параметры. Промежуточные представления, такие как байт-код, могут выводиться реализациями языка программирования для облегчения интерпретации или могут использоваться для уменьшения зависимости от оборудования и операционной системы , позволяя одному и тому же коду выполняться кроссплатформенно на разных устройствах. Байт-код часто может быть либо непосредственно выполнен на виртуальной машине ( машине с p-кодом , т. е. интерпретаторе), либо может быть дополнительно скомпилирован в машинный код для повышения производительности.
Поскольку инструкции байт-кода обрабатываются программным обеспечением, они могут быть сколь угодно сложными, но, тем не менее, часто похожи на традиционные аппаратные инструкции: машины с виртуальным стеком являются наиболее распространенными, но были построены и машины с виртуальными регистрами . [2] [3] Различные части часто могут храниться в отдельных файлах, подобно объектным модулям , но динамически загружаются во время выполнения.
Исполнение
Программа с байт-кодом может быть выполнена путем анализа и непосредственного выполнения инструкций по одной. Этот вид интерпретатора байт-кода очень портативен. Некоторые системы, называемые динамическими трансляторами или JIT- компиляторами , при необходимости транслируют байт-код в машинный код во время выполнения . Это делает виртуальную машину аппаратно-зависимой, но не теряет переносимости байт-кода. Например, код Java и Smalltalk обычно хранится в формате байт-кода, который обычно затем JIT-компилируется для преобразования байт-кода в машинный код перед выполнением. Это приводит к задержке перед запуском программы, когда байт-код компилируется в машинный код, но значительно повышает скорость выполнения по сравнению с непосредственной интерпретацией исходного кода, обычно примерно на порядок (в 10 раз). [4]
Из-за преимущества в производительности сегодня многие реализации языков выполняют программу в два этапа: сначала компилируют исходный код в байт-код, а затем передают байт-код виртуальной машине. Существуют виртуальные машины такого типа на основе байт-кода для Java , Raku , Python , PHP , [a] Tcl , mawk и Forth (однако Forth редко компилируется с помощью байт-кодов таким способом, и вместо этого его виртуальная машина более универсальна). Вместо этого реализация Perl и Ruby 1.8 работает путем обхода представления абстрактного синтаксического дерева , полученного из исходного кода.
Совсем недавно авторы V8 [1] и Dart [7] поставили под сомнение представление о том, что для быстрой и эффективной реализации виртуальной машины необходим промежуточный байт-код. Обе эти реализации языка в настоящее время выполняют прямую JIT-компиляцию из исходного кода в машинный код без посредника в виде байт-кода. [8]
Примеры
- ActionScript выполняется на виртуальной машине ActionScript (AVM), которая является частью Flash Player и AIR . Код ActionScript обычно преобразуется в формат байт-кода компилятором . Примеры компиляторов включают один, встроенный в Adobe Flash Professional, и один, встроенный в Adobe Flash Builder и доступный в Adobe Flex SDK .
- Объекты Adobe Flash
- BANCStar , первоначально байт-код для инструмента создания интерфейса, но также использовался в качестве языка.
- Фильтр пакетов Беркли
- Беркли Паскаль [9]
- Инженерная библиотека байт-кода
- Компиляторы виртуальных машин C в Java
- CLISP- реализация Common Lisp , используемая для компиляции только в байт-код в течение многих лет; однако теперь он также поддерживает компиляцию в собственный код с помощью GNU Lightning.
- Реализации Common Lisp в CMUCL и Scieneer могут компилироваться либо в собственный код, либо в байт-код, что гораздо более компактно.
- 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 Common Lisp может компилироваться в байт-код или код C.
- Common Lisp предоставляет
disassemble
функцию [10] , которая выводит на стандартный вывод базовый код указанной функции. Результат зависит от реализации и может разрешаться или не разрешаться в байт-код. Его проверку можно использовать в целях отладки и оптимизации. [11] Steel Bank Common Lisp , например, производит:
( дизассемблировать ' ( лямбда ( x ) ( напечатать x ))) ; разборка для (LAMBDA(X) ; 2436F6DF: 850500000F22 ТЕСТ EAX, [#x220F0000] ; точка входа для анализа без аргументов ; E5: 8BD6 MOV EDX, ESI ; E7: 8B05A8F63624 MOV EAX, [#x2436F6A8] ; #<объект FDEFINITION для PRINT> ; ЭД: B904000000 MOV ECX, 4 ; F2: FF7504 НАЖМИТЕ DWORD PTR [EBP+4] ; F5: FF6005 JMP DWORD PTR [EAX+5] ; F8: CC0A ПЕРЕРЫВ 10 ; ловушка ошибок ; FA: 02 БАЙТ #X02 ; ФБ: 18 БАЙТ #X18 ; НЕВЕРНЫЙ-АРГ-ОШИБКА-СЧЕТА ; FC: 4F БАЙТ #X4F ; ЭКХ
- Реализация Erlang от Ericsson использует байт-коды BEAM.
- Виртуальная машина Ethereum (EVM) — это среда выполнения, использующая собственный байт-код для выполнения транзакций в Ethereum (смарт-контракты).
- Языки программирования Icon [12] и Unicon [13]
- Компания Infocom использовала Z-машину , чтобы сделать свои программные приложения более портативными.
- Байт-код Java , который выполняется виртуальной машиной Java.
- Байт-код Keiko , используемый языком программирования Оберон-2 , чтобы сделать его и операционную систему Оберон более переносимыми.
- KEYB , драйвер клавиатуры MS-DOS / PC DOS с файлом ресурсов KEYBOARD.SYS , содержащим информацию о раскладке и короткие последовательности p-кода , выполняемые интерпретатором внутри резидентного драйвера. [14] [15]
- ЛЛВМ ИК
- LSL, язык сценариев, используемый в виртуальных мирах, компилируется в байт-код, выполняемый на виртуальной машине. У Second Life есть оригинальная версия Mono, Inworldz разработала версию Phlox.
- Язык Lua использует виртуальную машину с байт-кодом на основе регистров.
- m-код языка MATLAB [ 16]
- Malbolge — это эзотерический машинный язык для троичной виртуальной машины.
- Microsoft P-код , используемый в Visual C++ и Visual Basic.
- Мультиплан [17]
- O-код языка программирования BCPL
- Язык OCaml опционально компилируется в компактную форму байт-кода.
- p-код реализации UCSD Pascal языка Паскаль
- Виртуальная машина Попугая
- Выберите BASIC, также называемый Data BASIC или MultiValue BASIC.
- Среда R для статистических вычислений предлагает компилятор байт-кода через пакет компилятора, который теперь является стандартным для R версии 2.13.0. Эту версию R можно скомпилировать так, чтобы базовый и рекомендуемый пакеты использовали это. [18]
- Приключенческая игра «Пирамида 2000»
- Сценарии Python при выполнении компилируются в язык байт-кода Python, а скомпилированные файлы (.pyc) кэшируются внутри папки сценария.
- Скомпилированный код можно анализировать и исследовать с помощью встроенного инструмента отладки низкоуровневого байт-кода. Инструмент можно инициализировать из оболочки, например:
>>> import dis # "dis" - Дизассемблер байт-кода Python в мнемонику. >>> дис . dis ( 'print("Привет, мир!")' ) 1 0 LOAD_NAME 0 (печать) 2 LOAD_CONST 0 ("Привет, мир!") 4 CALL_FUNCTION 1 6 RETURN_VALUE
Смотрите также
Найдите байт-код в Викисловаре, бесплатном словаре.
Примечания
- ^ PHP имеет JIT-компиляцию в PHP 8, [5] [6] , а раньше, хотя она не была включена в версии по умолчанию, были такие опции, как HHVM . Для более старых версий PHP: хотя коды операций PHP генерируются каждый раз при запуске программы и всегда интерпретируются, а не компилируются «точно в срок» .
Рекомендации
- ^ ab «Динамическая генерация машинного кода». Google Inc. Архивировано из оригинала 05 марта 2017 г. Проверено 21 февраля 2023 г.
{{cite web}}
: CS1 maint: bot: original URL status unknown (link) - ^ «Реализация Lua 5.0».(Примечание. Здесь используется виртуальная машина на основе регистров.)
- ^ "Далвик ВМ". Архивировано из оригинала 18 мая 2013 г. Проверено 29 октября 2012 г.(Примечание. Эта виртуальная машина основана на регистрах.)
- ^ «Байт-код против машинного кода» . www.allaboutcomputing.net . Проверено 23 октября 2017 г.
- ^ О'Финни, Мэтью Вейер. «Изучение нового JIT-компилятора PHP». Зенд от Perforce . Проверено 19 февраля 2021 г.
- ^ "PHP 8: JIT - stacker.io" . шитье.io . Проверено 19 февраля 2021 г.
- ^ Лойч, Флориан. «Почему не виртуальная машина с байт-кодом?». Google . Архивировано из оригинала 12 мая 2013 г.
- ^ «Миф о JavaScript: JavaScript нужен стандартный байт-код» . 2ality.com .
- ^ Г., Адам Ю. (11 июля 2022 г.). «Беркли Паскаль». Гитхаб . Проверено 8 января 2022 г.
- ^ «CLHS: Функция РАЗБОРКА» . www.lispworks.com .
- ^ «Настройка производительности и советы». lispookbook.github.io .
- ^ «Реализация языка программирования значков» (PDF) . Архивировано из оригинала (PDF) 5 марта 2016 г. Проверено 9 сентября 2011 г.
- ^ «Реализация Icon и Unicon в сборнике» (PDF) . Архивировано (PDF) из оригинала 9 октября 2022 г.
- ^ Пол, Матиас Р. (30 декабря 2001 г.). «Внутренняя структура 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 КБ, получая тот же уровень функций, за исключением интерпретатора.
[…]
- ^ Мендельсон, Эдвард (20 июля 2001 г.). «Как отобразить евро в MS-DOS и Windows DOS». Отображение символа евро в полноэкранном режиме MS-DOS (включая полноэкранный режим DOS в Windows 95 или Windows 98). Архивировано из оригинала 17 сентября 2016 г. Проверено 17 сентября 2016 г.
[…] Маттиас [Р.] Пол […] предупреждает, что
версия драйвера клавиатуры для
IBM PC DOS использует некоторые внутренние процедуры, которые не распознаются драйвером
Microsoft
, поэтому, если возможно, вам следует использовать версии
IBM
для обеих
клавиш KEYB .
.COM
и
KEYBOARD.SYS
вместо смешивания версий Microsoft и IBM […]
(Примечание. Под «процедурами» здесь понимаются некоторые дополнительные байт-коды в файле IBM KEYBOARD.SYS, которые не поддерживаются версией драйвера KEYB от Microsoft.) - ^ «Патент США 6 973 644» . Архивировано из оригинала 5 марта 2017 г. Проверено 21 мая 2009 г.
- ^ Спецификации Microsoft C Pcode . п. 13.
Multiplan
был скомпилирован не в
машинный код
, а в своего рода байт-код, который запускался интерпретатором
,
чтобы сделать Multiplan переносимым на самое разнообразное оборудование того времени.
Этот байт-код отличает машинный
формат с плавающей запятой
для вычислений и внешний (стандартный) формат, который представляет собой
двоично-десятичный формат
(BCD).
Инструкции PACK и UNPACK преобразуются между ними.
- ^ «Установка и администрирование R» . cran.r-project.org .
- ^ «Обработчик байт-кода SQLite». Архивировано из оригинала 14 апреля 2017 г. Проверено 29 августа 2016 г.