Literarische Programmierung hat gute Ideale. Warum denkst du, dass dies kein Mainstream ist? Liegt es daran, dass es nicht geliefert hat?
Literarische Programmierung hat gute Ideale. Warum denkst du, dass dies kein Mainstream ist? Liegt es daran, dass es nicht geliefert hat?
Antworten:
Ich habe es zum ersten Mal in einem Buch mit Knuths Schriften gesehen und fand es ordentlich. Dann habe ich versucht, über die Anzeige der literarischen Programmierung nachzuvollziehen, was in dem Programm vor sich geht, und fand es schwieriger, als es aussah. Es mag sein, dass ich zu gewohnt war, Programmlisten durchzugehen, aber es schien verwirrend.
Dann habe ich mir den Quellcode angesehen, und das hat mich dann und dort ausgeschaltet. Ich musste lernen, Programme auf eine völlig neue Art und Weise zu schreiben, mit weniger Korrespondenz zwischen dem Programmtext und dem, was der Compiler sah, und sah keinen entsprechenden Nutzen.
Außerdem können die Leute lange und überzeugende Argumente schreiben, dass der Code X tut, wenn er tatsächlich Y tut, und ich bin auf meinen Anteil irreführender Kommentare gestoßen. Ich habe eine Vorliebe dafür entwickelt, den Code zu lesen, um zu sehen, was er ziemlich früh tut. Literarische Programmierung ist das Gegenteil davon.
Ich würde den Netzwerkeffekt verantwortlich machen . Damit andere Personen Ihren Code und Ihre Dokumentation bearbeiten können, müssen sie in der Lage sein, ihn zu verstehen.
Dies schiebt die Leute von so etwas wie cweb / noweb weg, da Sie für ihre Verwendung zusätzlich zu der Programmiersprache, die Sie für das Projekt verwenden, noch das Erlernen von TeX und der programmspezifischen Syntax benötigen würden. Dies kann als eine enorme Zeitverschwendung angesehen werden, insbesondere wenn sie keinen der mathematischen Schriftsätze benötigen, die für TeX von Anfang an eine so große Anziehungskraft haben. (Und für viele Anwendungsprogrammierer wird es wirklich nicht benötigt.) Stattdessen bevorzugen sie XML-Kommentare von Visual Studio, da diese bereits beliebt und etabliert sind.
Die Orte, an denen ich die Einführung von Lese- und Schreibprogrammen gesehen habe, sind wissenschaftliche / statistische Berechnungen, bei denen die meisten Programmierer über eine umfangreiche Ausbildung (auch bekannt als PhDs) in Mathematik, CS oder Statistik verfügen und daher bereits mit LaTeX vertraut sind. Die Dokumentation, die sie schreiben, enthält mit größerer Wahrscheinlichkeit viele komplizierte Formeln, die am besten in TeX geschrieben sind, und sie programmieren mit größerer Wahrscheinlichkeit in R. Der Anteil der R-Programmierer, die SWeave kennen, ist definitiv viel höher als zum Beispiel die Anteil der C-Programmierer, die sich mit cweb auskennen.
org-mode
die Unterstützung für Lese- und Schreibprogramme werfen . Es ist ziemlich praktisch und ich finde es viel einfacher zu verstehen (ganz zu schweigen von der Verwaltung ) als WEB oder NOWEB alleine. Ein wichtiger Aspekt des Codes ist die Lesbarkeit, und diese ist lesbar. (vgl. github.com/vermiculus/stack-mode )
Das Konzept der literarischen Programmierung faszinierte mich Ende der 90er Jahre während des Studiums und ich bin immer noch fasziniert von Knuths Herangehensweise an Programmierung und Satz. Nichts als das Beste wird genügen.
Das von Knuth entwickelte literarische Programmiersystem ist viel, viel mehr als sofort ins Auge gefallen. Es hat nämlich viele Mängel in der zugrunde liegenden Programmiersprache behoben, die das aus Knuths Quelldokument generierte Tool zur Codegenerierung, nämlich das Standard-Pascal.
Für diejenigen, die das Glück haben, Standard Pascal nicht ausprobiert zu haben, sind hier einige der Highlights.
All diese Dinge bedeuteten im Grunde, dass Knuth eine bessere Programmiersprache brauchte (so erfand er eine) und Pascal als Assemblersprache verwendete.
Die meisten modernen Sprachen können diese Dinge ohne großen Aufwand erledigen, sodass ein GROSSER Teil der Arbeit, die Literate Programming zu lösen hatte, entfällt.
Moderne Sprachen sind aussagekräftiger, sodass mehr Gedanken in den Code selbst eingefügt werden können.
Also, was ist noch übrig? Die Möglichkeit, eine gesetzte Form der Dokumentation aus dem Quellcode zu generieren, und DAS gibt es heute.
Denken Sie nur an JavaDoc - die Java-Laufzeit-API ist vielleicht das größte derzeit verfügbare Teil der literarischen Programmierung (mit der Ausnahme, dass der Code nicht wirklich präsentiert wird, aber es KÖNNTE gewesen sein, wenn Java von Anfang an Open Source war). Siehe zum Beispiel die Präsentation des Collections-Frameworks unter http://download.oracle.com/javase/6/docs/api/java/util/Collection.html
Ich glaube, es gibt ähnliche Systeme für .NET und andere Mainstream-Programme.
To make it possible to have a single-pass compiler, all declarations had to come in a certain order.
Eine solche Deklarationsreihenfolge vereinfacht zwar das Compiler-Design, verhindert jedoch nicht die Kompilierung in einem Durchgang. Delphi zum Beispiel hat diese Reihenfolge nicht, aber es ist immer noch ein Pascal-Compiler mit nur einem Durchgang.
Als ich mich in den 90ern mit Lese- und Schreibprogrammen auseinandersetzte, stellte ich fest, dass es sehr leidenschaftliche Leute anzog, die genau das Richtige tun wollten - und dass sie ihr eigenes Lese- und Schreibprogrammiersystem schreiben mussten, weil kein vorhandenes für sie gut genug war. noweb war ein guter Versuch, dies zu unterbinden, indem ein ausreichend kleiner gemeinsamer Nenner für alle bereitgestellt wurde, obwohl ich selbst dann den größten Teil meiner LP-Zeit damit verbracht habe, einen hübschen Drucker dafür zu entwickeln ...
Ein weiteres Problem ist, dass es wirklich anti-agil ist. In mancher Hinsicht ist es gut, verlangsamt zu werden, weil Sie dadurch gezwungen sind, im Voraus zu denken und die Dinge gleich beim ersten Mal richtig zu machen. Auf der anderen Seite bedeutet eine sorgfältige Dokumentation, dass es eine große Hürde für die Umgestaltung Ihres Codes gibt. Und wenn Sie warten, bis Ihr Code gehärtet ist, bevor Sie LP-ify es, erhalten Sie eine mehrtägige Dokumentationsaufgabe, die Sie wirklich aufhalten kann.
Meiner bescheidenen Meinung nach haben viele Unternehmen eine Kultur, die den Zielen der literarischen Programmierung widerspricht: Sie wollen schnellere Ergebnisse (sie schreien nur nach Qualität, wenn die App in Produktion ist). Nach meiner eigenen Erfahrung hatten sich meine Chefs geweigert zu verstehen, dass schnellere Ergebnisse nicht "ein Programm bedeuten, das am Tag nach meiner Anfrage ausgeführt werden kann". Wenn ein Entwickler nicht damit beschäftigt ist, über seine Tastatur zu tippen, arbeitet er nicht und "verschwendet seine Zeit mit sinnlosem Design". Ja, ich weiß, mein Chef ist ein Arschloch.
Codierer schreiben Code nicht Englisch.
Codierer schreiben keine Dokumentation, da dies nicht zur Ausführung des Codes beiträgt.
Codierer sind nicht gut darin, Dokumentation zu schreiben, weil es ein schlechtes Medium ist, um ihre Ideen auszudrücken.
Literarische Programmierung scheint die Idee zu sein, Dokumentation auf die nächste Ebene zu bringen, wo der Code eher ein Nachdenken ist. Vielleicht würde es funktionieren, aber für die meisten Programmierer sieht es wie eine widerwärtige Dokumentation aus.
Hauptsächlich, weil die Leute SEHR DUMM sind. Offensichtliches Zeugnis davon ist ein endloser Strom von Vermutungen und Missverständnissen, die von jungen Menschen über die Natur dieser einfachen Technik geäußert werden.
Die Leute verstehen LP als: (a) eine Methode zur Dokumentation (b) eine Methode zum Schreiben von geschliffenen Aufsätzen, die besondere Fähigkeiten oder Talente erfordern (c) einfach keine Ahnung haben - wie der Schöpfer des Leo-Programmiereditors selbst zugibt usw. usw. usw.
LP ist jedoch einfach: (1) Schreiben von Programmen in einer Mischung aus Code und Phrasen in einer (= beliebigen) menschlichen Sprache, wobei letztere für andere Codestücke und / oder eingeschlossene Phrasen stehen. Dies ist genau das, was Autoren zahlreicher Programmierbücher tun. Und (2) es ist ein einfacher Präprozessor, der diese Phrasen im Menschen erweitert (was so aussah, als würden Namen von eingeschlossenen Unterprogrammen verwendet), um das Ergebnis IN DER VOM COMPILER ERFORDERLICHEN REIHENFOLGE (oder) zu entwirren Dolmetscher). Andernfalls können Sie den geschriebenen Text mit einem anderen kleinen Dienstprogramm erweitern, um Formatierungssymbole hinzuzufügen, mit denen Sie aus der "gebildeten Quelle" einen schönen, gut formatierten, lesbaren Text machen können.
Junge Leute probieren diese extrem einfache Idee niemals aus - und fantasieren oder stellen sich falsche Gründe vor, warum sie es niemals versuchen oder tun.
Grundsätzlich hilft die Grundidee, "im Pseudocode" in einer menschlichen Sprache zu programmieren und diese dann mit einem einfachen Präprozessor-Dienstprogramm zu erweitern (begrenzt, eine Hauptschwierigkeit für jedes längere Programm), ähnlich wie das Falten von Code oder die Aufteilung Ihres Programmflusses in Funktionen / Unterprogramme, die erforderlich sind, damit Sie sich nicht in den Details verlieren, sondern für die Ausführung der Maschine völlig unnötig sind.
Es gibt zwei Aspekte der gebildeten Programmierung , dass ich tue Wunsch in den Hauptprogramme integriert wurde - eingebettete Bilder (zB Design - Diagramme) und Zeiger auf vorherige und alternativen Versuche (zB „Der Grund , warum es so ist , ist , weil ich diese andere Art und Weise versucht , und es hat nicht funktioniert, weil ... "). Beide Aspekte können mit Dokumentkommentaren und URIs behandelt werden.
Weil die Logik von Programmen nicht so funktioniert, wie wir sprechen. Ein Programm hat einen genau festgelegten Ablauf, Bedingungen und Schleifen.
Nachdem ich viel codiert habe, DENKE ich in diesen Begriffen. Mein Gehirn wandelt Probleme in die Zieldomäne von ausführbarem Code um. Und es ist für mich viel effizienter, dies in einer normalen Programmiersprache aufzuschreiben, als den zusätzlichen Transformationsschritt ausführen zu müssen, um meine Programme lesen und schreiben zu können.
Tatsächlich glaube ich, dass meine Programme bereits gut geschrieben sind ... sprechende Bezeichner, gute Funktionsnamen, Kommentare, bei denen ich einige Hacks gemacht habe, die ich selbst nach ein paar Monaten nicht sofort begreifen würde.
Fazit: Mein Java-Code ist von sich aus besser als jede "gebildete" Programmierung.
Ich kam in die umgekehrte Richtung, um das Programmieren zu lernen - ich träumte davon, den Code so zu organisieren, wie er zu mir passt, und nicht so, wie es der Compiler verlangt. Ich fand Leo fast ideal für diesen Zweck. Es unterstützt auch das Verfolgen von Dateien, die außerhalb geändert wurden. Diese Dateien müssen kein spezielles Markup enthalten, sodass ich Leo für mich selbst verwenden kann, ohne dass andere im Team dies wissen müssen. Dieses Feature - "@shadow trees" - ist sehr vielversprechend, obwohl es immer noch ein bisschen fehlerhaft ist, braucht es mehr Augäpfel. Und es behebt auch das Problem "Oh nein, alles in einer großen Datei", indem sowohl alles in Baumstruktur organisiert wird als auch externe Dateien unterstützt werden.
Bei der "Literatenprogrammierung" geht es mir entgegen dem Namen überhaupt nicht um Dokumentation. Ich habe nicht mehr Unterlagen als zuvor. Es geht darum, eine Struktur zu haben, die mir hilft, mich nicht zu verlaufen . Ich schwöre darauf, besonders wenn ich riesige JSP-Dateien verwalte (und das obwohl Leo ursprünglich in erster Linie für Python gedacht war und keine Unterstützung für die JSP-Sprache bietet - ich muss die Datei manuell in einen Leo-Baum aufteilen!).
Ich sehe es als ein wertvolles Lehrmittel, mit dem eine Dissertation über Code geschrieben werden kann und in das dann Ausschnitte von Arbeitscode eingefügt werden, um die Leser über das Wie, Was und Warum des Codes zu unterrichten.
Außerhalb eines rein pädagogischen Umfelds, denke ich, versteht nur Knuth wirklich, wie man es am besten einsetzt.
Es ist die schlimmste aller Welten - Sie müssen ein sehr korrektes, sehr spezifisches Computerprogramm in einer sehr unspezifischen Sprache schreiben = Englisch. Sie müssen es also sorgfältig mit genau den richtigen Sätzen schreiben - Sie können also auch einfach Code schreiben.