Tərtibçi - Compiler - Wikipedia

Vikipediya, Açıq Ensiklopediya

Pin
Send
Share
Send

İldə hesablama, a tərtibçi bir kompüter proqramı ki tərcümə edir birində yazılmış kompüter kodu proqramlaşdırma dili (the mənbə dil) başqa bir dilə ( hədəf dil). "Tərtibçi" adı ilk növbədə tərcümə edən proqramlar üçün istifadə olunur mənbə kodu a yüksək səviyyəli proqramlaşdırma dili a aşağı səviyyəli dil (məsələn, məclis dili, obyekt kodu, və ya maşın kodu) yaratmaq icra edilə bilər proqram.[1][2]:s1

Bir çox fərqli tərtibçi növü var. Tərtib edilmiş proqram olan bir kompüterdə işləyə bilirsə CPU və ya əməliyyat sistemi kompilyatorun işlədildiyindən fərqlidir, tərtibçi a çapraz tərtibçi. A bootstrap kompilyatoru tərtib etmək istədiyi dildə yazılmışdır. Aşağı səviyyəli bir dildən daha yüksək səviyyəyə çevrilən bir proqram a dekompilyator. Yüksək səviyyəli dillər arasında tərcümə edən bir proqram adətən a mənbədən mənbəyə tərtibçi və ya transkompilyator. Bir dil yenidən yazan ümumiyyətlə formasını tərcümə edən bir proqramdır ifadələri dil dəyişikliyi olmadan. Müddət tərtibçi-tərtibçi sintaksis analizini həyata keçirən analizatorların yaradılması üçün istifadə olunan vasitələrə aiddir.

Tərtibçinin, ehtimal ki, aşağıdakı əməliyyatların çoxunu və ya hamısını yerinə yetirməsi mümkündür: əvvəlcədən işləmə, leksik analiz, təhlil, semantik analiz (sintaksis yönümlü tərcümə), giriş proqramlarının bir aralıq nümayəndəlik, kod optimallaşdırmasıkod yaratmaq. Tərtibçilər bu əməliyyatları səmərəli dizaynı və düzəlişləri təşviq edən mərhələlərdə həyata keçirirlər çevrilmələr hədəf çıxışı üçün mənbə girişinin. Yanlış tərtibçi davranışından qaynaqlanan proqram səhvlərini izləmək və işləmək çox çətin ola bilər; bu səbəbdən kompilyator tətbiqçiləri təmin etmək üçün əhəmiyyətli bir səy sərf edirlər kompilyatorun düzgünlüyü.[3]

Tərtibçilər mənbə proqramlarını çevirmək üçün istifadə olunan yeganə dil prosessoru deyil. Bir tərcüməçi göstərilən əməliyyatları dəyişdirən və yerinə yetirən kompüter proqramıdır.[2]:s2 Tərcümə prosesi kompüter dillərinin dizaynını təsir edir, bu da tərtib və ya təfsir seçiminə səbəb olur. Təcrübədə tərtib olunmuş dillər üçün tərcüməçi və tərcümə olunan dillər üçün tərtibçilər tətbiq oluna bilər.

Tarix

Tipik bir çox dilli, çox hədəfli bir tərtibçinin işinin diaqramı

Alimlər, riyaziyyatçılar və mühəndislər tərəfindən hazırlanmış nəzəri hesablama konsepsiyaları II Dünya Müharibəsi dövründə rəqəmsal müasir hesablama inkişafının əsasını təşkil etmişdir. İbtidai ikili dillər inkişaf etdi, çünki rəqəmsal cihazlar yalnız bunları və sıfırları və əsas maşın arxitekturasındakı dövrə nümunələrini başa düşür. 1940-cı illərin sonlarında kompüter arxitekturasının daha asan işlənə bilən bir abstraksiyasını təklif etmək üçün montaj dilləri yaradıldı. Məhduddur yaddaş ilk kompilyatorlar hazırlandıqda erkən kompüterlərin tutumu əhəmiyyətli texniki çətinliklərə səbəb oldu. Buna görə tərtib prosesinin bir neçə kiçik proqrama bölünməsi lazım idi. Ön tərəf proqramları hədəf kodunu yaratmaq üçün arxa tərəf proqramlarının istifadə etdiyi analiz məhsullarını istehsal edir. Kompüter texnologiyası daha çox qaynaq təmin etdiyindən, tərtibçi dizaynları tərtib prosesi ilə daha yaxşı uyğunlaşa bilər.

Bir proqramçı üçün yüksək səviyyəli bir dil istifadə etmək ümumiyyətlə daha məhsuldardır, buna görə yüksək səviyyəli dillərin inkişafı təbii olaraq rəqəmsal kompüterlərin təklif etdiyi imkanlardan irəli gəlir. Yüksək səviyyəli dillər rəsmi dillər yüksək səviyyədə dil arxitekturasını təşkil edən sintaksis və semantikası ilə qəti olaraq müəyyən edilir. Bu rəsmi dillərin elementlərinə aşağıdakılar daxildir:

  • Əlifba, hər hansı bir sonlu simvol dəsti;
  • Simli, sonlu bir simvol ardıcıllığı;
  • Dil, bir əlifba üzərindəki hər hansı bir simli dəst.

Dildəki cümlələr qrammatika adlanan bir sıra qaydalarla müəyyən edilə bilər.[4]

Backus – Naur forması (BNF) bir dilin "cümlə" sintaksisini təsvir edir və Algol 60 tərəfindən sintaksis üçün istifadə edilmişdir. John Backus.[5] Fikirlər məzmunsuz qrammatika tərəfindən anlayışlar Noam Chomsky, bir dilçi.[6] "BNF və onun uzantıları proqramlaşdırma qeydlərinin sintaksisini təsvir etmək üçün standart alət halına gəldi və bir çox hallarda kompilyatorların hissələri BNF təsvirindən avtomatik olaraq yaradıldı."[7]

1940-cı illərdə, Konrad Zuse adlı bir alqoritmik proqramlaşdırma dili dizayn etmişdir Plankalkül ("Plan Hesablama"). 1970-ci illərə qədər heç bir gerçək tətbiq baş verməsə də, sonradan görünən konsepsiyalar təqdim etdi APL Ken Iverson tərəfindən 1950-ci illərin sonunda hazırlanmışdır.[8] APL riyazi hesablamalar üçün bir dildir.

Rəqəmsal hesablama illərində yüksək səviyyəli dil dizaynı, müxtəlif tətbiqetmələr üçün faydalı proqramlaşdırma vasitələri təmin etdi:

  • FORTRAN Mühəndislik və elm tətbiqetmələri üçün (Formula Tərcümə) ilk yüksək səviyyəli dil hesab olunur.[9]
  • COBOL (Ümumi İş Odaklı Dil) inkişaf etmişdir A-0FLOW-MATIC iş tətbiqləri üçün dominant yüksək səviyyəli dil olmaq.[10]
  • LISP Simvolik hesablama üçün (Siyahı Prosessor).[11]

