Bajt-kod
Bajt-kod, poznat i pod imenom p-kod (prenosivi kod) je vrsta skupa instrukcija namenjenih za efikasnije izvršenje operacija softverskog interpretatora. Za razliku od izvornih kodova koje ljudi mogu da čitaju, bajt-kod čini skup numeričkih kodova, konstanti i referenci (uglavnom su to numeričke adrese) koji šifriraju rezultate raščlanjavanja i semantičkih analiza stvari poput tipa, oblasti dejstva, kao i potprograma postojećih programa. Oni omogućavaju mnogo bolje preformanse od direktne interpretacije izvornog koda.
Naziv bajt-kod potiče od seta instrukcija koji sadrži operativni bajt u kojem su postavljeni raznovrsni parametri. Bajt-kod se u programskom jeziku može koristiti da bi se uprostila interpretacija, ili da bi se smanjila zavisnost hardvera ili operativnog sistema omogućavajući istom kodu da može da se pokrene na različitim platformama. Bajt-kod često može ili da obavlja ulogu virtualne mašine (interpretatora) ili da se ubaci u mašinski kod radi boljih performansi.
Pošto se instrukcije bajt-koda tehnološki obrađuju kroz softver, mogu biti kompleksni, i pored toga svakako zahtevaju tradicionalne instrukcije hardvera; virtualne stek mašine su vrlo česte, mada su izgrađene i virtualne mašine registraciju podataka.[1][2] Slično kao i kod objektnih datoteka, određeni delovi koda se smeštaju u različite fajlove, ali se zajedno aktiviraju prilikom izvršavanja operacija.
Izvršavanje uredi
Bajt-kod program može da se izvrši raščlanjivanjem zapisa i direktnim izvršenje instrukcija, jednu po jednu. Ovakva vrsta bajt-kod interpretatora je veoma prenosiva. Neki sistemi, zvani dinamički prevodioci, ili "just-in-time"(JIT) prevodioci, prevode bajt-kod u mašinski jezik kad god je to potrebno u rantajmu: ovo pomaže virtualnoj mašini da poboljša hardver, a da se pri tome prenosivost bajt-koda ne gubi. Na primer, Java i Smalltalk kod je formatiran kao bajt-kod, pa ga (JIT) prevodilac može prevesti u mašinski kod pre aktiviranja. Ovo stvara blagi zastoj pre pokretanja programa, ali značajno povećava brzinu rada kada se uporedi sa direktnom interpretacijom izvornog koda.
Zbog ovog poboljšanja performansi, danas mnogi programski jezici pokreću svoje programe u dve etape, prvo prevode izvorni kod u bajt-kod i posle ubacuju bajt-kod u virtualnu mašinu. Ovde su virtuelne mašine bazirane na bajt-kodu, to su Java, Pajton, PHP,[3] Tcl i Fort (mada je Fortova virtuelna mašina malo drugačija, pa se i bajt-kodovi prevode na svojstven način). Programski jezici kao što su Perl i Ruby 1.8 koriste apstraktno sintaksno stablo kako bi raščlanili izvorni kod.
Nedavno su autori V8 [4] i Darta [5] zaključili da je bajt-kod neophodan ako želimo brzu i efikasnu VM implementaciju. Implementacija oba gore pomenuta jezika koriste direktno JIT prevođenje izvornog koda u mašinski kod bez korištenja bajt-koda.[6]
Primeri uredi
>>> 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 se izvršava u ActionScript virtuelnoj mašini (AVM), koja je deo Flash Playera i AIR. ActionScript kod se tipično pretvara u bajt-kod format od strane prevodioca. Primeri prevodioca uključuju i onaj koji je napravljen u Adobe Flash Professional i onaj koji je napravljen u Adobe Flash Builder i dostupan u the Adobe Flex SDK.
- Adobe Flash objekti
- BANCStar, prvobitno bajt-kod za pravljenje alata interfejsa ali se već koristi kao sopstveni jezik.
- Berkli filter paket
- Biblioteka inženjeringa bajt-koda
- Prevodioci od C do Javine virtuelne mašine
- CLISP implementacija Common Lisp-a korišćena je samo za prevođenje bajtokda već mnogo godina; međutim, sada takođe podržava prevođenje na maternji kod uz pomoć GNU munje.
- CMUCL i Scieneer Common Lisp implementacije Common Lisp-a mogu prevoditi i na bajt-kod i na maternji kod; bajt-kod je mnogo kompaktniji
- Common srednji jezik izvršen je od strane rantajma Common jezika. Koriste ga Microsoft .NET jezici kao što je C#.
- Dalvik bajt-kod, dizajniran za Android platformu, izvršava se od strane Dalvik virtualne mašine.
- Dis bajt-kod, dizajniran od strane Inferna (operativnog sistema), vrši se od strane Dis virtuelne mašine.
- AjfelStudio za Ajfel programski jezik
- EM - virtuelna mašina Amsterdam komplet prevodilaca koristi se kao srednji kompilovani jezik i kao i kao moderan bajt-kod jezik
- Emacs je tekst editor koji se sa većinom svojih funkcionalnosti sprovodi u specifičnom dijalektu Lispa. Ove karakteristike su prevedene u bajt-kodu. Ova arhitektura omogućava korisnicima da prilagode editor sa visokim nivoom jezika, koji je nakon prevođenja u bajt-kod omogućava inter- val razumnu performansu.
- Embeddable Common Lisp implementacija Common Lisp-a može se prevesti u bajt-kod ili u S kod.
- Ericsson implementacija Erlang-a koristi BEAM bajt-kod
- Icon i Unicon[7] programski jezici
- Infocom[8] koristi Z-Mašinu da svoje softverske aplikacije učini prenošljivijim.
- Java bajt-kod, koji se izvršava od strane Java virtuelne mašine
- VMNR, modularni bajt-kod prevodilac i virtuelna mašina
- Lua koristi bajt-kod virtuelnu mašinu zasnovanu na registru.
- m kod MATLAB programskog jezika[9]
- OCaml programski jezik opciono prevodi na kompaktnu bajt-kod formu.
- P-kod UCSD Paskala je implementacija programskog jezika Paskal
- Papagaj virtuelna mašina
- Pick BASIC takođe se odnosi na Data BASIC ili MultiValue BASIC
- R okruženje za statističko računarstvo nudi bajt-kod prevodioca preko paketa prevodioca, sada standardno sa R verzijom 2.13.0. Moguće je prevesti ovu verziju R tako da je bazni i preporučeni paketi imaju prednost od ovoga.[10]
- Šema 48 implementacija Šeme koristi bajt-kod interpretator
- Bajt-kodovi mnogih implementacija Smalltalka programskog jezika
- Spin prevodilac ugrađen u mikrokontroler propelera Paralaks
- SWEET16
- Tcl
- Visual FoxPro prevodi na bajt-kod
- YARV i Rubinius za Rubi.
Reference uredi
- ^ The Implementation of Lua 5.0 involves a register-based virtual machine.
- ^ „Dalvik VM”. Arhivirano iz originala 18. 5. 2013. g. Pristupljeno 22. 11. 2015. is register based
- ^ Although PHP opcodes are generated each time the program is launched, and are always interpreted and not Just-In-Time compiled
- ^ „Dynamic Machine Code Generation”. Google.
- ^ Loitsch, Florian. „Why Not a Bytecode VM?”. Google. Arhivirano iz originala 12. 05. 2013. g. Pristupljeno 22. 11. 2015.
- ^ „JavaScript myth: JavaScript needs a standard bytecode”.
- ^ The Implementation of Icon and Unicon a Compendium
- ^ „The Implementation of the Icon Programming Language” (PDF). Arhivirano iz originala (PDF) 5. 3. 2016. g. Pristupljeno 22. 11. 2015.
- ^ For the details refer to „United States Patent 6,973,644”. Arhivirano iz originala 05. 03. 2017. g. Pristupljeno 22. 11. 2015.
- ^ For the details refer to „R Installation and Administration”.