Wann ist es sinnvoll, eine eigene Programmiersprache zu erstellen?


48

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?


8
Ich glaube, dass man für jedes Problem ein DSL erstellen sollte .
SK-logic

4
Ist das nicht das, wofür LISP gut ist?
Darknight

1
@ Darknight, nicht unbedingt Lisp - jede Sprache mit anständigen Metaprogrammiermöglichkeiten ist in Ordnung.
SK-logic

2
Wenn Sie mehr über Compiler-Interna erfahren möchten.
Dan_waterworth

1
Wenn Sie denken, es würde Spaß machen oder lehrreich sein. Das Entwerfen einer neuen Sprache, die einen eigenen Compiler benötigt, hat angesichts des damit verbundenen Aufwands keinen nützlichen Zweck. (Es gibt natürlich Leute, die intelligent, gebildet und erfahren genug sind, um meinen Rat zu ignorieren.)
David Thornley

Antworten:


40

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:

  • Eine enorme Menge an Komplexität zu Ihrem Problem hinzufügen
  • Hinzufügen einer erheblichen Menge an Arbeit beim Schreiben und Verwalten der neuen Sprache und des Compilers

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.


13
Ich muss in "The Pragmatic Programmer" erwähnen, dass das Schreiben kleinerer, domänenspezifischer Sprachen zur Unterstützung einer Aufgabe unglaublich hilfreich und ermutigend ist. Ich würde nicht empfehlen, eine vollwertige Allzwecksprache zu schreiben, aber eine Metasprache, die Code generiert, kann manchmal hilfreich sein.
Jordan Parmer

4
Es ist eine Lüge. Das Schreiben einer Sprache fügt keine Komplexität hinzu - normalerweise wird dadurch die Komplexität erheblich reduziert. Das Implementieren und Warten eines Compilers ist sowieso ein winziger Arbeitsaufwand.
SK-logic

3
@ SK-logic, "Einen Compiler zu implementieren und zu warten ist sowieso ein winziger Arbeitsaufwand". Hast du es versucht? Für welchen Prozessor?

1
@ Thorbjørn Ravn Andersen, ich mache es zum Leben. Heutzutage müssen Sie keine bestimmte CPU direkt ansteuern - da es großartige VMs wie LLVM, .NET und sogar JVM gibt. Und wenn Sie nicht zu viel von den teuren Optimierungen machen wollen, ist es keine große Sache, auf eine "echte" CPU zu zielen - ein Beispiel für diesen primitivistischen Ansatz finden Sie im OCaml-Compiler.
SK-logic

7
@ Thorbjørn Ravn Andersen, per Definition übersetzt der Compiler von einer Sprache in eine andere. Das Niveau dieser Zielsprache spielt keine Rolle. Und niemand kann ein Back-End für einen voll optimierenden Compiler für ein DSL implementieren - es ist besser, das vorhandene wiederzuverwenden. Tatsächlich werden die meisten modernen DSLs in C kompiliert. Assembler und Linker werden seit den Anfängen der Systemprogrammierung immer getrennt von der Kompilierung betrachtet.
SK-logic

24

Lassen Sie mich nur Paul Vick, Ex-Chefentwickler des VB-Compilers, zitieren, der jetzt an Project Oslo und der M-Sprache arbeitet:

Es ist unglaublich schwierig, eine neue Sprache zu erstellen, auch wenn diese größtenteils auf einer vorhandenen basiert. Dennoch denken viele Programmierer: „Hey, ich benutze Sprachen, wie schwer kann das sein?“ Und gehen darauf ein. … Wahrscheinlich erreichen mehr als 98% von ihnen überhaupt keine Traktion, aber Gott segne die Optimisten, denn ohne sie würden wir niemals die 2% der Sprachen erhalten, die Erfolg haben. Ich persönlich bin bereit, die Millionen von Dollar und Stunden zu opfern, die für Sprachen verschwendet werden, die es niemals schaffen, Sprachen wie C # und Java und Ruby und Python und so weiter zu erhalten.

Die Tatsache, dass es eine schlechte Idee ist, eine neue Sprache zu entwickeln, sollte die Leute nicht davon abhalten, neue DSLs zu entwickeln, sondern sie sollten nur innehalten und hoffentlich ein wenig bescheiden sein. Ich denke, der Schlüssel ist, klein anzufangen und klein zu bleiben.

DSLs: Auf jeden Fall eine schlechte Idee!


8
VB! = VBA. Ist es übrigens überhaupt legal, VBA auf dieser Site zu kritisieren? Immerhin hat Joel mitgeholfen, es zu entwickeln, oder?
Konrad Rudolph

