เครื่องมือ Rust ใหม่ "Run" จุดประกายการถกเถียงเรื่อง Polyglot Programming และการจำแนกภาษาโปรแกรม

ทีมชุมชน BigGo
เครื่องมือ Rust ใหม่ "Run" จุดประกายการถกเถียงเรื่อง Polyglot Programming และการจำแนกภาษาโปรแกรม

เครื่องมือ command-line ใหม่ที่ชื่อว่า run ได้เกิดขึ้นจากชุมชนนักพัฒนา โดยสัญญาว่าจะรวมประสบการณ์การทำงานกับภาษาโปรแกรมมากกว่า 25 ภาษาผ่านอินเทอร์เฟซเดียว สร้างด้วย Rust โดยนักพัฒนา Esubaalew เครื่องมือนี้มีเป้าหมายเพื่อขจัดความจำเป็นในการใช้ REPL แยกต่างหากและให้การรันโค้ดที่สม่ำเสมอในภาษาโปรแกรมต่างๆ

โปรเจกต์นี้ได้สร้างการอภิปรายอย่างมากในหมู่นักพัฒนา โดยเฉพาะเรื่องข้อเสนอหลักและการนำไปใช้ทางเทคนิค Run ช่วยให้นักพัฒนาสามารถรันโค้ด compile โปรแกรม และเข้าถึง REPL แบบ interactive สำหรับภาษาต่างๆ ตั้งแต่ Python และ JavaScript ไปจนถึง Rust และ Go ทั้งหมดผ่าน command-line interface เดียว

ภาษาที่รองรับจำแนกตามหมวดหมู่

หมวดหมู่ ภาษาและชื่อย่อ ความต้องการของ Toolchain
Scripting และ shells Bash, Python (py, python), Ruby (rb, ruby), PHP, Perl, Lua, R, Elixir (ex, elixir) ต้องมี interpreter ที่ตรงกันใน PATH
Web และ typed scripting JavaScript (js, node), TypeScript (ts, deno), Dart, Swift, Kotlin (kt, kotlin) node, deno, dart, swift, kotlinc + JRE
Systems และ compiled C, C++ (cpp, cxx), Rust (rs, rust), Go, Zig, Nim, Haskell (hs, haskell), Crystal (cr, crystal), C (cs, csharp), Java, Julia (jl, julia) compiler/toolchain ที่เกี่ยวข้อง

ชุมชนตั้งคำถามถึงความจำเป็นของ Abstraction Layer อีกชั้นหนึ่ง

ชุมชนนักพัฒนาได้ตั้งคำถามสำคัญว่าเครื่องมือนี้แก้ปัญหาจริงหรือเพียงแค่เพิ่มความซับซ้อนอีกชั้นหนึ่ง นักพัฒนาบางคนชี้ให้เห็นว่าโซลูชันที่มีอยู่แล้วอย่าง shebang lines และ /usr/bin/env ให้ความสามารถในการตรวจจับภาษาและการรันโค้ดที่ทำงานได้อย่างเชื่อถือได้มาหลายสิบปีแล้ว

การอภิปรายนี้เผยให้เห็นความตึงเครียดพื้นฐานระหว่างนวัตกรรมและแนวปฏิบัติที่ยึดถือมาแต่เดิม ในขณะที่บางคนเห็นคุณค่าในการมีอินเทอร์เฟซเดียวสำหรับหลายภาษา คนอื่นๆ ตั้งคำถามว่าการประหยัดเวลาคุ้มค่ากับการเรียนรู้เครื่องมือใหม่อีกตัวหนึ่งหรือไม่ เมื่อโซลูชันที่มีอยู่ทำงานได้อย่างมีประสิทธิภาพ

ความขัดแย้งเรื่องการจำแนกภาษาเกิดขึ้น

ส่วนสำคัญของการอภิปรายในชุมชนได้มุ่งเน้นไปที่วิธีการจัดหมวดหมู่ภาษาโปรแกรมต่างๆ ของเครื่องมือนี้ Swift เป็นตัวอย่างหนึ่งที่ถูกจัดอยู่ในหมวด Web & typed scripting แม้ว่าจะเป็นภาษา compiled ที่ใช้ LLVM เป็น backend คล้ายกับ Rust และ C++ การจำแนกผิดนี้ได้จุดประกายการสนทนาที่กว้างขึ้นเกี่ยวกับวิธีที่เรานิยามและจัดหมวดหมู่ภาษาโปรแกรม

