Warum sollte ich eine Skriptsprache einbetten? [geschlossen]

8

Ich lerne jetzt C ++ und habe viel über eingebettete Skriptsprachen gehört. Ich habe mir das ganz anders vorgestellt.

Ich dachte, ich würde alle meine leistungsstarken Funktionen in C ++ schreiben und sie aus einer Skriptsprache wie Lua oder Python heraus aufrufen.

Aber es scheint, es ist umgekehrt. - & gt; Schreibe Funktionen in Lua / Python und rufe sie in C-Code auf.

Was ist der Vorteil des Einbettens einer Sprache in C ++, anstatt eine API in C ++ zu schreiben und diese Funktionen in einer anderen Sprache aufzurufen?

Beispiel:

%Vor%

Dann würde ich in Python diese Funktion aufrufen und ich hätte die Performance von C ++, kann aber zur Laufzeit dank Pythons Laufzeit-Interpreter Änderungen vornehmen.

    
Maik Klein 05.11.2012, 23:30
quelle

6 Antworten

4

Tatsächlich bauen viele Spiele-Engines Schnittstellen zu der Engine, indem sie Lua oder Python einbetten. Das hat Vorteile:

  • Nicht-Programmierer können mit der Engine interagieren.
  • Sie müssen nicht für kleinere Skriptänderungen neu kompilieren.
  • Fehler im Skript könnten nicht das gesamte System zum Absturz bringen.

C ++ ist sehr nützlich als Backend für Projekte, die die Flexibilität von Skriptsprachen wünschen, aber die Leistung von C ++ wollen. Ich habe nicht von Projekten gehört, die C ++ als Frontend verwenden, mit einer Skriptsprache als Backend.

API-Stil

Wir verwenden diesen Stil in der Software meines Unternehmens. Wir stellen eine API über eine Windows-DLL bereit, die von den meisten Sprachen relativ einfach aufgerufen werden kann. Wir unterstützen speziell VB und VBA. Das ist großartig, wenn das Backend außerhalb der Kontrolle des Skriptherstellers liegt. Es ist jedoch schwierig, Probleme zu beheben, die sich aus der Perspektive des Skriptherstellers ergeben.

Vorteile

  • Starke Entkopplung
  • Zugänglich von verschiedenen Sprachen

Nachteile

  • Schwer zu debuggen 2 Prozesse

Eingebetteter Stil

Die Software bettet den Skript-Interpreter tatsächlich in die Software ein. Auf diese Weise können Sie Funktionen als native Funktionen bereitstellen. In diesem Stil befinden sich die Skripthersteller und die Backend-Programmierer typischerweise in derselben Firma. Es kann auch von herkömmlicher Software verwendet werden, damit andere die Funktionalität der Anwendung erweitern können. Wenn sie Quellcode freigeben, können Sie Probleme, die sich aus Skripten ergeben, auf einfachere Weise beheben. Die Anwendung kümmert sich auch darum, wann und wie Sie Ihre Skripte starten. Um zusätzliche Sprachen zu unterstützen, muss der Anwendungsentwickler jedoch weitere Interpreter einbinden.

Vorteile

  • Stärkere Kopplung
  • Einfacher Debuggen eines Prozesses

Nachteile

  • Nur über die zugelassene Sprache verfügbar
Michael McGuire 05.11.2012, 23:37
quelle
3

Wirklich, beide Ansätze funktionieren gut. Die Frage ist, welcher Ansatz für Ihre spezielle Anwendung besser geeignet ist.

Wenn Sie z. B. performance-lastigen Code als Erweiterung einer Sprache schreiben, eignet sich dies gut für Anwendungen, bei denen Sie das Gefühl haben möchten, dass jemand eine kleinere Bibliothek in der Skriptsprache verwendet. Wenn Sie eine performante API zum Rendern von Grafiken bereitstellen möchten, die Sie in eine Python-Anwendung einfügen, ist dies der richtige Weg.

Auf der anderen Seite, wenn Sie eine Engine haben, die fast vollständig in C ++ geschrieben ist - wie eine Spiele-Engine - und Sie eine einfache Möglichkeit zum Einbinden in die Spiele-Engine bereitstellen möchten, ohne dass eine Neukompilierung erforderlich ist > können Sie den Interpreter einbetten. Dies ist der Grund, warum Gem-Motoren oft z. KI oder Verhaltenshaken in einer Skriptsprache: Ändere zum Beispiel die "Reaktionszeit" eines Bots und du kannst den Unterschied sofort erkennen, manchmal sogar, ohne das Spiel neu starten zu müssen.

Es hängt alles davon ab, welche Seite "größer" ist, aber Sie können beide Ansätze mit Lua oder Python machen, glaube ich.

    
Matt 06.11.2012 02:00
quelle
1

Skripts werden zur Laufzeit kompiliert, während die Hauptsprache zur Kompilierungszeit kompiliert wird. Dies würde das Arbeiten mit einer großen Codebasis relativ einfach machen, da Sie nicht das gesamte Projekt kompilieren müssten, um ein einfaches Skript zu aktualisieren.

    
Rapptz 05.11.2012 23:33
quelle
1

Ein Grund könnte sein, dass Sie ein C ++ - Framework verwenden möchten, das seine eigene Hauptfunktion enthält (und Sie dazu zwingt, diese als Hauptfunktion Ihres Programms zu verwenden).

Meiner Meinung nach ist das oft ein schlechtes Design des Frameworks - es ist nicht einfach, mehr als einen solchen Framework in einem Programm zu verwenden ...

Dasselbe gilt für mehrere Skriptsprachen in einem Programm: Nur eine Sprache kann die Hauptfunktion bereitstellen. Alle anderen Sprachen müssen eingebettet sein.

Hinweis: Mit Threads können Sie etwas wie "mehrere Hauptfunktionen" erhalten. Nun, nicht wirklich mehrere Hauptfunktionen. Aber mehrere Event-Handling-Schleifen.

    
Sebastian 05.11.2012 23:51
quelle
1

Ich habe Python einmal in eine Robotersteuerung eingebettet. Der Controller verwaltete einen Roboter, der Chipwafer abwickelte, und er steuerte auch verschiedene andere Geräte. Der Kunde könnte ein Python-Programm schreiben, das Dinge wie das Bleiben mit den Wafern macht, Türen öffnet, Lichter ein- und ausschaltet, Schalter liest usw. Oder es könnte Anweisungen von einer seriellen Leitung oder einem Ethernet lesen und sie in Aktionen übersetzen . Natürlich wurde die Feinsteuerung des Roboters auf C ++ - Ebene gehandhabt, wobei die höchste Priorität auf einem Echtzeit-OS lief.

    
Jive Dadson 06.11.2012 02:11
quelle
1

Neben Überlegungen wie Leistung, Neukompilierung, Wartbarkeit, ist ein weiterer Grund die Codesicherheit.

Kompilierte Sprache wie c / c ++ ist härter (nicht unmöglich) für andere, um Ihren genauen Algorithmus ohne Quellcode zu kennen, während Skripte (anscheinend) leichter sind Logik, weil sie zur Laufzeit zur Kompilierung vorhanden sind.

    
user1500049 06.11.2012 02:58
quelle

Tags und Links