เปิดตัว Jank Lang เวอร์ชันอัลฟา
(github.com/jank-lang)- เป็นภาษาโปรแกรมที่ผสาน ไวยากรณ์ของ Clojure และประสิทธิภาพเนทีฟบน LLVM พร้อมมอบ การทำงานร่วมกับ C++ ได้อย่างราบรื่น
- ยังคงรักษา คุณลักษณะเชิงฟังก์ชันและแนวคิดยึดค่าข้อมูลเป็นศูนย์กลาง ของ Clojure ไว้ โดยใช้ LLVM เป็นสภาพแวดล้อมโฮสต์ แทน JVM
- โครงสร้างข้อมูลทั้งหมดไม่เปลี่ยนแปลงค่า (persistent & immutable) และเชื่อมต่อกับไลบรารีมาตรฐานของ C++ ได้โดยตรง
- ขณะนี้อยู่ในขั้น อัลฟา (Alpha) โดยมีเอกสารทางการและตัวอย่างให้ดูที่ jank book
- เป็นความพยายามในการผสานระบบนิเวศของ Clojure เข้ากับประสิทธิภาพเนทีฟของ C++ ซึ่งมี ความหมายในแง่การลดเส้นแบ่งระหว่างภาษาฟังก์ชันนัลกับภาษาระดับระบบ
ภาพรวมของ jank
- jank คือ ภาษาแบบโฮสต์บน LLVM ที่สร้างขึ้นบนไวยากรณ์และปรัชญาของ Clojure
- ใช้ LLVM แทน JVM และรองรับ การทำงานร่วมกัน (interoperability) กับ C++
- รักษา คุณลักษณะแบบฟังก์ชันนัล โต้ตอบได้ และยึดค่าข้อมูลเป็นศูนย์กลาง ของ Clojure ไว้
- ตั้งเป้าให้ เข้ากันได้กับ Clojure ในระดับสูง โดยเปรียบได้กับที่ Clojure ทำงานร่วมกับ Java ส่วน jank จะผสานกับ C++
- ปัจจุบันกำลังพัฒนาในสถานะ เวอร์ชันอัลฟา และสามารถดูรายละเอียดเพิ่มเติมได้ในเอกสารทางการ
คุณลักษณะของภาษา
- โครงสร้างข้อมูลในตัวทั้งหมดเป็นแบบไม่เปลี่ยนแปลงค่า (persistent & immutable)
- ตัวอย่าง:
(def george {:name "George Clooney"})
- ตัวอย่าง:
- สามารถทำ ผลข้างเคียง (side effect) ได้อย่างชัดเจนเมื่อจำเป็น
- ตัวอย่าง:
(defn say-hi [who] (println (str "Hi " (:name who) "!")) (assoc who :greeted? true))
- ตัวอย่าง:
- สามารถ เชื่อมต่อกับไลบรารีมาตรฐานของ C++ ได้โดยตรง
- ตัวอย่าง:
(cpp/std.this_thread.sleep_for (cpp/std.chrono.milliseconds ms))
- ตัวอย่าง:
- มีฟังก์ชันแกนหลักหลากหลายสำหรับ การประมวลผลข้อมูลแบบฟังก์ชันนัล
- ตัวอย่าง:
(apply + (distinct [12 8 12 16 8 6])) ; => 42
- ตัวอย่าง:
การพัฒนาและเอกสาร
- เอกสารทางการ: jank book
- โปรเจ็กต์นี้ อิงกับ LLVM 22 และเข้ากันได้กับมาตรฐาน C++ รุ่นใหม่
- รองรับ AOT compilation, GC profiling, ตัวเลือกการบิลด์ CMake เป็นต้น
- รวมการตั้งค่า สภาพแวดล้อม Nix และ การบิลด์อัตโนมัติด้วย CI
ชุมชนและการสนับสนุน
- โปรเจ็กต์สามารถสนับสนุนได้ผ่าน GitHub Sponsors
- ผู้สนับสนุนทั้งองค์กรและบุคคล ได้แก่ Clojure Together, nubank, multiply.co, modulr-software เป็นต้น
- ช่องทางชุมชน: Slack (Clojurians), Twitter
การบรรยายและบทแนะนำที่เกี่ยวข้อง
- วิดีโอบรรยายจาก Clojure Conj 2023
- มีการแนะนำภาษาใน The REPL Interview และ Compiler Spotlight
- มีวิดีโอ YouTube: Language Introduction ให้รับชม
สรุป:
jank เป็นภาษาที่นำปรัชญาเชิงฟังก์ชันของ Clojure มาสู่สภาพแวดล้อม LLVM และ C++ แบบเนทีฟ โดยมีเป้าหมายเพื่อ ผสานผลิตภาพของ Clojure เข้ากับประสิทธิภาพของ C++ แม้ตอนนี้จะยังอยู่ในขั้นอัลฟา แต่ก็ได้นำเสนอ ประสบการณ์การพัฒนาแบบบูรณาการรูปแบบใหม่สำหรับทั้งนักพัฒนา Clojure และโปรแกรมเมอร์สายระบบ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สำหรับเรื่อง jank alpha อยากให้ไปดูที่หนังสือทางการ
ตอนนี้ยังไม่พร้อมประกาศอย่างเป็นทางการเต็มที่ แต่ก็ดีใจที่ผู้คน ให้ความสนใจ
ถ้ารวมความสามารถของคอมไพเลอร์เพิ่มอีกไม่กี่อย่าง ก็จะพร้อมพอให้คนลองใช้ jank ตามหนังสือได้แล้ว
เห็นมีจุดผิดไวยากรณ์อยู่บ้าง เลยสงสัยว่า ส่ง PR ไปที่ส่วน
bookได้ไหม หรือว่าควรส่งฟีดแบ็กด้วยวิธีอื่นเพื่อคงสำนวนของผู้เขียนไว้jank เป็น ภาษาถิ่นของ Clojure และ Clojure เองก็เป็นภาษาถิ่นของ Lisp
เน้นเชิงฟังก์ชัน แต่ก็รองรับ mutable state และ side effects ด้วย
โครงสร้างข้อมูลทั้งหมดเป็น immutable โดยปริยาย และเหมือน Clojure ตรงที่มีกลไกการเปลี่ยนแปลงอย่างปลอดภัย ทำให้จัดการ concurrency ได้ง่าย
อีกทั้งยังเชื่อมต่อกับ C++ ได้ลึกมาก จนสามารถนิยามชนิดข้อมูล ฟังก์ชัน และเทมเพลต C++ ใหม่ได้ในรันไทม์
ใช้ JIT compilation ผ่าน Clang และ LLVM จึงเข้าถึงไลบรารี C/C++ ได้ง่าย
รายละเอียดดูได้ในหนังสือทางการ
ผมชอบ Clojure อยู่แล้ว และการมี native target ก็ดูน่าสนใจมาก
เลยอยากรู้ว่าใน jank ความเร็ว คอมไพล์/คอมไพล์ใหม่ เป็นอย่างไรบ้าง
สงสัยว่าการพัฒนา jank จะ ตาม Clojure ต้นน้ำ ใกล้แค่ไหน
ตั้งใจจะให้เหมือนกันมากที่สุดแบบ cljs หรืออาจแยกทางกันในอนาคต
ผมเคยทำภาษาที่คล้าย Clojure อยู่ประมาณ 90% แต่ไม่กล้าตั้งชื่อแบบนั้นเพราะรับประกันความเข้ากันได้เต็มรูปแบบไม่ได้
jank ดูเหมือน drop-in replacement ซึ่งดูเจ๋งมาก
ตอนนี้กำลังร่วมมือกับทีม Clojure และนักพัฒนาภาษาถิ่นอื่น ๆ และกำลังเป็นแกนนำของ cross-dialect clojure-test-suite
ตอนนี้รองรับหรือกำลังทำงานกับ Clojure JVM, ClojureScript, Clojure CLR, babashka, Basilisp และ jank
อย่างไรก็ดี มีแผนจะเพิ่ม โหมดทางเลือก ที่ได้แรงบันดาลใจจาก Carp แต่จะยังคงความเข้ากันได้ตามค่าเริ่มต้น
แวบแรกนึกว่าไม่ใช่ jank แต่เป็น Jack Lang นักการเมืองฝรั่งเศส
หนังสือที่ควรดูคู่กัน: https://book.jank-lang.org/
ผมตามบล็อก jank มา 1 ปีแล้ว ขอแสดงความยินดีด้วยกับ alpha release
ในฐานะผู้ใช้ Emacs อยากรู้ว่าสถานะการรองรับ เครื่องมือพัฒนา แบบ CIDER เป็นอย่างไรบ้าง
แล้วก็เจอพิมพ์ผิดในลิงก์ส่วน Welcome — ควรเป็น “foreword” ไม่ใช่ “foreward”
ดูได้ที่ try-jank
งานนี้ล่าช้าเพราะบั๊กของ Clang แต่เป็น งานที่มีลำดับความสำคัญสูง
ส่วนคำสะกดผิดในลิงก์แก้แล้ว
สงสัยว่า jank เชื่อมกับโค้ดเบส Rust ได้ไหม
เชื่อมกันได้ผ่าน C ABI หรือกลไกการทำงานร่วมกันระหว่าง C++/Rust
อยากรู้ว่ามี ระบบชนิดข้อมูลแบบสถิต มาด้วยไหม
แต่ผู้พัฒนาเคยพูดถึงแผนจะเพิ่มระบบชนิดแบบค่อยเป็นค่อยไป¹
วิสัยทัศน์คือให้บางส่วนเป็นแบบ dynamic เต็มตัวและอิง GC ส่วนบางส่วนก็จะควบคุมได้มากขึ้นและปรับแต่งประสิทธิภาพได้ดีขึ้น
¹ บล็อกโพสต์ที่เกี่ยวข้อง
interop กับ C++ นั้น มีการกำหนดชนิดแบบสถิต แต่พอกลับเข้ามาในโลกของ Clojure ก็จะเป็นแบบ dynamic และ polymorphic เต็มรูปแบบ
มีแผนจะสำรวจโหมด static type แบบเลือกใช้ได้เหมือน Carp แต่ ไม่ใช่ปีนี้
ตอนแรกนึกว่าเป็นข่าวว่า “Jank Lang” ไป หา investment alpha เจอ