Статикалық жалғыз тапсырма нысаны - Static single assignment form

Жылы құрастырушы дизайн, статикалық бір тағайындау формасы (жиі қысқартылған SSA нысаны немесе жай SSA) меншікті аралық өкілдік (IR), бұл әр айнымалының болуын талап етеді тағайындалды дәл бір рет, және әр айнымалы оны қолданар алдында анықталады. Бастапқы ИҚ-да бар айнымалылар бөлінеді нұсқалары, әдетте оқулықтарда түпнұсқа атымен көрсетілген жаңа айнымалылар, сондықтан әр анықтама өз нұсқасын алады. SSA түрінде, пайдалану тізбегі анық және әрқайсысында бір элемент бар.

SSA ұсынған Барри К. Розен, Марк Н.Вегман, және Ф.Кеннет Задек 1988 ж.[1] Рон Цитрон, Жанна Ферранте және алдыңғы үш зерттеуші IBM SSA формасын тиімді есептей алатын алгоритм құрды.[2]

SSA-ны компилятордан табуға болады Фортран, C немесе C ++, ал функционалды тіл сияқты компиляторлар Схема және ML, жалғасу стилі (CPS) әдетте қолданылады. SSA формальді түрде жергілікті аралық ұсыныс ретінде қолданылған кезде пайда болмайтын, жергілікті емес басқару ағындарын қоспағанда, жақсы басқарылған КС ішкі жиынтығына баламалы болып табылады.[3] Сондықтан біреуіне тұжырымдалған оңтайландыру мен түрлендірулер екіншісіне дереу қолданылады.

Артықшылықтары

SSA-ның негізгі пайдалылығы оның нәтижелерін бір уақытта қалай жеңілдететінінен және жақсартатындығынан туындайды компиляторды оңтайландыру, айнымалылардың қасиеттерін жеңілдету арқылы. Мысалы, осы код бөлігін қарастырыңыз:

y: = 1y: = 2x: = y

Адамдар бірінші тапсырманың қажет еместігін және оның мәні екенін көре алады ж үшінші жолда қолдану екінші тағайындаудан туындайды ж. Бағдарлама орындалуы керек еді анықтамалық талдауға жету осыны анықтау үшін. Егер бағдарлама SSA түрінде болса, олардың екеуі де дереу:

ж1 : = 1ж2 : = 2х1 : = y2

Компиляторды оңтайландыру SSA қолдану арқылы қосылған немесе күшейтілген алгоритмдерге мыналар жатады:

SSA-ға түрлендіру

Қарапайым кодты SSA түріне ауыстыру - бұл әр тапсырманың мақсатын жаңа айнымалыға ауыстыру және айнымалының әр қолданысын айнымалының «нұсқасына» ауыстыру. жетіп бұл нүкте. Мысалы, келесіні қарастырайық басқару графигі:

SSA-ға түрлендіруден бұрын басқару ағынының графигі

«X» -дің сол жағындағы атауды өзгерту х - 3 »және келесі қолданыстарын өзгерту х бұл жаңа атау бағдарламаны өзгертусіз қалдырады. Мұны SSA-да екі жаңа айнымалы құру арқылы пайдалануға болады: х1 және х2, әрқайсысы тек бір рет тағайындалады. Сол сияқты, барлық басқа айнымалыларға ерекшеленетін жазылымдар береді:

SSA-ға ішінара түрлендірілген басқару ағынының графигі

Бір жағдайды қоспағанда, әр қолдану қай анықтамаға сілтеме жасайтыны түсінікті: екеуі де ж төменгі блокта екеуіне де сілтеме жасалуы мүмкін ж1 немесе ж2, басқару ағыны қай жолдан өткеніне байланысты.

Мұны шешу үшін соңғы блокқа а деп аталатын арнайы мәлімдеме енгізіледі Ph (Phi) функциясы. Бұл мәлімдеме жаңа анықтамасын тудырады ж деп аталады ж3 немесе «таңдау» арқылы ж1 немесе ж2, өткендегі басқару ағынына байланысты.

