- Catatan yang menganalisis kode C interpreter bahasa K sepanjang 50 baris buatan Arthur Whitney sambil menafsirkan gaya pemrogramannya yang unik
- Kode tersebut memuat banyak struktur eksperimental yang berbeda dari kode C pada umumnya, seperti sintaks padat berbasis makro, ekstensi C nonstandar, dan penggunaan argumen implisit
- Penulis menafsirkan sendiri makna tiap makro dan fungsi sambil menelusuri filosofi bahasa keluarga APL serta kelebihan dan kekurangan kepadatan kode
- Sebagai kelebihan, penulis menyoroti panjang yang singkat dan daya susun yang tinggi, sementara kekurangannya adalah sintaks nonstandar dan menurunnya keterbacaan
- Pada akhirnya, kode ini dinilai sebagai contoh yang menunjukkan pentingnya cara berpikir menulis kode setelah sepenuhnya memahami masalah, bukan sekadar “cara menulis dengan singkat”
Arthur Whitney dan kodenya
- Arthur Whitney adalah ilmuwan komputer yang merancang bahasa A, K, Q serta basis data kdb, Shakti
- kdb adalah basis data deret waktu berkecepatan sangat tinggi yang digunakan di sektor finansial, sedangkan Shakti adalah versi yang lebih cepat dan dirancang untuk menangani dataset berskala 1 triliun baris
- Bahasa-bahasanya adalah bahasa berbasis array yang sangat dipengaruhi APL, dengan penekanan pada keringkasan dan daya ekspresi matematis
- Fokus tulisan ini bukan pada aplikasi finansialnya, melainkan pada analisis gaya unik kode C yang ditulis Whitney
Struktur interpreter K 50 baris
- Repositori publik ksimple memuat interpreter C sekitar 50 baris yang ditulis Whitney hanya dalam beberapa hari
- Inti kodenya terdiri dari dua berkas,
a.h dan a.c, dengan ciri khas pemendekan definisi fungsi melalui makro dan struktur yang memperlakukan pointer seperti integer
- Melalui sintaks
typedef char*s,c;, s didefinisikan sebagai pointer string dan c sebagai tipe karakter
s Q=(s)128; adalah contoh pointer yang digunakan seperti integer, dan di seluruh kode Q dipakai sebagai nilai khusus yang menandakan status error
- Banyak dipakai sintaks ekstensi GCC seperti statement expression berbentuk
({e;}) dan operator ?:
Makna makro dan fungsi utama
#define _(e...) ({e;}) : makro yang membungkus beberapa pernyataan menjadi satu ekspresi
#define i(n,e) : bentuk ringkas perulangan, menuliskan loop for dalam satu baris
#define Q(e) dan sejenisnya adalah makro penanganan error, sedangkan Qr, Qd, Qz masing-masing mengembalikan error rank, domain, dan not-yet-implemented
- Makro
_s, _i, f, F menyederhanakan deklarasi fungsi dan secara implisit memakai argumen x, a
ax, ix, nx dan lainnya adalah makro untuk pemeriksaan tipe data dan pengindeksan, dengan ax menentukan apakah “x adalah atom”
f(w,write(1,ax?&x:x,ax?1:strlen(x));x) adalah fungsi output: jika atom maka dicetak sebagai karakter, jika vektor maka sebagai string
Cara kerja interpreter
- Fungsi
m(x) melakukan alokasi memori dan pembuatan pointer yang memuat informasi panjang, dengan panjang maksimum vektor 255 byte
- Makro
g(a,v) menyatukan penanganan operasi atom/vektor, dan fungsi seperti not, sub, At, _A didefinisikan berdasarkan makro ini
- Makro
G(f,o) melakukan pembuatan otomatis fungsi operator biner, mendukung operasi seperti <, ==, +, *, &, |
cat, rev, cnt, Tak adalah fungsi manipulasi vektor, dan rev membuat indeks terbalik dengan memakai fungsi ind
- Fungsi
e() adalah evaluator rekursif yang membaca string dari kanan ke kiri untuk menangani variabel satu karakter, angka, dan operator
main() berbentuk loop REPL yang menerima input, mengevaluasinya dengan e(), lalu mencetak hasilnya
Penilaian terhadap gaya kode
- Kelebihan
- Himpunan operasi primitif yang ringkas dan tersusun dari makro yang dapat dikombinasikan
- Karena panjang kode yang pendek, seluruh logika bisa dilihat sekaligus tanpa perlu scroll
- Ekspresi berkepadatan tinggi memampatkan struktur logis kode
- Kekurangan
- Penanganan tipe yang tidak bermakna secara semantik karena
char* diperlakukan seperti integer
- Keterbacaan menurun akibat penggunaan langsung kode ASCII, operator ternary yang rumit, dan sintaks nonstandar
- Argumen implisit dan nama variabel yang pendek membuat niat kode sulit dipahami
- Unsur netral
- Sintaks khusus GCC (
?:, statement expression) menarik, tetapi mengurangi portabilitas
- Penggunaan argumen implisit berguna pada kode kecil, tetapi bisa menimbulkan kebingungan pada kode besar
- Nama yang pendek efisien setelah terbiasa, tetapi lemah dalam menyampaikan makna
Kesimpulan dan pelajaran
- Kode ini bukan sekadar soal “cara menulis dengan singkat”, melainkan menunjukkan cara berpikir menulis kode setelah masalah dipahami sepenuhnya
- Kode Whitney adalah bentuk pemindahan model matematis yang sudah selesai ke dalam kode, yaitu “hasil mengekspresikan pikiran ke dalam kode”
- Penulis merefleksikan kebiasaannya selama ini yang cenderung menyelesaikan masalah di dalam kode,
dan ke depan menekankan pentingnya pemodelan konseptual dan penataan pikiran sebelum menulis kode
- Pada akhirnya, eksperimen ini dirangkum sebagai pengalaman untuk melatih kemampuan membaca kode dan menelusuri keseimbangan antara kepadatan kode dan kejernihan berpikir
Ide eksperimen lanjutan
- Usulan latihan memperluas interpreter:
- Dukungan vektor floating-point
- Penanganan elemen lebih dari 255 buah
- Angka dan nama variabel multikarakter
- Literal array dan pengabaian spasi
- Penambahan manajemen memori dan fitur penanda error
- Menyelesaikan fungsi yang belum diimplementasikan
- Perluasan semacam ini dapat menjadi eksperimen untuk mengembangkan gaya kode ala Whitney menjadi bahasa yang benar-benar dapat dipakai sambil tetap mempertahankan ciri khasnya
Belum ada komentar.