Eingebettete Sprachen: Warum Lua?

Dieses Material setzt eine Reihe von Veröffentlichungen fort, die auf den Berichten basieren, die wir auf der Games Gathering 2017-Konferenz im vergangenen Dezember erstellt haben. In einem der Berichte wurde das Thema der Auswahl einer eingebetteten Skriptsprache angesprochen.



Was ist und warum werden Skriptsprachen benötigt?


Wie bereits im vorherigen Beitrag unseres Blogs erwähnt , hat unser Unternehmen eine eigene Engine geschrieben. Heute werden wir darüber sprechen, woran wir uns bei der Auswahl einer Skriptsprache für diese Engine orientiert haben.

Warum werden überhaupt Skriptsprachen benötigt? Wie das Sprichwort sagt: "In der Spielebranche gibt es keine komplexen Probleme, es besteht keine Notwendigkeit, komplexe Lösungen zu fordern . " Neben erfahrenen (und teuren!) Programmierern, die komplexe Probleme lösen, brauchen wir Leute (viele Leute!), Die sich beispielsweise mit Quests beschäftigen. Und um ehrlich zu sein, möchten wir, dass diese Programmierer nicht so teuer sind und im Idealfall überhaupt keine Programmierer, sondern direkt Spieledesigner und Drehbuchautoren.

Es besteht daher ein Bedarf an einem Werkzeug zur Beschreibung einer einfachen, aber dennoch logischen Darstellung, ohne dass die Programmierer schwere Artillerie einsetzen müssen. Wir schließen daraus - was ist eine Skriptsprache für uns? Dies ist ein Tool, das die Spieleentwicklung schneller und billiger macht.
Es stellt sich sofort die Frage, warum wir nicht einfach so etwas wie XML verwenden. Tatsache ist, dass wir für unsere Zwecke häufig Kontrollstrukturen benötigen - Verzweigungen und Schleifen, während XML eine deklarative Beschreibung ist.

Ein weiterer Vorteil von Skriptsprachen besteht darin, dass Skripte in einem Projekt entweder Code oder eine Ressource sein können. Dementsprechend kann der Skriptteil des Spiels nicht nur mit dem Code aktualisiert werden, dh während regelmäßiger Aktualisierungen über die Mechanismen von Anwendungsspeichern. Aber auch mit Ressourcen - also zusammen mit Grafiken und anderen Materialien, die CDN verwenden.

Perfekte Anforderungen an die Skriptsprache


Wir formulieren die Anforderungen für eine ideale Skriptsprache.

  • Dynamisch. Nach unserem Verständnis sollte eine ideale Skriptsprache dynamisch sein.
  • Popularität. Unter der Popularität einer Sprache verstehen wir das Vorhandensein einer ausreichend großen Community, die bereit ist, Fragen zu speziellen Ressourcen wie StackOverflow zu beantworten.
  • Die sanfte Lernkurve. Wir wollen relativ praktisch jede Person aufnehmen und sie schnell auf ein Niveau bringen, das es dieser Person ermöglicht, produktiv an unseren Aufgaben zu arbeiten.
  • Reichliche Möglichkeiten. Die Sprache muss leistungsfähig sein und über genügend Funktionen verfügen. Sie muss verschiedene Programmierparadigmen unterstützen. Ein professioneller Programmierer, dem angeboten wird, in einer solchen Sprache zu schreiben, kann dies mit Komfort und Vergnügen tun.
  • Hohe Leistung. Leistung ist einer der Eckpfeiler der Spielebranche.
  • Eine große Anzahl von Bibliotheken. Sehr oft erstellen wir bei der Lösung der uns anstehenden Aufgaben keinen grundlegend neuen Code, sondern verwenden das, was bereits jemand anderes geschrieben hat. Je stabiler und gut unterstützte Bibliotheken wir in einer bestimmten Sprache verwenden können, desto besser.
  • Einfach einzubetten. Wir sprechen von eingebetteten Sprachen. Bei der Auswahl einer Skriptsprache spielt die Möglichkeit, sie einzubetten, eine wichtige Rolle.

Lassen Sie uns einige gängige Programmiersprachen analysieren, die als Skripte verwendet werden, um diese Anforderungen zu erfüllen.

Python