SSA-ға толығымен ауыстырылған басқару ағынының графигі

Енді соңғы блок жай қолдана алады ж3, және дұрыс мән кез келген жолмен алынады. Үшін Φ функциясы х қажет емес: тек бір нұсқасы х, атап айтқанда х2 бұл жерге жетіп жатыр, сондықтан ешқандай проблема жоқ (басқаша айтқанда, Φ (х1,х2)=х2).

Еркін басқару ағынының графигін ескере отырып, Φ функцияларды қайда кірістіру керектігін және қандай айнымалылар үшін екенін айту қиын болуы мүмкін. Бұл жалпы сұрақ деп аталатын тұжырымдаманың көмегімен есептелетін тиімді шешімге ие үстемдік шекаралары (төменде қараңыз).

Φ функциялар көптеген машиналарда машиналық операциялар ретінде орындалмайды. Компилятор Φ функциясын әрбір алдыңғы блоктың соңына «жылжыту» операцияларын енгізу арқылы жүзеге асыра алады. Жоғарыда келтірілген мысалда компилятор көшуді енгізуі мүмкін ж1 дейін ж3 ортаңғы сол жақ блоктың соңында және одан жылжу ж2 дейін ж3 оң жақтағы ортаңғы блоктың соңында. Бұл жылжыту операциялары компилятор негізінде жасалған соңғы кодқа енбеуі мүмкін тіркеу бөлу рәсім. Алайда, бұл тәсіл бір уақытта орындалатын операциялар Φ функциясына кірістер тудыратын кезде жұмыс істемеуі мүмкін, мүмкін кең мәселе машиналар. Әдетте, кең шығарылымды машинада компилятор situations функциясын іске асыру үшін осындай жағдайларда қолданылатын таңдау бойынша нұсқаулық болады.

Кени Задектің айтуынша,[5] Φ функциялар бастапқыда ретінде белгілі болды жалған SSA 1980 жылдары IBM Research-те жасалып жатқан кездегі функциялар. Φ функциясының ресми атауы жұмыс алғаш рет ғылыми мақалада жарияланған кезде ғана қабылданды.

Үстемдік шекараларын пайдаланып минималды SSA есептеу

Біріншіден, бізге а ұғымы қажет доминатор: біз A түйіні деп айтамыз қатаң түрде үстемдік етеді Басқару ағынының графигіндегі басқа В түйіні, егер А-дан бұрын өтпей В-ға жету мүмкін болмаса. Бұл өте пайдалы, өйткені егер біз В-ге жететін болсақ, онда А-да кез-келген код орындалғанын білеміз. Біз A деп айтамыз басым B (B - басым A) егер A немесе B қатаң түрде басым болса немесе A = B болса.

Енді біз анықтай аламыз үстемдік шекарасы: А түйіні А түйінінің басым шекарасында болады, егер А болса емес қатаң түрде B-ге үстемдік етеді, бірақ B-дің кейбір жақын предшественниктеріне үстемдік етеді немесе егер А түйіні B-дің тікелей предшественнигі болса, және кез-келген түйін өзі үстемдік ететіндіктен, А түйіні өзін-өзі басқарады, нәтижесінде А түйіні түйіннің басым шекарасында болады B. А тұрғысынан алғанда, бұл А-дан өтпейтін басқа басқару жолдары ең ерте пайда болатын түйіндер.

Үстемдік шекаралары Φ функцияларын қажет ететін нақты орындарды ұстайды: егер А түйіні белгілі бір айнымалыны анықтаса, онда бұл анықтама мен анықтаманың өзі (немесе қайта анықтамалар) А түйініне жетеді. Біз осы түйіндерден шығып, үстемдік шекарасына енгенде ғана сол айнымалының басқа анықтамаларын беретін басқа ағындарды есепке алуымыз керек. Сонымен қатар, А-ның анықтамаларын қарастыру үшін басқару ағынының графикасында басқа Φ функциялар қажет емес, және біз мұны кем емес жасай аламыз.

