Idiomas incorporados: Por que Lua?

Este material continua uma série de publicações com base nos relatórios que fizemos na conferência Games Gathering 2017, em dezembro passado. Em um dos relatórios , o tópico de escolha de uma linguagem de script incorporada foi abordado.



O que é e por que são necessárias as linguagens de script


Como já mencionado na postagem anterior do nosso blog , nossa empresa criou seu próprio mecanismo. Hoje falaremos sobre o que fomos guiados ao escolher uma linguagem de script para esse mecanismo.

Por que existe a necessidade de linguagens de script? Como diz o ditado, "na indústria de jogos não há problemas complexos, não há necessidade de exigir soluções complexas" . Além de programadores experientes (e caros!) Que resolvem problemas complexos, precisamos de pessoas (muitas pessoas!) Que se envolverão em, digamos, missões. E, para ser sincero, gostaríamos que esses programadores não fossem tão caros e, idealmente, nem programadores, mas diretamente designers de jogos e roteiristas.

Portanto, há uma necessidade de uma ferramenta para descrever lógica simples, mas ainda lógica, sem envolver artilharia pesada por programadores. Concluímos - o que é uma linguagem de script para nós? Esta é uma ferramenta que tornará o desenvolvimento de jogos mais rápido e mais barato.
Surge imediatamente a pergunta: por que não usamos apenas algo como XML? O fato é que, para nossos propósitos, geralmente precisamos de estruturas de controle - ramificações e loops, enquanto XML é uma descrição declarativa.

Outra vantagem das linguagens de script é que os scripts em um projeto podem ser um código ou um recurso. E, consequentemente, a parte do script do jogo pode ser atualizada não apenas com o código, ou seja, durante atualizações regulares por meio dos mecanismos das lojas de aplicativos. Mas também com recursos - isto é, junto com materiais gráficos e outros usando CDN.

Requisitos de linguagem de script perfeita


Formulamos os requisitos para uma linguagem de script ideal.

  • Dinâmico. Em nosso entendimento, uma linguagem de script ideal deve ser dinâmica.
  • Popularidade. Por popularidade de um idioma, queremos dizer a presença de uma comunidade suficientemente grande pronta para responder a perguntas sobre recursos especializados como o StackOverflow.
  • A suave curva de aprendizado. Queremos levar, relativamente falando, praticamente qualquer pessoa, e treiná-la rapidamente para um nível que permita que essa pessoa trabalhe produtivamente em nossas tarefas.
  • Amplas oportunidades. A linguagem deve ser poderosa e ter recursos suficientes, deve suportar diferentes paradigmas de programação. Um programador profissional que se ofereça para escrever nesse idioma poderá fazer isso com conforto e prazer.
  • Alto desempenho. O desempenho é um dos pilares da indústria de jogos.
  • Um grande número de bibliotecas. Muitas vezes, durante a solução dos problemas que enfrentamos, não criamos um código fundamentalmente novo, mas usamos o que outra pessoa já escreveu. Quanto mais estáveis ​​e bem suportadas as bibliotecas pudermos usar usando uma determinada linguagem, melhor.
  • Fácil de incorporar. Estamos falando de linguagens incorporadas, portanto, ao escolher uma linguagem de script, a capacidade de incorporá-la desempenha um papel importante.

Vamos analisar algumas linguagens de programação populares usadas como scripts para atender a esses requisitos.

Python


Python é uma linguagem dinâmica muito popular. É caracterizado por uma curva de aprendizado bastante suave, é bastante simples de aprender. No entanto, estudá-lo corretamente não deve ser tão fácil. Como resultado, bons programadores de Python são raros e caros. Isso contradiz o nosso desejo de acelerar e reduzir o custo do desenvolvimento da lógica do jogo.

Python tem ótimos recursos e bom desempenho. Seu problema é um sistema de biblioteca inconsistente. Outro de seus problemas, que desempenha um papel importante para nós, é que ele, de fato, não é uma linguagem embutida. Essa é uma linguagem da qual é conveniente chamar bibliotecas escritas em C ou C ++.

Em relação aos recursos de incorporação do Python, podemos dizer que, por exemplo, existe o Maya, onde o Python é usado. Mas qualquer um que tenha visto os plugins Python para o Maya por dentro concorda que não parece muito bom.

Como resultado, podemos dizer que o Python, por todos os seus pontos fortes, não nos convém. Agora considere JavaScript.

Javascript


JavaScript é, sem exagero, uma ótima linguagem que literalmente dominou o mundo.

JavaScript é uma linguagem dinâmica popular, caracterizada por uma suave curva de aprendizado, com recursos avançados, bom desempenho e um extenso conjunto de bibliotecas.

