นักพัฒนาสร้าง Compiler แปลง BASIC เป็น Go ในช่วงสุดสัปดาห์ จุดประกายการถ่ายเถียงเรื่อง Parser แบบเขียนเองกับแบบสร้างอัตโนมัติ

ทีมชุมชน BigGo
นักพัฒนาสร้าง Compiler แปลง BASIC เป็น Go ในช่วงสุดสัปดาห์ จุดประกายการถ่ายเถียงเรื่อง Parser แบบเขียนเองกับแบบสร้างอัตโนมัติ

โปรเจกต์สุดสัปดาห์ของอดีต CTO ของ Stripe ที่สร้าง BASIC-to-Go compiler ได้จุดประกายการถกเถียงกันอย่างคึกคักในชุมชนโปรแกรมเมอร์เกี่ยวกับแนวทางที่ดีที่สุดในการสร้าง language parser และสิ่งที่ถือว่าเป็น compiler อย่างแท้จริง

David Singleton ได้แบ่งปันประสบการณ์ของเขาในการสร้าง toybasic ซึ่งเป็น TinyBASIC เวอร์ชันที่เรียบง่ายที่สามารถ compile เป็นโค้ด Go ได้ โปรเจกต์นี้ใช้เวลาเพียงไม่กี่ชั่วโมงในวันเสาร์ที่ฝนตก แสดงให้เห็นว่าเครื่องมือสมัยใหม่สามารถทำให้การสร้าง compiler เข้าถึงได้ง่ายอย่างน่าประหลาดใจ compiler ของเขาใช้แนวทางแบบสามขั้นตอนแบบคลาสสิก: lexing, parsing และ code generation

องค์ประกอบของสถาปัตยกรรม Compiler:

  • Lexer: แปลงอักขระของ source code ให้เป็น token ที่มีความหมายโดยใช้ Deterministic Finite Automata
  • Parser: สร้าง syntax tree จาก token และตรวจสอบความถูกต้องของโครงสร้างโปรแกรม
  • Code Generator: ท่องไปตาม syntax tree และสร้างโค้ด Go ที่เทียบเท่าออกมา

การถกเถียงครั้งใหญ่เรื่อง Parser

โปรเจกต์นี้ได้จุดประกายการแบ่งแยกที่น่าสนใจในชุมชนนักพัฒนาเกี่ยวกับวิธีการสร้าง parser นักพัฒนาที่มีประสบการณ์บางคนสนับสนุน hand-written parser อย่างแรง โดยโต้แย้งว่ามันง่ายต่อการเขียนและ debug มากกว่าที่หลายคนคิด พวกเขาชี้ให้เห็นว่าการ parsing แบบ manual ช่วยให้สามารถสร้าง error message ที่ดีกว่าและให้นักพัฒนาควบคุมกระบวนการได้มากขึ้น

อย่างไรก็ตาม คนอื่นๆ โต้กลับว่าเมื่อคุณกำลังทดลองกับไอเดียภาษาใหม่ๆ parser generator จะกลายเป็นสิ่งที่มีค่าอย่างมาก ความสามารถในการปรับปรุงไวยากรณ์อย่างรวดเร็วโดยไม่ต้องเขียนโค้ด parsing ใหม่ด้วยมือสามารถประหยัดเวลาการพัฒนาได้อย่างมาก นักพัฒนาคนหนึ่งกล่าวว่าพวกเขาใช้เวลา 80% ของการออกแบบภาษาเพียงแค่เขียนและ debug parser เมื่อทำทุกอย่างด้วยตนเอง

ความตึงเครียดระหว่างการควบคุมและความสะดวกสบายนี้สะท้อนถึงธีมที่กว้างขึ้นในการพัฒนาซอฟต์แวร์ - ว่าจะใช้เครื่องมืออัตโนมัติหรือรักษาการควบคุมโดยตรงในทุกด้านของโค้ด

อะไรคือสิ่งที่ทำให้เป็น Compiler?

การถกเถียงที่ไม่คาดคิดได้เกิดขึ้นเกี่ยวกับคำศัพท์ สมาชิกชุมชนบางคนตั้งคำถามว่าการแปลง BASIC เป็น Go ควรเรียกว่า compiler มากกว่า transpiler หรือไม่ เนื่องจากมันไม่ได้สร้าง machine code โดยตรง สิ่งนี้ได้จุดประกายการถกเถียงที่น่าสนใจเกี่ยวกับคำจำกัดความในวิทยาการคอมพิวเตอร์

ฉันทามติดูเหมือนจะเป็นว่าโปรแกรมใดๆ ที่แปลจากภาษาหนึ่งไปยังอีกภาษาหนึ่งถือว่าเป็น compiler โดยไม่คำนึงถึงภาษาเป้าหมาย ท้ายที่สุดแล้ว compiler สมัยใหม่หลายตัวจะส่งออก intermediate representation หรือ bytecode มากกว่า machine instruction โดยตรง ความแตกต่างระหว่าง compiler และ transpiler ดูเหมือนจะเป็นเรื่องทางวิชาการมากกว่าเรื่องปฏิบัติ

เสน่ห์ที่ยั่งยืนของ BASIC

การเลือก BASIC เป็นภาษาต้นทางได้สร้างความสะเทือนใจให้กับนักพัฒนาหลายคนที่จดจำมันได้ด้วยความรักใคร่ในฐานะภาษาโปรแกรมมิ่งแรกของพวกเขา แม้จะมีชื่อเสียงของ BASIC ในบางแวดวง สมาชิกชุมชนก็เน้นย้ำถึงการเข้าถึงได้ที่น่าทึ่งของมัน - ภาษาที่นักศึกษาสาขามนุษยศาสตร์สามารถเรียนรู้ได้ในบ่ายวันหนึ่ง แต่ยังคงมีพลังเพียงพอสำหรับการเขียนโปรแกรมอย่างจริงจัง

BASIC รุ่นใหม่ได้พัฒนาไปไกลเกินกว่าโค้ดที่มีหมายเลขบรรทัดและเต็มไปด้วย GOTO ที่ทำให้ภาษานี้มีชื่อเสียงไม่ดี นักพัฒนาหลายคนแบ่งปันประสบการณ์เชิงบวกกับ structured BASIC dialect ที่รวม control flow ที่เหมาะสมและฟีเจอร์การเขียนโปรแกรมแบบโมดูลาร์

โปรเจกต์นี้ทำหน้าที่เป็นทั้งการเดินทางแห่งความคิดถึงและการสาธิตเชิงปฏิบัติว่าการสร้าง compiler ไม่จำเป็นต้องน่ากลัว ด้วยเครื่องมือที่เหมาะสมและความเข้าใจที่ชัดเจนในหลักพื้นฐาน แม้แต่งานที่ดูซับซ้อนอย่างการสร้าง compiler ก็สามารถกลายเป็นโปรเจกต์สุดสัปดาห์ที่สนุกสนานได้

อ้างอิง: I wrote a compiler