Әр түйіннің үстемдік шекараларын табудың тиімді алгоритмі бар. Бұл алгоритм бастапқыда Cytron-да сипатталған т.б. 1991. Сондай-ақ Эндрю Аппелдің «Java-ға заманауи компиляторды енгізу» кітабының 19-тарауы пайдалы (Cambridge University Press, 2002). Толығырақ ақпаратты қағаздан қараңыз.[6]

Кит Д.Купер, Тимоти Дж. Харви және Кен Кеннеди Райс университеті өз жұмысында алгоритмді сипаттаңыз Қарапайым, жылдам үстемдік алгоритмі.[7] Алгоритм өнімділікті жақсарту үшін жақсы құрастырылған мәліметтер құрылымын қолданады. Ол жай былайша өрнектеледі:[7]

әрқайсысы үшін b түйіні dominance_frontier (b): = {}әрқайсысы үшін түйін b егер b ≥ 2-ге жақын предшественниктердің саны әрқайсысы үшін б жылы b жүгірушінің тікелей предшественниктері: = p уақыт жүгіруші ≠ idom (b) dominance_frontier (жүгіруші): = dominance_frontier (жүгіруші) ∪ {b} жүгіруші: = idom (жүгіруші)

Ескерту: жоғарыдағы кодта n түйінінің бірден-бір предшественниги - басқару n түйініне ауысатын кез-келген түйін, ал idom (b) - b түйініне бірден басым болатын түйін (синглтон жиынтығы).

Φ функцияларының санын азайтатын вариациялар

«Минималды» SSA әр атқа дәл бір рет мән берілуін және бастапқы бағдарламадағы аттың әр сілтемесі (қолданылуы) бірегей атқа сілтеме жасай алатындығына көз жеткізу үшін қажетті минималды функциялар санын енгізеді. (Соңғы талап компилятордың әр операциядағы әр операнд үшін атау жаза алуы үшін қажет).

Алайда, кейбір Φ функциялар болуы мүмкін өлі. Осы себепті минималды SSA белгілі бір процедура үшін қажет болатын ең аз Φ функцияларды жасауы міндетті емес. Талдаудың кейбір түрлері үшін бұл Φ функциялар артық болып табылады және талдаудың аз жұмыс істеуіне әкелуі мүмкін.

SSA кесілген

SSA формасы қарапайым бақылауға негізделген: Φ функциялары Φ функциясынан кейін «тірі» болатын айнымалылар үшін ғана қажет. (Мұндағы «тірі» мән Φ функциясынан басталатын кейбір жол бойында пайдаланылатынын білдіреді.) Егер айнымалы тірі болмаса, Φ функциясының нәтижесін пайдалану мүмкін емес және Φ функциясы бойынша тағайындау өлі .

SSA пішінін кесу тәсілдерін құру айнымалы ақпарат Φ функциясын енгізу кезеңінде берілген Φ функциясы қажет пе екенін анықтау үшін. Егер variable функциясын енгізу нүктесінде бастапқы айнымалы атау болмаса, Φ функциясы енгізілмейді.

Тағы бір мүмкіндік - кесуді а ретінде қарастыру өлі кодты жою проблема. Сонымен, Φ функциясы тек кіріс бағдарламасында кез-келген пайдалану оған қайта жазылатын болса немесе ол басқа Φ функциядағы аргумент ретінде пайдаланылатын болса ғана тірі болады. SSA пішінін енгізу кезінде әр қолдану оны басқаратын дәлірек анықтамаға дейін қайта жазылады. Содан кейін Φ функциясы тірі деп саналады, егер ол ең аз дегенде бір қолдануда немесе тірі Φ-нің ең болмағанда бір аргументінде басым болатын анықтама болса.

