Ist sprachorientiertes Programmieren praktisch?

12

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?

Michael K
quelle
Es hat sicher ein riesiges überwältigendes Potenzial.
2
Mir ist nicht klar, welches Problem dieses Paradigma löst. Übrigens ist LISP kein Beispiel für eine erfolgreiche Sprache.
mouviciel
7
@mouviciel es kommt ganz darauf an, was genau du mit "erfolgreich" meinst. Wird es von der Mehrheit der Programmierer verwendet? Nein. Ist es schon lange in Gebrauch? Ja - 50 Jahre und es zählt. Haben die meisten modernen Sprachen einen ganzen Haufen nützlicher Funktionen gestohlen? Ja. (Können Sprachen noch mehr von den Lisp-Sprachen stehlen? Ja!)
Frank Shearar
2
Es gibt einen Unterschied zwischen einer weit verbreiteten und einer nützlichen Sprache. Eine Sprache, die neue Bereiche erforscht, wird im Allgemeinen nicht verwendet, kann aber langfristig zu allen beitragen. Auf der anderen Seite ist Java nutzlos, da es nichts Neues auf den Tisch bringt (obwohl es definitiv eine erfolgreiche Sprache für alle Konten ist).
Matthieu M.
1
Ich würde es nützlicher finden, Lisp zu beherrschen, als Cobol zu beherrschen.
Glenatron

Antworten:

8

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.

Mike Dunlavey
quelle
Stimmen Sie auf jeden Fall mit Ihnen überein - "Der spitze Chef weiß, in welcher Sprache es geschrieben werden soll. [...] Java." Ein weiteres Problem ist das, was Joel als "Architekturastronaut" bezeichnet. Ich konnte auch sehen, wie DSLs ad infitium (sp?) Aufeinander stapelten . Ich denke, es kommt auf Programmierer -> Software-Ingenieur -> Informatiker an.
Michael K
Und wenn es keine Mühe erfordert, zu verstehen, ist es
Michael K
4

Das ist schon der Ruby-Ansatz.

  • Halte die Kernsprache einfach und erweitere sie über Edelsteine
  • Erstellen Sie Ruby-Dialekte für bestimmte Domänen über Affen-Patches. ig Ruby on Rails.

Ich weiß nicht, ob das besser ist, aber ich denke, es ist sehr pragmatisch.

Nerian
quelle
7
RoR ist kein Rubin-Dialekt.
back2dos
4
@ back2dos: Ich habe bei der Metaprogrammierung nachgedacht. Natürlich ist RoR keine andere Programmiersprache. Mit Dialekt meine ich, dass er Ruby aus Entwicklersicht auf einer höheren Abstraktionsebene einsetzt, auch wenn alles unter Rails Ruby ist. Eine Domain. Ein Dialekt. Er benutzt Ansichten, Modelle, Controller und programmiert sie mit einer Syntax, die einer anderen Sprache ähnelt, sozusagen einem Dialekt. Das ist das Schöne an einer Skriptsprache, die so mächtig ist wie Ruby.
Nerian
Ich denke, es ist wichtig, den Unterschied wirklich zu sehen. AspectJ ist ein Java-Dialekt, während AspectR nur eine Ruby-Bibliothek ist. Der Unterschied ist wirklich die Sprache. Ruby wurde entwickelt, um diese Flexibilität und Ausdruckskraft zu bieten, Java jedoch nicht. Beide Sprachen können als universelle Sprachen betrachtet werden. Der Unterschied besteht darin, dass Ruby im Allgemeinen so aussagekräftig ist, dass kein tatsächliches DSL für allgemeine Zwecke erforderlich ist, während Java dies nicht tut, obwohl Sie beispielsweise häufig Ansichten, Modelle und Controller verwenden.
back2dos
1

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.

SK-Logik
quelle
Verzeihen Sie meine Unwissenheit - ein eDSL könnte ein Präprozessor für eine andere Sprache sein, oder?
Michael K
@Michael, ja, es ist möglich, eDSL auf diese Weise zu implementieren, siehe beispielsweise CamlP4. EDSL basiert jedoch häufiger auf sprachspezifischen Funktionen (z. B. Lisp-Makros, C ++ - Vorlagen usw.).
SK-logic
1

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.

Glenatron
quelle
Sie können FoF mit hinzufügen, um Treiber für den Barrelfish-Multikernel zu entwickeln. Eine Sprache für die Entwicklung von DSLs in :)
Matthieu M.
0

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.

Kakungulu
quelle