Belajar menulis kompiler [ditutup]

699

Bahasa yang disukai : C / C ++, Java, dan Ruby.

Saya mencari beberapa buku / tutorial bermanfaat tentang cara menulis kompiler Anda sendiri hanya untuk tujuan pendidikan. Saya paling akrab dengan C / C ++, Java, dan Ruby, jadi saya lebih suka sumber daya yang melibatkan salah satu dari ketiganya, tetapi sumber daya yang bagus bisa diterima.

Anton
sumber
ANTLR sepanjang jalan. Semua sumber daya yang diusulkan di bawah ini terlihat seperti kerja keras bagiku. ANTLR selalu menjadi teman terbaik desainer compiler. A
A_Var
Jika fokus utama Anda adalah mempelajari bagaimana menyusun ide-ide bekerja secara umum - Anda dapat memeriksa dan SICP kependekan dari Program Komputer Interpretasi Terstruktur yang berbasis di Skema (Daftar) tetapi mengajarkan prinsip-prinsip umum. mitpress.mit.edu/sicp . Saya direkomendasikan buku ini oleh seorang veteran yang bekerja untuk sebuah perusahaan dan melakukan pekerjaan kompilasi dan interpretasi untuk mencari nafkah!
Nishant
Sumbat tak tahu malu: jawaban saya untuk pertanyaan serupa .
9000
Saya menulis artikel tentang cara membuat kompiler di blog saya: orangejuiceliberationfront.com/how-to-write-a-compiler Ini berfokus pada dasar-dasar dan memulai, sungguh. Ada banyak artikel yang berhubungan dengan kompiler / codegen / parser / bahasa desain di sana.
uliwitness

Jawaban:

1083

Daftar Sumber Daya Besar:

Legenda:

  • ¶ Tautan ke file PDF
  • $ Tautan ke buku cetak
Anton
sumber
22
Saya telah membaca seri Let's Build a Compiler[ compilers.iecc.com/crenshaw/] , ini merupakan luncuran yang sangat bagus dan merupakan titik awal yang baik.
TheVillageIdiot
5
Saya pikir satu yang layak disebut adalah kursus kompiler Coursera. Ini memiliki video yang bagus dan berjalan melalui pembuatan java like language / compiler sederhana. Tautan Kompiler Coursera
QuantumKarl
1
Saya ingin agar jawaban ini tetap asli seperti mungkin, jadi saya memutuskan untuk mengirim referensi ini di sini: tutorialspoint.com/compiler_design/index.htm Apa yang saya sukai dari situs ini adalah tidak terlibat dengan benar-benar menulis kode apa pun. untuk membuat kompiler, tetapi memecah kompiler menjadi bagian-bagiannya: fase dan tahapan. Itu menggambarkan pendekatan desain logika dan algoritmik tanpa paradigma bahasa tertentu karena mengekspresikan notasi bahasa dan alfabet sewenang-wenang. Ini adalah bacaan cepat, tetapi memberi Anda konsep apa yang dibutuhkan untuk setiap bagian.
Francis Cugler
70

Saya kira ini pertanyaan yang agak kabur; hanya karena kedalaman topik yang terlibat. Kompiler dapat didekomposisi menjadi dua bagian yang terpisah, namun; setengah atas dan bawah satu. Bagian atas umumnya mengambil bahasa sumber dan mengubahnya menjadi representasi perantara, dan bagian bawah menangani pembuatan kode platform spesifik.

Meskipun demikian, satu ide untuk cara mudah untuk mendekati topik ini (yang kami gunakan di kelas kompiler saya, setidaknya) adalah membangun kompiler dalam dua bagian yang dijelaskan di atas. Secara khusus, Anda akan mendapatkan ide bagus dari seluruh proses dengan hanya membangun setengah bagian atas.

Hanya dengan melakukan bagian atas, Anda bisa mendapatkan pengalaman menulis penganalisa leksikal dan pengurai dan membuat beberapa "kode" (representasi perantara yang saya sebutkan). Jadi itu akan mengambil program sumber Anda dan mengubahnya ke representasi lain dan melakukan beberapa optimasi (jika Anda mau), yang merupakan jantung dari sebuah kompiler. Setengah bagian bawah kemudian akan mengambil representasi perantara dan menghasilkan byte yang diperlukan untuk menjalankan program pada arsitektur tertentu. Misalnya, bagian bawah akan mengambil representasi perantara Anda dan menghasilkan PE yang dapat dieksekusi.

Beberapa buku tentang topik ini yang saya temukan sangat membantu adalah Prinsip dan Teknik Penyusun (atau Buku Naga, karena naga imut di sampul). Itu punya beberapa teori hebat dan pasti mencakup Tata Bahasa Bebas Konteks dengan cara yang benar-benar dapat diakses. Juga, untuk membangun penganalisis leksikal dan pengurai, Anda mungkin akan menggunakan * nix tools lex dan yacc. Dan tidak cukup menarik, buku berjudul " lex and yacc " mengambil di mana Dragon Book tinggalkan untuk bagian ini.