Se precisarmos de um intérprete de linguagem para criar um mecanismo de jogo, podemos encontrar muitos desses intérpretes. Na realidade, você precisa escolher entre dois desses projetos - V8 e WebKit. Tanto isso como outro têm tamanhos bastante grandes. Como resultado, se estivermos falando de jogos de tabuleiro, poderemos arriscar e incluir todo o intérprete no jogo, mas no caso de jogos para celular, essa opção não é adequada para nós.

O SocialQuantum possui seu próprio intérprete JavaScript, que passa em 98% dos testes, planejamos transferir esse projeto para a categoria de código aberto.

Como resultado, o JavaScript parece ser um forte candidato ao papel de uma linguagem incorporada, mas também não é adequado para nós.

Haxe


Deve-se notar que, quando se trata de falar sobre JavaScript, os próximos geralmente se lembram do Haxe. Mas, de fato, não faz sentido falar sobre a possibilidade de usar essa linguagem como uma linguagem incorporada, uma vez que o Haxe, na verdade, não é tanto uma linguagem como um transcompilador para outras línguas. E não é disso que precisamos.

Talvez estejamos satisfeitos com o ActionScript ou alguma outra linguagem de script?

ActionScript


Se analisarmos formalmente o ActionScript para conformidade com os requisitos acima, pode parecer que a linguagem de script ideal foi encontrada. Por seu lado, estão a natureza dinâmica, popularidade, facilidade de estudo, bons recursos, desempenho, disponibilidade de bibliotecas e facilidade de incorporação. Este idioma é amado e lembrado na indústria de jogos, está escrito um grande número de maravilhosos jogos em Flash. O principal problema do ActionScript é que essa linguagem está quase morta. Portanto, ele também não nos convém.

AngelScript, Squirrel e outros


Além do ActionScript, existem muitas linguagens de script como AngelScript, Squirrel e outras. Entre eles, você pode encontrar aqueles que formalmente satisfazem quase completamente nossos requisitos, mas geralmente são linguagens ligadas ao desenvolvedor, eles têm alguns problemas antigos que não foram corrigidos por anos. Provavelmente, eles não são muito populares, não estão bem documentados, existem poucos materiais de treinamento, não possuem comunidades muito grandes. Uma das conseqüências desse estado de coisas é o fato de serem difíceis de estudar - nem que seja porque não está completamente claro - o que são e como funcionam.

Como você pode ver, ainda não encontramos a linguagem incorporada ideal. E se você criar seu próprio idioma?

Crie seu próprio idioma


É possível que o idioma desenvolvido na empresa atenda idealmente às suas necessidades e seja fácil de aprender. Mas, muito provavelmente, esse idioma não se tornará popular. Essa linguagem terá um número mínimo de bibliotecas ou elas não existirão. Além disso, é difícil acreditar que nas condições modernas seja possível criar algo que funcione melhor, que tenha maior produtividade e seja mais fácil de integrar do que algo que já está no mercado.

Existem empresas que desenvolvem e usam seus próprios idiomas, entre elas existem players bem-sucedidos no mercado de jogos, mas provavelmente isso não é uma boa idéia.

Tendo examinado as linguagens de programação existentes que afirmam ser incorporadas e discutido a idéia de desenvolver nossa própria linguagem, vamos para Lua.

Lua é a linguagem incorporada que escolhemos


Lua é uma linguagem dinâmica. É bastante popular, uma grande comunidade se desenvolveu em torno dela, especialmente no campo do desenvolvimento de jogos. Tem uma curva de aprendizado muito suave. Por exemplo, em nossa empresa, os scripts para autotestes são escritos em Lua. Um curso introdutório padrão para autotestes leva cerca de duas horas, após as quais uma pessoa é capaz de usar esse idioma. Ao mesmo tempo, Lua é uma linguagem multiparadigma. Ele suporta um estilo funcional de programação e OOP. Como resultado, é adequado não apenas para resolver algumas tarefas simples, mas também para assuntos mais sérios que os programadores profissionais fazem.

Lua tem um bom desempenho e possui algumas bibliotecas. Não tanto quanto JavaScript, mas, no entanto, no site LuaForge você pode encontrar quase tudo o que precisa. E, finalmente, Lua é muito fácil de incorporar, além disso, foi criado para ser usado como uma linguagem incorporada.

Por exemplo, eis a aparência do nosso espaço de trabalho do JetBrains IDE CLion . Aqui você pode ver o mecanismo de preenchimento automático criado por nós para Lua, que planejamos criar código aberto. Nós vamos fazer o depurador de código aberto.



Ambiente de trabalho

Escolhemos Lua, mas quando se trata de usá-lo como uma linguagem de script incorporável, você geralmente encontra as mesmas objeções que consideraremos agora.

Objeções ao uso de Lua


