O que você procura em uma linguagem de script? [fechadas]

10

Estou escrevendo um pouco de linguagem incorporada para outro projeto. Embora o desenvolvimento de jogos não tenha sido sua intenção original, está começando a parecer um bom ajuste, e acho que vou desenvolvê-lo dessa maneira em algum momento.

Sem revelar detalhes (para evitar preconceitos), estou curioso para saber:

Quais recursos você ama em uma linguagem de script para o desenvolvimento de jogos?

Se você usou Lua, Python ou outra linguagem incorporada, como Tcl ou Guile, como sua principal linguagem de script em um projeto de jogo, quais aspectos você achou mais úteis?

  • Recursos de linguagem (lambdas, classes, paralelismo)

  • Recursos de implementação (otimizações de desempenho, JIT, aceleração de hardware)

  • Recursos de integração (ligações C, C ++ ou .NET)

  • Ou algo completamente diferente?

Jon Purdy
fonte
2
Ofuscação: porque, se puder ser ofuscada, provavelmente também é bastante flexível. Tomemos o Perl, por exemplo, que pode ser ofuscado na medida em que se parece com a saída causada pelo ruído da linha de um modem de 300 bps (quando alguém pegou o telefone na outra extremidade da casa) nos dias em que estes eram velozes. ;-P
Randolf Richardson
1
@ Randolf: Bom ponto. O único problema com a ofuscação é que ela tende a confiar em uma linguagem estável, que as línguas jovens não são. Um ofuscador que trabalha com 0,10 pode não funcionar com 0,11.
Jon Purdy
@ Jon Purdy: Isso está correto (+1 para você). Há também o aspecto do código ofuscado sendo mais difícil de manter. O importante a ser observado, porém, é que a ofuscação pode fornecer uma medida interessante de quão flexível é uma linguagem.
Randolf Richardson
5
@ Randolf: quando o Perl não se parece com isso?
Ken
1
@ Joe Wreschnig Isso está dizendo 'qual devo escolher', isso é mais 'quais recursos são bons em uma linguagem de script'.
The Duck comunista

Respostas:

4

Estou procurando duas coisas: velocidade e integração. Geralmente os dois andam juntos e com familiaridade. Infelizmente, para C ++, não há praticamente nenhuma linguagem que ofereça velocidade e integração. Eu usei Lua e foi horrível. Passei o tempo todo escrevendo ligações e sem tempo suficiente escrevendo código.

Caracteristicas do idioma? O ponto de incorporar uma linguagem de script não é para que ele possa ter recursos de linguagem dinâmica whizzy que meu idioma original não possuía, é para que possa ser interpretado em tempo de execução . Eu realmente não me importo além disso, desde que seja basicamente funcional, então tudo bem - e se encaixa na minha linguagem host (neste caso, C ++). No entanto, surpreendentemente, as linguagens projetadas para serem integradas aos aplicativos host falham totalmente na parte da integração .

Preciso de co-rotinas? Não, não preciso de co-rotinas. Preciso de digitação dinâmica? Não, eu preciso saber que tipos estão voltando para mim a partir da minha linguagem de script e, como todo o meu código existente é construído com base em uma digitação muito forte, eu realmente gostaria que meu código de script também respeitasse isso. Preciso de coleta de lixo? Não, meus tipos já gerenciam seus próprios recursos, e eu definitivamente quero destruição determinística. Eu quero ir? Não, eu quero lançar exceções.

O problema que encontrei foi que basicamente todas as linguagens de script existentes foram projetadas para estender C, não C ++, e não suportam adequadamente o modelo C ++ de várias maneiras e, além disso, elas têm semântica totalmente diferente. Como vou traduzir shared_ptr, que é a destruição determinística automática, em um ambiente de coleta de lixo? Você pode escrever as bibliotecas de quebra automática que desejar, não alterará a semântica do idioma subjacente, sendo incompatível com o idioma que está tentando estender com ele. Como posso garantir que esse void*é o tipo certo? Como posso lidar com a herança? Como faço para lançar e capturar exceções? Simplesmente não funciona.

Uma boa linguagem de script para C ++ seria estaticamente digitada, valorizaria a semântica, deterministicamente destruída, lançaria e capturaria exceções e respeitaria meus destruidores / construtores / construtores de cópia, porque todos os meus tipos funcionarão, agradáveis ​​e fáceis, e a linguagem resultante será rápido e suporte toda a minha semântica original, fácil de vincular.

DeadMG
fonte
Você deve tentar algo como esta biblioteca de invólucros que escrevi recentemente para resolver alguns dos mesmos problemas que você estava tendo. Você pode usar shared_ptrs e outras coisas com ele, é do tipo seguro (tanto quanto possível), você pode decidir se deseja que a vida de algo seja controlada pelo seu código ou pelo ambiente Lua, ele suporta herança e é extremamente semelhante à API Lua normal. No entanto, não tenho certeza de que recebo a reclamação sobre a criação de ligações, apenas uso os snippets do vim para fazer minhas ligações 99% do tempo.
Alex Ames
2

Para jogos baseados na Web, três fatores importantes para mim são:

  • Familiaridade
  • Rapidez
  • Integração

Eu particularmente gosto do Perl, em parte porque já estou familiarizado com a linguagem e porque, com um módulo de servidor da Web como o mod_perl2, há um enorme benefício de desempenho e integração - o mod_perl2 mantém uma versão compilada dos scripts na RAM (que são interpretados apenas sob primeiro carregamento), que oferece uma grande vantagem de velocidade em relação a outras linguagens interpretadas que não têm opções de compilação e também se integra ao servidor Apache HTTPd com uma API rica em recursos que fornece acesso a muitos recursos muito poderosos.

Esses fatores podem ser úteis para o desenvolvimento de jogos baseados na Web (e onde o acesso ao banco de dados é necessário, o armazenamento em cache das conexões com o banco de dados ajuda a reduzir ainda mais os tempos de resposta dos usuários). Obviamente, essa pode não ser a solução mais ideal para tudo, pois cada idioma tem suas vantagens (e desvantagens), mas sempre funcionou bem para minhas necessidades.

Randolf Richardson
fonte
2

Organizados na ordem de importância (decrescente):

  • Legível de relance. Na verdade, esse é um requisito para qualquer linguagem que eu queira usar, mas para scripts é sem dúvida mais importante: os scripts, por definição, mudam com mais frequência do que o código "principal". Portanto, sem LISP ou PERL.
  • Dispersão. Os scripts são constantemente escritos e reescritos, e digitar muitos e muitos códigos "clichê" é ineficiente.
  • Depuração fácil. De preferência com pontos de interrupção, passo a passo etc.
  • Fácil integração com a tecnologia "core" escolhida. Se eu estiver usando C ++ no meu jogo, eu precisaria de boas ligações C ++, como no LUA. Se o jogo estiver em C #, eu escolheria uma linguagem baseada em CLI: C #, IronPython, Boo.
  • Recursos de linguagem: matrizes associativas fáceis, coroutines, talvez lambdas. Na verdade, isso depende principalmente do motivo pelo qual vou usar os scripts. Os scripts de IA são diferentes, digamos, dos scripts de inicialização.
  • Boa documentação. O C # tem um MSDN inteiro dedicado a ele e o Boo tem apenas fontes. é por isso que o c # é muito melhor.
  • Bom ambiente de desenvolvimento. O VS ou o Eclipse sempre superam o Bloco de notas.
deixa pra lá
fonte
+1 Isso me ajuda bastante, obrigado. Vou esperar para ver se há alguma discussão adicional, mas acho que você a abordou bem.
Jon Purdy