นักพัฒนาสร้างเครื่องคำนวณวัฏจักรดวงจันทร์หลายภาษาพร้อมข้อกำหนดฟังก์ชันแบบ Self-Contained ที่เป็นเอกลักษณ์

BigGo Editorial Team
นักพัฒนาสร้างเครื่องคำนวณวัฏจักรดวงจันทร์หลายภาษาพร้อมข้อกำหนดฟังก์ชันแบบ Self-Contained ที่เป็นเอกลักษณ์

นักพัฒนาได้เปิดตัวชุดฟังก์ชันคำนวณวัฏจักรดวงจันทร์แบบโอเพนซอร์สที่รองรับหลายภาษาโปรแกรมมิ่ง ซึ่งมีชื่อว่า 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

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

อ้างอิง: moonphase - Werewolf Early Warning System