Janet untuk Orang Awam (2023)
(ianthehenry.com)- Janet for Mortals adalah buku online gratis tentang bahasa pemrograman Janet, tetapi fokus retrospektif ini lebih pada proses pembuatan buku teknis yang juga mencakup REPL web dan proyek contoh, bukan pada bukunya sendiri
- Keseluruhan pekerjaan memakan waktu 20 minggu, melampaui estimasi 12 minggu untuk penulisan murni karena adanya pekerjaan tambahan seperti situs web, binding C++, demo browser, parser CLI, dan alat pengujian
- Situs web buku ini menyediakan REPL bawaan yang menggunakan CodeMirror dan tata bahasa Lezer; autocomplete menanyakan lingkungan Janet melalui WebAssembly, dan
(report)menyimpan umpan balik ke SQLite cmd,judge,to do, dan Toodle.Studio digunakan sebagai contoh dasar yang menunjukkan bahwa Janet dapat dipakai untuk scripting, alat CLI, pengujian, eksekusi di browser, dan interoperabilitas JavaScript- Tepat setelah peluncuran, hanya dengan pengajuan ke Hacker News dan Lobsters, ada 30.025 pengunjung unik pada Jumat, 9.568 pada Sabtu, dan 3.777 pada Minggu, tetapi IP unik yang membaca 5 bab atau lebih diperkirakan hanya 387
Cakupan buku dan volume kerja sebenarnya
- Janet for Mortals adalah buku online gratis tentang bahasa pemrograman Janet
- Total masa produksi adalah 20 minggu berdasarkan waktu luang
- Estimasi awal adalah 12 minggu, dan jika hanya melihat waktu penulisan teks bahasa Inggris, perkiraan itu tidak terlalu meleset
- Jadwal aktual banyak mencakup proyek coding di sekitar buku
- Panjang akhir adalah 44.000 kata prosa bahasa Inggris, tidak termasuk potongan kode
- Sebagai pembanding, The Great Gatsby memiliki 47.000 kata
- Panjangnya kurang dari setengah seri tulisan sebelumnya tentang Nix
- Selama 5 bulan, pekerjaan berikut juga dilakukan bersama buku ini
- Situs web buku
jimmy: binding untuk pustaka struktur data persisten C++- Toodle.Studio: playground turtle graphics interaktif
cmd: pustaka parsing argumen command-linejudge: framework pengujian snapshot inlineto do: pengelola daftar tugas command-line
Situs web dan REPL bawaan
- Perangkat inti situs web Janet for Mortals adalah REPL bawaan
- Pengguna dapat membuka REPL kapan saja dengan tombol Escape
- REPL dipasang tetap di bagian bawah halaman sehingga tidak banyak menutupi teks
- Editornya menggunakan CodeMirror
- CodeMirror secara default tidak mendukung Janet
- Dukungan bahasa Janet yang dibuat saat pekerjaan Bauble sebelumnya dijadikan dasar
- Sintaks Janet seperti string
multi`backtick`quoted, yang tidak penting dalam DSL Bauble, juga diperlukan dalam buku ini
- Saat memperkuat tata bahasa Lezer yang digunakan CodeMirror, tata bahasa yang sama juga digunakan ulang untuk syntax highlighting potongan kode di buku
- Tidak ditemukan static site generator yang dikenal mendukung highlighting kode Janet
- Awalnya buku ini hitam putih, tetapi warna ditambahkan agar sintaks Janet yang asing terasa lebih ramah
- Static site generator ditulis sendiri menggunakan
redo- Inti generator ditulis dalam JavaScript sehingga tata bahasa Lezer dapat ditempelkan
- Keseluruhan susunannya berupa struktur rapuh yang dihubungkan dengan shell
- Remark digunakan baik untuk parsing naskah buku maupun REPL sisi klien
- Ekstensi sederhana ditambahkan untuk memberi label pada blok kode
- Docstring pustaka standar Janet ditulis dalam Markdown, sehingga dirender menjadi HTML secara langsung di autocomplete REPL
Autocomplete dan umpan balik satu arah
- Autocomplete REPL dianggap penting untuk pembaca yang baru pertama kali mengenal Janet
- Saat REPL dimulai, lingkungan Janet ditanyakan secara dinamis melalui WebAssembly
- Meski pengguna mendefinisikan simbol baru yang memiliki docstring, simbol itu tidak muncul dalam hasil autocomplete
- Autocomplete bisa dibuat ulang setiap kali setelah perintah dijalankan, tetapi dinilai tidak sepadan
- Fungsi
(report)menerima string lalu melakukan POST ke server web sederhana, dan server menyimpannya ke database SQLite- Mirip kotak komentar, tetapi cirinya adalah dikirim langsung dari REPL
- Dengan fitur ini, umpan balik dibaca dan berbagai kesalahan diperbaiki
- Cara untuk membalas tidak diimplementasikan
- Backend report bukan Janet, melainkan aplikasi Haskell kecil
- Tugasnya hanya menerima permintaan POST dan memasukkannya ke database SQLite
- Server web tidak dibuat dengan Janet
- Keamanan dianggap sebagai faktor terpenting dalam server web
- Janet dan pustaka HTTP Janet tidak dianggap cukup teruji untuk terhubung langsung ke internet
jimmy: eksperimen interoperabilitas C++
jimmyadalah binding Janet untuk immer- immer adalah pustaka struktur data persisten
- Binding ini belum selesai, dan kemungkinan besar tidak akan diselesaikan sampai ada kebutuhan untuk menggunakannya
- Meski begitu, sebagai contoh yang menunjukkan cara berinteroperasi dengan kode C++ dari Janet, ini dianggap berhasil
Toodle.Studio dan Janet di dalam browser
- Bauble adalah playground seni kecil yang dibuat sebelumnya, dan merupakan pengalaman pertama menanamkan Janet di browser
- Saat itu belum banyak materi tentang embedding Janet
- Tingkat kesulitannya tinggi karena harus memakai WebAssembly, Emscripten, dan TypeScript bersama-sama di browser
- Hasil akhir Bauble adalah situs web yang logika aplikasinya ditulis dalam Janet
- JavaScript banyak digunakan untuk UI, tetapi logika inti ditangani oleh Janet
- Salah satu alasan penting menulis buku ini adalah motivasi untuk membuat teknik memakai Janet di browser lebih mudah diakses
- Di buku, Toodle.Studio dibuat sebagai contoh, bukan Bauble
- Bauble tidak memiliki state dan hampir seperti fungsi murni yang mengubah string menjadi string, sehingga sederhana dari sudut pandang interoperabilitas
- Toodle.Studio jelas merupakan fork dari Bauble, tetapi interoperabilitas antara JavaScript dan Janet lebih kompleks
- Toodle.Studio memiliki elemen teknis yang lebih cocok sebagai contoh dalam buku
- Program Janet yang berjalan lama harus dieksekusi secara asinkron seiring waktu
- Karena kode JavaScript menyimpan nilai Janet yang sama melalui beberapa referensi, manajemen memori harus dipertimbangkan
- Struktur data bersarang yang kompleks harus dikirim bolak-balik dengan Janet melalui C++
- Logo Toodle.Studio adalah kura-kura animasi yang dibuat dengan Bauble
- Ditambahkan setelah menerima umpan balik bahwa demo turtle graphics tidak punya kura-kura
- Matanya dibuat mengikuti mouse
cmd: parser argumen CLI untuk Janet
cmdadalah pustaka parsing argumen command-line- Dalam buku hanya muncul sekitar tiga paragraf, tetapi dibutuhkan untuk menunjukkan dengan jelas bahwa Janet adalah bahasa scripting yang baik
cmdsangat dipengaruhi olehCore.Commanddari OCamlCore.Commanddianggap sebagai pustaka parsing argumen command-line terbaik yang pernah digunakan- Pengalaman itu dicoba untuk direplikasi di Janet
cmdtidak sebagusCore.Command- Adanya tipe dinilai akan membuat semuanya jauh lebih mudah
- Namun,
cmdmemiliki 95% fitur yang dianggap penting, dan berkat notasi yang ringkas, dinilai lebih nyaman dipakai dalam skrip ad-hoc
- Fitur pembuatan fungsi autocomplete Bash masih belum ada
Core.Commandmembuatnya secara otomatis- API
cmddirancang agar fitur ini bisa ditambahkan nanti
judge: framework pengujian snapshot inline
judgeadalah salah satu hal pertama yang dibuat dengan Janet pada 2021- Setelah lebih memahami Janet, proyek ini ditulis ulang dari awal
- API menjadi lebih nyaman digunakan
- Implementasinya juga jauh lebih sederhana dan lebih mudah diubah
- Perbedaan utama Judge v1 dan v2 adalah lokasi pengujian dan helper
- Pengujian dapat ditempatkan bukan hanya di direktori
test/, tetapi juga di dalam file sumber biasa - Helper
test-macrodantest-stdoutditambahkan
- Pengujian dapat ditempatkan bukan hanya di direktori
- Pendekatan padanan OCaml untuk
test-stdoutdisebut sebagai hampir satu-satunya cara yang digunakan saat menulis pengujian secara profesional- OCaml tidak punya cara yang memadai untuk menyematkan data arbitrer ke dalam kode sumber, sehingga pendekatannya adalah mengubah semuanya menjadi string
- Setelah buku terbit, mode
--interactiveditambahkan ke Judge- Buku memiliki bab yang membahas pengujian dan debugging dengan Judge
to do: alat tugas yang dibuat dengan Janet alih-alih Bash
to dodipilih sebagai contoh untuk bab scripting- Ini adalah alat nontrivial yang sebelumnya dibuat dengan Bash, dan implementasi Bash-nya menyakitkan
- Bagian yang sangat sulit di Bash adalah parsing teks dan pemrosesan tanggal
- Mem-parsing teks multi-baris dengan Sed tidak menyenangkan
- Manipulasi
dateyang berperilaku sama di macOS dan Linux dianggap praktis mustahil
- Di Janet, dengan memanfaatkan PEG,
sh, dancmd, lebih banyak fitur dapat dibuat lebih cepat daripada daftar tugas Bash aslinya- Misalnya, fitur multi-seleksi
fzfditambahkan - Menyusun string null-terminated di Bash dianggap sulit
- Misalnya, fitur multi-seleksi
- Buku hanya membahas versi yang disederhanakan
- Tidak ada fitur penjadwalan tugas untuk masa depan
- Tidak ada konsep “melewati” tugas
- Fitur intinya adalah menambahkan item ke daftar dan menandainya selesai
- Jika digunakan bersama
zsh-autoquoter, ini dianggap sebagai aplikasi yang cukup berguna di luar dugaan
Pekerjaan kode dan pemeliharaan selama penulisan
- Dari 20 minggu pengerjaan buku, penulisan kode mengambil hampir setengahnya
- 8 minggu adalah pekerjaan kode, dan pada beberapa periode penulisan dan coding dilakukan bersamaan
- Awalnya yang diperkirakan hanya peningkatan Judge dan pembuatan parser argumen
- Implementasi parser argumen jauh lebih sulit dari perkiraan
- Karena Bauble terlalu sederhana, tidak diduga bahwa playground seni baru akan dibuat lagi
- Penulisan sebenarnya dilakukan dalam Markdown menggunakan Sublime Text
- Sublime Text adalah editor yang disukai untuk menulis prosa panjang
- Selama penulisan, 2 versi baru Janet dirilis
- Bab debugging dan modul native harus diperbarui agar sesuai dengan perubahan bahasa
- Buku ini direncanakan untuk dipelihara agar sesuai dengan rilis Janet terbaru
Respons peluncuran dan sejauh mana dibaca
- Promosi buku hanya berupa pengajuan ke Hacker News, pengajuan ke Lobsters, dan twit
- Di Hacker News, buku ini berada di halaman depan sepanjang hari dan sempat menduduki posisi nomor 1
- Berdasarkan log akses Nginx, pengunjung unik adalah sebagai berikut
- Jumat: 30.025 orang
- Sabtu: 9.568 orang
- Minggu: 3.777 orang
- Angka ini lebih dekat ke jumlah orang yang mengklik tautan, dan jumlah orang yang benar-benar membaca buku dianggap jauh lebih kecil
- Situs ini tidak memiliki analitik pelacakan perilaku sisi klien
- Hanya log akses yang digunakan untuk perkiraan kasar
- Alur kunjungan bab tampak menunjukkan retensi yang kurang baik
- Bab 1: 22% dari pengunjung halaman beranda
- Bab 2: 20% dari pengunjung Bab 1
- Bab 3: 69% dari pengunjung Bab 2
- Bab 4 “Pegular Expressions” dan Bab 9 “Xenofunctions” memiliki lebih banyak pengunjung daripada Bab 3
- Pada akhir pekan peluncuran, estimasi terbaik untuk jumlah pembaca sebenarnya adalah 387 orang
- Dasarnya adalah jumlah IP unik yang memuat 5 bab berbeda atau lebih
Asal nama dan batasan yang terlihat dari umpan balik
- Nama bahasa Janet berasal dari Janet, makhluk abadi dalam The Good Place
- Makhluk ini membantu mortals yang berpindah melalui alam setelah kematian, sehingga juga terhubung dengan judul buku
- Bab yang paling sedikit dikunjungi adalah “Testing and Debugging”
- Bab ini adalah bab ketiga dari akhir buku
- Tiga bab terakhir dianggap sebagai bagian paling menarik dalam buku
- Cara pengujian dalam bab itu dianggap sebagai salah satu peningkatan produktivitas terbesar dalam karier engineering pribadi
- Melalui fitur report pada REPL bawaan, diterima 494 umpan balik
- Banyak di antaranya berupa “buku yang bagus” atau pesan uji coba
- Puluhan lainnya adalah laporan typo, permintaan penjelasan, dan komentar yang berguna
- Sebagian pengguna mengirim pertanyaan tanpa informasi kontak, dan karena tidak ada fitur balasan, pertanyaan itu tidak dapat dijawab
- Fitur report diimplementasikan sebagai fitur umpan balik satu arah yang sangat primitif
1 komentar
Opini Hacker News
https://bauble.studio/ dari penulis yang sama juga tidak boleh dilewatkan
Di browser komputer lamaku itu tidak berjalan, tetapi saat belajar di perpustakaan dan ingin beristirahat, aku sering bermain-main dengan bauble sekitar 30 menit di komputer perpustakaan
Grafik yang bisa dibuat hanya dengan mengubah-ubah angka saja luar biasa, dan aku berharap Janet bertahan lama
unknown symbol twisterror: script:16:1: compile error: unknown symbol twistin evaluate [lib/evaluator.janet] on line 81, column 7in bauble-evaluator/evaluate [lib/init.janet] on line 8, column 12Menarik membandingkan Janet dengan GNU Guile
Kelebihan awal Guile adalah sebagai bahasa yang dibuat agar mudah dipakai berdampingan dengan C, tetapi karena bahasanya sudah lama, tampaknya belum mengadopsi sensibilitas modern seperti menyertakan package manager secara bawaan dalam toolchain bahasa
Hal yang kusukai dari Guile adalah besarnya upaya untuk menjelaskan kompatibilitasnya dengan standar RNRS
Aku penasaran seberapa mirip Scheme sebenarnya Janet itu
Lebih seperti seseorang membuat Clojure di atas Lua
Bukunya ada di https://janet.guide/, dan bahasanya ada di https://janet-lang.org/
Aku menyukai pendekatan praktis buku ini, dan itu menjadi alasan besar aku sekarang belajar dengan menyelesaikan Everybody Codes memakai Janet
https://everybody.codes
Ungkapan “kura-kura adalah metafora” terasa disayangkan
Kura-kura itu bukan metafora, melainkan benar-benar ada: http://classicacorn.computinghistory.org.uk/8bit_focus/logo/...
Memang sesuai dengan definisi metafora sebagai “sesuatu yang merepresentasikan hal lain, simbol”, tetapi terdengar seperti lelucon tentang orang yang mengira ikon simpan bergambar disket sebagai kulkas
Rasanya konteks bahwa dulu benar-benar ada kura-kura hardware yang lucu dan menyenangkan jadi hilang
Dari judulnya saja aku mengira ini asisten AI lain yang terinspirasi dari Janet di The Good Place, jadi aku senang terkejut ketika ternyata ini bahasa pemrograman
Bahasa Janet dinamai dari Janet, makhluk abadi di The Good Place yang membantu manusia menavigasi alam baka, jadi judulnya juga lelucon cerdas yang sesuai
Cukup mengejutkan juga bahwa ia menyertakan PEG (Parsing Expression Grammar), bukan mesin regex bawaan
Aku selalu berharap bahasa yang menyediakan pustaka regex bawaan juga menyertakan PEG yang layak
Lihat <https://www.gnu.org/software/guile/manual/html_node/PEG-Pars...>
sporkdi Janet menempati posisi semacam libc, dan juga punya submodul regex, jadi kemungkinan besar sudah terpasangAku pertama kali mengenal PEG lewat Janet, dan aku suka karena kuat sekaligus mudah dipakai
Meski sudah mengutak-atik regex sedikit-sedikit selama lebih dari 20 tahun, aku memahami PEG lebih baik hanya dalam beberapa bulan
Di komunitas Janet juga ada banyak callback terkait The Good Place, dan beberapa modul pihak ketiga dinamai dari nama-nama karakternya
elm/regexdanelm/parsermemang tidak built-in, tetapielm/regexmenyarankan agar menggunakan elm/parser sebagai gantinyaAku suka asal-usul namanya, tetapi untuk bahasa bernama Janet, rasanya ada juga kewajiban untuk memprioritaskan kontrol
Aku sudah membaca bukunya, dan karena terasa cukup menarik serta playful, belajar Janet jadi jauh lebih menyenangkan
Namun dokumentasi bahasanya kurang dalam banyak hal
Fungsi atau perintah sering hanya didaftarkan begitu saja tanpa contoh atau penjelasan, atau tanpa keterangan tentang apa yang dilakukannya
Sering juga fitur yang kulihat di buku tidak bisa kutemukan di dokumentasi, dan itu menjadi salah satu alasan aku berhenti belajar meskipun menyukai Janet
Aku suka karena banyak default-nya masuk akal dan ada kemiripan dengan bahasa arus utama alih-alih memaksakan konvensi Lisp lama
Pada akhirnya, karena bukan cons list, ia sebenarnya bukan Lisp, tetapi itu tidak masalah
Masalahnya adalah bahasa ini belum terdokumentasi dengan cukup baik
Aku cukup aktif di komunitas Janet, jadi kalau tahu bagian yang kurang, aku bisa ikut berkontribusi pada perbaikan dokumentasi
Sering kali hanya ada signature fungsi tanpa penjelasan tambahan sama sekali
Aku tahu membuat dokumentasi yang luas butuh banyak waktu dan usaha, tetapi ini terjadi terlalu sering sehingga aku menyerah dan mulai mencari Lisp lain yang bisa dikompilasi menjadi binary
Aku tidak terlalu bisa beradaptasi dengan Janet, meski aku tidak tahu apakah masalahnya ada padaku
Satu-satunya Lisp lain yang pernah kupakai lama adalah Emacs Lisp, dan Janet cukup mirip tetapi juga berbeda secara halus sehingga aku terus membuat kesalahan kecil
Fitur PEG-nya tampak menarik di dokumentasi, tetapi sintaksnya sulit ditangani dan membingungkan
Dokumentasinya lengkap dalam arti semua fungsi punya deskripsi, tetapi sangat ringkas karena kurang contoh atau informasi penggunaan yang berguna
Fitur dasar seperti parsing JSON juga tampaknya tidak disertakan
Jika untuk bahasa yang ditujukan menulis skrip cepat kita harus menulis parser JSON atau XML terlebih dahulu, tugas itu sudah gagal
Ini terjadi sekitar 4 tahun lalu, jadi ekosistemnya mungkin sudah membaik, dan bisa jadi kriteria penilaianku terhadap Janet sebagai bahasa scripting memang keliru
Tetap saja, tulisan ini membuatku ingin memasangnya lagi
spork, yang menempati posisi semacam libcAda orientasi internal yang kuat untuk menjaga inti tetap ringan
Banyak proyek bergantung pada
spork, jadi kemungkinan besar itu sudah terpasang sejak awalDokumentasinya cukup baik, tetapi aku setuju masih ada celah dalam contoh-contoh praktis
Bagian ini dilengkapi oleh https://janetdocs.com, yang menautkan “contoh komunitas” untuk tiap fungsi
Agak keluar topik, tetapi berkat tulisan blog lain dari penulis aslinya aku mulai memakai keyboard mekanis split
Selama beberapa tahun aku mengalami nyeri bahu dan pergelangan tangan, dan itu membantu; aku sangat menyarankan untuk melihat tulisan-tulisan Ian lainnya juga
Cara menekan
Esckapan saja untuk membuka REPL bawaan yang menempel di bagian bawah mungkin bukan keputusan yang baikBrowser sudah punya shortcut default
Esc, dan Firefox keluar dari mode layar penuh ketikaEscditekan