Derleyici yazmayı öğrenme [kapalı]


699

Tercih edilen diller : C / C ++, Java ve Ruby.

Sadece eğitim amaçlı kendi derleyicinizi nasıl yazacağınıza dair bazı yararlı kitaplar / eğiticiler arıyorum. En çok C / C ++, Java ve Ruby ile tanışıyorum, bu yüzden bu üç taneden birini içeren kaynakları tercih ediyorum, ancak herhangi bir iyi kaynak kabul edilebilir.


ANTLR sonuna kadar. Aşağıda önerilen tüm kaynaklar bana aşırı yüklenilmiş gibi geliyor. ANTLR her zaman bir derleyici tasarımcısı en iyi arkadaşıdır. A
A_Var

Ana odak noktanız genel olarak fikirlerin nasıl çalıştığını öğrenmekse - Şema (Liste) 'de bulunan ama genel ilkeleri öğreten SICP'in Bilgisayarın Yapılandırılmış Yorumunu kontrol edip kısaltabilirsiniz. mitpress.mit.edu/sicp . Bu kitabı bir şirkette çalışan ve bu işleri derleme ve yaşamak için yorumlayan bir gazi önerdi!
Nishant

Utanmaz bir fiş: benzer bir soruya cevabım .
9000

Blogumda bir derleyici oluşturma hakkında bir makale yazdım: orangejuiceliberationfront.com/how-to-write-a-compiler Gerçekten çok temellere ve çalışmaya başlar. Burada daha fazla derleyici / codegen / ayrıştırıcı / dil tasarımıyla ilgili makale var.
uliwitness

Yanıtlar:


1085

Kaynakların Büyük Listesi:

Açıklama:

  • ¶ Bir PDF dosyasına bağlantı
  • $ Basılı bir kitabın bağlantısı

22
Let's Build a Compiler[ Compilers.iecc.com/crenshaw/] serisini okudum , gerçekten güzel bir yazı ve iyi bir başlangıç ​​noktası.
TheVillageIdiot

5
Bahsetmeye değer bir şey, Coursera'nın derleyiciler dersidir. Güzel videolar var ve java gibi bir dil / basit derleyici oluşturarak yürüyor.
Coursera

1
Bu cevabı olabildiğince orijinal olarak yayınlamak istedim, bu yüzden bu referansı buraya göndermeye karar verdim: tutorialspoint.com/compiler_design/index.htm Bu site hakkında beğendiğim şey, aslında herhangi bir kod yazmayla ilgilenmemesi. derleyici oluşturmak için, ancak derleyiciyi parçalarına ayırır: aşamalar ve aşamalar. Rastgele bir dil ve alfabenin gösterimlerini ifade ettiği için herhangi bir dil paradigması olmadan mantık ve algoritmik tasarım yaklaşımını açıklar. Hızlı bir okumadır, ancak her bölüm için neyin gerekli olduğu kavramlarını verir.
Francis Cugler

70

Bu oldukça belirsiz bir soru, sanırım; sadece konunun derinliği nedeniyle. Ancak bir derleyici iki ayrı parçaya ayrılabilir; bir üst yarı ve bir alt bir. Üst yarı genellikle kaynak dili alır ve onu bir ara temsile dönüştürür ve alt yarı platforma özgü kod üretimiyle ilgilenir.

Bununla birlikte, bu konuya (en azından derleyiciler sınıfımda kullandığımız) kolay bir yol için bir fikir, derleyiciyi yukarıda açıklanan iki parçaya inşa etmektir. Özellikle, sadece üst yarıyı oluşturarak tüm süreç hakkında iyi bir fikir edineceksiniz.

Sadece üst yarıyı yapmak, sözlü çözümleyiciyi ve ayrıştırıcıyı yazma deneyimine sahip olmanızı ve bazı "kod" üretmeye gitmenizi sağlar (bahsettiğim ara gösterim). Bu yüzden kaynak programınızı alıp başka bir temsile dönüştürecek ve bir derleyicinin kalbi olan bazı optimizasyonları yapacaksınız (isterseniz). Alt kısım daha sonra bu ara temsili alacak ve programı belirli bir mimaride çalıştırmak için gerekli baytları üretecektir. Örneğin, alt yarısı ara temsilinizi alır ve bir PE yürütülebilir dosyası oluşturur.

Bu konuda özellikle yararlı bulduğum bazı kitaplar Derleyiciler Prensipleri ve Teknikleri (veya kapaktaki sevimli ejderha nedeniyle Ejderha Kitabı) idi. Harika bir teori var ve kesinlikle Bağlamsız Gramerleri gerçekten erişilebilir bir şekilde kapsıyor. Ayrıca, sözcüksel analizörü ve ayrıştırıcıyı oluşturmak için muhtemelen * nix araçlarını lex ve yacc kullanacaksınız. Ve ilginç bir şekilde, " lex ve yacc " adlı kitap , Dragon Book'un bu bölüm için kaldığı yerden aldı.


