Git yang Diimplementasikan di Awk, Aho
(github.com/djanderson)- Aho adalah Git yang diimplementasikan dalam AWK, sebuah proyek mainan untuk mengeksplorasi struktur internal Git dan fitur-fitur baru GNU AWK
- Tujuannya bukan untuk penggunaan nyata, melainkan untuk hiburan dan pembelajaran, dan bukan proyek yang dimaksudkan sebagai alat pengganti Git
- Untuk menjalankannya dibutuhkan
gawk5.0 atau lebih baru, saat ini menggunakanpigzuntuk kompresi zlib, dan mengasumsikan lingkungan lain disediakan oleh GNU coreutils - Dapat dijalankan di sebagian besar Linux, tetapi tidak terlalu cocok untuk lingkungan BSD/Mac
- Fitur yang sudah diimplementasikan adalah
init,add/rm,status,commit,configbaca-saja, dancat-file, sementara fitur jaringan seperticlonedanpushtidak direncanakan untuk ditambahkan
Tujuan dan Cakupan Aho
- Aho adalah proyek yang bertujuan menjadi “Git yang diimplementasikan dalam AWK”
- Ini adalah proyek mainan untuk menunjukkan bahwa AWK modern dapat melakukan lebih banyak hal daripada sekadar skrip satu baris
- Fokusnya adalah mengeksplorasi struktur internal Git dan fitur-fitur baru GNU AWK
- Proyek ini ditujukan untuk hiburan dan pembelajaran ketimbang penggunaan praktis
Lingkungan Eksekusi
- Lingkungan eksekusi yang dibutuhkan adalah sebagai berikut
gawk5.0 atau lebih barupigzuntuk kompresi zlib- GNU coreutils
- Dapat berjalan di sebagian besar Linux, tetapi tidak cocok untuk lingkungan BSD atau Mac
Alur Penggunaan Dasar
- Setelah menyiapkan lingkungan dengan
source ./modpath, jalankanaho inituntuk menginisialisasi repositori Git kosong di direktori.aho aho add -v .menambahkan file sambil menampilkan item seperti.gitignore,LICENSE,README.md,aho,aho.awk,include/*.awk- Setelah membuat file baru lalu menjalankan
aho add -v .lagi, file tersebut juga akan ditambahkan - Di bawah
.aho/, akan dibuat struktur yang mirip dengan GitbranchesconfigdescriptionHEADindexobjectsrefs/headsrefs/tags
- Disediakan contoh
GIT_DIR=.aho git ls-files --stageuntuk menunjukkan alat Git membaca entri indeks dari repositori.aho
Fitur yang Sudah Diimplementasikan dan Pekerjaan Tersisa
- Fitur yang sudah selesai
initadd/rmstatuscommitconfigbaca-sajacat-file
- Fitur yang belum selesai
resetbranchswitchls-files
Fitur Jaringan Dikecualikan
- Tidak ada rencana untuk menambahkan fitur jaringan
- Fitur jaringan memang bisa diimplementasikan dengan GNU AWK, tetapi Aho tidak berencana memasukkan
cloneataupush - Kontribusi dalam bentuk masukan yang membantu meningkatkan pemahaman tentang AWK atau Git sangat disambut
1 komentar
Komentar Hacker News
Awk itu keren. Di keluarga Unix, bahasa ini ada hampir di mana-mana sebagai bahasa pemrograman lengkap, tetapi dalam praktiknya sepertinya lebih sering dipakai sebagai perintah satu baris untuk mengambil potongan teks dari output standar yang dipipe
Padahal Awk juga bisa dipakai sebagai bahasa scripting serbaguna, dan untuk kegunaan ini dalam banyak hal lebih baik daripada Bash. Jadi penasaran kenapa skrip Awk tidak lebih sering terlihat di alam liar. Mungkin karena Perl mencoba menggabungkan keunggulan shell, Awk, dan sed ke dalam satu bahasa, lalu setelah itu orang-orang memandang Perl secara negatif dan meninggalkannya
[1] Cuplikan acak dari source code NetBSD: https://github.com/NetBSD/src/blob/trunk/sys/dev/eisa/devlis...
Bukan berarti tidak ada yang berhasil melakukannya, tetapi tingkat keberhasilannya di industri secara umum rendah, sehingga Perl mendapat reputasi yang cukup buruk
Aku ingin melihat kebangkitan Awk. Awk tidak semudah itu diperluas secara besar-besaran, jadi lebih kecil risikonya sebuah proyek yang dimulai dari Awk kecil diwariskan ke orang berikutnya sebagai codebase Awk ribuan baris. Sebagai gantinya, proyek seperti itu akan ditulis ulang lebih awal ke bahasa yang lebih skalabel dan lebih mudah dirawat
Menyenangkan, dan aku akan memakai Perl lagi. Sekarang setelah tahu Awk juga sekeren ini, mungkin suatu saat aku akan memakainya juga
[1] https://github.com/csdvrx/hdisk/
Cukup dengan beberapa fungsi dan total sekitar 20 baris kode, plus beberapa pipe ke sort dan uniq, dan hasilnya cukup cepat. Terutama kalau diawali dengan LC_ALL=C, hasilnya lebih cepat lagi
[0]: kalau mau bertanya kenapa observabilitasnya tidak sudah cukup baik sehingga pekerjaan seperti ini tidak perlu dilakukan, itu memang poin yang valid, tetapi kadang kita harus hidup dengan kenyataan yang ada
[1]: aku tahu gawk bisa melakukan unique sort sambil membangun daftar. Saat itu aku sudah lelah di fase akhir penanganan insiden, dan
| sort | uniq -c | sort -rnjauh lebih mudah diingat[1].a: aku juga tahu sort punya argumen
-u. Itu tidak memberikan hitungan, dan untuk pemrosesan unik juga jauh lebih lambat dibanding implementasi uniqKarena orang-orang selera HN menganggap Perl “tidak keren”, Perl dan semua kode yang ditulis dengan Perl sekarang seolah memiliki tanggal kedaluwarsa. Tetapi Awk adalah standar POSIX, jadi orang-orang seperti itu tidak bisa menyingkirkannya
0,"", dan benar-benar tidak ada apa-apa semuanya adalah nilai false yang samaAngka, seperti di Lua, tidak berbeda dari string yang merepresentasikan angka. Tapi anehnya itu tidak terlalu menggangguku. Kalau memang harus menjaga angka tetap angka dan string tetap string, cukup beri penanda seperti
#atau$di depan nilainya lalu lepaskan nanti dengansubstr()The AWK Programming Language, Second Edition terbit pada September 2023
https://awk.dev
Edisi pertama terbit pada 1988 dan bisa dilihat di sini: https://archive.org/details/pdfy-MgN0H1joIoDVoIC7
Diskusi: https://news.ycombinator.com/item?id=13451454
Saat melihat kode seperti berikut, dalam
function read_objfile(obj, objpath, bytes, end_of_header, header, end_of_type, type, size, bytes_after_header)parameter-parameter setelah jarak kosong yang besar itu adalah variabel lokal. Nilai memang bisa diteruskan ke sana, tetapi memang bukan itu tujuan desainnyaAku pernah menulis patch untuk GNU Awk yang menambahkan pernyataan
letguna mengikat variabel leksikal sungguhan, sehingga bisa menjadi sepertifunction read_objfile(obj, objpath) { @let (bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) { } }Sayangnya patch itu ditolak oleh proyek, dan aku disarankan membuat fork GNU Awk dengan nama berbeda, jadi memang itulah yang kulakukan
https://www.kylheku.com/cgit/egawk/about/
Jika ditanya mengapa baris perintah Linux adalah lingkungan pengembangan terbaik, salah satu alat yang sering ditunjuk adalah Awk. Hanya dengan memahami Awk dasar, kita bisa melakukan banyak hal dengan sangat sedikit, dan IDE malah mulai terasa lamban.
Jika ingin belajar Awk dan cocok dengan pembelajaran bergaya kuliah, ada presentasi yang dibuat beberapa tahun lalu untuk Linux Fest Northwest dan direkam ke YouTube: https://youtu.be/E5aQxIdjT0M
Urutan yang mirip
CTRL+Dbisa memutus input, dan mungkin ada puluhan edge case lain yang belum saya ketahui yang akan menggigit di saat terburuk.Awk adalah alat yang mengesankan, tetapi kalau ditaruh di atas pedestal, kelemahannya jadi tertutupi. Untuk pekerjaan serius, mungkin lebih baik beralih ke alat yang lebih terspesialisasi, lebih modern, dan memang cocok untuk tugas tersebut
Sebagian besar yang dilakukan IDE bukanlah pekerjaan penyuntingan teks, melainkan membantu memahami dan mengubah kode. Bukan berarti saya bilang itu salah, saya hanya penasaran dengan sudut pandang pernyataan itu
Awalnya saya mengira nama ini berasal dari
aho, slang bahasa Jepang untuk “bodoh” (アホ), lalu saya teringat bahwa Alfred Aho adalah hurufadalamawk. Mungkin keduanya?Proyek yang hebat dan ide yang bagus. Memahami dasar-dasar memberi kita sudut pandang berbeda dalam melihat proyek dan masalah lain.
Dulu saya pernah membuat wiki berbasis web dengan Awk. Alasannya karena saya menggunakan router Linksys dengan memori yang sangat kecil.
Itu bagus untuk mempelajari cara kerja wiki dan apa saja yang bisa dilakukan dengan Awk. Karena tidak ada library untuk diandalkan, saya harus mengimplementasikan dasar-dasarnya sendiri, dan justru karena itu saya jadi benar-benar memahaminya
Katanya, “Tidak ada rencana menambahkan kemampuan jaringan di sini. Tentu saja itu mungkin, tetapi tidak akan ada clone atau push”, padahal git clone dan push juga bisa dilakukan ke repositori di direktori lain pada komputer yang sama
Saya terus terpikir apakah mungkin membuat alat basis data dan pemrosesan serba bisa yang melampaui alat-alat khusus dalam hal performa dan fungsi, hanya dengan utilitas GNU, beberapa program, dan mungkin tidak banyak lagi selain itu. Apa cuma saya yang merasa begitu?
Mungkin relevan
sed-chess: https://news.ycombinator.com/item?id=37896854
awk-raycaster: https://github.com/TheMozg/awk-raycaster
https://github.com/soimort/translate-shell
Jika saat pengembangan ini sudah ada cppawk, mereka bisa memakai
#include. Itu bekerja baik dengan path relatif berdasarkan file dan tidak memerlukanAWKPATHProgram yang sudah dipraproses juga bisa “dibangun” menjadi satu file tunggal, sehingga setelah itu cppawk tidak lagi diperlukan
https://www.kylheku.com/cgit/cppawk/about/