Байт-код
Эта статья нуждается в дополнительных цитатах для проверки . ( январь 2009 г. ) |
Выполнение программы |
---|
Общие понятия |
Типы кода |
Стратегии составления |
Известное время выполнения |
|
Известные компиляторы и наборы инструментов |
|
Байт-код (также называемый переносимым кодом или p-кодом ) — это форма набора команд, предназначенная для эффективного выполнения программным интерпретатором . В отличие от человекочитаемого [1] исходный код , байт-коды — это компактные числовые коды, константы и ссылки (обычно числовые адреса), которые кодируют результат синтаксического анализа компилятора и выполнения семантического анализа таких вещей, как тип, область действия и глубина вложенности программных объектов.
Название «байт-код» происходит от наборов команд, в которых за однобайтовыми кодами операций следуют необязательные параметры. Промежуточные представления, такие как байт-код, могут выводиться реализациями языка программирования для облегчения интерпретации или могут использоваться для уменьшения зависимости от оборудования и операционной системы , позволяя одному и тому же коду выполняться кроссплатформенно на разных устройствах. Байт-код часто может быть либо непосредственно выполнен на виртуальной машине ( машине с p-кодом , т. е. интерпретаторе), либо может быть дополнительно скомпилирован в машинный код для повышения производительности.
Поскольку инструкции байт-кода обрабатываются программным обеспечением, они могут быть сколь угодно сложными, но, тем не менее, часто похожи на традиционные аппаратные инструкции: машины с виртуальным стеком являются наиболее распространенными, но машины с виртуальными регистрами . также были построены [2] [3] Различные части часто могут храниться в отдельных файлах, подобно объектным модулям , но динамически загружаться во время выполнения.
Исполнение
[ редактировать ]Программа с байт-кодом может быть выполнена путем анализа и непосредственного выполнения инструкций по одной. Этот вид интерпретатора байт-кода очень портативен. Некоторые системы, называемые динамическими трансляторами или транслируют JIT-компиляторами, байт-код в машинный код при необходимости во время выполнения . Это делает виртуальную машину аппаратно-зависимой, но не теряет переносимости байт-кода. Например, код Java и Smalltalk обычно хранится в формате байт-кода, который затем обычно компилируется JIT для перевода байт-кода в машинный код перед выполнением. Это приводит к задержке перед запуском программы, когда байт-код компилируется в машинный код, но значительно повышает скорость выполнения по сравнению с непосредственной интерпретацией исходного кода, обычно примерно на порядок (в 10 раз). [4]
Из-за преимущества в производительности сегодня многие реализации языков выполняют программу в два этапа: сначала компилируют исходный код в байт-код, а затем передают байт-код виртуальной машине. Существуют виртуальные машины на основе байт-кода для Java , Raku , Python , PHP , [а] Tcl , mawk и Forth (однако Forth редко компилируется с помощью байт-кодов таким способом, а вместо этого его виртуальная машина более универсальна). Вместо этого реализация Perl и Ruby 1.8 работает путем обхода представления абстрактного синтаксического дерева, полученного из исходного кода.
Совсем недавно авторы V8 [1] и Дарт [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.
- Lisp в CMUCL и Scieneer Реализации Common могут компилироваться либо в собственный код, либо в байт-код, что гораздо более компактно.
- 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 , например, производит:
(disassemble '(lambda (x) (print x))) ; disassembly for (LAMBDA (X)) ; 2436F6DF: 850500000F22 TEST EAX, [#x220F0000] ; no-arg-parsing entry point ; E5: 8BD6 MOV EDX, ESI ; E7: 8B05A8F63624 MOV EAX, [#x2436F6A8] ; #<FDEFINITION object for PRINT> ; ED: B904000000 MOV ECX, 4 ; F2: FF7504 PUSH DWORD PTR [EBP+4] ; F5: FF6005 JMP DWORD PTR [EAX+5] ; F8: CC0A BREAK 10 ; error trap ; FA: 02 BYTE #X02 ; FB: 18 BYTE #X18 ; INVALID-ARG-COUNT-ERROR ; FC: 4F BYTE #X4F ; ECX
- от Ericsson Реализация Erlang использует байт-коды BEAM.
- Виртуальная машина Ethereum (EVM) — это среда выполнения, использующая собственный байт-код для выполнения транзакций в Ethereum (смарт-контракты).
- Икона [12] и Юникон [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-код реализации Pascal UCSD Паскаль языка
- Виртуальная машина Попугая
- Выберите BASIC, также называемый Data BASIC или MultiValue BASIC.
- Среда R для статистических вычислений предлагает компилятор байт-кода через пакет компилятора, который теперь является стандартным для R версии 2.13.0. Эту версию R можно скомпилировать так, чтобы базовый и рекомендуемый пакеты использовали это. [18]
- «Пирамида 2000» Приключенческая игра
- Сценарии Python при выполнении компилируются в язык байт-кода Python, а скомпилированные файлы (.pyc) кэшируются внутри папки сценария.
- Скомпилированный код можно анализировать и исследовать с помощью встроенного инструмента отладки низкоуровневого байт-кода. Инструмент можно инициализировать из оболочки, например:
>>> import dis # "dis" - Disassembler of Python byte code into mnemonics. >>> dis.dis('print("Hello, World!")') 1 0 LOAD_NAME 0 (print) 2 LOAD_CONST 0 ('Hello, World!') 4 CALL_FUNCTION 1 6 RETURN_VALUE
- Схема 48. Реализация Scheme с использованием интерпретатора байт-кода.
- Байт-коды многих реализаций Smalltalk . языка
- Интерпретатор Spin, встроенный в Parallax Propeller . микроконтроллер
- преобразует Ядро базы данных SQLite операторы SQL в специальный формат байт-кода. [19]
- Яблоко СВИТ16
- Ткл
- TIMI используется компиляторами на платформе IBM i .
- Крошечный БЕЙСИК
- Visual FoxPro компилируется в байт-код
- Веб-сборка
- YARV и Рубиниус для Ruby
- Z-КОД
- Коды операций Zend Engine для PHP
См. также
[ редактировать ]Примечания
[ редактировать ]- ^ реализована компиляция «точно в срок» , В PHP 8 [5] [6] и раньше, хотя он не был включен в версии по умолчанию, были такие опции, как HHVM . Для более старых версий PHP: хотя коды операций PHP генерируются каждый раз при запуске программы и всегда интерпретируются, а не компилируются «точно в срок» .
Ссылки
[ редактировать ]- ^ Перейти обратно: а б «Динамическая генерация машинного кода» . Google Inc. Архивировано из оригинала 05 марта 2017 г. Проверено 21 февраля 2023 г.
{{cite web}}
: CS1 maint: bot: исходный статус URL неизвестен ( ссылка ) - ^ «Реализация Lua 5.0» . (Примечание. Здесь используется виртуальная машина на основе регистров.)
- ^ «Дальвик ВМ» . Архивировано из оригинала 18 мая 2013 г. Проверено 29 октября 2012 г. (Примечание. Эта виртуальная машина основана на регистрах.)
- ^ «Байт-код против машинного кода» . www.allaboutcomputing.net . Проверено 23 октября 2017 г.
- ^ О'Финни, Мэтью Вейер. «Изучение нового JIT-компилятора PHP» . Зенд от Perforce . Проверено 19 февраля 2021 г.
- ^ «PHP 8: JIT — stackter.io» . шитье.io . Проверено 19 февраля 2021 г.
- ^ Лойч, Флориан. «Почему не виртуальная машина с байт-кодом?» . Google . Архивировано из оригинала 12 мая 2013 г.
- ^ «Миф о JavaScript: JavaScript нуждается в стандартном байт-коде» . 2ality.com .
- ^ Г., Адам Ю. (11 июля 2022 г.). «Беркли Паскаль» . Гитхаб . Проверено 8 января 2022 г.
- ^ «CLHS: Функция РАЗБОРКА» . www.lispworks.com .
- ^ «Настройка производительности и советы» . lispookbook.github.io .
- ^ «Реализация языка программирования Icon» (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 г.