mrduclaw
sumber
55

Saya pikir Implementasi Kompiler Modern dalam ML adalah teks penulisan kompiler pengantar terbaik. Ada versi Java dan versi C. juga, yang mana mungkin lebih mudah diakses mengingat latar belakang bahasa Anda. Buku ini mengemas banyak bahan dasar yang berguna (pemindaian dan penguraian, analisis semantik, catatan aktivasi, pemilihan instruksi, RISC dan pembuatan kode asli x86) dan berbagai topik "lanjutan" (kompilasi OO dan bahasa fungsional, polimorfisme, pengumpulan sampah, optimasi dan bentuk penugasan statis tunggal) ke dalam ruang yang relatif sedikit (~ 500 halaman).

Saya lebih suka Implementasi Kompiler Modern daripada buku Naga karena implementasi Kompiler Modern mensurvei lebih sedikit bidang - alih-alih memiliki cakupan yang sangat solid dari semua topik yang Anda perlukan untuk menulis kompiler yang serius dan layak. Setelah Anda mengerjakan buku ini, Anda akan siap untuk menangani makalah penelitian secara langsung untuk lebih mendalam jika Anda membutuhkannya.

Saya harus mengakui bahwa saya memiliki titik lemah yang serius untuk Konstruksi Kompilator Niklaus Wirth . Ini tersedia online dalam bentuk PDF. Saya menemukan estetika pemrograman Wirth cukup indah, namun beberapa orang menemukan gayanya terlalu minim (misalnya Wirth lebih menyukai parser keturunan rekursif, tetapi sebagian besar kursus CS fokus pada alat generator parser; desain bahasa Wirth cukup konservatif.) Konstruksi Kompiler adalah distilasi yang sangat ringkas. ide dasar Wirth, jadi apakah Anda suka gayanya atau tidak atau tidak, saya sangat merekomendasikan membaca buku ini.

Dominic Cooney
sumber
Konstruksi Penyusun PDF ethoberon.ethz.ch/WirthPubl/CBEAll.pdf
matepal297
Saya sangat merekomendasikan terhadap versi C "Implementasi Kompiler Modern", itu dilumpuhkan oleh detail tingkat rendah karena C. Ini benar-benar mengacaukan buku. Java 1st tidak terlalu bagus karena desain OO-nya buruk, Java 2nd ed tidak lagi tentang bahasa Tiger. Jadi saya sangat merekomendasikan yang ML: tidak perlu fasih dalam ML untuk memahaminya. ML sangat cocok untuk pekerjaan itu.
akim
44

Saya setuju dengan referensi Buku Naga; IMO, itu adalah panduan definitif untuk konstruksi penyusun. Bersiaplah untuk beberapa teori hardcore.

Jika Anda menginginkan buku yang lebih ringan dalam teori, Game Scripting Mastery mungkin buku yang lebih baik untuk Anda. Jika Anda seorang pemula total pada teori kompiler, itu memberikan pengantar yang lebih lembut. Itu tidak mencakup metode parsing yang lebih praktis (memilih untuk keturunan rekursif non-prediktif tanpa membahas parsing LL atau LR), dan seingat saya, itu bahkan tidak membahas teori optimisasi apa pun. Plus, daripada mengkompilasi ke kode mesin, itu mengkompilasi ke bytecode yang seharusnya dijalankan pada VM yang juga Anda tulis.

Ini masih layak dibaca, terutama jika Anda bisa mengambilnya dengan harga murah di Amazon. Jika Anda hanya ingin pengenalan yang mudah ke kompiler, Game Scripting Mastery bukanlah cara yang buruk untuk melakukannya. Jika Anda ingin menjadi hardcore di depan, maka Anda harus puas dengan tidak kurang dari Buku Naga.

pengguna316
sumber
1
Game Scripting Mastery adalah sumber belajar yang hebat karena ketika Anda selesai, Anda akan memiliki game petualangan 2D yang dapat dimainkan dan skrip. Ini membuat setiap latihan fokus pada tujuan tertentu, dan membuat pembaca termotivasi.
Dour High Arch
1
Naga agak terlalu fokus pada tata bahasa berbasis tata bahasa. Jika Anda tidak mencoba menguraikan sesuatu yang tidak mungkin seperti C ++ atau lebih menggunakan generator parser, tetapi dapat menggunakan misalnya tata bahasa LL buatan tangan, Anda mungkin ingin mencari sesuatu yang memperlakukan bidang kompiler persentase yang lebih tinggi selain transformasi dan pembuktian tata bahasa
Marco van de Voort
27

