2 điểm bởi GN⁺ 2024-02-12 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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 gawk 5.0 trở lên, hiện dùng pigz cho 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, config chỉ đọc và cat-file; không có kế hoạch thêm các tính năng mạng như clonepush

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
    • gawk 5.0 trở lên
    • pigz để 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 ./modpath rồi chạy aho 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ự Git
    • branches
    • config
    • description
    • HEAD
    • index
    • objects
    • refs/heads
    • refs/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 .aho bằng GIT_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
    • init
    • add/rm
    • status
    • commit
    • config chỉ đọc
    • cat-file
  • Các tính năng chưa hoàn thành
    • reset
    • branch
    • switch
    • ls-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 clone hay push và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

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

    • Đúng vậy. Perl đã thay thế Awk, nhưng trong nhiều trường hợp điều đó lại phản tác dụng. Lý do là không có cách nào viết mã Perl theo kiểu đơn giản và được nhiều người hiểu, mà vẫn đủ dễ đọc cho lập trình viên khác và có thể mở rộng tới các chương trình cỡ vừa đến lớn
      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
    • Bất kể mọi người nghĩ gì, tôi nhận ra là mình thích Perl. Gần đây tôi đã làm một trình chỉnh sửa phân vùng có thể lập trình. Nó hơi giống việc làm trống phân vùng bằng sfdisk, nhưng tôi muốn làm nhiều hơn là chỉ xóa đơn thuần, và muốn kết hợp bảng phân vùng MBR với GPT để tạo ra một dạng hybrid
      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/
    • Awk cực kỳ hữu ích. Tuần này tôi đã viết một script để parse hàng loạt log Postgres dung lượng nhiều GB và trả lời câu hỏi “ai là người bắn nhiều truy vấn nhất trong vài phút ngay sau đúng đầu mỗi giờ?”
      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 -rn thì 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 uniq
    • Việc mọi người đánh giá Perl là tệ là một động lực lớn cho thời kỳ phục hưng của Awk. Những lập trình viên chưa từng học Perl từ đầu thì muốn có thứ gì đó lấp khoảng trống giữa shell và Python, và cũng có những người như tôi đã miễn cưỡng từ bỏ Perl
      Vì 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ó
    • Tôi thích AWK. Kiểu hệ thống kiểu dữ liệu xoay quanh chuỗi của nó còn khiến cả lập trình viên Javascript cũng phải đỏ mặt. 0, "", và đúng nghĩa là không có gì cả đều là cùng một giá trị false
      Cá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ằng substr()
  • 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

    • Khoảng cách 35 năm này là một câu chuyện hay để kể khi biên tập viên hỏi “thế bản 2 tiến triển đến đâu rồi?”
    • Brian Kernighan cũng tham gia. Ông là chữ “K” trong K&R C, và còn là nhân vật gắn với nhiều huyền thoại Unix khác
  • 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ùng
    Tôi đã viết một bản vá thêm câu lệnh let vào GNU Awk để bind biến lexical thực sự, cho phép viết kiểu function 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/

    • Tôi nghĩ phía đó cũng có lý. gawk vốn đã có quá nhiều điểm khác awk rồi. Nếu thêm cú pháp còn khác biệt hơn nữa thì tốt hơn là cứ fork hẳn và đặt một tên khác
  • 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

    • Đồng thời, hỗ trợ Unicode được thêm vào rất muộn, có lẽ chỉ khoảng 2 năm trước. Cũng như các công cụ shell khác, khi chuyển nội dung vào Awk qua pipe vẫn có các trường hợp biên
      Các chuỗi kiểu CTRL+D có 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ất
      Awk 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ụ đó
    • Awk thay thế IDE như thế nào? Tôi thích Awk và cũng biết rằng nếu bỏ thời gian học thì nó rất mạnh, nhưng nếu không có IDE thì năng suất của tôi hẳn đã giảm đi đáng kể
      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ữ a trong awk. Có khi là cả hai chăng?

    • Chắc là cả hai. “Git” cũng vốn đã là tiếng lóng chỉ “kẻ ngốc”, nên đây là một cái tên khá dí dỏm
    • Gần đây tôi nghe thấy nó trong Reservation Dogs: https://en.wiktionary.org/wiki/aho#Navajo
    • Có lẽ là cả hai. Chơi chữ thật sự rất thông minh
  • Đâ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

    • Đúng vậy. Nhưng khi đã có branch thì ở một mức độ nào đó nhu cầu tạo clone cục bộ cũng giảm đi. Thực tế, tôi dùng rsync để sao chép các kho git cục bộ. Vấn đề là điều gì là tốt nhất
    • Quá hiển nhiên, vậy mà dùng git 10 năm rồi tôi chưa từng nghĩ đến việc thử
  • 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

  • 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ần AWKPATH
    Bạ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/