55

Ben ML Modern Derleyici Uygulaması metin yazma en iyi giriş derleyici olduğunu düşünüyorum . Bir Java sürümü ve bir C sürümü var de vardır, bu dillerden herhangi biri dillerinizin geçmişi göz önüne alındığında daha erişilebilir olabilir. Kitap, bir çok yararlı temel materyal (tarama ve ayrıştırma, semantik analiz, aktivasyon kayıtları, talimat seçimi, RISC ve x86 yerel kod üretimi) ve çeşitli "ileri" konuları (OO ve fonksiyonel diller, polimorfizm, çöp toplama, optimizasyon ve tek statik atama formu) nispeten az alana (~ 500 sayfa).

Ejderha kitabına Modern Derleyici Uygulamasını tercih ediyorum çünkü Modern Derleyici uygulaması daha az alan araştırıyor - bunun yerine ciddi, iyi bir derleyici yazmak için ihtiyacınız olan tüm konuları gerçekten sağlam bir şekilde kapsıyor. Bu kitap üzerinde çalıştıktan sonra, ihtiyaç duyduğunuzda araştırma kağıtlarını doğrudan daha derinlemesine ele almaya hazır olacaksınız.

İtiraf etmeliyim ki Niklaus Wirth'in Derleyici İnşaatı için ciddi bir yumuşak noktam var . Çevrimiçi olarak kullanılabilir PDF olarak. Wirth'in programlama estetiğini çok güzel buluyorum, ancak bazı insanlar tarzını çok az buluyor (örneğin Wirth, özyinelemeli iniş ayrıştırıcılarını destekliyor, ancak CS derslerinin çoğu ayrıştırıcı jeneratör araçlarına odaklanıyor; Wirth'in dil tasarımları oldukça muhafazakar.) Derleyici İnşaat çok özlü bir damıtmadır. Wirth'in temel fikirlerinin



"Modern Derleyici Uygulaması" nın C sürümüne karşı şiddetle tavsiye ederim , C nedeniyle düşük seviyeli detaylar tarafından sakatlanmıştır. Java 1, OO tasarımı zayıf olduğu için çok iyi değil, Java 2nd ed artık Tiger dili ile ilgili değil. Bu yüzden ML'yi şiddetle tavsiye ederim: anlamak için ML'de akıcı olmak gerekli değildir. ML kesinlikle işe çok uygundur.
akim

44

Dragon Book referansına katılıyorum; IMO, derleyici yapımı için kesin bir kılavuzdur. Yine de bazı sert teorilere hazır olun.

Teori konusunda daha açık bir kitap istiyorsanız, Game Scripting Mastery sizin için daha iyi bir kitap olabilir. Eğer derleyici teorisinde tam bir acemi iseniz, daha nazik bir giriş sağlar. Daha pratik ayrıştırma yöntemlerini kapsamaz (LL veya LR ayrıştırmadan bahsetmeden tahmini olmayan özyinelemeli iniş tercih etmek) ve hatırladığım gibi, herhangi bir optimizasyon teorisini bile tartışmıyor. Ayrıca, makine kodunu derlemek yerine, yazdığınız bir VM'de çalışması gereken bir bayt kodunu derler.

Özellikle Amazon'da ucuza alabiliyorsanız, hala iyi bir okuma. Derleyicilere sadece kolay bir giriş yapmak istiyorsanız, Game Scripting Mastery gitmek için kötü bir yol değildir. Eğer önünüze sert gitmek istiyorsanız, Ejderha Kitabından daha azına razı olmalısınız.


1
Game Scripting Mastery harika bir öğrenme kaynağıdır çünkü işiniz bittiğinde oynanabilir, senaryo halinde bir 2D macera oyununa sahip olacaksınız. Bu, her egzersizi belirli bir amaca odaklar ve okuyucuyu motive eder.
Dour High Arch

1
Dragon biraz fazla gramer tabanlı ayrışmaya odaklanmıştır. C ++ gibi imkansız bir şeyi ayrıştırmaya çalışmıyorsanız, ancak ayrıştırıcı jeneratörleri kullanarak, ancak örneğin el işi LL dilbilgisini kullanabiliyorsanız, dilbilgisi dönüşümü ve ispatlama dışında daha yüksek bir derleyici alanlarını işleyen bir şeye dikkat etmek isteyebilirsiniz
Marco van de Voort

27

"Bir Derleyici Yapalım" harika, ama biraz modası geçmiş. (Biraz daha az geçerli kıldığını söylemiyorum.)

Veya SLANG'a göz atın . Bu "Bir Derleyici Yapalım" ile benzerdir, ancak özellikle yeni başlayanlar için çok daha iyi bir kaynaktır. Bu size bir derleyici öğretiminde 7 adımlık bir yaklaşım alan bir pdf öğretici ile birlikte gelir. C ++, Java ve JS'de SLANG'ın çeşitli bağlantı noktalarına bağlantılara sahip olduğu için quora bağlantısını eklemek, başlangıçta C # ve .NET platformu kullanılarak yazılmış python ve java çevirmenleri.


5
Hala yararlı olsa da, bu dizinin biraz modası geçmiş olduğunu kabul ediyorum. Bununla birlikte, en büyük yakınlığım, herhangi bir ayrıştırma ağacı türü oluşturmaktan ziyade doğrudan montaj diline çıkmaya çalışması, yani (ilk makalede belirtilenlerin aksine) yazmak için çok kullanışlı olmadığı anlamına geliyor. Bir tercüman.
a_m0d

23

Her şeyi kendiniz oluşturmak yerine güçlü, daha üst düzey araçlar kullanmak istiyorsanız, bu kurs için projelere ve okumalara bakmak oldukça iyi bir seçenektir. Java ayrıştırıcı motoru ANTLR'nin yazarı tarafından bir dil kursu. Kursun kitabını Pragmatik Programcılardan PDF olarak alabilirsiniz .

Kurs, başka bir yerde göreceğiniz standart derleyici derleyici öğelerinin üzerinden geçer: ayrıştırma, türler ve tür denetimi, polimorfizm, sembol tabloları ve kod üretimi. Hemen hemen kapsanmayan tek şey optimizasyonlar. Son proje, C'nin bir alt kümesini derleyen bir programdır. . ANTLR ve LLVM gibi araçlar kullandığınız için, derleyicinin tamamını tek bir günde yazmak mümkündür (~ 24 saat demekle birlikte, bunun bir kanıtım var). Modern araçlar kullanarak pratik mühendislikte ağır, teoride biraz daha hafif.

LLVM, bu arada, sadece harika. Normalde montaj için derleyebileceğiniz birçok durumda, bunun yerine LLVM'nin Orta Temsilciliğini derlemekten çok daha iyi olursunuz . Daha yüksek seviyeli, çapraz platformlu ve LLVM, ondan optimize montaj sağlamada oldukça iyi.


İlk bağlantı öldü.
Lynn

20

Az zamanınız varsa, bir günde okuyabileceğiniz küçük bir küçük kitapçık olan Niklaus Wirth'in "Derleyici İnşaatı" (Addison-Wesley. 1996) , ancak temelleri açıklar (lexers nasıl uygulanacağı, özyinelemeli iniş ayrıştırıcıları, ve kendi yığın tabanlı sanal makineleriniz). Bundan sonra, derin bir dalış istiyorsanız, diğer yorumcuların önerdiği gibi Ejderha kitabının etrafında bir yol yoktur.


Çok zamanınız yoksa, bir derleyici yazmayın.
Ingo

17

Lex / Yacc'a (ya da ne demek isterseniz, Flex / Bison'a) bakmak isteyebilirsiniz. Flex, dilinizin anlamsal bileşenlerini ("belirteçleri") ayrıştıracak ve tanımlayacak sözcüksel bir çözümleyicidir ve her bir belirteç ayrıştırıldığında ne olacağını tanımlamak için Bison kullanılacaktır. Bu, C ile derlenecek bir derleyici için C kodunu yazdırmak veya talimatları dinamik olarak çalıştırmak olabilir, ancak kesinlikle bunlarla sınırlı değildir.