"Ayo Bangun Kompiler" memang luar biasa, tapi agak ketinggalan jaman. (Saya tidak mengatakan itu membuatnya sedikit kurang valid.)

Atau periksa SLANG . Ini mirip dengan "Let's Build a Compiler" tetapi merupakan sumber yang jauh lebih baik terutama untuk pemula. Ini dilengkapi dengan tutorial pdf yang mengambil pendekatan 7 langkah untuk mengajar Anda seorang kompiler. Menambahkan tautan quora karena memiliki tautan ke semua berbagai port SLANG, di C ++, Java dan JS, juga interpreter dalam python dan java, yang aslinya ditulis menggunakan C # dan platform .NET.

RBz
sumber
5
Saya setuju bahwa seri ini agak ketinggalan jaman, meskipun masih berguna. Namun, keluhan terbesar saya adalah fakta bahwa ia mencoba menampilkan langsung ke bahasa assembly daripada membangun semua jenis pohon parse, yang berarti (bertentangan dengan apa yang dinyatakan dalam artikel pertama) bahwa itu tidak terlalu berguna untuk menulis seorang penerjemah.
a_m0d
23

Jika Anda mencari untuk menggunakan alat yang kuat, tingkat yang lebih tinggi daripada membangun semuanya sendiri, melalui proyek dan bacaan untuk kursus ini adalah pilihan yang cukup bagus. Ini kursus bahasa oleh penulis mesin Java parser ANTLR. Anda bisa mendapatkan buku untuk kursus sebagai PDF dari Programmer Pragmatis .

Kursus ini membahas hal-hal kompiler kompiler standar yang akan Anda lihat di tempat lain: parsing, pengecekan tipe dan tipe, polimorfisme, tabel simbol, dan pembuatan kode. Cukup banyak satu-satunya hal yang tidak tercakup adalah optimisasi. Tugas akhir adalah program yang menyusun subset dari C . Karena Anda menggunakan alat-alat seperti ANTLR dan LLVM, layak untuk menulis seluruh kompiler dalam satu hari (saya punya bukti keberadaan ini, meskipun maksud saya ~ 24 jam). Ini berat pada rekayasa praktis menggunakan alat modern, sedikit lebih ringan pada teori.

Ngomong-ngomong, LLVM benar-benar fantastis. Banyak situasi di mana Anda biasanya mengkompilasi ke perakitan, Anda akan jauh lebih baik mengkompilasi ke Representasi Menengah LLVM sebagai gantinya. Levelnya lebih tinggi, lintas platform, dan LLVM cukup bagus untuk menghasilkan perakitan yang dioptimalkan darinya.

Peter Burns
sumber
Tautan pertama sudah mati.
Lynn
20

Jika Anda punya sedikit waktu, saya sarankan "Compiler Construction" Niklaus Wirth (Addison-Wesley. 1996) , sebuah buku kecil kecil yang dapat Anda baca dalam sehari, tetapi ini menjelaskan dasar-dasarnya (termasuk bagaimana mengimplementasikan lexer, parser keturunan rekursif, dan mesin virtual berbasis tumpukan Anda sendiri). Setelah itu, jika Anda ingin menyelam dalam-dalam, tidak ada jalan lain di sekitar buku Naga seperti yang disarankan komentator lain.

Matthieu
sumber
Jika Anda tidak punya banyak waktu, jangan menulis kompiler.
Ingo
17

Anda mungkin ingin melihat Lex / Yacc (atau Flex / Bison, apa pun yang Anda ingin menyebutnya). Flex adalah penganalisa leksikal, yang akan mengurai dan mengidentifikasi komponen semantik ("token") bahasa Anda, dan Bison akan digunakan untuk menentukan apa yang terjadi ketika setiap token diuraikan. Ini bisa, tetapi jelas tidak terbatas pada, mencetak kode C, untuk kompiler yang akan dikompilasi ke C, atau secara dinamis menjalankan instruksi.

FAQ ini seharusnya membantu Anda, dan tutorial ini terlihat cukup bermanfaat.

Zachary Murray
sumber
17

Secara umum, tidak ada tutorial lima menit untuk kompiler, karena ini adalah topik yang rumit dan menulis kompiler dapat memakan waktu berbulan-bulan. Anda harus melakukan pencarian sendiri.

Python dan Ruby biasanya ditafsirkan. Mungkin Anda ingin memulai dengan seorang juru bahasa juga. Secara umum lebih mudah.

