เมื่อใดที่เหมาะสมในการสร้างภาษาโปรแกรมของฉันเอง


48

มีประเภทของแอพพลิเคชั่นนักฆ่า, คลาสของปัญหาอัลกอริทึม, ฯลฯ ซึ่งจะดีกว่าในระยะยาวเพื่อสร้างภาษาของตัวเอง?

PS: เพื่อให้แน่ใจว่าฉันหมายถึงภาษาการเขียนโปรแกรมใหม่และคอมไพเลอร์ไม่ใช่คอมไพเลอร์ใหม่สำหรับภาษาที่มีอยู่

แก้ไข : ขอบคุณสำหรับคำตอบ คุณสามารถให้ตัวอย่างบางส่วนได้โดยไม่จำเป็นต้องสร้าง DSL หรือกรณีที่ DSL อาจเป็นแนวคิดที่ดีได้หรือไม่?


8
ฉันเชื่อว่าควรสร้าง DSL สำหรับทุกปัญหา
SK-logic

4
นี่ไม่ใช่สิ่งที่ LISP เหมาะสำหรับใช่หรือไม่
Darknight

1
@Darknight ไม่จำเป็นต้องกระเพื่อม - ภาษาใด ๆ ที่มีความสามารถในการสื่อสารผ่าน metaprogramming ที่ดีก็โอเค
SK-logic

2
เมื่อคุณมีความปรารถนาที่จะเรียนรู้เกี่ยวกับการรวบรวมภายใน
dan_waterworth

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

คำตอบ:


40

แน่นอนว่ามันเกี่ยวข้องกับบุคคลที่จะเขียนภาษาของตนเองเพื่อการศึกษา เพื่อเรียนรู้เกี่ยวกับการออกแบบโปรแกรมภาษาและการออกแบบคอมไพเลอร์ แต่การใช้งานจริงนั้นมีอยู่ไม่มาก

ในการเขียนภาษาของคุณเองคุณคือ:

  • การเพิ่มความซับซ้อนให้กับปัญหาของคุณ
  • การเพิ่มจำนวนงานเขียนและการบำรุงรักษาภาษาและคอมไพเลอร์ใหม่จำนวนมาก

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

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


13
ฉันต้องพูดถึงว่าใน "The Pragmatic Programmer" ที่เขียนภาษาเฉพาะโดเมนขนาดเล็กเพื่อช่วยในงานมีประโยชน์และสนับสนุนอย่างไม่น่าเชื่อ ฉันจะไม่แนะนำให้เขียนภาษาที่ใช้งานทั่วไปอย่างเต็มรูปแบบ แต่ภาษาที่สร้างรหัสอาจมีประโยชน์ในบางครั้ง
Jordan Parmer

4
มันเป็นเรื่องโกหก การเขียนภาษาไม่ได้เพิ่มความซับซ้อน - ปกติแล้วมันจะลดความซับซ้อนลงอย่างมาก การนำคอมไพเลอร์มาใช้และบำรุงรักษามันเป็นงานชิ้นเล็ก ๆ อยู่แล้ว
SK-logic

3
@ SK-logic, "การนำคอมไพเลอร์มาใช้และบำรุงรักษามันเป็นงานชิ้นเล็ก ๆ อยู่แล้ว" คุณเคยลองไหม โปรเซสเซอร์อะไร?

1
@ Thorbjørn Ravn Andersen ฉันทำเพื่อหาเลี้ยงชีพ ทุกวันนี้คุณไม่จำเป็นต้องกำหนดเป้าหมาย CPU ใด ๆ โดยตรงเนื่องจากมี VMs ที่ดีเช่น LLVM, .NET หรือแม้แต่ JVM และถ้าคุณจะไม่ทำออปติไมซ์ราคาแพงมากเกินไปการกำหนดเป้าหมาย CPU "ของจริง" ไม่ใช่เรื่องใหญ่ - ดูคอมไพเลอร์ OCaml สำหรับตัวอย่างของวิธีการดั้งเดิมนี้
SK-logic

