Pilihan bahasa: C/C++, Java, dan Ruby.
Saya mencari beberapa buku/tutorial tentang bagaimana untuk menulis anda sendiri compiler hanya untuk tujuan pendidikan. Saya paling akrab dengan C/C++, Java, dan Ruby, jadi saya lebih memilih sumber daya yang melibatkan salah satu dari tiga orang itu, tetapi setiap sumber daya yang baik adalah yang dapat diterima.
Ini adalah sangat samar-samar pertanyaan, saya pikir, hanya karena kedalaman topik yang terlibat. Compiler dapat didekomposisi menjadi dua bagian yang terpisah, namun; top-setengah dan bawah-satu. Top-setengah umumnya membutuhkan sumber bahasa dan mengubahnya menjadi perantara representasi, dan setengah bagian bawah mengurus spesifik platform generasi kode.
Meskipun demikian, salah satu ide untuk cara yang mudah untuk mendekati topik ini (yang kita gunakan dalam compiler kelas, setidaknya) adalah untuk membangun compiler dalam dua bagian yang dijelaskan di atas. Secara khusus, anda'll mendapatkan ide yang baik dari seluruh proses dengan hanya membangun top-setengah.
Hanya melakukan bagian atas memungkinkan anda mendapatkan pengalaman menulis leksikal analyzer dan parser dan pergi untuk menghasilkan beberapa "kode" (yang menengah representasi yang saya sebutkan). Jadi itu akan mengambil source program dan mengubahnya menjadi representasi lain dan melakukan beberapa optimasi (jika anda ingin), yang merupakan jantung dari sebuah compiler. Bagian bawah kemudian akan mengambil representasi intermediate dan menghasilkan byte yang diperlukan untuk menjalankan program pada arsitektur tertentu. Misalnya, bagian bawah akan membawa anda representasi intermediate dan menghasilkan PE eksekusi.
Beberapa buku-buku tentang topik ini yang saya temukan sangat membantu adalah Penyusun prinsip-Prinsip dan teknik-Teknik (atau Naga Pesan, karena naga lucu di sampul). It's punya beberapa teori dan pasti meliputi Context-Free Grammars yang benar-benar dapat diakses. Juga, untuk membangun leksikal analyzer dan parser, anda'll mungkin menggunakan *nix alat lex dan yacc. Dan uninterestingly cukup, buku yang disebut "lex dan yacc" dijemput di mana Naga Pesan tinggalkan untuk bagian ini.
Saya pikir Modern Compiler Implementation in ML adalah pengantar terbaik compiler menulis teks. Ada's Java version dan C versi juga, baik yang mungkin akan lebih mudah diakses diberikan dalam bahasa anda latar belakang. Buku paket banyak berguna bahan dasar (scanning dan pengolahan, analisis semantik, aktivasi catatan, instruksi seleksi, RISC dan x86 kode asli generation) dan berbagai "maju" topik (kompilasi OO dan fungsional bahasa, polimorfisme, pengumpulan sampah, optimasi dan statis tunggal penugasan bentuk) menjadi relatif sedikit ruang (~500 halaman).
Aku lebih Modern Compiler Implementation Naga pesan karena Modern Compiler implementation survei kurang dari lapangan-bukan itu telah benar-benar solid cakupan dari semua topik yang anda akan perlu untuk menulis serius, layak compiler. Setelah anda bekerja melalui buku ini, anda'akan siap untuk menangani makalah penelitian secara langsung untuk lebih mendalam jika anda membutuhkannya.
Saya harus mengakui saya telah serius soft spot untuk Niklaus Wirth's Compiler Konstruksi. Itu adalah tersedia online sebagai PDF. Saya menemukan Wirth's pemrograman estetika hanya indah, namun beberapa orang menemukan gayanya terlalu minim (misalnya Wirth nikmat recursive descent parser, tapi yang paling CS kursus fokus pada parser alat generator; Wirth's bahasa desain yang cukup konservatif.) Compiler Konstruksi yang sangat ringkas distilasi Wirth's-ide dasar, jadi apakah anda suka gaya atau tidak atau tidak, saya sangat merekomendasikan membaca buku ini.
Saya setuju dengan Naga Buku referensi; IMO, itu adalah panduan definitif untuk compiler konstruksi. Dapatkan siap untuk beberapa hardcore teori, meskipun.
Jika anda ingin sebuah buku yang lebih ringan pada teori, Permainan Scripting Mastery mungkin menjadi buku yang lebih baik untuk anda. Jika anda seorang pemula total pada compiler teori, memberikan pengenalan lembut. Itu doesn't cover lebih praktis metode parsing (memilih untuk non-prediksi recursive descent tanpa membahas LL atau LR parsing), dan seingat saya, itu doesn't bahkan membahas segala macam teori optimasi. Ditambah, bukan menyusun kode mesin, mengkompilasi ke bytecode yang seharusnya dijalankan pada VM bahwa anda juga menulis.
It's masih layak baca, terutama jika anda bisa mengambilnya dengan harga murah di Amazon. Jika anda hanya ingin yang mudah pendahuluan ke compiler, Game Scripting Penguasaan ini bukan cara yang buruk untuk pergi. Jika anda ingin pergi hardcore depan, maka anda harus puas dengan tidak kurang dari Dragon Book.
"Let's Membangun sebuah Compiler" adalah mengagumkan, tapi itu's sedikit usang. (Saya'm tidak mengatakan itu membuatnya bahkan sedikit agak kurang valid.)
Atau check out GAUL. Hal ini mirip dengan "Let's Membangun sebuah Compiler" tapi lebih banyak sumber daya yang lebih baik terutama untuk pemula. Ini dilengkapi dengan tutorial pdf yang mengambil 7 langkah pendekatan mengajar anda compiler. Menambahkan quora link seperti ini memiliki link ke semua port GAUL, di C++, Java dan JS, juga interpreter python dan java, awalnya ditulis menggunakan C# dan .NET platform.
Jika anda'kembali mencari untuk menggunakan kuat, tingkat yang lebih tinggi sesuai daripada membangun segala ** diri sendiri, melalui proyek-proyek dan bacaan untuk program ini adalah pilihan yang cukup baik. It's sebuah bahasa saja oleh penulis dari Jawa parser engine ANTLR. Anda bisa mendapatkan buku untuk kursus sebagai PDF dari Pragmatis Programmer.
Tentu saja berjalan di atas standar compiler compiler hal-hal yang anda'd lihat di tempat lain: parsing, jenis dan tipe memeriksa, polimorfisme, tabel simbol, dan kode generasi. Cukup banyak satu-satunya hal yang isn't tertutup adalah optimasi. Proyek akhir ini adalah sebuah program yang mengkompilasi sebuah subset dari C. Karena anda menggunakan alat-alat seperti ANTLR dan LLVM, it's layak untuk menulis seluruh compiler dalam satu hari (saya punya bukti keberadaan ini, meskipun aku tidak berarti ~24 jam). It's berat pada teknik praktis menggunakan alat-alat modern, sedikit lebih ringan pada teori.
LLVM, by the way, cukup fantastis. Banyak situasi di mana anda mungkin biasanya menyusun ke bawah untuk perakitan, anda'a akan jauh lebih baik untuk menyusun LLVM's Intermediate Representation sebagai gantinya. It's tingkat yang lebih tinggi, lintas platform, dan LLVM cukup baik untuk menghasilkan dioptimalkan perakitan dari itu.
Jika anda memiliki sedikit waktu, saya sarankan Niklaus Wirth's "Compiler Construction" (Addison-Wesley. 1996), kecil kecil buku yang dapat anda baca dalam satu hari, tapi itu menjelaskan dasar-dasar (termasuk cara melaksanakan lexers, recursive descent parser, dan tumpukan anda sendiri berbasis mesin virtual). Setelah itu, jika anda ingin menyelam dalam-dalam, ada's tidak ada jalan di sekitar Naga pesan sebagai komentator lain sarankan.
Anda mungkin ingin melihat ke Lex/Yacc (atau Flex/Bison, apa pun yang anda ingin menyebutnya). Flex adalah leksikal analyzer, yang akan mengurai dan mengidentifikasi komponen semantik ("token") dari bahasa anda, dan Bison akan digunakan untuk menentukan apa yang terjadi ketika masing-masing token diurai. Ini bisa, tapi pasti tidak terbatas pada, mencetak kode C, untuk compiler yang akan mengkompilasi C, atau secara dinamis menjalankan instruksi.
FAQ akan membantu anda, dan tutorial terlihat cukup berguna.
Secara umum, ada's tidak ada lima menit tutorial untuk compiler, karena itu's topik yang rumit dan menulis compiler dapat memakan waktu berbulan-bulan. Anda akan memiliki untuk melakukan pencarian sendiri.
Python dan Ruby biasanya ditafsirkan. Mungkin anda ingin memulai dengan seorang penerjemah juga. It's umumnya lebih mudah.
Langkah pertama adalah untuk menulis sebuah bahasa formal keterangan, tata bahasa dari bahasa pemrograman anda. Kemudian anda harus mengubah source code yang anda ingin mengkompilasi atau menafsirkan menurut tata bahasa ke yang abstrak sintaks pohon, internal bentuk kode sumber yang komputer memahami dan dapat beroperasi pada. Langkah ini biasanya disebut dengan parsing dan perangkat lunak yang mem-parsing kode sumber ini disebut parser. Sering parser yang dihasilkan oleh parser generator yang mengubah formal grammar menjadi sumber oder kode mesin. Untuk yang baik, non-matematika penjelasan parsing saya sarankan Parsing Teknik - Sebuah Panduan Praktis. Wikipedia memiliki perbandingan parser generator dari mana anda dapat memilih salah satu yang cocok untuk anda. Tergantung pada parser generator yang anda pilih, anda akan menemukan tutorial di Internet dan untuk benar-benar populer parser generator (seperti GNU bison) ada juga buku-buku.
Menulis parser untuk bahasa anda dapat benar-benar sulit, tapi ini tergantung pada tata bahasa. Jadi saya sarankan untuk menjaga tata bahasa sederhana (tidak seperti C++); sebuah contoh yang baik untuk ini adalah CADEL.
Pada langkah kedua abstract syntax tree berubah dari struktur pohon menjadi linear menengah representasi. Sebagai contoh yang baik untuk ini Lua's bytecode adalah sering dikutip. Tapi intermediate representasi benar-benar tergantung pada bahasa.
Jika anda sedang membangun sebuah interpreter, anda hanya akan memiliki untuk menafsirkan menengah representasi. Anda bisa juga hanya-dalam-waktu-compile. Saya merekomendasikan LLVM dan libjit untuk hanya-dalam-waktu-kompilasi. Untuk membuat bahasa yang digunakan, anda juga harus memiliki beberapa input dan output fungsi dan mungkin kecil perpustakaan standar.
Jika anda akan untuk mengkompilasi bahasa, itu akan menjadi lebih rumit. Anda akan memiliki untuk menulis backends untuk komputer yang berbeda arsitektur dan menghasilkan kode mesin dari intermediate representasi dalam backends. Saya merekomendasikan LLVM untuk tugas ini.
Ada beberapa buku-buku tentang topik ini, tapi saya dapat merekomendasikan tidak satupun dari mereka untuk penggunaan umum. Sebagian besar dari mereka adalah terlalu akademis atau terlalu praktis. Ada's tidak ada "Mengajar diri sendiri compiler menulis dalam 21 hari" dan dengan demikian, anda akan memiliki untuk membeli beberapa buku untuk mendapatkan pemahaman yang baik dari seluruh topik. Jika anda mencari di Internet, anda akan menemukan beberapa beberapa online buku-buku dan catatan kuliah. Mungkin ada's perpustakaan universitas terdekat anda dimana anda dapat meminjam buku pada compiler.
Saya juga merekomendasikan latar belakang yang baik pengetahuan dalam teori ilmu komputer dan teori grafik, jika anda akan membuat proyek anda serius. Gelar di bidang ilmu komputer juga akan membantu.
Lihatlah buku di bawah ini. Penulis adalah pencipta ANTLR.
Bahasa Implementasi Pola: Membuat Anda Sendiri Domain-Spesifik dan Umum Bahasa Pemrograman.
Satu buku belum disarankan, tetapi yang sangat penting adalah "Linkers dan Loader" oleh John Levine. Jika anda're tidak menggunakan eksternal assembler, anda'll perlu cara untuk output file objek yang dapat dihubungkan ke akhir program. Bahkan jika anda're menggunakan eksternal assembler, anda'll mungkin perlu untuk memahami relokasi dan bagaimana seluruh program proses loading bekerja untuk membuat suatu alat bekerja. Buku ini mengumpulkan banyak dari random lore seluruh proses ini untuk berbagai sistem, termasuk Win32 dan Linux.
Jika anda're bersedia untuk menggunakan LLVM, check this out: http://llvm.org/docs/tutorial/. Ini mengajarkan anda bagaimana untuk menulis compiler dari awal dengan menggunakan LLVM's framework, dan doesn't mengasumsikan anda memiliki pengetahuan tentang subjek.
Tutorial sarankan anda menulis anda sendiri parser dan lexer dll, tapi saya menyarankan anda untuk melihat ke bison dan flex setelah anda mendapatkan ide. Mereka membuat hidup jadi jauh lebih mudah.
Saya menemukan buku Naga terlalu sulit untuk dibaca dengan terlalu banyak fokus pada teori bahasa yang tidak benar-benar diperlukan untuk menulis compiler dalam praktek.
Saya akan tambahkan Oberon buku yang penuh berisi sumber yang sangat cepat dan sederhana Oberon compiler Proyek Oberon.
Naga Pesan pasti "membangun compiler" pesan, tetapi jika bahasa anda isn't cukup rumit seperti saat ini generasi bahasa, anda mungkin ingin melihat Penerjemah pola dari Pola Desain.
Contoh dalam buku desain ekspresi reguler-seperti bahasa dan lebih baik dipikirkan, tapi seperti yang mereka katakan dalam buku, it's baik untuk berpikir melalui proses tapi ini benar-benar efektif hanya pada kecil bahasa. Namun, hal ini jauh lebih cepat untuk menulis sebuah Interpreter untuk bahasa dengan pola ini daripada harus belajar tentang semua jenis yang berbeda dari parser, yacc dan lex, et cetera...
Saya ingat bertanya pertanyaan ini sekitar tujuh tahun yang lalu ketika saya masih agak baru untuk pemrograman.
Saya sangat berhati-hati ketika saya bertanya dan anehnya aku tak't mendapatkan banyak kritik karena anda mendapatkan di sini. Mereka namun di arah "Naga Pesan" yang adalah menurut pendapat saya, benar-benar buku yang menjelaskan segala sesuatu yang anda perlu tahu untuk menulis compiler (anda tentu saja harus menguasai bahasa atau dua. Semakin banyak bahasa yang anda tahu, semakin meriah.).
Dan ya, banyak orang mengatakan membaca buku yang gila dan anda tidak't belajar apa-apa dari itu, tapi aku benar-benar tidak setuju dengan itu.
Banyak orang juga mengatakan bahwa menulis kompiler adalah bodoh dan sia-sia. Nah, ada sejumlah alasan mengapa compiler pengembangan yang berguna:
Aku't menulis saya sendiri compiler segera, tapi setelah meminta aku tahu di mana untuk memulai. Dan sekarang, setelah belajar berbagai bahasa dan membaca Dragon Buku, menulis isn't bahwa banyak masalah. (Saya'm juga belajar teknik komputer atm, tapi sebagian besar dari apa yang saya tahu tentang pemrograman otodidak.)
Kesimpulannya, Naga adalah Buku besar "tutorial". Tapi menghabiskan beberapa waktu untuk menguasai bahasa atau dua sebelum mencoba untuk menulis compiler. Don't berharap untuk menjadi sebuah compiler guru dalam dekade berikutnya atau lebih sekalipun.
Buku ini juga baik jika anda ingin belajar bagaimana untuk menulis parser/interpreter.
Saya mencari ke dalam konsep yang sama, dan menemukan artikel ini menjanjikan oleh Joel Pobar,
Membuat Compiler Bahasa untuk .NET Framework - tidak yakin di mana hal ini telah pergi
Membuat Compiler Bahasa untuk .NET Framework - pdf salinan asli doc
ia membahas tingkat tinggi konsep compiler dan hasil untuk menciptakan sendiri langauge untuk .Net framework. Meskipun ditujukan untuk .Net Framework, banyak konsep-konsep harus dapat direproduksi. Artikel meliputi:
ada topik lain, tetapi anda mendapatkan hanya.
Yang ditujukan kepada orang-orang mulai keluar, yang ditulis dalam C# (tidak Jawa)
HTH
tulang
"... Let's Membangun sebuah Compiler ..."
I'd kedua http://compilers.iecc.com/crenshaw/ oleh @sasb. Lupa untuk membeli lebih banyak buku untuk saat ini.
Mengapa? Alat & bahasa.
Bahasa yang diperlukan adalah Pascal dan jika saya ingat dengan benar didasarkan pada Turbo Pascal. Itu hanya terjadi jika anda pergi ke http://www.freepascal.org/ dan download Pascal compiler semua contoh-contoh pekerjaan langsung dari halaman ~ http://www.freepascal.org/download.var beaut hal tentang Free Pascal adalah anda dapat menggunakannya hampir apapun processor atau OS yang anda dapat merawat.
Setelah anda telah menguasai pelajaran, maka cobalah lebih maju "Naga Pesan" ~ http://en.wikipedia.org/wiki/Dragon_book
Dari comp.penyusun FAQ:
"Pemrograman Komputer Pribadi" oleh Per Brinch Hansen Prentice-Hall tahun 1982 ISBN 0-13-730283-5
Sayangnya ini-judul buku menjelaskan desain dan pembuatan single-user lingkungan pemrograman untuk micros, menggunakan Pascal-seperti bahasa yang disebut Edison. Penulis menyajikan semua source code dan penjelasan untuk langkah-demi-langkah pelaksanaan suatu Edison compiler dan sederhana untuk mendukung sistem operasi, semua ditulis dalam Edison sendiri (kecuali untuk mendukung kernel ditulis secara simbolis assembler untuk PDP 11/23; lengkap sumber juga dapat dipesan untuk IBM PC).
Hal yang paling menarik tentang buku ini adalah: 1) kemampuan untuk menunjukkan bagaimana untuk membuat lengkap, mandiri, mempertahankan diri, berguna compiler dan sistem operasi, dan 2) diskusi yang menarik dari bahasa desain dan spesifikasi masalah dan trade-off dalam Bab 2.
"Brinch Hansen pada Pascal Compiler" oleh Per Brinch Hansen Prentice-Hall tahun 1985 ISBN 0-13-083098-4
Lain cahaya-di-teori berat-di-pragmatik berikut's-cara-untuk-kode-buku itu. Penulis menyajikan desain, implementasi, dan kode sumber lengkap untuk compiler dan p-code bahasa Pascal- (Pascal "minus"), sebuah Pascal subset dengan boolean dan tipe integer (tapi tanpa karakter, real, subranged atau tipe enumerated), konstan dan variabel definisi dan array dan record jenis (tapi tidak dikemas, varian, set, pointer, tanpa nama, berganti nama, atau jenis file), ekspresi, tugas laporan, bersarang prosedur definisi dengan nilai dan variabel parameter, jika konsolidasian, sementara laporan, dan begin-end blok (tapi tidak definisi fungsi, prosedural parameter, goto pernyataan dan label, laporan kasus, ulangi pernyataan, pernyataan, dan dengan pernyataan).
Compiler dan interpreter ditulis dalam Pascal (Pascal "bintang"), yang Pascal subset diperpanjang dengan beberapa Edison-gaya fitur untuk membuat pengembangan perangkat lunak sistem. Sebuah Pascal compiler untuk IBM PC yang dijual oleh penulis, tapi itu's mudah untuk port buku's Pascal - compiler untuk setiap perangkat Pascal platform.
Buku ini membuat desain dan implementasi compiler terlihat mudah. Saya sangat suka cara penulis ini berkaitan dengan kualitas, keandalan, dan pengujian. Compiler dan interpreter dapat dengan mudah digunakan sebagai dasar untuk lebih terlibat bahasa atau compiler proyek, terutama jika anda're ditekan untuk cepat mendapatkan sesuatu dan berjalan.
Cara mudah untuk membuat compiler untuk menggunakan bison dan flex (atau yang serupa), membangun sebuah pohon (AST) dan menghasilkan kode C. Dengan menghasilkan kode C menjadi langkah yang paling penting. Dengan menghasilkan kode C, bahasa anda akan secara otomatis bekerja pada semua platform yang memiliki C compiler.
Menghasilkan kode C semudah menghasilkan HTML (hanya menggunakan media cetak, atau yang setara), yang pada gilirannya adalah jauh lebih mudah daripada menulis C atau HTML parser parser.
Anda harus memeriksa Darius Daging's "ichbins", yang merupakan compiler untuk kecil Cadel dialek, menargetkan C, hanya dalam waktu 6 halaman kode. Keuntungan memiliki lebih dari kebanyakan mainan compiler adalah bahasa yang cukup lengkap bahwa compiler yang tertulis di dalamnya. (Tarball-nya juga termasuk seorang penerjemah untuk bootstrap hal.)
Ada's barang-barang yang lebih tentang apa yang saya temukan berguna dalam belajar untuk menulis compiler pada saya Ur-Skema halaman web.