Wenn Sie dem Benutzer die Möglichkeit geben möchten, Plugins für Ihre Anwendung zu schreiben, stehen Sie vor der Wahl, wie die API bereitgestellt werden soll. Unter dem Schnitt werde ich zeigen, warum die schlechteste Lösung dafür darin besteht, Ihre eigene Programmiersprache zu erfinden und Quellcodes sowie Möbel zu analysieren.

PL ist nicht die Hauptfunktion der Anwendung
Stellen Sie sich vor, wir hätten die Produktion von modularen Möbeln eröffnet. Es gibt einige Grundelemente: Arbeitsplatten, Untersetzer, Nachttische usw. Mit der Holzverarbeitung ist eine Produktionslinie verbunden: Werkzeugmaschinen, Sägen, Lacke, alle mit der neuesten Technologie. Aber das alles muss irgendwie zusammengehalten werden. Wir wissen, dass es 100.500 Unternehmen gibt, die sich auf die Herstellung von Hardware und Schrauben spezialisiert haben. Es gibt einige Standards für Möbelbefestigungen, die von einer Gemeinschaft von Fachleuten erfunden wurden, um ihren Kunden das Leben zu erleichtern. Wie weitsichtig wird die Entscheidung sein, eine zusätzliche Linie für die Herstellung eigener Schrauben, Muttern und Winkel einzusetzen?
Was können wir gewinnen?
- Auf diese Weise können wir unser Produkt so brandmarken , dass der Hamster seine "Originalität" spürt und mehr Geld trägt.
- Vielleicht können wir dadurch für keine der Schrauben das Urheberrecht bezahlen oder das Logistikproblem lösen.
- Wir können in einen neuen Markt für Schrauben und Muttern eintreten und unseren eigenen Standard setzen, der schneller, besser und höher ist.
Aber lass uns sauber sein.
- Ilitismus ist die Arbeit von Verkäufern. Der Verkäufer wird die Marke mit oder ohne neue Produktionslinie zur Elite machen oder nicht.
- Das Urheberrecht ist in der Regel (natürlich nicht immer) billiger als die Entwicklung von Grund auf neu. Wenn Sie das Problem der Bereitstellung eines Elements durch die Bereitstellung einer neuen Produktionslinie lösen, verschärfen Sie es nur.
- Wenn wir ein neues Tätigkeitsfeld für uns selbst ausprobieren möchten, müssen wir es nicht mit dem verbinden, in dem wir bereits Profis sind. Es mag scheinen, dass es einfacher ist, die Schrauben mit den Möbeln zu drücken, aber wenn die Schrauben nicht hochfliegen, ziehen sie die Möbel mit sich. Zumindest das, was bei Kunden schon kostet.
Zurück zu unseren Schafen: Wenn Sie ein Ökosystem für die Erweiterungen Ihrer Anwendung erstellen, haben Sie eine Anwendung . Es tut etwas Gutes, etwas, in dem du gut bist.
KSP - Kontakt Script Processor oder Bolzenproduktionslinie in der digitalen Audiowelt