Bu SSS size yardımcı olmalıdır ve bu eğitim oldukça faydalı görünüyor.


17

Genel olarak, derleyiciler için beş dakikalık bir öğretici yoktur, çünkü bu karmaşık bir konudur ve bir derleyicinin yazılması aylar sürebilir. Kendi aramanızı yapmanız gerekecek.

Python ve Ruby genellikle yorumlanır. Belki de bir tercümanla başlamak istersiniz. Genellikle daha kolaydır.

İlk adım, programlama dilinizin dilbilgisi olan resmi bir dil açıklaması yazmaktır. Daha sonra, dilbilgisine göre derlemek veya yorumlamak istediğiniz kaynak kodunu, bilgisayarın anlayabileceği ve üzerinde çalışabileceği kaynak kodun dahili bir biçimi olan soyut bir sözdizim ağacına dönüştürmeniz gerekir. Bu adım genellikle ayrıştırma olarak adlandırılır ve kaynak kodunu ayrıştıran yazılıma ayrıştırıcı denir. Genellikle ayrıştırıcı, resmi bir dilbilgisini kaynak veya makine koduna dönüştüren bir ayrıştırıcı üreteci tarafından üretilir. Ayrıştırma işleminin matematiksel olmayan iyi bir açıklaması için Ayrıştırma Teknikleri - Pratik Bir Kılavuz öneririm. Wikipedia, sizin için uygun olanı seçebileceğiniz ayrıştırıcı jeneratörlerinin bir karşılaştırmasına sahiptir. Seçtiğiniz ayrıştırıcı üreticisine bağlı olarak,

