Awk ile uygulanan Git: Aho
(github.com/djanderson)- Aho, AWK ile uygulanmış bir Git’tir; Git’in iç yapısını ve GNU AWK’nin yeni özelliklerini keşfetmek için hazırlanmış oyuncak bir projedir
- Amaç gerçek kullanım değil, eğlence ve eğitimdir; Git’in yerine kullanılacak bir araç olarak tasarlanmamıştır
- Çalıştırmak için
gawk5.0 veya üzeri gerekir, zlib sıkıştırması için şu andapigzkullanılır ve geri kalanı için GNU coreutils sağlanan bir ortam varsayılır - Çoğu Linux üzerinde çalışabilir, ancak BSD/Mac ortamlarına pek uygun değildir
- Uygulanan özellikler
init,add/rm,status,commit, salt okunurconfig,cat-fileolup; ağ özellikleri olanclonevepusheklenmeyecektir
Aho’nun amacı ve kapsamı
- Aho, “AWK ile uygulanmış Git” hedefiyle geliştirilen bir projedir
- Modern AWK’nin tek satırlık betiklerden daha fazlasını yapabildiğini göstermek için hazırlanmış oyuncak bir projedir
- Git’in iç yapısını ve GNU AWK’nin yeni özelliklerini keşfetmeye odaklanır
- Pratik kullanımdan çok eğlence ve eğitim amaçlı bir projedir
Çalışma ortamı
- Gerekli çalışma ortamı şunlardır
gawk5.0 veya üzeri- zlib sıkıştırması için
pigz - GNU coreutils
- Çoğu Linux’ta çalışabilir, ancak BSD veya Mac ortamları için uygun değildir
Temel kullanım akışı
- Ortamı
source ./modpathile hazırladıktan sonraaho initçalıştırılırsa.ahodizininde boş bir Git deposu başlatılır aho add -v ., dosyaları eklerken.gitignore,LICENSE,README.md,aho,aho.awk,include/*.awkgibi öğeleri çıktılar- Yeni bir dosya oluşturduktan sonra
aho add -v .yeniden çalıştırılırsa ilgili dosya da eklenir .aho/altında Git’e benzer bir yapı oluşturulurbranchesconfigdescriptionHEADindexobjectsrefs/headsrefs/tags
GIT_DIR=.aho git ls-files --stageile Git aracının.ahodeposunun indeks girdilerini okuduğunu gösteren bir örnek sunulur
Uygulanan özellikler ve kalan işler
- Tamamlanan özellikler
initadd/rmstatuscommit- salt okunur
config cat-file
- Henüz tamamlanmayan özellikler
resetbranchswitchls-files
Ağ özellikleri hariç tutuluyor
- Ağ özelliklerini ekleme planı yoktur
- GNU AWK ile ağ özellikleri uygulanabilir olsa da, Aho’ya
cloneveyapusheklenmesi planlanmamaktadır - AWK ya da Git bilginizi geliştirmeye yardımcı olacak katkılar memnuniyetle karşılanır
1 yorum
Hacker News yorumları
Awk harika. Unix türevlerinde neredeyse her yerde bulunan tam teşekküllü bir programlama dili, ama pratikte çoğunlukla pipe edilmiş standart çıktından metin parçaları çekmek için kullanılan tek satırlık komutlar gibi görünüyor
Oysa Awk genel amaçlı bir betik dili olarak da kullanılabilir ve bu kullanımda birçok açıdan Bash’ten daha iyidir. Doğada Awk betiklerini neden daha sık görmediğimizi merak ediyorum. Belki Perl’in shell, Awk ve sed’in iyi yanlarını tek dilde birleştirmeye çalışması ve sonrasında insanların Perl’e kötü gözle bakıp uzaklaşması yüzündendir
[1] NetBSD kaynak kodundan rastgele bir alıntı: https://github.com/NetBSD/src/blob/trunk/sys/dev/eisa/devlis...
Kimsenin bunu iyi yapamadığını söylemiyorum; ama sektör genelindeki başarı oranı düşüktü, bu da Perl’ün epey kötü bir itibar edinmesine yol açtı
Awk’nin yeniden yükselişini görmek isterim. Awk’yi büyük ölçekte genişletmek daha zor olduğu için, küçük bir Awk ile başlayan bir projenin sonraki kişiye binlerce satırlık bir Awk kod tabanı olarak devredilme riski daha düşük. Bunun yerine nispeten erken bir aşamada daha ölçeklenebilir ve bakımı daha kolay bir dilde yeniden yazılır
Eğlenceliydi ve Perl’ü tekrar kullanacağım. Awk’nin de bu kadar harika olduğunu gördüğüme göre bir gün onu da kullanabilirim
[1] https://github.com/csdvrx/hdisk/
Birkaç fonksiyon, toplamda 20 küsur satır kod ve sort ile uniq’e giden birkaç pipe yetti; ayrıca oldukça hızlıydı. Özellikle başına LC_ALL=C ekleyince daha da hızlı
[0]: Bu işi gereksiz kılacak kadar gözlemlenebilirlik neden düzgün kurulmamıştı diye sorarsanız haksız sayılmazsınız, ama bazen eldeki gerçeklikle yaşamak gerekir
[1]: gawk’nin liste oluştururken benzersiz sıralama yapabildiğini biliyorum. Olay müdahalesinin sonlarına doğru yorgundum ve
| sort | uniq -c | sort -rnakılda tutması çok daha kolaydı[1].a: sort’ta
-uargümanı olduğunu da biliyorum. Sayım sağlamıyor ve benzersizleştirme de uniq uygulamasına göre epey daha yavaşHN zevkine sahip insanlar Perl’ü “havalı değil” gördüğü için Perl ve Perl ile yazılmış tüm kodlara artık bir son kullanma tarihi ilişmiş durumda. Ama Awk POSIX standardı olduğu için bu insanlar onu ortadan kaldıramaz
0,""ve gerçekten hiçbir şey olmaması; hepsi aynı false değeridirSayılar, Lua’daki gibi sayıyı temsil eden stringlerden farklı değildir. Ama garip biçimde bu beni rahatsız etmiyor. Sayıları sayı, stringleri string olarak mutlaka korumanız gerekiyorsa değerin başına
#veya$gibi bir işaret koyup sonrasubstr()ile sökebilirsinizThe AWK Programming Language, Second Edition Eylül 2023’te çıktı
https://awk.dev
İlk baskı 1988’de yayımlandı ve burada görülebilir: https://archive.org/details/pdfy-MgN0H1joIoDVoIC7
Tartışma: https://news.ycombinator.com/item?id=13451454
Şu tür koda bakınca,
function read_objfile(obj, objpath, bytes, end_of_header, header, end_of_type, type, size, bytes_after_header)içinde büyük boşluktan sonraki parametreler yerel değişkenlerdir. Değer geçirilebilir ama bunun için tasarlanmamışlardırGNU Awk’ye gerçek leksik değişkenler bağlayan bir
letifadesi ekleyen bir yama yazdım; böylecefunction read_objfile(obj, objpath) { @let (bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) { } }gibi yazılabiliyorduNe yazık ki proje tarafından reddedildi ve adını değiştirdiğim bir GNU Awk fork’u yapmam önerildi; ben de öyle yaptım
https://www.kylheku.com/cgit/egawk/about/
Linux komut satırının en iyi geliştirme ortamı olduğunu neden söylediğimi sorarlarsa, sık sık işaret ettiğim araçlardan biri Awk. Temel düzeyde Awk bilmek bile az şeyle çok iş yapmayı sağlıyor; IDE ise tersine hantal gelmeye başlıyor
Awk öğrenmek istiyorsanız ve ders tarzı öğrenme size uyuyorsa, birkaç yıl önce Linux Fest Northwest için hazırladığım sunumu YouTube'a kaydetmiştim: https://youtu.be/E5aQxIdjT0M
CTRL+Dbenzeri diziler girişi kesebilir; bilmediğim onlarca başka edge case de vardır ve en kötü anda sizi ısıracaktırAwk etkileyici bir araç, ama onu kaideye çıkarınca zayıf yanları görünmez oluyor. Ciddi işleri, o işe uygun daha uzmanlaşmış ve modern araçlara taşımak daha iyi olabilir
IDE'nin yaptığı işlerin çoğu metin düzenleme değil, kodu anlamaya ve değiştirmeye yardımcı olmak. Yanlış olduğunu söylemeye çalışmıyorum; bu sözün hangi bakış açısından söylendiğini merak ediyorum
Başta bu adın Japonca argoda “aptal” anlamına gelen aho'dan (アホ) geldiğini sanmıştım, sonra Alfred Aho'nun
awkiçindekiaolduğunu hatırladım. Belki de ikisi birden?Harika bir proje ve iyi bir fikir. Temelleri anlamak, başka projelere ve sorunlara farklı bir açıdan bakmayı sağlıyor
Eskiden Awk ile web tabanlı bir wiki yapmıştım. Nedeni, belleği çok az olan bir Linksys router kullanıyor olmamdı
Hem wiki'nin nasıl çalıştığını hem de Awk ile neler yapılabileceğini öğrenmek için iyiydi. Dayanacak kütüphane olmayınca temelleri kendiniz uygulamak zorunda kalıyorsunuz; bu sayede gerçekten anlıyorsunuz
“Buraya ağ işlevi ekleme planım yok. Elbette mümkün, ama clone ya da push yok” denmiş; oysa aynı bilgisayarda başka bir dizindeki depolardan da git clone yapabilir ve push edebilirsiniz
Birkaç GNU aracı ve programıyla, hatta belki daha fazlasına pek gerek kalmadan, performans ve işlev açısından özel araçları aşan her şeye muktedir bir veritabanı ve işleme aracı yapılabileceği fikri aklımdan çıkmıyor. Böyle hisseden bir tek ben miyim?
İlgili olabilir
sed-chess: https://news.ycombinator.com/item?id=37896854
awk-raycaster: https://github.com/TheMozg/awk-raycaster
https://github.com/soimort/translate-shell
Bu, geliştirme sırasında mevcut olmayan cppawk'ı kullansaydı
#includekullanabilirdi. Dosyaya göre göreli yollarla düzgün çalışıyor veAWKPATHgerektirmiyorÖn işlenmiş programı tek bir dosya olarak “build” etmek de mümkün; böylece sonrasında cppawk'a gerek kalmıyor
https://www.kylheku.com/cgit/cppawk/about/