stringtranslate.com

Байт-код

Байт-код (также называемый переносимым кодом или 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]

Примеры

( дизассемблировать ' ( лямбда ( 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 ; ЭКХ    
Скомпилированный код можно анализировать и исследовать с помощью встроенного инструмента отладки низкоуровневого байт-кода. Инструмент можно инициализировать из оболочки, например:
>>> import  dis  # "dis" - Дизассемблер байт-кода Python в мнемонику. >>> дис . dis ( 'print("Привет, мир!")' )  1 0 LOAD_NAME 0 (печать)  2 LOAD_CONST 0 ("Привет, мир!")  4 CALL_FUNCTION 1  6 RETURN_VALUE

Смотрите также

Примечания

  1. ^ PHP имеет JIT-компиляцию в PHP 8, [5] [6] , а раньше, хотя она не была включена в версии по умолчанию, были такие опции, как HHVM . Для более старых версий PHP: хотя коды операций PHP генерируются каждый раз при запуске программы и всегда интерпретируются, а не компилируются «точно в срок» .

Рекомендации

  1. ^ ab «Динамическая генерация машинного кода». Google Inc. Архивировано из оригинала 05 марта 2017 г. Проверено 21 февраля 2023 г.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  2. ^ «Реализация Lua 5.0».(Примечание. Здесь используется виртуальная машина на основе регистров.)
  3. ^ "Далвик ВМ". Архивировано из оригинала 18 мая 2013 г. Проверено 29 октября 2012 г.(Примечание. Эта виртуальная машина основана на регистрах.)
  4. ^ «Байт-код против машинного кода» . www.allaboutcomputing.net . Проверено 23 октября 2017 г.
  5. ^ О'Финни, Мэтью Вейер. «Изучение нового JIT-компилятора PHP». Зенд от Perforce . Проверено 19 февраля 2021 г.
  6. ^ "PHP 8: JIT - stacker.io" . шитье.io . Проверено 19 февраля 2021 г.
  7. ^ Лойч, Флориан. «Почему не виртуальная машина с байт-кодом?». Google . Архивировано из оригинала 12 мая 2013 г.
  8. ^ «Миф о JavaScript: JavaScript нужен стандартный байт-код» . 2ality.com .
  9. ^ Г., Адам Ю. (11 июля 2022 г.). «Беркли Паскаль». Гитхаб . Проверено 8 января 2022 г.
  10. ^ «CLHS: Функция РАЗБОРКА» . www.lispworks.com .
  11. ^ «Настройка производительности и советы». lispookbook.github.io .
  12. ^ «Реализация языка программирования значков» (PDF) . Архивировано из оригинала (PDF) 5 марта 2016 г. Проверено 9 сентября 2011 г.
  13. ^ «Реализация Icon и Unicon в сборнике» (PDF) . Архивировано (PDF) из оригинала 9 октября 2022 г.
  14. ^ Пол, Матиас Р. (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 КБ, получая тот же уровень функций, за исключением интерпретатора. […]
  15. ^ Мендельсон, Эдвард (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.)
  16. ^ «Патент США 6 973 644» . Архивировано из оригинала 5 марта 2017 г. Проверено 21 мая 2009 г.
  17. ^ Спецификации Microsoft C Pcode . п. 13. Multiplan был скомпилирован не в машинный код , а в своего рода байт-код, который запускался интерпретатором , чтобы сделать Multiplan переносимым на самое разнообразное оборудование того времени. Этот байт-код отличает машинный формат с плавающей запятой для вычислений и внешний (стандартный) формат, который представляет собой двоично-десятичный формат (BCD). Инструкции PACK и UNPACK преобразуются между ними.
  18. ^ «Установка и администрирование R» . cran.r-project.org .
  19. ^ «Обработчик байт-кода SQLite». Архивировано из оригинала 14 апреля 2017 г. Проверено 29 августа 2016 г.