2 poin oleh GN⁺ 2024-02-12 | 1 komentar | Bagikan ke WhatsApp
  • 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 gawk 5.0 atau lebih baru, saat ini menggunakan pigz untuk 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, config baca-saja, dan cat-file, sementara fitur jaringan seperti clone dan push tidak 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
    • gawk 5.0 atau lebih baru
    • pigz untuk 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, jalankan aho init untuk 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 Git
    • branches
    • config
    • description
    • HEAD
    • index
    • objects
    • refs/heads
    • refs/tags
  • Disediakan contoh GIT_DIR=.aho git ls-files --stage untuk menunjukkan alat Git membaca entri indeks dari repositori .aho

Fitur yang Sudah Diimplementasikan dan Pekerjaan Tersisa

  • Fitur yang sudah selesai
    • init
    • add/rm
    • status
    • commit
    • config baca-saja
    • cat-file
  • Fitur yang belum selesai
    • reset
    • branch
    • switch
    • ls-files

Fitur Jaringan Dikecualikan

  • Tidak ada rencana untuk menambahkan fitur jaringan
  • Fitur jaringan memang bisa diimplementasikan dengan GNU AWK, tetapi Aho tidak berencana memasukkan clone atau push
  • Kontribusi dalam bentuk masukan yang membantu meningkatkan pemahaman tentang AWK atau Git sangat disambut

1 komentar

 
GN⁺ 2024-02-12
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...

    • Betul juga. Perl memang menggantikan Awk, tetapi dalam banyak kasus itu justru menjadi kontraproduktif. Soalnya tidak ada cara sederhana dan dipahami luas untuk menulis kode Perl yang mudah dibaca programmer lain dan tetap bisa berkembang sampai program menengah-besar
      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
    • Terlepas dari apa pun pendapat orang, aku jadi sadar kalau aku suka Perl. Yang baru-baru ini kubuat adalah editor partisi yang bisa diprogram. Mirip seperti mengosongkan partisi dengan sfdisk, tetapi aku ingin melakukan lebih dari sekadar menghapus, dan ingin membuat hibrida dengan menggabungkan tabel partisi MBR dan GPT
      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/
    • Awk sangat berguna. Minggu ini aku menulis skrip untuk mem-parsing log Postgres berukuran banyak GB guna menjawab pertanyaan “siapa pengguna yang paling banyak mengirim query selama beberapa menit tepat setelah setiap pergantian jam?”
      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 -rn jauh 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 uniq
    • Penilaian bahwa Perl itu buruk menjadi pendorong besar kebangkitan Awk. Developer yang sejak awal tidak pernah belajar Perl menginginkan sesuatu untuk mengisi celah antara shell dan Python, dan ada juga developer sepertiku yang meninggalkan Perl dengan berat hati
      Karena 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
    • Aku suka AWK. Sistem tipenya yang berpusat pada string akan membuat programmer Javascript pun tersipu. 0, "", dan benar-benar tidak ada apa-apa semuanya adalah nilai false yang sama
      Angka, 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 dengan substr()
  • 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

    • Jarak 35 tahun ini adalah cerita yang bagus untuk diceritakan ketika editor bertanya, “jadi bagaimana progres edisi keduanya?”
    • Brian Kernighan juga ikut terlibat. Dia adalah “K” dalam K&R C sekaligus tokoh di balik lebih banyak lagi legenda Unix
  • 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 desainnya
    Aku pernah menulis patch untuk GNU Awk yang menambahkan pernyataan let guna mengikat variabel leksikal sungguhan, sehingga bisa menjadi seperti function 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/

    • Menurutku keputusan mereka cukup masuk akal. gawk sudah terlalu banyak berbeda dari awk. Kalau mau menambahkan sintaks yang makin membedakannya, lebih baik sekalian fork saja dan beri nama lain
  • 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

    • Namun pada saat yang sama, dukungan Unicode baru ditambahkan sangat belakangan, mungkin baru sekitar 2 tahun lalu. Seperti alat shell lainnya, ada juga edge case saat isi dialirkan ke Awk lewat pipe.
      Urutan yang mirip CTRL+D bisa 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
    • Bagaimana Awk menggantikan IDE? Saya suka Awk, dan saya juga tahu bahwa jika mau meluangkan waktu untuk mempelajarinya, Awk sangat kuat, tetapi tanpa IDE produktivitas saya akan turun drastis.
      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 huruf a dalam awk. Mungkin keduanya?

    • Sepertinya keduanya. “Git” juga sudah lebih dulu merupakan slang untuk “orang bodoh”, jadi ini nama yang jenaka
    • Saya baru-baru ini mendengarnya di Reservation Dogs: https://en.wiktionary.org/wiki/aho#Navajo
    • Sepertinya memang keduanya. Permainan kata yang sangat cerdas
  • 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

    • Benar. Namun kalau ada branch, kebutuhan membuat clone lokal agak berkurang. Sebenarnya saya memakai rsync untuk menyalin repositori git lokal. Pertanyaannya adalah apa yang terbaik
    • Ini terlalu jelas, tetapi selama 10 tahun memakai git saya tidak pernah terpikir untuk mencobanya
  • 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

  • Jika saat pengembangan ini sudah ada cppawk, mereka bisa memakai #include. Itu bekerja baik dengan path relatif berdasarkan file dan tidak memerlukan AWKPATH
    Program yang sudah dipraproses juga bisa “dibangun” menjadi satu file tunggal, sehingga setelah itu cppawk tidak lagi diperlukan
    https://www.kylheku.com/cgit/cppawk/about/