7
@ Thorbjørn Ravn Andersen โดยผู้แปลความหมายแปลจากภาษาหนึ่งเป็นอีกภาษาหนึ่ง ระดับของภาษาเป้าหมายนั้นไม่สำคัญอะไรเลย และไม่มีใครที่มีสติจะใช้คอมไพเลอร์ที่ปรับแต่งแบ็คเอนด์ให้เหมาะสมสำหรับ DSL - มันจะเป็นการดีกว่าที่จะนำมาใช้ใหม่ อันที่จริงแล้ว DSL ที่ทันสมัยส่วนใหญ่จะถูกคอมไพล์เป็น C สำหรับแอสเซมเบลอร์และตัวเชื่อมโยง - พวกเขาได้รับการพิจารณาแยกจากการคอมไพล์มาตั้งแต่วันแรก ๆ ของการเขียนโปรแกรมระบบ
SK-logic

24

ให้ฉันอ้างอิง Paul Vick ผู้พัฒนาหัวหน้าของคอมไพเลอร์ VB และตอนนี้ทำงานกับ Project Oslo และภาษา M:

มันยากที่จะสร้างภาษาใหม่อย่างเหลือเชื่อแม้กระทั่งภาษาที่มีพื้นฐานมาจากภาษาที่มีอยู่ แต่โปรแกรมเมอร์หลายคนคิดว่า“ เฮ้ฉันใช้ภาษาแล้วมันจะยากขนาดไหน?” แล้วก็ไปที่มัน ... อาจจะมากกว่า 98% ของพวกเขาล้มเหลวที่จะได้รับแรงดึงดูดใด ๆ แต่พระเจ้าอวยพรคนที่มองโลกในแง่ดีเพราะหากไม่มีพวกเขาเราจะไม่ได้รับ 2% ของภาษาที่ประสบความสำเร็จ ฉันยินดีที่จะเสียสละเวลาหลายล้านดอลลาร์และเสียเวลาไปกับภาษาที่ไม่เคยทำมาก่อนเพื่อที่เราจะได้รับภาษาอย่าง C # และ Java และ Ruby และ Python และอื่น ๆ

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

DSL: เป็นความคิดที่แย่จริงๆ!


8
VB! = VBA มันเป็นเรื่องถูกกฎหมายหรือไม่ที่จะวิจารณ์ VBA บนเว็บไซต์นี้ ท้ายที่สุดโจเอลช่วยพัฒนามันใช่ไหม?
Konrad Rudolph

1
แม้ว่าโปรแกรมเมอร์ในทางปฏิบัตินั้นเป็นหนังสือที่ดี แต่คำแนะนำของ DSL ในหนังสือเล่มนั้นก็โง่ธรรมดา ในทำนองเดียวกันกับที่พวกเขาแนะนำให้เรียนภาษาใหม่ทุก ๆ ปี IMHO ก็ค่อนข้างโง่เช่นกัน
ดร. ชั่วร้าย

2
ฉันเพิ่งแก้ไขคำตอบของคุณให้ชี้ไปที่บทความของ Paul Vickอีกครั้งแทนที่จะเป็นแคช Google ในปี 2011 เขา "รีเซ็ตบล็อกของเขา" และลบเนื้อหา VB ทั้งหมด แต่ในปี 2012 เขานำมันกลับมาแม้ว่าจะมี URL ที่แตกต่างกัน ดูเหมือนว่าเขาจะมีช่วงเวลาที่ยากลำบากเมื่อเขาลบสิ่งนั้น
MarkJ

2
@ MarkJ ขอบคุณมาก และว้าวบทความนั้นไม่ได้ทำให้การอ่านน่าพอใจ หวังว่าเขาจะทำได้ดีขึ้นในขณะนี้
Konrad Rudolph

2
ขอบคุณสำหรับความคิดเห็นที่ดีตอนนี้ฉันกำลังทำงานกับ JavaScriptและใช่สิ่งต่าง ๆ ค่อนข้างดีขึ้น :-) ไม่แน่ใจว่าทำไมลิงค์เดิมใช้งานไม่ได้ฉันพยายามที่จะทำให้ลิงค์สไตล์เก่า ๆ ใช้งานได้ฉันจะลองดู
panopticoncentral

22

เมื่อใดที่เหมาะสม

เมื่อคุณรู้สึกว่ามัน!

อย่าฟังคนเหล่านี้ที่มีความคิดเห็นที่น่ารำคาญที่พูดโดยทั่วไปว่า:

"อย่าทำอย่างนั้นเพราะมันยากเกินไปและภาษา X ดีกว่าภาษาใด ๆ ที่คุณคิดได้"

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

หาก "ไม่ทำ" เป็นคำตอบที่ถูกต้องเราทุกคนจะเขียนภาษาโคบอลและฟอร์แทรน


3
จริงๆ? ฉันจะพิจารณากรอบแมโครและหน้าที่ทั้งหมดเป็นสิ่งที่ช่วยให้ภาษารักษาความเป็นอิสระของโดเมน
CurtainDog

3
@CurtainDog มันจะกลายเป็นส่วนหนึ่งของภาษาเท่านั้นหากเป็นส่วนหนึ่งของไลบรารีมาตรฐาน มิฉะนั้นจะเป็น "ภาษาถิ่น" ของภาษา

9

คุณอาจต้องการอ่านบางส่วนของหนังสือ DSL ที่กำลังจะมาถึงของMartin Fowlerหากคุณกำลังคิดที่จะเขียนภาษาของคุณเอง

ฉันไม่สามารถนึกถึงกรณีศึกษาทางธุรกิจเพื่อสร้างภาษาจากศูนย์อื่นนอกเหนือจากการเป็นประสบการณ์การเรียนรู้ที่ยิ่งใหญ่

แก้ไข: สำหรับ DSL มีกรณีธุรกิจมากมาย แต่กุญแจสำคัญในที่นี้คือไม่ต้องดำเนินการและทำให้ง่ายขึ้น


7

ฉันแนะนำว่าคำถามสำคัญคือ "ฉันพยายามแก้ไขปัญหาอะไร?" และ "ใครจะได้รับ ROI"

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


7

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

ทำไมไม่เขียนเป็นภาษาอย่าง Lisp ที่ให้คุณขยายภาษาเมื่อคุณค้นพบรูปแบบใหม่? จากนั้นคุณจะได้รับพลังทั้งหมดของภาษาใหม่ที่มีประโยชน์ทั้งหมดของภาษาที่จัดตั้งขึ้น


6

เหตุผลหนึ่งอาจสร้างเป็นแบบทดสอบเพื่อเรียนรู้เกี่ยวกับการออกแบบภาษาและการสร้างคอมไพเลอร์

อีกเหตุผลหนึ่งก็คือการสร้างภาษาสคริปต์ลงในแอปพลิเคชันเมื่อคุณไม่มีตัวเลือกในการเพิ่ม API ของบุคคลที่สาม


6

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

  • ภาษาคืออะไร
    คำศัพท์ไวยากรณ์และความหมาย

ภาษาปิด -the-shelf เช่น VB, Java, C #, ฯลฯ เป็นเพียงฐานภาษา ทันทีที่คุณเพิ่มคลาสวิธีการ ฯลฯ คุณจะได้เพิ่มคำศัพท์และความหมาย มีหลายวิธีในการติดตั้งภาษา - การแยกวิเคราะห์ & แปล, การแยก & การตีความ, มาโครด้านบนของภาษาที่มีอยู่, เพิ่มคลาส & วิธีการในภาษาที่มีอยู่

  • คุณต้องการให้ภาษาทำอะไร
    เป็นคนดีสำหรับการแสดงปัญหาอย่างรัดกุม

คุณจะรู้ได้อย่างไรว่าคุณทำสิ่งนี้? วัดที่ผมใช้เป็นแก้ไขนับ หากข้อกำหนดหนึ่งประโยค A มาพร้อมกันฉันจะใช้ข้อกำหนดในโค้ดต่อไป เมื่อฉันเสร็จแล้วและได้รับข้อผิดพลาดทั้งหมดฉันตรวจสอบในรหัสและที่เก็บรหัสให้ฉันรายการของการเปลี่ยนแปลงที่ฉันทำ B. บีที่เล็กกว่าคือภาษาที่ดีกว่า ค่าเฉลี่ยเหนือความต้องการจริง & เป็นไปได้วัดนั้นบอกฉันว่า "โดเมนเฉพาะ" เป็นอย่างไร

  • ทำไมความกระชับจึงดี
    เพราะมันช่วยลดข้อบกพร่อง