Diliniz için bir ayrıştırıcı yazmak gerçekten zor olabilir, ancak bu dilbilginize bağlıdır. Bu yüzden dilbilginizi basit tutmanızı öneririm (C ++ 'dan farklı olarak); bunun iyi bir örneği LISP'dir.

İkinci adımda, soyut sözdizimi ağacı, bir ağaç yapısından doğrusal bir ara temsile dönüştürülür. Bu Lua'nın bayt koduna iyi bir örnek olarak sıklıkla atıfta bulunulur. Ancak ara temsil gerçekten sizin dilinize bağlıdır.

Eğer bir tercüman inşa ediyorsanız, ara gösterimi yorumlamanız yeterlidir. Ayrıca tam zamanında derleyebilirsiniz. Tam zamanında derleme için LLVM ve libjit'i tavsiye ederim. Dili kullanılabilir hale getirmek için bazı giriş ve çıkış işlevlerini ve belki de küçük bir standart kütüphaneyi de eklemeniz gerekir.

Dili derleyecekseniz, daha karmaşık olacaktır. Farklı bilgisayar mimarileri için arka uçlar yazmanız ve bu arka uçlardaki ara gösterimden makine kodu oluşturmanız gerekecektir. Bu görev için LLVM'yi öneririm.

Bu konuda birkaç kitap var, ancak bunların hiçbirini genel kullanım için öneremem. Çoğu çok akademik ya da çok pratik. "Kendinize 21 gün içinde derleyici yazmayı öğretin" diye bir şey yoktur ve bu nedenle bu konuyu daha iyi anlamak için birkaç kitap satın almanız gerekecektir. İnternette arama yaparsanız, bazı çevrimiçi kitaplar ve ders notları ile karşılaşırsınız. Belki yakınlarınızda derleyicilerden kitap ödünç alabileceğiniz bir üniversite kütüphanesi vardır.

Ayrıca, projenizi ciddiye alacaksanız, teorik bilgisayar bilimi ve grafik teorisinde iyi bir arka plan bilgisi öneriyorum. Bilgisayar bilimlerinde bir derece de yardımcı olacaktır.


++ Sen 's iyi bunların hepsini bilmek ve bu büyük bir iş olabilir bu doğru, ama ben de nasıl bazı uzmanlardan öğrendim değil şeyler büyük bir anlaşma yapmak. Bir şeyleri bilmek iyidir ve bunları ne zaman kullanmayacağınızı bilmek daha da iyidir, çoğu zaman.
Mike Dunlavey


11

Henüz önerilmeyen fakat çok önemli bir kitap John Levine'nin "Bağlayıcılar ve Yükleyiciler" dir . Harici bir birleştirici kullanmıyorsanız, son programınıza bağlanabilecek bir nesne dosyası çıkarmanın bir yoluna ihtiyacınız olacaktır. Harici bir montajcı kullanıyor olsanız bile, muhtemelen yer değiştirmeleri ve çalışan bir program yapmak için tüm program yükleme işleminin nasıl çalıştığını anlamanız gerekir. Bu kitap, Win32 ve Linux da dahil olmak üzere çeşitli sistemler için bu işlemin çevresinde rastgele bir sürü şey toplar.


10

Ejderha Kitabı kesinlikle "bina derleyicileri" kitabıdır, ancak diliniz şu anki dil nesli kadar karmaşık değilse, Tasarım Desenlerinden Yorumlayıcı desenine bakmak isteyebilirsiniz .

Kitaptaki örnek düzenli ifade benzeri bir dil tasarlar ve iyi düşünülür, ancak kitapta söyledikleri gibi, süreç boyunca düşünmek için iyidir, ancak gerçekten sadece küçük dillerde etkilidir. Bununla birlikte, bu desenle küçük bir dil için bir Tercüman yazmak, tüm farklı ayrıştırıcılar, yacc ve lex, et cetera türleri hakkında bilgi almaktan çok daha hızlıdır ...


10

LLVM kullanmaya hazırsanız, şuna bakın: http://llvm.org/docs/tutorial/ . LLVM'nin çerçevesini kullanarak bir derleyiciyi sıfırdan nasıl yazacağınızı öğretir ve konu hakkında herhangi bir bilginiz olduğunu varsaymaz.

Öğretici, kendi ayrıştırıcı ve lexer vb yazmanızı önerir, ancak fikri aldıktan sonra bizon ve esnekliğe bakmanızı öneririm. Hayatı çok daha kolay hale getiriyorlar.


Ancak Visual Studio'yu kurma belgeleri kötü yazılmış, artı örnek yok
SpicyWeenie

10

Dragon kitabını, pratikte bir derleyici yazmak için gerçekten gerekli olmayan dil teorisine çok fazla odaklanarak okumak için çok zor buldum.

İnanılmaz derecede hızlı ve basit bir Oberon derleyici Project Oberon'un tam kaynağını içeren Oberon kitabını ekleyeceğim .

Alternatif metin


10

Bu soruyu yaklaşık yedi yıl önce programlama konusunda yeni olduğumu sorduğumu hatırlıyorum.

Sorduğumda çok dikkatliydim ve şaşırtıcı bir şekilde buraya geldiğiniz kadar fazla eleştiri almadım. Ancak beni " Ejderha Kitabı " " bir derleyici yazmak için bilmeniz gereken her şeyi açıklayan gerçekten harika bir kitap (elbette bir veya iki dilde ustalaşmanız gerekecek. bildiğiniz diller, merrier.).

Ve evet, birçok kişi bu kitabı okumanın çılgın olduğunu söylüyor ve bundan hiçbir şey öğrenmeyeceksin, ama buna tamamen katılmıyorum.

Birçok insan derleyici yazmanın aptalca ve anlamsız olduğunu da söyler. Derleyici geliştirmenin yararlı olmasının birkaç nedeni vardır:

  • Çünkü eğlenceli.
  • Eğitimcidir, derleyicileri nasıl yazacağınızı öğrenirken bilgisayar bilimi ve diğer uygulamaları yazarken yararlı olan diğer teknikler hakkında çok şey öğreneceksiniz.
  • Hiç kimse derleyici yazmazsa, mevcut diller daha iyi olamazdı.

Kendi derleyicimi hemen yazmadım, ama sorduktan sonra nereden başlayacağımı biliyordum. Ve şimdi, birçok farklı dil öğrendikten ve Ejderha Kitabını okuduktan sonra, yazmak o kadar da sorun değil. (Ayrıca bilgisayar mühendisliği atm okuyorum, ancak programlama hakkında bildiklerimin çoğu kendi kendine öğretiliyor.)

Sonuç olarak, Ejderha Kitabı harika bir "öğretici". Ancak derleyici yazmaya çalışmadan önce bir ya da iki dili öğrenmek için biraz zaman ayırın. Önümüzdeki on yıl içinde derleyici gurusu olmayı beklemeyin.

Ayrıştırıcı / tercüman yazmayı öğrenmek istiyorsanız kitap da iyidir.


9

"... Bir Derleyici Yapalım ..."

@Sasb tarafından ikinci http://compilers.iecc.com/crenshaw/ olurdum . Şu an için daha fazla kitap almayı unutun.

Neden? Araçlar ve dil.

Gerekli dil Pascal'dır ve doğru hatırlamıyorsam Turbo-Pascal'a dayanır. Http://www.freepascal.org/ adresine gidip Pascal derleyicisini indirirseniz tüm örnekler doğrudan sayfadan çalışır ~ http://www.freepascal.org/download.var Free hakkında en güzel şey Pascal, bakabileceğiniz neredeyse işlemci veya işletim sistemini kullanabilirsiniz.

Derslere hakim olduktan sonra daha gelişmiş " Ejderha Kitabı " nı deneyin ~ http://en.wikipedia.org/wiki/Dragon_book


9

Aynı kavramı inceliyorum ve Joel Pobar'ın bu umut verici makalesini buldum,

.NET Framework için bir Dil Derleyici oluşturun - bunun nereye gittiğinden emin değilim

.NET Framework için Dil Derleyicisi Oluşturma - Orijinal belgenin pdf kopyası

yüksek düzeyde bir derleyici kavramını tartışır ve .Net çerçevesi için kendi dilini icat etmeye devam eder. Her ne kadar .Net Framework'ü hedeflese de, kavramların birçoğu çoğaltılabilmelidir. Makale şunları kapsamaktadır:

  1. Dil tanımı
  2. Tarayıcı
  3. Ayrıştırıcı (biraz ilgilendiğim bit)
  4. Net Çerçevesini Hedefleme
  5. Kod üreteci

başka konular var, ama haklısın.

C # ile yazılmış insanlara yöneliktir (Java değil)

HTH

kemikler


"Tam Java değil" ne anlama geliyor?
Hejazzman

haha, özür dilerim, ben esas olarak java benzer. Net için yazılmış demekti. Her ikisi de JIT tarzında. :)
dbones