Langkah pertama adalah menulis deskripsi bahasa formal, tata bahasa bahasa pemrograman Anda. Kemudian Anda harus mengubah kode sumber yang ingin Anda kompilasi atau tafsirkan sesuai dengan tata bahasa menjadi pohon sintaksis abstrak, bentuk internal dari kode sumber yang dipahami dan dapat dioperasikan oleh komputer. Langkah ini biasanya disebut parsing dan perangkat lunak yang mem-parsing kode sumber disebut parser. Seringkali parser dihasilkan oleh generator parser yang mengubah tata bahasa formal menjadi kode mesin sumber oder. Untuk penjelasan parsing yang baik dan non-matematis saya merekomendasikan Teknik Parsing - Panduan Praktis. Wikipedia memiliki perbandingan generator parser tempat Anda dapat memilih generator yang cocok untuk Anda. Bergantung pada generator parser yang Anda pilih,

Menulis parser untuk bahasa Anda bisa sangat sulit, tetapi ini tergantung pada tata bahasa Anda. Jadi saya sarankan untuk menjaga tata bahasa Anda tetap sederhana (tidak seperti C ++); contoh yang bagus untuk ini adalah LISP.

Pada langkah kedua pohon sintaksis abstrak ditransformasikan dari struktur pohon menjadi representasi perantara linier. Sebagai contoh yang baik untuk bytecode Lua ini sering dikutip. Tetapi representasi perantara benar-benar tergantung pada bahasa Anda.

Jika Anda membangun juru bahasa, Anda hanya perlu menafsirkan representasi perantara. Anda juga bisa melakukan kompilasi tepat waktu. Saya merekomendasikan LLVM dan libjit untuk kompilasi tepat waktu. Untuk membuat bahasa dapat digunakan, Anda juga harus memasukkan beberapa fungsi input dan output dan mungkin perpustakaan standar kecil.

Jika Anda akan mengkompilasi bahasa, itu akan lebih rumit. Anda harus menulis backend untuk arsitektur komputer yang berbeda dan menghasilkan kode mesin dari representasi perantara di backend tersebut. Saya merekomendasikan LLVM untuk tugas ini.

Ada beberapa buku tentang topik ini, tetapi saya tidak bisa merekomendasikan mereka untuk penggunaan umum. Kebanyakan dari mereka terlalu akademis atau terlalu praktis. Tidak ada "Ajari diri Anda menulis compiler dalam 21 hari" dan dengan demikian, Anda harus membeli beberapa buku untuk mendapatkan pemahaman yang baik tentang seluruh topik ini. Jika Anda mencari di internet, Anda akan menemukan beberapa buku online dan catatan kuliah. Mungkin ada perpustakaan universitas di dekat Anda tempat Anda dapat meminjam buku tentang kompiler.

Saya juga merekomendasikan latar belakang pengetahuan yang baik dalam ilmu komputer teoritis dan teori grafik, jika Anda ingin membuat proyek Anda serius. Gelar dalam ilmu komputer juga akan sangat membantu.

pengguna141335
sumber
++ Anda benar bahwa itu baik untuk mengetahui semua hal itu, dan itu bisa menjadi pekerjaan besar, tapi saya juga belajar dari beberapa ahli bagaimana tidak membuat hal-hal menjadi masalah besar. Adalah baik untuk mengetahui banyak hal, dan bahkan lebih baik untuk mengetahui kapan tidak menggunakannya, yang sebagian besar waktu.
Mike Dunlavey
11

Satu buku yang belum disarankan tetapi sangat penting adalah "Linkers and Loaders" karya John Levine. Jika Anda tidak menggunakan assembler eksternal, Anda akan memerlukan cara untuk mengeluarkan file objek yang dapat ditautkan ke program akhir Anda. Bahkan jika Anda menggunakan assembler eksternal, Anda mungkin perlu memahami relokasi dan bagaimana seluruh proses pemuatan program bekerja untuk membuat alat yang berfungsi. Buku ini mengumpulkan banyak pengetahuan acak seputar proses ini untuk berbagai sistem, termasuk Win32 dan Linux.

Ben Combee
sumber
10

Buku Naga jelas merupakan buku "kompiler bangunan", tetapi jika bahasa Anda tidak serumit generasi bahasa saat ini, Anda mungkin ingin melihat pola Interpreter dari Pola Desain .

Contoh dalam buku ini mendesain bahasa seperti ekspresi reguler dan dipikirkan dengan baik, tetapi seperti yang mereka katakan dalam buku, itu baik untuk memikirkan proses tetapi hanya benar-benar efektif pada bahasa kecil. Namun, jauh lebih cepat untuk menulis Penerjemah untuk bahasa kecil dengan pola ini daripada harus mempelajari semua jenis parser, yacc dan lex, dan sebagainya ...

Chris Bunch
sumber
10

Jika Anda ingin menggunakan LLVM, lihat ini: http://llvm.org/docs/tutorial/ . Ini mengajarkan Anda cara menulis kompiler dari awal menggunakan kerangka kerja LLVM, dan tidak menganggap Anda memiliki pengetahuan tentang subjek.

