Jump to content

Байт-код

(Перенаправлено с P-кода )

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

(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
Скомпилированный код можно анализировать и исследовать с помощью встроенного инструмента отладки низкоуровневого байт-кода. Инструмент можно инициализировать из оболочки, например:
>>> 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

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ реализована компиляция «точно в срок» , В PHP 8 [5] [6] и раньше, хотя он не был включен в версии по умолчанию, были такие опции, как HHVM . Для более старых версий PHP: хотя коды операций PHP генерируются каждый раз при запуске программы и всегда интерпретируются, а не компилируются «точно в срок» .
  1. ^ Перейти обратно: а б «Динамическая генерация машинного кода» . Google Inc. Архивировано из оригинала 05 марта 2017 г. Проверено 21 февраля 2023 г. {{cite web}}: CS1 maint: bot: исходный статус URL неизвестен ( ссылка )
  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 — stackter.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. ^ «Реализация языка программирования Icon» (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 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: eddbfe2c86494b8df253bc369a3e03e0__1722277320
URL1:https://arc.ask3.ru/arc/aa/ed/e0/eddbfe2c86494b8df253bc369a3e03e0.html
Заголовок, (Title) документа по адресу, URL1:
Bytecode - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)