8

Bir derleyici oluşturmanın kolay bir yolu, bizon ve flex (veya benzeri) kullanmak, bir ağaç (AST) oluşturmak ve C'de kod oluşturmaktır. C kodu oluşturmak en önemli adımdır. C kodu oluşturarak, diliniz otomatik olarak C derleyicisi olan tüm platformlarda çalışır.

C kodu oluşturmak HTML oluşturmak kadar kolaydır (sadece print veya eşdeğerini kullanın), bu da C ayrıştırıcısı veya HTML ayrıştırıcısı yazmaktan çok daha kolaydır.


8

Gönderen comp.compilers SSS :

"Kişisel Bilgisayar Programlama" Per Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

Bu maalesef başlıklı kitap, Edison adlı Pascal benzeri bir dil kullanarak, mikro kullanıcılar için tek kullanıcılı bir programlama ortamının tasarımını ve oluşturulmasını açıklıyor. Yazar, bir Edison derleyicisinin ve basit destekleyici işletim sisteminin adım adım uygulanması için tüm kaynak kodlarını ve açıklamalarını sunar, hepsi Edison'un kendisinde yazılmıştır (PDP 11/23 için sembolik bir montajcıda yazılmış küçük bir destekleyici çekirdek hariç; IBM PC için tam kaynak da sipariş edilebilir).

