Asal
Beberapa tahun yang lalu saya menulis kompilator Pascal. Motivasinya sederhana: sebagai seorang remaja, saya telah belajar dari buku teks pemrograman pertama saya bahwa kompiler adalah hal yang sangat canggih. Klaim ini akhirnya menjadi tantangan dan harus diuji oleh pengalaman.
ha.art.plPertama, kompiler
PL / 0 sederhana muncul, dan kemudian kompilator Pascal yang hampir berfungsi penuh untuk MS-DOS telah berkembang darinya. Sumber inspirasi saya adalah buku
Compiler Construction karya Niklaus Wirth, penemu bahasa Pascal. Saya tidak peduli jika pandangan Wirth sekarang dianggap usang dan tidak memiliki koneksi langsung ke arus utama TI, atau jika mode desain kompiler telah berubah. Cukup untuk mengetahui bahwa tekniknya masih sederhana, elegan, dan - terakhir tapi tidak kalah penting -
membawa banyak kesenangan , karena lebih menarik untuk mengurai sumber program dengan parser keturunan rekursif tulisan tangan dan menghasilkan kode mesin, daripada untuk sebut
yaccs ,
bison , dan semua keturunan mereka.
Nasib kompiler saya tidak sepele. Itu telah hidup dua kehidupan: yang pertama di tangan saya sendiri, dan yang kedua di tangan komputer antiquarians dari Polandia.
Xd pascal
Kompiler saya yang baru lahir bernama
XD Pascal . Ini mendukung semua pernyataan Pascal kecuali
goto
dan
with
. Yang pertama tampaknya sulit untuk diimplementasikan, karena akan menghancurkan struktur program hierarki yang sempurna. Yang terakhir bisa membuat aturan ruang lingkup sederhana ambigu.
Semua tipe data utama juga didukung. Di luar ruang lingkup hanya bilangan bulat, set, enumerasi dan catatan varian yang tidak ditandatangani - tetapi semua ini jelas bukan kebutuhan sehari-hari. Namun demikian, saya tidak dapat menyangkal diri saya dengan senang memperkenalkan nomor floating-point dan aritmatika FPU 8087 - itulah dampak dari kecanduan profesional saya pada perhitungan teknik.
Ketika menerapkan prosedur dan fungsi, saya takut rekursi dan penyimpanan variabel lokal di stack akan menjadi masalah besar. Namun, kesulitan nyata spesifik Pascal adalah dengan subrutin bersarang. Seseorang dapat memiliki keinginan yang tidak bersalah untuk mengakses variabel lokal subrutin luar dari dalam variabel internal. Namun, subrutin bagian dalam tidak memiliki alamat bingkai tumpukan untuk bagian luar, dengan kata lain, subrutin bagian dalam tidak memiliki sumber asal untuk digunakan dengan variabel offset. Alamat ini harus diteruskan ke subrutin bagian dalam sebagai argumen tersembunyi tambahan. Saya kira kesulitan inilah yang memaksa para perancang C untuk sepenuhnya meninggalkan sarang subrutin. Tetapi Pascal masih memilikinya, dan fitur ini tidak dapat diabaikan.
Pembuat kode menciptakan executable COM paling sederhana untuk MS-DOS real-mode. Instruksi mesin dihasilkan secara langsung, tanpa assembler atau tautan eksternal. Saya menggunakan register 32-bit untuk data, tetapi pengalamatannya tetap 16-bit (pasangan segmen / offset).
Model memori mirip dengan yang 'kecil' (jika seseorang masih ingat terminologi era 16-bit ini): kode, data, dan stack menempati masing-masing segmen 64 kbyte.
Penggunaan memoriMenghasilkan EXE dan mengganti segmen dengan cepat sepertinya terlalu keras, dan keterbatasan model 'kecil' yang memaksa saya untuk mengucapkan selamat tinggal pada kompilasi diri. Tentu saja saya melihat beberapa kompiler kompilasi-sendiri yang kodenya cocok hanya dalam satu segmen (misalnya,
Konteks ). Namun, mereka jarang bisa melakukan apa pun yang berguna selain kemampuan untuk menyusun diri. Sebaliknya, saya ingin membuat kompiler saya cocok untuk perhitungan numerik dan grafik. Itu sebabnya saya memasukkan, di antara contoh-contoh lain, fraktal, metode Gauss untuk menyelesaikan persamaan linier, transformasi Fourier cepat, dan bahkan filter Kalman untuk memperkirakan kesalahan sistem navigasi inersia.
Mandelbrot mengatur fragmen
Transformasi fourier cepat
Estimasi kesalahan sistem navigasi inersiaApa yang akhirnya saya dapatkan sangat mirip dengan Turbo Pascal 3.0 kuno (tanpa OOP) dan
BeRo Tiny Pascal amatir. Penulis yang terakhir telah berhasil mengompilasinya di bawah Windows, tetapi mengorbankan aritmatika floating-point dan banyak seluk beluk dari tata bahasa, yang ingin saya pertahankan. Di antara fitur-fitur yang lebih modern, XD Pascal saya mendapatkan komentar baris tunggal gaya Delphi (
//
) dan variabel
Result
.
Namun demikian, sejak kelahirannya, kompiler saya ditandai untuk mati. Pascal sudah tidak bisa lagi ketinggalan zaman, dan MS-DOS telah menjadi kuno jauh sebelumnya. Pada hari ketika saya beralih dari Windows XP 32-bit ke Windows 7 64-bit tanpa mesin virtual DOS, saya menganggap proyek saya mati.
Kebangunan rohani
Kemudian sesuatu yang aneh terjadi. Setelah tiga tahun dilupakan, tim penggemar retrocomputing Polandia dan penggemar Atari telah menemukan kompiler saya. Tampaknya mereka tidak terlalu peduli dengan masalah-masalah abstrak seperti kompilasi diri atau ketatnya tata bahasa. Mereka hanya membutuhkan alat pemrograman yang nyaman untuk mesin favorit mereka. Menggunakan proyek saya, mereka membangun kompiler
Pascal Mad mereka sendiri untuk arsitektur 6502. Tata bahasa diperluas, dukungan ditambahkan untuk unit terpisah dengan antarmuka dan bagian implementasi, pernyataan
goto
, bilangan bulat tak bertanda, set dan enumerasi, kode perakitan inline. Alih-alih kode mesin, kode perakitan dihasilkan. Itu kemudian diterjemahkan oleh assembler homebrew.
Penampilan luar bahasa telah menjadi jauh lebih dekat dengan Pascal standar de-facto. Internal kompiler terlihat agak mengerikan, kata-kata yang dicadangkan dicampur dengan nama-nama subrutin standar, tetapi ini tidak mengganggu para pengembang. Apa pun bentuknya, usaha ini secara mengejutkan layak: selama tiga tahun Mad Pascal telah diperbarui secara teratur, banyak game yang ditulis di dalamnya, setiap tahun penulis menghadiri konferensi retrocomputing
Silly Venture (tautan mungkin memerlukan VPN). Tampaknya tradisi Atari sangat kuat di Polandia.
Sebuah peristiwa yang nyata bagi para penggemar Atari di Polandia terjadi pada musim semi 2018: buku
Robbo. Solucja (
Robbo. Walkthrough ), contoh literatur eksperimental, diterbitkan. Saya perlu menekankan di sini bahwa permainan
Robbo untuk Atari, yang diterbitkan 30 tahun yang lalu, masih menggairahkan penggemar Polandia yang lebih tua dan mengisinya dengan semacam kesenangan patriotik. Secara umum, tidak mengherankan bahwa muncul sebuah buku yang terinspirasi oleh permainan. Tetapi fakta lucu adalah bahwa 60 persen dari buku itu, seperti yang dikatakan penulis, adalah tutorial penelusuran yang dihasilkan oleh komputer Atari itu sendiri. Program pembuatan teks ditulis dalam Mad Pascal.
graczpospolita.plSepertinya
beberapa orang menganggap buku itu sebagai contoh hebat seni kontemporer:
Akan menyesatkan untuk memperlakukan buku ini hanya sebagai barang koleksi untuk penggemar Robbo , atau, lebih umum, penggemar Atari. Kami berurusan dengan contoh langka interaksi antara budaya video game dan literatur (dalam hal ini, literatur elektronik), di mana titik awalnya adalah 'permainan', bukan 'sastra'. Bagi sebagian orang, itu adalah 'seni untuk seni' yang tidak berarti. Bagi yang lain, crossover semacam itu menawarkan peluang dan pengalaman yang sama sekali baru. Tidak ada yang mencegah Anda membuat versi Robbo yang bisa Anda selesaikan menggunakan 'langkah-langkah' dari buku. Buku ini sangat cocok dengan pandangan saya tentang video game sebagai seni. Seni, di mana pemain bisa menjadi penerima dan pencipta - jika selama 'permainan' ada 'penonton' menonton pemain menciptakan sejarah 'permainan' sendiri. Isi buku dapat disesuaikan dengan pertunjukan pertunjukan dengan seorang aktor yang bermain Robbo menggunakan unsur-unsur 'langkah-langkah' dari buku. Agar tidak tetap tidak berdasar: kinerja berdasarkan Robbo. Solucja berlangsung pada 11 Mei 2018 di galeri seni kontemporer Bunker di Krakow, selama presentasi buku yang menyertai pameran Tanpa Batas .
Pertunjukan pertunjukan di Krakow. Perlu menulis kompiler.