Kompilyator texnologiyası yüksək səviyyəli mənbə proqramının rəqəmsal kompüter üçün aşağı səviyyəli hədəf proqramına ciddi şəkildə çevrilməsinə ehtiyacdan irəli gəldi. Tərtibçi, mənbə kodunun təhlili ilə məşğul olmaq üçün ön tərəf və təhlili hədəf koduna sintez etmək üçün arxa tərəf kimi baxıla bilər. Ön və arxa uc arasındakı optimallaşdırma daha təsirli hədəf kodu istehsal edə bilər.[12]

Kompilyator texnologiyasının inkişafındakı bəzi ilk mərhələlər:

  • 1952 - Bir Avtomatik kod tərtibçi tərəfindən hazırlanmışdır Alick Glennie üçün Manchester Mark I Manchester Universitetindəki kompüter, bəziləri tərəfindən ilk tərtib edilmiş proqramlaşdırma dili olaraq qəbul edilir.
  • 1952Grace Hopperqrupu Remington Rand üçün tərtibçi yazdı A-0 proqramlaşdırma dili (və termini icad etmişdir tərtibçi təsvir etmək),[13][14] A-0 kompilyatoru tam kompilyatorun müasir anlayışından daha çox yükləyici və ya bağlayıcı kimi fəaliyyət göstərməsinə baxmayaraq.
  • 1954-1957 - rəhbərlik etdiyi bir komanda John Backus at IBM inkişaf etmişdir FORTRAN ümumiyyətlə ilk yüksək səviyyəli dil hesab olunur. 1957-ci ildə ümumiyyətlə ilk birmənalı şəkildə tamamlanmış kompilyatoru təqdim etmiş kimi qəbul edilən bir FORTRAN tərtibçisini tamamladılar.
  • 1959 - Məlumat Sistemləri Dili Konfransı (CODASYL) inkişafına başladı COBOL. COBOL dizaynı A-0 və FLOW-MATIC-dən istifadə etdi. 1960-cı illərin əvvəllərində COBOL bir çox memarlıq üzərində tərtib edilmişdir.
  • 1958-1962John McCarthy at MIT dizayn edilmişdir LISP.[15] Rəmz işləmə qabiliyyəti süni intellekt tədqiqatları üçün faydalı xüsusiyyətlər təqdim etdi. 1962-ci ildə LISP 1.5 buraxılışında bəzi alətlər qeyd edildi: Stephen Russell və Daniel J. Edwards tərəfindən yazılan bir tərcüməçi, Tim Hart və Mike Levin tərəfindən yazılmış bir tərtibçi və montajçı.[16]

İlk əməliyyat sistemləri və proqram montaj dilində yazılmışdır. 1960-cı illərdə və 1970-ci illərin əvvəllərində sistem məhdudlaşdırılması səbəbindən sistem proqramı üçün yüksək səviyyəli dillərin istifadəsi hələ mübahisəli idi. Bununla birlikdə, bir neçə tədqiqat və sənaye səyləri, məsələn, yüksək səviyyəli sistem proqramlaşdırma dillərinə keçməyə başladı. BCPL, ZÖVQ, BC.

BCPL (Əsas Kombinə Proqramlaşdırma Dili) 1966-cı ildə hazırlanmışdır Martin Richards Cambridge Universitetində əvvəlcə bir tərtibçi yazma vasitəsi olaraq hazırlanmışdır.[17] Bir neçə tərtibçi tətbiq olundu, Richardsın kitabı dil və tərtibçi haqqında anlayışlar təqdim edir.[18] BCPL, hələ də tədqiqatda istifadə olunan təsirli bir sistem proqramlaşdırma dili deyildi[19] həm də B və C dillərinin dizaynı üçün əsas yaratdı.

ZÖVQ (Sistem proqramının tətbiqi üçün əsas dil) W.A. Wulf-un Carnegie Mellon Universiteti (CMU) tədqiqat qrupu tərəfindən Rəqəmsal Avadanlıq Korporasiyası (DEC) PDP-10 kompüteri üçün hazırlanmışdır. CMU komandası bir il sonra 1970-ci ildə BLISS-11 kompilyatorunu hazırlamağa başladı.

Multics (Multiplexed Information and Computing Service), vaxt paylaşma əməliyyat sistemi layihəsi, iştirak edir MIT, Bell Labs, General Electric (sonra Honeywell) və rəhbərlik etmişdir Fernando Corbató MIT-dən.[20] Multics yazılmışdı PL / I IBM və IBM İstifadəçi Qrupu tərəfindən hazırlanmış dil.[21] IBM-in məqsədi iş, elmi və sistem proqramlaşdırma tələblərini təmin etmək idi. Hesab edilə bilən başqa dillər də var idi, amma PL / tətbiq olunmasa da ən tam həllini təklif etdim.[22] Mulitics layihəsinin ilk bir neçə ilində Bell Labs-dan Doug McIlory və Bob Morris tərəfindən Early PL / I (EPL) tərtibçisi ilə dilin bir alt hissəsi montaj dilinə tərtib edilə bilər.[23] EPL, tam PL / I üçün açılış bağlayan bir tərtibçi hazırlana qədər layihəni dəstəklədi.[24]

Bell Labs 1969-cu ildə Multics layihəsini tərk etdi: "Zaman keçdikcə qrup səyləri iqtisadi cəhətdən faydalı bir sistem yarada bilmədiyi üçün ümid xəyal qırıqlığı ilə əvəz olundu."[25] Davamlı iştirak layihə dəstək xərclərini artıracaqdır. Beləliklə tədqiqatçılar digər inkişaf səylərinə müraciət etdilər. Sistem proqramlaşdırma dili B BCPL anlayışlarına əsaslanaraq yazılmışdır Dennis RitchieKen Thompson. Ritchie, B üçün açılış bağlayan bir tərtibçi yaratdı və yazdı Unics B. Unics-dəki bir PDP-7 üçün (Uniplexed Information and Computing Service) əməliyyat sistemi, sonunda Unix olaraq yazıldı.

Bell Labs inkişafına və genişlənməsinə başladı C B və BCPL əsasında. BCPL tərtibçisi Bell Labs tərəfindən Multics-ə nəql edilmişdi və BCPL Bell Labs-da üstünlük verilən bir dil idi.[26] Başlanğıcda bir C kompilyatoru hazırlanarkən Bell Labs 'B kompilyatoru üçün ön bir proqram istifadə edildi. 1971-ci ildə yeni bir PDP-11, B-yə uzantıları müəyyənləşdirmək və kompilyatoru yenidən yazmaq üçün mənbəyi təmin etdi. 1973-cü ilədək C dilinin dizaynı əslində tamamlandı və PDP-11 üçün Unix nüvəsi C-də yenidən yazıldı. Steve Johnson, C kompilyatorlarının yeni maşınlara yenidən yönəldilməsini dəstəkləmək üçün Portable C Compiler (PCC) hazırlamağa başladı.[27][28]