Bu kitapla ilgili en ilginç şeyler şunlardır: 1) tam, kendi kendine yeten, kendi kendini koruyan, yararlı bir derleyici ve işletim sisteminin nasıl oluşturulacağını gösterme yeteneği ve 2) dil tasarımı ve şartname sorunları ve ticaretinin ilginç tartışması- Bölüm 2'deki kesintiler.

"Brinch Hansen Pascal Derleyicilerinde" yazan Per Brinch Hansen Prentice-Hall 1985 ISBN 0-13-083098-4

Bir başka teorik ışık pragmatik ağır-burada-nasıl kodlanır kitap. Yazar, boolean ve tamsayı türlerine sahip bir Pascal altkümesi olan Pascal- (Pascal "eksi") için bir derleyici ve p-kod yorumlayıcısı için tasarım, uygulama ve tam kaynak kodunu sunar (ancak karakter, real, alt veya numaralandırılmış türler içermez) , sabit ve değişken tanımları ve dizi ve kayıt türleri (ancak paketlenmiş, değişken, küme, işaretçi, adsız, yeniden adlandırılmış veya dosya türleri), ifadeler, atama ifadeleri, değer ve değişken parametreleri içeren iç içe yordam tanımları, if ifadeleri, while ifadeleri, ve başlangıç-bitiş blokları (ancak fonksiyon tanımları, prosedür parametreleri, goto ifadeleri ve etiketleri, vaka ifadeleri, tekrar ifadeleri, ifadeler için ve ifadelerle birlikte).

Derleyici ve yorumlayıcı, yazılım geliştirme sistemleri oluşturmak için bazı Edison tarzı özelliklerle genişletilen bir Pascal alt kümesi olan Pascal * (Pascal "yıldızı") ile yazılmıştır. IBM PC için bir Pascal * derleyicisi yazar tarafından satılır, ancak kitabın Pascal derleyicisini herhangi bir kullanışlı Pascal platformuna taşımak kolaydır.

Bu kitap, bir derleyicinin tasarımını ve uygulamasını kolaylaştırır. Özellikle yazarın kalite, güvenilirlik ve test ile ilgisini seviyorum. Derleyici ve yorumlayıcı, özellikle bir şeyi hızlı bir şekilde hazır hale getirmek için baskı altındaysanız, daha ilgili bir dil veya derleyici projesinin temeli olarak kolayca kullanılabilir.


8

Darius Bacon'un , C'yi hedefleyen küçük bir Lisp lehçesi için derleyici olan " ichbins " i 6 sayfalık kodun üzerinde incelemelisiniz. Çoğu oyuncak derleyiciye göre avantajı, dilin derleyicinin içine yazılmasına yetecek kadar eksiksiz olmasıdır. (Tarball ayrıca bir şey önyüklemek için bir tercüman içerir.)

Ur-Scheme web sayfamda derleyici yazmayı öğrenmede faydalı bulduğum daha fazla şey var .


8
  1. Bu çok geniş bir konu. Bu noktayı hafife almayın. Ve onu küçümsememe konusundaki düşüncemi küçümseme.
  2. Dragon Book'un arama ile birlikte başlamak için (?) Bir yer olduğunu duydum . :) Aramada daha iyi ol, sonunda hayatın olacak.
  3. Kendi programlama dilinizi oluşturmak kesinlikle iyi bir alıştırmadır! Ama sonunda hiçbir zaman pratik bir amaç için kullanılmayacağını bilin. Bunun istisnaları çok az ve çok uzak.

4
Ejderha kitabını okumadıysanız. Lütfen tavsiye etmeyin. Aslında, hiç derleyici uyguladınız mı?

