Một lập trình viên đã phát hành bộ sưu tập mã nguồn mở các hàm tính toán pha mặt trăng trên nhiều ngôn ngữ lập trình, được đặt tên là Werewolf Early Warning System. Dự án này triển khai cùng một thuật toán thiên văn trên tám ngôn ngữ khác nhau, từ các ngôn ngữ cấp hệ thống như C++ và Rust đến các ngôn ngữ kịch bản như Python và JavaScript.
Các ngôn ngữ được hỗ trợ:
- Cấp độ hệ thống: C/C++, Rust, Zig
- Scripting: Lua, JavaScript, Python
- DSLs: awk, bc
- Bổ sung gần đây: Raku
Quy tắc copy-paste tạo ra những thách thức lập trình thú vị
Điều làm cho dự án này đặc biệt hấp dẫn là yêu cầu nghiêm ngặt về quy tắc copy-paste. Mỗi hàm phải hoàn toàn độc lập, cho phép các lập trình viên sao chép và dán mã trực tiếp vào dự án của họ mà không cần phụ thuộc hoặc thay đổi môi trường. Ràng buộc này đã khơi dậy cuộc thảo luận giữa các lập trình viên về cách những hạn chế như vậy ảnh hưởng đến phong cách lập trình và hiệu suất.
Yêu cầu này buộc các lập trình viên phải suy nghĩ khác đi về những cách tiếp cận thông thường của họ. Thay vì dựa vào các thư viện bên ngoài hoặc biến toàn cục, mỗi triển khai phải thuần túy và độc lập. Điều này tạo ra một sự căng thẳng thú vị giữa các thực hành mã sạch và các ràng buộc thực tế.
Một lập trình viên nhận xét rằng triển khai Rust có khả năng chạy nhanh hơn phiên bản C, không phải vì Rust vốn dĩ nhanh hơn, mà vì yêu cầu độc lập đã dẫn đến những lựa chọn tối ưu hóa khác nhau. Mã Rust sử dụng một phép toán floor duy nhất với closure, trong khi phiên bản C yêu cầu hai phép toán fmod để duy trì tính dễ đọc trong các ràng buộc.
Vượt ra ngoài phép chia thời gian đơn giản
Dự án giải quyết một quan niệm sai lầm phổ biến về tính toán pha mặt trăng. Nhiều lập trình viên ban đầu cho rằng bạn có thể đơn giản chia thời gian kể từ Unix epoch cho chu kỳ của mặt trăng. Tuy nhiên, các pha mặt trăng liên quan đến các tính toán thiên văn phức tạp hơn, bao gồm việc giải phương trình Kepler và tính đến cơ học quỹ đạo.
Thuật toán có nguồn gốc từ chương trình moontool của John Walker vào những năm 1980, bản thân nó dựa trên Practical Astronomy With Your Calculator. Mỗi triển khai trả về tuổi của mặt trăng tính bằng radian, sau đó có thể được chuyển đổi thành phần chiếu sáng, tên pha và biểu tượng emoji.
Các Tính Năng Chính Của Thuật Toán:
- Trả về "tuổi" của mặt trăng tính bằng radian
- Công thức: (1-cos(x))/2 cho phần được chiếu sáng
- Tuổi mặt trăng tính bằng ngày: nhân tuổi chuẩn hóa với ~29.5
- Dựa trên thuật toán moontool của John Walker từ những năm 1980
- Nguồn gốc: "Practical Astronomy With Your Calculator"
Đóng góp cộng đồng và cải tiến kỹ thuật
Dự án đã thu hút sự đóng góp từ cộng đồng lập trình, bao gồm việc bổ sung gần đây một triển khai Raku. Phiên bản Raku thể hiện một số tính năng ngôn ngữ tinh tế, bao gồm hỗ trợ modulo Euclidean tích hợp và hằng số pi tự nhiên.
Các cuộc thảo luận kỹ thuật đã nổi lên xung quanh các cơ hội tối ưu hóa, với một số lập trình viên gợi ý rằng việc chuẩn hóa góc về phạm vi [0, 2) thay vì [0, 360) có thể cải thiện cả hiệu suất và độ chính xác, đặc biệt khi sử dụng các hàm toán học chuyên biệt như sinpi và cospi.
Dự án chứng minh cách các ràng buộc lập trình có thể dẫn đến các giải pháp sáng tạo và học tập liên ngôn ngữ. Bằng cách triển khai các thuật toán giống hệt nhau trên các ngôn ngữ khác nhau trong khi duy trì các yêu cầu thuần túy nghiêm ngặt, nó cung cấp những hiểu biết sâu sắc về cách thiết kế ngôn ngữ ảnh hưởng đến cấu trúc mã và sự đánh đổi hiệu suất.
Tham khảo: moonphase - Werewolf Early Warning System