Obyekt yönümlü proqramlaşdırma (OOP) tətbiqetmə inkişafı və istismarı üçün bəzi maraqlı imkanlar təqdim etdi. OOP anlayışları daha irəli gedir, lakin bir hissəsi idi LISPSimula dil elmi.[29] Bell Labs-da inkişaf C ++ OOP ilə maraqlandı.[30] C ++ ilk dəfə 1980-ci ildə sistemlərin proqramlaşdırılması üçün istifadə edilmişdir. İlkin dizayn Simula konsepsiyalarından istifadə edərək C dil sistemlərinin proqramlaşdırma imkanlarından istifadə etdi. Obyekt yönümlü obyektlər 1983-cü ildə əlavə edildi.[31] Cfront proqramı, C84 dil tərtibçisi üçün C ++ ön ucunu tətbiq etdi. Sonrakı illərdə C ++ populyarlığı artdıqca bir neçə C ++ tərtibçisi hazırlandı.

Bir çox tətbiq sahələrində, daha yüksək səviyyəli bir dil istifadə etmək fikri tez bir zamanda mənimsənildi. Genişlənən funksionallıq sayəsində yenisi tərəfindən dəstəklənir proqramlaşdırma dilləri və kompüter arxitekturasının artan mürəkkəbliyi, tərtibçilər daha mürəkkəb hala gəldi.

DARPA (Defence Advanced Research Projects Agency) 1970-ci ildə Wulf-un CMU tədqiqat qrupu ilə bir tərtibçi layihəsinə sponsorluq etdi. İstehsal Keyfiyyəti Tərtibçisi-Tərtibçisi PQCC dizayn mənbə dilinin və hədəfin rəsmi təriflərindən İstehsal Keyfiyyəti Tərtibçisi (PQC) istehsal edəcəkdir.[32] PQCC, kompilyator-tərtibçi terminini ənənəvi mənadan kənara çıxaraq bir analizator generatoru kimi genişləndirməyə çalışdı (məs. Yaxc) çox uğur qazanmadan. PQCC daha düzgün bir kompilyator generatoru adlandırıla bilər.

Kod yaratmaq prosesi ilə əlaqədar PQCC araşdırması həqiqətən avtomatik bir kompilyator yazma sistemi qurmağa çalışdı. Səy PQC-nin faz quruluşunu kəşf etdi və dizayn etdi. BLISS-11 tərtibçisi ilkin quruluşu təmin etdi.[33] Mərhələlərə analizlər (ön tərəf), virtual maşına ara tərcümə (orta uc) və hədəfə tərcümə (arxa uc) daxil edilmişdir. TCOL, PQCC tədqiqatı üçün aralıq nümayəndəlikdəki dilə xüsusi konstruksiyaları idarə etmək üçün hazırlanmışdır.[34] TCOL varyasyonları müxtəlif dilləri dəstəklədi. PQCC layihəsi avtomatlaşdırılmış kompilyator tikinti texnikalarını araşdırdı. Dizayn konsepsiyaları obyekt yönümlü proqramlaşdırma dili üçün kompilyatorların və tərtibçilərin optimallaşdırılmasında faydalı oldu Ada.

Ada Stoneman Sənədi, proqram dəstəyi mühitini (APSE) nüvəsi (KAPSE) və minimal (MAPSE) ilə birlikdə rəsmiləşdirdi. Bir Ada tərcüməçi NYU / ED, Amerika Milli Standartlar İnstitutu (ANSI) və Beynəlxalq Standartlar Təşkilatı (ISO) ilə inkişaf və standartlaşdırma səylərini dəstəklədi. ABŞ Hərbi Xidmətləri tərəfindən ilk Ada kompilyator inkişafı, Stoneman Document xətti boyunca tərtibçiləri tam inteqrasiya edilmiş dizayn mühitinə daxil etdi. Ordu və Donanma, DEC / VAX arxitekturasını hədəf alan Ada Dil Sistemi (ALS) layihəsi üzərində çalışarkən Hava Qüvvələri IBM 370 seriyasını hədəf alan Ada Integrated Environment (AIE) üzərində işə başladı. Layihələr istənilən nəticəni verməsə də, Ada inkişafındakı ümumi səylərə töhfə verdilər.[35]

Digər Ada kompilyator cəhdləri İngiltərədə York Universitetində və Almaniyada Karlsruhe Universitetində başladı. ABŞ-da Verdix (daha sonra Rational tərəfindən satın alındı) Verdix Ada İnkişaf Sistemini (VADS) Orduya təslim etdi. VADS bir tərtibçi daxil olmaqla bir sıra inkişaf vasitələri təqdim etdi. Unix / VADS, Ordu CECOM qiymətləndirməsində Motorola 68020'yi hədəf alan DEC Ultrix və Sun 3/60 Solaris kimi müxtəlif Unix platformalarında yerləşdirilə bilər.[36] Tezliklə Ada Doğrulama testlərindən keçən bir çox Ada kompilyatoru mövcud oldu. Pulsuz Proqram Vəqfi GNU layihəsi GNU Kompilyator Kolleksiyası (GCC) birdən çox dili və hədəfi dəstəkləmək üçün əsas qabiliyyət təmin edir. Ada versiyası GNAT ən çox istifadə olunan Ada tərtibçilərindən biridir. GNAT pulsuzdur, eyni zamanda ticarət dəstəyi də var, məsələn, AdaCore, Ada üçün ticarət proqram təminatı təmin etmək üçün 1994-cü ildə qurulmuşdur. GNAT Pro, GNU GCC əsaslı bir GNAT təmin edir inteqrasiya olunmuş inkişaf mühiti.

Yüksək səviyyəli dillər kompilyator tədqiqatı və inkişafını idarə etməyə davam etdi. Fokus sahələri optimallaşdırma və avtomatik kod istehsalını əhatə edirdi. Proqramlaşdırma dillərindəki trendlər və inkişaf mühitləri kompilyator texnologiyasını təsir etdi. Daha çox tərtibçi dil paylanmalarına (PERL, Java Development Kit) və IDE (VADS, Eclipse, Ada Pro) tərkib hissəsi olaraq daxil edildi. Texnologiyaların qarşılıqlı əlaqəsi və asılılığı artdı. Veb xidmətlərinin yaranması veb dillərinin və ssenari dillərinin böyüməsini təşviq etdi. Ssenarilər, istifadəçinin sistem tərəfindən yerinə yetiriləcək əmrləri daxil edə biləcəyi Komut Xətti İnterfeyslərinin (CLI) ilk günlərinə qədər uzanır. İstifadəçi Shell anlayışları qabıq proqramları yazmaq üçün dillərlə inkişaf etmişdir. Erkən Windows dizaynları sadə bir toplu proqramlaşdırma qabiliyyəti təqdim etdi. Bu dilin şərti çevrilməsində bir tərcüməçi istifadə edilmişdir. Geniş istifadə olunmasa da, Bash və Batch tərtibçiləri yazılmışdır. Bu yaxınlarda inkişaf etmiş təfsir edilmiş dillər inkişaf etdiricilər alət dəstinin bir hissəsi oldu. Müasir skript dilinə PHP, Python, Ruby və Lua daxildir. (Lua oyun inkişafında geniş istifadə olunur.) Bunların hamısı tərcüməçi və tərtibçi dəstəyinə malikdir.[37]

