19 คะแนน โดย GN⁺ 2026-01-04 | 4 ความคิดเห็น | แชร์ทาง WhatsApp
  • ภาษาแบบวิวัฒนาการที่สืบทอดไวยากรณ์และความหมายของภาษา C พร้อมเสริมความปลอดภัยและความสะดวกในการใช้งาน โดยยังคงสภาพแวดล้อมที่คุ้นเคยสำหรับนักพัฒนา C เดิม
  • รองรับ ความเข้ากันได้กับ C ABI อย่างสมบูรณ์ ทำให้ผสานเข้ากับโปรเจ็กต์ C/C++ ได้ทันที และมีกรณีที่โค้ดบางส่วนของ vkQuake ถูกแปลงเป็น C3 แล้วบิลด์ด้วยคอมไพเลอร์ c3c
  • ช่วยยกระดับโครงสร้างและความสามารถในการเขียนโค้ดด้วย ระบบโมดูล, operator overloading, compile-time macro เป็นต้น
  • มีความสามารถสมัยใหม่ เช่น การเขียนโปรแกรมแบบอิงสัญญา (Gradual Contracts), การจัดการข้อผิดพลาดแบบไม่มีโอเวอร์เฮด, reflection ทั้งที่รันไทม์และคอมไพล์ไทม์
  • ในโหมดดีบักจะมี การตรวจสอบความปลอดภัยและ stack trace แบบละเอียด ให้อัตโนมัติ จึงเหมาะต่อการตรวจหาบั๊กและเพิ่มเสถียรภาพ

ภาพรวมของ C3

  • C3 เป็นภาษาโปรแกรมที่พัฒนาต่อยอดโดยอิงจาก ไวยากรณ์ (syntax) และ ความหมาย (semantics) ของภาษา C
    • เป้าหมายคือทำให้ภาษาพัฒนาขึ้นโดยยังคงรูปแบบที่โปรแกรมเมอร์ C เดิมคุ้นเคย
  • รองรับ operator overloading ที่แม่นยำและตรงวัตถุประสงค์
    • สามารถแสดง การคำนวณเวกเตอร์ เมทริกซ์ และเลขทศนิยมคงที่ ได้อย่างเป็นธรรมชาติ โดยไม่ต้องมีโครงสร้าง overloading ที่ซับซ้อนแบบ C++
  • รองรับ การเขียนโปรแกรมแบบอิงสัญญา ทำให้ระบุข้อกำหนดได้ทั้งในรันไทม์และคอมไพล์ไทม์
    • ช่วยเสริมความเสถียรของโค้ดและความสอดคล้องของสเปก
  • ผสานข้อดีของ การจัดการข้อผิดพลาดแบบอิง Result และ exception
    • มอบโครงสร้างจัดการข้อผิดพลาดที่ผสานกับโค้ด C ได้อย่างเป็นธรรมชาติ
  • รองรับ การตรวจสอบข้อมูลชนิด (type introspection) ทั้งในคอมไพล์ไทม์และรันไทม์
  • อินไลน์แอสเซมบลี: สามารถ เขียน assembly ได้เหมือนโค้ดปกติ โดยไม่ต้องใช้สตริงหรือข้อกำหนดที่ซับซ้อน
  • ใน โหมดดีบัก จะมีการแทรก การตรวจสอบขอบเขต (bound checks) และ การตรวจสอบค่า (value checks) ในรันไทม์ให้อัตโนมัติ
  • ไลบรารีมาตรฐานของ C3 มี stack trace แบบละเอียดในดีบักบิลด์ มาให้เป็นค่าเริ่มต้น
    • ช่วยให้ระบุตำแหน่งข้อผิดพลาดได้อย่างชัดเจน แทนข้อความ “segmentation fault” แบบกว้าง ๆ

