Kompilator Pascal saya dan Seni Kontemporer Polandia

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.

gambar
ha.art.pl

Pertama, 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.

gambar
Penggunaan memori

Menghasilkan 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.

gambar
Fragmen dari set Mandelbrot

gambar
Transformasi Fourier Cepat

gambar
Estimasi kesalahan sistem navigasi inersia

Apa 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.

gambar
graczpospolita.pl

Dan 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.

Source: https://habr.com/ru/post/id436694/


All Articles