Жартылай кесілген SSA

Жартылай кесілген SSA нысаны[8] тірі айнымалы ақпаратты есептеудің салыстырмалы түрде жоғары шығындарынсыз Φ функциялар санын азайтуға тырысу болып табылады. Ол келесі бақылауға негізделеді: егер айнымалы ешқашан негізгі блокқа енгенде, оған is функциясы қажет емес. SSA құру кезінде кез-келген «блок-локальды» айнымалылар үшін Φ функциялары алынып тасталады.

Блок-локальды айнымалылар жиынтығын есептеу толыққанды айнымалы анализге қарағанда қарапайым және жылдам процедура болып табылады, жартылай кесілген SSA формасын есептеу үшін кесілген SSA формасына қарағанда тиімдірек етеді. Екінші жағынан, жартылай кесілген SSA формасында Φ функциялары болады.

SSA формасынан айырбастау

SSA формасы әдетте тікелей орындау үшін пайдаланылмайды (бірақ SSA түсіндіру мүмкін болса да[9]), және ол жиі сәйкес келеді «, басқа ИҚ-ның үстінде» қолданылады. Мұны бар ИҚ бөліктері (негізгі блоктар, нұсқаулар, операндтар, т.б.) және оның SSA әріптесі. SSA формасы қажет болмай қалған кезде, бұл салыстыру функциялары алынып тасталуы мүмкін, қазір тек оңтайландырылған ИҚ қалады.

SSA формасында оңтайландыруларды орындау, әдетте, SSA-Веб-торлардың шатасуына әкеледі, яғни операндтары бірдей түбірлі операндқа ие болмайтын Φ нұсқаулар бар. Мұндай жағдайларда түссіз алгоритмдер SSA-дан шығу үшін қолданылады. Адал алгоритмдер әрбір алдыңғы жолдың бойында көшірмені енгізеді, бұл әр түрлі түбірлік таңбаның қайнар көзін Φ мақсатына қарағанда қоюға мәжбүр етеді. SSA-дан аз көшірмелермен шығудың бірнеше алгоритмдері бар, олардың көпшілігі интерференциялық графиканы немесе оның көшірмесін біріктіру үшін оған жуықтауды қолданады.[10]

Кеңейтімдер

SSA формасына арналған кеңейтімдерді екі санатқа бөлуге болады.

Атауын өзгерту кеңейтулер қайта атау критерийін өзгертеді. Естеріңізге сала кетейік, SSA формасы мән берілген кезде әр айнымалының атын өзгертеді. Баламалы схемаларға статикалық бір пайдалану формасы (ол қолданылған кезде әрбір айнымалының атын өзгертеді) және статикалық бірыңғай ақпараттық форма (мән берілген кезде және айнымалылықтан кейінгі шекарада әр айнымалының атын өзгертеді) жатады.

Ерекшелік кеңейтімдер айнымалылар үшін жалғыз тағайындау қасиетін сақтайды, бірақ қосымша функцияларды модельдеу үшін жаңа семантиканы қосады. Кейбір ерекшеліктерге арналған кеңейтімдер массивтер, объектілер және лақап көрсеткіштер сияқты жоғары деңгейлі бағдарламалау тілінің мүмкіндіктерін модельдейді. Ерекшеліктерге арналған басқа кеңейтімдер спекуляция және болжам сияқты төменгі деңгейдегі архитектуралық ерекшеліктерді модельдейді.

SSA формасын қолданатын компиляторлар