Ich erzähle Ihnen eine Geschichte über eine solche Sprache:
Kontakt ist ein Strampler (Sampler) der österreichischen Firma Native Instruments . Es ist derzeit sehr schwierig, ein Projekt mit virtuellen Tools zu finden, in denen es nicht verwendet wird. In den letzten 10 Jahren hat Kontakt den größten Teil des Marktes für gesampelte Instrumente besetzt. Das Geheimnis ist einfach: Kontakt schlug einmal zwei Innovationen vor, die den Weg für die Entwicklung gesampelter virtueller Instrumente ebneten.
Die erste Neuerung stand in direktem Zusammenhang mit ihrer Hauptfunktion: Sie handhabte den Speicher sehr sorgfältig (und die Samples in WAV sind der gleiche Esser, sowohl Festplatte als auch RAM). NI hat ein verlustfreies Komprimierungsformat mit schneller Dekodierung erstellt und für seine Zeit ein revolutionäres Audiopuffersystem geschrieben.
Die zweite Neuerung war KSP
Vor dem Kontakt gab es zwei Möglichkeiten, aufgenommene Samples funktional in einem MIDI-gesteuerten Instrument zu organisieren:
- Schreiben Sie Ihre eigene Engine von Grund auf in C ++ oder in einer anderen Sprache, die Steinbergs VST SDK verwenden kann (und es gibt andere Plugin-Formate, z. B. AAX).
- Verwenden Sie einen vorgefertigten Sampler für Musiker, die nicht mit Programmierung vertraut sind, aber Sounds haben, die in einem System organisiert werden müssen. Sagen wir Giga Studio . Aber solche Strampler waren in der Regel entweder geschlossen, oder um ihre Arbeit zu beenden, benötigten sie nicht weniger Personal als die bloße Entwicklung im Rahmen des VST SDK.
Der Kontakt freute sich sowohl darüber als auch darüber: Für das schnelle Prototyping gibt es eine praktische Benutzeroberfläche, die für jeden Musiker, der das Handbuch gelesen hat, verständlich ist, und zur weiteren Verfeinerung gibt es nicht weniger eine Programmiersprache mit Bedingungen, Funktionen (ab Version 4) und einer Standardbibliothek, die die API darstellt zu den meisten Funktionen, die über die GUI implementiert wurden, sowie zu den Parametern für das direkte Abspielen von Samples. Unter anderem wurde es ab Version 2 möglich, die Benutzeroberfläche mit allen möglichen Pfeifen und Fälschungen anzupassen, wodurch es möglich wurde, ihre Einzigartigkeit in nahezu unbegrenztem Maßstab zu zeigen. Und der Entwicklercode ist zweimal nicht sichtbar: Verschleierung und Schutz vor Werkzeugwechsel .
Angesichts der wachsenden Popularität des Motors sowie einer beeindruckenden Phase der aktiven Entwicklung des Stramplers ist Kontakt heute eine Art Kalaschnikow-Sturmgewehr in der Welt von Digital Audio. Es ist leicht zu erlernen, zuverlässig wie ein Panzer, hat die Fähigkeit, innerhalb angemessener Grenzen für sich selbst zu dopilka, Geliebte, und bietet einen riesigen Markt für zufriedene Benutzer.
Nicht alles ist so rosig
Das Unvermeidliche geschah: Innovation in Form von KSP ist zu einer Geißel geworden. Um die Syntax für Dummies, die Musiker sind, zugänglich zu machen, anstatt die Implementierung der API in menschlicher Sprache zu lösen, schrieb Nativs einen eigenen Interpreter für ihre eigene Sprache, dessen Architektur zunächst keinen derart stürmischen Flug der Vorstellungskraft von Werkzeugentwicklern voraussetzte, den wir jetzt beobachten. Bereits in Version 3 verloren Natives die Hoffnung, mit dem Appetit der Benutzer Schritt zu halten, und begannen einfach, die neuen Funktionen der Standardbibliothek zu nutzen, sodass Benutzer die Codeentwicklungsumgebung selbst herausfinden konnten.
Darüber hinaus erschien schon damals Nils Lieberg KScriptEditor , gespalten mit Scintilla , das seit langem als Haupt-IDE für KSP dient. Es ist lächerlich zu sagen, aber als die Nativees erkannten, dass der Kontakt nicht mit der Größe der eingespeisten Quelle fertig werden konnte, führten sie Funktionen in die Sprache ein, ohne sich auch nur darum kümmern zu müssen, ihnen Argumente zu übergeben. Einen Monat später erschien in taskfunc
eine Taskfunktion, die Argumente an Funktionen übergab, die keine Argumente annehmen.
Nach einer Weile erkannte Niels, dass er auf den Rechen der Eingeborenen trat: Es machte keinen Sinn, eine eigene IDE zu entwickeln. Er portierte den Compiler und implementierte die IDE-Funktionalität nach SublimeText2 und winkte. Im Moment werden die Zügel von SublimeKSP anscheinend vom Entwickler von Fluffy Audio getragen .