Tutorial menyarankan Anda menulis parser dan lexer Anda sendiri dll, tetapi saya menyarankan Anda untuk melihat ke dalam bison dan melenturkan setelah Anda mendapatkan ide. Mereka membuat hidup jadi lebih mudah.

wvdschel
sumber
Tetapi dokumentasi untuk pengaturan Visual Studio ditulis dengan buruk, plus tidak ada contoh
SpicyWeenie
10

Saya menemukan buku Dragon terlalu sulit untuk dibaca dengan terlalu banyak fokus pada teori bahasa yang tidak benar-benar diperlukan untuk menulis kompiler dalam praktek.

Saya akan menambahkan buku Oberon yang berisi sumber lengkap dari kompiler Oberon Project Oberon yang luar biasa cepat dan sederhana .

Teks alternatif

Lothar
sumber
10

Saya ingat menanyakan pertanyaan ini sekitar tujuh tahun yang lalu ketika saya masih baru dalam pemrograman.

Saya sangat berhati-hati ketika saya bertanya dan mengejutkan saya tidak mendapatkan banyak kritik seperti yang Anda dapatkan di sini. Namun mereka mengarahkan saya ke arah " Buku Naga " yang menurut saya, buku yang sangat bagus yang menjelaskan semua yang perlu Anda ketahui untuk menulis kompiler (Anda tentu harus menguasai satu atau dua bahasa. bahasa yang Anda tahu, meriah.).

Dan ya, banyak orang mengatakan membaca buku itu gila dan Anda tidak akan belajar apa-apa darinya, tetapi saya sepenuhnya tidak setuju dengan itu.

Banyak orang juga mengatakan bahwa menulis kompiler itu bodoh dan tidak ada gunanya. Nah, ada sejumlah alasan mengapa pengembangan kompiler berguna:

  • Karena itu menyenangkan.
  • Ini mendidik, ketika mempelajari cara menulis kompiler, Anda akan belajar banyak tentang ilmu komputer dan teknik lain yang berguna saat menulis aplikasi lain.
  • Jika tidak ada yang menulis kompiler, bahasa yang ada tidak akan lebih baik.

Saya tidak langsung menulis kompiler sendiri, tetapi setelah bertanya saya tahu harus mulai dari mana. Dan sekarang, setelah mempelajari banyak bahasa yang berbeda dan membaca Buku Naga, menulis tidak terlalu menjadi masalah. (Saya juga belajar atm teknik komputer, tetapi sebagian besar yang saya tahu tentang pemrograman adalah otodidak.)

Sebagai kesimpulan, The Dragon Book adalah "tutorial" yang bagus. Tetapi luangkan waktu untuk menguasai satu atau dua bahasa sebelum mencoba menulis kompiler. Jangan berharap menjadi guru kompiler dalam dekade berikutnya atau lebih.

Buku ini juga bagus jika Anda ingin belajar cara menulis parser / juru bahasa.

Pandafox
sumber
9

"... Ayo Bangun Kompiler ..."

Saya akan kedua http://compilers.iecc.com/crenshaw/ oleh @sasb . Lupakan membeli lebih banyak buku untuk saat ini.

Mengapa? Alat & bahasa.

Bahasa yang dibutuhkan adalah Pascal dan jika saya ingat dengan benar didasarkan pada Turbo-Pascal. Kebetulan jika Anda pergi ke http://www.freepascal.org/ dan mengunduh kompilator Pascal semua contoh bekerja langsung dari halaman ~ http://www.freepascal.org/download.var Hal indah tentang Gratis Pascal adalah Anda dapat menggunakannya hampir apa pun prosesor atau OS yang dapat Anda rawat.

Setelah Anda menguasai pelajaran kemudian mencoba lebih maju " Naga Buku " ~ http://en.wikipedia.org/wiki/Dragon_book

bootload
sumber
9

Saya mencari konsep yang sama, dan menemukan artikel yang menjanjikan ini oleh Joel Pobar,

Buat Kompiler Bahasa untuk .NET Framework - tidak yakin ke mana perginya ini

Buat Kompiler Bahasa untuk .NET Framework - salinan pdf dari dokumen asli

ia membahas konsep kompiler tingkat tinggi dan mulai menciptakan bahasa sendiri untuk kerangka kerja .Net. Meskipun ditujukan untuk Kerangka Bersih., Banyak konsep harus dapat direproduksi. Artikel tersebut mencakup:

  1. Definisi Langauge
  2. Pemindai
  3. Parser (bit im terutama tertarik)
  4. Menargetkan Kerangka. Net
  5. Generator kode

ada topik lain, tetapi Anda mendapatkan keadilan.