SSA формасы - бұл компиляторлар қауымдастығының салыстырмалы түрде жақында пайда болған түрі. Осылайша, көптеген ескі компиляторлар SSA формасын компиляция немесе оңтайландыру процесінің кейбір бөлігі үшін ғана пайдаланады, бірақ көпшілігі оған сенбейді. SSA формасына негізделетін компиляторлардың мысалдары:

  • ETH Оберон-2 компилятор SSA нұсқасы болып табылатын «GSA» енгізілген алғашқы қоғамдық жобалардың бірі болды.
  • The LLVM Компилятордың инфрақұрылымы SSA формасын негізгі сценарийінде барлық скалярлық регистр мәндері үшін қолданады (жадыдан басқасының барлығы). SSA формасы регистрді бөлу орын алғаннан кейін ғана, компиляция процесінің соңында жойылады (көбінесе сілтеме кезінде).
  • The 64 компилятор SSA формасын өзінің ғаламдық скалярлық оңтайландырғышында қолданады, дегенмен код бұрын SSA формасына енгізіліп, кейін SSA формасынан шығарылады. Open64 SSA формасындағы кеңейтімдерді SSA түрінде жадты және скалярлық мәндерді көрсету үшін қолданады.
  • 4 нұсқасы бойынша (2005 жылдың сәуірінде шыққан) GCC, GNU Compiler коллекциясы, SSA-ны кеңінен қолданады. The фронт генерациялау «ЖАЛПЫ «содан кейін түрлендірілетін код»ГИМПЛ «Gimplifier» арқылы код. Содан кейін «GIMPLE» SSA формасында жоғары деңгейлі оңтайландыру қолданылады. Нәтижесінде оңтайландырылған аралық код аударылады RTL, оған төменгі деңгейлі оңтайландыру қолданылады. Сәулет ерекшелігі backends соңында RTL-ді қосыңыз құрастыру тілі.
  • IBM ашық көзі адаптивті Java виртуалды машинасы, Джикес RVM, скалярларды, массивтерді және объектілік өрістерді бірыңғай шеңберде талдауға мүмкіндік беретін SSA кеңейтілген SSA массивін қолданады. Кеңейтілген массивті SSA талдауы тек кодтың жиі орындалатын бөліктеріне қолданылатын максималды оңтайландыру деңгейінде қосылады.
  • 2002 жылы, зерттеушілер өзгертілді IBM-дің JikesRVM (ол кезде Джалапеньо деп аталған) стандартты Java-ны іске қосады байт коды және SSA қауіпсіздігі (SafeTSA ) байт-кодтың файлдары және SSA байт-кодын қолданудың айтарлықтай тиімділігі көрсетілген.
  • Oracle Келіңіздер HotSpot Java виртуалды машинасы өзінің JIT компиляторында SSA негізіндегі аралық тілді қолданады.[11]
  • Microsoft Visual C ++ қол жетімді компилятор Microsoft Visual Studio 2015 3-жаңарту SSA қолданады [12]
  • Моно Mini деп аталатын JIT компиляторында SSA пайдаланады.
  • джекк - бұл Jackal 3.0 академиялық нұсқаулығының ашық компиляторы. Ол аралық көрсету үшін SSA бар қарапайым 3 операндты кодты қолданады. Қызықты нұсқа ретінде ол Φ функцияларын SAME командасымен алмастырады, ол регистрді бөлгішке екі тірі диапазонды бірдей физикалық регистрге орналастыруды тапсырады.
  • Компилятор болмаса да Бумеранг декомпилятор SSA формасын өзінің ішкі көрінісінде қолданады. SSA өрнектің таралуын жеңілдету, параметрлер мен қайтарымдылықты анықтау, сақтауды талдау және басқаларын жеңілдету үшін қолданылады.
  • Portable.NET өзінің JIT компиляторында SSA пайдаланады.
  • libFirm толығымен графикке негізделген компиляторларға арналған SSA аралық ұсынысы. libFirm барлық скалярлық регистр мәндері үшін SSA формасын SSA-дан хабардар регистр бөлгішін қолдану арқылы кодты шығарғанға дейін қолданады.
  • Иллинойс штатындағы 1994 ж[13] SSU (Static Single Use) деп аталатын SSA нұсқасы қолданылды, оған мән берілген кезде әр айнымалының атын өзгертеді және осы айнымалы қолданылатын әр шартты контекстте; жоғарыда аталған статикалық бірыңғай ақпараттық форма. SSU формасы құжатталған Джон Плевяктың кандидаттық диссертациясы.
  • COINS компиляторы мұнда түсіндірілгендей SSA формасын оңтайландыруды қолданады: http://www.is.titech.ac.jp/~sassa/coins-www-ssa/english/
  • The Mozilla Firefox ӨрмекшіMonkey JavaScript қозғалтқышы SSA негізіндегі IR қолданады.[14]
  • The Хром V8 JavaScript қозғалтқышы SSA-ны өзінің Crankshaft компиляторы инфрақұрылымында орындайды 2010 жылдың желтоқсанында жарияланды
  • PyPy өзінің JIT компиляторындағы іздер үшін SSA сызықтық көрінісін қолданады.
  • Android Келіңіздер Дальвик виртуалды машина JIT компиляторында SSA пайдаланады.
  • Android үшін жаңа оңтайландырушы компилятор Android жұмыс уақыты өзінің IR үшін SSA қолданады.
  • Стандартты ML компиляторы МЛтон SSA-ны өзінің аралық тілдерінің бірінде қолданады.
  • LuaJIT SSA негізіндегі оңтайландыруларды көп қолданады.[15]
  • The PHP және Хак құрастырушы HHVM SSA-ны өзінің ИҚ-да қолданады.[16]
  • Резервуар зертханаларының R-Stream компиляторы SSA емес (төрттік тізім), SSA және SSI (статикалық бірыңғай ақпарат) қолдайды[17]) нысандары.[18]
  • Барыңыз (1.7: тек x86-64 архитектурасы үшін; 1.8: барлық қолдау көрсетілетін архитектуралар үшін).[19][20]
  • SPIR-V үшін көлеңкелі тіл стандарты Vulkan graphics API және ядро тілі үшін OpenCL compute API, бұл SSA ұсынысы.[21]
  • Әр түрлі Меса көлеңкелі тілдер үшін SSA өкілдігі - NIR арқылы жүргізушілер.[22]
  • WebKit өзінің JIT компиляторларында SSA пайдаланады.[23][24]
  • Свифт LLVM IR-ден жоғары SIL (Swift Intermediate Language) деп аталатын өзінің SSA формасын анықтайды.[25][26]
  • Эрланг олардың компиляторын OTP 22.0-де «статикалық бірыңғай тағайындауға (SSA) негізделген аралық ұсынысты ішкі пайдалану» қайта жазды. Болашақ шығарылымдарда SSA-ның жоғарғы жағында салынған одан әрі оңтайландыру жоспарларымен.[27]

