Alphabetisierte Programmierung, gute / schlechte Entwurfsmethodik

10

Ich habe kürzlich das Konzept der Lese- und Schreibprogrammierung gefunden . Und ich fand es ziemlich faszinierend. Ich bin jedoch nicht auf Behauptungen gestoßen, dass es ein schlechter Weg ist, ein Programm zu strukturieren. Es scheint nicht viele Orte abgedeckt. Nicht einmal hier konnte ich irgendwelche Fragen dazu finden.

Bei meiner Frage geht es nicht um Mängel oder den Umgang mit Dokumentation. Ich betrachte die Dokumentation als Nebeneffekt dessen, was sie für den Fluss der Lese- und Schreibprogrammierung bedeuten würde. Ich weiß, dass das Design ursprünglich für eine einfache Dokumentation sowie für das Konzept des Vorwärtsprogrammierungsflusses gedacht war .

Das Konzept, das Problem in kleine satzbasierte Probleme zu unterteilen, scheint wirklich eine brillante Idee zu sein. Dies erleichtert das Verständnis des Programmablaufs.

Eine Konsequenz der Literate-Design-Methode ist auch, dass die Anzahl der erforderlichen Funktionen auf die Vorstellungskraft des Programmierers beschränkt ist. Anstatt eine Funktion für eine bestimmte Aufgabe zu definieren, könnte sie als scrapin der Literate-Methode erstellt werden. Dies würde eine automatische Einfügung des Codes anstelle einer separaten Funktionskompilierung und die anschließende Anforderung eines Optimierungsschritts für die prozedurale Kompilierung ergeben, um die äquivalente Geschwindigkeit zu erhalten. Tatsächlich zeigte der erste Versuch von Donald E. Knuth aufgrund dieser Tatsache eine schlechtere Ausführungszeit. Ich weiß, dass Compiler zu vielem gemacht werden können, aber das ist nicht mein Anliegen.

Ich möchte also ein Feedback erhalten, warum man dies als schlechte / gute Entwurfsmethode betrachten sollte.

nullten
quelle
2
Zeroth, ich habe das Literate-Programming- Tag erstellt und eine Zusammenfassung basierend auf dem Wikipedia-Artikel hinzugefügt. Bitte helfen Sie dabei, das Tag-Wiki mit relevanten Informationen zu erweitern.
Yannis
@YannisRizos Ich werde es hier hinzufügen, ich habe keine Bearbeitungsrechte.
nullter
1
Nun, ich auch nicht :) Ich habe einige Ressourcen hinzugefügt (den Wikipedia-Artikel und die Links in Ihrer Frage). Sie werden angezeigt, wenn die Bearbeitung von Experten überprüft und akzeptiert wird (?!). Es ist ein faszinierender Ansatz, und da Sie ihn bereits erforschen, kommen Sie zurück und verbessern Sie das Tag-Wiki jedes Mal, wenn Sie etwas finden, von dem Sie glauben, dass es dort erwähnenswert ist.
Yannis
1
Ich würde dem Autor der Literate Programming-Site empfehlen, die UX-Stackexchange-Site zu besuchen - die Farben sind wirklich schlecht zum Lesen.
Danny Varod
1
Zu Ihrer Information, es gibt auch ein literate-programmingTag auf StackOverflow. Es gibt dort mehr Inhalte, obwohl immer noch nicht viel.
Ross Patterson

Antworten:

9

Dies würde eine automatische Einfügung des Codes anstelle einer separaten Funktionskompilierung und die anschließende Anforderung eines Optimierungsschritts für die prozedurale Kompilierung ergeben, um die äquivalente Geschwindigkeit zu erhalten

Das ist irrelevant. Ist seit Jahrzehnten. Sie können es aus der Frage entfernen, da es bei modernen Compilern keinen Sinn macht, ihre Optimierer zu untergraben.

Ich möchte also ein Feedback erhalten, warum man dies als schlechte / gute Entwurfsmethode betrachten sollte.

Es gibt keinen Nachteil, die Programmierung zu beherrschen. (Ich erwarte Dutzende von -1 Stimmen für dieses Gefühl.) Als Praktizierender habe ich nie Probleme gesehen.

