ภาษาเฉพาะโดเมนสำหรับการเขียนสคริปต์ [ปิด]


12

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

ดังนั้นคำถามของฉันมีดังนี้:

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

เพื่อตอบคำถามการใช้งาน DSL ในโลกแห่งความจริง Battlefield 1942 ใช้พวกเขา แม้ว่า mods จำนวนมากจะโผล่ขึ้นมา จากมุมมองของโปรแกรมเมอร์ (มัน) มันน่ากลัวและฉันหมดความสนใจอย่างรวดเร็ว
Jonathan Dickinson

คำตอบ:


6

คำแนะนำของฉันคือ "ไม่"

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

ฉันไม่รู้จริงๆว่าฉันกำลังคิดอะไรอยู่ สิ่งทั้งหมดจะง่ายขึ้นมีประสิทธิภาพมากขึ้นบั๊กที่น้อยลงและใช้เวลาน้อยลงถ้าฉันใช้ Lua

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

ฉันไม่สามารถแนะนำ DSL ได้อย่างมากพอ


เอ้อทำไมไม่? คุณเพิ่งใช้เสียงกระเพื่อมมันจะเป็นประสบการณ์ที่น่าพึงพอใจมากกว่าที่ฉันคิด :) Starcraft II มีภาษาสคริปต์ Galaxy ซึ่งเป็นภาษาเฉพาะโดเมนที่กำหนดเป้าหมายโดยผู้ใช้ที่ไม่ใช่เทคโนโลยี
jacmoe

3
เสียงกระเพื่อมจะไม่เป็น DSL มากกว่า Lua หรือ Python มันจะเป็นภาษาที่มีรูปแบบที่คนอื่นใช้เวลานานในการออกแบบเวลาที่คุณสามารถหลีกเลี่ยงการใช้จ่ายเอง
coderanger

2

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

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

  1. ความสามารถในการเปลี่ยนสคริปต์โดยไม่ต้องคอมไพล์และรีโหลดเกม
  2. ความสามารถสำหรับผู้ที่ไม่ใช่โปรแกรมเมอร์ในการเขียนสคริปต์

DSLs ไม่ได้ให้สิ่งนั้นโชคไม่ดี


ฉันขอยืนยันว่า 2) เป็นปลาเฮอริ่งแดง สำหรับสคริปต์ที่น่าสนใจอย่างพอเพียงผู้ที่ไม่ใช่ progammer จะต้องการความช่วยเหลือในการจัดการหรือแก้ไขจุดบกพร่องมากกว่าที่ควรจะเป็น มีโปรแกรมเมอร์ผู้ออกแบบที่ดีซึ่งไม่ต้องการความช่วยเหลือ แต่คุณไม่สามารถตบ Lua For Dummies บนโต๊ะของนักออกแบบระดับปกติและคาดหวังให้พวกเขาสนุก
tenpn

ฉันเห็นด้วย. ฉันไม่คิดว่า # 2 ทำงานได้ดีในทางปฏิบัติ แต่ฉันเห็นว่าใช้เป็นเหตุผลที่ชัดเจนสำหรับการรวมภาษาสคริปต์
munificent

มีผู้คนมากมายที่มีแนวคิดเกมที่ดีที่สามารถเขียนสคริปต์ Lua ได้ แต่ฉันไม่เคยเชื่อถือใกล้ malloc / sprintf / สถานที่ใด ๆ ที่พวกเขาต้องเลือกโครงสร้างข้อมูล / ฯลฯ นั่นคือความหมายที่ # 2 - "ความสามารถของโปรแกรมเมอร์ที่ไม่ดีในการทำให้เกิดความเสียหายน้อยที่สุดและยังทำงานได้สำเร็จ"

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

2

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

ตัวอย่างเช่นโครงการปัจจุบันของฉันใช้ DSL ภายนอกง่าย ๆ (ตอนนี้) เพื่อระบุส่วนหนึ่งของตรรกะของเกมที่ช่วยให้นักออกแบบเกมทำการทดสอบยอดคงเหลือโดยไม่ต้องมีการแทรกแซง

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


2

คำแนะนำของฉันคือ: ทำ !

แต่ถ้าคุณมีการใช้งานมัน

ไม่จำเป็นต้องสร้าง DSL ถ้าคุณจะใช้มันเอง - ภายใน

Galaxy เป็นภาษาสคริปต์ที่มีการใช้งานตัวแก้ไข Startcraft II เป็นตัวอย่างสำคัญของภาษาเฉพาะโดเมน

มันเป็นเป้าหมายของนักออกแบบเกมมากกว่าโปรแกรมเมอร์:

Timer - Start Raise Lava Timer as a One Shot timer that will expire in 20.0 Game Time seconds
Variable - Set Raise Lava Timer = (Last started timer)
Timer - Create a timer window for (Last started timer), with the title "Lava will raise in: ", using Remaining time (initially Visible)
Variable - Set Lava Timer Window = (Last created timer window)
Timer - Show (Last created timer window) for (All players)
Variable - Set Lava Death? = false

ตัวอย่างการสอน

เสียงกระเพื่อมเป็นภาษาที่สมบูรณ์แบบที่จะใช้ในการสร้างภาษาเฉพาะโดเมน แต่มีตัวเลือกอื่น ๆ แน่นอน เช่นเดียวกับบู

ด้วยวิธีนี้นักออกแบบ / ผู้ควบคุมของคุณไม่จำเป็นต้องเรียนรู้การเขียนโปรแกรมแม้ว่าจะเป็นเพียง Lua แต่ก็ยังคงเป็นโปรแกรม

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


1

dsls ภายในเป็นเพียงการสร้างประโยคบน API ที่ดี API คือสิ่งที่สำคัญที่สุด หลังจากที่คุณมี API ที่ดีแล้วการทำ dsl นั้นไม่สำคัญและไม่สำคัญ


0

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

คุณเห็นว่าสิ่งนี้เป็นเรื่องธรรมดามากขึ้นเมื่อการพัฒนาเกมก้าวไปสู่ภาษาที่เป็นมิตรกับ metaprogramming เช่น Boo?

ฉันไม่คิดว่าเอ็นจิ้นใหม่ที่รองรับภาษาเป็นหลักฐานของการพัฒนาเกมที่เคลื่อนไหวไปในทิศทางที่กำหนดอย่างไรก็ตาม มันเป็นวันแรก


0

หากสิ่งที่คุณต้องการจริงๆคือภาษาโปรแกรมทั่วไปที่มีอยู่แล้วการกลิ้งของคุณเองเป็นข้อผิดพลาดอย่างแน่นอน หากภาษาของคุณต้องการตัวแปรการประเมินผลนิพจน์ลูปเงื่อนไขคลาสฟังก์ชั่นและสิ่งที่คล้ายกันนั้นควรใช้ภาษาที่รู้จักกันดีที่สุดเช่น Lua, Lisp, Python, จาวาสคริปต์ ฯลฯ [Unreal เลิกใช้แล้ว]

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

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

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