Senaryo dilinde ne arıyorsun? [kapalı]


10

Başka bir proje için biraz gömülü bir dil yazıyorum. Oyun geliştirme asıl amacı olmasa da, iyi bir uyum gibi görünmeye başlıyor ve bir noktada onu geliştireceğim.

Herhangi bir ayrıntıyı açıklamadan (önyargıdan kaçınmak için), merak ediyorum:

Oyun geliştirme için bir betik dilinde hangi özellikleri seversiniz?

Bir oyun projesinde birincil komut dosyası diliniz olarak Lua, Python veya Tcl veya Guile gibi başka bir gömülü dil kullandıysanız, hangi yönleri en yararlı buldunuz?

  • Dil özellikleri (lambdalar, sınıflar, paralellik)

  • Uygulama özellikleri (performans optimizasyonları, JIT, donanım hızlandırma)

  • Entegrasyon özellikleri (C, C ++ veya .NET bağlantıları)

  • Yoksa tamamen farklı bir şey mi?


2
Gizleme: Çünkü gizlenebiliyorsa, muhtemelen oldukça esnektir. Örneğin Perl'i ele alalım, 300 bps'lik bir modemin (evin başka bir ucunda başka bir telefon aldığında) hat gürültüsünün neden olduğu çıkışın , hızlı. ;-P
Randolf Richardson

1
@Randolf: İyi bir nokta. Gizleme ile ilgili tek sorun, genç dillerin olmadığı sabit bir dile güvenme eğiliminde olmasıdır. 0.10 ile çalışan bir obfuscator 0.11 ile çalışmayabilir.
Jon Purdy

@Jon Purdy: Bu doğru (+1 sizin için). Ayrıca, gizlenmiş kodun korunması daha zor olan bir yönü de vardır. Nota önemli şey olsa da, sağlayabileceği kandırma olan bir dil ne kadar esnek ilginç önlem.
Randolf Richardson

5
@Randolf: perl ne zaman böyle görünmez?
Ken

1
@Joe Wreschnig Bu, 'hangisini seçmeliyim' diyor, bu daha çok 'bir betik dilinde hangi özelliklerin iyi olduğunu' söylüyor.
Komünist Ördek

Yanıtlar:


4

İki şey arıyorum - hız ve entegrasyon. Genellikle ikisi birlikte ve aşina olurlar. Ne yazık ki, C ++ için, hız ve entegrasyon sunan hemen hemen hiç dil yok. Lua kullandım ve korkunç bir şekilde emdi. Bağları yazmak için tüm zaman geçirdim ve aslında hiçbir zaman kod yazmak için yeterince yakın zaman geçmedi.

Dil özellikleri? Bir komut dosyası dilinin gömülmesinin amacı, orijinal dilimin sahip olmadığı vızıltı dinamik dil özelliklerine sahip olması değil , çalışma zamanında yorumlanabilmesidir . Aslında bunun ötesinde umurumda değil, temelde işlevsel olduğu sürece, o zaman bu iyi - ve benim ana bilgisayar dili (bu durumda C ++) ile uyuyor. Ancak, şaşırtıcı, tasarlanmış dil tamamen ilgili bölümü başarısız konak uygulamalarına entegre edilmesi entegrasyon .

Birlikte rutinlere ihtiyacım var mı? Hayır, eş-rutinlere ihtiyacım yok. Dinamik yazmaya ihtiyacım var mı? Hayır, komut dosyası dilimden bana hangi türlerin geri geldiğini bilmem gerekiyor ve mevcut kodumun tümü çok güçlü bir yazım etrafında oluşturulduğundan, kod kodumun buna da saygı göstermesini gerçekten istiyorum. Çöp toplamaya ihtiyacım var mı? Hayır, türlerim zaten kendi kaynaklarını yönetiyor ve kesinlikle deterministik yıkım istiyorum. Gitmek ister miyim? Hayır- İstisnalar vermek istiyorum.

Bulduğum sorun, temel olarak tüm varolan komut dosyası dillerinin C ++ değil C'yi genişletmek için tasarlanmış olması ve C ++ modelini birçok yönden düzgün bir şekilde desteklememesi ve buna ek olarak tamamen farklı anlambilime sahip olmalarıydı. shared_ptrOtomatik deterministik yıkım olan yeryüzünde nasıl çöp toplanmış bir çevreye çevireceğim? İstediğiniz sarma kitaplıklarını yazabilirsiniz, temel dil semantiğinin onunla genişletmeye çalıştığınız dil ile uyumsuz olmasını değiştirmezsiniz. Bunun void*doğru tip olduğundan nasıl emin olabilirim ? Kalıtımla nasıl başa çıkabilirim? İstisnaları nasıl atar ve yakalarım? Sadece işe yaramıyor.

