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 scrap
in 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.
literate-programming
Tag auf StackOverflow. Es gibt dort mehr Inhalte, obwohl immer noch nicht viel.Antworten:
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.
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
.o
erstellenden 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.
quelle
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.
quelle
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:
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):
quelle
turn left then right
oder "programmieren" könnenpaint wall with red, green and yellow
: docs.codehaus.org/display/GROOVY/…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.
quelle