• ประสบการณ์ทำงานฟรีแลนซ์ Ruby on Rails นาน 20 ปี นำไปสู่โปรเจกต์ Common Lisp แต่ข้อจำกัดด้านประสิทธิภาพ ความสามารถในการพอร์ต และสภาพแวดล้อมรันไทม์ที่สะสมขึ้น ทำให้กลับมาเลือก C อีกครั้ง
  • cl-facts มี triple store ที่รวดเร็วและ atomic transaction ที่ซ้อนกันได้ แต่เวลาพัฒนาที่ยาวนานก็ทำให้สูญเสียลูกค้าไปด้วย
  • ความไม่พอใจต่อ virtual machine, container ที่ใช้ Linux cgroups และ garbage collector นำไปสู่ข้อสรุปว่า C ยังคงเป็นฐานที่ใช้งานได้จริงสำหรับซอฟต์แวร์ระบบ
  • งานที่เริ่มจาก libc3 ขยายไปสู่แนวคิดภาษา C3, interpreter ic3 และ compiler c3c และภายหลังเปลี่ยนชื่อเป็น KC3 เพราะชื่อซ้ำ
  • ปัจจุบัน KC3 รวมถึง graph database ที่พอร์ตเป็น C89, REPL ikc3, เว็บเซิร์ฟเวอร์ MVC kc3_httpd และเว็บไซต์เอกสารที่ใช้ implementation Markdown-to-HTML ด้วย C

เส้นทางจากงาน Common Lisp ไปสู่การเขียนใหม่ด้วย C

  • หลังจากเรียนที่โรงเรียนคอมพิวเตอร์ในฝรั่งเศส 5 ปี และทำงานเป็นนักพัฒนา Ruby on Rails แบบฟรีแลนซ์ 20 ปี สิ่งที่คิดว่าจะเป็นการเรียนรู้ Common Lisp สั้น ๆ ค่อย ๆ กลายเป็นโปรเจกต์ที่ใหญ่ขึ้นเรื่อย ๆ
  • สร้าง ASN.1 parser และระบบ query โดยใช้ Common Lisp สร้างโค้ด C และงานนี้ขยายไปเป็นเซิร์ฟเวอร์ SNMP แบบ custom Common Lisp-to-C
  • หลังจากนั้นได้เขียนแพ็กเกจ Common Lisp หลายตัว
    • cl-unix-cybernetics กลายเป็นโปรเจกต์ที่ได้ดาวมากที่สุดในบรรดา repository บน GitHub
    • เขียน cl-streams และ cffi-posix ด้วย
    • cl-facts เป็น triple store ที่ใช้เป็น graph database ของ Common Lisp ได้
  • cl-facts เป็นผลงานที่มีประสิทธิภาพเร็ว รองรับ atomic transaction, transaction ที่ซ้อนกันได้, เข้ากันได้กับ unwind-protect และใช้งานง่ายโดยเรียนรู้เพียง 3 macro
  • cl-facts ถูกนำเสนอเป็น lightning talk ที่ European Lisp Symposium ในเบลเยียม และสไลด์นำเสนออยู่ที่ facts.pdf
  • แม้การพัฒนาแพ็กเกจ Common Lisp จะใช้เวลานานจนสูญเสียลูกค้า แต่ก็เห็นว่า Common Lisp เป็นเครื่องมือสำหรับคนรุ่นถัดไป