การถกเถียงขยายไปเกินกว่าข้อผิดพลาดในการจัดหมวดหมู่ไปสู่คำถามพื้นฐานเกี่ยวกับคุณสมบัติของภาษา Kotlin เป็นอีกกรณีหนึ่งที่น่าสนใจ เนื่องจากสามารถ compile เป็น native code สำหรับการพัฒนา Android และ JavaScript สำหรับเว็บแอปพลิเคชัน ทำให้การจำแนกหมวดหมู่ขึ้นอยู่กับบริบท

ข้อกังวลเรื่องการนำไปใช้ทางเทคนิคและความสามารถในการขยาย

จากมุมมองทางเทคนิค เครื่องมือนี้ทำงานโดยการเรียกใช้ toolchain ของภาษาที่มีอยู่แล้วแทนที่จะสร้าง interpreter ของตัวเอง engine ของแต่ละภาษาจะ implement trait เล็กๆ ที่จัดการการตรวจจับ toolchain การเตรียม workspace การรันโค้ด และการจัดการสถานะ REPL วิธีการนี้ทำให้ core มีน้ำหนักเบาในขณะที่ยังคงความเข้ากันได้กับสภาพแวดล้อมการพัฒนาที่มีอยู่

นักพัฒนาได้แสดงความสนใจในความสามารถในการขยายของระบบ โดยการอภิปรายเผยให้เห็นว่าการเพิ่มภาษาใหม่ต้องการการ implement LanguageEngine trait และเพิ่มภาษาลงในการกำหนดค่าหลัก กระบวนการที่ค่อนข้างตรงไปตรงมานี้ได้รับการยกย่องว่าเข้าถึงได้ง่าย แม้แต่สำหรับนักพัฒนาที่เพิ่งเริ่มต้นกับ Rust

คำสั่ง REPL ที่ใช้ได้

คำสั่ง วัตถุประสงค์
:help แสดงรายการคำสั่ง meta ที่ใช้ได้
:languages แสดง engine ที่ตรวจพบและสถานะ
:lang <id> เปลี่ยนภาษาที่ใช้งาน (py, go, ฯลฯ)
:detect on/off/toggle ควบคุมการตรวจจับภาษาของโค้ดอัตโนมัติ
:load path/to/file รันไฟล์ใน session ปัจจุบัน
:reset ล้างสถานะ session ที่สะสมไว้
:exit / :quit ออกจาก REPL

วิสัยทัศน์อนาคตและการรวม Cross-Language

บางทีแง่มุมที่น่าสนใจที่สุดของโปรเจกต์นี้คือศักยภาพในการแบ่งปันตัวแปรและการรวมระหว่างภาษาต่างๆ นักพัฒนาได้ระบุแผนที่จะเปิดใช้งานการแบ่งปันตัวแปรระหว่างภาษาต่างๆ ภายใน session เดียวกัน ซึ่งอาจเปิดโอกาสที่น่าสนใจสำหรับ workflow การเขียนโปรแกรมแบบ polyglot

ฟีเจอร์นี้หากสามารถ implement ได้สำเร็จ อาจทำให้เครื่องมือนี้แตกต่างจากโซลูชันที่มีอยู่และให้คุณค่าที่แท้จริงสำหรับนักพัฒนาที่ทำงานข้าม ecosystem ของหลายภาษา อย่างไรก็ตาม ความท้าทายทางเทคนิคในการรักษา type safety และความสม่ำเสมอของข้อมูลข้าม runtime environment ต่างๆ ยังคงเป็นอุปสรรคสำคัญ

โปรเจกต์นี้เป็นการทดลองที่น่าสนใจในด้านเครื่องมือสำหรับนักพัฒนา แม้ว่าประโยชน์ใช้สอยสูงสุดจะยังต้องได้รับการพิสูจน์ ว่าจะได้รับการยอมรับในชุมชนนักพัฒนาที่กว้างขึ้นหรือไม่ น่าจะขึ้นอยู่กับว่าสามารถแก้ไขจุดเจ็บปวดของ workflow จริงได้ดีเพียงใด เมื่อเทียบกับการเพิ่มความซับซ้อนที่ไม่จำเป็นให้กับแนวปฏิบัติที่ยึดถือมาแต่เดิม

อ้างอิง: run