"Tərtib sahəsi 50-ci illərin sonlarında başladıqda, onun diqqəti yüksək səviyyəli dil proqramlarının maşın koduna çevrilməsi ilə məhdudlaşdı ... Kompilyator sahəsi getdikcə kompüter arxitekturası, proqramlaşdırma dilləri, formal metodlar, digər fənlərlə qarışıqlaşdı, proqram mühəndisliyi və kompüter təhlükəsizliyi. "[38] "Tərtibçi Araşdırması: Növbəti 50 il" məqaləsində obyekt yönümlü dillərin və Java-nın əhəmiyyəti qeyd edildi. Gələcək tədqiqat hədəfləri arasında təhlükəsizlik və paralel hesablama göstərilmişdir.

Kompilyatorun tikintisi

Tərtibçi yüksək səviyyəli mənbə proqramından aşağı səviyyəli hədəf proqramına rəsmi çevrilməni həyata keçirir. Kompilyator dizaynı bir ucdan uca həll təyin edə bilər və ya digər tərtib alətləri ilə interfeys edən müəyyən bir alt dəsti həll edə bilər. əvvəlcədən işləyənlər, montajçılar, bağlayıcılar. Dizayn tələblərinə həm kompilyator komponentləri arasında, həm də xaricdən dəstək alət dəstləri arasında ciddi şəkildə müəyyən edilmiş interfeyslər daxildir.

İlk günlərdə kompilyator dizaynına yanaşma, işlənəcək kompüter dilinin mürəkkəbliyindən, onu dizayn edən şəxslərin (təcrübəçilərin) təcrübəsindən və mövcud mənbələrdən birbaşa təsirləndi. Resurs məhdudluğu mənbə kodundan bir dəfədən çox keçmə ehtiyacına səbəb oldu.

Bir nəfər tərəfindən yazılmış nisbətən sadə bir dil üçün bir tərtibçi tək, monolit bir proqram parçası ola bilər. Lakin mənbə dili mürəkkəbləşdikcə dizayn bir-birindən asılı olan bir neçə mərhələyə bölünə bilər. Ayrı-ayrı mərhələlər, tərtibat prosesindəki inkişaflara yönəldilmiş dizayn təkmilləşdirmələrini təmin edir.

Çox keçidli tərtibçilərə qarşı bir ötürmə

Kompilyatorların ötürmə sayına görə təsnif edilməsi, kompüterlərin hardware resurs məhdudiyyətləri ilə əlaqəlidir. Tərtib etmək çox iş görməyi nəzərdə tutur və erkən kompüterlərdə bütün bu işləri görən bir proqramı əhatə edəcək qədər yaddaş yox idi. Beləliklə, tərtibçilər tələb olunan təhlil və tərcümələrin bir hissəsini həyata keçirərək mənbədən (və ya onun bir hissəsini) keçid edən daha kiçik proqramlara bölündülər.

A-da tərtib etmək bacarığı tək ötürmə Klassik olaraq bir fayda olaraq görülmüşdür, çünki bir tərtibçi yazma işini asanlaşdırır və bir keçidli tərtibçilər ümumiyyətlə tərtibləri daha sürətli yerinə yetirirlər. çox keçidli tərtibçilər. Beləliklə, qismən erkən sistemlərin qaynaq məhdudiyyətlərindən qaynaqlanan bir çox erkən dillər bir keçiddə tərtib oluna bilməsi üçün xüsusi olaraq hazırlanmışdır (məsələn, Paskal).

Bəzi hallarda, dil xüsusiyyətinin tərtibatı üçün bir tərtibçinin mənbədən birdən çox keçişi yerinə yetirməsi tələb oluna bilər. Məsələn, mənbənin 20-ci sətrində, 10-cu sətirdə görünən bir ifadənin tərcüməsini təsir edən bir bəyannaməni nəzərdən keçirin. Bu halda, ilk keçid, təsir göstərdikləri ifadələrdən sonra ortaya çıxan bəyannamələr haqqında məlumatların toplanmasına ehtiyac duyur. sonrakı ötürmə zamanı.

Tək keçiddə tərtib etməyin dezavantajı, inkişaf etmiş bir çoxunun yerinə yetirilməsinin mümkün olmamasıdır optimallaşdırma yüksək keyfiyyətli kod yaratmaq üçün lazım idi. Bir optimallaşdırıcı kompilyatorun nə qədər keçdiyini dəqiq saymaq çətin ola bilər. Məsələn, müxtəlif optimallaşdırma mərhələləri bir ifadəni dəfələrlə analiz edə bilər, ancaq başqa bir ifadəni yalnız bir dəfə analiz edə bilər.

Bir tərtibçinin kiçik proqramlara bölünməsi, təsdiqlənən düzgün kompilyatorlar istehsalında maraqlı olan tədqiqatçıların istifadə etdiyi bir üsuldur. Bir sıra kiçik proqramların düzgünlüyünü sübut etmək çox vaxt daha böyük, tək, ekvivalent bir proqramın düzgünlüyünü sübut etməkdən daha az səy tələb edir.

Üç mərhələli kompilyator quruluşu

Kompilyator dizaynı