ความสะดวกในการใช้งานและความปลอดภัย

  • ใช้ Optionals เพื่อมอบ ความปลอดภัยในการจัดการ error และ null
  • ไวยากรณ์ defer ช่วย ทำให้การจัดการคืนทรัพยากรเป็นอัตโนมัติ
  • ใช้ slices และ foreach เพื่อ วนซ้ำอย่างปลอดภัย
  • ใช้ contracts แบบอิงคอมเมนต์เพื่อ ระบุเงื่อนไขข้อจำกัดของโค้ด
  • รองรับ การคืนหน่วยความจำอัตโนมัติ ในคอนเท็กซ์ @pool

Performance by default

  • สามารถเขียน SIMD vector ได้โดยตรงเพื่อ ควบคุมระดับฮาร์ดแวร์
  • รองรับการเลือก memory allocator หลายแบบเพื่อ ปรับจูนประสิทธิภาพอย่างละเอียด
  • ใช้การออกแบบ การจัดการข้อผิดพลาดแบบไม่มีโอเวอร์เฮด
  • ใช้ประโยชน์จากเวลาคอมไพล์ที่รวดเร็วและ การปรับแต่งด้วย LLVM backend
  • มี inline assembly ที่ใช้งานง่าย

ไลบรารีมาตรฐานที่มีมาให้พร้อมใช้

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

ใช้ประโยชน์จากไลบรารี C หรือ C++ ที่มีอยู่เดิม

  • C3 เข้ากันได้กับ C ABI อย่างสมบูรณ์ จึงไม่ต้องมี “ชนิดข้อมูลที่เข้ากันได้กับ C” หรือการประกาศฟังก์ชันแยกต่างหาก
  • สามารถลิงก์โค้ด C จาก C3 ได้ และลิงก์โค้ด C3 จาก C ก็ได้

โมดูลนั้นเรียบง่าย

  • ระบบโมดูล ที่เรียบง่ายและเข้าใจได้ทันที
    • ค่าตั้งต้นถูกออกแบบไว้อย่างสมเหตุสมผลและไม่รบกวนการทำงานของนักพัฒนา
  • มี การจัดการ namespace ผ่านโมดูล
  • ใช้การควบคุมแบบชัดเจนเพื่อ ทำให้โครงสร้างการห่อหุ้มเรียบง่ายขึ้น
  • สามารถกำหนด พฤติกรรมที่ใช้ร่วมกัน ผ่าน interface
  • มีความสามารถ generic modules ที่ช่วยให้สร้าง generic type ได้อย่างเรียบง่ายและชัดเจน
  • รองรับ การนำโครงสร้างกลับมาใช้ซ้ำ ผ่าน struct subtyping

Macros without a PhD

  • สามารถเขียน compile-time macro ในรูปแบบคล้ายฟังก์ชันทั่วไปได้
  • รองรับ macro ที่รับรู้ชนิดข้อมูล ซึ่งเข้าใจข้อมูลชนิดของโค้ด
  • รองรับการสร้างโค้ดที่ชัดเจนและทรงพลังยิ่งกว่า C preprocessor

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

 
kayws426 2026-01-06

มีออกมาหลากหลายดีนะครับ LONG LIVE C-LANG !!!
แต่ถ้าต่อไปมี c4 ออกมาล่ะก็ จะได้รับความนิยมแบบระเบิดระเบ้อเลยไหมนะ...

 
bus710 2026-01-05

เพราะ Zig มีการเปลี่ยนแปลงแบบ breaking changes ทุกปี แม้จะชอบตัวภาษา แต่ตอนนี้ก็ไม่ค่อยอยากหยิบมาใช้แล้วครับ
ในทางกลับกัน พอดูคำแนะนำของ c3 แล้ว โดยรวมให้ความรู้สึกแบบ c + go เลยทั้งอ่านและเขียนง่าย และรู้สึกว่าน่าจะเครียดกับการออกรุ่นใหม่น้อยกว่ามากนะครับ

 
mhcoma 2026-01-05