C ++ için iyi bir komut dosyası dili statik olarak yazılacak, anlambilimsel olarak belirlenecek, deterministik olarak yıkılacak, istisnaları atacak ve yakalayacak ve yıkıcılarıma / kurucularıma / kopya oluşturucularına saygı gösterecekti, çünkü o zaman tüm türlerim işe yarayacak, güzel ve kolay olacak ve sonuçta ortaya çıkan dil hızlı ve tüm orijinal anlambilimi destek, kolay bağlanır.


Son zamanlarda kendim için yazdığım bu sarıcı kütüphane gibi bir şey denemelisiniz . Onunla paylaşılan_ptrs ve şeyleri kullanabilirsiniz, tür güvenlidir (yine de olabildiğince), kodunuz veya Lua ortamı tarafından kontrol edilen bir şeyin ömrünü isteyip istemediğinize karar verebilirsiniz, kalıtımı destekler ve normal Lua API'sine son derece benzer. Bağlamalar yapmakla ilgili şikayeti aldığımdan emin değilim, sadece bağlarımı% 99 yapmak için vim snippet'lerini kullanıyorum.
Alex Ames

2

Web tabanlı oyunlar için benim için üç önemli faktör:

  • Aşinalık
  • hız
  • bütünleşme

Özellikle Perl'i seviyorum, çünkü kısmen dile aşina olduğum için ve mod_perl2 gibi bir web sunucusu modülünde büyük bir performans ve entegrasyon avantajı olduğu için - mod_perl2, komut dosyalarının derlenmiş bir sürümünü RAM'de tutar (sadece üzerinde yorumlanır) ilk yükleme), derleme seçeneklerine sahip olmayan diğer yorumlanmış dillere göre büyük bir hız avantajı sağlar ve ayrıca çok güçlü özelliklere erişim sağlayan özellik açısından zengin bir API ile Apache HTTPd sunucusuna entegre olur.

Bu faktörler web tabanlı oyun geliştirme için yararlı olabilir (ve veritabanına erişim gerektiğinde, veritabanı bağlantılarının önbelleğe alınması kullanıcılar için yanıt sürelerini daha da azaltmaya yardımcı olur). Tabii ki, her dilin avantajları (ve dezavantajları) olduğu için bu her şey için en ideal çözüm olmayabilir, ancak her zaman ihtiyaçlarım için iyi çalıştı.


2

Önem sırasına göre (azalan) düzenlenmiştir:

  • Bir bakışta okunabilir. Aslında, bu kullanmak istediğim herhangi bir dil için bir gereklilik , ancak komut dosyası oluşturmak için tartışmasız daha önemlidir: komut dosyaları, tanım gereği, "çekirdek" koddan daha sık değişir. Yani, LISP veya PERL yok.
  • Kısalığı. Komut dosyaları sürekli olarak yazılır ve yeniden yazılır ve çok sayıda "kaynak plakası" kodu yazmak verimsizdir.
  • Kolay hata ayıklama. Tercihen kesme noktaları, adım adım vb.
  • Seçtiğim "çekirdek" teknolojiyle kolay entegrasyon. Oyunum için C ++ kullanıyorsam, LUA'da olduğu gibi iyi C ++ bağlarına ihtiyacım olacaktı. Oyun C # ise, CLI tabanlı bir dil seçerdim: C #, IronPython, Boo.
  • Dil özellikleri: kolay ilişkilendirilebilir diziler, coroutines, belki lambdas. Aslında, bu çoğunlukla betikleri ne için kullanacağımıza bağlıdır. AI komut dosyaları, örneğin başlatma komut dosyalarından farklıdır.
  • İyi dokümantasyon. C #, kendisine ayrılmış bir MSDN'ye sahiptir ve Boo'nun yalnızca kaynakları vardır. bu yüzden C # çok daha iyi.
  • İyi geliştirme ortamı. VS veya Eclipse her seferinde Not Defteri'ni yener.

+1 Bu bana biraz yardımcı oluyor, teşekkürler. Daha fazla tartışmanın olup olmadığını görmek için bekleyeceğim, ama bence iyi ele aldınız.
Jon Purdy
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.