Kompilyator dizaynındakı fazaların dəqiq sayından asılı olmayaraq fazlar üç mərhələdən birinə təyin edilə bilər. Mərhələlər ön, orta və arxa ucları əhatə edir.

  • The ön uc sintaksis və semantikanı müəyyən bir mənbəyə görə yoxlayır. Üçün statik olaraq yazılmış dillər yerinə yetirir tip yoxlanışı növ məlumat toplayaraq. Giriş proqramı sintaktik olaraq səhvdirsə və ya bir növ səhv varsa, səhv və / və ya xəbərdarlıq mesajları yaradır, ümumiyyətlə problemin aşkar olunduğu mənbə kodundakı yeri müəyyənləşdirir; bəzi hallarda həqiqi səhv proqramda daha çox ola bilər. Ön tərəfin aspektlərinə leksik analiz, sintaksis təhlili və semantik analiz daxildir. Ön tərəf giriş proqramını an-a çevirir aralıq nümayəndəlik (IR) orta sona qədər daha da işlənmək üçün. Bu IR ümumiyyətlə proqramın mənbə koduna nisbətən daha aşağı səviyyədə təmsilidir.
  • The orta uc hədəflənən CPU arxitekturasından asılı olmayan IR-də optimallaşdırma aparır. Bu mənbə kodu / maşın kodu müstəqilliyi, ümumi optimallaşdırmaların fərqli dillər və hədəf prosessorları dəstəkləyən tərtibçi versiyaları arasında bölüşdürülməsini təmin etmək məqsədi daşıyır. Orta uc optimallaşdırmalarına nümunələr yararsızların qaldırılmasıdır (ölü kodu aradan qaldırılması) və ya əlçatmaz kod (əlçatanlıq təhlili), sabit dəyərlərin aşkarlanması və yayılması (daimi yayılma), hesablamanın daha az yerinə yetirilən yerə köçürülməsi (məsələn, bir döngədən kənar) və ya məzmuna əsaslanan hesablama ixtisası. Nəhayət arxa tərəfdən istifadə edilən "optimallaşdırılmış" IR istehsal edir.
  • The arxa uc optimallaşdırılmış IR-ni orta ucdan götürür. Hədəfli CPU arxitekturasına xas olan daha çox analiz, transformasiya və optimallaşdırma həyata keçirə bilər. Arxa uc, hədəfdən asılı montaj kodu yaradır, yerinə yetirir ayırma qeydiyyatı prosesində. Arxa uc həyata keçirir təlimat planlaşdırma, paralel saxlamaq üçün təlimatları yenidən sifariş edir icra vahidləri dolduraraq məşğul gecikmə yuvaları. Çox optimallaşdırma problemi olsa da NP çətin, evristik bunları həll etmək üçün texnika yaxşı işlənib hazırlanıb və hazırda istehsal keyfiyyətində tərtib edənlərdə tətbiq olunur. Tipik olaraq arxa ucun çıxışı müəyyən bir prosessor və əməliyyat sistemi üçün ixtisaslaşmış maşın kodudur.

Bu ön / orta / arxa yanaşma, fərqli dillər üçün ön uçları fərqli ilə arxa uclarla birləşdirməyə imkan verir CPU orta ucun optimallaşdırılmasını paylaşarkən.[39] Bu yanaşmanın praktiki nümunələri GNU Kompilyator Kolleksiyası, Zəng (LLVMəsaslı C / C ++ kompilyatoru),[40]Amsterdam Kompilyator Dəsti, birdən çox ön, paylaşılan optimallaşdırma və bir çox arxa tərəf var.

Ön uc

Lexertəhlilçi misal üçün C. Simvol ardıcıllığından başlayaraq "əgər (xalis> 0.0) cəmi + = xalis * (1.0 + vergi / 100.0);", skaner bir ardıcıllığı təşkil edir ayələrvə bunların hər birini kateqoriyaya ayırır, məsələn identifikator, qorunan söz, rəqəm hərfi, və ya operator. Sonuncu ardıcıllıq təhlilçi tərəfindən a-ya çevrilir sintaksis ağacı, sonra qalan kompilyator mərhələləri tərəfindən müalicə olunur. Skaner və təhlilçi müntəzəm və düzgün şəkildə kontekstdən azaddır hissələri C üçün qrammatikasırasıyla.

Ön tərəf, proqramın daxili nümayəndəliyini yaratmaq üçün mənbə kodunu təhlil edir aralıq nümayəndəlik (IR). Bu da idarə edir simvol cədvəli, mənbə kodundakı hər bir simvolu yer, tip və əhatə dairəsi ilə əlaqəli məlumatlarla əlaqələndirən bir məlumat quruluşu.

Frontend a kimi olduğu kimi tək bir monolitik funksiya və ya proqram ola bilər skanersiz analizator, daha çox ardıcıl və ya paralel olaraq həyata keçirilə bilən bir neçə mərhələ olaraq həyata keçirilir və təhlil olunur. Bu metod modulluğu və narahatlıqların ayrılması. Bu gün ən çox yayılmış hissə üç mərhələyə bölünür: leksik analiz (lexing olaraq da bilinir), sintaksis təhlili (tarama və ya ayrıştırma olaraq da bilinir) və semantik analiz. Lexing və təhlil sintaktik təhlili (söz sintaksisini və söz sintaksisini) təşkil edir və sadə hallarda bu modullar (lekser və təhlilçi) avtomatik olaraq dil üçün bir qrammatikadan yaradıla bilər, lakin daha mürəkkəb hallarda bu əl dəyişdirilməsini tələb edir. . Leksik qrammatika və söz qrammatikası ümumiyyətlə olur məzmunsuz qrammatikasemantik analiz mərhələsində kontekst həssaslığı ilə təhlili əhəmiyyətli dərəcədə asanlaşdıran. Semantik analiz mərhələsi ümumiyyətlə daha mürəkkəbdir və əllə yazılır, lakin istifadə edərək qismən və ya tamamilə avtomatlaşdırıla bilər atribut qrammatika. Bu mərhələlərin özləri daha da parçalana bilər: tarama və qiymətləndirmə kimi lexing və bina kimi təhlil beton sintaksis ağacı (CST, təhlil ağacı) və sonra onu bir halına gətirir mücərrəd sintaksis ağacı (AST, sintaksis ağacı). Bəzi hallarda əlavə mərhələlər istifadə olunur, xüsusən xəttin yenidən qurulmasıəvvəlcədən işləmə, lakin bunlar nadirdir.