หากใช้การเปลี่ยนแปลงรหัส N เพื่อดำเนินการตามข้อกำหนด 1 ครั้งและบางครั้งคุณทำผิดพลาดจำนวนข้อผิดพลาดที่คุณแนะนำจะเป็นสัดส่วนประมาณ N ในขอบเขตที่ N = 1 เป็นไปไม่ได้ที่จะแนะนำบั๊กโดยไม่พยายาม

โปรดทราบว่านี่เป็นความท้าทายโดยตรงสำหรับ "รหัสขยาย" ที่เราเห็นทุกวันนี้

เพิ่ม:ในการตอบสนองต่อการร้องขอของคุณสำหรับตัวอย่างที่เห็นการดำเนินการที่แตกต่างกัน ฉันจะไม่บอกว่ามันสามารถเข้าใจได้อย่างรวดเร็ว แต่มันลดรหัส UI อย่างมาก


หากข้อกำหนดหนึ่งประโยคมีอยู่เราทุกคนต่างเขียนโค้ดเป็นภาษาอังกฤษ เช่นเดียวกับภาษามนุษย์รหัสต้องใช้จำนวนมากสำเร็จรูปเพื่อให้มีความหมายใด ๆ
CurtainDog

@Dog: จากมุมมองของ AI นั่นจะเป็นอุดมคติ ดูการดำเนินการที่แตกต่างกัน นั่นเป็นตัวอย่างที่แท้จริงของการตัดซอร์สโค้ดตามลำดับความสำคัญ หม้อต้มอาจจำเป็น แต่ก็ไม่ดี
Mike Dunlavey

5

เป็นไปได้เสมอ "เป็นไปได้" ในการใช้คำในคำถาม (ต้นฉบับ) ของคุณ แต่มันไม่ค่อยมีประโยชน์และไม่ค่อยดีนักเนื่องจากมีภาษาและกรอบงานที่ได้รับการสนับสนุนเป็นอย่างดีและครบกำหนด

มันเป็นความท้าทายทางปัญญาที่น่าสนใจ


โอ๊ะขอโทษด้วย ผู้พูดที่ไม่ใช่เจ้าของภาษา ... :)
Daniel Rikowski

โอ้ไม่ทราบและโพสต์ของคุณเป็นภาษาอังกฤษที่ยอดเยี่ยมยากที่จะบอก ไม่พยายามเป็นตำรวจไวยากรณ์เหมือนกัน - ขอโทษ
ไซมอน

5

เฉพาะในกรณีที่ธุรกิจหลักของทีมของคุณคือภาษาการเขียนโปรแกรม

ฉันทำงานเกี่ยวกับภาษาการเขียนโปรแกรมที่สร้างขึ้นใน บริษัท ทางการเงิน

เห็นได้ชัดว่าสำหรับสถาปนิกเองนี่เป็นความท้าทายที่ยิ่งใหญ่และพัฒนาทักษะของเขาเอง

อย่างหลีกเลี่ยงไม่ได้ภาษาไม่สามารถเติบโตหรือปรับปรุงที่ใดก็ได้ใกล้กับอัตราที่บางอย่างเช่น C # หรือ Java สามารถทำได้ - พวกเขามีทีมที่ทุ่มเทในการทำเช่นนั้น

ภาษาซบเซาในไม่ช้าเนื่องจากไม่มีใครอยากเข้ามาทำงานปรับปรุงโครงการสัตว์เลี้ยงของคนอื่น

สถาปนิกเดิมออกไป ภาษาเหี่ยวเฉาและตายไปหลังจาก 10 ปี

10 ปีที่ผ่านมาเป็นช่วงเวลาที่เลวร้ายสำหรับทุกคนที่มีโชคร้าย

ดังนั้นไปข้างหน้าสร้างภาษาของคุณเอง แต่โปรดอย่าขอให้คนอื่นใช้จริง โปรดอย่าคาดหวังว่าคนอื่นจะขอบคุณคุณ


1
กรณีศึกษาที่น่าสนใจ ... อาจทำให้เกิดภาวะชะงักงันเช่นนี้ได้โดยการกำหนดเป้าหมายภาษาเพื่อพูดแพลตฟอร์ม Java หรือ. NET ด้วยวิธีนี้ภาษาสามารถ 'เติบโต' เมื่อมีการเพิ่มมากขึ้นในไลบรารีฐาน
CurtainDog

