- Inti produktivitas pemrograman terletak pada ekosistem library yang kaya, bukan pada bahasanya sendiri
- Framework seperti Ruby on Rails yang memanfaatkan fitur-fitur canggih bahasa dapat memberikan produktivitas tinggi bahkan bagi nonspesialis
- Namun, karena keterbatasan struktural bahasa, framework setingkat Rails sulit diimplementasikan dalam Java atau C
- Perancangan bahasa secara langsung menentukan bentuk dan kompleksitas library yang dapat ditulis, dan inilah tujuan esensial dari evolusi bahasa
- Bahasa Stanza menunjukkan, dari sudut pandang ini, pentingnya perancangan bahasa yang memungkinkan pembuatan library yang kuat dan mudah digunakan
Hubungan antara bahasa pemrograman dan library
- Sebagian besar bahasa pemrograman memiliki elemen dasar serupa seperti variabel, array, perulangan, dan fungsi
- Beberapa bahasa menyediakan fitur lanjutan seperti fungsi kelas satu atau coroutine, tetapi nonspesialis jarang menggunakannya
- Bagi banyak pengembang, faktor yang meningkatkan produktivitas adalah library, bukan bahasa
- Sebagai contoh, Ruby on Rails memudahkan pembuatan aplikasi web berbasis database
- Berkat Rails, preferensi sering kali lebih kuat pada framework-nya daripada pada bahasa Ruby itu sendiri
Interaksi antara Ruby on Rails dan fitur bahasa
- Rails memanfaatkan beragam fitur Ruby seperti metaprogramming, evaluasi saat runtime, fungsi kelas satu, dan garbage collection
- Contoh: ActiveRecords menggunakan metaprogramming, dan sistem template menggunakan evaluasi saat runtime
- Pemrosesan event diimplementasikan dengan cara meneruskan fungsi kelas satu sebagai callback
- Dalam Java atau C, fitur-fitur ini kurang memadai sehingga framework setingkat Rails tidak dapat diimplementasikan
- Metaprogramming di Java tidak cukup kuat untuk mengimplementasikan ActiveRecords
- Karena itu, Rails dimungkinkan oleh struktur bahasa Ruby, dan perancangan bahasa menentukan kemungkinan library
Perancangan bahasa menentukan bentuk library
- Bahasa C hanya mendukung reuse melalui deklarasi dan pemanggilan fungsi, sehingga sebagian besar library C berbentuk kumpulan fungsi
- Ruby mendukung fungsi kelas satu, sehingga “aksi yang dijalankan saat tombol diklik” dapat diekspresikan secara ringkas
- Sebaliknya, di Java perlu mendefinisikan kelas handler, sehingga kode menjadi lebih rumit
- Daya ekspresif bahasa secara langsung menentukan struktur dan kegunaan library
Munculnya software interaktif dan framework yang dapat diperluas
- Dalam komputasi batch pada tahun 1970-an, library yang berpusat pada fungsi sudah memadai
- Dalam software interaktif modern, dibutuhkan library yang dapat diperluas
- Pada GUI atau sistem berbasis event, diperlukan struktur seperti “jalankan kode saya saat pengguna mengklik”
- Java dan C++ mendukung perluasan melalui pewarisan dan method overriding, dan struktur ini berkembang menjadi framework
Latar belakang desain Stanza dan keterbatasan bahasa
- Motivasi desain Stanza berawal dari sulitnya menulis library pemrograman game yang mudah digunakan di Java
- Di Java, konkurensi harus diekspresikan sebagai state machine
- Scheme mendukung continuation sehingga implementasi yang lebih intuitif dimungkinkan
- Namun, Scheme tidak mendukung pemeriksaan tipe statis sehingga efisiensi debugging rendah
- Saat ini sebagian besar bahasa tidak dapat memperluas sistem tipe sebagai library
- Stanza menyediakan sistem tipe opsional, garbage collection, dan sistem objek berbasis multimethod
- Namun, sistem objek buatan pengguna yang sepenuhnya baru tidak dapat ditulis
Tujuan bahasa dan arah riset
- Tujuan bahasa pemrograman serbaguna adalah mendukung pembuatan library yang kuat dan mudah digunakan
- Semakin kuat suatu bahasa, semakin ringkas penggunaan library-nya
- Saat kode menggunakan library yang dirancang dengan baik, ia memiliki kesan alami seperti membaca kalimat yang memberi instruksi kepada rekan kerja
- Riset seperti Racket, Shen, dan meta object protocol sedang mengeksplorasi sistem tipe dan objek yang dapat diperluas
- Pada akhirnya, bahasa dibedakan berdasarkan “library apa yang bisa digunakan, dan apa yang tidak bisa digunakan”
- Di balik library yang elegan terdapat puluhan tahun riset bahasa dan upaya perancangan
1 komentar
Komentar Hacker News
Contoh terbaiknya adalah Prolog. Sering disebut sebagai bahasa representatif untuk pemrograman logika, tetapi pada praktiknya tidak lebih dari sekumpulan algoritma yang dapat diimplementasikan sebagai library di berbagai bahasa. Menurut saya, cukup sediakan ekspresi sintaks Prolog yang sesuai dengan tata bahasa masing-masing bahasa
Sepuluh tahun lalu saya adalah penggemar Scala. Konsep “Scalable Language” yang memungkinkan membuat DSL di dalam sistem tipenya sangat menarik. Namun saya kehilangan minat ketika komunitas mulai memakainya seperti Haskell di atas JVM. Belakangan saya berharap teknologi seperti WASM atau Graal akan memberi fleksibilitas lebih besar dalam memilih bahasa. Dalam banyak kasus JS sudah cukup, tetapi menyenangkan mengetahui kita punya opsi menggunakan bahasa tingkat rendah seperti Rust saat diperlukan
Akan bagus kalau ada bahasa skrip bertipe yang bisa menggantikan bash. Saya pernah membuat skrip parser JSON sederhana dengan Elixir, dan hasilnya cukup bagus
#!/usr/bin/env ocaml. Hanya saja, tidak ada fitur untuk memasang dependensi eksternal secara otomatis dari satu fileBahasa dan library tidak saling eksklusif. Ada library yang pada praktiknya bertindak seperti bahasa, dan sebaliknya ada bahasa yang dirancang untuk library tertentu. Misalnya Julia adalah contoh yang menyeimbangkan performa dan kemudahan pakai dengan baik. Kita bisa menulis kode berperforma tinggi langsung di Julia, lalu mendapatkan eksekusi yang dioptimalkan lewat kompilasi spesialisasi tipe setingkat JIT. Modelnya berupa pemanggilan fungsi yang sederhana, tetapi di dalamnya bekerja dengan sangat canggih
Raku dirancang sebagai struktur yang menggabungkan beberapa subbahasa (slang). Misalnya regex, PEG, quoting, dan lainnya diperlakukan sebagai mini-bahasa masing-masing, dan dengan Slangify kita bisa dengan mudah menambahkan DSL sendiri
Dulu ada seorang pengembang senior yang berkata, “kalau saya lihat Rails di CV, langsung saya buang.” Itu membuat saya sekali lagi sadar betapa bodohnya menilai orang dari bahasanya
Bahasa atau library pada akhirnya adalah alat komunikasi baik dengan mesin maupun manusia. Mesin berkomunikasi lewat bit dan tegangan, manusia lewat niat dan konsep. Jadi jika sebuah bahasa atau library memberi manusia cara yang jelas dan cepat untuk mengekspresikan sesuatu, tidak penting apakah itu bahasa atau library. Rails atau Stanza, kalau cocok untuk tujuannya dan mudah dipahami tim, itulah jawaban yang benar
Saya menganggap “library adalah bahasa akhir”. Misalnya Ruby on Rails adalah bahasa yang hebat untuk layanan web yang dibangun di atas Ruby. Ruby dan Rails berkembang saling mendukung. Pada akhirnya, saya melihat pemrograman sebagai proses penerjemahan bahasa yang berkesinambungan
Pernyataan “semakin kuat bahasanya, semakin mudah memakai library” memang benar. Dulu sulit membuat framework seperti Express di Java lama
Kalau bicara framework web untuk bahasa C, bukankah itu PHP? ;)