Ön tərəfin əsas mərhələləri aşağıdakıları əhatə edir:

  • Xəttin yenidən qurulması giriş xarakter ardıcıllığını təhlilçi üçün hazır bir kanonik formaya çevirir. Dillər strop onların açar sözləri və ya identifikatorlar daxilində ixtiyari boşluqlara icazə vermək bu mərhələni tələb edir. The yuxarıdan aşağı, rekursiv-enmə, 1960-cı illərdə istifadə olunan cədvəl idarəedici ayrıştırıcılar, adətən mənbəyi bir-bir simvol oxudu və ayrıca bir işarələmə mərhələsinə ehtiyac duymadı. Atlas Avtomatik KoduImp (və bəzi tətbiqləri ALGOLMərcan 66) tərtibçilərinin a olan kəsilmiş dillərə nümunələrdir Xəttin yenidən qurulması faza.
  • Ön emal dəstəkləyir makro əvəzetmə və şərti tərtib. Tipik olaraq, emal mərhələsi sintaktik və ya semantik analizdən əvvəl baş verir; məs. C halında, ön prosessor sintaktik formalardan daha çox leksik əlamətləri idarə edir. Bununla birlikdə bəzi dillər Sxem sintaktik formalara əsaslanan makro əvəzetmələri dəstəkləyin.
  • Leksik analiz (başqa adla lexing və ya işarələmə) mənbə kodu mətnini kiçik parçalar sırasına ayırır leksik əlamətlər.[41] Bu mərhələ iki mərhələyə bölünə bilər: the tarama, giriş mətnini sintaktik vahidlərə ayıran leksemalar və onlara bir kateqoriya təyin edin; və qiymətləndirirəm, leksemləri işlənmiş dəyərə çevirən. Nişan a-dan ibarət cütlükdür jeton adı və istəyə görə jeton dəyəri.[42] Ümumi simvol kateqoriyalarına identifikatorlar, açar sözlər, ayırıcılar, operatorlar, ədəbiyyat və şərhlər daxil ola bilər, lakin simvol kateqoriyalarının müxtəlifliyi fərqli olsa da proqramlaşdırma dilləri. Leksem sintaksis tipik olaraq a adi dil, belə ki, a sonlu dövlət avtomatı a-dan inşa edilmişdir Müntəzəm ifadə onu tanımaq üçün istifadə edilə bilər. Leksik analiz edən proqram a. Adlanır leksik analizator. Bu ayrı bir addım olmaya bilər - ayrıştırma addımı ilə birləşdirilə bilər skanersiz analiz, bu zaman təhlil işarələr səviyyəsində deyil, xarakter səviyyəsində aparılır.
  • Sintaksis təhlili (başqa adla təhlil) daxildir təhlil proqramın sintaktik quruluşunu müəyyənləşdirmək üçün jeton ardıcıllığı. Bu mərhələ adətən a ağacı təhlil edinBu, işarələrin xətti ardıcıllığını a qaydalarına uyğun olaraq qurulmuş bir ağac quruluşu ilə əvəz edən rəsmi qrammatika dilin sintaksisini təyin edən. Parse ağacı tez-tez təhlil edilir, artırılır və tərtibedəki sonrakı mərhələlər tərəfindən dəyişdirilir.[43]
  • Semantik analiz semantik məlumat əlavə edir ağacı təhlil edin və qurur simvol cədvəli. Bu mərhələ kimi semantik yoxlamalar həyata keçirir tip yoxlanışı (tip səhvlərinin yoxlanılması) və ya obyekt məcburidir (dəyişən və funksiya istinadlarını tərifləri ilə əlaqələndirmək) və ya müəyyən tapşırıq (istifadə edilməzdən əvvəl bütün yerli dəyişənlərin başlanğıc halına gətirilməsini tələb etmək), səhv proqramları rədd etmək və ya xəbərdarlıq etmək. Semantik analiz ümumiyyətlə tam bir analiz ağacı tələb edir, yəni bu mərhələ məntiqi olaraq aşağıdakıları izləyir təhlil mərhələsi və məntiqi olaraq əvvəldən əvvəl kod yaratmaq mərhələ, çox vaxt bir kompilyator tətbiqində kodun üstündən bir keçidə qatlamaq mümkündür.

Orta son

Orta ucu da bilinir optimizator, istehsal olunan maşın kodunun performansını və keyfiyyətini yaxşılaşdırmaq üçün aralıq nümayəndəlikdə optimallaşdırma aparır.[44] Orta uc, hədəflənən CPU arxitekturasından asılı olmayan bu optimallaşdırmaları ehtiva edir.

Orta ucun əsas mərhələləri aşağıdakıları əhatə edir:

Kompilyator analizi hər hansı bir kompilyator optimallaşdırması üçün ilkin şərtdir və bir-birləri ilə sıx işləyirlər. Misal üçün, asılılıq təhlili üçün çox vacibdir döngə çevrilməsi.

Tərtibçi analizinin və optimallaşdırmanın əhatə dairəsi çox fərqlidir; onların əhatə dairəsi a daxilində fəaliyyət göstərə bilər əsas blok, bütün prosedurlara, hətta bütün proqrama. Optimizasiyaların dənəcikliliyi ilə tərtib etmə dəyəri arasında mübahisə var. Misal üçün, göz qapağının optimallaşdırılması kompilyasiya zamanı yerinə yetirmək üçün sürətli, lakin kodun yalnız kiçik bir lokal parçasını təsir edir və kod parçasının göründüyü kontekstdən asılı olmayaraq həyata keçirilə bilər. Əksinə, proseslərarası optimallaşdırma daha çox kompilyasiya vaxtı və yaddaş sahəsi tələb edir, ancaq birdən çox funksiyanın davranışını eyni vaxtda nəzərə alaraq mümkün olan optimallaşdırmaları təmin edin.

Prosedurlararası analiz və optimallaşdırma müasir ticarət tərtibçilərində yaygındır HP, IBM, SGI, Intel, MicrosoftGünəş Mikrosistemləri. The pulsuz proqram GCC güclü proseslərarası optimallaşdırmaların olmaması üçün uzun müddət tənqid olundu, lakin bu baxımdan dəyişir. Tam təhlil və optimallaşdırma infrastrukturuna sahib başqa bir açıq mənbəli tərtibçi Açıq 64, bir çox təşkilat tərəfindən tədqiqat və ticarət məqsədləri üçün istifadə olunur.

Tərtibçi təhlili və optimallaşdırma üçün lazım olan əlavə vaxt və yer sayəsində bəzi tərtibçilər onları standart olaraq atlayırlar. İstifadəçilər tərtibçiyə hansı optimallaşdırmaların aktivləşdirilməli olduğunu açıq şəkildə söyləmək üçün tərtib seçimlərindən istifadə etməlidirlər.

Arxa uc

Arxa tərəf CPU arxitekturasına xüsusi optimallaşdırmalardan və bunun üçün məsuliyyət daşıyır kod yaratmaq[44].

Arxa ucun əsas mərhələlərinə aşağıdakılar daxildir:

  • Maşından asılı optimallaşdırmalar: tərtibçinin hədəf aldığı CPU arxitekturasının detallarından asılı olan optimallaşdırmalar.[45] Görkəmli bir nümunədir göz qapağının optimallaşdırılmasımontajçı təlimatlarının qısa ardıcıllığını daha səmərəli təlimatlara yenidən yazan.
  • Kod yaratmaq: çevrilmiş orta dil, ümumiyyətlə doğma dil olan çıxış dilinə çevrilir maşın dili sistemin. Bu, hansı dəyişkənlərə uyğun gələcəyinə qərar vermək kimi qaynaq və saxlama qərarlarını əhatə edir qeydlər və yaddaş və seçimplanlaşdırma müvafiq maşın təlimatlarının və bunlarla əlaqəli müraciət rejimləri (həmçinin bax Sethi-Ullman alqoritmi). Hata ayıklama məlumatlarını asanlaşdırmaq üçün də yaratmaq lazım ola bilər ayıklama.

Kompilyatorun düzgünlüyü

