2 คะแนน โดย GN⁺ 2025-03-14 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เรียนที่โรงเรียนคอมพิวเตอร์ในฝรั่งเศส 5 ปี และทำงานเป็นนักพัฒนาอิสระมา 20 ปี
  • ทำโปรเจ็กต์ให้ลูกค้าโดยใช้ Ruby on Rails เป็นหลัก
  • เริ่มเรียนรู้ Common Lisp พร้อมกับเขียนโปรโตคอลจัดการเซิร์ฟเวอร์ที่สร้าง ASN.1 parser
    • พัฒนาเซิร์ฟเวอร์ SNMP โดยสร้างโค้ด C จาก Common Lisp
  • หลังจากนั้นก็ทำหลายโปรเจ็กต์บนพื้นฐานของ Common Lisp:
    • cl-unix-cybernetics – โปรเจ็กต์ที่ได้ดาวมากที่สุดบน GitHub
    • พัฒนา cl-streams และ cffi-posix
    • cl-facts – triple store ที่ทำหน้าที่เป็นฐานข้อมูลกราฟสำหรับ Common Lisp
      • เร็ว รองรับธุรกรรมแบบอะตอมมิก และธุรกรรมที่ซ้อนกันได้
      • ใช้งานร่วมกับ unwind-protect ได้
      • เรียนรู้เพียง 3 แมโครก็ใช้งานได้
      • เคยนำเสนอในงาน European Lisp Symposium (ELS)
  • เมื่อโฟกัสกับการพัฒนา Common Lisp มากขึ้นก็สูญเสียลูกค้าไป แต่ยังคงเชื่อมั่นอย่างมากในศักยภาพของ Lisp

ข้อจำกัดของเครื่องเสมือน (VM) และคอนเทนเนอร์

  • ผู้เชี่ยวชาญชี้ให้เห็นปัญหาของ VM และคอนเทนเนอร์:
    • VM สิ้นเปลือง CPU และแบนด์วิดท์โดยไม่จำเป็น
    • คอนเทนเนอร์บน Linux ที่อิงกับ cgroups มีช่องโหว่การรันคำสั่งจากระยะไกล (RCE) และการยกระดับสิทธิ์
    • มีการค้นพบช่องโหว่ความปลอดภัยใหม่ทุกปี
  • ชื่นชอบ OpenBSD และหลีกเลี่ยงปัญหาของเครื่องมือ DevOps อย่าง Terraform, Ansible

ข้อจำกัดของ Common Lisp และปัญหาด้านประสิทธิภาพ

  • เกิดปัญหาด้านประสิทธิภาพจาก GC (garbage collector) ในภาษาอย่าง Clojure:
    • มีกรณีล้มเหลวตอนพัฒนาเกมวางแผนที่ต้องจัดการยูนิตหลายพันตัว
    • GC ของ JVM มาพร้อมปัญหาด้านประสิทธิภาพและต้นทุน

การตัดสินใจเปลี่ยนไปใช้ C

  • ตระหนักถึงข้อจำกัดด้านประสิทธิภาพและการพกพาของ Common Lisp:
    • Linux, OpenBSD, GTK+, GNOME ล้วนเขียนด้วย C
    • สุดท้ายจึงเปลี่ยนไปใช้ C เพื่อแก้ปัญหาด้านประสิทธิภาพและการพกพา

การพัฒนาภาษาใหม่ KC3

  • พัฒนาไลบรารียูทิลิตี libc3 → ภาษา C3 → เปลี่ยนชื่อเป็น KC3
  • คุณสมบัติของ KC3:
    • มีทั้งอินเทอร์พรีเตอร์ (ic3) และคอมไพเลอร์ (c3c)
    • สร้างโครงสร้างข้อมูลจากบัฟเฟอร์ UTF-8 และแปลงกลับได้
    • การเขียนโปรแกรมเชิงป้องกัน → ลดบั๊กให้เหลือน้อยที่สุดตั้งแต่ต้น
    • ไม่มีปัญหาด้านความปลอดภัย
    • ระบบชนิดข้อมูลที่อิงกับ tagged union แบบ enum

ผลลัพธ์ที่ได้บนพื้นฐานของ KC3

  • พอร์ต cl-facts ไปยัง C89:
    • พัฒนาเสร็จในช่วงการระบาดของ Covid-19
    • ทำฟีเจอร์เพิ่ม triple, ลบ, ระบบ recursive query, ธุรกรรม, logging, persistence เป็นต้น
  • เขียน parser และ generator สำหรับชนิดข้อมูลเชิงอัลกอริทึม:
    • รวมถึง struct, linked list, map, hash table, complex number, tuple, code block เป็นต้น
    • ได้แรงบันดาลใจอย่างมากจาก José Valim (ผู้สร้าง Elixir)
  • ikc3 – REPL ที่แสดงผลลัพธ์การประเมินของ KC3
  • kc3_httpd – พัฒนาเว็บเซิร์ฟเวอร์บนพื้นฐานของเฟรมเวิร์ก MVC
    • ปัจจุบันหน้าเว็บบล็อกนี้ก็ให้บริการด้วย kc3_httpd
  • สร้างเว็บไซต์เอกสาร → ใช้ตัวแปลง Markdown เป็น HTML ของ KC3

บทสรุป

  • เปลี่ยนจาก Common Lisp ไปสู่ C โดยอาศัยประสบการณ์ที่ได้จาก Common Lisp
  • KC3 ให้ผลลัพธ์ที่โดดเด่นด้านประสิทธิภาพ ความปลอดภัย และการพกพา
  • มีแผนจะเผยแพร่แมโครและตัวอย่างเพิ่มเติมที่เกี่ยวข้องกับ KC3 ต่อไป

