Tulisan yang Mengubah Cara Pandang Saya terhadap Bahasa Pemrograman
(bernsteinbear.com)- Memperkenalkan berbagai tulisan, makalah, dan video yang secara mendasar mengubah cara pandang terhadap bahasa pemrograman dan kompiler
- Materi yang sangat memperluas pemahaman tentang implementasi GC, perancangan optimizer, alokasi register, dan mesin regular expression yang praktis
- Z3, abstract domain, bentuk SSA, dan E-Graphs dijelaskan dengan mudah melalui contoh kode nyata sebagai algoritme dan struktur yang benar-benar dipakai di lapangan
- Setiap materi menguraikan konsep yang rumit secara ringkas namun tetap dapat dikembangkan dan mudah dipahami
Perkenalan tulisan-tulisan yang membawa perubahan cara pandang tentang bahasa pemrograman dan kompiler
- Sesekali saya menemukan makalah, posting blog, video, dan semacamnya yang benar-benar mengubah cara saya berpikir tentang topik terkait bahasa pemrograman dan kompiler
- Beberapa tulisan memberi pengaruh yang sangat kuat, sampai-sampai saya bahkan tidak ingat lagi bagaimana saya memikirkannya sebelum membacanya.
- Di bawah ini adalah pengenalan terhadap materi-materi seperti itu (tanpa urutan tertentu)
Terkait GC, optimizer, abstract domain, dan alokasi register
- Andy Wingo, a simple semi-space collector, menjelaskan dengan sangat baik proses menerapkan konsep garbage collector Cheney/salin/pemadatan dari teori ke praktik
- Implementasi inti GC di artikel tersebut sangat ringkas, dapat dikembangkan, dan bisa dipahami dalam setengah hari
- Tulisan CF Bolz-Tereick, Implementing a Toy Optimizer, memicu perubahan cara pandang tentang metode instruction rewrite dalam optimizer
- Alih-alih sekadar cari-ganti sederhana, tulisan ini menekankan penggunaan forwarding pointer dan memperkenalkan konsep union-find
- Seluruh seri toy optimizer memuat hal-hal baru dan menarik di setiap artikelnya
- Artikel A Knownbits Abstract Domain for the Toy Optimizer, Correctly sekaligus memperkenalkan abstract domain baru dan cara memanfaatkan Z3
- Artikel ini menunjukkan bukan hanya bagaimana Z3 digunakan untuk berbagai pembuktian operasi numerik, tetapi juga contoh pemakaiannya sebagai mesin verifikasi kode Python
- Juga memperkenalkan gagasan bahwa bila Z3 tidak dapat menemukan counterexample, maka ada jaminan kebenaran atas kode tersebut
- Dalam Cranelift, Part 3: Correctness in Register Allocation, Chris Fallin menjelaskan pendekatan membuktikan langsung alokasi register yang benar untuk setiap input
- Di lingkungan produksi, hasilnya adalah alokasi yang benar atau crash yang bermakna
- Juga memperkenalkan pendekatan menelusuri ruang keadaan dan mendeteksi bug dengan teknik fuzzing
Terkait parsing, interpreter, JIT, dan struktur abstrak
- Regular Expression Matching: the Virtual Machine Approach karya Russ Cox menyajikan implementasi mesin regular expression dalam sekitar 50 baris kode yang mudah dibaca
- Dalam prosesnya, prinsip coroutine, fiber, scheduler, dan sebagainya juga dijelaskan dengan mudah
- micrograd karya Andrej Karpathy adalah contoh implementasi ultra-kecil yang menjalankan neural network tanpa pustaka eksternal, membantu memahami struktur dan prinsip dasar machine learning
- How I implement SSA form karya Fil Pizlo memperkenalkan cara baru untuk memperbaiki struktur union-find
- Dalam transformasi SSA, pointer tambahan dikelola sebagai Identity tag di dalam objek
- Selain itu, tulisan ini juga menawarkan bahan pemikiran lain seperti Phi/Upsilon form dan efek heap bergaya TBAA
- Speculation in JavaScriptCore karya Fil Pizlo membahas secara rinci berbagai cara implementasi optimizer di JavaScriptCore
- Setiap kali membaca ulang tulisan ini, saya selalu mendapatkan insight baru
Desain kompiler, parser, struktur IR, E-Graphs
- Dalam presentasi Chandler Carruth, Modernizing Compiler Design for Carbon Toolchain (sekitar menit ke-29), dijelaskan proses menetapkan target waktu kompilasi yang sangat cepat dan merancang keseluruhan strukturnya
- Mulai sekitar menit ke-40, struktur tiap lapisan dijabarkan satu per satu
- A Python Interpreter Written in Python karya Allison Kaptur membantu memahami dengan mudah cara kerja interpreter bytecode internal CPython
- Parsing expressions by precedence climbing karya Eli Bendersky memperkenalkan metode parsing Precedence Climbing yang lebih mudah dipahami dan lebih ringan dikembangkan dibanding parser recursive descent tradisional
- Ruby JIT Challenge karya Takashi Kokubun menunjukkan pembuatan kode dan metode baru alokasi register (stack folding at compile-time)
- An Incremental Approach to Compiler Construction (PDF) karya Abdulaziz Ghuloum menjelaskan metode implementasi single-pass yang memungkinkan memahami desain kompiler bertahap tradisional sekaligus
- Pendekatannya adalah menambahkan tiap fitur secara bertahap dari ujung ke ujung
- Lessons from Writing a Compiler karya Fernando Borretti menjelaskan strategi implementasi kompiler dengan bahasa yang jelas dan tegas
- Makalah egg: Fast and extensible equality saturation secara mendasar mengubah cara pandang terhadap optimizer dan urutan pass
- Makalah ini menawarkan cara berpikir dengan membuat semua versi yang mungkin dari ekspresi sebagai hypergraph terkompresi lalu memilih versi terbaiknya
- Cranelift: Using E-Graphs for Verified, Cooperating Middle-End Optimizations karya Chris Fallin membuktikan bahwa e-graphs bekerja efektif bahkan di kompiler komersial nyata
- Acyclic Egraphs and Smart Constructors karya Phil Zucker mengeksplorasi struktur e-graph asiklik dan pemanfaatan smart constructor
- Awalnya sulit dipahami, tetapi seiring waktu tulisan ini makin terasa mendalam
Penyimpanan AST, analisis dinamis paralel skala besar, dan lain-lain
- komentar Reddit ini dari Bob Nystrom dan Flattening ASTs karya Adrian Sampson
- membahas cara menyimpan AST secara padat hampir seperti bytecode, dan
- memunculkan diskusi besar bahwa jika node IR disimpan dengan cara seperti ini, analisis paralel lock-free skala besar juga dimungkinkan
- komentar Cliff Click tentang kecepatan alokasi buffer juga memengaruhi cara berpikir ini
1 komentar
Opini Hacker News
Saya sangat menyukai tulisan ini; akhir-akhir ini saya banyak mendalami riset ilmu komputer, tetapi masih ada beberapa hal yang disebut di sini yang belum pernah saya temui. Saya ingin memperkenalkan beberapa paper yang saya sukai tetapi tidak ada di sini: “Open, Extensible Object Models” karya Ian Piumarta membahas sistem metaobjek berorientasi objek yang minimalis dan memberi kebebasan semaksimal mungkin kepada programmer; pada dasarnya hanya operasi pengiriman pesan yang didefinisikan, dan semua sisanya dapat diubah saat runtime. Rasanya seperti versi praktis dari “Art of the Metaobject Protocol”. “Scripting: Higher-Level Programming for the 21st Century” karya John Ousterhout membahas dikotomi antara bahasa pemrograman sistem dan bahasa skrip; kita selalu menginginkan bahasa multiparadigma sempurna yang bisa melakukan semuanya dengan cepat dan produktif, tetapi sering kali lebih baik jika bahasa sistem yang cepat, kompleks, dan terkompilasi dipadukan dengan frontend interpreter yang nyaman dan fleksibel. Bahkan, sering kali cukup dengan memakai C dan Tcl bersama-sama. Ini wajib dibaca bagi siapa pun yang membuat bahasa pemrograman. Project Oberon karya Niklaus Wirth adalah contoh implementasi seluruh sistem komputer, mulai dari UI tingkat tinggi hingga kernel, compiler, dan arsitektur CPU mirip RISC. Ia menyampaikan seruan kuat untuk “lean software” dan benar-benar mempraktikkannya; di zaman sekarang yang penuh dependency hell dan abstraksi berlebihan, itu terasa seperti keahlian yang telah hilang
Saya sangat menyukai tulisan ini; tulisan-tulisan tentang bahasa pemrograman telah mengubah cara saya memandang pemrograman itu sendiri. Saya sering teringat kutipan tentang “safety” dari TAPL(Types and Programming Languages): bahasa yang aman adalah bahasa yang mencegah programmer menembak kaki sendiri dan melindungi abstraksi yang mereka buat. Dengan kata lain, yang penting adalah kemampuan bahasa untuk menjamin integritas abstraksi yang disediakan bahasa itu sendiri maupun abstraksi tingkat lebih tinggi yang dibuat programmer. Misalnya, jika ada abstraksi array, maka ia hanya boleh berubah ketika diperbarui secara eksplisit, dan tidak boleh ikut rusak hanya karena struktur data lain disentuh secara keliru
Bicara soal kebiasaan pengembangan yang menarik… Aaron Hsu, yang terkenal karena APL, menulis kode dengan gaya kaligrafi memakai pena fountain untuk merapikan pikirannya. Saya melakukan hal serupa dengan menggambar semacam flowchart objek Python memakai bolpoin murahan untuk menyusun pikiran saya, semacam UML versi murah
Saya juga cenderung mencari pena fountain saat mengerjakan masalah yang paling sulit. Memakainya terasa seperti masuk ke ruang berpikir yang sepenuhnya berbeda. Karena ada batasan dalam mengedit, itu mendorong cara berpikir yang lebih konsisten dan linear, tetapi tetap membuka kreativitas karena saya bisa bebas berpindah antara bahasa Inggris, kode, matematika, diagram, dan sebagainya
Hubungan antara tulisan tangan dan peningkatan daya ingat memang telah terbukti. Mengetik catatan di komputer itu rasanya setara dengan meninggalkan sidik jari di gagang pintu. Saya berharap teknologi OCR menjadi begitu bagus sehingga kita bisa mencatat sepenuhnya dengan tulisan tangan dan tetap bisa menyimpan serta mencarinya dengan sempurna
Saya sangat merekomendasikan untuk menonton ceramah Rich Hickey, terutama ceramah-ceramah awalnya. Ceramah seperti itulah yang benar-benar mengubah cara saya memandang pemrograman itu sendiri
Bagi saya, ceramah Rich Hickey bersama “Programming Perl” karya Larry Wall adalah yang paling berpengaruh
Saya bahkan ingin bercanda agar orang melewatkan ceramah “Simple made easy” karena selama 10 tahun terakhir semua pembicara konferensi terus-menerus mengutipnya sampai terasa klise. Secara pribadi saya lebih suka “Hammock driven development”, meski itu kurang cocok untuk direkomendasikan di kantor
Sayang sekali Abdulaziz menjadi lebih diam setelah kembali ke Kuwait. Ia adalah intern Maxine VM pada 2009 dan orang yang sangat baik. Paper itu benar-benar permata
Baru-baru ini ada tulisan bagus tentang interpreter berbasis closure untuk mempercepat interpreter. Saya memakai teknik itu untuk membuat interpreter brainfuck sederhana, dan hasilnya cukup cepat. Mungkin saya tidak akan memakainya di tempat lain, tetapi sebagai eksperimen itu cukup bermanfaat
Saya berharap ada tulisan seperti ini tentang bahasa tingkat lebih tinggi seperti JavaScript atau .NET. Penulis ini jelas sangat cerdas, tetapi ia bekerja di tingkat yang lebih rendah (atau lebih tinggi?) daripada kebanyakan pengguna
Tulisan-tulisan lain di blognya juga benar-benar luar biasa
Terkait micrograd: saya penasaran apakah ada dokumentasi yang lebih banyak selain source code di repositori Github
Saya mengatakan ini karena saya menyukai orang ini, tetapi tulisan-tulisan di sini sebenarnya bukan tentang PL (bahasa pemrograman) itu sendiri; hampir semuanya lebih tentang compiler (kecuali garbage collector). Tentu saya juga suka compiler, tetapi itu topik yang berbeda dari PL