Ini ditujukan untuk orang-orang yang memulai, ditulis dalam C # (tidak cukup Java)

HTH

tulang

dbones
sumber
Apa artinya "tidak cukup Jawa"?
Hejazzman
haha, maaf, maksud saya ini ditulis untuk. Net, yang pada prinsipnya mirip dengan java. Keduanya bergaya JIT. :)
dbones
8

Cara mudah untuk membuat kompiler adalah dengan menggunakan bison dan flex (atau serupa), membangun pohon (AST) dan menghasilkan kode dalam C. Dengan menghasilkan kode C menjadi langkah paling penting. Dengan menghasilkan kode C, bahasa Anda akan bekerja secara otomatis di semua platform yang memiliki kompiler C.

Membuat kode C semudah membuat HTML (cukup gunakan cetak, atau yang setara), yang pada gilirannya jauh lebih mudah daripada menulis parser C atau parser HTML.

Peter Stuifzand
sumber
8

Dari FAQ comp.compiler :

"Programming a Personal Computer" oleh Per Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

Buku berjudul sayangnya ini menjelaskan desain dan penciptaan lingkungan pemrograman pengguna tunggal untuk micros, menggunakan bahasa seperti Pascal yang disebut Edison. Penulis menyajikan semua kode sumber dan penjelasan untuk implementasi langkah demi langkah dari kompiler Edison dan sistem operasi pendukung yang sederhana, semua ditulis dalam Edison sendiri (kecuali untuk kernel pendukung kecil yang ditulis dalam assembler simbolik untuk PDP 11/23; sumber lengkap juga dapat dipesan untuk PC IBM).

Hal-hal yang paling menarik tentang buku ini adalah: 1) kemampuannya untuk menunjukkan cara membuat kompiler dan sistem operasi yang lengkap, mandiri, bermanfaat, dan 2) diskusi menarik tentang desain bahasa dan masalah spesifikasi serta perdagangan off dalam Bab 2.

"Brinch Hansen on Compiler Pascal" oleh Per Brinch Hansen Prentice-Hall 1985 ISBN 0-13-083098-4

Satu lagi teori berat tentang pragmatik di sini adalah buku how to to code-it. Penulis menyajikan desain, implementasi, dan kode sumber lengkap untuk kompiler dan p-code interpreter untuk Pascal- (Pascal "minus"), subset Pascal dengan tipe boolean dan integer (tetapi tidak ada karakter, real, subranged atau enumerated type) , definisi konstan dan variabel serta tipe array dan record (tetapi tidak ada tipe pack, varian, set, pointer, tanpa nama, nama, atau file), ekspresi, pernyataan penugasan, definisi prosedur bersarang dengan nilai dan parameter variabel, jika pernyataan, sementara pernyataan, dan blok awal-akhir (tetapi tidak ada definisi fungsi, parameter prosedural, pernyataan dan label kebagian, pernyataan kasus, pernyataan berulang, untuk pernyataan, dan dengan pernyataan).

Compiler dan interpreter ditulis dalam Pascal * (Pascal "star"), subset Pascal yang diperluas dengan beberapa fitur gaya Edison untuk membuat sistem pengembangan perangkat lunak. Kompiler Pascal * untuk PC IBM dijual oleh pembuatnya, tetapi mudah untuk port-compiler Pascal buku ke platform Pascal yang nyaman.

Buku ini membuat desain dan implementasi kompiler terlihat mudah. Saya terutama menyukai cara penulis berkaitan dengan kualitas, keandalan, dan pengujian. Kompiler dan interpreter dapat dengan mudah digunakan sebagai dasar untuk bahasa yang lebih terlibat atau proyek kompiler, terutama jika Anda ditekan untuk dengan cepat mendapatkan sesuatu dan berjalan.

joe snyder
sumber
8

Anda harus memeriksa " ichbins " Darius Bacon , yang merupakan kompiler untuk dialek Lisp kecil, yang menargetkan C, hanya dalam lebih dari 6 halaman kode. Keuntungan yang dimilikinya dibandingkan kebanyakan kompiler mainan adalah bahasanya cukup lengkap sehingga kompiler dituliskan di dalamnya. (Tarbal juga menyertakan juru bahasa untuk mem-bootstrap hal itu.)

Ada lebih banyak hal tentang apa yang saya temukan berguna dalam belajar menulis kompiler di halaman web Ur-Scheme saya .

Kragen Javier Sitaker
sumber
8
  1. Ini adalah subjek yang luas. Jangan meremehkan hal ini. Dan jangan meremehkan poin saya untuk tidak meremehkannya.
  2. Saya mendengar Buku Naga adalah tempat untuk memulai, bersama dengan pencarian. :) Lebih baik dalam mencari, pada akhirnya itu akan menjadi hidup Anda.
  3. Membangun bahasa pemrograman Anda sendiri benar-benar latihan yang bagus! Tetapi ketahuilah bahwa itu pada akhirnya tidak akan pernah digunakan untuk tujuan praktis apa pun. Pengecualian untuk hal ini sangat sedikit dan sangat jauh.
