VMNR je projekat kompajlerske infrastrukture (Virtualna Mašina Nižeg Ranga) namenjen da postavlja biblioteke za višekratnu upotrebu sa solidno definiranim interfejsovima. 

LLVM
Programer(i)LLVM Developer Group
Prvo izdanje2003
Stabilno izdanje
3.7.0[1]/ 1. septembar, / 2015; pre 2 meseca
Repozitorijum Uredi na Vikipodacima
Napisan uC++
PlatformaKrst platforma
TipProgramski prevodilac
LicencaIlinois Univerzitet /NCSA otvorena licenca[2]
Veb-sajtllvm.org

Napisan je u C++ programskom jeziku i napravljen za sisteme koji rade na principu vreme revođenja-vreme povezivanja-vreme izvršavanja, kao i za optimizaciju programa napisanih arbitrarnim programskim jezikom. Prvenstveno je bio implementiran za C i C++ programske jezike, ali kasnije se spisak jezika znatno proširio na sledeće jezike: Common Lisp, Actionscript, Ada, D, Fortran, OpenGL jezik senčenja, Gou, Haskel, Java bajtkod, Julija, Objektivni-C, Svift, Pajton, R, Rubi, Rust, Skala,[3] C#[4][5][6] i Lua.

Projekat VMNR je započet 2000. godine na Ilinois Univerzitetu u Urbani , pod vođstvom Vikram Adve i Krisa Latnera. VMNR je u početku imao pretraživačku infrastrukturu namenjenu da istraži tehnike dinamičkog prevođenja statičnih i dinamičkih programskih jezika. VMNR je i lansiran pod licencom Ilinoisovog univerziteta,[2] a permissive free software licence. In 2005, Apple Inc. hired Lattner and formed a team to work on the LLVM system for various uses within Apple's development systems.[7] slobodne softverske licence.  2005. godine Epl je angražovao Latnera da radi na VMNR sistemima koji bi omao višestruku upotrenu u Eplovim sistemima koji su se u to vreme razvijali.[8] VMNR je integralni deo Eplovog poslednjeg dostignuća Mac OS X i iOS[9] Nedavno Soni je počeo da koristi VMNR-ov primarni prednji deo Jeke prevodioca kao sastavni deo opreme za razvoj softvera za PS4 konzolu.[10]

Ime VMNR je prvobitno bila skraćenica za Virtualna Mašina Nižeg Ranga, ali je naziv postao nepogodan jer je VMNR postao glavni projekat u koji se ubrajaju različiti kompajleri koji se koriste u tehnologiji nižeg ranga, tako da je projekat odbacio prethodno značenje svoje skraćenice.[11]Sada je VMNR brend koji se odnosi na VMNR glavni projekat, VMNR kao srednje predstavljanje, VMNR debagovanje, VMNR standardnu biblioteku za C++ itd. VMNR-om upravlja VMNR Fondacija. Njen predsednik je Latnerova supruga Tanja Latner, koja je takođe inžinjer.[12]

Udruženje računarskih uređaja je Lattneru, Adveu i Evanu Čengu 2012. godine dodelilo ACM nagradu za softverske sisteme, za izradu VMNR-a.[13]

Pregled i opis

uredi

VMNR srednjim nivoima sftvera omogućuje kompletni kompajlerski sistem, preuzimajući posredničku formu (IF) koda iz prevodioca i emitujući ga kao optimizovani posrednički IF kod. Taj novi IF može da se konvertuje i poveže sa asemblerskim kodom koji zavisi od mašisnkog jezika. VMNR može prihvatiti IF od GCC lanaca alatki, što mu omogućava da koristi širok spektar postojećih prevodioca pisanih za taj projekat.

VMNR takođe može generisati prenosivi mašinski kod u vremenu prevođenja ili remenu spajanja ili čak binarnog koda mašina u rantajmu.