Evet, adından da anlaşılacağı gibi, Ejderha Kitabı bir canavardır. Çok derinlemesine ama yine de çok iyi bir kaynak. Yine de yeni başlayanlar için tavsiye etmem ...
Zachary Murray

2
@Neil: Beni Google'da görmedin, değil mi? lol. blog.280z28.org Ama hayır, o kitabı okumadım.
Sam Harwell

Şu anda (ejderha kitabı) okuyorum ve aynı zamanda Lex / Yacc da kitabı oldukça iyi buluyorum. Şahsen.
Simeon Pilgrim

1
Adil olmak gerekirse, bunu "Duyuyorum ..." ile önceden yaptım. :) # 1 ve # 3, girmeyi bilmek son derece önemlidir, ancak sık sık belirtilmez.
Sam Harwell

8

Fraser ve Hanson'un LCC derleyicisi ( wikipedia ) ( proje ana sayfası ) ( github.com/drh/lcc ) "Yeniden Geciktirilebilir C Derleyicisi: Tasarım ve Uygulama" başlıklı kitapta açıklanmıştır. Oldukça okunabilir ve kod oluşturmaya kadar tüm derleyiciyi açıklar.


Bu çok iyi bir kaynak gibi görünüyor teşekkürler.
gideon

7

Python, Python'da yazılmış bir python derleyicisiyle birlikte gelir. Kaynak kodunu görebilirsiniz ve ayrıştırma, soyut sözdizimi ağacı, yayan kod vb. Tüm aşamaları içerir.


7

Üzgünüz, İspanyolca, ama bu Arjantin'de "Compiladores e Intérpretes" (Derleyiciler ve Tercümanlar) adlı bir dersin bibliyografyasıdır.

Kurs, resmi dil teorisinden derleyici yapımına kadar idi ve bunlar en azından basit bir derleyici oluşturmanız gereken konulardı:

  • C.
    Allen I. Holub

    Prentice-Hall'da Derleyici Tasarımı . 1990.

  • Compiladores. Teoría y Construcción.
    Sanchís Llorca, FJ, Galán Pascual, C. Editoryal Paraninfo. 1988'de tarif edilmiştir.

  • Derleyici Yapımı.
    Niklaus Wirth

    Addison-Wesley. 1996 =.

  • Lenguajes, Gramáticas y Autómatas. Un enfoque práctico.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán. Addison-Wesley Iberoamericana (İspanya). 1997.

  • Derleyici tasarım sanatı. Teori ve pratik.
    Thomas Pittman, James Peters.

    Prentice-Hall. 1992.

  • Nesneye Dayalı Derleyici Yapısı.
    Jim Holmes.
    Prentice Hall, Englewood Kayalıkları, NJ 1995

  • Compiladores. Conceptos Temelleri.
    B. Teufel, S. Schmidt, T. Teufel.

    Addison-Wesley Iberoamericana. 1995.

  • Otomata Teorisine, Dillere ve Hesaplamaya Giriş.

    John E.Hopcroft. Jeffref D. Ullman.
    Addison-Wesley. 1979.

  • Biçimsel dillere giriş.
    György E. Révész.

    Mc Graw Hill. 1983.

  • Ayrıştırma Teknikleri. Pratik bir rehber.
    Dick Grune, Ceriel Jacobs.
    Impreso por los autores. 1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc: Yine Bir Derleyici-Derleyici.
    Stephen C. Johnson
    Bilgisayar Bilimi Teknik Raporu Nº 32, 1975. Bell Laboratuvarları. Murray Hill, New
    Jersey.

  • Lex: Bir Lexical Analyzer Generator.
    ME Lesk, E. Schmidt. Bilişim Bilimi Teknik Raporu Nº 39, 1975. Bell Laboratuvarları. Murray Hill, New Jersey.

  • lex & yacc.
    John R. Levine, Tony Mason, Doug Brown.
    O'Reilly ve Ortakları. 1995.

  • Hesaplama teorisinin unsurları.
    Harry R. Lewis, Christos H. Papadimitriou. Segunda Edición. Prentice Salonu. 1998.

  • Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Control.
    Salvador V. Cavadini.
    Trabajo Final de Grado para obtener el Título de Ingeniero en Computación.
    Facultad de Matemática Aplicada. UCSE 2001.


6

Derleyiciler (ve meta derleyiciler) hakkında daha fazla bilgi edinmek istiyorsanız, bir kitap değil, teknik bir makale ve çok eğlenceli bir öğrenme deneyimi ... Bu web sitesi, kendisini ve diğer dilleri derleyebilen tamamen bağımsız bir derleyici sistemi oluşturmanıza yardımcı olur:

Eğitim: Metacompilers Bölüm 1

Bunların hepsi inanılmaz küçük bir 10 sayfalık teknik kağıda dayanmaktadır:

