Erstellen Sie keinen eigenen PL (DSL), um die Funktionalität der Anwendung zu erweitern.

    Wenn Sie dem Benutzer die Möglichkeit geben möchten, Plugins für Ihre Anwendung zu schreiben, stehen Sie auf, bevor Sie sich für die Bereitstellung einer API entscheiden. Unter dem Schnitt werde ich Ihnen zeigen, warum die schlechteste Lösung dafür wäre, Ihre eigene Programmiersprache zu erfinden und die Quellen zu analysieren und wo sich Möbel befinden.


    CPDV


    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 grundlegende Elemente: Tischplatten, Untersetzer, Nachttische usw. Es gibt eine Fertigungslinie für die Verarbeitung von Holz: Maschinen, Sägen, Lacke, alle mit der neuesten Technologie. Aber all das muss irgendwie geheftet werden. Wir wissen, dass es 100.500 Unternehmen gibt, die sich auf die Herstellung von Hardware und Schrauben spezialisiert haben. Es gibt einige Normen für Möbelbefestigungselemente, die von einer Community von Fachleuten erfunden wurden, um ihre Kunden zu vereinfachen. Wie weitsichtig wäre eine Lösung, eine eigene Linie für die Herstellung eigener Bolzen, Muttern und Ecken einzusetzen?


    Was können wir gewinnen?


    • So können wir unser Produkt mit einem Brand versehen, damit der Hamster sein eigenes "oder es" fühlt und mehr Geld trägt.
    • Vielleicht können wir dadurch nicht das Urheberrecht für eine der Schrauben zahlen oder das Logistikproblem lösen.
    • Wir können einen neuen Markt für Schrauben und Muttern erschließen, indem wir unseren Standard festlegen, der schneller, besser und höher ist.

    Aber lasst es uns sauber halten.


    • "Ilitarity" ist die Arbeit von Verkäufern. Verkäufer wird die Marke Elite sowohl mit einer neuen Produktionslinie als auch ohne herstellen.
    • Das Urheberrecht ist in der Regel (nicht immer natürlich) billiger als die Entwicklung von Grund auf. Indem Sie das Problem der Lieferung eines einzelnen Artikels durch den Einsatz einer neuen Produktionslinie lösen, verschlimmern Sie dies nur.
    • Wenn wir ein neues Tätigkeitsfeld ausprobieren wollen, müssen wir es nicht mit dem verbinden, was wir bereits ein Profi sind. Es mag den Anschein haben, dass es einfacher ist, die Bolzen mit Möbeln zu drücken, aber wenn sich die Bolzen nicht lösen, tragen sie die Möbel mit sich. Zumindest das, was schon bei Kunden steht.

    Zurück zu unseren Schafen: Wenn Sie ein Ökosystem für Erweiterungen Ihrer Anwendung erstellen, haben Sie eine Anwendung . Es tut etwas Gutes, etwas, das Sie gut können.


    KSP - Kontakt Script Processor oder die Bolzenfertigungslinie in der digitalen Audiowelt


    Kontakt


    Ich werde eine Geschichte über eine solche Sprache erzählen:


    Kontakt ist ein Ompomler (Sampler) der österreichischen Firma Native Instruments . Derzeit ist es sehr schwierig, ein Projekt mit virtuellen Tools zu finden, in denen es nicht verwendet wird. In den letzten 10 Jahren hat Kontakt den Großteil des Marktes für Musterinstrumente übernommen. Das Geheimnis ist einfach: Zu gegebener Zeit schlug Kontakt zwei Innovationen vor, die den Ansatz auf die Entwicklung von gesampelten virtuellen Werkzeugen richteten.


    Die erste Innovation stand in direktem Zusammenhang mit ihrer Hauptfunktion: Sie war sehr vorsichtig mit dem Speicher (und die Samples in wav sind die, die immer noch fressen, sowohl die Festplatte als auch der Arbeitsspeicher). NI erstellte ein verlustfreies Komprimierungsformat mit schneller Dekodierung und schrieb für seine Zeit ein revolutionäres Audiopuffersystem.


    Die zweite Neuerung war KSP


    Vor dem Kontakt gab es zwei Möglichkeiten, aufgenommene Samples in einem MIDI-Instrument funktional zu organisieren:


    • Schreiben Sie Ihre eigene Engine in C ++ oder einer anderen Sprache, die das VST-SDK von Steinberg verwenden kann (und es gibt auch andere Plug-In-Formate, beispielsweise AAX).
    • Verwenden Sie einen vorgefertigten Sampler für Musiker, die sich nicht mit der Programmierung auskennen, aber Sounds haben, die in einer Art System organisiert werden müssen. Sagen wir Giga Studio . In der Regel waren solche Spielzeuge aber entweder geschlossen oder für das Doping waren nicht weniger Personal erforderlich als für das VST SDK.

    Der Kontakt erfreute sowohl die als auch jene: Für schnelles Prototyping gibt es eine komfortable Benutzeroberfläche, die für jeden Musiker, der das Handbuch gelesen hat, verständlich ist, und zur weiteren Verfeinerung eine Programmiersprache mit Bedingungen, Funktionen (ab Version 4) und der Standard-Bibliothek, die die API darstellt zu den meisten Funktionen, die über die GUI implementiert werden, sowie zu den Parametern für das direkte Abspielen von Samples. Unter anderem ist es seit Version 2 möglich geworden, das Interface mit allen möglichen Pfeifen und Perdeals zu personalisieren, wodurch wir unsere Einzigartigkeit in nahezu unbegrenztem Umfang zeigen konnten. Und der Code des Entwicklers ist zwei Mal vor den Augen verborgen: Verschleierung und Schutz vor Werkzeugwechsel .


    Angesichts der zunehmenden Beliebtheit der Engine sowie der beeindruckenden Phase der aktiven Entwicklung des Romplers ist Kontakt heute so etwas wie eine Kalashnikov in der Welt des Digital Audio. Es ist leicht zu erlernen, zuverlässig als Panzer, hat die Fähigkeit, sich innerhalb vernünftiger Grenzen zu tauchen, und es hält einen riesigen Markt zufriedener Benutzer.


    Nicht so rosig


    Das Unvermeidliche geschah: Innovation in Form von KSP wurde zur Geißel. Bei dem Versuch, die Syntax für Teekannen, die Musiker sind, zur Verfügung zu stellen, hat Nativ, anstatt die Implementierung der API für Human PL zu lösen, einen eigenen Interpreter ihrer eigenen Sprache verfasst, dessen Architektur anfangs keine so gewalttätige Phantasie der Werkzeugentwickler impliziert, die wir jetzt sehen. Bereits mit Version 3 verloren die Nativs die Hoffnung, mit dem Appetit der Benutzer Schritt zu halten, und sie fingen einfach an, die neuen Funktionen der Standardbibliothek zu vernieten, sodass Benutzer sich selbst mit der Code-Entwicklungsumgebung beschäftigen konnten.


    Außerdem erschien schon damals der Nils Lieberg KScriptEditor mit Scintilla , der lange Zeit als Haupt-IDE für KSP diente. Es ist lächerlich zu sagen, aber als die Nativs erkannten, dass der Kontakt die Größe der zugeführten Quelle nicht bewältigen konnte, führten sie Funktionen in die Sprache ein, ohne sich überhaupt darum bemühen zu müssen, Argumente an sie weiterzugeben. Und einen Monat später erschien KScriptEditor taskfuncund übergab Argumente an Funktionen, die keine Argumente akzeptieren.


    Nach einer Weile wurde Nils klar, dass er den Nativs Rechen angegriffen hatte: Es macht keinen Sinn, eine eigene IDE zu entwickeln. Er verlagerte den Compiler und die implementierte IDE-Funktionalität nach SublimeText2 und winkte mit dem Griff. Momentan werden die Zügel des SublimeKSP vom Entwickler getragen, wie es scheint, von Fluffy Audio .


    Zum dritten Mal mit dem gleichen Rechen


    Nun, du verstehst)


    Und wieder stellt sich heraus, dass der Codegenerator, der eine Sprache mit einem Importsystem, einem Parser, einem Compiler und einer anderen Syntax als KSP ist, aber aus einem unbekannten Grund immer noch Rückwärtskompatibilität damit unterstützt, ein schrecklicher Berg von Krücken ist, die nicht weggeworfen werden können. aufgrund der Rückwärtskompatibilität von Projekten von Bibliotheksentwicklern, die ihre KSP-Engines seit Jahren entwickeln.


    Angenommen, das Importsystem funktioniert global in Bezug auf die Datei, von der aus die Kompilierung gestartet wird. Um ein Modul zu erstellen, das sich in einem Unterordner befindet, müssen Sie seinen Pfad im Import entsprechend seiner Position in der Projektstruktur vollständig ändern. Der Kerl, der ihn unterstützt, würde es gerne ändern, aber dann wird er die Projekte desselben Spitfire-Audios lange brechen . Und dies allein macht das modulare Testen (wir werden über das Gerät schweigen) zur Hölle.


    Es scheint, dass die Lösung des Problems darin besteht, Symlinks zu verwenden, aber irgendwo dort funktioniert es nicht wie erwartet und Symlinks funktionieren nur teilweise. Diese Art von Problem ist keine Sache. Nach Nils wurde die Entwicklung unter anderem nicht durch Modifizieren des Compilers selbst ausgeführt, der bereits den Parsing-Code erhalten hat. Aus Gründen der Abwärtskompatibilität müssen Sie wiederum Plug-In-Plug-Ins mit erweiterter Syntax hinzufügen, von denen jedes den ursprünglich in Strings geschnittenen Quellcode empfängt, diese unabhängig voneinander analysiert und Änderungen vornimmt.


    In Anbetracht dessen, dass der Großteil der Präprozessorlogik auf Makros und Inline-Funktionen beruht, die den Code zu einer großen Zeichenfläche ausdehnen, die 80% der immer wahren oder immer falschen Bedingungen (durch Ersetzen von Konstanten an der Eingabe der Bedingung) enthält, die auf der Bühne minimiert werden Bei der Analyse von AST ist die Kompilierzeit der "richtigen" Quelle vergleichbar mit C-Projekten. Sie wird in einer interpretierten Sprache für Teekannen angegeben.


    Das für KSP-Entwickler zu sagen, ist zum Schmerz geworden - ganz zu schweigen.


    Kein einziger Kontakt.


    Ich kann keine Beispiele aus anderen Bereichen geben, aber aus dem DigitalAudio-Bereich:


    • Lemur ist eine Anwendung für Schaufeln mit einem Desktop-Editor, mit der Sie schnell schöne Schnittstellen für die Kommunikation von Schaufeln mit dem OSC- Protokoll erstellen können . Es verfügt über eine eigene Programmiersprache , die in speziellen Skriptobjekten verwendet werden kann, die über den gesamten Projektbaum verteilt sind. Es gibt keine Möglichkeit, einen Compiler so zu erstellen, wie es für KSP gemacht wird.
    • Reaper - DAW mit einem entwickelten Ökosystem zur Entwicklung von Erweiterungen. Daher habe ich, wo immer möglich, meine JSFX-JP (ReaScript) -JP als API für C ++, Lua und Python dupliziert .
    • HISE ist ein junger Harvester zum Schreiben und Zusammenbauen von VST \ VSTi , der Kontakt vom schwedischen Entwickler Christoph Haart früher oder später töten wird . Innerhalb des Editors selbst können Sie über modifiziertes JavaScript schreiben, das bereits von C ++ - Objekten analysiert und in eine Binärdatei kompiliert wird. Die Idee, einen eigenen Parser für die Einführung zusätzlicher Entitäten (z. B. Registervariablen, falls korrekt übersetzt) ​​zu haben, funktionierte, bis die Benutzer ihren Code von HISE in ihre Lieblings-IDE mit Syntaxhervorhebung, statischen Analyse- und Formatierungswerkzeugen von JsPrettier übertragen hatten. Nun hat Christophe einige Header-Dateien zum Kompilieren statischer Bibliotheken in C ++ entworfen, die dann als Module im Editor verwendet werden können. Parallel dazu ergänzt er weiterhin HISEScript (da es nicht mehr möglich ist, JavaScript als JavaScript zu bezeichnen) 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, bis Sie beginnen, aber mit hoher Wahrscheinlichkeit führt dies zu einer Sackgasse. Eine Programmiersprache kann nicht Teil einer Anwendung sein: Sie ist eine Art separate Produktionslinie, die viel Zeit für die Wartung, Änderung und Unterstützung der Community benötigt. Wenn Sie hoffen, dass Sie die Eintrittsschwelle für Dummys senken, lassen Sie dieses Ding fallen. Diese Teekanne hat in der Regel Angst, überhaupt etwas zu drucken, und stört sich nicht mit Ihrer einfachen Syntax.


    Während Sie Plug-In-Entwickler für Ihr Programm sind, können Sie einfach einen kleinen QuickStartGuide erstellen, der Sie mit den grundlegenden Konzepten Ihrer gewählten Sprache vertraut macht, um die Funktionalität zu erweitern und Ihre API langsam zu speisen, die Teil des Ökosystems dieser Sprache ist.


    PS Nein, es ist auch eine schlechte Idee, einen eigenen Parser für ein fertiges PL zu schreiben.


    Über jede Kritik am Artikel, den ersten Pfannkuchen und alle Fälle freue ich mich.


    Jetzt auch beliebt: