Пређи на садржај

ВМНР

С Википедије, слободне енциклопедије
LLVM
Програмер(и)LLVM Developer Group
Прво издање2003
Стабилно издање
3.7.0[1]/ 1. септембар, / 2015; пре 2 месеца
Репозиторијум Уреди на Википодацима
Написан уC++
ПлатформаКрст платформа
ТипПрограмски преводилац
ЛиценцаИлиноис Универзитет /НЦСА отворена лиценца[2]
Веб-сајтllvm.org

ВМНР је пројекат компајлерске инфраструктуре (Виртуална Машина Нижег Ранга) намењен да поставља библиотеке за вишекратну употребу са солидно дефинираним интерфејсовима. 

Написан је у C++ програмском језику и направљен за системе који раде на принципу време ревођења-време повезивања-време извршавања, као и за оптимизацију програма написаних арбитрарним програмским језиком. Првенствено је био имплементиран за C и C++ програмске језике, али касније се списак језика знатно проширио на следеће језике: Common Lisp, Actionscript, Ада, D, Фортран, OpenGL језик сенчења, Гоу, Хаскел, Јава бајткод, Јулија, Објективни-Ц, Свифт, Пајтон, R, Руби, Руст, Скала,[3] C#[4][5][6] и Луа.

Пројекат ВМНР је започет 2000. године на Илиноис Универзитету у Урбани , под вођством Викрам Адве и Криса Латнера. ВМНР је у почетку имао претраживачку инфраструктуру намењену да истражи технике динамичког превођења статичних и динамичких програмских језика. ВМНР је и лансиран под лиценцом Илиноисовог универзитета,[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] слободне софтверске лиценце.  2005. године Епл је ангражовао Латнера да ради на ВМНР системима који би омао вишеструку употрену у Епловим системима који су се у то време развијали.[8] ВМНР је интегрални део Епловог последњег достигнућа Mac OS X и иОС[9] Недавно Сони је почео да користи ВМНР-ов примарни предњи део Јеке преводиоца као саставни део опреме за развој софтвера за ПС4 конзолу.[10]

Име ВМНР је првобитно била скраћеница за Виртуална Машина Нижег Ранга, али је назив постао непогодан јер је ВМНР постао главни пројекат у који се убрајају различити компајлери који се користе у технологији нижег ранга, тако да је пројекат одбацио претходно значење своје скраћенице.[11]Сада је ВМНР бренд који се односи на ВМНР главни пројекат, ВМНР као средње представљање, ВМНР дебаговање, ВМНР стандардну библиотеку за C++ итд. ВМНР-ом управља ВМНР Фондација. Њен председник је Латнерова супруга Тања Латнер, која је такође инжињер.[12]

Удружење рачунарских уређаја је Латтнеру, Адвеу и Евану Ченгу 2012. године доделило АЦМ награду за софтверске системе, за израду ВМНР-а.[13]

Преглед и опис

[уреди | уреди извор]

ВМНР средњим нивоима сфтвера омогућује комплетни компајлерски систем, преузимајући посредничку форму (IF) кода из преводиоца и емитујући га као оптимизовани посреднички IF код. Тај нови IF може да се конвертује и повеже са асемблерским кодом који зависи од машиснког језика. ВМНР може прихватити IF од ГЦЦ ланаца алатки, што му омогућава да користи широк спектар постојећих преводиоца писаних за тај пројекат.

ВМНР такође може генерисати преносиви машински код у времену превођења или ремену спајања или чак бинарног кода машина у рантајму.

ВМНР подржава сетове инструкција који су независни од стране пограмских језика као и типове система[14] Свака инструкција је у статичној, самостојећој форми (ССА) што значи да је свака променљива пренета једном и затим замрзнута. То помаже у поједностављењу анализе и издвајању зависнх од променљивих. ВМНР дозвољава коду да се статични преведе, ако је под управљањем класичног ГЦЦ система, или да се касније преведе из IF кода у машински код помоћу ЈИТ компајлера на сличан начин као што то ради Јава. Знаковни систем се састоји из низа основних типова знакова као што су цели или реални бројеви, и пет сложених типова података: низови, показивачи, вектори, структурни кодови и фукције. Знаковни тип се креира на познатом програмском језику који може представљати комбинацију ових основних знакова. На пример, class фајл у C++ језику може представљати скуп структурних кодова, функција или низова или функцијских показивача.

ВМНР ЈИТ компајлер може да оптимизује непотребне статичке огранке ван програма у извршном систему, а то је корисно када се обавља парцијална процена у случајевима када програм има пуно опција, од којих се код већине може лако детерминисати одређени непотребни део кода. OpenGL је користио ову карактеристику на Mac OS X Леопард (v10.5) како би осгурао подршку која би заменила недоастајајуће карактеристике у хардверу.[15] Графички код у OpenGL-овом складишту података је остао у посредничком формату, па је преведен да би се активирао у одређеном делу уређаја. У случају система са врхунским графичким процесором (ГПУ) коначни код је поприлично танак, па пребацује наредбе на ГПУ узрокујући минималне измене. У случају система са лошим графичким процесорима, ВМНР активира опционалну процедуру да ради помоћу микропроцесора (ЦПУ) који имитира графички процесор и тако обавља наредбе које прави ГПУ не може да спроведе. ВМНР је побољшао перформансе које се односе на лошије уређаје користећи Интелов ГМА чипсет. Сличан систем је развијен уз помоћ помоћног програма Галиум3Д и основице ВМНР који су спојени у ГНОМЕ љусци који омогућава рад без учитаног пристојног 3Д драјвера за хардвер.[16]

Када су у питају извршне перформансе преведених програма, ГЦЦ је већ раније имао боље перформансе од ВМНР просечно за 10%. [17][17] Новија истраживања доказују да је ВМНР ипак успео да стигне ГЦЦ у поменутој области, те сада тако да сада преводе кодове више-мање у истом квалитету, са изузетком када програми користе ОпенМП.[18]

Компоненте

[уреди | уреди извор]

ВМНР је постао главни пројекат састављен од више компонената

Предњи делови: подршка за прогамске језике

[уреди | уреди извор]

ВМНР је првобитно програмиран као замена за постојећи генератор кодова у ГЦЦ складишту,[19] а многи предњи делови ГЦЦ су били преправљани како би могли да функционишу са ВМНР-ом. ВМНР тренутно подржава превођење кодова за следеће програмске језике: Ада, C, C++, D, Делфи, Фортран, Објектни-Ц и Свифт користећи различите фронтне крајеве од којих су неки додати из 4.0.1 и 4.2 верзије ГЦЦ-а.

Широко распрострањено интересовање за ВМНР је проузроковало велики труд да би се развили предњи делови за различите језике. Онај који је заокупио највише пажње јесте Јека, нови компајлер који подржава C, C++ и Објектни-Ц. Примарно развијан од стране Епл-а, Јека је имао циљ да замени C/Објецтиве-Ц компајлер у ГЦЦ систему са системом који би се лакше спојио са са интегрисаним развојним окружењима (ИДЕс) који имају ширу подршку вишенитног окружења. Развој Објективог-Ц-а уз помоћ ГЦЦ-а је заустављено и Еплове промене у језику су имале подршку у посебним одржаваним огранцима.  

Утрехт Хаскел преводилац може генерисати код за ВМНР који, иако је генератор у раној фази развоја, се ипак показао у многим случајевима да је ефикаснији од C генератора кода.[20] Глазгов Хаскел Преводилац (ГХК) је радио у позадини ВМНР-а и остварио 30% убрзања кода када је у питању превођење кодова ако се упореди са превођењем машинског кода помоћу ГХЦ-а или генератора C кода након њега следи слагање података, изостављајући само неке од оптимизованих техника које користи ГХЦ.[21]

Постоје разне компоненте и стадијуми развоја укључујући, али не ограничавајући, Руст преводилац, предњи део Јава бајткода, предњи део Заједничког Међујезика, МакРуби-јеву имплементацију верзије Руби 1.9, различити предњи делови за Стандард МЛ, и нови додатни регистар који боји графике.

ВМНР као међујезик

[уреди | уреди извор]

Језгро ВМНР-а је представљен као међујезик (ИР) лакших, једноставнијих програмских језика сличних асембли-језику. Ир је писан за РИСЦ који садржи посебан сет инструкција које извлаче детаље ван циљаног подручја. Нпр, скуп команди је растављен уз помоћ наредби call and ret које садрже експлицитне аргументе. Уз то, уместо да користи исправне регистре, ИР користи бесконачан сет променљивих у формату %0, %1 итд. ВМНР подржава три изоморфна облика ИР: формат на асембли језику који човек може да прочита, C++ формат погодан за предње делове, и густ формат биткода намењен за нумерисање. Тривијалан "Здраво, свете" програм је асембли формата.

@.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
}

За пуну документацију идите на llvm.org/docs/LangRef.html.

Задњи делови: сет инструкција и подршка за микроструктуру

[уреди | уреди извор]

ВМНР-ова верзија 3.4 подржава многе скупове инструкција, укључујући АРМ, Qualcomm Hexagon, МИПС, Нвидиа ПТX (у ВМНР доцументацији се зове "НВПТX'), ПоуверПЦ, АМД ТераСкале,[22] АМД ГЦН, СПАРК, з/Арцхитецтуре (назван "СyстемЗ" у ВМНР доцументацији), x86/x86-64, и ИXКоре. Нису све карактеристике и опције доступне свим платформама; већина карактеристика важи за x86/x86-64,, з/Арцхитецтуре, АРМ и ПоwерПЦ.[23]

ВМНР-ов машински (механички ) код је потпрограм ВМНР-овог поретка за превођење механичких инструкција између текстуалних форми и машинског кода. Раније се ВМНР ослањао на асемблерки систем, или на неки систем којем су му опције нудиле, да превде асемблерски код у машински. ВМНР асемблер уграђен у машински код подржава већина ВМНР-ових мета, укључујући и x86, x86-64, АРМ, и АРМ64. За неке мете, укључујући и МИПС-ове скупове инструкција подршка за уграђени асемблер може да се користи, мада је још увек у фази развја.

Убачени повезивач: Илд

[уреди | уреди извор]

Илд потпрограм је покушај да се направи уградбени повезивач за ВМНР који је независан у односу на платформу. Тренутно Јека и ВМНР морају да траже извршни фајл у систему или циљном линку. Ово захтева поседовање посебаног повезивача за сваку циљну групу, који иначе подразумева или инсталирање или унакрсно превођење копије GNU Binutils помоћне алатке за сваку циљну групу. Илд жели да одстрани зависност од додатног линка. 

Дебаговање

[уреди | уреди извор]

Историја ревизије[24]

[уреди | уреди извор]
Историја ревизије
Верзија Датум објаве
3.7.0 01. септембар 2015
3.6.0 27. фебруар 2015
3.5.0 3. септембар 2014
3.4.0 2. јануар 2014
3.3 17. јун 2013
3.2 20. децембар 2012
3.1 22. мај 2012
3.0 1. децембар 2011
2.9 6. април 2011
2.8 5. октобар 2010
2.7 27. април 2010
2.6 23. октобар 2009
2.5 2. март 2009
2.4 9. новембар 2008
2.3 9. јун 2008
2.2 11. фебруар 2008
2.1 26. септембар 2007
2.0 23. мај 2007
1.9 19. новембар 2006
1.8 9. август 2006
1.7 20. април 2006
1.6 8. новембар 2005
1.5 18. мај 2005
1.4 9. децембар 2004
1.3 13. август 2004
1.2 19. март 2004
1.1 17. децембар 2003
1.0 24. октобар 2003

Референце

[уреди | уреди извор]
  1. ^ [llvm-announce] LLVM 3.7 Release
  2. ^ а б „License”, LLVM: Frequently Asked Questions, llvm.org, Приступљено 27. 01. 2012 
  3. ^ Reedy, Geoff (2012-09-24).
  4. ^ Announcing LLILC - A new LLVM-based Compiler for . Архивирано на сајту Wayback Machine (23. септембар 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, Архивирано из оригинала 04. 10. 2011. г., Приступљено 27. 01. 2012 
  8. ^ Adam Treat (2005-02-19), mkspecs and patches for LLVM compile of Qt4 Архивирано на сајту Wayback Machine (4. октобар 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" Архивирано на сајту Wayback Machine (12. јануар 2012).
  12. ^ Chris Lattner (April 3, 2014).
  13. ^ "ACM Awards" Архивирано на сајту Wayback Machine (2. април 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. ^ а б V. Makarov.
  18. ^ Michael Larabel (27 December 2012).
  19. ^ Lattner, Chris; Vikram Adve (May 2003).
  20. ^ "Compiling Haskell To LLVM" Архивирано на сајту Wayback Machine (31. мај 2013).
  21. ^ "LLVM Project Blog: The Glasgow Haskell Compiler and LLVM".
  22. ^ "[LLVMdev] RFC: R600, a new backend for AMD GPUs" Архивирано на сајту Wayback Machine (7. септембар 2014).
  23. ^ Target-specific Implementation Notes: Target Feature Matrix // The LLVM Target-Independent Code Generator, LLVM site.
  24. ^ Download LLVM releases

Спољашње везе

[уреди | уреди извор]