1 ความคิดเห็น

 
GN⁺ 2025-03-14
ความคิดเห็นจาก Hacker News
  • ฉันเห็นต่าง ตอนเด็กใช้ VB เยอะมาก แล้วไปเรียน Java, C, C++ ในมหาวิทยาลัย และใช้ C เป็นหลัก ได้เป็นนักพัฒนาหลักของ Xfce และทำอยู่ 5 ปี

    • หลังจากนั้นเปลี่ยนไปทำแบ็กเอนด์ ใช้ Java, Scala, Python ภาษาเหล่านี้มีปัญหาอีกแบบ แต่ฉันชอบ standard library และระบบจัดการ dependencies
    • 12 ปีต่อมากลับมาที่ Xfce อีกครั้ง และ C ก็ยังยากเหมือนเดิม มีปัญหาอย่าง memory leak, การอ้างอิง NULL pointer, data race และอื่น ๆ มากมาย
    • พอใช้ Rust แล้วรู้สึกว่าทำงานได้มีประสิทธิผลกว่า C
  • เข้าใจความรู้สึกนั้นเต็มที่ ช่วงหลายปีที่ผ่านมารู้สึกอยากพัฒนาอะไรสักอย่างด้วย C ล้วนอย่างแรง

    • ภาษาหลักของฉันคือ C++ แต่การใช้ไลบรารี C เก่า ๆ นั้นสนุกมากจริง ๆ อินเทอร์เฟซเรียบง่ายและพื้นฐานดี
    • ตอนพัฒนาเมธอดด้วย C ล้วน ฉันชอบที่สามารถโฟกัสกับอัลกอริทึมได้ 100%
    • สำหรับฉัน C บังคับให้ลงมือทำเอง ไม่ซ่อนเวทมนตร์หรือความซับซ้อน
    • คนรอบตัวพยายามใช้ฟีเจอร์ C++ สมัยใหม่ แต่ฉันกลับพยายามตัดฟีเจอร์ C++ ออกมากขึ้นเรื่อย ๆ
  • ฉันเริ่มเขียนโปรแกรมด้วย C มานานมากแล้ว และทุกวันนี้ก็ยังอยากย้อนกลับไปช่วงนั้นบ้างเป็นครั้งคราว

    • แต่พอจะเขียนแอปพลิเคชันระดับ production ด้วย C จริง ๆ ก็จะนึกออกทันทีว่าทำไมถึงเลิกใช้มัน
    • มีหลายอย่างเกินไปที่ต้องทำเองโดยไม่มีตัวช่วยจากคอมพิวเตอร์
    • ถ้าวันนี้ต้องเลือกภาษาระดับล่างสักตัว ฉันคิดว่าน่าจะเลือก Ada มันคล้าย C แต่มีการสนับสนุนจากคอมไพเลอร์มากกว่า
  • หลังจากอ่านบล็อกโพสต์แล้ว ฉันสับสนว่าผู้เขียนต้องการจะสื่ออะไรกันแน่

    • ฉันสงสัยว่าเหตุผลที่โปรแกรมของผู้เขียนไม่ได้ถูกใช้งานนั้นเป็นเพราะภาษาไหม
    • อาจมีปัญหาที่เกี่ยวข้องกับการใช้หน่วยความจำ
    • ผู้เขียนไม่ได้พูดถึงบทเรียนที่ได้เรียนรู้หรือสถิติผู้ใช้เลย
    • ไม่มีฟีเจอร์ใหม่ถูกเพิ่มเข้ามา ดูเหมือนแค่รีไรต์เพื่อฝึกฝนเท่านั้น
  • มีการยกตัวอย่างโค้ด kc3

  • C เป็นภาษาแรกของฉัน และฉันเคยทำทั้งแอปคอนโซลง่าย ๆ กับเกมเล็ก ๆ

    • แต่ไม่อยากกลับไปใช้แล้ว เครื่องมือ build และการจัดการ dependencies มันล้าสมัย
    • Zig คือ C ตัวใหม่ของฉัน มันมาพร้อม C compiler และสามารถใช้ C headers ได้โดยไม่ต้องมี wrapper
    • Go ใช้เวลาที่ต้องการภาษาง่าย ๆ ส่วน Rust ใช้เมื่อจำเป็นต้องได้ทั้งประสิทธิภาพและความปลอดภัย
  • บางทีก็เขียนโค้ด C เป็นงานอดิเรก แต่มีงานซ้ำ ๆ เยอะเกินจนเริ่มน่าเบื่อ

    • การเขียนคอมไพเลอร์ด้วย C ก็เหมือนการรับมือกับ tagged unions
    • เคยคิดจะเขียนตัว generator เพื่อลดงานซ้ำ ๆ แต่ก็ยังไม่ได้ทำ
    • ตอนทำโปรเจกต์ด้วย C ก็เคยคิดจะใช้ภาษา embedded สำหรับการทำต้นแบบ
  • C ประสบความสำเร็จเพราะมันใช้งานได้จริง

    • มันไม่ปลอดภัย แต่ก็ทำสิ่งที่คุณต้องการได้
  • ฉันไม่เข้าใจอะไรเลย

    • สงสัยว่า killer app คืออะไร ปัญหาที่เกี่ยวกับ CL คืออะไร และ C เป็นตัวเลือกเดียวจริงหรือไม่
    • สงสัยว่ามั่นใจได้อย่างไรว่าไม่มีปัญหาด้านความปลอดภัยในการรันโค้ด KC3
  • บทความนี้ให้อารมณ์เหมือนนิทานเตือนใจที่ไม่มีตอนจบแบบมีความสุข