Python ist eine dynamische Sprache, die sehr beliebt ist. Es zeichnet sich durch eine ziemlich sanfte Lernkurve aus, es ist recht einfach zu lernen. Es sollte jedoch nicht so einfach sein, es richtig zu studieren. Gute Python-Programmierer sind daher selten und teuer. Dies widerspricht unserem Wunsch, die Kosten für die Entwicklung der Spielelogik zu beschleunigen und zu senken.

Python hat großartige Funktionen und eine gute Leistung. Das Problem ist ein inkonsistentes Bibliothekssystem. Ein weiteres Problem, das für uns eine wichtige Rolle spielt, ist, dass er tatsächlich keine eingebettete Sprache ist. Dies ist eine Sprache, in der es bequem ist, in C oder C ++ geschriebene Bibliotheken aufzurufen.

In Bezug auf Python-Einbettungsfunktionen können wir sagen, dass es beispielsweise Maya gibt, in der Python verwendet wird. Aber jeder, der Python-Plugins für Maya von innen gesehen hat, wird uns zustimmen, dass sie nicht sehr gut aussehen.

Infolgedessen können wir sagen, dass Python trotz all seiner Stärken nicht zu uns passt. Betrachten Sie nun JavaScript.

Javascript


JavaScript ist ohne Übertreibung eine großartige Sprache, die buchstäblich die Welt erobert hat.

JavaScript ist eine beliebte dynamische Sprache, die sich durch eine sanfte Lernkurve auszeichnet, mit umfangreichen Funktionen, guter Leistung und einem umfangreichen Satz an Bibliotheken.

Wenn wir einen Sprachdolmetscher benötigen, um eine Spiel-Engine zu erstellen, können wir viele solcher Dolmetscher finden. In Wirklichkeit müssen Sie aus zwei solchen Projekten auswählen - V8 und WebKit. Sowohl das als auch das andere haben ziemlich große Größen. Wenn wir über Brettspiele sprechen, könnten wir das Risiko eingehen und den gesamten Dolmetscher in das Spiel einbeziehen. Bei Handyspielen passt diese Option jedoch nicht zu uns.

SocialQuantum verfügt über einen eigenen JavaScript-Interpreter, der 98% der Tests besteht. Wir planen, dieses Projekt in die Open Source-Kategorie zu übertragen.

Infolgedessen stellt sich heraus, dass JavaScript ein starker Kandidat für die Rolle einer eingebetteten Sprache ist, aber es passt auch nicht zu uns.

Haxe


Es sollte beachtet werden, dass sich die nächsten, wenn es um JavaScript geht, normalerweise an Haxe erinnern. Tatsächlich macht es jedoch keinen Sinn, über die Möglichkeit zu sprechen, diese Sprache als eingebettete Sprache zu verwenden, da Haxe tatsächlich weniger eine Sprache als vielmehr ein Transcompiler für andere Sprachen ist. Und das brauchen wir nicht.

Vielleicht sind wir mit ActionScript oder einer anderen Skriptsprache zufrieden?

ActionScript


Wenn wir ActionScript formal auf Übereinstimmung mit den oben genannten Anforderungen analysieren, scheint es, dass die ideale Skriptsprache gefunden wurde. Auf seiner Seite stehen die Dynamik, die Beliebtheit, die einfache Lernfähigkeit, die guten Funktionen, die Leistung, die Verfügbarkeit von Bibliotheken und die einfache Einbettung. Diese Sprache wird in der Spielebranche geliebt und in Erinnerung behalten. Sie enthält eine Vielzahl wundervoller Flash-Spiele. Das Hauptproblem bei ActionScript ist, dass diese Sprache fast tot ist. Deshalb passt er auch nicht zu uns.

AngelScript, Eichhörnchen und andere


Neben ActionScript gibt es viele Skriptsprachen wie AngelScript, Squirrel und andere. Unter ihnen finden Sie diejenigen, die formal fast vollständig unseren Anforderungen entsprechen, aber normalerweise sind dies Sprachen, die an ihren Entwickler gebunden sind. Sie haben einige alte Probleme, die seit Jahren nicht mehr behoben wurden. Höchstwahrscheinlich sind sie nicht sehr beliebt, sie sind nicht gut dokumentiert, es gibt nur wenige Schulungsmaterialien, sie haben keine sehr großen Gemeinschaften. Eine der Konsequenzen dieses Zustands ist die Tatsache, dass es schwierig ist, sie zu untersuchen - schon allein deshalb, weil nicht ganz klar ist -, was sie sind und wie sie funktionieren.

