Ich habe diesen Artikel über sprachorientierte Programmierung gelesen . Er weist auf einige Schwachstellen in den modernen prozeduralen / OOP-Ansätzen der Programmierung hin und schlägt ein neues Programmierparadigma vor, mit dem diese behoben werden können
Ich bin alles für kleine, lose gekoppelte Programmteile: Es ist viel besser, viele kleine Dinge zu lernen, von denen Sie alle verwenden werden, als ein paar große Dinge, von denen Sie nur Teile und Stücke verwenden.
Als ich den Artikel las, hatte ich den Eindruck, dass der Autor eines von zwei Dingen bewarb:
- Eine Vielzahl einfach zu erstellender Skriptsprachen
- Eine einzige, leicht erweiterbare Sprache, die sich selbst neu schreiben kann, um den Bedürfnissen des Programmierers gerecht zu werden
Wenn er den zweiten vorschlägt, würde ich mit "Bereits erledigt!" Antworten. und geben Sie Lisp als Beispiel. Wie Paul Graham vorschlägt, scheinen sich die Sprachen ohnehin ständig darauf zuzubewegen .
Was die erste betrifft, halte ich dies für eine gute Idee, wenn es eine zugrunde liegende Sprache gibt, die sie alle miteinander verbindet. Das scheint mir die Schwachstelle zu sein: die Kommunikation zwischen den Sprachen. Würden Sie Anrufe verwenden, bei denen es sich um ein Verfahrenskonzept oder eine Nachrichtenübermittlung handelt, die mich an die Kommunikation zwischen Prozessen erinnert? Ich würde die Möglichkeit begrüßen, mit kleinen domänenspezifischen Sprachen zu arbeiten, wenn es einfach ist, sie alle gleichzeitig zu verwenden. Wäre dieser Ansatz (LOP) praktisch?
Antworten:
Ich bin schon lange für DSLs eingetreten, aber ich mache mir Sorgen darüber, was mit Good Ideas passiert, wenn sie zu Bandwagons werden. Produkte werden so gebaut, dass sie Werbung machen. Die gute Idee verspricht, dass Sie nur eine Idee bekommen und in der Gruppe sind, ohne sehr genau darüber nachdenken zu müssen, was sie bedeutet.
Was ist eine Sprache? Es ist ein Wortschatz und eine Syntax, in der Bedeutungen kommuniziert werden können, oder? Jedes Mal, wenn Sie eine Variable deklarieren, eine Funktion schreiben oder eine Klasse definieren, erstellen Sie eine neue Sprache, indem Sie einer vorhandenen Sprache Substantive und Verben hinzufügen. Jetzt können Sie Dinge darin sagen, die Sie vorher nicht konnten.
Ich denke, was eine Sprache domänenspezifisch macht, ist das Ausmaß, in dem sie auf natürliche Weise die mentalen Konzepte ausdrückt, die kommuniziert werden, und ich denke, dass es ein einfaches Maß dafür gibt. Grundsätzlich erfordert die korrekte Implementierung einer einfachen unabhängigen Einzelanforderung X, die in das Programm aufgenommen werden kann oder nicht, einige Codeeinfügungen, -löschungen und -ersetzungen Y. Ein einfaches Vorher-Nachher-Diff kann angezeigt werden Y. Die Anzahl N solcher Änderungen ist ein Maß dafür, wie domänenspezifisch die Sprache ist. Je kleiner N für typische Anforderungen ist, desto besser.
Es kommt nicht unbedingt auf ausgefallene Syntax, Kontrollstrukturen, Nachrichtenübermittlung oder was Sie haben an. Worauf es ankommt, ist, wie präzise es die Anforderung umsetzt. Viele Tools behaupten, dies zu tun, aber Behauptungen sind nicht aktuell. Es muss echt sein .
Manchmal ist eine ungewöhnliche Technik ist notwendig. Hier ist mein Lieblingsbeispiel. Wenn es so ist, zeigt es den Punkt, dass die Programmierer möglicherweise Anstrengungen unternehmen müssen, um es zu verstehen. Daher ist Domain-Spezifität (und Wartbarkeit) keineswegs dasselbe wie Lesbarkeit .
Daher stimme ich dem zweiten Ansatz zu, dass eine gute Sprache eine ist, mit der man leicht die erforderlichen Sprachen darauf aufbauen kann. (Das hat mir an Lisp gefallen.) Noch wichtiger ist jedoch, dass Programmierer wissen müssen, wie sie Sprachen erstellen, die zu den Domänen passen, in denen sie arbeiten, und bereit sind, die Lernkurven solcher Sprachen zu überwinden.
Ich sehe das nicht wirklich. Stattdessen stecken sie in den "Programmen = Algorithmen + Datenstruktur" oder "Substantive werden zu Klassen und Verben zu Methoden". Sie arbeiten nicht daran, wie sie Denkbereiche aufgreifen und sie für eine maximale Prägnanz linguisieren können.
quelle
Das ist schon der Ruby-Ansatz.
Ich weiß nicht, ob das besser ist, aber ich denke, es ist sehr pragmatisch.
quelle
Der LOP-Ansatz ist äußerst praktisch. Denken Sie daran, dass Sie nicht unbedingt "Skriptsprachen" implementieren müssen - die Methode ist auch auf eDSLs anwendbar und wird normalerweise effizient kompiliert. Ich benutze diesen Ansatz buchstäblich in meiner gesamten Entwicklungsarbeit.
quelle
Wir werden in Zukunft viel mehr über domänenspezifische Sprachen sehen, gemessen an den Leuten, die jetzt über sie sprechen. Ich habe bemerkt, dass Martin Fowler auch viel über sie spricht, und ein paar interessante Artikel über Lambda The Ultimate zu diesem Thema. unter anderen.
Das deutet darauf hin, dass dies definitiv eine Richtung ist, in die der Wind in Bezug auf das Design von Programmiersprachen und Programmierplattformen weht. In gewisser Hinsicht ist dies schon eine Weile her - einer der Vorteile von Ruby (wie bereits erwähnt) ist, dass es das Erstellen von DSLs vereinfacht, aber es gibt tatsächlich eine Menge davon in Anwendungen und Programmierbibliotheken, die wir bereits verwenden.
quelle
Ich benutze LOP, wenn ich solo programmiere. Ich habe festgestellt, dass es in einigen Projekten keine andere Möglichkeit gibt, den Zeitplan einzuhalten. In einer einfachen Allegorie kann man die Verwendung von LOP mit der Verwendung von Elektrowerkzeugen gleichsetzen. Wenn Sie alleine in der Werkstatt arbeiten, können Sie die Dinge nicht manuell erledigen und die Frist einhalten. Wenn andere Personen anwesend sind, ist die Koordinierung des Einsatzes dieser Elektrowerkzeuge für die Effizienz und Sicherheit von entscheidender Bedeutung.
Im Teammodus erfordert LOP eine organisatorische Vorbereitung, um eine Katastrophe am Tower of Babel zu vermeiden.
quelle