นักพัฒนาสร้างโปรเจค " Based C++ " ที่ทำให้ C++ ดูเหมือนภาษา Interpreted

ทีมชุมชน BigGo
นักพัฒนาสร้างโปรเจค " Based C++ " ที่ทำให้ C++ ดูเหมือนภาษา Interpreted

นักพัฒนาที่มีความคิดสร้างสรรค์ได้เปิดตัว 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&lt;{
    str::puts(str::literal("Hello, world!\n"))
}&gt;;

คำสั่งในการคอมไพล์:

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