C, KC3 และองค์ประกอบในปัจจุบัน

  • ประสบการณ์ที่เห็นว่า virtual machine สิ้นเปลือง CPU และ bandwidth ไปกับการจำลอง และ container ที่ใช้ Linux cgroups ยังคงพบปัญหา RCE กับ privilege escalation อยู่เรื่อย ๆ นำไปสู่การเลือกแนวทางที่มี OpenBSD เป็นศูนย์กลาง
  • หลีกเลี่ยงเครื่องมือ DevOps อย่าง Terraform และ Ansible และยังได้เห็นคนที่ไม่พอใจทั้ง VM, container รวมถึงตัวภาษาโปรแกรมเอง
  • กรณีที่พยายามสร้างเกมกลยุทธ์ด้วย Clojure ซึ่งมียูนิตหลายพันตัวที่แต่ละตัวรับรู้โลกของตัวเอง ล้มเหลวเพราะ garbage collector
  • โปรเจกต์ Common Lisp เองก็ถูกจำกัดขอบเขตการใช้งานเพราะ garbage collector และ garbage collector ของ JVM ถูกมองว่าเป็นจุดแข็งเชิงพาณิชย์ที่ต้องใช้ต้นทุนสูงเพื่อทำให้ดี
  • เมื่อพิจารณาประสิทธิภาพและความสามารถในการพอร์ต หากไม่มีเครื่องมืออื่น ทางเลือกที่สมเหตุสมผลคือ C
    • Linux เขียนด้วย C
    • OpenBSD เขียนด้วย C
    • GTK+ เขียนด้วย C ล้วนแบบ object-oriented
    • GNOME เขียนด้วย C
    • แอปเดสก์ท็อปบน Linux จำนวนมากก็เขียนด้วย C แบบเก่า
  • เริ่มจากไลบรารียูทิลิตี libc3 แล้วพัฒนาไปเป็นแนวคิดภาษา C3, interpreter ic3 และ compiler c3c
  • ทำให้ buffer UTF-8 และ data structure ส่งผ่านไปมาได้อย่างรวดเร็ว และยอมรับต้นทุนหน่วยความจำเพื่อใช้ bounds-check
  • วาง defensive programming ไว้เป็นแกนหลัก ตั้งเป้าลดบั๊กให้เป็น 0 ตั้งแต่แรก และระบุว่าโค้ด KC3 รันโดยไม่มีนัยด้านความปลอดภัย
  • interpreter ช่วงแรกถูกสร้างเป็นรูปแบบที่ REPL ประมวลผล tags ซึ่งเป็น enum-tagged union ที่บรรจุชนิดข้อมูลทั้งหมดของภาษา
  • หลังจาก 3 ปี รีแฟกเตอร์แบบ 5 ชั้นเสร็จสิ้น เทสต์ทั้งหมดกลับมาผ่านอีกครั้ง และเว็บเซิร์ฟเวอร์ก็กลับมาอยู่ในสภาพที่ไม่พังอีก
  • ชื่อภาษา C3 มีผู้ใช้อยู่แล้ว จึงเปลี่ยนเป็น KC3
  • graph database cl-facts เดิมของ Common Lisp ถูกพอร์ตเป็น C89
    • ส่วนใหญ่เขียนขึ้นในช่วงล็อกดาวน์ Covid-19 ปี 2020
    • รวมการเพิ่ม·ลบ triple, ระบบ recursive query, transaction, logging และ persistence
    • นำดีไซน์ต้นฉบับของ Common Lisp มาทำใหม่ใน C89 แทบจะเหมือนเดิม
  • KC3 ยังมี parser และ generator สำหรับจัดการความหมายเชิงรูปแบบของชนิดข้อมูลอัลกอริทึมหลายแบบ
    • รวมถึง Structs, Linked lists, Maps, Hash tables, Time, Complex, Rationals, Tuples, Code blocks, Quotes, Unquotes, Copy on write, Skip lists, Sets เป็นต้น
    • มี macro และจะกล่าวถึงตัวอย่างในบทความถัดไป
    • ได้รับแรงบันดาลใจอย่างมากจาก José Valim และงาน Elixir
  • REPL ikc3 parse อินพุตจากคีย์บอร์ดหรือไฟล์ แล้วส่งผลการประเมิน KC3 ไปยัง standard output และถูกใช้ใน unit test ของ KC3 ระดับที่ 2 เป็นส่วนใหญ่
  • kc3_httpd เป็นเว็บเซิร์ฟเวอร์ที่มีเฟรมเวิร์ก MVC และใช้สร้างหน้าเว็บในปัจจุบัน
  • บทความ Common Lisp มียอดเข้าชม 700 ครั้ง และเว็บไซต์เอกสารเขียนด้วย kc3_httpd กับ implementation Markdown-to-HTML ด้วย C ที่ขยายเพิ่มเติม

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น