2
ฉันไม่แน่ใจว่าทำไมคุณต้องการสร้างภาษาที่กำหนดเป้าหมายเป็นภาษาอื่นเช่น Java ทำไมไม่เพียงใช้ Java หรือ C # เพื่อเริ่มต้นด้วย

4

การออกแบบภาษาเป็นเรื่องสนุก แต่คุณไม่จำเป็นต้อง จำกัด ภาษาโปรแกรม

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


4

มันสมเหตุสมผลอย่างสมบูรณ์ถ้าทำเพื่อขยายทักษะของคุณและเพื่อเรียนรู้

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

และคุณอาจผิดด้วยเช่นกัน แต่คุณต้องมีผู้เชี่ยวชาญคนอื่นเพื่อโน้มน้าวคุณในเรื่องนั้น (หรือแสดงให้คุณเห็นว่าคุณไม่ใช่ผู้เชี่ยวชาญที่คุณคิดว่าคุณเป็น) การสนทนาที่มีชีวิตชีวาซึ่งไม่ใช่ Q-and-A อย่างที่คุณจะหาได้จากที่นี่


4

ยกเว้นเพื่อการศึกษาด้วยตนเองฉันขออ้างว่าวันนี้ไม่จำเป็นต้องสร้างภาษาของคุณเอง ไม่ว่าในกรณีใด ๆ เคย ไม่ว่าคุณต้องการจะทำอะไรมีภาษามากมายที่คุณสามารถนำไปปรับใช้กับความต้องการของคุณได้


การเรียกร้องของคุณเป็นเรื่องที่ถกเถียงกันอย่างมากและฟังดูเหมือนเป็นการโวยวายกับฉัน
SK-logic

วันนี้มีหลายเฟรมเวิร์คสำหรับการสร้าง DSL ที่คุณกำหนดเองซึ่งฉันไม่ได้พูดถึงสิ่งที่ฉันพยายามจะพูด (นี่คือ 2 ปีก่อน) ฉันควรจะปรับรูปแบบใหม่ว่า "การใช้ภาษาวัตถุประสงค์ทั่วไปใหม่ตั้งแต่เริ่มต้นคือการใช้งานจริงไม่ใช่วิธีที่ถูกต้อง" :)
JesperE

ตกลงการเพิ่ม "วัตถุประสงค์ทั่วไป" นี้จะเปลี่ยนทุกอย่าง แต่ฉันไม่เชื่อในภาษา "จุดประสงค์ทั่วไป" - ไม่มีภาษาใดที่ธรรมดาพอดังนั้นยังคงมีพื้นที่มากมายสำหรับภาษาใหม่ที่ค่อนข้าง "ทั่วไป" (ซึ่งจริงๆแล้วเป็น DSL ของการจัดเรียง)
SK-logic

3

มันขึ้นอยู่กับสถานการณ์อย่างแน่นอน ดังที่ nosklo กล่าวไว้ - หากคุณมีความคิดที่ดีแนวคิดใหม่เอี่ยมหรืออะไรทำนองนั้นฉันขอแนะนำให้คุณทำเช่นนั้น

โดยทั่วไปฉันขอแนะนำให้ใช้เทคโนโลยีที่มีอยู่แล้ว

แต่ถ้าคุณสนใจที่จะสร้าง "ภาษา" ของคุณเองคุณควรตรวจสอบ: YACC & Lex


3

คุณทำได้เพียงจับตัวเองในรูปแบบต่อต้าน "สร้างล้อสี่เหลี่ยม"

ความหมายที่คุณกำลังสร้างสิ่งที่ทำไปแล้วมีเพียงด้อยกว่าต้นฉบับ


หากล้อไม่ได้ถูกสร้างขึ้นมาใหม่เราคงใช้ล้อหินได้ เขย่ามันเด็ก
Wong Jia Hau

3

Wouter มีชื่อเสียงในการสร้างภาษาใหม่สำหรับแนวคิดใหม่ใด ๆ คุณสามารถวาดแรงบันดาลใจจากการทำงานของเขาหน้าการเขียนโปรแกรมภาษา Wouter ของ


มันน่าประทับใจมาก
พอลนาธาน

3

สร้างภาษาของคุณเองเมื่อไหร่?

เมื่อคุณต้องการเป็นโครงการงานอดิเรกขนาดใหญ่

