- การจัดการหน่วยความจำ ORC กลายเป็นค่าเริ่มต้น
- แบ็กเอนด์ JavaScript ใช้ BigInt เป็นค่าเริ่มต้นสำหรับ
int64และuint64และโค้ดที่ทำงานร่วมกับ JS backend แล้วใช้ชนิดข้อมูลเหล่านี้อาจต้องอัปเดต --experimental:strictEffectsถูกเปิดใช้งานตลอดเวลา และพารามิเตอร์ callback ต้องมี annotationeffectsOf- ภาษา markup เริ่มต้นของคอมเมนต์เอกสารเปลี่ยนจากโหมด
RstMarkdownเดิมเป็น Markdown และมีการเพิ่ม pragma{.doctype: Markdown | RST | RstMarkdown.}รวมถึงคำสั่งmd2htmlและrst2html - ฟังก์ชันบางส่วนเกี่ยวกับ
osใน standard library ถูกแยกออกเป็นอินเทอร์เฟซใหม่ที่ใช้ abstractionPathโดยมีให้ในโมดูลstd/oserrors,std/envvars,std/paths,std/dirs,std/files,std/symlinks,std/appdirs,std/cmdline - โมดูล standard library หลายตัวถูกย้ายไปเป็นแพ็กเกจ Nimble ดังนั้นเมื่อใช้
std/punycode,std/asyncftpclient,std/smtp,std/db_*,std/md5,std/sha1,std/sumsจำเป็นต้องติดตั้งผ่านnimbleหรือatlas - การใช้
breakแบบไม่มีชื่อภายในblockแบบไม่มีชื่อถูกประกาศเลิกใช้ (deprecation) และจะกลายเป็นข้อผิดพลาดในเวอร์ชันถัดไป - นิยาม
"strictFuncs"เปลี่ยนไป โดยห้ามบันทึกค่าผ่านการ dereference ของrefหรือptr - การ unpack tuple ของตัวแปรถูกจัดการเป็น syntax sugar ที่ขยายเป็นการกำหนดค่าหลายครั้ง และรองรับการ unpack tuple แบบซ้อนกันแล้ว
- มีการนำ top-down inference ไปใช้ในกรณีพื้นฐานหลายจุด ทำให้โค้ดตัวอย่างสำหรับการเริ่มต้น
seq[(float, byte, cstring)]คอมไพล์ได้ - สามารถกำหนดค่าเริ่มต้นให้ฟิลด์ของ object ได้ และฟิลด์ที่ไม่ได้ initialize อย่างชัดเจนจะใช้ค่าเริ่มต้นนั้น
- เพิ่มสวิตช์ทดลอง
strictDefsเพื่อตรวจสอบว่าตัวแปรได้รับการกำหนดค่าอย่างชัดเจนก่อนใช้งานหรือไม่ และตรวจสอบว่าตัวแปรletถูกกำหนดค่าเพียงครั้งเดียวพอดี - การทำงานร่วมกับ C++ เพิ่ม pragma
virtualและ pragmaconstructorที่ขยายความสามารถ ทำให้สามารถนิยาม constructor และ virtual proc ที่แมปกับ constructor และ virtual method ของ C++ ได้ - มาพร้อม Nimble 0.14 ซึ่งรองรับ lock-file และตำแหน่งเก็บไลบรารีเปลี่ยนจาก
$nimbleDir/pkgsเป็น$nimbleDir/pkgs2
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
กำลังใช้ Nim ในโปรดักชันได้อย่างพึงพอใจ ส่วนใหญ่ทำเครื่องมือวิเคราะห์ข้อมูลและสร้างรายงาน แล้วคอมไพล์เป็นไฟล์ CLI executable ที่สคริปต์ฝั่งเซิร์ฟเวอร์เรียกใช้
Nim สร้างไฟล์ executable ที่เร็วและมีขนาดเล็ก และมีโครงสร้างข้อมูล JSON แบบ heterogeneous กับไลบรารี dataframe ที่ดี ชอบใช้สแตกอย่างมาก ดังนั้นแม้แต่โครงสร้างข้อมูลแบบไดนามิกอย่าง sequence และ table ก็เป็นพอยน์เตอร์บนสแตกที่ชี้ไปยังข้อมูลบนฮีป และอายุการใช้งานถูกจัดการโดย stack frame
ในโปรแกรมแทบไม่มี dynamic reference และไม่ต้องกังวลเรื่อง GC ระบบชนิดข้อมูลเรียบง่ายและสมเหตุสมผล ช่วยชี้นำให้เขียนโค้ดที่ถูกต้องได้ง่าย ค่าเริ่มต้นก็ใกล้เคียงกับ referential transparency และถ้าไม่ระบุให้หลุดออกจากแนวทางนั้น ทุกอย่างจะเป็น immutable value passing
Generic มีพลังและทำงานตามที่คาดไว้ และ uniform function call syntax ก็มีประโยชน์อย่างไม่น่าเชื่อ แค่สร้าง procedure และ function ที่รับชนิดข้อมูลใดชนิดหนึ่งเป็นอาร์กิวเมนต์แรก ก็สามารถเขียนสิ่งที่เทียบเท่ากับ method หรือ interface ได้ ทำให้ไม่ต้องมี abstraction แบบนั้น โครงสร้างโค้ดจึงเรียบง่ายและแบนลง
ใช้แล้วสนุกจนทำให้นึกถึงตอนที่เคยค้นพบ D แต่ดีกว่าด้วยซ้ำ ถ้าจินตนาการถึง Python ที่มี type annotation แบบ native compiled ซึ่งเกือบ 100% เป็น business logic และไม่มีสิ่งรุงรัง นั่นก็ใกล้เคียงกับประสบการณ์ของ Nim
ตั้งตารอที่จะลองใช้รีลีสนี้ ในฐานะคนที่เขียนโปรแกรมเป็นอาชีพมา 25 ปี ผมมองว่า Nim เป็นภาษาที่รวบรวมข้อดีจากหลายโลกไว้ได้ดี
ใช้ง่ายเหมือน Python เป็นภาษา strongly typed แต่ type inference ยอดเยี่ยม และค่าเริ่มต้นถูกออกแบบให้เร็วและปลอดภัย เหมาะตั้งแต่ embedded ไปจนถึง high-performance computing
ด้วย UFCS, generic และ concepts ทำให้ได้ข้อดีของ OOP แต่ไม่ค่อยต้องสร้างโค้ดโครงนั่งร้านที่วางความสัมพันธ์ของข้อมูลอันเปราะบางแบบไม่รู้จบเพียงเพื่อการจัดระเบียบ ต่างจาก Python ความกำกวมจะกลายเป็น compile error
รู้สึกว่าโปรแกรมเดียวกันมีขนาดเล็กกว่า อ่านง่ายกว่า และเข้าใจง่ายกว่าภาษาอื่นส่วนใหญ่มาก เบื้องหลังก็ไม่ได้มีเวทมนตร์มากมาย เพราะค่าเริ่มต้นมันสมเหตุสมผล
compile-time metaprogramming อยู่คนละระดับ มันฝังอยู่ในแกนของการออกแบบภาษา ไม่ใช่ dialect แยกหรือการเล่นแทนที่ข้อความ และยังใช้งานได้ตรงไปตรงมา ตัวอย่างเช่น สร้างโค้ด parsing แบบปรับแต่งเองจากไฟล์ได้ง่าย เพื่อตัด boilerplate ซ้ำๆ ออกไป และคอมไพล์ก็เร็ว
ด้วยระบบชนิดข้อมูลที่ยอดเยี่ยม จึงเขียนให้ดีได้ง่ายกว่า Python แต่ประสิทธิภาพทัดเทียม C/C++ และยัง deploy เป็นไฟล์ executable ขนาดเล็กแบบ standalone ได้ง่ายมาก
มี native ABI สำหรับ C, C++, ObjC, JS, FFI ที่ยอดเยี่ยม และ interoperability กับ Python ที่ดี สามารถใช้ ecosystem ที่มีอยู่ได้โดยตรงโดยไม่ต้องเขียนใหม่
ลองจินตนาการถึงการเขียน pseudocode สไตล์ Python สำหรับ ESP32 แล้วได้โค้ดที่มีประสิทธิภาพมากโดยแทบไม่ต้องลงแรง และเมื่ออยากได้ก็ยังควบคุมแบบ bare-metal ได้ ใช้ภาษา efficient ภาษาเดียวกันเขียนเว็บแอปที่มีทั้ง backend และ frontend ทำเกม bullet hell ที่เร็ว โดยไม่ต้องกังวลเรื่อง GC เพราะถ้าไม่ระบุเป็นอย่างอื่นก็จัดสรรบนสแตก
ในมุมธุรกิจ คุณค่าที่ใหญ่มากคือสามารถทำ prototype ได้เร็วเหมือน Python แต่ก็เร็วและเบาพอสำหรับโปรดักชันอยู่แล้ว อาจกลายเป็นอาวุธลับของบริษัทได้
จุดที่ดีมากคือเราจัดการสภาพแวดล้อม C ซึ่งเป็น runtime ชั้นล่างเองได้ ขณะเดียวกันก็ใช้ภาษาระดับสูงสมัยใหม่ด้านบนที่รองรับสิ่งอย่าง JSON เป็น first-class ได้ดี แม้จะเป็นคนชอบ Python แต่ Nim ก็ดีกว่าและเป็น Python ที่ดีกว่า
โดยเฉพาะ JS interoperability ระหว่างพัฒนาสะดวกแค่ไหน และไปไกลกว่าการคอมไพล์ Nim เป็นไลบรารี JS แบบ standalone หรือไม่ สามารถเรียก browser API โดยตรงจาก Nim หรือเรียกผ่าน wrapper ที่ค่อนข้างเรียบง่ายได้ไหม?
ถึงอย่างนั้นตลอดประมาณ 4 ปี ก็ไม่มี performance regression ใหญ่ๆ หรือการเปลี่ยนแปลงที่จำเป็นมากนัก
ขอแสดงความยินดีกับทุกคนที่เกี่ยวข้องและทั้งชุมชน Nim ใช้ Nim เป็นภาษาหลักมาตลอด 10 ปีที่ผ่านมา และชอบฟีเจอร์ใหม่ๆ ของ Nim 2.0 มาก
บางอย่างเป็นฟีเจอร์ที่เปลี่ยนเกมจริงๆ สำหรับโปรเจกต์ของผม ตัวอย่างเช่น ค่าเริ่มต้นของ object ในทางทฤษฎีอาจทำให้ Norm[1] ทำงานกับ object type ได้ ไม่ใช่แค่ object instance เท่านั้น ถ้าไม่มี enum ที่ overload ได้ซึ่งเพิ่มเข้ามาใหม่ Karkas[2] คงเป็นไปไม่ได้เลย ตอนนี้ยังอยู่ระหว่างทำงาน
[1] https://norm.nim.town
[2] https://karkas.nim.town
Nim เป็นภาษาที่ดีมากสำหรับการเขียนซอฟต์แวร์ สามารถ deploy ได้รวดเร็ว พัฒนาได้สนุก และยังสร้างซอฟต์แวร์ที่มีประสิทธิภาพสูงมากได้
แต่จากประสบการณ์ก็ยังมีจุดคมๆ อยู่ ต้องปรับ compiler C/C++ และตัวเลือกให้เข้ากัน ข้อความ error แย่มาก และบางไลบรารีทำงานได้เฉพาะกับการตั้งค่าและระบบบางแบบเท่านั้น ถึงอย่างนั้นเมื่อคิดว่าชุมชนยังเล็ก ก็โทษมากนักไม่ได้ การผสานกับ VS Code ทำงานได้ดีและแทบไม่ crash
ถ้า Manning Publications ได้เห็นสิ่งนี้ ก็หวังว่าจะมีหนังสือ Nim เวอร์ชันล่าสุดออกมา และอยากให้พิจารณาการจัดหน้ารูปแบบอื่นที่ใช้ฟอนต์อ่านง่ายกว่านี้
ผมซื้อหนังสือยอดเยี่ยมของ Dominik Picheta มาแล้ว แต่ฉบับกระดาษอ่านยากมากเพราะฟอนต์บาง ถึงจะตัดแว่นแล้วก็ยังอ่านลำบาก จนต้องใช้ PDF แทน องค์ประกอบของฟอนต์อย่างเส้นและก้านตัวอักษรบางเกินไป
ตอนแรกคิดว่าเป็นปัญหาของผมเองเพราะอายุมากขึ้น เลยลองเทียบกับ K&R ฉบับพิมพ์ครั้งที่ 2 ต้นฉบับ แต่เล่มนั้นยังอ่านได้ชัดเจนสมบูรณ์แบบ
Reddit เขียนบทความเกี่ยวกับวิธีที่พวกเขาใช้ Nim: https://www.reddit.com/r/RedditEng/comments/yvbt4h/why_i_enj...
บริษัทใหญ่และสตาร์ทอัพจำนวนมากขึ้นเรื่อย ๆ กำลัง นำ Nim ไปใช้ ตื่นเต้นกับ Nim 2.0 มาก และขอบคุณทุกคนที่มีส่วนร่วมอย่างยิ่ง
ถ้าเป็นเรื่องเล่าก็ได้ พอจะยกชื่อบริษัทสักสองสามแห่งได้ไหม?
Nim เป็นภาษาที่ผมชอบที่สุดมาพักหนึ่งแล้ว และตื่นเต้นมากที่ในที่สุด 2.0 ก็ออกมา ฟีเจอร์จำนวนมากในรุ่นนี้เป็นสิ่งที่รอกันมานาน
ข้อเสียเพียงอย่างเดียวคือ ตามที่กล่าวไว้ด้านล่าง โมดูลที่รวมมาบางส่วนถูกย้ายไปยัง รีโพซิทอรีของบุคคลที่สาม ไม่ใช่ปัญหาใหญ่ แต่การที่ไลบรารีรองรับ SQLite มาในตัวนั้นเป็นเรื่องดี พอเริ่มรองรับฐานข้อมูลบางตัว ก็อาจถูกกดดันให้รองรับฐานข้อมูลมากขึ้นอยู่ดี แต่ที่ค่อนข้างแปลกใจคือแม้แต่การรองรับ MD5 และ SHA1 ก็ถูกถอดออกด้วย
การรองรับ path หรือ logging อยู่ในมาตรฐานนั้นดี แต่บางอย่างควรอยู่เป็น ของบุคคลที่สาม เพื่อให้พัฒนาไปได้ดีกว่า
ขอแสดงความยินดีกับทุกคนที่เกี่ยวข้อง Nim เป็นภาษาที่น่าสนใจจริง ๆ
กำลังพยายามหาเหตุผลที่จะใช้ในงาน งานของผมอยู่แถว ๆ มือถือ การที่คอมไพล์ไปเป็น JS และ ObjC ได้จึงน่าดึงดูด แต่ตอนนี้ยังไปไม่ไกลเกินกว่าการลองจับโน่นจับนี่ เมื่อเทียบกับ Rust แล้วเริ่มต้นได้ง่ายกว่ามาก
มันทำงานในลักษณะการสร้าง Node addon เหมาะสำหรับนำโค้ด Nim กลับมาใช้ซ้ำในเว็บแอป หรือใช้กับโค้ดที่ต้องการประสิทธิภาพสูง
เมื่อไม่กี่เดือนก่อนผมลองดู Nim แล้ว ในแง่ฟีเจอร์มีหลายอย่างที่อยากให้ Python มี เช่น ทำงานร่วมกับ C/C++ ได้ง่าย, static typing, การคอมไพล์, การ cross-compile ไป Android/iOS แล้วรันได้
แต่ถึงแม้ภาษานี้จะไม่ได้ใหม่แล้ว ระบบนิเวศยังเล็ก ไม่มีไลบรารีคุณภาพสูงจำนวนมากแบบ numpy, scipy, pandas, opencv ของ Python น่าเสียดายที่ผู้เล่นรายใหญ่ไม่ค่อยนำไปใช้ และคิดว่าคงดีถ้า Unreal Engine ลองนำ Nim ไปใช้ แทนที่จะสร้างภาษา scripting ใหม่ของตัวเองชื่อ Verse
อีกอย่างที่น่าเสียดายคือความสามารถในการทำงานร่วมกับไลบรารี C/C++ ได้ทันทีโดยไม่ต้องสร้าง adapter เอง อยากให้เป็นแบบแค่นำเข้า header ก็จบ
ถ้ามีการทำงานร่วมกับ Rust ที่ง่ายคล้ายกันก็คงดี เพราะจะช่วยเพิ่มการนำไปใช้ และใน Rust หา crate ข้ามแพลตฟอร์มคุณภาพสูงที่ทำงานได้ดีแม้บนอุปกรณ์มือถือได้ง่ายกว่า
กังวลว่าในอีกไม่กี่ปี Python ที่เร็วขึ้น, การเอา GIL ออก, nuitka, briefcase สำหรับมือถือ ฯลฯ อาจไล่ตามทัน หรือ Mojo อาจมาแย่งที่ของ Nim ไป
ถึงอย่างนั้น Nim ก็มีไลบรารี nimpy ที่ทำงานร่วมกับ Python ได้แทบจะไร้รอยต่อ กล่าวคือสามารถนำเข้า PyTorch, scipy, opencv มาใช้ใน Nim ได้เลย
อยากรู้ว่ามีใครเคยใช้ Nim กับ Zig จริง ๆ ไหม อยากฟังว่าทั้งสองคล้ายและต่างกันอย่างไร และอยากเห็น benchmark เว็บเซิร์ฟเวอร์แบบ idiomatic ของทั้งสองภาษาโดยอิงจาก Nim v2 ด้วย
Zig ก็ดี และผมชอบการรองรับค่า optional กับแนวทางการจัดการข้อผิดพลาด แต่ผมไม่ค่อยชอบ ไวยากรณ์ที่รก อย่าง
!?[]u8ซึ่งใช้แทน error union ของ optional pointer ไปยัง multi-pointer ของ uint8ในโค้ดส่วนใหญ่ที่ต้องมีการจัดสรรแบบไดนามิก การต้องเตรียมและส่ง allocator ไปด้วยก็รบกวนลอจิกหลัก งานเล็ก ๆ อย่างการต่อ string หรือการจัดรูปแบบก็กลายเป็นเรื่องยุ่ง
Zig ยังไม่มี dynamic dispatch ด้วย ทำให้เขียนโค้ดแบบ polymorphic ได้ยาก และต้องอ้อมไปใช้ duck typing บางรูปแบบ สุดท้ายผมจึงสรุปว่า Zig ไม่เหมาะกับผม
[1] https://github.com/khaledh/axiom
[2] https://github.com/khaledh/axiom-zig
จากตัวอย่างต่าง ๆ จะเห็นว่าแทบจะเป็นโค้ดเดียวกันที่เขียนในหลายภาษา จึงพอมองภาพรวมได้ แต่ในแง่ฟีเจอร์ของภาษาแล้วยังแตะเพียงผิวเผิน เช่น ตัวอย่าง Zig ไม่ได้ใช้ฟีเจอร์ comptime
Zig: https://github.com/floooh/sokol-zig/tree/master/src/examples
Nim: https://github.com/floooh/sokol-nim/tree/master/examples
Odin: https://github.com/floooh/sokol-odin/tree/main/examples
Rust: https://github.com/floooh/sokol-rust/tree/main/examples
Zig น่าเบื่อกว่า แต่ทั้งหมดเป็นความน่าเบื่อด้วยเหตุผลที่ดี ส่วนตัวผมคงไม่เขียน OS ด้วย Nim แต่ Zig ถ้า mature แล้วน่าจะยอดเยี่ยมสำหรับงานนั้น ผมเริ่มใช้มันกับซอฟต์แวร์ฝังตัวแล้ว
Nim ผมคงใช้กับเครื่องมือ CLI, แอปพลิเคชันเซิร์ฟเวอร์ และอาจรวมถึงแอป GUI กับเกมด้วย
ทีม Zig ดูเหมือนทุ่มเทกับ โครงสร้างพื้นฐานของคอมไพเลอร์ ทั้งหมดมากกว่าเยอะ และจากประสบการณ์แล้วน่าประทับใจจริง ๆ มีนวัตกรรมดี ๆ หลายอย่าง
Zig เป็นภาษาที่โฟกัสกว่ามาก โดยเล็ง niche เฉพาะในฐานะผู้สืบทอดและตัวแทนของ C และทำเป้าหมายนั้นได้ยอดเยี่ยม
ผมคิดว่าความชอบภาษาอยู่ที่ความต้องการและความอยากส่วนตัวที่ภาษาปัจจุบันตอบไม่ได้ ผมลงหลักกับ Zig เพราะสนใจแนวทางที่มุ่งเป็นผู้สืบทอด C แต่ก็เข้าใจว่าทำไมคนอื่นถึงเลือก Nim