Wie Sie sehen, haben wir die ideale eingebettete Sprache noch nicht gefunden. Was ist, wenn Sie Ihre eigene Sprache erstellen?

Erstellen Sie Ihre eigene Sprache


Es ist möglich, dass die im Unternehmen entwickelte Sprache ideal zu ihren Bedürfnissen passt und leicht zu erlernen ist. Aber höchstwahrscheinlich wird eine solche Sprache nicht populär. Eine solche Sprache hat entweder eine minimale Anzahl von Bibliotheken oder sie existieren überhaupt nicht. Darüber hinaus ist es schwer zu glauben, dass es unter modernen Bedingungen möglich ist, etwas zu schaffen, das besser funktioniert, eine höhere Produktivität aufweist und einfacher zu integrieren ist als etwas, das bereits auf dem Markt ist.

Es gibt Unternehmen, die ihre eigenen Sprachen entwickeln und verwenden, darunter erfolgreiche Spielemarktteilnehmer, aber höchstwahrscheinlich ist dies keine gute Idee.

Nachdem wir die vorhandenen Programmiersprachen untersucht haben, die angeblich eingebettet sind, und die Idee der Entwicklung unserer eigenen Sprache diskutiert haben, gehen wir weiter zu Lua.

Lua ist die eingebettete Sprache, die wir gewählt haben


Lua ist eine dynamische Sprache. Es ist sehr beliebt, eine große Community hat sich um es herum entwickelt, insbesondere im Bereich der Spieleentwicklung. Es hat eine sehr sanfte Lernkurve. In unserem Unternehmen werden beispielsweise Skripte für Autotests in Lua geschrieben. Ein Standard-Einführungskurs für Autotests dauert ungefähr zwei Stunden. Danach kann eine Person diese Sprache verwenden. Gleichzeitig ist Lua eine Multi-Paradigmen-Sprache. Es unterstützt einen funktionalen Programmierstil und OOP. Infolgedessen eignet es sich nicht nur zur Lösung einiger einfacher Aufgaben, sondern auch für ernstere Angelegenheiten, die professionelle Programmierer erledigen.

Lua hat eine gute Leistung und es gibt einige Bibliotheken. Nicht so viel wie JavaScript, aber dennoch finden Sie auf der LuaForge- Website fast alles, was Sie benötigen. Und schließlich ist Lua sehr einfach einzubetten. Außerdem wurde es für die Verwendung als eingebettete Sprache erstellt.

So sieht beispielsweise unser JetBrains IDE CLion- Arbeitsbereich aus. Hier sehen Sie den von uns für Lua erstellten Autocomplete-Mechanismus, den wir als Open Source planen. Wir werden Open Source Debugger machen.



Arbeitsumgebung

Wir haben uns für Lua entschieden, aber wenn es darum geht, es als einbettbare Skriptsprache zu verwenden, stoßen Sie normalerweise auf dieselben Einwände, die wir jetzt berücksichtigen werden.

Einwände gegen die Verwendung von Lua


Lua ist für C, nicht für C ++


Niemand argumentiert, dass Lua eine großartige einbettbare Sprache ist. Die Hauptsache, die sie als Minus betrachten, ist, dass es für die Verwendung mit der C-Sprache und nicht mit C ++ erstellt wurde. Aus diesem Grund treten beim Versuch, etwas in Lua anzuwenden, das sich in C ++ und nicht in C befindet, Probleme auf. Man muss hier jedoch verstehen, dass diese Probleme von vielen ziemlich klugen Leuten gelöst wurden. Zu den Tools, die die Probleme beim Einbetten von Lua in C ++ lösen, gehören Projekte wie Luabind, Luabridge, toLua ++ und SQLuaHost. Dies ist keine vollständige Liste. Sie haben unterschiedliche Vor- und Nachteile, aber höchstwahrscheinlich ist alles, was Sie benötigen, bereits in einer dieser Lösungen implementiert.

Betrachten Sie beispielsweise SQLuaHost. Dies ist eine Bindung, die in SocialQuantum erstellt wird und Open Source sein soll. Diese Entscheidung repräsentiert unsere Vision, wie Lua binden soll. Daher ist es durchaus möglich, dass Sie es in SQLuaHost finden, wenn Sie in vorhandenen Ordnern nicht das gefunden haben, was Sie benötigen.