Es gibt einige Argumente, gegen die sich alle auf "das Programmieren in einer höheren Sprache durch Optimieren des resultierenden Codes" auswirken. Recht. Genauso wie die Programmierung in C ++ durch Optimieren der zu .oerstellenden Datei untergraben wird . Es ist wahr, aber irrelevant.

Das Schreiben von Lese- und Schreibprogrammen bedeutet lediglich, ein übergeordnetes und detailliertes Design (auf Codeebene) in einem Dokument zu kombinieren, das mit einem geeigneten Toolset geschrieben wurde, das compiler- und personenfreundliche Dateien erstellt.

Als Knuth die Alphabetisierung erfand, gab es keine OO- Mainstream- Sprachen. Ein Großteil der ursprünglichen Web- und Webwerkzeuge ermöglichte es ihm daher, klassenähnliche Definitionen für abstrakte Datentypen zu erstellen.

Vieles davon ist heutzutage irrelevant. Literate Programming Tools können recht einfach sein, wenn sie sich auf moderne objektorientierte (oder funktionale) Programmiersprachen auf hoher Ebene konzentrieren. Aufgrund der Einschränkungen von C (oder Pascal oder Assembler) sind weniger aufwändige Problemumgehungen erforderlich.

Der Ansatz zum Schreiben von Alphabetisierungsprogrammen unterscheidet sich nicht vom Ansatz zum Schreiben von Analphabetenprogrammen. Es erfordert immer noch sorgfältiges Design, Unit-Tests und eine saubere Codierung. Die einzige zusätzliche Arbeit besteht darin, neben dem Schreiben von Code auch Erklärungen zu schreiben.

Nur aus diesem Grund - die Notwendigkeit, kohärente Erklärungen zu schreiben - ist es für einige Programmierer schwierig, die Programmierung zu beherrschen. Es gibt eine ganze Reihe von Programmierern, die erfolgreich sind (ihr Code besteht alle Komponententests, ist ordentlich und leicht zu verstehen), aber keinen zusammenhängenden Satz in ihrer Muttersprache zu schreiben scheinen. Ich weiß nicht, warum das so ist.

Es gibt eine sehr große Anzahl von Programmierern, die nur am Rande und dann nur zufällig erfolgreich zu sein scheinen. (Es gibt genug schlechte Fragen in Stack Overflow, die darauf hinweisen, dass viele Programmierer Schwierigkeiten haben, die Grundlagen überhaupt zu verstehen.) Für Programmierer, die weitgehend inkohärente Fragen zu Stack Overflow stellen, wissen wir, dass sie die Lese- und Schreibprogrammierung nicht wirklich gut machen können, weil sie es können Ich programmiere nicht gut.

S.Lott
quelle
7
Eine große Anzahl von Programmierern ist kaum kohärent, wenn es darum geht, etwas in einem Medium zu erklären, sei es formell oder informell, sei es in der Programmierung, beim Schreiben von Kommentaren oder sogar in einer E-Mail. Es ist ein Wunder, dass Software überhaupt funktioniert :)
Andres F.
3

Der wichtigste Aspekt der Alphabetisierung (oder auch nur des guten Kommentierens) ist für mich nicht so sehr, dass er Dokumentation liefert, sondern vielmehr die Absicht des Programmierers. Wenn Sie die angegebene Absicht kennen, können Sie sofort beurteilen, ob der darauf folgende Code wirklich das tut, was er sollte. Ohne Absicht müssen Sie mit der Annahme beginnen, dass der Code korrekt ist, und ihn dann durch Induktion als richtig oder falsch beweisen - was anstrengender und zeitaufwändiger ist, da häufig auch der gesamte umgebende Code erforderlich ist.

Die erklärte Absicht ermöglicht es oft anderen, die mit dem Code nicht vertraut sind, schnell einzuspringen und Fehler zu finden, ohne den größeren Kontext zu kennen, der ihn umgibt.

Und natürlich hilft es Ihnen auch dabei, den grundlegenden Ablauf und das Design des Codes schneller zu lernen, da einfaches Englisch für die meisten Menschen oft intuitiver ist als Zeigerarithmetik.

Mike Owens
quelle
1

