Bahasa khusus domain untuk skrip [ditutup]

12

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?
Cody Brocious
sumber
Untuk menjawab pertanyaan penggunaan DSL dunia nyata Battlefield 1942 menggunakannya. Meskipun banyak mod muncul; dari perspektif programmer (saya) itu mengerikan dan saya kehilangan minat dengan sangat cepat.
Jonathan Dickinson

Jawaban:

6

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.

ZorbaTHut
sumber
Kenapa tidak? Apakah Anda baru saja menggunakan Lisp, itu akan menjadi pengalaman yang jauh lebih menyenangkan kurasa. :) Starcraft II memiliki bahasa scripting Galaxy yang memang merupakan bahasa spesifik domain yang ditargetkan untuk orang-orang non-teknologi.
jacmoe
3
Lisp tidak akan menjadi DSL seperti Lua atau Python. Ini akan menjadi bahasa yang sepenuhnya terbentuk bahwa orang lain telah menghabiskan waktu yang lama merancang, waktu yang Anda dapat hindari menghabiskan waktu sendiri.
coderanger
2

Saya belum melihat banyak informasi tentang orang-orang yang menggunakan bahasa khusus domain untuk skrip mereka, misalnya membangun sedikit dialek logika scripting di atas bahasa yang digunakan untuk sisa permainan, menggunakan makro atau pemrograman fasih atau yang lainnya.

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:

  1. Kemampuan untuk mengubah skrip tanpa harus mengkompilasi ulang dan memuat ulang game.
  2. Kemampuan bagi non-programmer untuk menulis skrip.

Sayangnya, DSL tidak memberi Anda itu.

banyak sekali
sumber
Saya berpendapat bahwa 2) adalah herring merah. Untuk skrip apa pun yang cukup menarik, seorang non-progammer akan membutuhkan lebih banyak bantuan pegangan atau debugging daripada yang layak. Ada desainer-programmer yang baik di luar sana yang tidak membutuhkan bantuan, tetapi Anda tidak dapat menampar Lua For Dummies di atas meja desainer tingkat reguler dan mengharapkan mereka untuk bersenang-senang.
Tenpn
Saya setuju. Saya tidak berpikir # 2 berhasil dengan baik dalam prakteknya, tetapi saya telah melihat itu digunakan sebagai alasan yang masuk akal untuk mengintegrasikan bahasa scripting.
murah hati
Ada banyak orang dengan ide permainan bagus yang dapat menulis skrip Lua tetapi saya tidak akan pernah percaya di dekat malloc / sprintf / di mana pun mereka harus memilih struktur data / dll. Itulah arti # 2 - "Kemampuan bagi programmer yang buruk untuk menyebabkan kerusakan minimal dan masih dapat dikerjakan."
Mereka mungkin tidak menyebabkan kebocoran memori dengan skrip, tetapi programmer yang buruk masih bisa menulis kode yang bermasalah, tidak dapat dipelihara dan lambat. Pemrogram yang buruk tidak boleh berada di dekat game Anda. Pekerjakan desainer dengan pengalaman scripting yang terbukti dan Anda akan baik-baik saja.
Tenpn
2

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.

Thomas Dufour
sumber
2

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:

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

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.

Jacobs
sumber
1

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.

Jonathan Fischoff
sumber
0

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.

Apakah Anda melihat ini menjadi lebih umum ketika pengembangan game bergerak ke bahasa yang lebih ramah pemrograman-program, misalnya Boo?

Saya tidak berpikir bahwa satu mesin yang cukup baru yang mendukung bahasa adalah bukti perkembangan game yang bergerak ke arah tertentu. Ini masih awal.

Kylotan
sumber
0

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.

david.pfx
sumber