การสร้าง DSL: เขียนสคริปต์บนภาษาที่ใช้งานทั่วไปหรือแบบสแตนด์อโลน


10

ฉันกำลังถกเถียงกันเรื่องการออกแบบภาษาเฉพาะโดเมนเพื่อทำให้รูปแบบการเขียนโปรแกรมไม่ชัดเจนและง่ายขึ้น ส่วนหนึ่งของการอภิปรายคือการสร้าง (เป็นสคริปต์) บนภาษา / รันไทม์ที่มีอยู่ (เช่น Java) หรือเพื่อให้เป็นแบบสแตนด์อโลน (คอมไพเลอร์ของตัวเอง & c)

ผู้ที่มีประสบการณ์การออกแบบ DSL คุณมีข้อดี / ข้อเสียและหรือคำตอบที่แน่นอนสำหรับวิธีการที่เหมาะสมหรือไม่?


ใครคือผู้บริโภคของ DSL นี้ และอะไรคือโฮสต์ที่มีศักยภาพ (คุณพูดถึง Java, คุณกำลังพิจารณาความเป็นไปได้อื่น ๆ )?
Mauricio Scheffer

ฉันพิจารณาความเป็นไปได้ใด ๆ สำหรับโฮสต์ ผู้บริโภคจะเป็นผู้เขียนโปรแกรมแบบอะซิงโครนัส (ข้อความที่มีปลายทาง)
Jé Queue

คำตอบ:


9

ฉันขอแนะนำให้สร้าง DSL ของคุณด้วยภาษาที่มีอยู่ (DSL ภายใน) ฉันทำสิ่งนี้สองสามครั้งกับ Python สร้างระบบที่ผู้บริโภคของ DSL เขียนไฟล์หลามที่ใช้เป็นไฟล์กำหนดค่าสำหรับระบบ ไฟล์กำหนดค่าใช้โครงสร้าง (คลาส, ฟังก์ชั่น) ที่ฉันได้กำหนดไว้ โครงสร้างเหล่านี้สร้างจาก DSL

IMO ภาษาเช่น Python (IronPython หรือ Jython หากระบบโฮสต์คือ. NET หรือ Java) หรือ Ruby (IronRuby, JRuby) จะดีกว่าสำหรับการอ้างอิง DSL ของคุณบน Java หรือ C #

ในกรณีของฉันระบบโฮสต์ก็เป็น (C) Python ดังนั้นการเลือก Python สำหรับ DSL นั้นเป็นเรื่องธรรมดา

ข้อดีบางประการ:

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

ฉันเป็นคนไม่เชื่อเรื่องภาษา แต่ทำไมคุณถึงคิดว่าสาขางูใหญ่เหมาะกว่า?
Jé Queue

1
ดีกว่าเหมาะกว่าอะไร ฉันเดาว่า Ruby และ Python มีประโยชน์เหมือนกันหลายอย่างทับทิมอาจจะเหมาะกว่าสำหรับ DSL ภายในเพราะมีความยืดหยุ่นมากกว่า สำหรับ Java และ C # ฉันเห็นอินเทอร์เฟซที่คล่องแคล่วมากมายในภาษาเหล่านั้น (และมีการสร้างในเวอร์ชันที่ใหม่กว่าซึ่งทำให้การสร้าง DSL ภายใน / ใช้ง่ายขึ้นเช่นไวยากรณ์ของเครื่องมือเริ่มต้น) - IMO ภาษา "พิธีต่ำ" เหมาะกว่าเล็กน้อยกว่าภาษา "พิธีสูง"
codeape

1
ฉันเลือก C # เพื่อใช้ DSL ภายในอย่างแม่นยำเพื่อใช้ประโยชน์จากการตรวจสอบชนิดคงที่เวลารวบรวมแบบไม่มีค่าใช้จ่าย DSL ภาษาไดนามิกไม่ได้ให้ประโยชน์มากเกินไปกว่า DSL ภายนอก
Den

@Den นั่นคือสิ่งที่ฉันผิดหวังเมื่อฉันพยายามทำ iDSL ใน Python ใน Java ของคุณ iDSL รู้สึกว่าได้รับการสนับสนุนจาก IDE ทันที ไม่พบ IDE ที่จะทำเช่นนั้นกับ Python
candied_orange

2

ดูXtext (http://www.eclipse.org/Xtext/) และXbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html) หากผู้ใช้ไม่ใช่โปรแกรมเมอร์ฉันไม่คิดว่าคุณควรใช้ DSL กับภาษาการเขียนโปรแกรมที่มีอยู่ มันจะซับซ้อนเกินไปสำหรับพวกเขา DSL "สะอาด" อาจมีประสิทธิภาพมากหากทำอย่างถูกต้อง


2

แทนที่จะแนะนำวิธีการเฉพาะให้ฉันแนะนำภาษาโดเมนเฉพาะของ Martin Fowler เป็นทรัพยากรที่ยอดเยี่ยมสำหรับการตัดสินใจ มีการตรวจสอบที่ครอบคลุมและกระตุ้นความคิดเกี่ยวกับข้อดีที่สัมพันธ์กันของ DSL ภายในและภายนอก


1

มีตัวเลือกที่สาม - สร้าง DSL เป็นคอมไพเลอร์บนภาษาวัตถุประสงค์ทั่วไป ภาษาใดก็ตามที่มีความสามารถในการใช้โปรแกรม metaprogramming ในระดับที่เหมาะสมก็จะทำงานเช่นเดียวกับ C ++ ฉันชอบเสียงกระเพื่อมและภาษาที่คล้ายกันสำหรับสิ่งนี้ แต่ Template Haskell หรือ Nemerle สามารถให้ความยืดหยุ่นในระดับเดียวกันได้เช่นกัน


1

ในหนังสือของเขา "ภาษาเฉพาะโดเมน" Martin Folwer อธิบายDSL ภายในและภายนอก
Internal DSL= เป็นชุดย่อยของภาษาการเขียนโปรแกรมที่มีอยู่เช่น Ruby / Java เป็นต้น
External DSL= คุณกำหนดไวยากรณ์และคำศัพท์
DSL ภายนอกสามารถแสดงออกได้มากกว่า แต่สามารถแยกวิเคราะห์ภายนอกและสร้างรหัสได้
ในขณะที่ DSL ภายในไม่ต้องการการประมวลผลเพิ่มเติม แต่บางครั้งก็ยากที่จะเข้าใจสำหรับผู้เชี่ยวชาญด้านโดเมนที่ไม่ใช่การเขียนโปรแกรม (เช่นนักวิเคราะห์ธุรกิจผู้ทดสอบ)

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.