Git được triển khai bằng Awk, Aho
(github.com/djanderson)- Aho là một Git được triển khai bằng AWK, là một dự án đồ chơi nhằm khám phá cấu trúc nội bộ của Git và các tính năng mới của GNU AWK
- Mục tiêu không phải để sử dụng thực tế mà là phục vụ giải trí và học tập, và đây không phải dự án để dùng như công cụ thay thế Git
- Để chạy cần
gawk5.0 trở lên, hiện dùngpigzcho nén zlib, và giả định môi trường còn lại được cung cấp bởi GNU coreutils - Có thể chạy trên phần lớn Linux, nhưng không phù hợp lắm với môi trường BSD/Mac
- Các tính năng đã triển khai gồm
init,add/rm,status,commit,configchỉ đọc vàcat-file; không có kế hoạch thêm các tính năng mạng nhưclonevàpush
Mục đích và phạm vi của Aho
- Aho là một dự án hướng tới mục tiêu “Git được triển khai bằng AWK”
- Đây là một dự án đồ chơi nhằm cho thấy Modern AWK có thể làm được nhiều hơn các script một dòng
- Trọng tâm là khám phá cấu trúc nội bộ của Git và các tính năng mới của GNU AWK
- Đây là dự án phục vụ giải trí và học tập hơn là mục đích thực dụng
Môi trường chạy
- Môi trường cần thiết như sau
gawk5.0 trở lênpigzđể nén zlib- GNU coreutils
- Có thể chạy trên phần lớn Linux, nhưng không phù hợp với môi trường BSD hay Mac
Luồng sử dụng cơ bản
- Sau khi chuẩn bị môi trường bằng
source ./modpathrồi chạyaho init, một kho lưu trữ Git rỗng sẽ được khởi tạo trong thư mục.aho aho add -v .sẽ thêm các tệp và đồng thời in ra các mục như.gitignore,LICENSE,README.md,aho,aho.awk,include/*.awk- Sau khi tạo tệp mới rồi chạy lại
aho add -v ., tệp đó cũng sẽ được thêm vào - Bên dưới
.aho/sẽ tạo ra một cấu trúc tương tự GitbranchesconfigdescriptionHEADindexobjectsrefs/headsrefs/tags
- Có cung cấp ví dụ về việc công cụ Git đọc các mục chỉ mục của kho
.ahobằngGIT_DIR=.aho git ls-files --stage
Các tính năng đã triển khai và phần việc còn lại
- Các tính năng đã hoàn thành
initadd/rmstatuscommitconfigchỉ đọccat-file
- Các tính năng chưa hoàn thành
resetbranchswitchls-files
Loại trừ các tính năng mạng
- Không có kế hoạch thêm các tính năng mạng
- Dù có thể triển khai tính năng mạng bằng GNU AWK, Aho vẫn không có kế hoạch đưa
clonehaypushvào - Hoan nghênh các đóng góp giúp cải thiện hiểu biết về AWK hoặc Git
1 bình luận
Ý kiến trên Hacker News
Awk thật tuyệt. Đây là một ngôn ngữ lập trình hoàn chỉnh có mặt gần như ở khắp nơi trên các hệ Unix, nhưng trên thực tế có vẻ chủ yếu được dùng như các lệnh một dòng để rút ra vài mẩu văn bản từ đầu ra chuẩn được pipe vào
Tuy vậy, Awk cũng có thể được dùng như một ngôn ngữ script đa dụng, và ở mục đích này thì nó tốt hơn Bash trên nhiều phương diện. Tôi tự hỏi vì sao ngoài thực tế lại không thấy script Awk thường xuyên hơn. Có lẽ là vì Perl từng cố gắng gộp ưu điểm của shell, Awk và sed vào một ngôn ngữ duy nhất, rồi sau đó mọi người bắt đầu có cái nhìn tiêu cực về Perl và rời bỏ nó
[1] Một đoạn trích ngẫu nhiên từ mã nguồn NetBSD: https://github.com/NetBSD/src/blob/trunk/sys/dev/eisa/devlis...
Không phải là chẳng ai làm được điều đó, nhưng tỷ lệ thành công của cả ngành quá thấp nên Perl đã có một tiếng xấu khá nặng
Tôi muốn thấy Awk hồi sinh. Awk khó mở rộng lớn hơn, nên sẽ ít có nguy cơ một dự án bắt đầu bằng một đoạn Awk nhỏ rồi đến tay người tiếp theo thành cả một codebase Awk dài hàng nghìn dòng. Thay vào đó, nó sẽ được viết lại khá sớm bằng một ngôn ngữ dễ mở rộng và dễ bảo trì hơn
Rất vui, và tôi sẽ dùng Perl lại. Giờ biết Awk cũng hay như vậy, có lẽ một ngày nào đó tôi cũng sẽ dùng nó
[1] https://github.com/csdvrx/hdisk/
Chỉ cần vài hàm và tổng cộng chừng 20 dòng mã, cùng vài pipe sort và uniq, là xong và chạy khá nhanh. Đặc biệt còn nhanh hơn nếu thêm LC_ALL=C ở phía trước
[0]: Nếu bạn hỏi vì sao lại cần làm việc này thay vì đã có observability đủ tốt để không phải làm thế, thì cũng không sai, nhưng đôi khi ta phải sống với thực tế đang có
[1]: Tôi biết gawk có thể vừa tạo danh sách vừa sort duy nhất. Nhưng lúc đó tôi đang ở cuối một đợt xử lý sự cố và rất mệt, còn
| sort | uniq -c | sort -rnthì dễ nhớ hơn nhiều[1].a: Tôi cũng biết sort có tham số
-u. Nó không cho số đếm, và xử lý unique cũng chậm hơn đáng kể so với triển khai của uniqVì kiểu người trên HN cho rằng Perl “không ngầu”, nên giờ Perl và mọi đoạn mã viết bằng Perl đều như mang theo một hạn sử dụng. Nhưng Awk là chuẩn POSIX nên những người đó không thể xóa bỏ nó
0,"", và đúng nghĩa là không có gì cả đều là cùng một giá trị falseCác con số, giống như trong Lua, không khác gì chuỗi biểu diễn số. Nhưng kỳ lạ là điều đó lại không làm tôi bận tâm. Nếu thực sự cần giữ số là số và chuỗi là chuỗi, bạn có thể gắn ký hiệu như
#hoặc$vào trước giá trị rồi sau này bóc ra bằngsubstr()The AWK Programming Language, Second Edition đã ra mắt vào tháng 9 năm 2023
https://awk.dev
Bản đầu tiên xuất bản năm 1988 và có thể xem tại đây: https://archive.org/details/pdfy-MgN0H1joIoDVoIC7
Thảo luận: https://news.ycombinator.com/item?id=13451454
Khi nhìn vào đoạn mã như
function read_objfile(obj, objpath, bytes, end_of_header, header, end_of_type, type, size, bytes_after_header), thì các tham số phía sau khoảng trắng lớn là biến cục bộ. Bạn có thể truyền giá trị cho chúng, nhưng đó không phải cách chúng được thiết kế để dùngTôi đã viết một bản vá thêm câu lệnh
letvào GNU Awk để bind biến lexical thực sự, cho phép viết kiểufunction read_objfile(obj, objpath) { @let (bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) { } }Đáng tiếc là dự án đã từ chối, và họ khuyên tôi fork GNU Awk rồi đổi tên, nên tôi đã làm vậy
https://www.kylheku.com/cgit/egawk/about/
Khi được hỏi vì sao dòng lệnh Linux là môi trường phát triển tốt nhất, một trong những công cụ thường được nhắc đến là Awk. Chỉ cần biết Awk ở mức cơ bản cũng có thể làm được rất nhiều việc với rất ít công sức, và thậm chí IDE còn bắt đầu khiến bạn cảm thấy chậm chạp hơn
Nếu muốn học Awk và hợp với kiểu học qua bài giảng, tôi đã ghi lại trên YouTube bài thuyết trình từng làm cho Linux Fest Northwest vài năm trước: https://youtu.be/E5aQxIdjT0M
Các chuỗi kiểu
CTRL+Dcó thể cắt đứt đầu vào, và có lẽ còn hàng chục trường hợp biên khác mà tôi chưa biết sẽ cắn bạn đúng vào lúc tệ nhấtAwk là một công cụ ấn tượng, nhưng nếu đặt nó lên bệ thờ thì các điểm yếu sẽ bị che khuất. Với công việc nghiêm túc, có lẽ nên chuyển sang những công cụ chuyên biệt và hiện đại hơn, phù hợp với tác vụ đó
Phần lớn những gì IDE làm không phải là thao tác chỉnh sửa văn bản mà là giúp hiểu và sửa đổi mã nguồn. Không phải tôi muốn nói là sai, chỉ là tôi tò mò về góc nhìn đằng sau nhận định đó
Ban đầu tôi tưởng cái tên này đến từ tiếng lóng tiếng Nhật aho(アホ), nghĩa là “ngu ngốc”, rồi mới nhớ ra Alfred Aho là chữ
atrongawk. Có khi là cả hai chăng?Đây là một dự án tuyệt vời và là một ý tưởng hay. Hiểu được nền tảng cơ bản sẽ mang lại cho bạn một góc nhìn khác khi nhìn vào các dự án và vấn đề khác
Trước đây tôi từng làm một wiki nền web bằng Awk, vì lúc đó tôi đang dùng một router Linksys có rất ít bộ nhớ
Nó rất hữu ích để học cả cách wiki hoạt động lẫn những gì có thể làm với Awk. Vì không có thư viện nào để dựa vào nên tôi phải tự cài đặt các phần cơ bản, và nhờ vậy mà hiểu chúng thật sự
Có nói rằng “không có kế hoạch thêm tính năng mạng vào đây. Tất nhiên là có thể, nhưng sẽ không có clone hay push”, nhưng ngay cả với kho lưu trữ nằm ở thư mục khác trên cùng một máy tính thì vẫn có thể git clone và push được
Tôi vẫn luôn có cảm giác rằng liệu có thể tạo ra một công cụ cơ sở dữ liệu và xử lý toàn năng vượt qua các công cụ chuyên dụng về hiệu năng và tính năng chỉ với vài tiện ích và chương trình GNU, và có lẽ không cần nhiều hơn thế không. Có phải chỉ mình tôi nghĩ vậy không?
Có thể liên quan
sed-chess: https://news.ycombinator.com/item?id=37896854
awk-raycaster: https://github.com/TheMozg/awk-raycaster
https://github.com/soimort/translate-shell
Nếu khi phát triển dự án này mà dùng cppawk, thứ khi đó còn chưa tồn tại, thì đã có thể dùng
#include. Nó hoạt động tốt với đường dẫn tương đối theo tệp và không cầnAWKPATHBạn cũng có thể “build” chương trình đã được tiền xử lý thành một tệp duy nhất, nên sau đó sẽ không còn cần cppawk nữa
https://www.kylheku.com/cgit/cppawk/about/