1
Obwohl ein pragmatischer Programmierer ein so gutes Buch war, war die Empfehlung von DSLs in diesem Buch einfach dumm. So wie sie empfohlen haben, jedes Jahr eine neue Sprache zu lernen, ist das meiner Meinung nach auch ziemlich dumm.
dr. böse

2
Ich habe Ihre Antwort soeben bearbeitet, dass sie erneut auf Paul Vicks Artikel verweist und nicht auf den Google-Cache. Im Jahr 2011 "setzte er seinen Blog zurück" und löschte den gesamten VB-Inhalt, aber im Jahr 2012 legte er ihn zurück, obwohl mit unterschiedlichen URLs. Klingt so, als hätte er es persönlich schwer gehabt, als er das Zeug gelöscht hat.
4.

2
@ MarkJ Vielen Dank. Und, wow, dieser Artikel sorgt nicht für eine angenehme Lektüre. Hoffe, es geht ihm jetzt besser.
Konrad Rudolph

2
Vielen Dank für die freundlichen Kommentare, ich arbeite gerade an JavaScript und ja, die Dinge sind ein bisschen besser. :-) Ich bin mir nicht sicher, warum der ursprüngliche Link nicht funktioniert hat. Ich habe versucht, alle alten Link-Stile zum Laufen zu bringen. Ich werde es mir ansehen.
panopticoncentral

22

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.


3
"Ja wirklich?" Ich würde Frameworks, Makros und Funktionen als Dinge betrachten, die einer Sprache dabei helfen, die Unabhängigkeit der Domäne aufrechtzuerhalten.
CurtainDog

3
@CurtainDog, es wird nur Teil der Sprache, wenn es Teil der Standardbibliothek ist. Ansonsten ist es ein "Dialekt" der Sprache.

9

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.


7

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.


7

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.


6

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.


6

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.

  • Was ist eine Sprache?
    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.

  • Was soll eine Sprache tun?
    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.

  • Warum ist Prägnanz gut?
    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.


Wenn ein Satz erforderlich wäre, würden wir alle auf Englisch codieren. Wie jede menschliche Sprache benötigt Code eine ganze Menge Boilerplate, um eine Bedeutung zu haben.
CurtainDog

@Dog: Aus AI-Sicht wäre das ideal. Schauen Sie sich die Differentialausführung an. Das ist ein echtes Beispiel, wie man den Quellcode um eine Größenordnung verkleinert. Boilerplate kann notwendig sein, aber es ist keine gute Sache.
Mike Dunlavey

5

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.


Hoppla, Entschuldigung. Nicht-Muttersprachler ... :)
Daniel Rikowski

Oh, ich wusste das nicht und dein Beitrag ist in exzellentem Englisch, so schwer zu sagen. Ich versuche auch nicht, Grammatikpolizei zu sein - entschuldige mich.
Simon

5

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.


1
Interessante Fallstudie ... könnte eine solche Stagnation verhindert werden, indem beispielsweise eine Sprache für die Java- oder .NET-Plattformen ausgewählt wird. Auf diese Weise kann die Sprache 'wachsen', wenn mehr zu den Basisbibliotheken hinzugefügt werden.
CurtainDog

2
Ich bin mir nicht sicher, warum Sie eine Sprache erstellen, die auf eine andere wie Java abzielt. Warum nicht einfach mit Java oder C # anfangen?

4

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.


4

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.


4

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.


Ihre Behauptung ist äußerst umstritten und klingt für mich wie ein Scherz.
SK-logic

Heutzutage gibt es mehrere Frameworks zum Erstellen eigener DSLs, die ich nicht wirklich verstehe, was ich sagen wollte (dies war vor 2 Jahren). Ich sollte es wahrscheinlich umformulieren: "Eine neue Allzwecksprache von Grund auf zu implementieren ist in der Praxis nie der richtige Weg." :)
JesperE

ok, dieser "Mehrzweck" -Zusatz ändert alles. Aber ich glaube nicht an "Mehrzweck" -Sprachen - keine von ihnen ist wirklich allgemein genug, so dass immer noch viel Platz für neue "etwas allgemeine" Sprachen vorhanden ist (die eigentlich alle DSLs einer Art sind).
SK-logic

3

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


3

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.


Wenn die Räder nicht neu erstellt worden wären, hätten wir immer noch Steinräder verwenden können. Schaukeln Sie es Baby
Wong Jia Hau


3

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.


3

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.


3

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.


3

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:

  • Wenn einer Ihrer Konkurrenten jetzt eine Ihrer Hauptentwicklungsplattformen besitzt. Ich denke an Googles aktuelles Vertrauen in Java und die Entwicklung von "go" (es hilft, wenn Sie einen Autor der erfolgreichsten Sprache auf der Gehaltsliste haben, die es je gab!).
  • Wenn Sie eine Menge Code für eine neue Plattform schreiben müssen und die vorhandenen Sprachen ausführlich und fehleranfällig sind - zB PHP für die Webentwicklung.
  • Wenn Sie auf Probleme mit Skalierung und Parallelität stoßen, die noch nie zuvor aufgetreten sind, weil noch nie zuvor so viel Hardware für die Verarbeitung dieser Daten vorhanden war - z. B. Scala und (bis zu einem gewissen Grad GO).