สำหรับภาษาเฉพาะโดเมน สิ่งเหล่านี้ค่อนข้างซับซ้อน มองสิ่งที่เกิดขึ้นในนิยายเชิงโต้ตอบ (หรือผจญภัยข้อความ) ชุมชนโดยการตรวจสอบการจัดเก็บ

เมื่อจุดมุ่งหมายของคุณมีความทะเยอทะยานมากและคุณคิดว่าคุณสามารถทำล่วงหน้าจริงเช่นพอลเกรแฮมโครงการ Arc

นอกจากนี้ในภาษาที่สามารถปรับเปลี่ยนได้อย่างเพียงพอ (อาจเป็นภาษาซีพลัสพลัสหรือ Common LISP ที่แน่นอน) ในกระบวนการพัฒนาโครงสร้างระดับต่ำ

เมื่อใดที่ฉันจะหลีกเลี่ยงมันอย่างที่คุณต้องการฉันหวังว่าจะหลีกเลี่ยงถ้อยคำที่เบื่อหูเหมือนหลีกเลี่ยงมันเหมือนโรคระบาด?

เมื่อไหร่จะเป็นพื้นฐานของการพัฒนาอย่างต่อเนื่องสำหรับโครงการจริง มันจะปิดท้ายอย่างจริงจังเสมอหลังสิ่งที่มีขายในท้องตลาดในราคาถูกและจะทำลายการพัฒนาต่อไป ฉันทำงานให้กับ บริษัท ด้วยภาษาโคบอลรุ่นของตัวเองและไม่ต้องการทำงานกับ บริษัท อื่นที่ดูแลภาษาของตัวเอง เราดู COBOL รุ่นอื่น ๆ ได้รับความสามารถที่ดีขึ้นและเครื่องมือที่ดีขึ้นในขณะที่เราติดอยู่กับปัญหาเดียวกัน (ฉันไม่ต้องการทำงานกับ COBOL อีกครั้ง แต่นั่นเป็นอีกเรื่อง)

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


3

มุมมองของฉันคือ DSL มักเป็น "แนวคิดที่อ่อนแอ" และมีประสิทธิผลมากขึ้นในระยะยาวเมื่อใช้ภาษามาตรฐานและสร้างความต้องการเฉพาะโดเมนของคุณในฐานะห้องสมุดของ "non-DSL"

อย่างไรก็ตามมันอาจกลายเป็นว่าความต้องการของคุณเป็นแบบกำหนดเองมากพอที่จะมี DSL (ไม่ใช่เพียงแค่การใช้ gcc หรือ lisp ที่ปรับเปลี่ยนเล็กน้อย) สำหรับ บริษัท ของคุณ บริษัท หลายแห่งใช้ดรอปอินของภาษาปัจจุบันที่กำหนดเป้าหมายสิ่งที่พวกเขากำลังทำอยู่ เช่นฉันเคยได้ยินว่า PHP มีดรอปอินดีมาก Lua ได้รับการออกแบบให้เป็นแบบหล่นใน ModelView ใช้ Python และ AutoCAD มี AutoLISP เป็นสแครปเตอร์


3

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

ไปตลอดทางจนถึงรหัสเครื่องจักรกำลังสร้างล้อจำนวนมาก ...

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


3

โดยทั่วไปการพูดคำตอบจะเป็นใหญ่ จากภาษาต่างๆกว่าร้อยภาษามักจะมีภาษาที่เหมาะกับปัญหาของคุณ

อย่างไรก็ตามมีสถานการณ์ที่เป็นตัวเลือกที่มีเหตุผลในการพัฒนาภาษาใหม่: -

  • เมื่อหนึ่งในคู่แข่งของคุณเป็นเจ้าของหนึ่งในแพลตฟอร์มการพัฒนาหลักของคุณ ฉันกำลังคิดถึงการพึ่งพา Java ในปัจจุบันของ Google และการพัฒนา "go" ของพวกเขา (ช่วยได้ถ้าคุณมีผู้เขียนภาษาที่ประสบความสำเร็จมากที่สุดในบัญชีเงินเดือน!)
  • เมื่อคุณต้องเขียนโค้ดจำนวนมากสำหรับแพลตฟอร์มใหม่และภาษาที่มีอยู่นั้นมีความละเอียดและข้อผิดพลาดได้ง่ายเช่น php สำหรับการพัฒนาเว็บ
  • เมื่อคุณเจอปัญหาเรื่องขนาดและความเท่าเทียมซึ่งไม่เคยพบมาก่อนเพราะไม่มีใครเคยมีฮาร์ดแวร์มากมายในการประมวลผลข้อมูลจำนวนมากนี้มาก่อนเช่น Scala และ (ในระดับหนึ่ง GO)

