นักพัฒนาที่มีความคิดสร้างสรรค์ได้เปิดตัว Based C++ ซึ่งเป็นโปรเจคที่แปลกใหม่ที่เปลี่ยนภาษา C++ ที่เป็น compiled language แบบดั้งเดิมให้ดูเหมือนเป็น interpreted language ทำให้โปรเจคนี้กลายเป็นที่พูดถึงในหมู่นักพัฒนาเกี่ยวกับขอบเขตระหว่างภาษา compiled และ interpreted
วิธีการทำงานที่น่าทึ่ง
โปรเจคนี้ใช้เทคนิคที่ชาญฉลาดโดยใช้ฟีเจอร์ compile-time ของ C++ แทนที่จะรันโค้ดตอน runtime โปรแกรมทั้งหมดจะทำงานระหว่างการ compilation โดยใช้ constexpr evaluation และ template metaprogramming นักพัฒนาได้สร้างเครื่องมือ wrapper แบบกำหนดเองที่แทนที่คอมโพเนนต์ภายในของ GCC (cc1plus และ ld) ด้วย Python scripts ที่สกัดและรันผลลัพธ์ของโปรแกรมโดยตรงจากกระบวนการ compilation
ไวยากรณ์ดูแตกต่างจาก C++ มาตรฐานมาก โดยใช้ expression templates และโครงสร้างพิเศษเช่น main<{ ... }>
เพื่อกำหนดโปรแกรมที่รันทั้งหมดใน compile time สมาชิกในชุมชนสังเกตว่าแนวทางนี้ผลักดันขีดความสามารถ compile-time ของ C++ ไปถึงขีดจำกัด
Template metaprogramming: เทคนิคที่ใช้ templates ของ C++ เพื่อทำการคำนวณระหว่างการ compilation แทนที่จะเป็นตอน runtime
Expression templates: เทคนิคการเขียนโปรแกรมที่สร้าง expressions ที่ซับซ้อนเป็นโครงสร้าง template ที่สามารถประเมินผลได้อย่างมีประสิทธิภาพ
ตัวอย่างโปรแกรม "Based C++" Hello World:
include "gil/std.hpp"
using namespace gil::std;
volatile auto run = main<{
str::puts(str::literal("Hello, world!\n"))
}>;
คำสั่งในการคอมไพล์:
g++ -std=c++23 -Based hello_world.cpp -o -
การตอบสนองของชุมชนและข้อมูลเชิงเทคนิค
ชุมชนนักพัฒนามีปฏิกิริยาที่หลากหลายต่อโปรเจคนี้ นักพัฒนาบางคนชื่นชมความคิดสร้างสรรค์ทางเทคนิค ในขณะที่คนอื่นๆ มองว่าเป็นการทดลองที่น่าสนุกมากกว่าเครื่องมือที่ใช้งานได้จริง สมาชิกในชุมชนหลายคนชี้ให้เห็นว่า C++ interpreters แบบดั้งเดิมและเครื่องมือ REPL (Read-Eval-Print Loop) เช่น Clang-REPL และ Cling มีอยู่แล้วสำหรับผู้ที่ต้องการพัฒนา C++ แบบ interactive
ทั้งหมดนี้เป็นเรื่องตลก แต่นำเสนอในลักษณะที่จริงจัง แนวคิดคือถ้าคุณรู้ input ของโปรแกรมตอน compile time คุณสามารถเปลี่ยนทุกอย่างเป็น constexpr ที่ได้รับการประเมินผลตอน compile time ดังนั้นโปรแกรมของคุณจะถูกรันโดย compiler แทนที่จะเป็นตอน run time
การอภิปรายทางเทคนิคเผยให้เห็นว่าโปรเจคนี้ใช้งาน domain-specific language (DSL) ที่สมบูรณ์ซึ่งรันระหว่างการ compilation แนวทางนี้แสดงให้เห็นว่าฟีเจอร์ compile-time ของ C++ ได้พัฒนาไปไกลแค่ไหน แม้ว่าจะเน้นย้ำถึงความซับซ้อนที่มาพร้อมกับการใช้ template ขั้นสูงเช่นนี้
เครื่องมือตีความ C++ ทางเลือก:
- Clang-REPL: REPL สำหรับ C++ อย่างเป็นทางการที่ใช้ LLVM และการคอมไพล์ JIT
- Cling: ตัวตีความ C++ แบบโต้ตอบจากโครงการ ROOT ของ CERN
- Xeus Cling: อินเทอร์เฟซ Jupyter notebook สำหรับ C++ แบบโต้ตอบ
- AngelScript: ภาษาสคริปต์เชิงปฏิบัติที่มีไวยากรณ์คล้าย C++
- Squirrel: ภาษาสคริปต์น้ำหนักเบาที่คล้ายกับ C++/Lua
ผลกระทบที่กว้างขึ้นสำหรับการพัฒนา C++
โปรเจคนี้ทำให้เกิดคำถามที่น่าสนใจเกี่ยวกับขอบเขตแบบดั้งเดิมระหว่างภาษา compiled และ interpreted แม้ว่า C++ จะถูกมองว่าเป็น compiled language มาโดยตลอด แต่โปรเจคเช่น Based C++ แสดงให้เห็นว่าความแตกต่างนั้นไม่ชัดเจนเสมอไป การอภิปรายยังได้กล่าวถึงเครื่องมือที่มีอยู่สำหรับ hot-reloading โค้ด C++ ใน game engines และสภาพแวดล้อมการพัฒนา
นักพัฒนาบางคนแนะนำว่าสำหรับความต้องการ interpreted C++ ในทางปฏิบัติ โซลูชันที่มีอยู่แล้วเช่น AngelScript หรือ Squirrel อาจเหมาะสมกว่า เครื่องมือเหล่านี้มี interoperability ที่ดีกว่าและถูกออกแบบมาโดยเฉพาะสำหรับการฝัง scripted C++-like code ในแอปพลิเคชัน
โปรเจค Based C++ ในท้ายที่สุดทำหน้าที่เป็นทั้งการสาธิตทางเทคนิคและการสำรวจที่สนุกสนานของสิ่งที่เป็นไปได้ด้วยฟีเจอร์ C++ สมัยใหม่ แม้ว่าอาจไม่ได้แทนที่ workflow การพัฒนาแบบดั้งเดิม แต่ก็แสดงให้เห็นถึงศักยภาพในการสร้างสรรค์ภายในระบบ template ขั้นสูงของภาษานี้
อ้างอิง: based-cpp