Git ที่สร้างด้วย Awk, Aho
(github.com/djanderson)- Aho คือ Git ที่พัฒนาด้วย AWK เป็นโปรเจกต์ของเล่นเพื่อสำรวจโครงสร้างภายในของ Git และฟีเจอร์ใหม่ ๆ ของ GNU AWK
- จุดประสงค์ไม่ใช่การใช้งานจริง แต่เพื่อ ความบันเทิงและการเรียนรู้ และไม่ใช่โปรเจกต์ที่ตั้งใจให้ใช้แทน Git
- การรันต้องใช้
gawk5.0 ขึ้นไป และปัจจุบันใช้pigzสำหรับการบีบอัด zlib ส่วนที่เหลือสมมติว่าอยู่ในสภาพแวดล้อมที่มี GNU coreutils - สามารถรันได้บน Linux ส่วนใหญ่ แต่ไม่ค่อยเหมาะกับสภาพแวดล้อม BSD/Mac
- ฟีเจอร์ที่พัฒนาแล้วมี
init,add/rm,status,commit,configแบบอ่านอย่างเดียว,cat-fileและไม่มีแผนเพิ่มฟีเจอร์เครือข่ายอย่างcloneและpush
วัตถุประสงค์และขอบเขตของ Aho
- Aho เป็นโปรเจกต์ที่มุ่งทำ “Git ที่พัฒนาด้วย AWK”
- เป็นโปรเจกต์ของเล่นเพื่อแสดงให้เห็นว่า Modern AWK ทำอะไรได้มากกว่าสคริปต์บรรทัดเดียว
- โฟกัสอยู่ที่การสำรวจโครงสร้างภายในของ Git และฟีเจอร์ใหม่ ๆ ของ GNU AWK
- เป็นโปรเจกต์เพื่อ ความบันเทิงและการเรียนรู้ มากกว่าการใช้งานจริง
สภาพแวดล้อมสำหรับรัน
- สภาพแวดล้อมที่ต้องใช้มีดังนี้
gawk5.0 ขึ้นไปpigzสำหรับการบีบอัด zlib- GNU coreutils
- สามารถรันได้บน Linux ส่วนใหญ่ แต่ไม่เหมาะกับสภาพแวดล้อม BSD หรือ Mac
ลำดับการใช้งานพื้นฐาน
- หลังเตรียมสภาพแวดล้อมด้วย
source ./modpathแล้วรันaho initจะเริ่มต้น Git repository ว่างในไดเรกทอรี.aho aho add -v .จะเพิ่มไฟล์พร้อมแสดงรายการอย่าง.gitignore,LICENSE,README.md,aho,aho.awk,include/*.awk- หลังสร้างไฟล์ใหม่แล้วรัน
aho add -v .อีกครั้ง ไฟล์นั้นก็จะถูกเพิ่มด้วย - ภายใต้
.aho/จะสร้างโครงสร้างที่คล้ายกับ GitbranchesconfigdescriptionHEADindexobjectsrefs/headsrefs/tags
- มีตัวอย่างการใช้
GIT_DIR=.aho git ls-files --stageเพื่อให้เครื่องมือ Git อ่านรายการใน index ของ repository.aho
ฟีเจอร์ที่พัฒนาแล้วและงานที่เหลือ
- ฟีเจอร์ที่ทำเสร็จแล้ว
initadd/rmstatuscommitconfigแบบอ่านอย่างเดียวcat-file
- ฟีเจอร์ที่ยังไม่เสร็จ
resetbranchswitchls-files
ไม่รวมฟีเจอร์เครือข่าย
- ไม่มีแผนเพิ่มฟีเจอร์เครือข่าย
- แม้จะสามารถพัฒนาฟีเจอร์เครือข่ายด้วย GNU AWK ได้ แต่ไม่มีแผนใส่
cloneหรือpushใน Aho - ยินดีรับการมีส่วนร่วมที่ช่วยปรับปรุงความรู้เกี่ยวกับ AWK หรือ Git
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
Awk เจ๋งมาก เป็น ภาษาโปรแกรมมิงเต็มรูปแบบ ที่แทบจะมีอยู่ทุกที่บนระบบตระกูลยูนิกซ์ แต่ในทางปฏิบัติดูเหมือนจะถูกใช้เป็นคำสั่งบรรทัดเดียวสำหรับดึงชิ้นส่วนข้อความจากเอาต์พุตมาตรฐานที่ถูก pipe เข้ามาเป็นหลัก
แต่ Awk ก็ใช้เป็นภาษาสคริปต์อเนกประสงค์ได้เช่นกัน และสำหรับการใช้งานแบบนี้ ในหลายแง่มุมมันดีกว่า Bash ด้วยซ้ำ สงสัยว่าทำไมในโลกจริงถึงไม่ค่อยเห็นสคริปต์ Awk บ่อยกว่านี้ อาจเป็นเพราะ Perl เคยพยายามรวมข้อดีของ shell, Awk และ sed ไว้ในภาษาเดียว แล้วต่อมาผู้คนมอง Perl ในแง่ลบและย้ายออกไปก็ได้
[1] ตัวอย่างที่สุ่มตัดมาจากซอร์สโค้ด NetBSD: https://github.com/NetBSD/src/blob/trunk/sys/dev/eisa/devlis...
ไม่ได้หมายความว่าไม่มีใครทำได้ดีเลย แต่โดยรวมทั้งอุตสาหกรรมอัตราความสำเร็จต่ำ ทำให้ Perl มีชื่อเสียงค่อนข้างแย่
อยากเห็น Awk กลับมาอีกครั้ง Awk ขยายให้ใหญ่ได้ไม่ง่ายนัก จึงมีความเสี่ยงน้อยที่โปรเจกต์ซึ่งเริ่มจาก Awk เล็ก ๆ จะถูกส่งต่อให้คนถัดไปเป็น codebase Awk หลายพันบรรทัด แทนที่จะเป็นแบบนั้น มักจะถูกเขียนใหม่ด้วยภาษาที่ขยายต่อได้และดูแลรักษาง่ายกว่าในช่วงค่อนข้างต้น
สนุกดี และจะกลับไปใช้ Perl อีก เห็นแล้วว่า Awk ก็เจ๋งขนาดนี้ สักวันอาจได้ใช้เหมือนกัน
[1] https://github.com/csdvrx/hdisk/
ใช้แค่ฟังก์ชันไม่กี่ตัว โค้ดรวมราว ๆ 20 บรรทัดนิด ๆ และ pipe ผ่าน sort กับ uniq ไม่กี่ชุด ก็พอแล้ว และเร็วพอสมควร โดยเฉพาะถ้าเติม LC_ALL=C ไว้ข้างหน้า จะเร็วขึ้นอีก
[0]: ถ้าถามว่าทำไมไม่มี observability ที่ดีพอจนไม่ต้องทำงานแบบนี้ ก็ไม่ได้ผิดหรอก แต่บางครั้งก็ต้องอยู่กับความเป็นจริงที่มี
[1]: รู้ว่า gawk ทำ unique sort ระหว่างสร้างรายการได้ ตอนนั้นอยู่ท้าย ๆ ของการรับมือ incident และเหนื่อยแล้ว
| sort | uniq -c | sort -rnจำง่ายกว่ามาก[1].a: รู้เหมือนกันว่า sort มีอาร์กิวเมนต์
-uแต่มันไม่ให้ count และการทำ unique ก็ช้ากว่า implementation ของ uniq อยู่พอสมควรเพราะคนรสนิยมแบบ HN มองว่า Perl “ไม่คูล” ตอนนี้ Perl และโค้ดทั้งหมดที่เขียนด้วย Perl จึงเหมือนถูกติด วันหมดอายุ ไว้แล้ว แต่ Awk เป็นมาตรฐาน POSIX คนพวกนั้นจึงกำจัดมันไม่ได้
0,""และการไม่มีอะไรอยู่จริง ๆ ล้วนเป็นค่าเท็จเหมือนกันตัวเลขก็ไม่ต่างจากสตริงที่แทนตัวเลข คล้าย Lua แต่แปลกที่มันไม่รบกวนใจ ถ้าจำเป็นต้องรักษาให้ตัวเลขเป็นตัวเลข และสตริงเป็นสตริงจริง ๆ ก็ใส่เครื่องหมายอย่าง
#หรือ$นำหน้าค่าไว้ แล้วค่อยใช้substr()ตัดออกทีหลังได้The AWK Programming Language, Second Edition ออกมาเมื่อเดือนกันยายน 2023
https://awk.dev
ฉบับพิมพ์ครั้งแรกตีพิมพ์ในปี 1988 และดูได้ที่นี่: https://archive.org/details/pdfy-MgN0H1joIoDVoIC7
อภิปราย: https://news.ycombinator.com/item?id=13451454
ถ้าดูโค้ดอย่าง
function read_objfile(obj, objpath, bytes, end_of_header, header, end_of_type, type, size, bytes_after_header)พารามิเตอร์หลังช่องว่างยาว ๆ ในนี้คือ ตัวแปรโลคัล จะส่งค่าเข้าไปก็ได้ แต่ไม่ได้ถูกออกแบบมาให้ใช้แบบนั้นผมเคยเขียนแพตช์เพิ่มคำสั่ง
letให้ GNU Awk เพื่อ bind ตัวแปรแบบ lexical จริง ๆ ทำให้เขียนได้ประมาณfunction read_objfile(obj, objpath) { @let (bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) { } }น่าเสียดายที่โปรเจกต์ปฏิเสธ และแนะนำให้ทำ fork ของ GNU Awk พร้อมเปลี่ยนชื่อ ผมก็เลยทำตามนั้น
https://www.kylheku.com/cgit/egawk/about/
หากถามว่าทำไมถึงบอกว่าบรรทัดคำสั่งของลินุกซ์คือสภาพแวดล้อมพัฒนาที่ดีที่สุด หนึ่งในเครื่องมือที่มักถูกยกขึ้นมาคือ Awk แค่รู้ Awk พื้นฐานก็ทำอะไรได้มากด้วยของเพียงเล็กน้อย และ IDE ก็เริ่มรู้สึกอืดอาดขึ้นมาแทน
ถ้าอยากเรียน Awk และเหมาะกับการเรียนแบบบรรยาย ผมเคยอัดวิดีโอนำเสนอที่ทำไว้สำหรับ Linux Fest Northwest เมื่อหลายปีก่อนไว้บน YouTube: https://youtu.be/E5aQxIdjT0M
ลำดับคีย์คล้าย
CTRL+Dอาจตัดอินพุตทิ้งได้ และคงมี edge case อื่น ๆ อีกเป็นสิบที่ผมไม่รู้ ซึ่งจะมากัดเอาในจังหวะที่แย่ที่สุดAwk เป็นเครื่องมือที่น่าประทับใจ แต่ถ้ายกขึ้นหิ้งก็จะกลบจุดอ่อนของมันไว้ งานที่จริงจังอาจดีกว่าถ้าย้ายไปใช้เครื่องมือที่เฉพาะทางกว่าและทันสมัยกว่า ซึ่งเหมาะกับงานนั้น ๆ
สิ่งที่ IDE ทำส่วนใหญ่ไม่ใช่งานแก้ไขข้อความ แต่คือ ช่วยให้เข้าใจและแก้ไขโค้ด ไม่ได้จะบอกว่าผิดนะ แค่อยากรู้มุมมองของคำพูดนั้น
ตอนแรกคิดว่าชื่อนี้มาจาก aho (アホ) ซึ่งเป็นสแลงภาษาญี่ปุ่นแปลว่า “คนโง่” แต่ก็นึกขึ้นได้ว่า Alfred Aho คือ
aในawkบางทีอาจจะเป็นทั้งสองอย่าง?เป็นโปรเจกต์ที่ยอดเยี่ยมและเป็นไอเดียที่ดี การเข้าใจพื้นฐาน ทำให้ได้มุมมองอีกแบบในการมองโปรเจกต์และปัญหาอื่น ๆ
เมื่อก่อนผมเคยทำวิกิบนเว็บด้วย Awk เหตุผลคือใช้เราเตอร์ Linksys ที่มีหน่วยความจำน้อยมาก
มันดีมากสำหรับการเรียนรู้ทั้งว่าวิกิทำงานอย่างไร และ Awk ทำอะไรได้บ้าง เพราะไม่มีไลบรารีให้พึ่งพา จึงต้องลงมือทำส่วนพื้นฐานเอง และนั่นทำให้เข้าใจมันจริง ๆ
เขาบอกว่า “ไม่มีแผนจะเพิ่มฟีเจอร์เครือข่ายตรงนี้ แน่นอนว่าทำได้ แต่จะไม่มี clone หรือ push” แต่จริง ๆ แล้วแม้แต่กับรีโพซิทอรีที่อยู่คนละไดเรกทอรีบนคอมพิวเตอร์เครื่องเดียวกัน ก็สามารถทำ git clone และ push ได้
ผมยังมีความคิดค้างอยู่ว่า ด้วย GNU utility กับโปรแกรมไม่กี่ตัว และอาจแทบไม่ต้องมีอะไรเกินนั้น เราน่าจะสร้าง ฐานข้อมูลและเครื่องมือประมวลผลแบบครอบจักรวาล ที่เหนือกว่าเครื่องมือเฉพาะทางทั้งด้านประสิทธิภาพและฟังก์ชันได้ไหมนะ มีแค่ผมที่รู้สึกแบบนี้หรือเปล่า?
อาจเกี่ยวข้องกัน
sed-chess: https://news.ycombinator.com/item?id=37896854
awk-raycaster: https://github.com/TheMozg/awk-raycaster
https://github.com/soimort/translate-shell
ถ้าใช้ cppawk ซึ่งยังไม่มีตอนพัฒนาสิ่งนี้ ก็คงใช้
#includeได้ มันทำงานได้ดีโดยใช้พาธสัมพัทธ์จากไฟล์ และไม่ต้องใช้AWKPATHยังสามารถ “build” โปรแกรมที่ผ่านการ preprocess แล้วให้เป็นไฟล์เดี่ยวได้ด้วย หลังจากนั้นก็ไม่จำเป็นต้องมี cppawk แล้ว
https://www.kylheku.com/cgit/cppawk/about/