VMNR podržava setove instrukcija koji su nezavisni od strane pogramskih jezika kao i tipove sistema[14] Svaka instrukcija je u statičnoj, samostojećoj formi (SSA) što znači da je svaka promenljiva preneta jednom i zatim zamrznuta. To pomaže u pojednostavljenju analize i izdvajanju zavisnh od promenljivih. VMNR dozvoljava kodu da se statični prevede, ako je pod upravljanjem klasičnog GCC sistema, ili da se kasnije prevede iz IF koda u mašinski kod pomoću JIT kompajlera na sličan način kao što to radi Java. Znakovni sistem se sastoji iz niza osnovnih tipova znakova kao što su celi ili realni brojevi, i pet složenih tipova podataka: nizovi, pokazivači, vektori, strukturni kodovi i fukcije. Znakovni tip se kreira na poznatom programskom jeziku koji može predstavljati kombinaciju ovih osnovnih znakova. Na primer, class fajl u C++ jeziku može predstavljati skup strukturnih kodova, funkcija ili nizova ili funkcijskih pokazivača.

VMNR JIT kompajler može da optimizuje nepotrebne statičke ogranke van programa u izvršnom sistemu, a to je korisno kada se obavlja parcijalna procena u slučajevima kada program ima puno opcija, od kojih se kod većine može lako determinisati određeni nepotrebni deo koda. OpenGL je koristio ovu karakteristiku na Mac OS X Leopard (v10.5) kako bi osgurao podršku koja bi zamenila nedoastajajuće karakteristike u hardveru.[15] Grafički kod u OpenGL-ovom skladištu podataka je ostao u posredničkom formatu, pa je preveden da bi se aktivirao u određenom delu uređaja. U slučaju sistema sa vrhunskim grafičkim procesorom (GPU) konačni kod je poprilično tanak, pa prebacuje naredbe na GPU uzrokujući minimalne izmene. U slučaju sistema sa lošim grafičkim procesorima, VMNR aktivira opcionalnu proceduru da radi pomoću mikroprocesora (CPU) koji imitira grafički procesor i tako obavlja naredbe koje pravi GPU ne može da sprovede. VMNR je poboljšao performanse koje se odnose na lošije uređaje koristeći Intelov GMA čipset. Sličan sistem je razvijen uz pomoć pomoćnog programa Galium3D i osnovice VMNR koji su spojeni u GNOME ljusci koji omogućava rad bez učitanog pristojnog 3D drajvera za hardver.[16]

Kada su u pitaju izvršne performanse prevedenih programa, GCC je već ranije imao bolje performanse od VMNR prosečno za 10%. [17][17] Novija istraživanja dokazuju da je VMNR ipak uspeo da stigne GCC u pomenutoj oblasti, te sada tako da sada prevode kodove više-manje u istom kvalitetu, sa izuzetkom kada programi koriste OpenMP.[18]

Komponente

uredi

VMNR je postao glavni projekat sastavljen od više komponenata

Prednji delovi: podrška za progamske jezike

uredi

VMNR je prvobitno programiran kao zamena za postojeći generator kodova u GCC skladištu,[19] a mnogi prednji delovi GCC su bili prepravljani kako bi mogli da funkcionišu sa VMNR-om. VMNR trenutno podržava prevođenje kodova za sledeće programske jezike: Ada, C, C++, D, Delfi, Fortran, Objektni-C i Svift koristeći različite frontne krajeve od kojih su neki dodati iz 4.0.1 i 4.2 verzije GCC-a.

Široko rasprostranjeno interesovanje za VMNR je prouzrokovalo veliki trud da bi se razvili prednji delovi za različite jezike. Onaj koji je zaokupio najviše pažnje jeste Jeka, novi kompajler koji podržava C, C++ i Objektni-C. Primarno razvijan od strane Epl-a, Jeka je imao cilj da zameni C/Objective-C kompajler u GCC sistemu sa sistemom koji bi se lakše spojio sa sa integrisanim razvojnim okruženjima (IDEs) koji imaju širu podršku višenitnog okruženja. Razvoj Objektivog-C-a uz pomoć GCC-a je zaustavljeno i Eplove promene u jeziku su imale podršku u posebnim održavanim ograncima.  

