คำถามเกี่ยวกับการสร้างภาษาสคริปต์


12

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

ฉันหมายถึงมีเอกสารมาตรฐานที่อธิบายภาษาการเขียนโปรแกรม / สคริปต์ใหม่หรือไม่?


เนื่องจากนี่เป็นเรื่องเกี่ยวกับการเขียนโปรแกรมไม่ใช่โปรแกรมเมอร์นี่น่าจะเหมาะกับ StackOverflow มากขึ้น
Muad'Dib

14
ฉันไม่เห็นด้วยกับ Muad'Dib ฉันคิดว่านี่เป็นสถานที่ที่ดีสำหรับคำถามนี้
Chris

5
ฉันคิดว่าแทนที่จะประดิษฐ์ภาษาสคริปต์ของคุณเองด้วยค่าใช้จ่ายจำนวนมากสำหรับคุณและผู้ใช้ของคุณต้องเรียนรู้ภาษาใหม่คุณควรฝังภาษาสคริปต์ที่มีอยู่ให้ดีขึ้น บางภาษาเช่น Python, Javascript / ECMAScript ได้รับการออกแบบเพื่อให้สามารถฝังลงในกรอบงานที่ใหญ่ขึ้นได้ สรุปแล้วคุณจะต้องออกแบบ API และหาวิธีฝังตัวแปลสคริปต์ลงในโปรแกรมของคุณเอง
Lie Ryan

1
มีความได้เปรียบในการทำเช่นนี้หากภาษานั้นเป็น DSL สำหรับภาษาทั่วไปไม่มาก แน่นอนว่าบางภาษาทั่วไปเป็นฐานที่ดีสำหรับ DSL เช่น Lisp หรือ TCL
jk

คำตอบ:


16

สิ่งที่คุณต้องเขียนเรียกว่าสเปคภาษา

มันควรจะมีคำอธิบายของไวยากรณ์ของภาษา (โดยเฉพาะอย่างยิ่งในExtended Backus-Naur-Form ) และความหมายของมัน

สำหรับส่วนหลังคุณอาจจะเขียนคำอธิบายในคำพูดของคุณเอง ( แต่ดูแลจะแม่นยำ) หรือความหมายอย่างเป็นทางการ


1
BNF มีประโยชน์สำหรับไวยากรณ์ฟรีเนื้อหาเท่านั้น, ภาษาสคริปต์ไม่ได้มีบริบทฟรีเสมอไปเช่น TCL (แม้ว่าฉันคิดว่าคุณยังคงสามารถโต้แย้งได้ว่ามันเป็นที่นิยมมากกว่าที่จะมีภาษาบริบทฟรีในกรณีส่วนใหญ่)
jk

@jk ฉันจะไม่บอกว่า BNF ไร้ประโยชน์อย่างสิ้นเชิงสำหรับภาษาที่ไม่มีบริบท ทั้งนี้ขึ้นอยู่กับว่าไวยากรณ์นั้นไม่ทำให้บริบทว่าง แต่ยังคงสามารถระบุได้ใน EBNF และแก้ไขความคลุมเครือในคำต่างๆ นั่นคือสิ่งที่มาตรฐาน C ++ ทำเช่นกัน ในกรณีส่วนใหญ่ฉันคิดว่ามันยังชัดเจนกว่าการอธิบายทุกอย่างด้วยคำพูดหรือการระบุโดยใช้ไวยากรณ์ที่ไวต่อบริบทหรือไม่ จำกัด
sepp2k

ความจริงประเด็นของฉันคือมากกว่านั้นมีภาษาเช่น lisp, tcl หรือ out (ที่จริงดีมากสำหรับการกำหนด DSLs ใน) ที่มีไวยากรณ์ที่เลวลงและ BNF บอกคุณน้อยมาก
jk

@jk แน่นอน แต่ในกรณีนั้นวิธีอื่นใดในการอธิบายไวยากรณ์จะบอกคุณอย่างเท่าเทียมกันเพียงเพราะมีน้อยมากที่จะบอก นั่นหมายความว่าส่วนของไวยากรณ์ของข้อมูลจำเพาะจะสั้นมาก
sepp2k

13

คุณจะต้องต่อไปนี้:

  • เหตุผลในการสร้างภาษาใหม่
  • ปรัชญา
  • ความหมายความหมาย
  • คำอธิบายศัพท์ของโทเค็นของคุณ
  • คำนิยามการวิเคราะห์ไวยากรณ์

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

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

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

คุณจะต้องมีพื้นฐานทางทฤษฎี / ผู้เรียบเรียงภาษาเพื่อที่จะรู้ว่าจะไม่ทำอะไร ตัวอย่าง ได้แก่ ไวยากรณ์ที่ไม่ชัดเจนการสร้าง AST และปัญหาการจัดการและโดยทั่วไปจะทำให้ชีวิตง่ายขึ้นสำหรับตัวคุณเอง การรู้ทฤษฎีนั้นสำคัญมาก ฉันจะลองพิจารณาสิ่งต่อไปนี้เพื่อเริ่มต้น:

Compilers: หลักการเทคนิคและเครื่องมือ (Dragon Book)
การใช้งานคอมไพเลอร์สมัยใหม่ใน Cหรือการใช้งานคอมไพเลอร์สมัยใหม่ใน Java


1
+1 สำหรับปรัชญาสำหรับ DSL คุณต้องการระบุโดเมนที่นี่
jk

8

99.9% ของเวลาที่สร้างภาษาใหม่นั้นไม่จำเป็นเลย ผลตอบแทนจากการลงทุนน่าจะน้อยมากและคุณจะเสียเวลา

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

การสร้างภาษาใหม่เกือบจะไม่ดีเสมอไป


9
ยกเว้นในกรณีที่ไม่เลว การสร้าง DSL ที่เรียบง่ายของคุณเองนั้นมีประโยชน์มาก ตอนนี้การสร้างภาษาสำหรับวัตถุประสงค์ทั่วไปของคุณจะสอดคล้องกับคำตอบของคุณมากขึ้น
ChaosPandion

@ChaosPandion แต่มีหลายภาษาที่เก่งในการสร้าง DSL ที่ใช้รหัสจากภาษานั้น (เช่น ruby ​​ดีในเรื่องนี้)
ทางเลือก

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

การสร้างภาษาใหม่นั้นเป็นทางออกที่ดีที่สุด en.wikipedia.org/wiki/Language-oriented_programming
SK-logic

3

คุณสามารถอธิบายไวยากรณ์ภาษาของคุณในBNF

ตัวอย่างนี้เป็นไวยากรณ์


6
ไวยากรณ์เองนั้นมีข้อมูลไม่เพียงพอที่จะใช้ภาษา เขาจะต้องระบุความหมายไม่ทางใดก็ทางหนึ่ง
sepp2k

0

หากคุณใช้. NET นี่คือสิ่งที่ฉันสะดุดเมื่อเวลาผ่านไป ฉันเพียงให้มันได้อย่างรวดเร็วอยากรู้อยากเห็น แต่บางทีมันอาจจะเป็นประโยชน์กับคุณ: ประชด

Irony เป็นชุดพัฒนาสำหรับการนำภาษาไปใช้งานบนแพลตฟอร์ม. NET

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