Из Википедии, бесплатной энциклопедии
  (Перенаправлено с байтового кода )
Перейти к навигации Перейти к поиску

Байт-код , также называемый переносимым кодом или p-кодом , представляет собой форму набора команд, разработанную для эффективного выполнения программным интерпретатором . В отличие от исходного кода , доступного для чтения человеком [1] , байт-коды представляют собой компактные числовые коды, константы и ссылки (обычно числовые адреса), которые кодируют результат синтаксического анализа компилятора и выполнения семантического анализа таких вещей, как тип, область действия и глубина вложенности программных объектов.

Байт-код имени происходит от наборов инструкций, которые имеют однобайтовые коды операций, за которыми следуют необязательные параметры. Промежуточные представления, такие как байт-код, могут выводиться реализациями языков программирования для облегчения интерпретации , или они могут использоваться для уменьшения зависимости от оборудования и операционной системы , позволяя одному и тому же коду работать на разных платформах на разных устройствах. Байт-код часто может быть либо непосредственно выполнен на виртуальной машине ( машина p-кода, т. Е. Интерпретатор), либо он может быть дополнительно скомпилирован в машинный код для повышения производительности.

Поскольку инструкции байт-кода обрабатываются программным обеспечением, они могут быть сколь угодно сложными, но, тем не менее, часто похожи на традиционные аппаратные инструкции: машины с виртуальным стеком являются наиболее распространенными, но также были созданы машины с виртуальными регистрами . [2] [3] Различные части часто могут храниться в отдельных файлах, подобно объектным модулям , но динамически загружаться во время выполнения.

Казнь [ править ]

Программа байт-кода может выполняться путем синтаксического анализа и непосредственного выполнения инструкций по одной за раз. Этот вид интерпретатора байт-кода очень портативен. Некоторые системы, называемые динамические переводчики, или просто в срок (JIT) компиляторы, переводить байт - код в машинный код по мере необходимости в режиме исполнения . Это делает виртуальную машину зависимой от оборудования, но не теряет переносимость байт-кода. Например, Java и Smalltalkкод обычно хранится в формате байт-кода, который обычно затем JIT-компилируется для преобразования байт-кода в машинный код перед выполнением. Это вводит задержку перед запуском программы, когда байт-код компилируется в собственный машинный код, но значительно увеличивает скорость выполнения по сравнению с интерпретацией исходного кода напрямую, обычно примерно на порядок (10x). [4]

Из-за преимущества в производительности сегодня многие языковые реализации выполняют программу в два этапа, сначала компилируя исходный код в байт-код, а затем передавая байт-код в виртуальную машину. Такие виртуальные машины на основе байт-кода существуют для Java , Raku , Python , PHP , [a] Tcl , mawk и Forth (однако Forth редко компилируется с помощью байт-кодов таким образом, и его виртуальная машина вместо этого является более общей). Реализация Perl и Ruby 1.8 вместо этого работает путем обхода представления абстрактного синтаксического дерева, полученного из исходного кода.

Совсем недавно авторы V8 [1] и Dart [7] поставили под сомнение представление о том, что промежуточный байт-код необходим для быстрой и эффективной реализации виртуальной машины. Обе эти языковые реализации в настоящее время выполняют прямую JIT-компиляцию из исходного кода в машинный код без промежуточного байт-кода. [8]

Примеры [ править ]

