Seperti yang Anda ketahui, interpreter tertanam untuk bahasa seperti Lua dan Python banyak digunakan untuk skrip logika permainan, tetapi saya belum melihat banyak informasi tentang orang-orang yang menggunakan bahasa khusus domain untuk skrip mereka, misalnya membangun dialek skrip logika kecil ' 'Di atas bahasa yang digunakan untuk sisa permainan, menggunakan makro atau pemrograman lancar atau yang lainnya.
Jadi pertanyaan saya adalah sebagai berikut:
- Apa contoh DSL seperti itu yang Anda lihat di game dunia nyata?
- Masalah apa yang terjadi?
- Apakah Anda akan merekomendasikan rute ini untuk pengembang game lain, dan dalam kondisi apa?
- Apakah Anda melihat ini menjadi lebih umum ketika pengembangan game bergerak ke bahasa yang lebih ramah pemrograman-program, misalnya Boo?
Jawaban:
Saran saya adalah "jangan".
Saya telah menggunakan bahasa markup khusus domain untuk data game. Itu menyakitkan. Saya menghabiskan waktu berhari-hari mendesainnya, dan kemudian setiap minggu saya perlu mengubahnya untuk menambahkan lebih banyak fitur. Pada satu titik saya menyadari bahwa saya perlu secara otomatis menghasilkan beberapa data permainan saya, dan saya akhirnya menulis sebuah program kecil untuk mem-parsing file input dalam bahasa markup, memijat mereka, dan menghasilkan file yang berbeda juga dalam bahasa markup.
Sejujurnya saya tidak tahu apa yang saya pikirkan. Semuanya akan lebih sederhana, lebih efisien, lebih sedikit bug, dan jauh lebih sedikit memakan waktu jika saya hanya menggunakan Lua.
Jika Anda bekerja pada sistem terbatas sehingga Anda tidak dapat memulai lingkungan Lua, maka mungkin Anda harus menggunakan DSL, tetapi bersiaplah untuk penderitaan. Kalau tidak, saya sangat yakin Anda hanya harus menggunakan Lua. Lua pada awalnya dirancang sebagai bahasa markup data sederhana dan masih sangat kondusif untuk digunakan, dan ketika (tidak jika) Anda menyadari bahwa Anda membutuhkan sesuatu yang lebih rumit, Anda sudah mendapatkannya. Semua pengembangan game saya saat ini dilakukan di Lua dan saya tidak pernah lebih efisien atau kurang bugprone.
Saya tidak bisa merekomendasikan terhadap DSL dengan cukup kuat.
sumber
Bahasa scripting cenderung menjadi proposisi mahal dalam gim. Bahkan Lua, yang cukup cepat, masih jauh lebih lambat daripada kode asli. Tim gim biasanya hanya bersedia menerima pukulan itu karena memberi mereka dua manfaat sangat besar sebagai imbalan:
Sayangnya, DSL tidak memberi Anda itu.
sumber
Saya merasa ingin tahu bahwa pertanyaan Anda membatasi dirinya untuk DSL internal , karena saya lebih suka menganjurkan penggunaan DSL eksternal untuk mendapatkan kemampuan untuk memuat skrip saat runtime dan terutama untuk memungkinkan non-devs untuk menulis logika permainan di DSL .
Sebagai contoh, proyek saya saat ini menggunakan (untuk sekarang) DSL eksternal sederhana untuk menentukan bagian dari logika permainan yang memungkinkan perancang permainan untuk membuat tes keseimbangan sebagian besar tanpa intervensi pengembang.
Tentu saja Anda harus menulis parser; untuk itu, saya pikir alat yang paling direkomendasikan adalah ANTLR yang menargetkan beberapa bahasa . Pada proyek saya, meskipun kami pergi rute kombinator parser dengan jParsec (backend kami adalah Jawa, ada varian dalam bahasa lain) yang cukup bagus untuk hubungan dekat dengan BNF tetapi mungkin kurang didokumentasikan dengan baik.
sumber
Saran saya adalah: Lakukan !
Tetapi hanya jika Anda memiliki kegunaan untuk itu.
Tidak perlu membuat DSL jika Anda hanya akan menggunakannya sendiri - secara internal.
Galaxy adalah bahasa scripting yang digunakan editor Startcraft II. Ini adalah contoh utama bahasa domain tertentu.
Ini menargetkan desainer game daripada programmer:
Contoh Tutorial
Lisp adalah bahasa yang sempurna untuk digunakan untuk membuat bahasa spesifik domain, tetapi tentu saja ada opsi lain. Seperti Boo.
Dengan begitu desainer / modder Anda tidak harus belajar pemrograman, meskipun itu hanya Lua, itu masih pemrograman.
Sunting: Izinkan saya menambahkan bahwa DSL dapat diimplementasikan dalam bahasa scripting - itu tidak identik dengan tidak menggunakan bahasa scripting. Terutama jika Anda menggunakan Lisp atau sejenisnya, karena itu cocok untuk membuat bahasa khusus domain.
sumber
Dsls internal hanyalah gula sintaksis pada API yang baik. API adalah yang paling penting. Setelah Anda memiliki API yang bagus, membuat dsl itu sepele, dan tidak terlalu penting.
sumber
Bisa dibilang UnrealScript adalah DSL. Tampaknya menyelesaikan pekerjaan, meskipun saya pikir itu mungkin untuk membuat bahasa scripting game lebih 'spesifik domain' dari itu. Saya akan merekomendasikan membuat DSL jika ada sesuatu yang spesifik untuk domain yang akan mendapat manfaat dari perubahan bahasa - Saya punya beberapa ide di bidang ini tetapi tidak ada yang sepenuhnya terbentuk saat ini.
Saya tidak berpikir bahwa satu mesin yang cukup baru yang mendukung bahasa adalah bukti perkembangan game yang bergerak ke arah tertentu. Ini masih awal.
sumber
Jika apa yang Anda benar-benar butuhkan adalah bahasa pemrograman tujuan umum, maka menggulirkan sendiri hampir pasti merupakan kesalahan. Jika bahasa Anda tampaknya membutuhkan variabel, evaluasi ekspresi, pengulangan, pengkondisian, kelas, fungsi, dan sejenisnya, maka sebaiknya tetap menggunakan bahasa yang dikenal seperti Lua, Lisp, Python, JavaScript, dll. [Unreal telah mengabaikannya.]
Tetapi jika yang Anda butuhkan kebanyakan tentang mendefinisikan data; mungkin lebih bersifat deklaratif daripada imperatif; mungkin mendefinisikan negara dan aturan (seperti GDL); dan tidak membutuhkan sebagian besar dari apa yang dilakukan bahasa GP dengan baik, maka pertimbangkan DSL.
Namun berhati-hatilah: membuat bahasa dan kompiler bisa sangat sulit dan pengalaman sebelumnya adalah bantuan besar. Saya akan merekomendasikan pengurai PEG (itu sendiri DSL) berdasarkan pada tata bahasa EBNF (DSL lain), dan jika itu terlalu besar bertanya, maka lebih baik tidak mencoba.
sumber