Бајт-код

(преусмерено са Бајткод)

Бајт-код, познат и под именом p-код (преносиви код) је врста скупа инструкција намењених за ефикасније извршење операција софтверског интерпретатора. За разлику од изворних кодова које људи могу да читају, бајт-код чини скуп нумеричких кодова, константи и референци (углавном су то нумеричке адресе) који шифрирају резултате рашчлањавања и семантичких анализа ствари попут типа, области дејства, као и потпрограма постојећих програма. Они омогућавају много боље преформансе од директне интерпретације изворног кода.

Назив бајт-код потиче од сета инструкција који садржи оперативни бајт у којем су постављени разноврсни параметри. Бајт-код се у програмском језику може користити да би се упростила интерпретација, или да би се смањила зависност хардвера или оперативног система омогућавајући истом коду да може да се покрене на различитим платформама. Бајт-код често може или да обавља улогу виртуалне машине (интерпретатора) или да се убаци у машински код ради бољих перформанси.

Пошто се инструкције бајт-кода технолошки обрађују кроз софтвер, могу бити комплексни, и поред тога свакако захтевају традиционалне инструкције хардвера; виртуалне стек машине су врло честе, мада су изграђене и виртуалне машине регистрацију података.[1][2] Слично као и код објектних датотека, одређени делови кода се смештају у различите фајлове, али се заједно активирају приликом извршавања операција.

Извршавање

Бајт-код програм може да се изврши рашчлањивањем записа и директним извршење инструкција, једну по једну. Оваква врста бајт-код интерпретатора је веома преносива. Неки системи, звани динамички преводиоци, или "just-in-time"(ЈИТ) преводиоци, преводе бајт-код у машински језик кад год је то потребно у рантајму: ово помаже виртуалној машини да побољша хардвер, а да се при томе преносивост бајт-кода не губи. На пример, Јава и Smalltalk код је форматиран као бајт-код, па га (ЈИТ) преводилац може превести у машински код пре активирања. Ово ствара благи застој пре покретања програма, али значајно повећава брзину рада када се упореди са директном интерпретацијом изворног кода.

Због овог побољшања перформанси, данас многи програмски језици покрећу своје програме у две етапе, прво преводе изворни код у бајт-код и после убацују бајт-код у виртуалну машину. Овде су виртуелне машине базиране на бајт-коду, то су Јава, Пајтон, PHP,[3] Тцл и Форт (мада је Фортова виртуелна машина мало другачија, па се и бајт-кодови преводе на својствен начин). Програмски језици као што су Перл и Рубy 1.8 користе апстрактно синтаксно стабло како би рашчланили изворни код.

Недавно су аутори В8 [4] и Дарта [5] закључили да је бајт-код неопходан ако желимо брзу и ефикасну ВМ имплементацију. Имплементација оба горе поменута језика користе директно ЈИТ превођење изворног кода у машински код без кориштења бајт-кода.[6]

Примери

>>> 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
  • ActionScript се извршава у ActionScript виртуелној машини (АВМ), која је део Flash Playerа и AIR. ActionScript код се типично претвара у бајт-код формат од стране преводиоца. Примери преводиоца укључују и онај који је направљен у  Adobe Flash Professional и онај који је направљен у Adobe Flash Builder и доступан у  the Adobe Flex SDK.
  • Adobe Flash објекти
  •  BANCStar, првобитно бајт-код за прављење алата интерфејса али се већ користи као сопствени језик.
  • Беркли филтер пакет
  • Библиотека инжењеринга бајт-кода
  • Преводиоци од C до Јавине виртуелне машине 
  • CLISP имплементација Common Lisp-а коришћена је само за превођење бајтокда већ много година; међутим, сада такође подржава превођење на матерњи код уз помоћ ГНУ муње.
  • CMUCL и Scieneer Common Lisp имплементације Common Lisp-а могу преводити и на бајт-код и на матерњи код; бајт-код је много компактнији
  • Common средњи језик извршен је од стране рантајма Common језика. Користе га Microsoft .NET језици као што је C#.
  • Далвик бајт-код, дизајниран за Андроид платформу, извршава се од стране Далвик виртуалне машине.
  • Дис бајт-код, дизајниран од стране Инферна (оперативног система), врши се од стране Дис виртуелне машине.
  • АјфелСтудио за Ајфел програмски језик
  • ЕМ - виртуелна машина Амстердам комплет преводилаца користи се као средњи компиловани језик и као и као модеран бајт-код језик
  • Емацс је текст едитор који се са већином својих функционалности спроводи у специфичном дијалекту Lispа. Ове карактеристике су преведене у бајт-коду. Ова архитектура омогућава корисницима да прилагоде едитор са високим нивоом језика, који је након превођења у бајт-код омогућава интер- вал разумну перформансу.
  • Embeddable Common Lisp имплементација Common Lisp-а може се превести у бајт-код или у С код.
  • Ericsson имплементација Erlang-а користи BEAM бајт-код
  • Icon и Unicon[7] програмски језици
  • Infocom[8] користи З-Машину да своје софтверске апликације учини преношљивијим.
  • Јава бајт-код, који се извршава од стране Јава виртуелне машине 
    • ASM
    • BCEL
    • Javassist
    • JMangler
  • ВМНР, модуларни бајт-код преводилац и виртуелна машина
  • Луа користи бајт-код виртуелну машину засновану на регистру.
  • м код MATLAB програмског језика[9]
  • OCaml програмски језик опционо преводи на компактну бајт-код форму.
  • П-код УЦСД Паскала је имплементација програмског језика Паскал
  • Папагај виртуелна машина
  • Pick BASIC такође се односи на Data BASIC или MultiValue BASIC
  • Р окружење за статистичко рачунарство нуди бајт-код преводиоца преко пакета преводиоца, сада стандардно са Р верзијом 2.13.0. Могуће је превести ову верзију Р тако да је базни и препоручени пакети имају предност од овога.[10]
  • Шема 48 имплементација Шеме користи бајт-код интерпретатор
  • Бајт-кодови многих имплементација Smalltalkа програмског језика
  • Спин преводилац уграђен у микроконтролер пропелера Паралакс
  • SWEET16
  • Tcl
  • Visual FoxPro преводи на бајт-код
  • YARV и Rubinius за Руби.

Референце