นักพัฒนาได้เปิดตัวชุดฟังก์ชันคำนวณวัฏจักรดวงจันทร์แบบโอเพนซอร์สที่รองรับหลายภาษาโปรแกรมมิ่ง ซึ่งมีชื่อว่า Werewolf Early Warning System โปรเจกต์นี้ใช้อัลกอริทึมดาราศาสตร์เดียวกันใน 8 ภาษาโปรแกรมมิ่งที่แตกต่างกัน ตั้งแต่ภาษาระดับระบบอย่าง C++ และ Rust ไปจนถึงภาษาสคริปต์อย่าง Python และ JavaScript
ภาษาโปรแกรมที่รองรับ:
- ระดับระบบ: C/C++, Rust, Zig
- สคริปต์: Lua, JavaScript, Python
- DSLs: awk, bc
- เพิ่มเติมล่าสุด: Raku
กฎ Copy-Paste สร้างความท้าทายทางการเขียนโปรแกรมที่น่าสนใจ
สิ่งที่ทำให้โปรเจกต์นี้น่าสนใจเป็นพิเศษคือข้อกำหนดกฎ copy-paste ที่เข้มงวด ฟังก์ชันแต่ละตัวต้องสามารถทำงานได้อย่างสมบูรณ์ด้วยตัวเอง ทำให้นักพัฒนาสามารถคัดลอกและวางโค้ดเข้าไปในโปรเจกต์ของตนได้โดยตรงโดยไม่ต้องพึ่งพา dependencies หรือการเปลี่ยนแปลงสภาพแวดล้อม ข้อจำกัดนี้ได้จุดประกายการอภิปรายในหมู่นักพัฒนาเกี่ยวกับวิธีที่ข้อจำกัดดังกล่าวส่งผลต่อรูปแบบการเขียนโค้ดและประสิทธิภาพ
ข้อกำหนดนี้บังคับให้โปรแกรมเมอร์คิดแตกต่างจากแนวทางปกติของพวกเขา แทนที่จะพึ่งพาไลบรารีภายนอกหรือตัวแปรส่วนกลาง การใช้งานแต่ละครั้งต้องเป็นแบบ pure และ standalone สิ่งนี้สร้างความตึงเครียดที่น่าสนใจระหว่างแนวปฏิบัติการเขียนโค้ดที่สะอาดและข้อจำกัดเชิงปฏิบัติ
นักพัฒนาคนหนึ่งสังเกตว่าการใช้งาน Rust น่าจะทำงานได้เร็วกว่าเวอร์ชัน C ไม่ใช่เพราะ Rust เร็วกว่าโดยธรรมชาติ แต่เพราะข้อกำหนด self-contained นำไปสู่การเลือกการปรับปรุงประสิทธิภาพที่แตกต่างกัน โค้ด Rust ใช้การดำเนินการ floor เพียงครั้งเดียวด้วย closure ในขณะที่เวอร์ชัน C ต้องใช้การดำเนินการ fmod สองครั้งเพื่อรักษาความสามารถในการอ่านภายในข้อจำกัด
เกินกว่าการหารเวลาแบบง่าย ๆ
โปรเจกต์นี้แก้ไขความเข้าใจผิดทั่วไปเกี่ยวกับการคำนวณวัฏจักรดวงจันทร์ นักพัฒนาหลายคนคิดในตอนแรกว่าสามารถหารเวลาตั้งแต่ Unix epoch ด้วยช่วงเวลาวัฏจักรของดวงจันทร์ได้ อย่างไรก็ตาม วัฏจักรดวงจันทร์เกี่ยวข้องกับการคำนวณทางดาราศาสตร์ที่ซับซ้อนกว่า รวมถึงการแก้สมการ Kepler และการคำนึงถึงกลศาสตร์วงโคจร
อัลกอริทึมมีต้นกำเนิดมาจากโปรแกรม moontool ของ John Walker ในช่วงทศวรรษ 1980 ซึ่งตัวมันเองก็อิงจาก Practical Astronomy With Your Calculator การใช้งานแต่ละครั้งจะส่งคืนอายุของดวงจันทร์ในหน่วยเรเดียน ซึ่งสามารถแปลงเป็นเศษส่วนที่ส่องแสง ชื่อวัฏจักร และการแสดงผลด้วยอีโมจิได้
คุณสมบัติหลักของอัลกอริทึม:
- ส่งคืนค่า "อายุ" ของดวงจันทร์ในหน่วยเรเดียน
- สูตร: (1-cos(x))/2 ให้สัดส่วนการส่องแสง
- อายุของดวงจันทร์เป็นวัน: คูณอายุที่ปรับมาตรฐานแล้วด้วย ~29.5
- อิงจากอัลกอริทึม moontool ของ John Walker ในช่วงปี 1980
- แหล่งที่มาเดิม: "Practical Astronomy With Your Calculator"
การมีส่วนร่วมของชุมชนและการปรับปรุงทางเทคนิค
โปรเจกต์นี้ได้ดึงดูดการมีส่วนร่วมจากชุมชนโปรแกรมมิ่ง รวมถึงการเพิ่ม Raku implementation เมื่อเร็ว ๆ นี้ เวอร์ชัน Raku แสดงให้เห็นคุณสมบัติของภาษาที่สวยงาม รวมถึงการรองรับ Euclidean modulo ในตัวและค่าคงที่ pi แบบเนทีฟ
การอภิปรายทางเทคนิคได้เกิดขึ้นเกี่ยวกับโอกาสในการปรับปรุงประสิทธิภาพ โดยนักพัฒนาบางคนแนะนำว่าการปรับมุมให้เป็นช่วง [0, 2) แทน [0, 360) อาจปรับปรุงทั้งประสิทธิภาพและความแม่นยำ โดยเฉพาะเมื่อใช้ฟังก์ชันคณิตศาสตร์เฉพาะทางอย่าง sinpi และ cospi
โปรเจกต์นี้แสดงให้เห็นว่าข้อจำกัดในการเขียนโปรแกรมสามารถนำไปสู่โซลูชันที่สร้างสรรค์และการเรียนรู้ข้ามภาษาได้อย่างไร ด้วยการใช้อัลกอริทึมเดียวกันในภาษาต่าง ๆ ในขณะที่รักษาข้อกำหนดความบริสุทธิ์ที่เข้มงวด มันให้ข้อมูลเชิงลึกเกี่ยวกับวิธีที่การออกแบบภาษาส่งผลต่อโครงสร้างโค้ดและการแลกเปลี่ยนประสิทธิภาพ