Utreht Haskel prevodilac može generisati kod za VMNR koji, iako je generator u ranoj fazi razvoja, se ipak pokazao u mnogim slučajevima da je efikasniji od C generatora koda.[20] Glazgov Haskel Prevodilac (GHK) je radio u pozadini VMNR-a i ostvario 30% ubrzanja koda kada je u pitanju prevođenje kodova ako se uporedi sa prevođenjem mašinskog koda pomoću GHC-a ili generatora C koda nakon njega sledi slaganje podataka, izostavljajući samo neke od optimizovanih tehnika koje koristi GHC.[21]

Postoje razne komponente i stadijumi razvoja uključujući, ali ne ograničavajući, Rust prevodilac, prednji deo Java bajtkoda, prednji deo Zajedničkog Međujezika, MakRubi-jevu implementaciju verzije Rubi 1.9, različiti prednji delovi za Standard ML, i novi dodatni registar koji boji grafike.

VMNR kao međujezik

uredi

Jezgro VMNR-a je predstavljen kao međujezik (IR) lakših, jednostavnijih programskih jezika sličnih asembli-jeziku. Ir je pisan za RISC koji sadrži poseban set instrukcija koje izvlače detalje van ciljanog područja. Npr, skup komandi je rastavljen uz pomoć naredbi call and ret koje sadrže eksplicitne argumente. Uz to, umesto da koristi ispravne registre, IR koristi beskonačan set promenljivih u formatu %0, %1 itd. VMNR podržava tri izomorfna oblika IR: format na asembli jeziku koji čovek može da pročita, C++ format pogodan za prednje delove, i gust format bitkoda namenjen za numerisanje. Trivijalan "Zdravo, svete" program je asembli formata.

@.str = internal constant [14 x i8] c"zdravo, svete\0A\00"

declare i32 @printf(i8*, ...)

define i32 @main(i32%argc, i8** %argv) nounwind {
entry:
    %tmp1 = getelementptr [14 x i8]* @.str, i32 0, i32 0
    %tmp2 = call i32 (i8*, ...)* @printf( i8* %tmp1 ) nounwind
    ret i32 0
}

Za punu dokumentaciju idite na llvm.org/docs/LangRef.html.

Zadnji delovi: set instrukcija i podrška za mikrostrukturu

uredi