280Z28
sumber
4
Jika Anda belum membaca buku Naga. Tolong jangan rekomendasikan itu. Bahkan, pernahkah Anda menerapkan kompiler?
Ya, seperti namanya, Buku Naga adalah monster. Sangat mendalam, tetapi sumber daya yang sangat bagus. Saya tidak akan merekomendasikan untuk pemula, meskipun ...
Zachary Murray
2
@Neil: Anda belum punya google kan, kan? lol. blog.280z28.org Tapi tidak, saya belum membaca buku itu.
Sam Harwell
Saya membacanya (buku naga) saat ini, dan juga Lex / Yacc pada saat yang sama, saya menemukan buku itu cukup bagus. Sendiri.
Simeon Pilgrim
1
Agar adil, saya membukanya dengan "Saya dengar ...". :) # 1 dan # 3 adalah poin yang saya rasa sangat penting untuk diketahui tetapi tidak sering disebutkan.
Sam Harwell
8

Kompiler LCC ( wikipedia ) ( beranda proyek ) ( github.com/drh/lcc ) dari Fraser dan Hanson dijelaskan dalam buku mereka "Kompiler C Retargetable: Desain dan Implementasi". Ini cukup mudah dibaca dan menjelaskan seluruh kompiler, hingga pembuatan kode.

mfx
sumber
Sepertinya ini sumber yang bagus terima kasih.
gideon
7

Python dibundel dengan kompiler python yang ditulis dengan Python. Anda dapat melihat kode sumber, dan itu mencakup semua fase, dari parsing, pohon sintaksis abstrak, kode pemancar, dll. Retas.

Yeruham
sumber
7

Maaf, ini dalam bahasa Spanyol, tetapi ini adalah daftar pustaka dari kursus yang disebut "Compiladores e Intérpretes" (Penyusun dan Penerjemah) di Argentina.

Kursus ini dari teori bahasa formal ke konstruksi kompiler, dan ini adalah topik yang Anda butuhkan untuk membangun, setidaknya, kompiler sederhana:

  • Desain Kompiler di C.
    Allen I. Holub

    Prentice-Hall. 1990.

  • Compiladores. Teoría y Construcción.
    Sanchís Llorca, FJ, Galán Pascual, C. Editorial Paraninfo. 1988.

  • Konstruksi Penyusun.
    Niklaus Wirth

    Addison-Wesley. 1996

  • Lenguajes, Gramáticas y Autómatas. Bukan prasyarat.
    Pedro Isasi Viñuela, Paloma Martínez Fernández, Daniel Borrajo Millán. Addison-Wesley Iberoamericana (España). 1997.

  • Seni desain kompiler. Teori dan praktik.
    Thomas Pittman, James Peters.

    Prentice-Hall. 1992.

  • Konstruksi Kompiler Berorientasi Objek.
    Jim Holmes.
    Prentice Hall, Englewood Cliffs, NJ 1995

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

    Addison-Wesley Iberoamericana. 1995

  • Pengantar Teori, Bahasa, dan Perhitungan Automata.

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

  • Pengantar bahasa formal.
    György E. Révész.

    Mc Graw Hill. 1983.

  • Teknik Parsing. Panduan Praktis.
    Dick Grune, Ceriel Jacobs.
    Impreso por los autores. 1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc: Lagi-Lain Kompiler.
    Stephen C. Johnson
    Laporan Teknis Ilmu Komputasi Nº 32, 1975. Bell Laboratories. Murray Hill, New
    Jersey.

  • Lex: Generator Analis Leksikal.
    ME Lesk, E. Schmidt. Laporan Teknis Ilmu Komputasi Nº 39, 1975. Bell Laboratories. Murray Hill, New Jersey.

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

  • Elemen teori perhitungan.
    Harry R. Lewis, Christos H. Papadimitriou. Segunda Edición. Prentice Hall. 1998

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

eKek0
sumber
6

Bukan buku, tetapi makalah teknis dan pengalaman belajar yang sangat menyenangkan jika Anda ingin tahu lebih banyak tentang kompiler (dan metacompiler) ... Situs web ini memandu Anda membangun sistem kompiler mandiri yang dapat mengkompilasi dirinya sendiri dan bahasa lain:

Tutorial: Metacompiler Bagian 1

Ini semua didasarkan pada makalah teknis 10 halaman kecil yang menakjubkan:

Val Schorre META II: Bahasa Penulisan Kompiler Berorientasi Sintaks

