Asalnya
Beberapa tahun yang lalu saya menulis kompilator Pascal. Motivasinya sederhana: di masa muda saya, saya belajar dari buku pemrograman pertama saya bahwa kompiler adalah hal yang sangat rumit. Pernyataan ini telah menjadi duri di otak dan akhirnya membutuhkan percobaan.
ha.art.plPertama, kompiler
PL / 0 paling sederhana lahir, dan darinya kompilator Pascal yang hampir berfungsi penuh untuk MS-DOS secara bertahap tumbuh. Saya terinspirasi oleh buku
Compiler Construction , yang ditulis oleh pencipta bahasa Pascal Nicklaus Wirth. Dan bahkan jika pandangan Wirth sudah usang dan telah kehilangan semua koneksi dengan realitas IT, dan kompiler tidak melakukan apa-apa sama sekali seperti yang diajarkan Wirth. Namun, metodenya masih sederhana, elegan, dan yang paling penting - mereka
membawa kegembiraan , karena jauh lebih menarik untuk secara independen mengurai teks program dengan turun secara rekursif dan menghasilkan kode mesin daripada meminta bantuan dari
yak ,
bison dan semua penerusnya.
Nasib kompiler saya bukanlah yang paling sepele. Dia menjalani dua kehidupan: yang pertama - di tangan saya, yang kedua - di tangan para penikmat komputer kuno Polandia.
Xd pascal
Kompiler saya yang baru dipanggang disebut
XD Pascal . Ini mendukung semua operator Pascal kecuali
goto
dan
with
. Yang pertama tampaknya sulit untuk diimplementasikan, karena menghancurkan struktur hierarki idealnya dari program. Yang kedua menciptakan kebingungan dengan ruang lingkup nama.
Semua tipe data utama didukung. Hanya bilangan bulat, set, enumerasi, dan entri varian yang tidak ditandatangani yang diabaikan - namun, semua ini jelas bukan kebutuhan esensial. Namun demikian, saya tidak dapat menyangkal kesenangan angka floating-point dan aritmatika mereka pada coprocessor 8087 - itu mempengaruhi kecenderungan profesional untuk perhitungan teknik.
Ketika menerapkan prosedur dan fungsi, saya takut rekursi dan menyimpan variabel lokal di stack akan menjadi masalah besar. Namun, kesulitan sebenarnya, khusus untuk Pascal, menunggu di tempat yang sama sekali berbeda - dalam bekerja dengan prosedur bersarang. Suatu kebutuhan yang sama sekali tidak bersalah mungkin muncul untuk merujuk pada variabel lokal dari prosedur eksternal dari internal. Namun, prosedur internal tidak memiliki alamat bingkai tumpukan prosedur eksternal - prosedur internal tidak tahu dari mana membaca alamat variabel. Alamat ini harus selalu diteruskan ke prosedur internal melalui parameter tersembunyi tambahan. Saya menduga bahwa inilah komplikasi yang membuat pengembang C benar-benar mengabaikan fungsi yang bersarang. Namun, dalam Pascal mereka, dan ini harus diperhitungkan.
Pembuat kode menciptakan executable COM paling sederhana untuk mode nyata MS-DOS. Kode mesin dihasilkan secara langsung, tanpa bantuan assembler atau linker eksternal. Untuk data, saya menggunakan register 32-bit dari arsitektur 80386, dan pengalamatannya tetap 16-bit, dalam bentuk pasangan segmen-offset.
Model memori kira-kira sesuai dengan "kecil" (jika orang lain mengingat terminologi ini dari era 16-bit): untuk kode, data global dan tumpukan, satu segmen 64-kb dialokasikan.
Penggunaan memoriMenghasilkan file EXE dan beralih segmen dengan cepat tampak agak luar biasa, dan ruang lingkup yang sempit dari model "kecil" membuat saya mengucapkan selamat tinggal pada gagasan kompilasi diri. Tentu saja, saya telah menemukan kompiler kompilasi-sendiri yang kodenya sepenuhnya cocok dalam satu segmen (misalnya,
Konteks ). Namun, mereka jarang tahu bagaimana melakukan sesuatu yang berguna selain kompilasi diri ini. Saya ingin membuat kompiler saya setidaknya cocok untuk perhitungan numerik dan output grafik. Oleh karena itu, di antara contoh program, fraktal muncul, solusi persamaan Gaussian linier, transformasi Fourier cepat, dan bahkan estimasi oleh filter Kalman dari kesalahan sistem navigasi inersia.
Fragmen dari set Mandelbrot
Transformasi Fourier Cepat
Estimasi kesalahan sistem navigasi inersiaApa yang saya dapatkan sebagai hasilnya, yang paling mirip dengan dunia kuno sebagai dunia Turbo Pascal 3.0 (masih tanpa OOP) dan
BeRo Tiny Pascal amatir. Penulis yang terakhir mengatasi kompilasi diri di bawah Windows, tetapi dia mengorbankan aritmatika floating-point dan banyak seluk beluk tata bahasa yang ingin saya amati. Dari fitur-fitur yang lebih modern di Pascal XD saya, komentar single-line (
//
) yang dipinjam dari Delphi dan
Result
otomatis
Result
.
Namun, sejak saya lahir, kompiler saya ditandai dengan meterai maut. Pascal sudah keluar dari mode, dan MS-DOS telah lama menjadi kuno. Hari itu, ketika saya beralih dari Windows XP 32-bit ke Windows 64-bit tanpa mesin virtual DOS, saya secara mental mengubur proyek saya.
Kelahiran kembali
Kemudian terjadi hal aneh. Setelah tiga tahun dilupakan total, sekelompok penggemar retrocomputing Polandia dan pecinta Atari menemukan kompiler saya. Rupanya, masalah abstrak kompilasi diri dan kerasnya implementasi tata bahasa tidak terlalu mempedulikan mereka. Mereka hanya membutuhkan alat pemrograman yang nyaman untuk mobil favorit mereka. Dari proyek saya, mereka membuat kompiler sendiri
Mad Pascal untuk arsitektur 6502. Tata bahasa meningkat, dukungan untuk modul dengan bagian antarmuka dan implementasi, operator
goto
, bilangan bulat tak bertanda, set dan enumerasi, sisipan assembler muncul. Alih-alih kode mesin, kode assembler sekarang dihasilkan. Siaran terakhirnya dibuat oleh perakit desainnya sendiri.
Secara lahiriah, bahasa tersebut menjadi lebih dekat dengan standar Pascal yang sebenarnya. Di dalam, kompiler terlihat agak menakutkan, kata-kata yang dicadangkan dicampur dengan nama prosedur standar, tetapi ini tidak mengganggu penulis sama sekali. Tidak peduli bagaimana kelihatannya, ternyata sangat ulet: Mad Pascal telah diperbarui secara teratur selama tiga tahun, ia telah menulis banyak permainan, dan setiap tahun penulis berbicara di
retroconference Silly Venture (tautan memerlukan VPN). Ada perasaan bahwa di Polandia, tradisi Atari umumnya sangat kuat.
Pada musim semi tahun 2018, sebuah peristiwa terjadi yang cukup luar biasa untuk pesta penggemar Atari Polandia: buku
โRobbo. Solucja " (" Robbo. Passage ") dalam genre sastra eksperimental. Di sini saya harus mengatakan bahwa permainan
Robbo untuk Atari, yang diterbitkan 30 tahun yang lalu, masih menggairahkan hati orang-orang Polandia generasi yang lebih tua dan mengisinya dengan antusiasme patriotik. Secara umum, tidak mengherankan bahwa ada buku yang didedikasikan untuk permainan. Yang lucu adalah bahwa menurut penulis, itu terdiri dari 60% dari instruksi untuk melewati permainan yang dihasilkan oleh komputer Atari itu sendiri. Program generasi ditulis pada Pascal Gila yang sama.
graczpospolita.plDan tampaknya
beberapa orang menganggap buku itu sebagai contoh seni modern yang layak:
Akan keliru jika memperlakukan buku hanya sebagai koleksi untuk penggemar Robbo atau, lebih umum, untuk penggemar Atari. Kita harus berurusan dengan kasus langka tabrakan budaya video game dengan literatur (dalam hal ini, elektronik), ketika titik awalnya adalah "permainan" dan bukan "sastra". Bagi sebagian orang, ini adalah seni yang tidak berarti demi seni. Bagi yang lain, persilangan ini membawa peluang dan pengalaman yang sama sekali baru. Tidak ada yang mencegah Anda membuat versi Robbo, yang bisa Anda selesaikan dengan "walk through" dari buku. Buku ini sesuai dengan pandangan saya tentang game sebagai seni. Suatu seni di mana pemain dapat mempersepsikan dan kreatif - jika selama "permainan" ada "penonton" menonton pemain menciptakan kisahnya sendiri dari "permainan". Isi buku dapat disesuaikan untuk kinerja dengan pemain yang melewati Robbo menggunakan unsur-unsur "petunjuk langkah demi langkah" dari buku. Agar tidak tetap tidak berdasar: kinerja berdasarkan โRobbo. Solucja โdiadakan pada 11 Mei 2018 di Bunker Gallery of Modern Art di Krakow, selama presentasi buku sebagai bagian dari Pameran yang Tidak Habis.
Pertunjukan di Krakow. Demi ini, ada baiknya menulis kompiler.