Komut dosyası oluşturma için etki alanına özgü diller [kapalı]


12

Çoğunuzun bildiği gibi, Lua ve Python gibi diller için gömülü tercümanlar komut dosyası oyun mantığı için yaygın olarak kullanılmaktadır, ancak komut dosyaları için etki alanına özgü dillerle giden insanlar hakkında çok fazla bilgi görmedim, örneğin küçük bir mantık komut dosyası oluşturma 'Oyunun geri kalanı için, makrolar veya akıcı programlama veya başka bir şey kullanmadan kullanılan dilin üstünde.

Yani sorularım şöyle:

  • Gerçek dünya oyunlarında bu tür DSL'lerin hangi örneklerini gördünüz?
  • Hangi sorunlar yaşandı?
  • Bu rotayı diğer oyun geliştiricileri için ve hangi durumlarda önerirsiniz?
  • Oyun geliştirmenin daha fazla meta programlamaya uygun dilde, ör. Boo'ya doğru ilerledikçe bunun daha yaygın hale geldiğini görüyor musunuz?

Battlefield 1942'nin gerçek dünya DSL kullanım sorusunu yanıtlamak için bunları kullandı. Bir çok mod ortaya çıkmasına rağmen; programcılar açısından benim korkunçtu ve ilgimi çok hızlı kaybettim.
Jonathan Dickinson

Yanıtlar:


6

Benim tavsiyem "yapma" olurdu.

Oyun verileri için alana özgü bir biçimlendirme dili kullandım. Bu bir acıydı. Tasarım için günler geçirdim ve her hafta iki haftada daha fazla özellik eklemek için ince ayar yapmam gerekiyordu. Bir noktada oyun verilerimin bir kısmını otomatik olarak üretmem gerektiğini fark ettim ve girdi dosyalarını biçimlendirme dilinde ayrıştırmak, masaj yapmak ve biçimlendirme dilinde de farklı dosyalar çıkarmak için küçük bir program yazdım.

Dürüst olmak gerekirse ne düşündüğümü bilmiyorum. Eğer Lua kullansaydım, her şey daha basit, daha verimli, daha az hata eğilimi ve çok daha az zaman alıcı olurdu.

Lua ortamını başlatamayacak kadar kısıtlı bir sistem üzerinde çalışıyorsanız, belki de bir DSL kullanmalısınız, ancak acıya hazırlıklı olmalısınız. Aksi takdirde sadece Lua kullanmanız gerektiğine inanıyorum. Lua başlangıçta basit bir veri biçimlendirme dili olarak tasarlandı ve hala böyle kullanmak için son derece elverişli ve daha karmaşık bir şeye ihtiyacınız olduğunu fark ederseniz, zaten var. Tüm oyun geliştirme çalışmalarım Lua'da yapıldı ve hiç bu kadar verimli ve daha az hata yapmadım.

DSL'lere karşı yeterince kuvvetle tavsiye edemem.


Ee, neden olmasın? Lisp'i yeni kullandınız mı, bence çok daha zevkli bir deneyim olurdu. :) Starcraft II, gerçekten de teknoloji olmayan çocuklar / hedefleri hedef alan alana özgü bir dil olan Galaxy kodlama diline sahiptir.
jacmoe

3
Lisp, Lua veya Python'dan daha fazla DSL olmazdı. Başka birisinin tasarım yapmak için uzun zaman geçirdiği, kendinizi harcamadan kaçınabileceğiniz tam biçimlendirilmiş bir dil olurdu.
coderanger

2

Komut dosyaları için alan adına özgü dillerle giden insanlar hakkında çok fazla bilgi görmedim, örneğin, oyunun geri kalanında kullanılan dilin üzerine küçük bir mantık komut dosyası 'lehçesi' oluşturmak, makrolar veya akıcı programlama veya neyi kullanmak gibi.

Script dilleri oyunlarda pahalı bir teklif olma eğilimindedir. Oldukça hızlı olan Lua bile yerel koddan çok daha yavaş. Oyun takımları genellikle bu isabeti almaya isteklidir, çünkü karşılığında iki çok büyük fayda sağlar:

  1. Oyunu yeniden derlemek ve yeniden yüklemek zorunda kalmadan komut dosyalarını değiştirme yeteneği.
  2. Programcı olmayanların senaryo yazma yeteneği.

DSL'ler maalesef bunu vermiyor.


2) kırmızı bir ringa balığı olduğunu iddia ediyorum. Oldukça ilginç olan herhangi bir komut dosyası için, programcı olmayan bir kişinin buna değdiğinden daha fazla tutma veya hata ayıklama yardımına ihtiyacı olacaktır. Dışarıda yardıma ihtiyaç duymayan iyi programcı tasarımcıları var, ancak düzenli bir tasarımcının masasına Lua For Dummies'i tokatlayamaz ve eğlenceyi bozmalarını bekleyemezsiniz.
tenpn

Katılıyorum. # 2'nin pratikte iyi işlediğini düşünmüyorum, ancak bunun bir betik dilini entegre etmek için göze çarpan bir neden olduğunu gördüm.
Münih

