Koding di Forth mengingatkan saya pada distopia tanpa hukum di Mad Max. Kamu membuat aturan sendiri, terbatas oleh konteksnya. Kamu bisa mendefinisikan kembali pernyataan IF jika kamu mau. Kamu bisa menulis ulang instruksi kode mesin untuk sebuah Kata. Kamu bahkan bisa mengubah Kata selama runtime. Karena Kata-kata menjadi kata kunci sendiri di Forth, kamu bisa membuat bahasa yang dioptimalkan untuk tujuan tertentu, memadatkan perintah-perintah yang seharusnya menjadi puluhan baris menjadi hanya satu. “Di Forth, kamu sedang menciptakan bahasa sendiri,” kata Leo Brodie, penulis buku Forth pertama, Starting Forth, memberitahu saya.
Sifat tingkat rendah Forth, meskipun kunci untuk daya pemrosesannya, membuat pemrograman terasa asing. Itu menggunakan postfix, sebuah bentuk notasi matematika yang membuat 2 + 1 menjadi 2 1+ dan yang menurut saya tidak intuitif atau bahkan sulit dibaca. Dan sementara kebanyakan bahasa memungkinkan memori untuk dibagi dan dipindahkan, Forth berbasis stack—yang berarti data disimpan secara kronologis dan dikelola berdasarkan prinsip terakhir masuk/terakhir keluar. Saya terus menemui bug, memaksa diri saya untuk meninggalkan konvensi pemrograman yang saya anggap universal. Saya merasa kesulitan berbicara dalam bahasa mesin.
Ketika saya mengirim email kepada Dupras untuk meminta bantuan, dia membandingkan penggunaan Forth dengan mengemudi mobil manual. Ini lebih terperinci dibandingkan dengan C. Dimana yang terakhir mendefinisikan konvensi panggilan, penyimpanan variabel, dan manajemen stack kembali, Forth meninggalkannya semua kepada programmer. Itu berinteraksi langsung dengan memori sama seperti C tetapi jauh lebih unggul dari C dalam kepresisian dan efisiensi. “Orang keliru menganggap Forth hanya sebagai bahasa,” kata Dupras. “Ini adalah cara untuk berinteraksi dengan komputer.”
Alasan Forth tidak lebih populer adalah alasan yang sama dengan sebagian besar dari kita mengemudi mobil otomatis. Ledakan komputasi pribadi tahun 1990-an memicu obsesi untuk membuat teknologi sesuai dengan telapak tangan Anda dan membuat kode lebih mudah untuk ditulis. Bahasa-bahasa diabstraksikan untuk melindungi para pemrogram dari diri mereka sendiri, dan entah bagaimana, kita tersesat. Hal-hal menjadi bengkak demi kenyamanan dan, dengan kata-kata Dupras, mulai “mengalir nanah yang tidak bisa dimengerti di setiap sudut.”
“Cara kita memahami efisiensi sangat terdistorsi,” kata Dupras. Forth adalah sabit untuk pemotong rumput Python. “Jika kamu menghitung jumlah joule per helai rumput, kamu akan menemukan bahwa orang yang memotong rumput dengan sabit lebih efisien,” katanya. “Ketika kamu memikirkan kecepatan, kamu akan melihat pemotong rumput sebagai lebih efisien.” Forth memaksa kamu untuk menjadi tepat dan efisien dalam pengelolaan memori—untuk mengatur sumber daya kamu dengan hati-hati, seperti yang akan kamu lakukan setelah kehancuran. Dupras memotong rumputnya sendiri dengan sabit, jelas. “Pada suatu titik, kamu bisa secepat pemotong rumput,” katanya.
Saya mulai menemukan jalanku. Alih-alih mengirim byte ke udara dan percaya sistem untuk mencari tahu di mana mereka pergi, seperti yang saya lakukan dalam Python, saya terbiasa bertanggung jawab untuk mengalokasikan dan menghapus memori. Satu-satunya yang bisa saya pikirkan adalah apa yang disimpan, di mana disimpan, dan berapa banyak ruang yang diperlukan. Setiap baris kode tiba-tiba membawa beban. Saya adalah Immortan Joe, laptop saya adalah Citadelpku, dan memori adalah airku.
Tidak lama kemudian saya mulai menyempurnakan dan mengulangi kode saya seperti yang saya lakukan pada kalimat yang berlarutan. Alih-alih mengharapkan mesin untuk memperkirakan kebutuhan saya, saya mencoba untuk berpikir seperti mesin, untuk bertemu dengannya lebih dari separuh jalan. Dan karena saya harus berpikir dua kali, semua singkatan yang rumit yang mengingatkan kita untuk singkat dalam bahasa pemrograman lainnya—YAGNI (kamu tidak akan membutuhkannya), KISS (simpel saja, bodoh), DRY (jangan mengulangi dirimu sendiri)—jadi usang.