VMNR-ova verzija 3.4 podržava mnoge skupove instrukcija, uključujući ARM, Qualcomm Hexagon, MIPS, Nvidia PTX (u VMNR documentaciji se zove "NVPTX'), PouverPC, AMD TeraSkale,[22] AMD GCN, SPARK, z/Architecture (nazvan "SystemZ" u VMNR documentaciji), x86/x86-64, i IXKore. Nisu sve karakteristike i opcije dostupne svim platformama; većina karakteristika važi za x86/x86-64,, z/Architecture, ARM i PowerPC.[23]

VMNR MK

uredi

VMNR-ov mašinski (mehanički ) kod je potprogram VMNR-ovog poretka za prevođenje mehaničkih instrukcija između tekstualnih formi i mašinskog koda. Ranije se VMNR oslanjao na asemblerki sistem, ili na neki sistem kojem su mu opcije nudile, da prevde asemblerski kod u mašinski. VMNR asembler ugrađen u mašinski kod podržava većina VMNR-ovih meta, uključujući i x86, x86-64, ARM, i ARM64. Za neke mete, uključujući i MIPS-ove skupove instrukcija podrška za ugrađeni asembler može da se koristi, mada je još uvek u fazi razvja.

Ubačeni povezivač: Ild

uredi

Ild potprogram je pokušaj da se napravi ugradbeni povezivač za VMNR koji je nezavisan u odnosu na platformu. Trenutno Jeka i VMNR moraju da traže izvršni fajl u sistemu ili ciljnom linku. Ovo zahteva posedovanje posebanog povezivača za svaku ciljnu grupu, koji inače podrazumeva ili instaliranje ili unakrsno prevođenje kopije GNU Binutils pomoćne alatke za svaku ciljnu grupu. Ild želi da odstrani zavisnost od dodatnog linka. 

Debagovanje

uredi

Istorija revizije[24]

uredi
Istorija revizije
Verzija Datum objave
3.7.0 01. septembar 2015
3.6.0 27. februar 2015
3.5.0 3. septembar 2014
3.4.0 2. januar 2014
3.3 17. jun 2013
3.2 20. decembar 2012
3.1 22. maj 2012
3.0 1. decembar 2011
2.9 6. april 2011
2.8 5. oktobar 2010
2.7 27. april 2010
2.6 23. oktobar 2009
2.5 2. mart 2009
2.4 9. novembar 2008
2.3 9. jun 2008
2.2 11. februar 2008
2.1 26. septembar 2007
2.0 23. maj 2007
1.9 19. novembar 2006
1.8 9. avgust 2006
1.7 20. april 2006
1.6 8. novembar 2005
1.5 18. maj 2005
1.4 9. decembar 2004
1.3 13. avgust 2004
1.2 19. mart 2004
1.1 17. decembar 2003
1.0 24. oktobar 2003

Vidi još

uredi

Reference

uredi
  1. ^ [llvm-announce] LLVM 3.7 Release
  2. ^ a b „License”, LLVM: Frequently Asked Questions, llvm.org, Pristupljeno 27. 01. 2012 
  3. ^ Reedy, Geoff (2012-09-24).
  4. ^ Announcing LLILC - A new LLVM-based Compiler for . Arhivirano na sajtu Wayback Machine (23. septembar 2015)
  5. ^ Mono LLVM, retrieved 2013-03-10
  6. ^ LLVM, Chris Lattner, in The architecture of Open Source Applications, edited by Amy Brown, Greg Wilson, 2011
  7. ^ Treat, Adam (19. 02. 2005), mkspecs and patches for LLVM compile of Qt4, Arhivirano iz originala 04. 10. 2011. g., Pristupljeno 27. 01. 2012 
  8. ^ Adam Treat (2005-02-19), mkspecs and patches for LLVM compile of Qt4 Arhivirano na sajtu Wayback Machine (4. oktobar 2011), retrieved 2012-01-27
  9. ^ "Apple LLVM Compiler", Developer Tools (Apple), retrieved 2012-01-27
  10. ^ Developer Toolchain for ps4 (PDF), retrieved February 24, 2015
  11. ^ "Chris Lattner discusses the name LLVM" Arhivirano na sajtu Wayback Machine (12. januar 2012).
  12. ^ Chris Lattner (April 3, 2014).
  13. ^ "ACM Awards" Arhivirano na sajtu Wayback Machine (2. april 2012).
  14. ^ "LLVM Language Reference Manual".
  15. ^ Chris Lattner (15 August 2006).
  16. ^ Michael Larabel, "GNOME Shell Works Without GPU Driver Support", phoronix, 6 November 2011
  17. ^ a b V. Makarov.
  18. ^ Michael Larabel (27 December 2012).
  19. ^ Lattner, Chris; Vikram Adve (May 2003).
  20. ^ "Compiling Haskell To LLVM" Arhivirano na sajtu Wayback Machine (31. maj 2013).
  21. ^ "LLVM Project Blog: The Glasgow Haskell Compiler and LLVM".
  22. ^ "[LLVMdev] RFC: R600, a new backend for AMD GPUs" Arhivirano na sajtu Wayback Machine (7. septembar 2014).
  23. ^ Target-specific Implementation Notes: Target Feature Matrix // The LLVM Target-Independent Code Generator, LLVM site.
  24. ^ Download LLVM releases

Spoljašnje veze

uredi