Das Konzept der Wurfprogrammierung selbst ist zwar ziemlich neu (und es ist daher wahrscheinlich, dass ich das Boot komplett vermisse), aber es scheint sehr gut mit dem Konzept eines DSL übereinzustimmen .

Die Idee hinter einem DSL ist es, einen Bereich von Problemen in eine einfache, auf natürliche Sprache ausgerichtete Grammatik zu zerlegen, mit der Algorithmen zur Lösung dieser Probleme erstellt werden können.

Für mich ist dieselbe Idee oder zumindest die Kerngrundlage dieselbe oder zumindest eng mit der Alphabetisierung verbunden.

In der groovigen Welt gibt es zum Beispiel einen starken Druck, DSLs regelmäßiger zu verwenden und neue DSLs zu erstellen, um häufig auftretende Probleme zu lösen. Dieser Push kommt sowohl von Tools innerhalb der Sprache (Easy Builder) als auch von Kernbibliotheken, die eine DSL-basierte API unterstützen.

Angesichts der Tatsache, dass der Trend zumindest in dieser Ecke der Welt zur Alphabetisierung der Programmierung geht, würde ich sagen, dass dies eine gute Methode ist, nach der man streben kann.

Leider ist das Niveau des Denkens, das zum Erstellen eines guten DSL erforderlich ist, nach dem, was ich gesehen habe, oft jenseits der meisten Programmierer. Ich weiß, dass ich persönlich mit einigen der Konzepte zu kämpfen habe, die von Zeit zu Zeit benötigt werden. Es kann diese Schwierigkeit sein, die verhindert hat, dass solche Techniken eine breitere Akzeptanz finden.

Es ist Ihr klassischer Fall, wenn Sie das Tool verwenden, ist eine Sache, aber das Erstellen ist auf einer ganz anderen Ebene.


Um meinen Standpunkt ein wenig zu erweitern, es ist nicht viel, dass DSLs dasselbe sind wie Alphabetisierungsprogrammierung, sondern dass sie Alphabetisierungsprogrammierung viel mehr ermöglichen . Besonders wenn es sich um DSLs in natürlicher Sprache handelt .

In Version 1.8 von groovy wurde die DSL-Fähigkeit in natürlicher Sprache durch das Hinzufügen leistungsfähigerer Befehlsketten erheblich verbessert .

Zum Beispiel programmieren die folgenden Codezeilen nicht nur Pseudosätze:

drink tea with sugar and milk
move left by 30.centimeters
sendFrom "Guillaume" to "Jochen"
send from: "Jochen" to "Lidia"
Email.from "Lidia" to "Guillaume" withBody "how are you?"
contact.name "Guillaume" age 33
move left by 30.centimeters
sell 100.shares of MSFT
take 2.pills of chloroquinine in 6.hours
blend red, green of acrylic
artist.paint "wall" with "Red", "Green", and: "Blue" at 3.pm
wait 2.seconds and execute { assert true }
concat arr[0] with arr[1] and arr[2]
developped with: "Groovy" version "1.8-beta-2"

Hinweis: Das Codebeispiel stammt aus dem Blog von Guillaume Laforge

Die Kernidee hinter der Lese- und Schreibprogrammierung ist, dass die natürliche Sprache für den Menschen verständlicher ist und darauf kommt es an. Die DSL-Funktionen in natürlicher Sprache von Groovy machen dies meiner Meinung nach zu einer viel engeren Realität. Insbesondere, wenn diese DSLs zum Erstellen von Geschäftsregeln für eine Anwendung verwendet werden.

Die Fähigkeit, die kritischen Komponenten eines Systems mit natürlicher Sprache zu "kodieren", ist das Wesentliche der literarischen Programmierung. Natürliche Sprache mit Codestücken zu vermischen, ist eine bastardisierte Form der Alphabetisierung. Obwohl nützlich, glaube ich, dass DSLs in natürlicher Sprache, mit denen Sie natürliche Sprache als Code selbst verwenden können, einen großen Sprung nach vorne darstellen.

Die Erweiterung der Programmierfähigkeit im Allgemeinen ist der nächste Schritt in diesem Prozess, aber die Tools dafür sind weitgehend bereits vorhanden. Ja, es gibt noch kein "allgemeines" DSL, aber für kleinere Domänen ist die Funktion vorhanden.