Val Schorre META II: Sözdizim Odaklı Derleyici Yazma Dili

1970 yılında bu derleyiciden nasıl derleyici oluşturulacağını öğrendim. Sonunda derleyicinin kendini nasıl yenileyebileceğini anladığınız için akıllara durgunluk veren bir an var ....

Web sitesi yazarını üniversite günlerimden biliyorum, ancak web sitesiyle hiçbir ilgim yok.


Diğerlerinin söylediği gibi, BÜYÜK bir argüman, suşi bir görev lisans için son bir çalışma olduğunu düşünüyorum, matematik, bilgisayar bilimi ve benzeri kavramları bir sürü bilmek gerektirir.
ingconti

Bu konuları bilmiyorsanız, ciddi bir derleyici oluşturmaya çalışmamalısınız. Ancak, 2-3 yıllık lisans bilgisayar bilimleri eğitiminiz varsa (programlama, veri yapıları, montaj dili), MetaII belgesi sizin için çalışacaktır.
Ira Baxter

5

Crenshaw öğreticisini de beğendim , çünkü bir derleyicinin sadece bazı girişleri okuyan ve bazılarını yazan başka bir program olduğunu kesinlikle açıkça ortaya koyuyor.

Oku onu.

İsterseniz çalışın, ancak daha sonra daha büyük ve daha eksiksiz derleyicilerin gerçekten nasıl yazıldığına dair başka bir referansa bakın.

Ve bu alanda yapılabilecek açık olmayan şeyler hakkında bir ipucu almak için On Trusting Trust'ı okuyun .


5

İşlevsel bir dil için (yordamsal bir dil yerine) bir derleyici yazmakla ilgileniyorsanız, Simon Peyton-Jones ve David Lester'ın " İşlevsel dilleri uygulama: bir öğretici " mükemmel bir rehberdir.

İşlevsel değerlendirmenin nasıl çalıştığının kavramsal temelleri, "Temel" adı verilen basit ama güçlü bir işlevsel dilde örneklerle yönlendirilir. Ayrıca, Çekirdek dil derleyicisinin her bir kısmı Miranda'daki (Haskell'e çok benzeyen saf işlevsel bir dil) kod örnekleri ile açıklanmaktadır.

Birkaç farklı derleyici türü tanımlanmıştır, ancak yalnızca Core için şablon derleyiciyi takip etseniz bile, fonksiyonel programlama işaretini neyin yaptığını mükemmel bir şekilde anlayacaksınız.


5

BCEL'i Apache Yazılım Vakfı tarafından kullanabilirsiniz . Bu araçla, birleştirici benzeri kod oluşturabilirsiniz, ancak BCEL API ile Java'dır. Ara dil kodunu nasıl oluşturabileceğinizi öğrenebilirsiniz (bu durumda bayt kodu).

Basit örnek

  1. Bu işlevle bir Java sınıfı oluşturun:

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

Şimdi bu sınıfla BCELifier'ı çalıştırın

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

Sonucu tüm sınıf için konsolda görebilirsiniz (bayt kodu MyClass.java nasıl oluşturulur). İşlevin kodu şudur:

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

5

Burada çok iyi yanıtlar var, bu yüzden listeye bir tane daha ekleyeceğimi düşündüm:

On yıldan fazla bir süre önce Project Oberon adında, derleyici üzerinde çok iyi yazılmış bir metin olan bir kitabım var. Kitap gerçekten kaynağın ve açıklamaların çok açık ve okunabilir olması anlamında dikkat çekiyor. Metnin tamamı (2005 baskısı) pdf olarak sunuldu, böylece hemen indirebilirsiniz. Derleyici bölüm 12'de ele alınmıştır:

http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Niklaus Wirth, Jürg Gutknecht

(Tedavi derleyiciler hakkındaki kitabı kadar geniş değildir)

Derleyicilerle ilgili birkaç kitap okudum ve ejderha kitabını ikinci sürebilirim, bu kitap için harcanan zaman çok değerli.


4

Şu ana kadar listede yer almayan bu kitap:

Derleyici Tasarımının Temelleri (Torben Mogensen) (Kopenhag Üniversitesi Bilgisayar Bilimleri Bölümü'nden)

Derleyiciler hakkında bilgi edinmek ve önümüzdeki birkaç yıl içinde bu sektöre girmeyi planlamakla ilgileniyorum. Bu kitap derleyicileri görebildiğim kadarıyla öğrenmeye başlamak için ideal bir teori kitabı. Temiz ve dikkatli bir şekilde yazılmış ve kopyalamak ve çoğaltmak ÜCRETSİZDİR ve herhangi bir kod olmadan düz İngilizce olarak size verir, ancak yine de mekanik talimatlar ve diyagramlar vb. Yoluyla sunar. Bir göz imo.


Listeye eklendi thanks :)
Anton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.