2

ภาษาใดที่ใช้ในการประกอบกันหรือประกอบส่วนประกอบต่าง ๆ เข้าด้วยกัน

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

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


1

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


1

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


ฉันใช้ภาษาที่แตกต่างกันมากกว่าหนึ่งโหลเป็นประจำ รวมถึง Prolog, Lisps และ Haskell ต่างๆ แต่ถึงกระนั้นฉันก็มีแนวโน้มที่จะแก้ปัญหาเกือบทุกปัญหาโดยใช้ DSL สำหรับมัน และ DSL นั้นมีความเฉพาะเจาะจงมากพอที่จะอยู่ห่างจากภาษาใด ๆ ที่มีอยู่ - พวกเขาดูเหมือนจะเป็นส่วนเล็ก ๆ ของภาษาที่แตกต่างกัน
SK-logic

1

เหตุผลหนึ่งคือเพื่อการศึกษาตามที่ระบุไว้แล้ว แต่มีมากกว่านั้น ตัวอย่างเช่นมีภาษาวิจัยจำนวนมากเช่นSing#ในระบบปฏิบัติการภาวะเอกฐานและBitCในCoyotosที่ได้รับการออกแบบเพราะภาษาที่มีอยู่ไม่ได้มีคุณสมบัติที่จำเป็น (เช่นการตรวจสอบในระดับภาษา)


1

Tom Van Cutsem เพิ่งเขียนคำตอบเรียงความสำหรับคำถามนี้:

http://soft.vub.ac.be/~tvcutsem/whypls.html

สรุปหัวข้อย่อย (จากหน้านั้น):

  • ภาษาในฐานะที่เป็นกลไกการสร้างประโยคเชิงวากยสัมพันธ์: เพื่อลดรหัส "สำเร็จรูป" ซ้ำ ๆ ที่ไม่สามารถแยกออกจากการใช้กลไกการนามธรรมที่ฝังอยู่ในภาษาอื่นได้
  • ภาษาที่เป็นรูปจำลองความคิด: เพื่อชักนำให้เกิดการเปลี่ยนกระบวนทัศน์ในวิธีที่หนึ่งควรจัดโครงสร้างซอฟต์แวร์ (เปลี่ยน "เส้นทางของความต้านทานน้อยที่สุด")
  • ภาษาเป็นเครื่องขยายเสียง: เพื่อทำให้กระบวนทัศน์ที่มีอยู่เป็นเพียงส่วนสำคัญของมันบ่อยครั้งเพื่อเพิ่มความเข้าใจและความเข้าใจที่ลึกซึ้งขึ้น
  • ภาษาตามกฎหมายผู้บังคับใช้: เพื่อบังคับใช้คุณสมบัติที่สำคัญหรือค่าคงที่อาจจะทำให้ง่ายต่อการอนุมานคุณสมบัติที่มีประโยชน์มากขึ้นจากโปรแกรม

0

อาจไม่เคย

Lua เป็นตัวเลือกที่ดีที่สุดที่คุณจะได้รับหากคุณต้องการฝังภาษาในภาษาอื่นใด

Small Domain Specifc Languages ​​อยู่ในขณะนี้และเหมาะสมในบางแอปพลิเคชัน

นอกจากนั้นเหตุผลส่วนใหญ่ทางเคมี

การสร้างภาษาเมื่อไม่ต้องการมันเป็นสิ่งที่ไม่ดีที่ต้องทำเนื่องจากความซับซ้อนที่เกี่ยวข้องกับการพัฒนาและดูแลมัน ฉันได้เห็นหลายโครงการที่แนะนำภาษาสคริปต์บางอย่างเฉพาะกับโปรแกรมนั้นและมันก็เป็นสิ่งที่ทำให้การพัฒนาพื้นฐานช้าลงเป็นจำนวนมาก ตัวอย่างที่ดีสำหรับภาษาการดำเนินการอัตโนมัติเช่น Phantom, AutoHotKey, AutoIt เครื่องมือเหล่านั้นน่าจะดีกว่า IMO มากถ้าพวกเขาใช้นกอีมูที่มีชื่อเสียงเช่น Lua