Kompilyatorun düzgünlüyü bir kompilyatorun özünə uyğun davrandığını göstərməyə çalışmaqla məşğul olan proqram mühəndisliyinin bir hissəsidir dil spesifikasiyası.[alıntıya ehtiyac var] Texnikalara istifadə edərək tərtibçinin hazırlanması daxildir rəsmi metodlar və mövcud bir kompilyatorda ciddi testdən (tez-tez kompilyatorun təsdiqlənməsi adlanır) istifadə etmək.

Tərcümə olunmuş dillərə qarşı tərtib edilmişdir

Daha yüksək səviyyəli proqramlaşdırma dilləri ümumiyyətlə bir növü ilə görünür tərcümə nəzərə alaraq: ya kimi dizayn edilmişdir tərtib edilmiş dil və ya şərh dili. Lakin, praktikada nadir hallarda bir dil haqqında bir şey var tələb edir yalnız tərtib olunmalı və ya müstəsna olaraq şərh olunmalıdır, baxmayaraq ki, iş vaxtı yenidən təfsirə əsaslanan dilləri dizayn etmək mümkündür. Bölmə ümumiyyətlə bir dilin ən populyar və ya geniş yayılmış tətbiqlərini əks etdirir - məsələn, ƏSAS BASIC tərtibçilərinin və C tərcüməçilərinin olmasına baxmayaraq bəzən təfsir edilmiş bir dil, C-yə isə tərtib edilmiş bir dil deyilir.

Şərh tərtibatı tamamilə əvəz etmir. Yalnız istifadəçidən gizlədir və tədricən edir. Tərcüməçi özü təfsir oluna bilsə də, yığının altındakı bir yerdə birbaşa icra olunan bir proqrama ehtiyac var (bax maşın dili).

Bundan əlavə, tərtibçilər optimallaşdırma səbəbləri üçün tərcüməçiləri ehtiva edə bilərlər. Məsələn, bir ifadə tərtib edilərkən və nəticələr proqrama daxil edilərsə, onda hər dəfə proqram işləyəndə yenidən hesablanmasının qarşısını alır və bu da son proqramı sürətləndirə bilər. Müasir istiqamətlər vaxtında tərtibbayt kodu şərh bəzən tərtibçilərin və tərcüməçilərin ənənəvi kateqoriyalarını daha da bulanıklaşdırır.

Bəzi dil spesifikasiyaları bu tətbiqləri yazır olmalıdır bir tərtib qurğusu daxildir; misal üçün, Ümumi Lisp. Lakin, Ortaq Lisp tərifində onun şərh olunmasını dayandıran heç bir şey yoxdur. Digər dillərdə bir tərcüməçidə tətbiq edilməsi çox asandır, lakin tərtibçinin yazılmasını çox çətinləşdirir; misal üçün, APL, SNOBOL4və bir çox skript dilləri proqramların iş vaxtında müntəzəm simli əməliyyatlarla ixtiyari mənbə kodu qurmasına və sonra xüsusi kodu ötürərək bu kodun icrasına imkan verir. qiymətləndirmə funksiyası. Tərtib olunmuş dildə bu xüsusiyyətləri həyata keçirmək üçün proqramlar ümumiyyətlə a ilə göndərilməlidir iş vaxtı kitabxanası bu da tərtibçinin özünün bir versiyasını ehtiva edir.

Növlər

Tərtibçilərin bir təsnifatı platforma onların yaradılan kodunun icra olunduğu. Bu kimi tanınır hədəf platforması.

A doğma və ya ev sahibliyi etdi kompilyator, çıxışı birbaşa kompilyatorun işlədiyi eyni tipli kompüter və əməliyyat sistemində işləməyə hesablanmışdır. Çıxış a çapraz tərtibçi fərqli bir platformada işləmək üçün hazırlanmışdır. Çapraz kompilyatorlar tez-tez proqram hazırlayarkən istifadə olunur əlaqədar sistemlər bir proqram inkişaf mühitini dəstəkləməyi düşünməyənlər.

A üçün kod istehsal edən bir kompilyatorun çıxışı virtual maşın (VM) onu istehsal edən kompilyatorla eyni platformada icra edilə bilər və ya edilə bilməz. Bu səbəbdən belə tərtibçilər ümumiyyətlə yerli və ya çapraz tərtib edənlər kimi təsnif edilmir.

Tərtibçinin hədəfi olan aşağı səviyyəli dil özü ola bilər a yüksək səviyyəli proqramlaşdırma dili. Bəziləri tərəfindən bir növ portativ montaj dili kimi qəbul edilən C, bu cür tərtibçilərin hədəf dilidir. Misal üçün, Cfrontüçün orijinal tərtibçi C ++, hədəf dili olaraq C istifadə edildi. Belə bir kompilyator tərəfindən yaradılan C kodu ümumiyyətlə insanlar tərəfindən oxunaqlı və qorunub saxlanılmasını nəzərdə tutmur girinti tərzi və olduqca C ara kodunun yaradılması nəzərə alınmır. C dilini yaxşı bir hədəf dili halına gətirən bəzi xüsusiyyətlərə daxildir # xətt directive, which can be generated by the compiler to support ayıklama of the original source, and the wide platform support available with C compilers.

While a common compiler type outputs machine code, there are many other types:

Həmçinin bax