Nun, du verstehst)
Und wieder, bereits ein Codegenerator, der nicht weniger als eine Sprache ist, mit einem Importsystem, einem Parser, einem Compiler und einer anderen Syntax als KSP, der jedoch aus wissenschaftlich unbekannten Gründen die Abwärtskompatibilität unterstützt, stellt sich heraus, dass es sich um einen schrecklichen Berg von Krücken handelt, der nicht weggeworfen werden kann aufgrund der Abwärtskompatibilität von Projekten von Bibliotheksentwicklern, die ihre KSP-Engines seit Jahren entwickeln.
Angenommen, das Importsystem arbeitet global in Bezug auf die Datei, aus der die Kompilierung gestartet wird. Um ein Modul in einem Unterordner zu kompilieren, müssen die Pfade in den Importen entsprechend seiner Position in der Projektstruktur vollständig geändert werden. Und der Typ, der ihn unterstützt, würde das gerne ändern, aber dann wird er die Projekte des gleichen Spitfire Audio weit und lange brechen. Und diese Tatsache allein erschwert das modulare Testen (sagen wir nichts über Unit-Tests) zur Hölle.
Es scheint, dass die Lösung des Problems darin besteht, Symlinks zu verwenden, aber irgendwo funktioniert es nicht wie erwartet, und Symlinks funktionieren nur teilweise. Diese Art von Problem ist nicht eine Sache. Nach Niels wurde die Entwicklung unter anderem nicht durch Modifizieren des Compilers selbst durchgeführt, der bereits analysierten Code empfängt. Aus Gründen der Abwärtskompatibilität werden Plug-Ins mit erweiterter Syntax hinzugefügt, von denen jede die ursprünglich in Zeilen geschnittenen Quellen empfängt, sie selbst analysiert und Änderungen vornimmt.
Angesichts der Tatsache, dass der größte Teil der Präprozessorlogik auf Makros und Inline-Funktionen beruht, die den Code auf einer riesigen Zeichenfläche bereitstellen, auf der 80% der immer wahren oder immer falschen Bedingungen gespeichert sind (indem die Eingabe der Bedingung durch Konstanten ersetzt wird), die auf der Bühne reduziert werden Beim Parsen von AST ist die Kompilierungszeit der "richtigen" Quelle vergleichbar mit Bei Projekten ist dies eine interpretierte Sprache für Dummies.
Zu sagen, dass KSP für Entwickler zu einem Schmerz geworden ist, bedeutet nichts zu sagen.
Kein einziger Kontakt.
Ich kann keine Beispiele aus anderen Bereichen nennen, aber hier aus dem Bereich von DigitalAudio:
- Lemur ist eine Schaufelanwendung mit einem Desktop-Editor, mit dem Sie schnell schöne Schnittstellen für die Kommunikation von Schaufeln mithilfe des OSC- Protokolls erstellen können. Es verfügt über einen eigenen PL, der in speziellen Skriptobjekten verwendet werden kann, die im gesamten Projektbaum verteilt sind. Es gibt keine Möglichkeit, einen Compiler dafür zu erstellen, wie er für KSP erstellt wurde.
- Reaper - DAW mit einem entwickelten Ökosystem der Erweiterungsentwicklung. Daher habe ich, wo immer möglich, meinen JSFX-Sprachcode (ReaScript) als API für C ++, Lua und Python dupliziert.
- HISE ist ein junger VST \ VSTi- Autor und -Bauer, der früher oder später Kontakt des schwedischen Entwicklers Christoph Haart töten wird. Im Editor selbst können Sie in modifiziertem JavaScript schreiben, das von C ++ - Objekten analysiert und in die Binärdatei kompiliert wird. Die Idee mit Ihrem eigenen Parser zur Einführung zusätzlicher Entitäten (z. B. Registervariablen, wenn ich richtig übersetzt habe) funktionierte, bis Benutzer ihren Code aus dem HISE-Editor mit Syntaxhervorhebung, statischer Analyse und JsPrettier- Formatierungswerkzeugen auf ihre bevorzugten IDEs übertragen haben . Jetzt skizzierte Christophe einige Header-Dateien zum Kompilieren statischer Bibliotheken in C ++, die dann als Module im Editor verwendet werden können. Parallel dazu ergänzt er HISEScript (weil JavaScript nicht mehr als solches bezeichnet werden kann) weiterhin mit neuen Funktionen, aber wir wissen, dass ...
Fazit
Schreiben Sie Ihre eigene Anwendung und widmen Sie sich der Hauptfunktionalität. Verschwenden Sie keine Zeit mit Parser, Semantik und Syntax. Dies ist interessant, während Sie beginnen, führt aber mit hoher Wahrscheinlichkeit zu einer Sackgasse. Die Programmiersprache kann nicht Teil der Anwendung sein: Es handelt sich um eine Art separate Produktionslinie, die viel Zeit benötigt, um die Community zu warten, zu ändern und zu unterstützen. Wenn Sie wiederum hoffen, den Schwellenwert für Dummies zu senken, lassen Sie ihn fallen. Eine echte Teekanne hat in der Regel Angst, überhaupt etwas zu drucken, und kümmert sich nicht um Ihre einfache Syntax.
Gleichzeitig können Sie für Anfänger-Plug-In-Entwickler für Ihr Programm einfach einen kleinen QuickStartGuide erstellen , der sie in die Grundkonzepte Ihres gewählten PL einführt, um die Funktionalität zu erweitern und ihm langsam Ihre API zuzuführen, die Teil des Ökosystems dieser Sprache ist.
PS Nein, es ist auch eine schlechte Idee, einen eigenen Parser für einen vorgefertigten PL zu schreiben.
Ich freue mich über jede Kritik an dem Artikel, dem ersten Pfannkuchen und allem.