Lua เป็นคนขี้เกียจ แต่ในทางกลับกันมี MetaLua ที่มีความสามารถในการ metaprogramming ที่ดี
SK-logic

0

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

  1. ฐานผู้ใช้ของคุณมีขนาดใหญ่กว่าสองสามคนโดยทั่วไปที่ไม่ใช่ด้านเทคนิคและ / หรือมีการ จำกัด การเข้าถึงระบบ (ดังนั้นจึงไม่มีเหตุผลที่จะคาดหวังให้พวกเขาเรียนรู้ / ใช้ภาษาวัตถุประสงค์ทั่วไปที่มีอยู่) หากอยู่ในทีม dev หรือองค์กรซอฟต์แวร์ของคุณคุณสามารถพูดได้ว่า "เพียงแค่เขียนสคริปต์"
  2. ผู้ใช้ของคุณจำเป็นต้องใช้มันบ่อยๆอย่างเพียงพอโดยมีพฤติกรรมที่เปลี่ยนแปลงและเปลี่ยนแปลงอย่างเพียงพอที่จำเป็น (เช่นคุณไม่สามารถจัดหาไลบรารีของฟังก์ชันที่คงที่ไว้โดยคุณ)
  3. พฤติกรรมที่ผู้ใช้สามารถระบุมีความซับซ้อนเกินกว่าที่จะระบุว่าเป็นข้อมูล (เช่นคุณไม่สามารถทำได้โดยใช้ตารางฐานข้อมูลหรือเมทริกซ์อินพุตผู้ใช้หรือรายการงานหรือการรวบรวมคีย์ - ค่า ... คิดอย่างรอบคอบ เพราะคุณสามารถบรรลุความซับซ้อนมากมายกับสิ่งเหล่านี้) หากคุณสามารถบรรลุพฤติกรรมโดยใช้การป้อนข้อมูลหรือการกำหนดค่าแทน DSL แล้วคุณอาจควรเพราะมันจะทำงานได้น้อยลงมาก เงื่อนไขบางอย่างหรือความสามารถในการผสม / ผูกมัดกันหรือการสร้างแบบจำลองนามธรรมที่แตกต่างกันไม่กี่อาจเป็นสัญญาณว่าพฤติกรรมที่คุณต้องการมีความซับซ้อนเกินไปสำหรับข้อมูล / การกำหนดค่าธรรมดา
  4. แต่พฤติกรรมนั้นยัง จำกัด อยู่พอที่คุณสามารถระบุได้ใน DSL ที่กระชับ อันตรายที่ยิ่งใหญ่คือ 'แพลตฟอร์มขยายตัว' เช่นหากผู้ใช้เริ่มร้องขอ "คุณเพิ่ม ... ได้ไหม" หากพวกเขาต้องการเชื่อมต่ออินเทอร์เน็ตหรืออ่านและเขียนจากระบบไฟล์หรือกระบวนการเปิดและปิด - นี่ไม่ใช่ DSL อีกต่อไป (ฉันได้เห็นสิ่งนี้เกิดขึ้นจริง ... ผู้ใช้ที่ได้รับอนุญาตให้ฝังการเรียก python ขนาดเล็กค่อยๆเพิ่มขึ้นเป็นสคริปต์ python และในที่สุดก็จะทำลายขีด จำกัด / โมดูล / ประสิทธิภาพการทำงาน)

หากสิ่งเหล่านี้เป็นจริงแล้ว DSL อาจเหมาะสม


0

มีประเภทของแอพพลิเคชั่นนักฆ่า, คลาสของปัญหาอัลกอริทึม, ฯลฯ ซึ่งจะดีกว่าในระยะยาวเพื่อสร้างภาษาของตัวเอง?

มันขึ้นอยู่กับ.

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

โดยทั่วไปแล้วยังมีหัวข้อที่ซับซ้อนเช่นนี้ซึ่งอาจนำไปสู่กลยุทธ์อื่น ๆ ซึ่งอาจรวมถึงภาษาที่ 'ดีกว่า' สำหรับสถานการณ์ที่กำหนด

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