İstinadlar

  1. ^ PC Mag Staff (28 February 2019). "Encyclopedia: Definition of Compiler". PCMag.com. Alındı 28 fevral 2017.
  2. ^ a b Tərtib edənlər: prinsiplər, üsullar və alətlər by Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman - Second Edition, 2007
  3. ^ Sun, Chengnian; Le, Vu; Zhang, Qirun; Su, Zhendong (2016). "Toward Understanding Compiler Bugs in GCC and LLVM". ACM.
  4. ^ lecture notesCompilers: Principles, Techniques, and ToolsJing-Shin ChangDepartment of Computer Science & Information EngineeringNational Chi-Nan University
  5. ^ Naur, P. et al. "Report on ALGOL 60". ACM rabitəsi 3 (May 1960), 299–314.
  6. ^ Chomsky, Noam; Lightfoot, David W. (2002). Sintaktik quruluşlar. Walter de Gruyter. ISBN 978-3-11-017279-9.
  7. ^ Gries, David (2012). "Appendix 1: Backus-Naur Form". Proqramlaşdırma Elmi. Springer Science & Business Media. səh. 304. ISBN 978-1461259831.
  8. ^ Iverson, Kenneth E. (1962). Proqramlaşdırma dili. John Wiley & Sons. ISBN 978-0-471430-14-8.
  9. ^ Backus, John. "The history of FORTRAN I, II and III" (PDF). Proqramlaşdırma Dillərinin Tarixi. Softwarepreservation.org.
  10. ^ Porter Adams, Vicki (5 October 1981). "Captain Grace M. Hopper: the Mother of COBOL". InfoWorld. 3 (20): 33. ISSN 0199-6649.
  11. ^ McCarthy, J.; Brayton, R.; Edwards, D .; Fox, P.; Hodes, L.; Luckham, D.; Maling, K.; Park, D .; Russell, S. (March 1960). "LISP I Programmers Manual" (PDF). Boston, Massachusetts: Artificial Intelligence Group, M.I.T. Computation Center and Research Laboratory.
  12. ^ Compilers Principles, Techniques, & Tools 2nd edition by Aho, Lam, Sethi, Ullman ISBN 0-321-48681-1
  13. ^ Hopper, Grace Murray (1952). "The Education of a Computer". Proceedings of the 1952 ACM National Meeting (Pittsburgh): 243–249. doi:10.1145/609784.609818. S2CID 10081016.
  14. ^ Ridgway, Richard K. (1952). "Compiling routines". Proceedings of the 1952 ACM National Meeting (Toronto): 1–5. doi:10.1145/800259.808980. S2CID 14878552.
  15. ^ "Recursive Functions of Symbolic Expressions and Their Computation by Machine", Communications of the ACM, April 1960
  16. ^ McCarthy, John; Abrahams, Paul W.; Edwards, Daniel J.; Hart, Timothy P.; Levin, Michael I. (1965). Lisp 1.5 Programmers Manual. MIT Press. ISBN 9780262130110.
  17. ^ "BCPL: A tool for compiler writing and system programming" M. Richards, University Mathematical Laboratory Cambridge, England 1969
  18. ^ BCPL: The Language and Its Compiler, M Richards, Cambridge University Press (first published 31 December 1981)
  19. ^ The BCPL Cintsys and Cintpos User Guide, M. Richards, 2017
  20. ^ Corbató, F. J.; Vyssotsky, V. A. "Introduction and Overview of the MULTICS System". 1965 Fall Joint Computer Conference. Multicians.org.
  21. ^ Report II of the SHARE Advanced Language Development Committee, 25 June 1964
  22. ^ Multicians.org "The Choice of PL/I" article, Editor /tom Van Vleck
  23. ^ "PL/I As a Tool for System Programming", F.J. Corbato, Datamation 6 May 1969 issue
  24. ^ "The Multics PL/1 Compiler", R. A. Freiburghouse, GE, Fall Joint Computer Conference 1969
  25. ^ Datamasiya column, 1969
  26. ^ Dennis M. Ritchie, "The Development of the C Language", ACM Second History of Programming Languages Conference, April 1993
  27. ^ S.C. Johnson, "a Portable C Compiler: Theory and Practice", 5th ACM POPL Symposium, January 1978
  28. ^ A. Snyder, A Portable Compiler for the Language C, MIT, 1974.
  29. ^ K. Nygarard, University of Oslo, Norway, "Basic Concepts in Object Oriented Programming", SIGPLAN Notices V21, 1986
  30. ^ B. Stroustrup: "What is Object-Oriented Programming?" Proceedings 14th ASU Conference, 1986.
  31. ^ Bjarne Stroustrup, "An Overview of the C++ Programming Language", Handbook of Object Technology (Editor: Saba Zamir, ISBN 0-8493-3135-8)
  32. ^ Leverett, Cattell, Hobbs, Newcomer, Reiner, Schatz, Wulf: "An Overview of the Production Quality Compiler-Compiler Project", CMU-CS-89-105, 1979
  33. ^ W. Wulf, K. Nori, "Delayed binding in PQCC generated compilers", CMU Research Showcase Report, CMU-CS-82-138, 1982
  34. ^ Joseph M. Newcomer, David Alex Lamb, Bruce W. Leverett, Michael Tighe, William A. Wulf - Carnegie-Mellon University and David Levine, Andrew H. Reinerit - Intermetrics: "TCOL Ada: Revised Report on An Intermediate Representation for the DOD Standard Programming Language", 1979
  35. ^ William A. Whitaker, "Ada - the project: the DoD High Order Working Group", ACM SIGPLAN Notices (Volume 28, No. 3, March 1991)
  36. ^ CECOM Center for Software Engineering Advanced Software Technology, "Final Report - Evaluation of the ACEC Benchmark Suite for Real-Time Applications", AD-A231 968, 1990
  37. ^ P.Biggar, E. de Vries, D. Gregg, "A Practical Solution for Scripting Language Compilers", submission to Science of Computer Programming, 2009
  38. ^ M.Hall, D. Padua, K. Pingali, "Compiler Research: The Next 50 Years", ACM Communications 2009 Vol 54 #2
  39. ^ Cooper and Torczon 2012, p. 8
  40. ^ Lattner, Chris (2017). "LLVM". In Brown, Amy; Wilson, Greg (eds.). The Architecture of Open Source Applications. Arxivləndi 2 dekabr 2016-cı il tarixli orijinaldan. Alındı 28 fevral 2017.
  41. ^ Aho, Lam, Sethi, Ullman 2007, p. 5-6, 109-189
  42. ^ Aho, Lam, Sethi, Ullman 2007, p. 111
  43. ^ Aho, Lam, Sethi, Ullman 2007, p. 8, 191-300
  44. ^ a b Blindell, Gabriel Hjort (3 June 2016). Instruction selection : principles, methods, and applications. İsveçrə. ISBN 9783319340197. OCLC 951745657.
  45. ^ Cooper and Toczon (2012), p. 540
  46. ^ Aycock, John (2003). "A Brief History of Just-in-Time". ACM Hesablama. Surv. 35 (2, June): 93–113. doi:10.1145/857076.857077. S2CID 15345671.[birincil olmayan mənbəyə ehtiyac var]
  47. ^ Swartz, Jordan S.; Betz, Vaugh; Rose, Jonathan (22–25 February 1998). "A Fast Routability-Driven Router for FPGAs" (PDF). FPGA '98 Proceedings of the 1998 ACM/SIGDA Sixth International Symposium on Field Programmable Gate Arrays. Monterey, CA: ACM: 140–149. doi:10.1145/275107.275134. ISBN 978-0897919784. S2CID 7128364. Arxivləndi (PDF) from the original on 9 August 2017.
  48. ^ Xilinx Staff (2009). "XST Synthesis Overview". Xilinx, Inc. Arxivləndi 2 Noyabr 2016 tarixində orijinaldan. Alındı 28 fevral 2017.[birincil olmayan mənbəyə ehtiyac var]
  49. ^ Altera Staff (2017). "Spectra-Q™ Engine". Altera.com. Arxivləşdirilib orijinal 10 oktyabr 2016-cı il tarixində. Alındı 28 fevral 2017.[birincil olmayan mənbəyə ehtiyac var]
  50. ^ "Language Translator Tutorial" (PDF). Washington Universiteti.

Əlavə oxu

xarici linklər

Pin
Send
Share
Send