Lua ist langsam


Wir stoßen oft auf die Meinung, dass Lua eine sehr langsame Sprache ist. Erstens ist das nicht so. Lua ist eine gestapelte Maschine, und dort gibt es wirklich nichts zu verlangsamen. Außerdem müssen wir verstehen, dass wir in der Skriptsprache normalerweise Spielelogik, Geschäftslogik und nicht einige wirklich schwere Dinge verraten. Wenn Lua-Skripte das Spiel verlangsamen, liegt das Problem möglicherweise in einer suboptimalen Bindung oder einer unangemessenen Verwendung einiger Sprachfunktionen. Zum Beispiel haben wir synthetische Tests durchgeführt, bei denen LuaJIT schneller als Mono ist. Gleichzeitig stört es niemanden, über einen solchen nicht optimalen Code zu schreiben:

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

Hier wird in jedem Spiel-Tick eine neue Textur erstellt und als Hintergrund festgelegt. Natürlich wird ein solches Design nicht besonders schnell funktionieren, aber niemand stört sich daran, solche Dinge zu schreiben.

Lua ist nur für kleine Projekte geeignet.


Der nächste Einwand ist, dass Lua einige kleine Dinge schreiben soll und etwas Großes nicht in dieser Sprache geschrieben werden kann. Einerseits ist es wahr. Diese Sprache ist jedoch sehr modular. Und aus den vielen kleinen Blöcken können Sie ziemlich große und komplexe Systeme erstellen. Und wenn Sie sich an das erinnern, was bereits über Multiparadigmness und OOP gesagt wurde, stellt sich heraus, dass OOP den Entwickler dazu ermutigt, kleine Module zu erstellen, mit denen große und komplexe Strukturen erstellt werden können.

Darüber hinaus werden auf Lua häufig einige kleine Module schnell geschrieben, und in der Spielebranche bedeutet „schneller“ „billiger“.

Andere Argumente gegen Lua


Sie kritisieren Lua und sagen, dass die Sprache uralt ist, dass sie, wie sie sagen, "out of the box" OOP nicht unterstützt, dass die Nummerierung der Elemente in ihren Tabellen nicht mit 0 beginnt, wie man es von einer anständigen Sprache erwarten würde, sondern mit 1.


Sie sagen, dass sein Minus ist, dass es keinen ternären Operator hat. Tatsächlich gibt es einige Argumente gegen Lua, aber wir werden sie nicht diskutieren, da wir glauben, dass sie sich größtenteils auf die Gewohnheiten und persönlichen Vorlieben der Entwickler beziehen.

Zusammenfassung


Zusammenfassend. Wenn es Ihre Aufgabe ist, mit minimalem Aufwand eine eingebettete Sprache zu erhalten, nehmen Sie Lua. Wenn Sie Zeit und Ressourcen haben, um Ihre eigene Sprache oder Ihre eigenen Bindungen zu entwickeln, achten Sie gleichzeitig auf Lua. Warum empfehlen wir Lua sowohl im ersten als auch im zweiten Fall?

Wenn Sie sich für Lua entscheiden, wählen Sie im ersten Fall eine Sprache, die sehr einfach einzubetten und zu verwenden ist. Es gibt genau ein Tutorial zu dieser Sprache, das vom Autor geschrieben wurde. Es gibt keine anderen Bücher, nur weil das erste absolut alles erzählt, was Sie über Lua wissen müssen, und es gibt nichts mehr zu erzählen. Lua ist keine ideale oder am weitesten verbreitete Sprache der Welt, aber nach der Summe der Kriterien definitiv eine der besten Sprachen zum Einbetten. Er ist der Beste, den wir derzeit haben. Darüber hinaus gibt es viele Standardwerkzeuge für Lua, die das Leben derjenigen, die es verwenden, erheblich vereinfachen.

Im zweiten Fall, wenn Sie über die Ressourcen verfügen, um Tools zu entwickeln, kann die Auswahl von Lua diese Ressourcen wirklich ausgeben, da Lua trotz seiner Beliebtheit in der Spieleentwicklungsumgebung die Sprache sehr unterschätzt wird. Auf diese Weise haben Sie die Möglichkeit, auf der Grundlage von Lua Ihre Bedürfnisse zu berücksichtigen und genau das zu erhalten, was Sie benötigen.

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


All Articles