>>> import  dis  # "dis" - Дизассемблер байтового кода Python в мнемонику. >>> дис . dis ( 'print ("Hello, World!")' )  1 0 LOAD_NAME 0 (print)  2 LOAD_CONST 0 ('Hello, World!')  4 CALL_FUNCTION 1  6 RETURN_VALUE
  • ActionScript выполняется на виртуальной машине ActionScript (AVM), которая является частью Flash Player и AIR. Код ActionScript обычно преобразуется компилятором в формат байт-кода . Примеры компиляторов включают один, встроенный в Adobe Flash Professional, и один, встроенный в Adobe Flash Builder, и доступный в Adobe Flex SDK.
  • Объекты Adobe Flash
  • BANCStar , первоначально байт-код для инструмента построения интерфейса, но также используемый как язык
  • Пакетный фильтр Беркли
  • Инженерная библиотека байтового кода
  • Компиляторы виртуальных машин C в Java
  • Реализация CLISP Common Lisp много лет использовалась для компиляции только в байт-код; однако теперь он также поддерживает компиляцию в собственный код с помощью GNU lightning.
  • CMUCL и Scieneer Common Lisp реализаций Common Lisp может составить либо в машинный код или байт - код, который является гораздо более компактным
  • Common Intermediate Language, выполняемый Common Language Runtime , используемый языками .NET Framework, такими как C #
  • Байт-код Dalvik, разработанный для платформы Android , выполняется виртуальной машиной Dalvik.
  • Байт-код Dis, разработанный для Inferno (операционная система) , выполняется виртуальной машиной Dis
  • EiffelStudio для языка программирования Eiffel
  • EM, виртуальная машина Amsterdam Compiler Kit, используемая как промежуточный язык компиляции и как современный язык байт-кода.
  • Emacs - это текстовый редактор, большинство функций которого реализовано Emacs Lisp , его встроенным диалектом Lisp . Эти функции скомпилированы в байт-код. Эта архитектура позволяет пользователям настраивать редактор с использованием языка высокого уровня, который после компиляции в байт-код дает разумную производительность.
  • Встраиваемая реализация Common Lisp Common Lisp может компилироваться в байт-код или код C
  • Реализация Erlang от Ericsson использует байт-коды BEAM
  • Языки программирования Icon [9] и Unicon [10]
  • Компания Infocom использовала Z-машину, чтобы сделать свои программные приложения более портативными
  • Байт-код Java , который выполняется виртуальной машиной Java.
    • КАК М
    • BCEL
    • Javassist
    • JMangler
  • KEYB , драйвер клавиатуры MS-DOS / PC DOS с файлом ресурсов KEYBOARD.SYS, содержащим информацию о макете и короткие последовательности p-кода , выполняемые интерпретатором внутри резидентного драйвера. [11] [12]
  • LSL, язык сценариев, используемый в виртуальных мирах, компилируется в байт-код, выполняемый на виртуальной машине. Second Life имеет оригинальную версию Mono, Inworldz разработал версию Phlox.
  • В языке Lua используется виртуальная машина с байт-кодом на основе регистров.
  • м-код MATLAB языка [13]
  • Мультиплан [14]
  • O-код на BCPL языке программирования
  • Язык OCaml дополнительно компилируется в компактную форму байт-кода
  • р-код из UCSD Pascal реализации Паскаля языка
  • Виртуальная машина Parrot
  • Выберите BASIC, также называемый Data BASIC или MultiValue BASIC.
  • Среда R для статистических вычислений предлагает компилятор байт-кода через пакет компилятора, который теперь является стандартным для R версии 2.13.0. Эту версию R можно скомпилировать, чтобы использовать ее в базовых и рекомендуемых пакетах. [15]
  • Пирамида 2000 приключенческая игра
  • Схема 48 реализация схемы с использованием интерпретатора байт-кода
  • Байт - многих реализаций Smalltalk языка
  • Спин переводчик , встроенный в Parallax Propeller микроконтроллера
  • SQLite движок базы данных переводит SQL заявления в формате заказных байт-кода. [16]
  • СЛАДКИЕ 16
  • Tcl
  • Tiny BASIC
  • Visual FoxPro компилируется в байт-код
  • WebAssembly
  • YARV и Rubinius для Ruby

См. Также [ править ]

  • Система выполнения
  • ZCODE

Заметки [ править ]

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

Ссылки [ править ]

  1. ^ a b «Генерация динамического машинного кода» . Google .
  2. ^ «Реализация Lua 5.0» . (NB. Это касается виртуальной машины на основе регистров.)
  3. ^ "Дальвик В.М." . Архивировано из оригинала на 2013-05-18 . Проверено 29 октября 2012 . (NB. Эта виртуальная машина основана на регистре.)
  4. ^ «Байт-код против машинного кода» . www.allaboutcomputing.net . Проверено 23 октября 2017 .
  5. ^ О'Финни, Мэтью Вейер. «Изучение нового компилятора PHP JIT» . Zend от Perforce . Источник 2021-02-19 .
  6. ^ «PHP 8: JIT - stitcher.io» . stitcher.io . Источник 2021-02-19 .
  7. ^ Loitsch, Флориан. "Почему не виртуальная машина с байт-кодом?" . Google . Архивировано из оригинала на 2013-05-12.
  8. ^ «Миф о JavaScript: JavaScript нужен стандартный байт-код» . 2ality.com .
  9. ^ "Реализация языка программирования иконок" (PDF) . Архивировано из оригинального (PDF) 05 марта 2016 года . Проверено 9 сентября 2011 .
  10. ^ «Реализация Icon и Unicon a Compendium» (PDF) .
  11. ^ Пол, Матиас Р. (2001-12-30). "Внутренняя структура 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 Кбайта с тем же уровнем функций, за исключением интерпретатора. […]
  12. ^ Мендельсон, Эдвард (2001-07-20). «Как отобразить евро в MS-DOS и Windows DOS» . Отображение символа евро в полноэкранном режиме MS-DOS (включая полноэкранный режим DOS в Windows 95 или Windows 98). Архивировано 17 сентября 2016 года . Проверено 17 сентября 2016 . [...] Matthias [Р.] Пол [...] предупреждает , что IBM PC DOS версии драйвера клавиатуры использует некоторые внутренние процедуры, которые не распознаются в Microsoft драйвера, поэтому, если это возможно, следует использовать IBM версии обоих KEYB .COM и KEYBOARD.SYS вместо смешивания версий Microsoft и IBM […] (NB. Под «процедурами» понимаются некоторые дополнительные байт-коды в файле IBM KEYBOARD.SYS, не поддерживаемые версией Microsoft драйвера KEYB.)
  13. ^ "Патент США 6,973,644" .
  14. ^ Спецификации Microsoft C Pcode . п. 13. Multiplan был скомпилирован не в машинный код , а в своего рода байт-код, который запускался интерпретатором , чтобы сделать Multiplan переносимым на самые разные аппаратные средства того времени. Этот байт-код различает машинно- зависимый формат с плавающей запятой для вычисления и внешний (стандартный) формат, представляющий собой десятичный двоичный код (BCD). Инструкции PACK и UNPACK преобразуются между ними.
  15. ^ «Установка и администрирование R» . cran.r-project.org .
  16. ^ "Механизм байт-кода SQLite" . Архивировано из оригинала на 2017-04-14 . Проверено 29 августа 2016 .