Moonbit: ภาษา WebAssembly ที่เร็ว กระชับ และเป็นมิตรกับผู้ใช้
(moonbitlang.com)- ขณะที่ WebAssembly มีความสำคัญมากขึ้นในคลาวด์และเอดจ์คอมพิวติ้ง Moonbit ตั้งเป้าเป็น ภาษาแบบ Wasm-first ที่ทำให้ใช้ประโยชน์จากประสิทธิภาพ ความปลอดภัย และขนาดเล็กของ Wasm ได้ง่ายขึ้น
- Moonbit มุ่งแก้ข้อจำกัดที่ Rust และ C/C++ มีภาระด้านความยากในการเรียนรู้และเวลา compile ที่ยาวนาน ขณะที่ Go มีข้อจำกัดเรื่องโค้ดที่สร้างออกมามีขนาดใหญ่และไม่มีประสิทธิภาพ
- จุดเน้นของการออกแบบคือการ build และรันได้รวดเร็ว ได้ผลลัพธ์ Wasm ขนาดเล็ก และใช้งานง่าย โดยรวมถึง การเพิ่มประสิทธิภาพด้วย intermediate representation หลายระดับ การวิเคราะห์เชิงความหมายแบบขนานระดับฟังก์ชัน และการวิเคราะห์ซ้ำแบบ incremental
- ในตัวอย่าง Fibonacci มีการเน้นเรื่องการอนุมานชนิดของฟังก์ชันภายใน ผลลัพธ์ Wasm ที่เล็กที่สุด เร็วกว่า Go และมีประสิทธิภาพใกล้เคียง Rust รวมถึงรองรับ recursive closure และ exhaustive pattern match
- ปัจจุบันมีทั้ง IDE ออนไลน์ เครื่องมือ CLI เอกสาร และส่วนขยาย VSCode พร้อมตั้งเป้าสู่ beta status ภายในปลายไตรมาส 2 ปี 2024 และจะเปิดซอร์สโค้ดหลังจากมีคุณภาพถึงระดับเบต้า
เป้าหมายของภาษาที่ให้ WebAssembly มาก่อน
- WebAssembly เป็นสถาปัตยกรรมชุดคำสั่งข้ามแพลตฟอร์ม ซึ่งมีความสำคัญมากขึ้นในคลาวด์และเอดจ์คอมพิวติ้ง เนื่องจากมีคุณสมบัติด้านประสิทธิภาพ ความปลอดภัย ขนาดเล็ก และเป็นมาตรฐานเปิด
- มองว่าตัวเลือกที่มีอยู่ยังใช้ศักยภาพของ Wasm ได้ไม่เต็มที่
- ภาษา Wasm ระดับล่างอย่าง Rust และ C/C++ เรียนรู้ยาก และเวลา compile ที่ยาวนานอาจทำให้ความเร็วในการพัฒนาช้าลง
- ภาษาระดับสูงอย่าง Go มีโค้ดที่สร้างออกมาไม่มีประสิทธิภาพและมีขนาดใหญ่ จึงใช้จุดเด่นด้านความเร็วและขนาดเล็กของ Wasm ได้ยาก
- Moonbit มุ่งเป็นภาษาแบบ Wasm-first ที่ build และรันได้รวดเร็ว สร้างผลลัพธ์ Wasm ขนาดเล็ก และเรียนรู้ได้ง่ายแบบเดียวกับ Go
การออกแบบภาษาและทีม
- Moonbit นำโดย Hongbo Zhang และทีมที่มีประสบการณ์ด้านการออกแบบและพัฒนาภาษามากกว่า 10 ปี
- Zhang เคยมีส่วนร่วมกับ OCaml, ReScript, Flow และเคยเป็น chief architect ของ compiler ความเร็วสูง มาตรฐานไลบรารี และระบบ build ใน toolchain ของ ReScript
- การออกแบบภาษาได้รับอิทธิพลทั้งจาก Go และ Rust
- รับเอาความเรียบง่ายของ Go โดยเฉพาะ ระบบแพ็กเกจ
- รับเอาความ expressive ของ Rust รวมถึง pattern matching, type inference, generics และ ad-hoc polymorphism ที่คล้าย trait
- ระบบชนิดแบบ fault tolerant ถูกออกแบบโดยคำนึงถึงความเร็ว ความสามารถในการทำงานแบบขนาน และการตรวจสอบแบบ incremental พร้อมวาง การรองรับ IDE เป็นเป้าหมายหลัก
การ build และการรันที่รวดเร็ว
- Moonbit ตั้งเป้าเป็น ภาษาที่เร็วทั้งสแตก ครอบคลุมทั้งประสิทธิภาพระหว่างพัฒนาและประสิทธิภาพขณะรัน
- ใช้ intermediate representation (IR) หลายระดับเพื่อการเพิ่มประสิทธิภาพทั้งโปรแกรม
- ปรับปรุง memory layout เพื่อลด cache miss
- ให้บริบทที่ดีขึ้นสำหรับการวิเคราะห์ data flow และ control flow
- มองว่าเข้าใจโครงสร้างโปรแกรมได้ครอบคลุมกว่าสถาปัตยกรรม link-time optimization ที่มีอยู่ส่วนใหญ่ จึงทำให้ optimize ได้มีประสิทธิภาพ
- สามารถค้นหาและตัดความซ้ำซ้อนระดับสูงที่มองไม่เห็นในระดับล่างออกได้
- เพื่อให้ได้ประสิทธิภาพการ build ที่รวดเร็วซึ่งสำคัญต่อฟีเจอร์ของ IDE จึงรองรับการวิเคราะห์เชิงความหมายแบบขนานระดับฟังก์ชัน
- ต่างจาก ReScript และ Rust ตรงที่สามารถทำ การวิเคราะห์ semantic แบบขนานระดับฟังก์ชัน ได้
- ทำการวิเคราะห์ซ้ำแบบ incremental ที่ระดับความละเอียดเดียวกัน จึงระบุว่าสามารถรองรับ monorepo ขนาดใหญ่และให้เวลาตอบสนองระดับมิลลิวินาทีได้
ผลลัพธ์ Wasm ขนาดเล็ก
- Moonbit ถูกออกแบบโดยคำนึงถึง dead code elimination ที่มีประสิทธิภาพ
- ตัดคุณสมบัติของภาษาที่รบกวนการวิเคราะห์นี้ออก และจัดโครงสร้างมาตรฐานไลบรารีให้ลบโค้ดที่ไม่ใช้ได้ง่าย
- พยายามลดขนาดโค้ดสุดท้ายอย่างมากผ่านการเพิ่มประสิทธิภาพทั้งโปรแกรม
- มองว่าการลดขนาดโค้ดนำไปสู่ความปลอดภัยที่ดีขึ้นและลดช่องโหว่ที่อาจถูกโจมตี
- ระบุว่าสามารถรับประกันการเริ่มทำงานได้รวดเร็วในสภาพแวดล้อม serverless computing
ฟีเจอร์และเครื่องมือเพื่อการใช้งานที่ง่าย
- Moonbit มีระบบจัดการหน่วยความจำอัตโนมัติ จึงแตกต่างจาก Rust
- ต่างจาก Go ตรงที่หลีกเลี่ยงองค์ประกอบเสี่ยงอย่าง pointer หรือ left value
- มีฟีเจอร์ที่ปลอดภัยสำหรับการเขียนโปรแกรมเชิงข้อมูล
- algebraic data types
- ad-hoc polymorphisms
- pattern match
- ไม่ได้มุ่งเป็นเพียงภาษา แต่ยังตั้งเป้าเป็นแพลตฟอร์ม และมีชุดเครื่องมือให้ตั้งแต่ระยะแรก
- เครื่องมือ build ความเร็วสูง
- package manager
- compiler
- IDE
- Cloud IDE แบบไม่ต้องใช้คอนเทนเนอร์ที่เข้าถึงได้จากทุกที่ผ่านเบราว์เซอร์เพียงอย่างเดียว
- Cloud IDE นี้ยังรองรับการทำงานแบบออฟไลน์ และระบุว่าแตกต่างจาก Cloud IDE ที่มีอยู่เดิม
ความแตกต่างผ่านตัวอย่าง Fibonacci
- ตัวอย่าง Fibonacci เปรียบเทียบการเขียนฟังก์ชัน
fibในสามภาษา ได้แก่ MoonBit, Go และ Rust - จาก benchmark MoonBit แสดงความแตกต่างในด้าน type inference, ขนาดโค้ด, ประสิทธิภาพ และความใช้งานง่าย
- การอนุมานชนิดแบบเฉพาะที่: MoonBit สามารถอนุมานชนิดของฟังก์ชันภายใน
auxได้ - ขนาด Wasm เล็ก: MoonBit สร้างผลลัพธ์ Wasm ที่เล็กที่สุด
- ประสิทธิภาพ: เร็วกว่า Go และใกล้เคียง Rust
- ความใช้งานง่าย: รองรับ recursive closure แบบเดียวกับ Go ซึ่งระบุว่าใน Rust ทำได้ยากมาก
- รองรับ exhaustive pattern match แบบเดียวกับ Rust และระบุว่าทรงพลังกว่า switch case ของ Go มาก
- การอนุมานชนิดแบบเฉพาะที่: MoonBit สามารถอนุมานชนิดของฟังก์ชันภายใน
สถานะปัจจุบันและโรดแมป
- Moonbit ยังเป็นสิ่งที่เปลี่ยนแปลงอย่างรวดเร็ว แต่มีช่องทางเริ่มต้นใช้งานที่พร้อมแล้วในปัจจุบัน
- ระบุว่าการพัฒนา language toolchain ในอดีตอาจใช้เวลาหลายปีจนถึง 10 ปี แต่ได้ทำให้กระบวนการพัฒนาง่ายขึ้นด้วยประสบการณ์ที่สั่งสมและทีมเฉพาะทางที่จัดตั้งตั้งแต่ต้น
- คาดว่าจะไปถึง beta status ภายในปลายไตรมาส 2 ปี 2024
- beta status หมายถึงความเสถียรในระดับหนึ่ง บั๊กจำนวนน้อย และ FFI ที่แข็งแรงสำหรับการโต้ตอบกับ Wasm host
- มีแผนจะเปิดเผยซอร์สโค้ดหลังจากคุณภาพถึงระดับเบต้า
- แผนเชิงกลยุทธ์รวมถึงการผสาน Wasm GC สำหรับ Wasm 2.0 และ GC ของตนเองสำหรับ Wasm 1.0 โดยระบุว่าจะสอดคล้องกับ Wasm proposals
ช่องทางชุมชน
- สามารถโพสต์คำถามได้ที่ forum
- สามารถเข้าร่วม Discord หรือกดติดตาม Twitter account
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมเป็นหัวหน้าโปรเจกต์นี้ ตอนนี้สามารถลองใช้ได้ทันทีใน IDE ออนไลน์ https://try.moonbitlang.com และรันได้ด้วย F5
เอกสารอยู่ที่ https://github.com/moonbitlang/moonbit-docs และคอมไพเลอร์จะเปิดเผยต่อสาธารณะเมื่อถึงสถานะเบต้า คาดว่าจะเป็นช่วงปลายไตรมาส 2 ปี 2024
ตัวอย่างเช่น อยากตรวจดูว่ามีการระบุ variance ของ type parameter แบบชัดเจน, ข้อจำกัดขอบเขตล่าง/ขอบเขตบน, higher-kinded types, ระหว่าง structural subtyping กับ nominal subtyping อะไรเป็นแกนหลักมากกว่า, รวมถึงมี algebraic data types และ generalized algebraic data types หรือไม่
อ้างอิง: https://v2.ocaml.org/manual/effects.html, https://docs.hhvm.com/hack/contexts-and-capabilities/introdu..., https://austral-lang.org/linear-types
fnแยกเฉพาะหรือไม่ ไม่เข้าใจว่าความแตกต่างพื้นฐานระหว่างfuncกับfnคืออะไรfuncกับfnหรือไม่ และลูกศร->ที่ใช้แสดงค่าที่คืนกลับใน function signature จำเป็นจริงหรือเปล่าsyntax สำหรับ type ใหม่คือ
struct Userแต่ในกรณีนี้คิดว่าแบบ Go คือtype User structน่าจะดีกว่า เพราะจะทำให้สร้าง function type สำหรับตัวแปรfnได้ เช่นtype AssignUser func(name: String, id: Int) -> Intยังสงสัยด้วยว่า
:ช่วย lexer หรือ parser หรือไม่ อยากถามว่าใน function signature จะเขียนfunc(name String)แทนfunc(name: String)ได้ไหม และการประกาศ type จะเป็นmut elems List[int]แทนmut elems: List[Int]ได้หรือเปล่า เป็นการจับผิดเล็ก ๆ น้อย ๆ แต่โดยรวมแล้วชอบเว็บไซต์เปรียบเทียบกับ Rust และ Go แต่สำหรับผม การเทียบกับ AssemblyScript ดูเหมาะกว่า AssemblyScript ก็เป็น WASM native เช่นกัน และคล้ายกันตรงที่ ecosystem ยังเล็ก
อย่างไรก็ตาม ต่างจาก Moonbit ตรงที่มันเป็นภาษาที่คนเคยใช้ TypeScript จะคุ้นเคย จึงสงสัยว่าเหตุผลที่ควรใช้ Moonbit แทน AssemblyScript คืออะไร
AssemblyScript ไม่มี pattern matching และส่วนใหญ่ประกอบด้วย statement ส่วน Moonbit มี algebraic data types แต่ไม่แน่ใจว่า AssemblyScript มีแบบนั้นหรือไม่ อาจมีความแตกต่างด้าน runtime เพิ่มเติมด้วย แต่ดูจากเว็บไซต์อย่างเดียวแล้วตัดสินได้ยาก
การใช้คีย์เวิร์ด
funcสำหรับนิยามฟังก์ชันระดับบนสุด และfnสำหรับนิยามฟังก์ชันซ้อน ไม่ใช่เรื่องดี ควรทำให้เป็นแบบเดียวกันด้วยคำใดคำหนึ่ง โดยไม่ขึ้นกับบริบทเฉพาะแต่การที่มันจำเป็นจริง ๆ หรือเป็นการออกแบบที่ดีหรือไม่นั้นเป็นอีกเรื่อง เพียงแต่มีตัวอย่างมากมายมาก่อน
fnทำให้ละชื่อและ type ได้ และคีย์เวิร์ดที่สั้นก็แสดงให้เห็นว่านิยามฟังก์ชันสามารถสั้นลงได้ด้วยดีใจที่มี ภาษา garbage-collected สมัยใหม่ที่มุ่งเป้าไปยัง WASM ออกมา ตัวเปรียบเทียบที่ใกล้ที่สุดน่าจะเป็น Grain: https://grain-lang.org/
“การพัฒนาทูลเชนของภาษาทั้งชุดในอดีตเคยใช้เวลาหลายปีจนถึง 10 ปี แต่ด้วยประสบการณ์ที่สั่งสมมาและทีมเฉพาะทางที่ยอดเยี่ยมซึ่งจัดตั้งขึ้นตั้งแต่ช่วงเริ่มต้นของ Moonbit ทำให้กระบวนการนี้เรียบง่ายลง คาดว่า Moonbit จะเข้าสู่สถานะเบตาภายในปลายไตรมาส 2 ปี 2024 ซึ่งหมายถึงขั้นที่ค่อนข้างเสถียร มีบั๊กน้อย และมี FFI ที่แข็งแรงสำหรับโต้ตอบกับ Wasm host เมื่อถึงคุณภาพระดับเบตาแล้วจะเปิดเผยซอร์สโค้ด ในเชิงกลยุทธ์ เราวางแผนผสาน Wasm GC สำหรับ Wasm 2.0 และ GC ของตัวเองสำหรับ Wasm 1.0 ให้สอดคล้องกับข้อเสนอของ Wasm” มีข้อความว่าเช่นนั้น
ดังนั้นตอนนี้ https://github.com/moonbitlang/ จึงยังว่างอยู่
สามารถลองใช้ IDE ออนไลน์ได้ด้วย: https://try.moonbitlang.com
ดูจากคอมเมนต์ที่นี่ ดูเหมือนว่า Moonbit จะมี garbage collection แต่ถ้าไบนารีผลลัพธ์ของ Fibonacci มีขนาด 253 ไบต์ ก็น่าจะยังไม่ได้รวม GC ไว้
สงสัยว่าใช้ WASM native GC ที่กำลังเสนออยู่หรือไม่ หรือระบบ build ฉลาดพอที่จะตัดสินว่าในกรณีนี้ไม่จำเป็นต้องใช้ GC แล้วตัดออกได้
เอาต์พุตของตัวอย่าง Fibonacci เห็นแค่การ import
print_i32, นิยาม memory และ function, และ export_startไม่ได้มีลักษณะว่ามี GC runtime พ่วงมาด้วยนึกถึง Grain ขึ้นมา เพราะเป็นอีกภาษาการเขียนโปรแกรมที่ให้ความสำคัญกับ Wasm ก่อนเหมือนกัน น่าจะเพิ่ม Grain เป็นตัวเปรียบเทียบด้วย
https://grain-lang.org/
ลิงก์ About Team นำไปยังหน้า edu.cn ภาษาจีน ดูเหมือนโครงการของมหาวิทยาลัย แต่ก็ไม่แน่ใจ หน้า Join Us ก็เป็นภาษาจีนเช่นกัน และตัวอย่างบนหน้าเว็บดูเหมือนต้องใช้ JavaScript จาก baidu.com
ใน Go จะไม่เขียน Fibonacci แบบนั้น
ดูเหมือนว่าการโยนตัวเลขไม่กี่ตัวลงไปจะง่ายกว่าการเปรียบเทียบ implementation แบบ idiomatic และพูดถึง trade-off อย่างละเอียด ต่อให้เป็นแค่ทีเซอร์ภาษาง่าย ๆ ก็ควรใส่หมายเหตุเรื่อง TCO ไว้เพื่อไม่ให้คนเข้าใจผิด
switchซึ่งใน Go อาจทำงานช้าได้ถึงอย่างนั้น ในฐานะทีเซอร์แนะนำ Moonbit ก็ถือว่าโอเค
สงสัยว่าโปรเจกต์นี้เกี่ยวข้องกับ Meta หรือไม่ ผู้สร้างคือ Hongbo Zhang เคยทำโปรเจกต์ภาษาโปรแกรมโอเพนซอร์สอย่าง ReasonML และ Flow ที่ Meta และตาม LinkedIn ยังทำงานอยู่ที่ Meta