ผมก็ช่วยสนับสนุนอยู่บ้าง... ช่วงนี้กำลังใช้อยู่แล้วรู้สึกว่าสนุกดี
ชอบตรงที่มันให้ความรู้สึกเหมือนตั้งใจแก้แค่จุดที่ใช้ C แล้วไม่สะดวก
เอกสารทางการยังดูไม่ค่อยสุกงอมเท่าไร
(ถ้าจะหาฟีเจอร์ต่าง ๆ บางทีก็ไปอธิบายไว้ในที่แปลก ๆ แบบไม่มีปี่มีขลุ่ยบ่อยมาก...)

 
GN⁺ 2026-01-04
ความเห็นจาก Hacker News
  • ฉันชอบ แนวทางที่ยับยั้งชั่งใจในปรัชญาการออกแบบ ของ C3
    มันไม่ได้บังคับให้ใช้ memory model แบบใหม่ และก็ไม่ได้พยายามจะเป็นเหมือน C++
    โดยเฉพาะ ความเข้ากันได้กับ ABI แบบสมบูรณ์ ทำให้สามารถเอาไฟล์ C3 ไปผสมใช้ในระบบบิลด์ C เดิมได้ทันทีโดยไม่ต้องเขียน binding
    ขอชื่นชมวิสัยทัศน์ของผู้ดูแลที่มุ่งเน้นวิวัฒนาการมากกว่าการปฏิวัติ
    น่าแนะนำเป็นภาษาที่ลองเรียนในช่วงสุดสัปดาห์ ดูทันสมัยกว่า C99 แต่ก็ยังให้ความรู้สึกคุ้นเคย
    • สงสัยว่าสามารถเขียนไลบรารีด้วย C3 แล้ว export symbol ไปใช้จาก binding ได้หรือไม่
      เหตุผลที่ฉันยังเลิก C ไม่ได้เสียทีคือ cstring กับ pointer ที่ไม่ถูก free
    • ฉันสงสัยว่า ABI compatibility แบบสมบูรณ์นั้นสำคัญจริงหรือไม่
      ตัว C เองไม่ได้เป็นภาษาที่อันตรายเท่ากับที่ implementation และ ABI ต่างหากที่อันตราย
      ถ้าใช้ fat pointer, ปรับปรุง varargs, UBSan, MTE ฯลฯ ก็ถือว่าโอเคมากแล้ว
  • ระหว่างอ่าน ส่วน Contracts ในเอกสารทางการของ C3 ก็เกิดคำถามขึ้นมา
    ถ้าคอมไพเลอร์ไม่จำเป็นต้องตรวจสอบ contract เสมอไป และเมื่อมีการละเมิดแล้วอาจกลายเป็น พฤติกรรมที่ไม่กำหนดไว้ ก็ไม่แน่ใจว่าจะเชื่อใจและใช้งานสิ่งนี้อย่างไรดี
    เป็นฟีเจอร์ที่เท่มาก แต่ก็ดูเสี่ยงอยู่พอสมควร
    • contract คือ invariant ที่ใช้แสดง “เงื่อนไขที่ต้องเป็นจริงเสมอ”
      จะเพิกเฉยต่อมัน ตรวจสอบตอนรันไทม์ หรือถือว่ามันเป็นจริงเสมอแล้วนำไปใช้ในการ optimize ก็ได้
      ตัวอย่างเช่น เลือกตรวจสอบความถูกต้องของ pointer แต่ถือว่าเงื่อนไขเรื่องอินพุตเป็นเลขคี่เป็นข้อสมมติได้
    • contract เป็นเครื่องมือที่ช่วยให้แสดงเจตนา ในรูปแบบที่เป็นมาตรฐาน
      ทีมขนาดใหญ่สามารถบังคับใช้ได้ และเครื่องมืออย่าง Visual Studio อาจแค่แสดงคำเตือน ทำให้ค่อย ๆ เรียนรู้และนำไปใช้ได้
    • สามประโยคในเอกสารนั้นหมายถึง
      1. คอมไพเลอร์ไม่จำเป็นต้องใช้ contract เสมอไป
      2. หากมีการละเมิด อาจกลายเป็นพฤติกรรมที่ไม่กำหนดไว้
      3. ใน safe mode จะตรวจสอบด้วย runtime assert
        กล่าวคือ เปิดไว้ตอนพัฒนา แล้วปิดตอน deploy เพื่อไม่ให้กระทบประสิทธิภาพได้
    • สุดท้ายแล้วนี่คือการแสดงสิ่งที่คอมไพเลอร์ทำอยู่แล้วอย่าง การ optimize บนพื้นฐานของข้อสมมติ ให้ชัดเจนในโค้ด
    • ฉันมองว่า contract คือ ข้อจำกัดแบบผ่อนปรน ที่ใช้แสดง “เงื่อนไขที่แทบไม่มีทางเกิดขึ้น”
      เงื่อนไขที่ต้องตรวจจริง ๆ ควรจัดการด้วยโค้ดภายในฟังก์ชันโดยตรง
  • มีรายละเอียดเพิ่มเติมอยู่ใน รีโพซิทอรี GitHub ของ C3
    จุดที่ต่างจาก C ได้แก่ ไม่มี header file, namespace แบบโมดูล, slice, operator overloading, generic module, การจัดการข้อผิดพลาดแบบ Result, และการตรวจสอบตอนรันไทม์ใน safe mode
    • ฟีเจอร์ต่าง ๆ ดูดี แต่โดยรวมให้ความรู้สึกว่า องค์ประกอบยังไม่สมดุล อยู่บ้าง
      ส่วนตัวฉันเสียดายที่ไม่มี function overloading, default parameter และ tuple return
  • การที่ C3 เรียก Result หรือ Expected ว่า Optional ทำให้สับสน
    เพราะมันควรหมายถึง “T หรือ E” ไม่ใช่ “T หรือว่างเปล่า” ชื่อนี้ดูเหมือนจะไม่ถูกนัก
    ลิงก์เอกสารที่เกี่ยวข้อง
    • Optional ของ C3 ไม่เหมือน Option<T> หรือ Result<T, E>
      เพราะ ชนิดของ error ถูกจำกัดให้เป็นเพียงโค้ดจำนวนเต็มตัวเดียว ซึ่งเข้ากับแนวคิด “วิวัฒนาการ ไม่ใช่การปฏิวัติ” ได้ดี
      ไวยากรณ์ type? ก็ดูเข้าใจง่าย
    • ในโค้ดเองก็ไม่ได้เขียนคำว่า “Optional” โดยตรง
      เป็นการออกแบบที่ยังรักษาความหมายแบบ C เอาไว้ พร้อมลดภาระของ out param
    • ฉันไม่ค่อยชอบการเปลี่ยนชื่อแนวคิดแบบตามใจ แต่ถ้าจะรองรับแค่อย่างใดอย่างหนึ่ง Optional ก็เป็นชื่อที่ชัดเจนกว่า
      เพราะ Result เองก็มีความหมายทั่วไปว่าเป็นค่าที่ส่งกลับอยู่แล้ว จึงอาจชวนสับสนได้
    • ถึงอย่างนั้น “Option” หรือ “Maybe” ก็มีความหมายอีกแบบหนึ่งอยู่ดี ดังนั้นฉันคิดว่า “Result” หรือ “Either” น่าจะเหมาะกว่า
  • มีวิดีโอที่ Tsoding ไลฟ์สตรีม C3 ต่อเนื่องยาวกว่า 30 ชั่วโมง
    เพลย์ลิสต์ YouTube
  • ฉันเคยมีปฏิสัมพันธ์กับนักพัฒนาของ C3, Odin และ Zig
    สิ่งที่น่าประทับใจคือทั้งสามภาษาไม่ได้มองกันเป็นคู่แข่ง แต่เป็นความสัมพันธ์แบบ แลกเปลี่ยนและเรียนรู้จาก trade-off ของกันและกัน
    • สงสัยว่าในสภาพแวดล้อมแบบ embedded ภาษาตัวไหนสมเหตุสมผลที่สุด
    • แม้จะบอกว่า “ไม่ใช่การแข่งขันแต่คือการเรียนรู้” แต่ก็อดคิดไม่ได้ว่าสุดท้ายแล้วมันคือ การแข่งขันที่พูดให้สุภาพขึ้น หรือเปล่า
  • พอลองไล่อ่านเอกสารก็ได้คำตอบของข้อสงสัยอยู่สองข้อ
    1. มัน อิงกับ LLVM จึงพกพาได้สูง
    2. ไม่รองรับ tagged enum
      แต่มีการเพิ่มฟีเจอร์อย่าง macro และ reflection เข้ามาแทน
    • ฉันคิดว่า tagged union นั้น ไม่มีประสิทธิภาพ สำหรับภาษา system programming
      เพราะมันกินหน่วยความจำเท่ากับชนิดที่ใหญ่ที่สุด และย้าย flow ไปสู่การตรวจสอบชนิดตอนรันไทม์ ทำให้สูญเสียข้อดีของภาษาที่มี static type
      ถ้าจำเป็นจริง ๆ ฉันมองว่าควรเขียนขึ้นมาใช้เองจะดีกว่า
  • ฉันมักคิดว่าการสร้างภาษาใหม่ขึ้นมาจะคุ้มค่าเมื่อไรกันแน่
    ฉันเคยลงมือทำ generic, slice และ error propagation บน C เอง แต่ การสร้างคอมไพเลอร์นั้นซับซ้อนเกินไป
    เพราะอย่างนั้นฉันเลยใช้ทั้ง C ที่ดัดแปลงเองและ Go ควบคู่กันไป
    • ด้วย LLVM การสร้างภาษาตระกูล “C ที่ดีกว่า” นั้นง่ายกว่าที่คิด
      อุปสรรคในการเริ่มต้นต่ำมากจนถึงขั้น ทำ prototype ได้ภายในวันเดียว
    • การสร้างภาษานั้นคุ้มค่าเสมอ
      เพราะมันคือ วิธีเดียวที่จะทำให้พาราไดม์ใหม่กลายเป็นความจริง
      ภาษาต้องประสานทั้งไวยากรณ์ standard library tooling และ runtime เข้าด้วยกันจึงเป็นงานยาก แต่ก็ส่งผลต่ออนาคตได้มากเท่านั้น
    • เดิมที C3 เป็นโปรเจกต์ที่ Christoffer ซึ่งเคยร่วมพัฒนา C2 เริ่มทำแยกออกมาเอง เพราะ รู้สึกอึดอัดกับความเร็วในการพัฒนา
      และด้วย LLVM เขาจึงสามารถสร้างคอมไพเลอร์ใหม่ขึ้นมาได้
    • คุณค่าของภาษาคือการสร้าง ความเข้าใจร่วมกันกับผู้อื่น
      C ที่ดัดแปลงเองเพื่อใช้คนเดียวก็ไม่เป็นไร แต่ถ้าจะทำงานร่วมกับคนอื่นหรือใช้ไลบรารีภายนอก ก็จำเป็นต้องมีภาษากลางร่วมกัน
  • ตอนแรกฉันคิดว่ามันจะเป็นภาษาที่เรียบง่าย แต่กลับแปลกใจที่มี รายการฟีเจอร์ที่อัดแน่น อย่างคาดไม่ถึง
    และการเรียกข้อยกเว้นว่า “Excuses” ก็ดูน่ารักและมีไหวพริบดี
  • ฉันคิดว่าเว็บไซต์แบบนี้แหละคือต้นแบบของเว็บไซต์สำหรับภาษาโปรแกรมมิง
    • ในทางกลับกัน ฉันรู้สึกว่าดีไซน์มัน ดูเด็ก ๆ และสมัครเล่น ไปหน่อย
      โดยเฉพาะการมีลิงก์ Discord อยู่ใน navigation ยิ่งทำให้ความรู้สึกนั้นชัดขึ้น