Gibt es Arten von Killeranwendungen, Klassen von algorithmischen Problemen usw., bei denen es auf lange Sicht besser ist, meine eigene Sprache zu erstellen?
PS: Nur um sicherzugehen, meine ich eine neue Programmiersprache und einen Compiler, keinen neuen Compiler für eine vorhandene Sprache.
EDIT : Danke für die Antworten. Können Sie einige Beispiele nennen, in denen es absolut unnötig ist, ein DSL zu erstellen, oder Fälle, in denen ein DSL eine gute Idee sein könnte?
programming-languages
dsl
Daniel Rikowski
quelle
quelle
Antworten:
Es ist sicherlich wichtig, dass eine Person ihre eigene Sprache für Bildungszwecke schreibt. Erfahren Sie mehr über das Design von Programmiersprachen und über das Design von Compilern. In der Praxis gibt es jedoch nur wenige Verwendungsmöglichkeiten.
Wenn Sie Ihre eigene Sprache schreiben, sind Sie:
Wenn Sie also vorhaben, eine eigene Sprache für Ihr Projekt zu schreiben, müssen die oben genannten Kosten nicht durch die Funktionen anderer Sprachen ausgeglichen werden.
Nehmen wir zum Beispiel die Spieleentwicklung. Sie benötigen häufig Mini-Sprachen in ihren Spielen oder Skriptsprachen. Sie verwenden diese Sprachen, um eine große Menge der im Spiel stattfindenden Ereignisse auszuschreiben. Aber auch in diesem Fall wählen sie fast immer vorhandene Skriptsprachen aus und passen sie an ihre Bedürfnisse an.
quelle
Lassen Sie mich nur Paul Vick, Ex-Chefentwickler des VB-Compilers, zitieren, der jetzt an Project Oslo und der M-Sprache arbeitet:
DSLs: Auf jeden Fall eine schlechte Idee!
quelle
Wann ist es sinnvoll?
Wenn du Lust hast!
Hören Sie nicht auf diese Leute, die launische Kommentare haben, die im Grunde sagen:
Msgstr "Tu es nicht, weil es zu schwer ist und die Sprache X besser ist als jede andere Sprache, die dir einfällt".
Die Sache ist, dass das Erstellen eines DSL die ganze Zeit passiert. Ein Framework ist ein DSL. Ein Makro ist ein DSL. Jedes Mal, wenn Sie eine Funktion für Ihr Programm schreiben, ist dies Teil einer DSL. Sicher, es liegt im Rahmen der Grammatik, aber der Wortschatz ist Teil einer Sprache. Dies ist der Grund, warum Industrien oft ihre eigene Umgangssprache kreieren: effizienter!
Wenn "Tu es nicht" die richtige Antwort wäre, würden wir alle COBOL und Fortran schreiben.
quelle
Vielleicht möchten Sie Teile von Martin Fowlers neuem DSL-Buch lesen , wenn Sie daran denken, Ihre eigene Sprache zu schreiben.
Ich kann mir keinen Business Case vorstellen, um eine Sprache von Grund auf neu zu erstellen, außer dass es eine enorme Lernerfahrung ist.
Bearbeiten: Für DSLs gibt es viele Geschäftsfälle, aber der Schlüssel hier ist nicht, mitgerissen zu werden und es einfach zu halten.
quelle
Ich schlage vor, die Schlüsselfragen lauten: "Welches Problem versuche ich zu lösen?" und "Wer bekommt den ROI?"
Wenn Sie versuchen, Ihre eigenen Fähigkeiten und Erfahrungen aufzubauen, dann setzen Sie alles daran, aber nicht in einem Produktionssystem, das das Problem eines anderen lösen soll.
quelle
Der Hauptgrund, warum Sie eine neue Sprache wünschen, scheint darin zu liegen, dass Sie Muster in Ihrem Code entdecken, mit denen vorhandene Sprachen nicht gut umgehen können. Es gibt jedoch eine Reihe von Problemen beim Erstellen Ihrer eigenen Sprache. Sie werden alle Bibliotheken und Frameworks verpassen, die für vorhandene Sprachen erstellt wurden. Sie werden viel Zeit damit verbringen, die neue Sprache zu entwerfen und zu implementieren. Dies ist die Zeit, die Sie nicht für die eigentliche Programmieraufgabe aufwenden müssen. Sie werden sich viel Mühe geben, andere Entwickler davon zu überzeugen, dass sie Ihre Sprache verwenden sollten. Es fällt Ihnen schwer, neue Entwickler zu rekrutieren und auszubilden.
Warum nicht in einer Sprache wie Lisp schreiben, mit der Sie die Sprache erweitern können, wenn Sie neue Muster entdecken? Dann erhalten Sie die ganze Kraft einer neuen Sprache mit allen Vorteilen einer etablierten Sprache.
quelle
Ein Grund könnte sein, es als Experiment zu erstellen, um etwas über Sprachdesign und Compiler-Erstellung zu lernen.
Ein weiterer Grund könnte darin bestehen, eine Skriptsprache in eine Anwendung zu integrieren, wenn Sie keine Option zum Hinzufügen einer Drittanbieter-API haben.
quelle
Ich glaube nicht, dass Sie programmieren können, ohne eine neue Sprache zu erstellen. Es ist also gut zu erkennen, dass Sie genau das tun und die Probleme verstehen.
Wortschatz, Syntax und Semantik.
Eine Standardsprache wie VB, Java, C # usw. ist nur eine Basissprache . Sobald Sie Klassen, Methoden usw. hinzufügen, haben Sie Vokabeln und Semantiken hinzugefügt. Es gibt viele Möglichkeiten, Sprachen zu implementieren - Parsen und Übersetzen, Parsen und Interpretieren, Makros auf einer vorhandenen Sprache, Hinzufügen von Klassen und Methoden zu einer vorhandenen Sprache.
Seien Sie gut darin, Probleme kurz auszudrücken.
Woher weißt du, ob du das getan hast? Das Maß, das ich benutze, ist die Anzahl der Bearbeitungen . Wenn eine Ein-Satz-Anforderung A eintritt, setze ich die Anforderung in Code um. Wenn ich fertig bin und alle Fehler beseitigt habe, überprüfe ich den Code und das Code-Repository gibt mir eine Liste der Änderungen, die ich vorgenommen habe, B. Je kleiner B ist, desto besser ist die Sprache. Gemittelt über den Bereich realer und möglicher Anforderungen sagt mir dieses Maß, wie "domänenspezifisch" die Sprache ist.
Weil es Fehler minimiert.
Wenn N Codeänderungen erforderlich sind, um 1 Anforderung zu implementieren, und Sie manchmal Fehler machen, ist die Anzahl der von Ihnen eingeführten Fehler ungefähr proportional zu N. In dem Grenzwert, in dem N = 1 ist, ist es fast unmöglich, einen Fehler einzuführen, ohne es zu versuchen.
Beachten Sie, dass dies eine direkte Herausforderung für den "Code Bloat" ist, den wir heutzutage sehen.
HINZUGEFÜGT: Als Antwort auf Ihre Anfrage nach einem Beispiel siehe differenzielle Ausführung . Ich werde nicht sagen, dass es schnell verstanden werden kann, aber es reduziert den UI-Code erheblich.
quelle
Es ist immer "machbar", das Wort in Ihrer (ursprünglichen) Frage zu verwenden, aber es ist nicht sehr oft nützlich und angesichts der Fülle von gut unterstützten und ausgereiften Sprachen und Frameworks, die existieren, sehr selten optimal.
Es ist jedoch eine interessante intellektuelle Herausforderung.
quelle
Nur wenn das Kerngeschäft Ihres Teams Programmiersprachen sind.
Ich habe an einer Programmiersprache gearbeitet, die in einem Finanzunternehmen erstellt wurde.
Für den Architekten selbst war dies eine große Herausforderung und verbesserte seine eigenen Fähigkeiten.
Zwangsläufig konnte die Sprache nicht annähernd so schnell wachsen oder sich verbessern wie C # oder Java - dafür haben sie Teams.
Die Sprache stagnierte bald, da niemand Neues die Aufgabe übernehmen wollte, das Lieblingsprojekt eines anderen zu verbessern.
Der ursprüngliche Architekt ging. Die Sprache verdorrte und starb nach 10 Jahren.
Diese 10 Jahre waren die Hölle für jeden, der das Pech hatte, an einer Sackgasse zu arbeiten.
Also mach weiter, erstelle deine eigene Sprache, aber bitte frage niemanden, sie tatsächlich zu benutzen. Bitte erwarten Sie nicht, dass sich jemand anders dafür bedankt.
quelle
Sprachen gestalten kann Spaß machen. Sie müssen sich jedoch nicht auf Programmiersprachen beschränken.
Wenn ich eine mäßig komplexe Anwendung erstelle, möchte ich eine Art Makro- / Skriptsprache hinzufügen, um die Ausführung komplexer sich wiederholender Aufgaben zu vereinfachen. Die meisten Benutzer werden diese Funktion nicht verwenden, aber die wenigen, die sie verwenden, sind sehr dankbar. Außerdem stelle ich sicher, dass es für die Support-Mitarbeiter wertvoll ist, ihnen bei der Behebung von Kundenproblemen zu helfen.
quelle
Es ist völlig vernünftig, Ihre Fähigkeiten zu erweitern und zu lernen.
Anders als das, wenn Sie die Frage stellen müssen, dann ist es nicht. Wenn Sie herausfinden möchten, ob Sie mit einer bestimmten Klasse von Algorithmen oder einer bestimmten Problemdomäne besser umgehen können als mit vorhandenen Sprachen, müssen Sie zunächst ein Experte in dem Bereich sein, den Sie ansprechen. Sie werden wissen, dass es angemessen ist, wenn Ihre Fähigkeiten und Erfahrungen es Ihnen sagen.
Und Sie könnten sich auch irren, aber Sie brauchen einen anderen Experten, der Sie davon überzeugt (oder Ihnen zeigt, dass Sie nicht der Experte sind, von dem Sie glauben, dass Sie es sind). Eine lebhafte Diskussion wäre das, keine einfache Frage und Antwort, wie Sie sie hier finden.
quelle
Abgesehen von Selbstlernzwecken möchte ich behaupten, dass es heute überhaupt nicht mehr nötig ist , eine eigene Sprache zu erstellen. In jedem Fall. Je. Unabhängig davon, was Sie tun möchten, gibt es eine Fülle vorhandener Sprachen, die Sie übernehmen oder an Ihre Bedürfnisse anpassen können.
quelle
Es kommt definitiv auf die Situation an. Wie Nosklo sagte - Wenn Sie eine gute Idee, ein brandneues Konzept oder ähnliches haben, würde ich Ihnen wärmstens empfehlen, dies zu tun.
Im Allgemeinen würde ich vorschlagen, sich auf etablierte Technologie zu verlassen.
Aber wenn Sie daran interessiert sind, Ihre eigene "Sprache" zu erstellen, sollten Sie Folgendes ausprobieren: YACC & Lex
quelle
Sie können sich im Anti-Pattern "Das Rechteckrad neu erstellen" einfach nicht einfangen.
Das heißt, Sie erstellen das, was bereits getan wurde, nur ärmer als die Originale.
quelle
Wouter war dafür bekannt, für jede neue Idee eine neue Sprache zu erschaffen. Sie können sich von seiner Arbeit inspirieren lassen: Wouters Programmiersprachenseite .
quelle
Wann erstellen Sie Ihre eigene Sprache?
Wenn Sie wollen, als großes Hobbyprojekt.
Für eine domänenspezifische Sprache. Diese können sehr aufwändig sein; Schauen Sie sich im Archiv an, was in der Interactive Fiction-Community (oder der Community für Textabenteuer) vor sich geht .
Wenn Ihre Ziele sehr ehrgeizig sind und Sie glauben, Sie können einen echten Fortschritt erzielen, wie bei Paul Grahams Arc-Projekt .
Auch in jeder ausreichend anpassbaren Sprache (vielleicht C ++, definitiv Common Lisp) bei der Entwicklung von Low-Level-Konstrukten.
Wann sollte man einem Klischee wie der Pest aus dem Weg gehen?
Wenn es die Basis für die Weiterentwicklung realer Projekte sein soll. Es wird immer ernsthaft hinter dem zurückbleiben, was im Handel für billig erhältlich ist, und die weitere Entwicklung lähmen. Ich habe für ein Unternehmen mit einer eigenen Version von COBOL gearbeitet und möchte nie bei einem anderen Unternehmen arbeiten, das seine eigene Sprache pflegt. Wir haben beobachtet, wie andere COBOL-Versionen bessere Funktionen und bessere Tools erhielten, während wir mit denselben Problemen konfrontiert waren. (Ich möchte nie wieder mit COBOL arbeiten, aber das ist eine andere Geschichte.)
Die Situationen, in denen Sie möglicherweise Ihre eigene Sprache erstellen, fallen nicht darunter. Hobbyprojekte werden nicht für echte Entwicklung verwendet. Etwas wie Arc wird erfolgreich sein (und mehrere Implementierungen sowie Weiterentwicklung und Entwicklung erhalten) oder scheitern (und niemand anderes wird es verwenden). Eine kleine domänenspezifische Sprache ist nur ein Teil eines Projekts, und da sie klein ist, kann sie mit der Zeit verbessert werden. Eine Text-Abenteuersprache wird verwendet, um einzelne Spiele zu schreiben, und diese Spiele sind nicht nur Hobbyprojekte, sondern werden auch so gut wie nie für die Weiterentwicklung verwendet.
quelle
Meiner Ansicht nach sind DSLs im Allgemeinen eine "schwache Idee", und es ist auf lange Sicht produktiver, eine Standardsprache zu verwenden und Ihre domänenspezifischen Anforderungen als Bibliothek der "Nicht-DSL" zu erstellen.
Es kann sich jedoch herausstellen, dass Ihre Anforderungen so individuell sind, dass eine DSL (nicht nur eine leicht modifizierte gcc- oder lisp-Implementierung) für Ihr Unternehmen vorzuziehen ist. Viele Unternehmen verwenden Drop-Ins aktueller Sprachen, die auf das ausgerichtet sind, was sie tun, ohne ihre eigene Sprache zu schreiben oder zu pflegen. ZB habe ich gehört, dass PHP ein nettes Drop-In hat; Lua ist als Drop-In konzipiert, ModelView verwendet Python und AutoCAD hat AutoLISP als Scripter.
quelle
Es ist nichts Falsches daran, eine eigene Programmiersprache zu schreiben, wenn Sie vorhandene Tools nutzen können. In der heutigen Welt würde dies bedeuten, dass Sie entweder eine Syntax definieren, die für eine vorhandene Sprache (wie Java oder C #) verwendbar ist, oder ein kleines Transformationssystem (Makro-Expander) schreiben, das Code in einer vorhandenen Sprache generiert.
Auf dem Weg zum Maschinencode werden VIELE Räder neu erfunden ...
Ein sehr guter Grund für eine DSL ist die prägnante Darstellung von Domänendaten. Dies ermöglicht Domain-Experten, direkt mit den Daten zu arbeiten, anstatt andere zu durchsuchen. Der Trick ist dann, die resultierenden Programme in einer einfach zu verarbeitenden Form zu haben.
quelle
Im Allgemeinen wäre die Antwort ein großes NEIN. Unter den Hunderten von Sprachen gibt es normalerweise eine, die zu Ihrem Problem passt.
Es gibt jedoch Umstände, in denen es eine vernünftige Option ist, eine neue Sprache zu entwickeln:
quelle
Was Sprache gut kann, ist Komposition oder das Zusammenfügen derselben Komponenten auf unterschiedliche Weise.
Wenn Sie bei Ihrem Domain-Problem nur eine Reihe von orthogonalen Schaltern festlegen müssen, wird eine Sprache wahrscheinlich nicht viel über Formulare, eine grafische Benutzeroberfläche oder eine reine Textkonfiguration hinzugefügt. Datei. (Ich gehe hier davon aus, dass eine Datei voller Schlüssel-Wert-Paare nicht das ist, was Sie unter einer "Sprache" verstehen.)
OTOH, wenn Ihre Konfiguration wie eine echte Sprache ist, z. Verben und Nomen können in vielen verschiedenen (und neuartigen) Kombinationen zu einem beliebigen Grad an Komplexität zusammengesetzt werden. Dann wird eine Sprache fast unvermeidlich, weil die kombinatorische Explosion des Versuchs, zu spezifizieren, was Sie mit einer anderen Methode wollen, überwältigt.
quelle
Lernen Übungen beiseite lässt, ist es sinnvoll, nur Ihre eigene Programmiersprache zu erstellen , wenn Sie andere Sprachen verstehen, Ihre spezifischen Problembereich, und die Art und Weise , dass die bestehenden Sprachen - Adresse , die Problemdomäne und dieses Verständnis ist gründlich genug , dass Sie wissen , eine neue Sprache ist eine vernünftige Lösung, ohne die Frage stellen zu müssen.
quelle
Als ich das letzte Mal in einem Hobbyprojekt damit anfing, spezifizierte ich, wie die Syntax aussehen soll, und realisierte, dass ich den Prolog neu erfand. Andere Sprachen, die gut zu Ihnen passen könnten, wenn Sie glauben, eine Sprache erfinden zu müssen, sind lisp, lua oder so etwas wie Haskell. Grundsätzlich alle Sprachen, die Sie im College ignoriert haben, weil Sie dachten, sie wären niemals nützlich.
quelle
Ein Grund ist, wie bereits erwähnt, für Bildungszwecke. Aber es gibt noch mehr. Zum Beispiel gibt es viele Forschungs Sprachen wie
Sing#
auf dem Singularity Betriebssystem undBitC
auf Coyotos der entworfen wurde , weil die vorhandenen Sprachen nicht die erforderlichen Eigenschaften (zum Beispiel Überprüfung auf einem Sprachniveau) bieten.quelle
Tom Van Cutsem hat kürzlich eine Antwort auf diese Frage geschrieben:
http://soft.vub.ac.be/~tvcutsem/whypls.html
Aufzählungszusammenfassung (von dieser Seite):
quelle
Wahrscheinlich nie.
Lua ist die beste Wahl, wenn Sie die Sprache in eine andere Sprache einbetten möchten.
Small Domain Specifc Languages sind derzeit in und es ist in einigen Anwendungen sinnvoll.
Abgesehen davon sind die Gründe hauptsächlich akademischer Natur.
Eine Sprache zu erstellen, wenn sie nicht benötigt wird, ist aufgrund der Komplexität bei der Entwicklung und Pflege wirklich eine schlechte Sache. Ich habe viele Projekte gesehen, die eine Art Skriptsprache einführten, die nur für dieses Programm spezifisch ist, und es war das, was die Entwicklung des Basis-Dings um ein vielfaches verlangsamte. Gute Beispiele sind beispielsweise Automatisierungssprachen wie Phantom, AutoHotKey, AutoIt. Diese Tools wären IMO viel besser, wenn sie eine bekannte Sprache wie Lua verwenden würden.
quelle
Ihre "Bearbeitung" scheint eine wesentlich andere Frage zu sein ("Wann soll ich ein DSL erstellen?" Anstatt der ursprünglichen Frage, die die Leute als "Wann soll ich eine neue, universelle Programmiersprache erstellen" verstanden haben). Es scheint, dass die Leute die "ursprüngliche" Frage gründlich beantwortet haben, aber es gibt nur wenige Antworten, die spezifische Kriterien für die Verwendung eines DSL angeben. Also schlage ich eine Checkliste vor:
Wenn all dies zutrifft, kann ein DSL angebracht sein.
quelle
Es hängt davon ab, ob.
Nehmen wir unser Gehirn. Es scheint ein so komplexes Durcheinander zu sein, dass wir (zumindest jetzt) an Grenzen mit JEDER Programmiersprache stoßen. Vielleicht brauchen wir also andere Ansätze und damit auch andere Semantiken und Syntaxen, um unser Gehirn tatsächlich zu virtualisieren.
Im Allgemeinen gibt es noch so komplexe Themen, die zu anderen Strategien führen könnten, die auch eine „bessere“ Sprache für ein bestimmtes Szenario beinhalten würden.
quelle