-
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
Ý 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
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
Đô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
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ị
https://en.wikipedia.org/wiki/Brian_Kernighan
http://www.linuxjournal.com/article/7035
http://www-2.cs.cmu.edu/~mihaib/kernighan-interview/index.html
https://web.archive.org/web/20090428163341/https://www.princeton.edu/~mike/unixhistory
https://web.archive.org/web/20131126220450/http://princetonstartuptv.com/post/49379235060/the-legendary-brian-kernighan-on-teaching-writing
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ó
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
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/01983,01979khô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 nhớ hồi lâu trước có ai đó viết trong
.sigtrên Usenet rằng “Perl là bơ thực vật, awk là bơ”. Cũng có thể thứ tự là ngược lạiPerl đú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.
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ó.
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
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.
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ểueval 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.