Weitere Beispiele hierfür in Aktion (in keiner bestimmten Reihenfolge):

cdeszaq
quelle
2
Interessante Sicht. Aus meiner Sicht passt es überhaupt nicht gut zu einem DSL. Da die Alphabetisierungsprogrammierung in einer Nicht-DSL-Sprache erfolgt. Und die Tools ähneln auch nicht sehr einem DSL. Sie sind nicht auf die Problemdomäne ausgerichtet. Können Sie ein Beispiel dafür geben, wie Sie denken, dass gebildete Programmierung wie ein DSL ist? Ein Link oder ein Verweis auf ein Beispiel kann helfen, Ihre Antwort zu verdeutlichen.
S.Lott
Ein Beispiel hierfür sind die Befehlsketten in Groovy 1.8, mit denen Sie mit Dingen wie turn left then rightoder "programmieren" können paint wall with red, green and yellow: docs.codehaus.org/display/GROOVY/…
cdeszaq
@ S.Lott - Ich stimme zu, dass es definitiv einen Unterschied zwischen DSLs und Lese- und Schreibprogrammen gibt, aber ich denke, DSLs können ein Werkzeug sein, um echte Lese- und Schreibprogramme zu erreichen , bei denen Sie eine natürliche Sprache eingeben und den gewünschten Algorithmus ausdrücken können. Für mich ist das Mischen von natürlicher Sprache und Code eine bastardisierte Form der Alphabetisierung.
Cdeszaq
"Sie können eine natürliche Sprache eingeben und den gewünschten Algorithmus ausdrücken lassen" ist bestenfalls unwahrscheinlich. Es gibt Hintergrundinformationen, Begründungen, Korrektheitsnachweise, Komplexitätsbehauptungen (Big- O ) und viele nicht alogrithmische unterstützende Dokumentationen, die nicht Teil eines DSL-Schemas sind. Ich bin mir nicht sicher, ob ich der Parallele zustimme, nachdem Sie sie geklärt haben.
S.Lott
1
"Erklärung der Programmlogik". Nicht die Logik selbst. Aber eine Erklärung. Die Logik ist selten selbsterklärend. Es enthält niemals einen Korrektheitsnachweis (das ist schwierig und manchmal unmöglich). Es enthält selten eine Begründung für die Big-O-Komplexität. Und es erklärt selten die Alternativen, die entweder eine geringere Leistung oder mehr Speicher sind. Daher würde ich vorschlagen, dass DSL weit hinter der "Erklärung" zurückbleibt.
S.Lott
-2

Ich denke, das ist ein Fehler zu glauben, dass LP eine Art DSL ist. Da LP - Journal (mit Diagrammen, Schemata, Pseudocodefragmenten, dh Chunks) eines entwickelten Programms ist, ist es Architektur und so weiter ... Es ist absolut analog zu Papiernotizbuch - viele Entwickler verwenden sie, aber nach Abschluss des Programms - Lass deine Notizbücher, Papiere ...

Vor langer Zeit hat jeder Physiker, Astonom, Chemiker / Alchemist, Mathematiker eigene Notizbücher, Manuskripte mit vielen Schemata, notwendige Informationen, Tabellen, und ohne sie können Sie ihre erfolgreichen Erfahrungen, seine Ergebnisse, verstehen oder wiederholen. Und immer zwischen solchen Völkern gibt es die Suche nach Manuskripten / Notizbüchern.

Heutzutage schreiben viele Programmierer Code und manchmal fügen sie Kommentare hinzu! Byt-Programm ist nicht nur Code - es sind Gedanken, Ideen, Vorstellungskraft, Konzepte und wenn ein neuer Entwickler fremden Code erbt - bricht er oft alle Ideen und Konzepte, macht verschiedene "Lücken" und "Hintertüren", ich hoffe du verstehst mich :)

Die Hauptanforderung für LP (als Werkzeug!) Ist es daher, all dies mit einer einfachen, leichten und lesbaren Syntax zuzulassen. Ich habe viele LP-Tools ausprobiert, aber heute entwickle ich ein eigenes - NanoLP ( http://code.google.com/p/nano-lp/ ), mit dem diese Nachfrage befriedigt werden soll.

Paul-AG
quelle