Lua komut dosyaları yazabilen iyi oyun fikirleri olan birçok insan var ama malloc / sprintf / bir veri yapısı / vb. Almak zorunda oldukları herhangi bir yere asla güvenmem. Gerçekten # 2 bu demek oluyor - "Kötü programcıların minimum hasara neden olma ve hala işlerini yapma yetenekleri."

Bir komut dosyasıyla bellek sızıntısına neden olmayabilirler, ancak kötü bir programcı yine de hatalı, sürdürülemez ve yavaş kod yazabilir. Kötü programcılara oyununuzun yakınında izin verilmemelidir. Kanıtlanmış komut dosyası oluşturma deneyimine sahip tasarımcıları işe alın ve iyi olacaksınız.
tenpn

2

Sorunun kendisini dahili DSL'lerle sınırladığını merak ediyorum, çünkü çalışma zamanında komut dosyaları yükleyebilmek ve özellikle geliştiricilerin DSL'de oyun mantığı yazmasına izin vermek için harici bir DSL kullanımını savunmayı tercih ediyorum .

Örneğin, şu anki projem oyun mantığının bir kısmını belirlemek için (şimdilik) basit bir harici DSL kullanıyor.

Elbette bir ayrıştırıcı yazmanız gerekir; Bu amaçla, en çok tavsiye edilen aracın, birkaç dili hedefleyen ANTLR olduğunu düşünüyorum . Projemde jParsec ile ayrıştırıcı birleştirici rotasına gittik (arka ucumuz Java, diğer dillerde varyantlar var), bu da BNF ile yakın ilişkisi için oldukça güzel ama belki de daha az iyi belgelenmiş.


2

Benim tavsiyem: Yap !

Ama sadece bunun için bir kullanımınız varsa.

Dahili olarak sadece kendiniz kullanacaksanız bir DSL oluşturmanıza gerek yoktur.

Galaxy, Startcraft II editörünün kullandığı komut dosyası dilidir. Etki alanına özgü bir dilin en iyi örneğidir.

Programcılar yerine oyun tasarımcılarını hedefliyor:

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

Örnek Eğitim

Lisp, alana özel diller oluşturmak için kullanılacak mükemmel dildir, ancak elbette başka seçenekler de vardır. Boo gibi.

Bu şekilde tasarımcılarınızın / modemlerinizin programlamayı öğrenmek zorunda kalması gerekmez, sadece Lua olsa bile, hala programlama yapar.

Düzenleme: Bir DSL'nin komut dosyası dilinde uygulanabileceğini eklememe izin verin - komut dosyası dili kullanmayla eşanlamlı değildir. Özellikle Lisp ya da benzerini kullanıyorsanız, etki alanına özgü diller oluşturmak için son derece iyi bir kredi sağladığı için.


1

Dahili dsls sadece iyi bir API üzerinde sözdizimsel şekerdir. API en önemli şeydir. İyi bir API yaptıktan sonra bir dsl yapmak önemsiz ve o kadar önemli değil.


0

Tartışmasız UnrealScript bir DSL'dir. İşi bitirmiş gibi görünüyor, ancak oyun komut dosyası dillerini bundan daha 'etki alanına özgü' hale getirmenin mümkün olduğunu düşünüyorum. Alan değişikliğine özgü, dil değişikliklerinden faydalanacak bir DSL varsa öneriyorum - bu alanda birkaç fikrim var, ancak şu anda tam olarak oluşmamış bir şey var.

Oyun geliştirmenin daha fazla meta programlamaya uygun dilde, ör. Boo'ya doğru ilerledikçe bunun daha yaygın hale geldiğini görüyor musunuz?

Bununla birlikte, bir dili destekleyen oldukça yeni bir motorun, belirli bir yönde hareket eden oyun gelişiminin kanıtı olduğunu düşünmüyorum. Henüz erken günler.


0

Eğer gerçekten ihtiyacınız olan şey genel amaçlı bir programlama diliyse, kendi dilinizi çevirmek neredeyse kesinlikle bir hatadır. Dilinizin değişkenlere, ifade değerlendirmesine, döngülere, koşullara, sınıflara, işlevlere ve benzerine ihtiyacı varsa, o zaman en iyi Lua, Lisp, Python, JavaScript, vb. Bilinen bir dile sadık kalır.

Ancak ihtiyacınız olan şey çoğunlukla veri tanımlamakla ilgili ise; belki de zorunlu olmaktan ziyade açıklayıcıdır; belki devletleri ve kuralları (GDL gibi) tanımlar; ve bir GP dilinin iyi yaptığı şeye ihtiyaç duymazsa, bir DSL düşünün.

Ancak dikkat: dil ve derleyici oluşturmak çok zor olabilir ve önceki deneyim büyük bir yardımcıdır. Ben bir EBNF dilbilgisi (başka bir DSL) dayalı bir PEG ayrıştırıcı (kendisi bir DSL) tavsiye ederim ve bu çok büyük bir sormak, o zaman denemek daha iyi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.