Lua é para C, não para C ++


Ninguém argumenta que Lua é uma ótima linguagem incorporável. A principal coisa que eles consideram um sinal de menos é que ele foi criado para uso com a linguagem C, e não C ++. Por isso, ao tentar aplicar algo em Lua que está em C ++ e não em C, encontramos problemas. No entanto, é preciso entender aqui que esses problemas foram resolvidos por muitas pessoas bastante inteligentes. Entre as ferramentas que resolvem os problemas de incorporação de Lua em C ++ estão projetos, como Luabind, Luabridge, toLua ++, SQLuaHost. Esta não é uma lista completa. Eles têm vantagens e desvantagens diferentes, mas, no entanto, provavelmente, tudo o que você precisa já está implementado em uma dessas soluções.

Considere, por exemplo, SQLuaHost. Essa é uma ligação feita dentro do SocialQuantum e planejada para ser de código aberto. Esta decisão representa nossa visão de como Lua deve se ligar. Portanto, é bem possível que, se você não encontrou o que precisa nos binders existentes, você o encontrará no SQLuaHost.

Lua é lenta


Muitas vezes, achamos que Lua é uma linguagem muito lenta. Em primeiro lugar, não é assim. Lua é uma máquina empilhada, e realmente não há nada para desacelerar por lá. Além disso, devemos entender que, na linguagem de script, geralmente distribuímos lógica de jogo, lógica de negócios e não algumas coisas realmente pesadas. Como resultado, se os scripts Lua causarem lentidão no jogo, o problema poderá estar na ligação subótima ou no uso inadequado de alguns recursos da linguagem. Por exemplo, realizamos testes sintéticos nos quais o LuaJIT é mais rápido que o Mono. Ao mesmo tempo, ninguém se preocupa em escrever sobre esse código não ideal:

function myGame:onUpdate()    local tex = Texture::new(name)    self.background:setTexture(tex) end 

Aqui, em cada jogo, uma nova textura é criada e definida como plano de fundo. Obviamente, esse design não funcionará especialmente rápido, mas ninguém se preocupa em escrever essas coisas.

Lua é adequado apenas para pequenos projetos.


A próxima objeção é que Lua é feita para escrever algumas coisas pequenas e algo grande não pode ser escrito nesta linguagem. Por um lado, é verdade. Mas essa linguagem é altamente modular. E a partir de muitos blocos pequenos, você pode criar sistemas bastante grandes e complexos. E se você se lembra do que já foi dito sobre multiparadigmidade e OOP, acontece que o OOP incentiva o desenvolvedor a criar pequenos módulos que podem ser usados ​​para criar estruturas grandes e complexas.

Além disso, geralmente em Lua alguns módulos pequenos são escritos rapidamente, e na indústria de jogos "mais rápido" significa "mais barato".

Outros argumentos contra Lua


Criticando Lua, eles dizem que a linguagem é antiga, que, como dizem, "pronto para uso" não suporta OOP, que a numeração de elementos em suas tabelas não começa com 0, como seria de esperar de qualquer linguagem decente, mas com 1


Eles dizem que seu ponto negativo é que ele não possui um operador ternário. De fato, existem muitos argumentos contra Lua, mas não os discutiremos, pois acreditamos que eles, em sua maioria, se relacionam com os hábitos e preferências pessoais dos desenvolvedores.

Sumário


Para resumir. Se sua tarefa é obter uma linguagem incorporada com o mínimo de esforço, use Lua. Ao mesmo tempo, se você tiver tempo e recursos para desenvolver sua própria linguagem ou suas próprias ligações - novamente - preste atenção em Lua. Por que recomendamos Lua no primeiro e no segundo casos?

No primeiro caso, escolhendo Lua, você escolherá um idioma que é muito fácil de incorporar e usar. Há exatamente um tutorial sobre esse idioma escrito por seu autor. Não existem outros livros simplesmente porque o primeiro diz absolutamente tudo o que você precisa saber sobre Lua e não há mais nada a dizer sobre isso. Lua não é uma linguagem ideal ou a mais difundida no mundo, mas, pela soma dos critérios, é definitivamente uma das melhores linguagens para incorporação. Ele é o melhor que temos agora. Além disso, existem muitas ferramentas padrão para Lua que simplificam bastante a vida de quem as usa.

No segundo caso, se você tem recursos para desenvolver ferramentas, escolhendo Lua, você pode realmente gastá-los, pois Lua, apesar de sua popularidade no ambiente de desenvolvimento de jogos, a linguagem é muito subestimada. Como resultado, você terá a oportunidade, tomando Lua como base, para levar em consideração suas necessidades e obter exatamente o que precisa.

Source: https://habr.com/ru/post/pt428253/


All Articles