Ich habe von mehreren Situationen gehört, in denen Leute JavaScript oder Python (oder etwas anderes) in einem in C # geschriebenen Programm verwenden. Wann wäre es besser, eine Sprache wie JavaScript zu verwenden, um etwas in einem C # -Programm zu tun, als es nur in C # zu tun?
70
Antworten:
Wenn Sie ein Verhalten haben, das Sie nicht neu kompilieren müssen, um es zu ändern. Genau aus diesem Grund verwenden so viele Spiele Lua als Skriptsprache.
quelle
Diese Technik kann verwendet werden, um Kernlogik zu implementieren, die leicht zwischen verschiedenen Sprachumgebungen portierbar ist. Zum Beispiel habe ich einen Taschenrechnersimulator, in dem die gesamte interne Taschenrechnerlogik in 100% JavaScript implementiert ist. Der Benutzeroberflächencode ist natürlich für jede Plattform unterschiedlich:
Mit dieser Anordnung ist es viel einfacher, Versionen meines Programms für verschiedene Betriebsumgebungen zu erstellen und insbesondere auf dem neuesten Stand zu halten.
quelle
Im Allgemeinen gibt es zwei Situationen, in denen Sie dieses Muster anwenden würden:
Im Inneren
Ein Beispiel hierfür ist Lua, das in Adobe Lightroom verwendet wird.
Äußerlich
IBM hat Skriptsprachen in ihrem Mainframe-Betriebssystem VM-CMS sehr erfolgreich eingesetzt . EXEC , EXEC / 2 und später Rexx wurden systemübergreifend sowohl intern als auch extern eingesetzt. Verschiedene Anwendungen (z. B. XEDIT ) waren mit denselben Sprachen skriptfähig, und interne Anwendungen / Dienstprogramme (z. B. E-Mail) wurden in der Skriptsprache geschrieben und nutzten die enge Integration mit dem Betriebssystem und anderen Tools. Kunden haben viele skriptbasierte Tools und Anwendungen erstellt und freigegeben. DEC lieferte auch DCL . Später unterstützte Microsoft VBscript als Skriptsprache in den meisten Anwendungen und neuerdings auch in PowerShell(auch MS / DOS- Batchdateien ). Unix-Shells haben auch Scripting .
Der heutige Trend scheint darin zu bestehen, APIs in irgendeiner Weise verfügbar zu machen und die Wahl der Skriptsprache Benutzern zu überlassen, die unterschiedliche Bindungen oder andere Möglichkeiten für den Zugriff auf die API verwenden können.
quelle
Beispiele aus der Praxis wären:
Die meisten Webbrowser, die eingebettetes JavaScript unterstützen.
Microsoft Office Suite - Excel Word usw. Alle unterstützen eingebettete VBA-Skripte.
Viele Netzwerkrouter enthalten Skript-APIs in einer Vielzahl von Sprachen TCL, Perl, Lua.
Viele eingebettete Geräte werden mit einem sehr kleinen Satz von C-Kernfunktionen implementiert, die mit einer Skriptsprache wie Lua zusammengefügt werden. Sie verfügen also über eine Reihe kleiner, schneller C-Funktionen, die mit der Hardware und dem Großteil der Steuerlogik in einer flexiblen, einfach zu ändernden Skriptsprache interagieren.
quelle
Manchmal ist Scripting in eine Anwendung eingebettet, weil es die Host-Anwendung durch andere Entwickler erweitern kann. Um ein möglichst breites Spektrum an Programmiersprachenkenntnissen zu erfassen, können vom Host mehrere Skriptsprachen unterstützt werden. In der JVM können Sie beispielsweise eine ganze Reihe von JSR-223-kompatiblen Sprachen wie Python, Ruby, JavaScript usw. einbetten .
Ein weiterer Grund, der nicht bereits erwähnt wurde, ist, dass die eingebettete Sprache ein oder mehrere herausragende Merkmale aufweist, die die Hostsprache nicht leicht duplizieren kann. Ein Beispiel hierfür wäre die Parse-Funktionalität oder die mühelose Erstellung von DSL (domänenspezifische Sprache / Dialekt), die in einer Sprache wie Rebol zu finden ist.
quelle
Es gibt eine interessante Möglichkeit, eine Skriptsprache in einer Anwendung zu verwenden, die von den anderen noch nicht erwähnt wurde.
Wenn Ihre Host-Sprache eine umfangreiche, reflektierende Laufzeit hat, ist es oft nützlich, eine einfache Sprache mit REPL in Ihre Anwendungen einzubetten, sie an einen Socket anzuschließen und ihr Zugriff auf das gesamte System zu gewähren.
Es kann für ein interaktives Debugging (und es ist natürlich viel leistungsfähiger als Ihr gewöhnlicher Debugger), Hot-Code-Patches, verschiedene Überwachungszwecke und sogar für Hintertüren (wenn Sie nichts Gutes im Sinn haben) verwendet werden.
quelle
Meine spezielle Situation, wenn ich in einer Hauptanwendung eine interpretierte Skriptsprache verwende:
Es gibt ein externes Gerät, das mehrere Funktionen ausführt. Messungen, Kontrolle, Anzeigen. Es ist selbst ziemlich "doof" und erfordert eine präzise Steuerung, die Schritt für Schritt viele Wartezustände und Ad-hoc-Entscheidungen auf der Seite des Steuerungsmechanismus umfasst.
Verschiedene Funktionen des Geräts werden an verschiedenen Stellen der Hauptanwendung zu unterschiedlichen Zeiten benötigt, oft nach Bedarf. Die Haupt-App erlaubt keine Wartezustände als solche, alles muss mit Zustandsautomaten erfolgen.
Wer nun eine Zustandsmaschine geschrieben hat, der weiß, dass das Implementieren eines Wartezustands effektiv mindestens zwei, oft drei oder vier interne Zustände der Maschine ist. Das Implementieren von 20 Wartezuständen für verschiedene Funktionen (und das Warten auf deren Antworten und das entsprechende Reagieren) des externen Geräts wäre eine sehr, sehr frustrierende Erfahrung.
Stattdessen gibt es also Zustände wie "Ausführen einer Nichtwarte-Funktion", "Ausführen einer Blockierfunktion", "Ausführen einer Verzweigungs- / Bedingungs- / Sprungfunktion" in der Zustandsmaschine, möglicherweise insgesamt sechs Zustände. Außerdem gibt es Steuerskripte, deren Ausführung vom Interpreter, der das externe Gerät steuert, geplant und deren Ergebnisse dort abgelegt werden, wo sie benötigt werden.
Zusammenfassend lässt sich sagen, dass die Verwendung einer intern interpretierten Skriptsprache in einem RTOS die Komplexität der Ausführung von Aufgaben, die in Wartezuständen häufig vorkommen (Blockierungsfunktionen), erheblich verringern kann.
quelle
Aus meiner Erfahrung heraus haben wir einmal eine große Anwendung entwickelt, die den Quellcode einer "alten" Sprache neu schreibt, um Unicode-kompatibel zu sein. Das wurde in C # gemacht. Am Ende habe ich nur die Engine (die ein Datenmodell erstellt und die notwendigen Schritte für den Umschreibevorgang bereitstellt) in C # geschrieben - der "Glue-Code" für die eigentliche Ausführung wird in IronPython erstellt.
Der größte Punkt für das integrierte IronPython: Nehmen wir an, Sie haben ein Big-Data-Modell geladen (etwa eine Stunde Ladezeit). Dann möchten Sie manuell Informationen sammeln und nachschlagen. Dies mit einem Python-Skript von einer interaktiven Konsole aus zu tun, ist weitaus besser als mit dem Debugger durch das Datenmodell zu klicken (und es kann wieder abgespielt werden).
quelle
Es gibt einige Gründe.
quelle
Wann? Zwischen 1948 und 2008 dauerte das Kompilieren und Verknüpfen der ursprünglich kompilierten Sprachen sehr lange. Daher war es üblich, eine Skriptsprache zu erstellen, mit der Benutzer angepasst und konfiguriert werden konnten. Wenn Sie sich den Verlauf von AutoLisp ansehen, lautet die Antwort zunächst AutoCAD mit einer darin enthaltenen Skriptsprache. Dies wurde jedoch eingestellt, um eine skriptfähige Schnittstelle für VBA und dann für .net bereitzustellen.
Mit CLR unterscheidet sich die Aktivierung eines C # -Programms oder eines Lua-Programmaufrufs in einem vorhandenen System nicht wesentlich in den Entwicklungskosten. Die .net-Laufzeitumgebung wird mit den Tools geliefert, die zum Generieren und Kompilieren im laufenden Betrieb benötigt werden.
Sie müssen keine Skriptsprache mehr im größeren Programm haben, sondern müssen das größere Programm den Skriptfunktionen der Laufzeit aussetzen.
In Umgebungen, die keine direkte Codegenerierung und -kompilierung bieten und es als wünschenswert erachtet wird, anstelle einer domänenspezifischen eine allgemeine Automatisierungssprache anzubieten, erhalten Sie weiterhin Lua- oder Python-Skripte. Bei Tools mit COM-Schnittstelle ist diese Skriptsprache C # oder VB.net (MS Office, Sparx Enterprise Architect). Eine Skriptsprache für ein Programm zu haben, das in einer Sprache geschrieben ist, die selbst einfach genug ist, um eine Skriptsprache zu sein, ist daher unnötig.
quelle