dari honest-to-god 1964. Saya belajar bagaimana membangun kompiler dari ini pada tahun 1970. Ada saat yang mengejutkan ketika Anda akhirnya memahami bagaimana kompiler dapat meregenerasi sendiri ....

Saya tahu penulis situs web dari masa kuliah saya, tetapi saya tidak ada hubungannya dengan situs web.

Ira Baxter
sumber
Seperti yang orang lain katakan, adalah argumen BESAR, saya pikir sushi tugas adalah pekerjaan terakhir untuk sarjana, perlu tahu BANYAK konsep matematika, ilmu komputer dan sebagainya.
ingconti
Jika Anda tidak tahu topik ini, Anda seharusnya tidak benar-benar mencoba membangun kompiler yang serius. Namun, jika Anda memiliki 2-3 tahun pendidikan ilmu komputer sarjana (pemrograman, struktur data, bahasa assembly), makalah MetaII akan bekerja untuk Anda.
Ira Baxter
5

Saya juga menyukai tutorial Crenshaw , karena membuatnya sangat jelas bahwa kompiler hanyalah program lain yang membaca beberapa input dan menulis beberapa put out.

Membacanya.

Kerjakan jika Anda mau, tetapi kemudian lihat referensi lain tentang bagaimana kompiler yang lebih besar dan lebih lengkap benar-benar ditulis.

Dan baca On Trusting Trust , untuk mendapatkan petunjuk tentang hal-hal tidak jelas yang dapat dilakukan dalam domain ini.

dmckee
sumber
5

Jika Anda tertarik untuk menulis kompiler untuk bahasa fungsional (bukan yang prosedural) Simon Peyton-Jones dan David Lester " Menerapkan bahasa fungsional: tutorial " adalah panduan yang bagus.

Dasar-dasar konseptual tentang bagaimana evaluasi fungsional bekerja dipandu oleh contoh-contoh dalam bahasa fungsional yang sederhana namun kuat yang disebut "Core". Selain itu, setiap bagian dari kompiler bahasa Core dijelaskan dengan contoh kode di Miranda (bahasa fungsional murni sangat mirip dengan Haskell).

Beberapa jenis kompiler dijelaskan tetapi bahkan jika Anda hanya mengikuti apa yang disebut kompiler template untuk Core, Anda akan memiliki pemahaman yang sangat baik tentang apa yang membuat pemrograman fungsional dicentang.

Mark Reid
sumber
5

Anda bisa menggunakan BCEL oleh Yayasan Perangkat Lunak Apache. Dengan alat ini Anda dapat membuat kode assembler-like, tetapi Java dengan BCEL API. Anda dapat mempelajari cara menghasilkan kode bahasa perantara (dalam hal ini kode byte).

Contoh sederhana

  1. Buat kelas Java dengan fungsi ini:

    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";
        }
    }
    

Sekarang jalankan BCELifier dengan kelas ini

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

Anda dapat melihat hasilnya di konsol untuk seluruh kelas (cara membuat kode byte MyClass.java). Kode untuk fungsinya adalah ini:

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();
}
timaschew
sumber
5

Ada banyak jawaban bagus di sini, jadi saya pikir saya hanya akan menambahkan satu lagi ke daftar:

Saya mendapat buku berjudul Project Oberon lebih dari satu dekade yang lalu, yang memiliki beberapa teks yang ditulis dengan sangat baik di kompiler. Buku ini sangat menonjol dalam arti bahwa sumber dan penjelasannya sangat mudah dibaca. Teks lengkap (edisi 2005) telah tersedia dalam pdf, sehingga Anda dapat mengunduh sekarang. Kompilator dibahas dalam bab 12:

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

Niklaus Wirth, Jürg Gutknecht

(Perawatannya tidak seluas buku tentang kompiler)

Saya sudah membaca beberapa buku tentang kompiler, dan saya bisa kedua buku naga, waktu yang dihabiskan untuk buku ini sangat berharga.

tovare
sumber
4

Sejauh ini tidak termasuk dalam daftar buku ini:

Dasar-dasar Desain Kompiler (Torben Mogensen) (dari departemen Ilmu Komputer, Universitas Kopenhagen)

Saya juga tertarik untuk belajar tentang kompiler dan berencana untuk memasuki industri itu dalam beberapa tahun mendatang. Buku ini adalah buku teori yang ideal untuk mulai belajar kompiler sejauh yang saya bisa lihat. Ini GRATIS untuk menyalin dan mereproduksi, ditulis dengan bersih dan hati-hati dan memberikannya kepada Anda dalam bahasa Inggris tanpa kode apa pun tetapi masih menyajikan mekanik melalui instruksi dan diagram dll. Layak untuk dilihat.

magneto12321
sumber
Menambahkannya ke daftar, terima kasih :)
Anton