บทนำ
Juniper เป็นภาษา functional reactive programming ที่พัฒนาขึ้นที่ Tufts University โดย Caleb Helbling และ Louis Ades โปรเจกต์นี้ได้รับการพัฒนาขึ้นสำหรับวิชา computer science senior design ตลอดทั้งปี โดยมี Dr. Samuel Guyer เป็นที่ปรึกษาและพี่เลี้ยงสำหรับโปรเจกต์นี้ การนำเสนอของเขาในปี 2015 เป็นจุดเริ่มต้นของโปรเจกต์นี้:
Juniper เป็นภาษา functional reactive programming (FRP) ที่มุ่งเป้าไปที่ Arduino และระบบ microcontroller ที่เกี่ยวข้อง Juniper มีคุณสมบัติระดับสูงหลายอย่าง รวมถึง parametric polymorphic functions, anonymous functions, automatic memory management และ immutable data structures นอกจากนี้ยังมี standard library ที่มีฟังก์ชันการประมวลผลสัญญาณ FRP ที่มีประโยชน์มากมาย Juniper ถูกแปลเป็น C++ มาตรฐาน และคอมไพล์ด้วยเครื่องมือพัฒนา Arduino ที่มีอยู่ ทำให้โปรแกรม Juniper สามารถทำงานได้บนอุปกรณ์ที่มีข้อจำกัดด้านทรัพยากร และช่วยให้สามารถทำงานร่วมกันได้อย่างราบรื่นกับ C++ libraries ที่มีอยู่สำหรับอุปกรณ์เหล่านี้
มีการตีพิมพ์งานวิจัยเกี่ยวกับภาษา Juniper ที่ ACM SIGPLAN International Workshop on Functional Art, Music, Modelling and Design (FARM) และมีการนำเสนอผลงานในเดือนกันยายนที่ International Conference on Functional Programming (ICFP) ณ เมืองนาระ ประเทศญี่ปุ่น ขณะนี้เอกสารงานวิจัยและบทความดังกล่าวได้เผยแพร่บนเว็บไซต์ของ Juniper แล้ว:
http://www.juniper-lang.org/publications/juniper_farm_preprint.pdf
วิดีโอ
เอกสารงานวิจัยและการนำเสนอได้ให้ข้อสังเกตที่สำคัญเกี่ยวกับสถานะปัจจุบันของการเขียนโปรแกรม Arduino ดังนี้:
- ฟังก์ชันที่ใช้ delay() ไม่สามารถประกอบเข้าด้วยกันได้
- การรวมกิจกรรมพร้อมกันเข้ากับรูปแบบการเขียนโค้ด Arduino ในปัจจุบันจำเป็นต้องมีการจัดกำหนดการที่ชัดเจน ซึ่งนำไปสู่ภาระทางปัญญาที่สำคัญสำหรับโปรแกรมเมอร์
- โปรแกรมใดๆ ที่มีความซับซับซ้อนพอสมควรสำหรับ Arduino จะประกอบด้วย ad hoc event scheduler และ finite state machine
- รูปแบบการเขียนโปรแกรม Arduino ในปัจจุบันทำให้การแยกตรรกะการกำหนดเวลา (event scheduler) ออกจากส่วนที่เหลือของโค้ดทำได้ยาก ซึ่งนำไปสู่ปัญหา "spaghetti code" ที่ขึ้นชื่ออย่างรวดเร็ว
นี่คือคำกล่าวที่น่าสนใจจากเอกสาร:
ในเอกสารนี้ เรานำเสนอภาษาใหม่ที่ชื่อ Juniper สำหรับการเขียนโปรแกรม Arduino และ microcontrollers ที่คล้ายกัน เราใช้ประโยชน์จากข้อสังเกตว่าโปรแกรม Arduino จำนวนมากเป็นแบบ reactive: โดยจะตอบสนองต่อสัญญาณขาเข้า ประมวลผลสัญญาณเหล่านั้น และสร้างสัญญาณขาออกใหม่ การใช้สภาพแวดล้อม C++ ที่มีอยู่ ทำให้โปรแกรมเหล่านี้กลายเป็นโค้ด “spaghetti” อย่างรวดเร็ว ซึ่งขาดความเป็น modularity และยากต่อการทำความเข้าใจ Juniper แก้ปัญหานี้โดยใช้ functional reactive programming (FRP) ใน FRP โปรแกรมจะตอบสนองต่อเหตุการณ์โดยการกระจายค่าไปตาม signals หรือ behaviors ใน directed graph Signals และ behaviors สามารถคิดได้ว่าเป็นค่าที่เปลี่ยนแปลงตามเวลาในโปรแกรม Nodes ใน directed graph แสดงถึงฟังก์ชันที่แมป signals ไปยัง signals ใหม่ ส่วนที่เป็นอิสระของ signal graph สามารถทำงานแบบ asynchronous ได้ ให้ concurrency โดยไม่ต้องใช้ความพยายามเพิ่มเติมจากโปรแกรมเมอร์ Higher-order functions เช่น map, fold และ filter ให้พลังในการแสดงออกและการนำกลับมาใช้ใหม่ในอีกระดับหนึ่ง
สรุป
compiler และเอกสารประกอบมีให้ดาวน์โหลดบนเว็บไซต์ของ Juniper: http://www.juniper-lang.org/
รายละเอียดทางเทคนิคเพิ่มเติม
ตรรกะแบบ Reactive ระดับสูง
Juniper เป็นภาษา functional reactive programming (FRP) เฉพาะทางที่ให้วิธีการเขียน Arduino firmware ที่ซับซ้อนได้อย่างปลอดภัยและสื่อความหมายได้ดีขึ้น
- Event-Driven Signal Pipeline: แตกต่างจาก C++ มาตรฐาน Juniper ใช้ "Signals" เพื่อจัดการสถานะฮาร์ดแวร์ เมื่อเซ็นเซอร์เปลี่ยนค่า สัญญาณจะแพร่กระจายผ่าน logic tree โดยอัตโนมัติ ลดความจำเป็นในการใช้ spaghetti code
- Memory Safety Core: ภาษานี้ออกแบบมาเพื่อป้องกันข้อผิดพลาดทั่วไปที่ฝังอยู่ในระบบ เช่น null-pointer dereferences หรือ buffer overflows โดยจะถูกคอมไพล์เป็นโค้ด C++ ที่มีประสิทธิภาพสำหรับเป้าหมาย Arduino
ขั้นตอนการพัฒนา
- PlatformIO Integration: ใช้ประโยชน์จาก PlatformIO ecosystem เพื่อการคอมไพล์และการปรับใช้ที่รวดเร็ว ทำให้เหมาะสำหรับโปรเจกต์ firmware ขนาดใหญ่ที่ต้องการตรรกะที่สะอาดและดูแลรักษาง่าย