Әдебиеттер тізімі

Ескертулер

  1. ^ Барри Розен; Марк Н. Вегман; Ф.Кеннет Задек (1988). «Ғаламдық мән сандары және артық есептеулер» (PDF). Бағдарламалау тілдерінің 15-ші ACM SIGPLAN-SIGACT симпозиумының материалдары.
  2. ^ Цитрон, Рон; Ферранте, Жанна; Розен, Барри К .; Вегман, Марк Н. & Задек, Ф. Кеннет (1991). «Статикалық бір тағайындау формасын және бақылауға тәуелділік графигін тиімді есептеу» (PDF). Бағдарламалау тілдері мен жүйелері бойынша ACM транзакциялары. 13 (4): 451–490. CiteSeerX  10.1.1.100.6361. дои:10.1145/115372.115320. S2CID  13243943.
  3. ^ Келси, Ричард А. (1995). «Жалғастыру стилі мен статикалық бірыңғай тапсырма формасы арасындағы сәйкестік» (PDF). 1995 жылғы ACM SIGPLAN аралық ұсыныстар бойынша семинардан алынған құжаттар: 13–22. дои:10.1145/202529.202532. ISBN  0897917545. S2CID  6207179.
  4. ^ мән ауқымының таралуы
  5. ^ 43 бетті қараңыз [«Ф-функциялардың шығу тегі және аты»] Задек, Ф. Кеннет, SSA тарихы бойынша презентация кезінде SSA'09 семинары, Автранс, Франция, сәуір, 2009 ж
  6. ^ Цитрон, Рон; Ферранте, Жанна; Розен, Барри К .; Вегман, Марк Н .; Задек, Ф. Кеннет (1991 ж. 1 қазан). «Статикалық бір тағайындау формасын және бақылауға тәуелділік графигін тиімді есептеу». Бағдарламалау тілдері мен жүйелері бойынша ACM транзакциялары. 13 (4): 451–490. дои:10.1145/115372.115320. S2CID  13243943.
  7. ^ а б Купер, Кит Д .; Харви, Тимоти Дж.; Кеннеди, Кен (2001). «Қарапайым, жылдам үстемдік алгоритмі» (PDF). Журналға сілтеме жасау қажет | журнал = (Көмектесіңдер)
  8. ^ Бриггс, Престон; Купер, Кит Д .; Харви, Тимоти Дж.; Симпсон, Л.Тейлор (1998). «Статикалық бірыңғай тапсырма нысанын салуды және жоюды практикалық жетілдіру» (PDF). Архивтелген түпнұсқа (PDF) 2010-06-07. Журналға сілтеме жасау қажет | журнал = (Көмектесіңдер)
  9. ^ фон Ронне, Джефери; Нин Ван; Майкл Франц (2004). «Статикалық бір тапсырма түрінде бағдарламаларды түсіндіру». Журналға сілтеме жасау қажет | журнал = (Көмектесіңдер)
  10. ^ Бойсинот, Бенуа; Дарт, Ален; Растелло, Фабрис; Динечин, Бенуэт Дюпон де; Гильон, Кристоф (2008). «SSA-дан тыс аударманы дұрыстық, код сапасы мен тиімділігі үшін қайта қарау». HAL-Inria Cs.DS: 14.
  11. ^ «Java HotSpot өнімділік қозғалтқышының архитектурасы». Oracle корпорациясы.
  12. ^ «Жаңа, жетілдірілген Visual C ++ кодын оңтайландырғышты енгізу».
  13. ^ «Иллинойс концерттік жобасы».
  14. ^ «IonMonkey шолуы».,
  15. ^ «Baytecode оңтайландыру». LuaJIT жобасы.
  16. ^ «HipHop аралық өкілдігі (HHIR)».
  17. ^ Ананьян, К.Скотт; Ринард, Мартин (1999). «Статикалық бірыңғай ақпараттық форма». CiteSeerX  10.1.1.1.9976. Журналға сілтеме жасау қажет | журнал = (Көмектесіңдер)
  18. ^ «Параллельді есептеу энциклопедиясы».
  19. ^ «Go 1.7 нұсқасы - Go бағдарламалау тілі». golang.org. Алынған 2016-08-17.
  20. ^ «Go 1.8 шығарылымы туралы ескертулер - Go бағдарламалау тілі». golang.org. Алынған 2017-02-17.
  21. ^ «SPIR-V ерекшелігі» (PDF).
  22. ^ Экстранд, Джейсон. «NIR-ді енгізу, mesa үшін жаңа IR».
  23. ^ «WebKit FTL JIT-пен таныстыру».
  24. ^ «B3 JIT компиляторымен таныстыру».
  25. ^ «Swift Intermediate Language (GitHub)».
  26. ^ «Свифттің жоғары деңгейлі ИҚ: LLVM IR-ді тілге қатысты оңтайландырумен толықтыратын жағдайды зерттеу, LLVM Developers Meetup 10/2015».
  27. ^ «OTP 22.0 шығарылымы туралы ескертпелер».

Жалпы сілтемелер

Сыртқы сілтемелер