1 điểm bởi GN⁺ 2024-07-19 | 1 bình luận | Chia sẻ qua WhatsApp
  • Cuộc phỏng vấn ngắn với Tiến sĩ Brian Kernighan, người đồng sáng lập AWK

    • Giới thiệu về Tiến sĩ Brian Kernighan

      • Tiến sĩ Brian Kernighan là một nhà khoa học máy tính người Canada, đã đóng góp vào quá trình phát triển UNIX tại Bell Labs
      • Ông đồng tác giả cuốn sách nền tảng về ngôn ngữ lập trình C, "The C Programming Language", cùng với Dennis Richie
      • Từ năm 2000, ông đào tạo thế hệ lập trình viên tiếp theo tại Princeton University
      • Ông nổi tiếng là người viết chương trình "Hello World!" đầu tiên
    • Ý tưởng mới của AWK

      • Ý tưởng cốt lõi của AWK là mảng kết hợp (associative arrays)
      • Vào thời điểm đó đây là một khái niệm mới, nhưng hiện nay nó được dùng trong hầu hết các ngôn ngữ dưới dạng hàm thư viện (hashmaps trong Java hoặc C++) hoặc như một phần của chính ngôn ngữ (dictionaries trong Perl và Python)
      • Mảng kết hợp là một cấu trúc rất mạnh, có thể được dùng để mô phỏng nhiều kiểu cấu trúc dữ liệu khác nhau
      • Mô hình pattern-action khi đó cũng chưa được sử dụng rộng rãi, nhưng là một cách hiệu quả để tổ chức những phép tính cụ thể
    • Tài liệu tham khảo khi tạo ngôn ngữ lập trình

      • Tiến sĩ Kernighan: "Không có"
      • Vào thập niên 1970, có rất nhiều ngôn ngữ chuyên dụng mới xuất hiện và hầu như không có nhiều tài liệu đi trước đáng để tham khảo
      • Yacc là một công cụ quan trọng giúp tạo ngữ pháp và thử nghiệm một cách dễ dàng
      • Lex đóng vai trò tương tự ở mức từ vựng, thay thế nhiều đoạn mã nhàm chán bằng một tập quy tắc
      • Lex và Yacc là những ví dụ về ngôn ngữ pattern-action, và đã tạo nên một vòng lặp tích cực cho nhau
    • Lời khuyên cho những người trẻ quan tâm đến thiết kế ngôn ngữ lập trình

      • Ông khuyên hãy thử thiết kế và hiện thực một ngôn ngữ chuyên dụng nhỏ
      • Việc này rất thú vị, hữu ích và dễ hơn nhiều so với việc tạo ra một ngôn ngữ thay thế cho Rust hay C++
      • Ông khuyến nghị tìm những công việc có thể tự động hóa rồi tạo một trình biên dịch đơn giản cùng runtime cho chúng
      • Bài viết liên quan do Jon Bentley viết từ lâu vẫn còn nguyên giá trị đến nay
    • Nguồn ảnh

      • Wikimedia Commons

Tóm tắt của GN⁺

  • Tiến sĩ Brian Kernighan là một nhân vật quan trọng đã đóng góp cho sự phát triển của UNIX và ngôn ngữ C, đồng thời là người tạo ra ngôn ngữ AWK với mảng kết hợp và mô hình pattern-action
  • Mảng kết hợp là một cấu trúc dữ liệu mạnh hiện được sử dụng trong phần lớn các ngôn ngữ lập trình
  • Với các lập trình viên trẻ, việc thiết kế và hiện thực một ngôn ngữ chuyên dụng nhỏ là rất hữu ích
  • Yacc và Lex là những công cụ giúp đơn giản hóa việc phân tích ngữ pháp và từ vựng, đồng thời là các ví dụ tốt về ngôn ngữ pattern-action

1 bình luận

 
GN⁺ 2024-07-19
Ý kiến trên Hacker News
  • Một số mẩu chuyện linh tinh ít người biết về Brian Kernighan: ông gia nhập khoa CS của Princeton vào năm 2000, nhưng khi còn ở Bell Labs Research, khoảng năm 1993, ông đã dạy ít nhất một lớp ở Princeton
    Có một sinh viên thường mang theo laptop 386sx chạy Linux trước phiên bản 1.0, và khi Brian không nhớ chi tiết hành vi của awk, sinh viên đó sẽ chạy lệnh awk để cho ông biết “cài đặt chuẩn” trả về gì. Vì vậy có thể nói Brian đã tiếp xúc với Linux từ khá sớm
    Ông cũng có một bài viết năm 1994 đưa danh bạ số miễn phí của AT&T lên Internet: https://www.cs.princeton.edu/~bwk/800.html

    • Tôi hơi lẫn lộn không biết gawk có phải là cài đặt chuẩn của awk không, hay thực ra bên khác biệt đáng kể hơn là gsed
    • Có mùi như “sinh viên đó” chính là người viết
  • Nếu quan tâm, cuộc phỏng vấn 1 tiếng rưỡi của Lex Fridman với BK khá hay: https://www.youtube.com/watch?v=O9upVbGSBFo

    • Trên kênh YouTube Computerphile cũng có nhiều cuộc phỏng vấn BK: https://www.youtube.com/results?search_query=computerphile+kernighan
      Đôi khi tôi thấy được sống trong thời đại này là một đặc quyền khổng lồ. Nó giống như một nhà toán học có thể phỏng vấn Euler, hay một nhà vật lý có thể phỏng vấn Newton vậy
    • Trước đây tôi từng xem một phần bài giảng của ông và thấy không ấn tượng lắm, nhưng cuộc phỏng vấn này có vẻ khá ổn ngay từ đoạn đầu sau quảng cáo, khi cuộc trò chuyện thật sự bắt đầu
  • Sách Masterminds of Programming có một cuộc phỏng vấn toàn diện hơn, gồm cả Aho và Weinberger. Rất khuyến nghị

  • Tuần này tôi đang đọc The Unix Programming Environment năm 1983, coi như đọc muộn khoảng 35 năm. Trong sách, awk thật sự nổi bật, và trông như thứ gần nhất với các ngôn ngữ đang phổ biến hiện nay như JavaScript, Lua, Python, Perl, Tcl
    Thứ awk gọi là “mảng kết hợp” thì JavaScript chỉ gọi là “object”. Mã nguồn awk trong Unix ấn bản 7 năm 1979 chỉ có 2680 dòng theo https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/awk, và thật đáng kinh ngạc là file thực thi chỉ 46KB, chạy được trong không gian địa chỉ 64KB của PDP-11. Có vẻ phiên bản đó và awk xuất hiện trong sách 4 năm sau đều chưa có hàm do người dùng định nghĩa, và V7 Bourne shell dường như cũng vậy. Nhưng bc thì có

    • awk không có hàm do người dùng định nghĩa được gọi là old awk, hoặc bằng tên đảo ngược oawk. Trong Heirloom vẫn còn một cài đặt có vẻ là hậu duệ của nó, cùng với nawk quen thuộc hơn: https://heirloom.sourceforge.net/man/awk.1.html
      File thực thi 46KB cũng vẫn hơi lớn hơn Turbo Pascal 3.02: https://prog21.dadgum.com/116.html Tất nhiên Turbo Pascal không có engine biểu thức chính quy
    • awk còn hơn thế nữa. Nhìn vào các yếu tố như từ khóa function, for e in a, cú pháp không cần dấu chấm phẩy, xử lý kiểu dữ liệu lấy chuỗi làm trung tâm, delete x[e], khá rõ rằng awk là nền tảng của JavaScript, và Brendan Eich cũng đã nói như vậy: https://brendaneich.com/2010/07/a-brief-history-of-javascript/
    • Tôi đọc cùng cuốn sách đó và đi đến đúng kết luận như vậy. Sau đó đọc The UNIX-Haters Handbook thì cảm thấy các công cụ Unix như awk giờ đây, đáng tiếc, không còn đủ tốt nữa
    • Viết như 01983, 01979 không phải là cách viết năm, và thật ra ngay cả như cách viết số cũng kỳ lạ
    • Tôi đã khá bối rối vì số 0 đứng trước năm. Cứ tưởng đó là một dạng định dạng ngày tháng khó hiểu nào đó
  • Tôi nhớ hồi lâu trước có ai đó viết trong .sig trên Usenet rằng “Perl là bơ thực vật, awk là bơ”. Cũng có thể thứ tự là ngược lại
    Perl đúng là có nhiều nhược điểm, nhưng sau khi khám phá ra Perl thì tôi dùng awk ít hơn hẳn

  • Tôi có một cuốn K&R được Dr. Kernighan ký tặng tại một hội nghị Unix ở Úc vào thập niên 80. Đó là một trong những món đồ tôi trân quý nhất.
    Cuốn sách đó, cùng với The Practice of Programming của Kernighan/Pike và những thứ như tạp chí Byte, chính là “Stack Overflow” của tôi trong thập niên 1980.

  • Thật thú vị khi ông ấy nói về mảng kết hợp như một thứ “tương đối mới”. Vì Lisp đã có chúng từ gần 20 năm trước.

    • Trước thời Internet, dù bạn thành thạo và hiểu biết nhiều trong một lĩnh vực, bạn vẫn rất dễ hoàn toàn không tiếp xúc với những thứ mà cộng đồng khác xem là cơ bản, hoặc phải mất hàng chục năm chúng mới lan truyền chậm rãi.
      Ngay cả khi tôi bắt đầu lập trình vào thập niên 1990, khá nhiều người trong thế giới C vẫn xem các cấu trúc dữ liệu kết hợp như bảng băm là thứ hơi ngoại lai, chỉ đem ra dùng khi thật sự không còn cách nào khác. Chúng ta nghĩ thế giới lập trình chuyển động nhanh, nhưng thực ra không phải vậy; đặc biệt vào thời đó còn chậm hơn. Nhiều tính năng xuất hiện trong một ngôn ngữ nào đó ở thập niên 1960–70 đã mất vài chục năm mới được chấp nhận rộng rãi. Lisp khi ấy cũng có hiệu năng khá tệ so với các lựa chọn khác, nên có thể không phải là ví dụ tốt để quảng bá các tính năng của nó.
    • Bản PDF miễn phí của ấn bản đầu tiên The AWK Programming Language nói rằng mảng kết hợp được lấy cảm hứng từ bảng SNOBOL4, nhưng không tổng quát hơn.
      awk ra đời trên những cỗ máy chậm và bộ nhớ nhỏ, và tính chất của mảng cũng là kết quả của môi trường đó. Ví dụ là chỉ giới hạn chỉ số dưới dạng chuỗi, và dù có cú pháp tiện lợi thì vẫn giới hạn ở một chiều. Người ta nói rằng một triển khai tổng quát hơn có lẽ đã cho phép mảng đa chiều, hoặc ít nhất cho phép phần tử mảng chứa mảng. Bản ổn định của SNOBOL4 ra đời năm 1967: https://en.wikipedia.org/wiki/SNOBOL
    • Common Lisp dĩ nhiên có bảng băm tích hợp sẵn. MacLisp thì nhìn Pitmanual có vẻ không có, còn ZetaLisp/LML và InterLisp thì có.
      Vì vậy, nếu không tính alist hay property list vào nhóm mảng kết hợp tích hợp của Lisp, thì có vẻ chúng gần như cùng thời với thời điểm awk ra đời, hoặc muộn hơn một chút.
    • alist của Lisp theo một nghĩa nào đó đúng là “mảng kết hợp”, nhưng nó là cấu trúc tạo từ list hơn là một tính năng ngôn ngữ, và không đủ hiệu quả cho các cách dùng trong awk.
      Trong bất kỳ ngôn ngữ nào, bạn cũng có thể tạo một thứ gần giống mảng kết hợp bằng tìm kiếm tuyến tính chỉ trong vài phút, nhưng điều đó hoàn toàn khác với việc được tích hợp như một tính năng ngôn ngữ như trong SNOBOL4, MUMPS, awk, Perl, Python, Tcl, Lua, JavaScript. Những gì Lisp thời kỳ đầu cung cấp để cấu trúc dữ liệu là cons, car, cdr, và đó không phải là cùng một thứ. Ngay trong Unix trước awk cũng đã có những chương trình chứa mảng kết hợp dưới dạng symbol của linker, trình biên dịch C, assembler, kernel dưới dạng thư mục hệ thống tệp, hay biến shell, nhưng chúng không được cung cấp như một tính năng của ngôn ngữ lập trình. Bourne shell là thứ gần nhất, vì có thể mô phỏng bằng cách ghép tên biến kiểu eval myarray_$key=$val, và việc xử lý biến shell trong V7 Bourne shell được triển khai bằng tìm kiếm cây nhị phân.
  • Dòng phát triển từ biểu thức chính quy đến lex, yacc rồi awk thật sự rất ấn tượng. Cảm giác xây dựng trên các công trình trước đó để tạo ra kết quả tổng quát hơn được thể hiện rất thuyết phục.

  • Nói thế này chắc sẽ bị chửi, nhưng tôi nghĩ trên GitHub có rất nhiều lập trình viên sở hữu các kho mã được viết tốt hơn những huyền thoại lập trình này. Hồi đó nhóm nhân tài nhỏ hơn nhiều.

    • Tôi tò mò bạn nghĩ ai trong số những người ngày nay là xuất sắc. Theo dõi sự nghiệp hay tình hình gần đây của những gương mặt mới lúc nào cũng thú vị.
    • Tôi không nghĩ từng có ai khẳng định Brian Kernighan là lập trình viên vĩ đại nhất lịch sử.
    • Nói vậy có hơi ngây thơ, nhưng tôi thật sự tò mò. Bạn sẽ đo lường thế nào là tốt hơn?