2

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.


1

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.


1

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.


Ich verwende routinemäßig mehr als ein Dutzend sehr unterschiedlicher Sprachen. Einschließlich Prolog, verschiedene Lisps und Haskell. Aber ich neige immer noch dazu, fast jedes Problem zu lösen, indem ich ein DSL dafür einsetze. Und dass DSLs spezifisch genug sind, um sich von den vorhandenen Sprachen zu entfernen - sie sehen eher aus wie eine Mischung aus winzigen Teilen der verschiedenen Sprachen.
SK-logic

1

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 und BitCauf Coyotos der entworfen wurde , weil die vorhandenen Sprachen nicht die erforderlichen Eigenschaften (zum Beispiel Überprüfung auf einem Sprachniveau) bieten.


1

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):

  • Sprache als syntaktischer Abstraktionsmechanismus: Reduziert sich wiederholenden "Boilerplate" -Code, der nicht durch die Verwendung der integrierten Abstraktionsmechanismen einer anderen Sprache abstrahiert werden kann.
  • Sprache als Gedankenformer: um einen Paradigmenwechsel bei der Strukturierung von Software herbeizuführen (Änderung des "Weges des geringsten Widerstands").
  • Sprache als Vereinfacher: Ein bestehendes Paradigma auf seine wesentlichen Bestandteile reduzieren, um das Verständnis und die Einsicht zu verbessern.
  • Sprache als Gesetzeshüter: um wichtige Eigenschaften oder Invarianten durchzusetzen, möglicherweise um es einfacher zu machen, nützliche Eigenschaften aus Programmen abzuleiten.

0

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.


Lua ist langsam. Andererseits gibt es einen MetaLua mit einigen guten Möglichkeiten zur Metaprogrammierung.
SK-logic

0

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:

  1. Ihre Nutzerbasis ist größer als einige wenige Personen, im Allgemeinen nicht technisch und / oder mit eingeschränktem Systemzugriff (daher ist es nicht zu erwarten, dass sie eine vorhandene Allzwecksprache lernen / verwenden). Wenn es sich um Ihr Entwicklerteam oder Ihre Software-Organisation handelt, können Sie stattdessen "nur ein Skript schreiben" sagen.
  2. Ihre Benutzer müssen es ausreichend oft verwenden, wobei ein ausreichend abwechslungsreiches und sich änderndes Verhalten erforderlich ist (dh Sie können nicht nur eine von Ihnen gepflegte Bibliothek von Funktionen bereitstellen).
  3. Das Verhalten, das Benutzer angeben können, ist zu kompliziert, um es als Daten anzugeben (z. B. können Sie es nicht mithilfe einer Datenbanktabelle, einer Benutzereingabematrix, einer Aufgabenliste oder einer Schlüsselwertsammlung erreichen). Überlegen Sie genau weil man damit eine Menge Komplexität erreichen kann). Wenn Sie das Verhalten durch Dateneingabe oder Konfiguration anstelle von DSL erreichen können, sollten Sie dies wahrscheinlich tun, da dies viel weniger Arbeit bedeutet. Eine Art von Konditionalität oder Zusammensetzbarkeit / Verkettung oder Modellierung einiger verschiedener Abstraktionen kann Anzeichen dafür sein, dass das von Ihnen benötigte Verhalten für einfache Daten / Konfigurationen zu komplex ist
  4. Das Verhalten ist aber immer noch so eingeschränkt, dass Sie es in einer übersichtlichen DSL angeben können. Eine große Gefahr ist das Aufblähen der Plattform, z. B. wenn Benutzer anfangen, "Können Sie einfach hinzufügen ...?" Anzufordern. Wenn sie eine Verbindung zum Internet herstellen, aus dem Dateisystem lesen und schreiben oder Prozesse öffnen und schließen müssen, ist dies kein DSL mehr. (Ich habe gesehen, dass dies tatsächlich passiert ... Benutzer dürfen kleine Python-Aufrufe einbetten, allmählich zu Python-Skripten heranwachsen und schließlich alle Grenzen / Modularität / Leistung zerstören.)

Wenn all dies zutrifft, kann ein DSL angebracht sein.


0

Gibt es Arten von Killeranwendungen, Klassen von algorithmischen Problemen usw., bei denen es auf lange Sicht besser ist, meine eigene Sprache zu erstellen?

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.