-
บทสัมภาษณ์สั้น ๆ กับ Dr. Brian Kernighan ผู้ให้กำเนิด AWK
-
แนะนำ Dr. Brian Kernighan
- Dr. Brian Kernighan เป็นนักวิทยาการคอมพิวเตอร์ชาวแคนาดา ผู้มีส่วนร่วมในการพัฒนา UNIX ที่ Bell Labs
- ร่วมเขียนหนังสือพื้นฐานเกี่ยวกับภาษาโปรแกรม C ชื่อ "The C Programming Language" กับ Dennis Richie
- ตั้งแต่ปี 2000 เป็นต้นมา ได้สอนและบ่มเพาะโปรแกรมเมอร์รุ่นใหม่ที่ Princeton University
- เป็นที่รู้จักจากการเขียนโปรแกรม "Hello World!" โปรแกรมแรก
-
แนวคิดใหม่ของ AWK
- แนวคิดหลักของ AWK คือ associative arrays
- ในเวลานั้นถือเป็นแนวคิดใหม่ แต่ปัจจุบันถูกใช้ในภาษาส่วนใหญ่ทั้งในรูปฟังก์ชันไลบรารี (hashmaps in Java or C++) หรือเป็นส่วนหนึ่งของภาษาเอง (dictionaries in Perl and Python)
- associative arrays เป็นโครงสร้างที่ทรงพลังมาก และสามารถใช้จำลองโครงสร้างข้อมูลได้หลากหลาย
- กระบวนทัศน์ pattern-action ก็ยังไม่แพร่หลายนักในเวลานั้น แต่เป็นวิธีที่มีประสิทธิภาพในการจัดระเบียบการคำนวณบางประเภท
-
แหล่งอ้างอิงที่ใช้ตอนสร้างภาษาโปรแกรม
- Dr. Kernighan: "ไม่มี"
- ในช่วงทศวรรษ 1970 มีภาษาเฉพาะทางใหม่ ๆ จำนวนมาก และแทบไม่มีงานก่อนหน้าที่ใช้อ้างอิงได้
- Yacc เป็นเครื่องมือสำคัญที่ช่วยให้สร้างและทดลองไวยากรณ์ได้ง่าย
- Lex ทำหน้าที่แบบเดียวกันในระดับการวิเคราะห์คำศัพท์ โดยแทนที่โค้ดน่าเบื่อจำนวนมากด้วยชุดกฎ
- Lex และ Yacc เป็นตัวอย่างของภาษาแบบ pattern-action และส่งเสริมกันเป็นวงจรเชิงบวก
-
คำแนะนำสำหรับคนรุ่นใหม่ที่สนใจการออกแบบภาษาโปรแกรม
- เขาแนะนำให้ลองออกแบบและพัฒนาภาษาเฉพาะทางขนาดเล็ก
- สิ่งนี้ทั้งสนุกและมีประโยชน์มาก และง่ายกว่าการสร้างภาษามาแทน Rust หรือ C++ มาก
- แนะนำให้มองหางานที่สามารถทำให้เป็นอัตโนมัติได้ แล้วสร้างคอมไพเลอร์และรันไทม์อย่างง่าย
- บทความที่ Jon Bentley เขียนไว้นานแล้วในเรื่องนี้ยังคงใช้ได้อยู่
-
ที่มาของภาพ
- Wikimedia Commons
-
สรุปโดย GN⁺
- Dr. Brian Kernighan เป็นบุคคลสำคัญที่มีส่วนร่วมในการพัฒนา UNIX และภาษา C และเป็นผู้ให้กำเนิดภาษา AWK ที่นำเสนอ associative arrays และกระบวนทัศน์ pattern-action
- associative arrays เป็นโครงสร้างข้อมูลอันทรงพลังที่ปัจจุบันถูกใช้ในภาษาโปรแกรมส่วนใหญ่
- สำหรับโปรแกรมเมอร์รุ่นใหม่ การลองออกแบบและพัฒนาภาษาเฉพาะทางขนาดเล็กเป็นสิ่งที่มีประโยชน์
- Yacc และ Lex เป็นเครื่องมือที่ช่วยให้การวิเคราะห์ไวยากรณ์และคำศัพท์ทำได้ง่ายขึ้น และเป็นตัวอย่างที่ดีของภาษาแบบ pattern-action
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เกร็ดเล็กเกร็ดน้อยเกี่ยวกับ Brian Kernighan ที่ไม่ค่อยเป็นที่รู้จัก: เขาเข้าร่วมภาควิชา CS ของ Princeton ในปี 2000 แต่ดูเหมือนว่าเมื่อราวปี 1993 ตอนยังอยู่ที่ Bell Labs Research เขาเคยสอนที่ Princeton อย่างน้อยหนึ่งวิชาแล้ว
มีนักศึกษาคนหนึ่งมักพกแล็ปท็อป 386sx ที่รัน Linux ก่อนเวอร์ชัน 1.0 มาด้วย และเมื่อ Brian จำรายละเอียดพฤติกรรมของ awk ไม่ได้ นักศึกษาคนนั้นจะรันคำสั่ง awk ให้ดูว่า “implementation ที่ถูกต้อง” เป็นอย่างไร ว่ากันว่าเพราะอย่างนั้น Brian จึงได้สัมผัส Linux ค่อนข้างเร็ว
เขายังมีบทความจากฤดูใบไม้ร่วงปี 1994 ที่เอาสมุดโทรศัพท์โทรฟรีของ AT&T ขึ้นอินเทอร์เน็ตด้วย: https://www.cs.princeton.edu/~bwk/800.html
ถ้าสนใจ บท สัมภาษณ์ยาวชั่วโมงครึ่ง ที่ Lex Fridman คุยกับ BK ค่อนข้างดี: https://www.youtube.com/watch?v=O9upVbGSBFo
บางครั้งก็รู้สึกว่าการได้มีชีวิตอยู่ในยุคนี้เป็นอภิสิทธิ์อย่างยิ่ง คล้ายกับนักคณิตศาสตร์ที่ได้สัมภาษณ์ Euler หรือนักฟิสิกส์ที่ได้สัมภาษณ์ Newton
หนังสือ Masterminds of Programming มีบทสัมภาษณ์ที่ครอบคลุมกว่านี้ โดยรวมถึง Aho และ Weinberger ด้วย แนะนำอย่างยิ่ง
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
สัปดาห์นี้ผมกำลังอ่าน The Unix Programming Environment จากปี 1983 ซึ่งก็เท่ากับอ่านช้าไปประมาณ 35 ปี ในหนังสือ awk เด่นมากจริง ๆ และดูเป็นสิ่งที่ใกล้เคียงที่สุดกับภาษายอดนิยมปัจจุบันอย่าง JavaScript, Lua, Python, Perl, Tcl
สิ่งที่ awk เรียกว่า “associative array” นั้น JavaScript เรียกง่าย ๆ ว่า “object” ซอร์สของ awk ใน Unix ฉบับที่ 7 ปี 1979 มีเพียง 2680 บรรทัดตาม https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/awk และน่าทึ่งที่ไฟล์ executable มีขนาด 46KB รันได้ใน address space 64KB ของ PDP-11 ดูเหมือนว่าเวอร์ชันนั้นและ awk ในหนังสือที่ออกมาอีก 4 ปีให้หลังยังไม่มี user-defined function และ V7 Bourne shell ก็น่าจะเหมือนกัน แต่ bc มี
executable ขนาด 46KB ก็ยังใหญ่กว่า Turbo Pascal 3.02 เล็กน้อย: https://prog21.dadgum.com/116.html แน่นอนว่า Turbo Pascal ไม่มี regex engine
function,for e in a, ไวยากรณ์ที่ไม่ต้องมีเซมิโคลอน, การจัดการชนิดข้อมูลที่เน้นสตริง, และdelete x[e]ก็เห็นค่อนข้างชัดว่า รากฐานของ JavaScript คือ awk และ Brendan Eich ก็เคยพูดเช่นนั้น: https://brendaneich.com/2010/07/a-brief-history-of-javascript/01983,01979ไม่ใช่วิธีเขียนปี และจริง ๆ แล้วในฐานะวิธีเขียนตัวเลขก็ยังแปลกด้วยจำได้ว่านานมาแล้วมีใครบางคนเขียนไว้ใน
.sigของ Usenet ว่า “Perl คือมาการีน ส่วน awk คือเนย” ลำดับอาจจะกลับกันก็ได้Perl มีข้อเสียเยอะก็จริง แต่หลังจากค้นพบ Perl แล้ว ผมก็ใช้ awk น้อยลงมาก
ผมมีหนังสือ K&R ที่ Dr. Kernighan เซ็นให้ที่งานประชุม Unix ในออสเตรเลียช่วงยุค 80 เป็นหนึ่งในของที่ผมทะนุถนอมที่สุด
หนังสือเล่มนั้น รวมถึง The Practice of Programming ของ Kernighan/Pike และนิตยสาร Byte อะไรทำนองนั้น คือ “Stack Overflow” ของผมในยุค 1980
น่าสนใจที่เขาพูดถึง associative array ราวกับเป็น “สิ่งที่ค่อนข้างใหม่” เพราะใน Lisp มีมาตั้งเกือบ 20 ปีก่อนแล้ว
แม้ตอนที่ผมเริ่มเขียนโปรแกรมในยุค 1990 คนจำนวนมากในโลก C ก็ยังมองโครงสร้างข้อมูลแบบ associative อย่าง hash table ว่าเป็นของค่อนข้างแปลกใหม่ และจะหยิบมาใช้เฉพาะเมื่อจำเป็นจริง ๆ เท่านั้น เรามักคิดว่าโลกโปรแกรมมิงเคลื่อนไหวเร็ว แต่จริง ๆ แล้วไม่ใช่ และโดยเฉพาะในสมัยนั้นยิ่งช้ากว่านี้ ฟีเจอร์ที่ปรากฏในภาษาใดภาษาหนึ่งช่วงยุค 1960–70 มักใช้เวลาหลายสิบปีกว่าจะถูกนำไปใช้อย่างแพร่หลาย Lisp เองในตอนนั้นก็มีประสิทธิภาพค่อนข้างแย่เมื่อเทียบกับทางเลือกอื่น ๆ จึงอาจไม่ใช่ตัวอย่างที่ดีในการโปรโมตฟีเจอร์ของตัวเอง
awk ถือกำเนิดบนเครื่องที่ช้าและหน่วยความจำเล็ก และคุณสมบัติของ array ก็เป็นผลจากสภาพแวดล้อมนั้นเช่นกัน ตัวอย่างคือการจำกัด subscript ให้เป็นสตริง และแม้จะมี syntactic sugar ก็ยังจำกัดไว้ที่ 1 มิติ หากเป็น implementation ที่ทั่วไปกว่านี้ ก็น่าจะอนุญาตให้มี array หลายมิติ หรืออย่างน้อยให้ใส่ array เป็น element ของ array ได้ เวอร์ชันเสถียรของ SNOBOL4 ออกในปี 1967: https://en.wikipedia.org/wiki/SNOBOL
ดังนั้นถ้าไม่นับ alist หรือ property list ว่าเป็น associative array ในตัวของ Lisp ก็น่าจะอยู่ในยุคเดียวกับช่วงที่ awk ถือกำเนิด หรือช้ากว่านั้นเล็กน้อย
ในภาษาใด ๆ เราสามารถสร้างสิ่งที่คล้าย associative array ด้วย linear search ได้ในไม่กี่นาที แต่มันต่างกันโดยสิ้นเชิงกับสิ่งที่ ฝังมาเป็นฟีเจอร์ของภาษา อย่าง SNOBOL4, MUMPS, awk, Perl, Python, Tcl, Lua, JavaScript สิ่งที่ Lisp ยุคแรกให้มาเพื่อจัดโครงสร้างข้อมูลคือ
cons,car,cdrซึ่งไม่ใช่สิ่งเดียวกัน ก่อน awk ใน Unix เองก็มีโปรแกรมที่มี associative array อยู่ เช่น symbol ของ linker, C compiler, assembler, kernel ในรูปแบบ directory ของ filesystem, และตัวแปรของ shell แต่ไม่ได้ถูก提供มาเป็นฟีเจอร์ของภาษาโปรแกรม Bourne shell น่าจะใกล้เคียงที่สุด เพราะสามารถเลียนแบบได้ด้วยการต่อชื่อตัวแปรแล้วใช้eval myarray_$key=$valอะไรแบบนั้น และการจัดการตัวแปร shell ใน V7 Bourne shell ก็ implement ด้วยการค้นหาแบบ binary treeสายธารของการพัฒนา จาก regular expression ไปสู่ lex, yacc, awk นั้นน่าประทับใจมาก ให้ความรู้สึกอย่างน่าเชื่อถือว่าเป็นการต่อยอดจากงานก่อนหน้าเพื่อสร้างผลลัพธ์ที่ทั่วไปยิ่งขึ้น
พูดแบบนี้อาจโดนด่า แต่ผมคิดว่าบน GitHub น่าจะมีโปรแกรมเมอร์จำนวนมากที่มี repository เขียนได้ดีกว่าตำนานสายโค้ดเหล่านี้มาก ตอนนั้นฐานคนเก่งเล็กกว่านี้มาก