1 คะแนน โดย GN⁺ 2024-07-19 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • บทสัมภาษณ์สั้น ๆ กับ 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 ความคิดเห็น

 
GN⁺ 2024-07-19
ความคิดเห็นจาก 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

    • ชักสับสนว่า gawk เป็น implementation อ้างอิงของ awk หรือจริง ๆ แล้วฝั่งที่ต่างไปมากคือ gsed กันแน่
    • ได้กลิ่นว่า “นักศึกษาคนนั้น” น่าจะเป็นคนเขียนเอง
  • ถ้าสนใจ บท สัมภาษณ์ยาวชั่วโมงครึ่ง ที่ Lex Fridman คุยกับ BK ค่อนข้างดี: https://www.youtube.com/watch?v=O9upVbGSBFo

    • ช่อง YouTube ของ Computerphile ก็มีสัมภาษณ์ BK อยู่เยอะ: https://www.youtube.com/results?search_query=computerphile+kernighan
      บางครั้งก็รู้สึกว่าการได้มีชีวิตอยู่ในยุคนี้เป็นอภิสิทธิ์อย่างยิ่ง คล้ายกับนักคณิตศาสตร์ที่ได้สัมภาษณ์ Euler หรือนักฟิสิกส์ที่ได้สัมภาษณ์ Newton
    • เมื่อก่อนเคยดูบางส่วนของบรรยายเขาแล้วรู้สึกไม่ค่อยประทับใจ แต่สัมภาษณ์นี้ดูดีทีเดียวตั้งแต่ช่วงต้นที่เริ่มคุยกันจริง ๆ หลังโฆษณา
  • หนังสือ Masterminds of Programming มีบทสัมภาษณ์ที่ครอบคลุมกว่านี้ โดยรวมถึง Aho และ Weinberger ด้วย แนะนำอย่างยิ่ง

  • สัปดาห์นี้ผมกำลังอ่าน 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 มี

    • awk ที่ยังไม่มี user-defined function เป็นที่รู้จักในชื่อ old awk หรือชื่อที่ตั้งย้อนหลังว่า oawk ใน Heirloom ยังมี implementation ที่ดูเหมือนเป็นลูกหลานของมันอยู่ เคียงกับ nawk ที่คุ้นเคยกว่า: https://heirloom.sourceforge.net/man/awk.1.html
      executable ขนาด 46KB ก็ยังใหญ่กว่า Turbo Pascal 3.02 เล็กน้อย: https://prog21.dadgum.com/116.html แน่นอนว่า Turbo Pascal ไม่มี regex engine
    • awk เป็นมากกว่านั้นอีก ดูจากองค์ประกอบอย่างคีย์เวิร์ด function, for e in a, ไวยากรณ์ที่ไม่ต้องมีเซมิโคลอน, การจัดการชนิดข้อมูลที่เน้นสตริง, และ delete x[e] ก็เห็นค่อนข้างชัดว่า รากฐานของ JavaScript คือ awk และ Brendan Eich ก็เคยพูดเช่นนั้น: https://brendaneich.com/2010/07/a-brief-history-of-javascript/
    • อ่านหนังสือเล่มเดียวกันแล้วได้ข้อสรุปเดียวกันเป๊ะ หลังจากนั้นพออ่าน The UNIX-Haters Handbook ก็รู้สึกว่าเครื่องมือ Unix อย่าง awk ตอนนี้น่าเสียดายที่ยังดีไม่พอ
    • การเขียนแบบ 01983, 01979 ไม่ใช่วิธีเขียนปี และจริง ๆ แล้วในฐานะวิธีเขียนตัวเลขก็ยังแปลกด้วย
    • เลข 0 หน้าปีทำให้สับสนอยู่พอสมควร นึกว่าเป็นรูปแบบวันที่ลึกลับอะไรสักอย่าง
  • จำได้ว่านานมาแล้วมีใครบางคนเขียนไว้ใน .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 เองในตอนนั้นก็มีประสิทธิภาพค่อนข้างแย่เมื่อเทียบกับทางเลือกอื่น ๆ จึงอาจไม่ใช่ตัวอย่างที่ดีในการโปรโมตฟีเจอร์ของตัวเอง
    • ใน PDF ฟรีของฉบับพิมพ์ครั้งแรก The AWK Programming Language ระบุว่า associative array ได้แรงบันดาลใจจาก ตารางของ SNOBOL4 แต่ไม่ได้ทั่วไปกว่านั้น
      awk ถือกำเนิดบนเครื่องที่ช้าและหน่วยความจำเล็ก และคุณสมบัติของ array ก็เป็นผลจากสภาพแวดล้อมนั้นเช่นกัน ตัวอย่างคือการจำกัด subscript ให้เป็นสตริง และแม้จะมี syntactic sugar ก็ยังจำกัดไว้ที่ 1 มิติ หากเป็น implementation ที่ทั่วไปกว่านี้ ก็น่าจะอนุญาตให้มี array หลายมิติ หรืออย่างน้อยให้ใส่ array เป็น element ของ array ได้ เวอร์ชันเสถียรของ SNOBOL4 ออกในปี 1967: https://en.wikipedia.org/wiki/SNOBOL
    • Common Lisp มี hash table ในตัวอยู่แล้วแน่นอน ส่วน MacLisp ดูจาก Pitmanual แล้วเหมือนจะไม่มี แต่ ZetaLisp/LML และ InterLisp มี
      ดังนั้นถ้าไม่นับ alist หรือ property list ว่าเป็น associative array ในตัวของ Lisp ก็น่าจะอยู่ในยุคเดียวกับช่วงที่ awk ถือกำเนิด หรือช้ากว่านั้นเล็กน้อย
    • alist ของ Lisp ก็ถือเป็น “associative array” ในความหมายหนึ่งได้เหมือนกัน แต่เป็นโครงสร้างที่สร้างจาก list มากกว่าจะเป็นฟีเจอร์ของภาษา และไม่มีประสิทธิภาพเพียงพอสำหรับการใช้งานแบบที่ใช้ใน 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 เขียนได้ดีกว่าตำนานสายโค้ดเหล่านี้มาก ตอนนั้นฐานคนเก่งเล็กกว่านี้มาก

    • อยากรู้ว่าคุณคิดว่าใครในยุคนี้เก่งบ้าง การตามดูอาชีพหรือข่าวคราวของคนรุ่นใหม่ ๆ สนุกเสมอ
    • ผมไม่คิดว่าเคยมีใครอ้างว่า Brian Kernighan เป็นโปรแกรมเมอร์ที่เก่งที่สุดในประวัติศาสตร์นะ
    • อาจเป็นคำพูดที่ไร้เดียงสา แต่ผมสงสัยจริง ๆ ว่าเราจะวัดว่า ดีกว่า ได้อย่างไร?