Ich lerne Haskell und suchte nach einem Tool zum automatischen Einrücken. Ich sah nicht viel aus und erfuhr, dass Einrückung in Haskell (wie in Python) einen Block bedeutet. Daher schätze ich, dass es unmöglich ist, ein Tool zur automatischen Formatierung zu erstellen, das so stark ist wie in anderen Sprachen der C-Familie und explizite Markierungen wie {} (geschweifte Klammern) oder begin
end
Schlüsselwörter verwendet.
Es macht mir nichts aus, wenn eine Sprache die Einrückung für die Lesbarkeit erzwingt, aber ich kann die Vorteile gegenüber der Erzwingung der Einrückung und einer expliziten Markierung nicht verstehen, damit automatisierte Tools verstehen können, was zu welchem Block gehört.
Wenn die Präferenz der Einrückung beim Markieren eines Blocks darin besteht, dass der Code besser aussieht , verstehe ich den Vorteil immer noch nicht. Angesichts der Tatsache, dass Tabulatoren und Leerzeichen in verschiedenen Editoren und Schriftarten unterschiedlich dargestellt werden (Mono-Space-Schriftarten sehen beispielsweise aufgeräumter aus), ist es unmöglich zu erwarten, dass der Programmierer den Code anständig präsentiert. Ein Tool, das den aktuellen Texteditor berücksichtigen kann, ist viel besser geeignet, um den Code korrekt zu formatieren.
Warum sollte ein Sprachdesigner Einrückungen anstelle expliziter Blockmarkierungen wählen?
quelle
let x =1; y = 2; z = 3
ist so wie es ist völlig gültigdo { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }
. Diese müssen nicht in derselben Zeile stehen.Antworten:
Guido Von Rossum
Aus einem Interview mit Guido Van Rossum , das im Volltext mit books.google.com (Schwerpunkt Mine) zu sehen ist:
Von Rossum war stark von ABC inspiriert , und obwohl er nicht alles kopieren musste, wurde die Verwendung von Einrückungen beibehalten, da dies zur Vermeidung von Religionskriegen von Vorteil sein könnte.
Rossum sah auch Fehler aufgrund von Inkonsistenzen zwischen Gruppierung und Einzug, und anscheinend wäre es sicherer, wenn man sich nur auf Einrückungen stützt, um den Code zu strukturieren, vor Programmierfehlern 1 .
Donald E. Knuth und Peter J. Landin
In dem Interview, auf das verwiesen wird, erwähnt Guido Don Knuths Idee, Einrückungen zu verwenden. Dies wird in The Knuth Indentation Quote (Wiederentdeckung des Knuth-Einrückungszitats) beschrieben , in dem die strukturierte Programmierung mit goto-Anweisungen zitiert wird . Knuth verweist auch auf Peter John Landins Die nächsten 700 Programmiersprachen (siehe Abschnitt Diskussion über Einrückungen). Landin hat ISWIM entworfen, das wie die erste Sprache mit Einrückung anstelle von Start- / Endblöcken aussieht. In diesen Papieren geht es eher um die Machbarkeit der Verwendung von Einrückungen zur Strukturierung von Programmen als um tatsächliche Argumente dafür.
1. Ich denke, dass dies in der Tat ein Argument für Gruppierungskonstrukte und automatische Formatierung ist, um Programmierfehler zu erkennen und zu beheben, die zwangsläufig auftreten werden. Wenn Sie Ihre Einrückung in Python vermasseln, muss die Person, die Ihren Code debuggt, raten, welche richtig ist:
Soll
bar
immer aufgerufen werden oder nur wenn der Test erfolgreich ist?Gruppierungskonstrukte fügen eine Redundanzstufe hinzu, mit der Sie einen Fehler erkennen können, wenn Sie Ihren Code automatisch einrücken. In C kann der entsprechende Code wie folgt automatisch eingerückt werden:
Wenn ich beabsichtigte
bar
, auf dem gleichen Niveau wie zu seinfoo
, kann ich durch automatisches Einrücken basierend auf der Codestruktur feststellen, dass etwas nicht stimmt, das durch Hinzufügen von geschweiften Klammern umfoo
und behoben werden kannbar
.In Python: Mythen über Einrückung gibt es ein angeblich schlechtes Beispiel aus C:
Das ist der gleiche Fall wie oben. In Emacs hebe ich den gesamten Block / die gesamte Funktion hervor, drücke die Tabulatortaste und dann wird der gesamte Code neu eingerückt. Die Diskrepanz zwischen menschlicher Einrückung und Codestruktur sagt mir, dass etwas nicht stimmt (das und der vorhergehende Kommentar!).
Außerdem schafft es der Zwischencode, bei dem die Einrückung in C deaktiviert ist, einfach nicht durch den Hauptzweig. Alle vorhandenen Stilprüfungen würden GCC / Jenkins dazu bringen, mich anzuschreien. Ich hatte kürzlich ein ähnliches Problem wie das oben in Python beschriebene, mit einer Aussage, die durch eine Einrückungsstufe abweicht. Manchmal habe ich Code in C, der über eine schließende Klammer hinausgeht, aber dann drücke ich die Tabulatortaste und der Code wird "falsch" eingerückt: Das ist eine weitere Chance, den Fehler zu sehen.
quelle
Dies ist sehr subjektiv und die Ursache für viele Flammenkriege. Jedoch:
Symbole, die Blöcke und Einrückungen begrenzen, verstoßen gegen das DRY-Prinzip , da Sie dieselben Informationen auf zwei verschiedene Arten ausdrücken. Das Vorhandensein automatisierter Einrückungswerkzeuge ist ein Symptom für diese DRY-Verletzung: Dass Sie die Einrückung automatisch generieren können, zeigt, dass es sich um redundante Informationen handelt. Dies bedeutet, dass die Einrückung und die Symbole möglicherweise nicht mehr synchron sind, was zu irreführendem Code führt.
In den häufig gestellten Fragen zu Python- Design und -Geschichte wird dies sehr deutlich angegeben:
Es ist richtig, dass Sie kein Tool zum automatischen Einrücken für Python erstellen können, aber das ist gut so: Es bedeutet, dass Sie keine Redundanzen in der Syntax haben, für deren Abgleich Sie automatisierte Tools benötigen.
Die Tabulatoren gegen Leerzeichen sind in Python ein berechtigtes Problem, und es wird empfohlen, Tabulatoren und Leerzeichen (zum Einrücken) niemals in derselben Codebasis zu mischen.
Python erbte die signifikante Einrückung von der (inzwischen veralteten) Vorgängersprache ABC. ABC ist eine der wenigen Programmiersprachen, die Usability-Tests verwendet haben , um das Design zu steuern. Während Diskussionen über die Syntax normalerweise auf subjektiven Meinungen und persönlichen Vorlieben beruhen, hat die Wahl einer signifikanten Einrückung tatsächlich eine fundiertere Grundlage.
quelle
pass
Schlüsselwort, das automatisch abgeleitet werden kann, dessen explizite Angabe jedoch dazu beiträgt, Fehler zu entdecken. Die versehentliche Redundanz, sowohl Start- / Endsymbole (für den Compiler) als auch Einrückungen (für den menschlichen Leser) zu haben, scheint mehr Fehler zu verursachen, als sie abfangen. Zumindest scheint dies die Ansicht von van Rossum zu sein.PROCEDURE DIVISION.
? Ich kann nie sagen, wo dieDATA DIVISION
Enden und die Prozeduren in diesen neuen Sprachen beginnen.Sprachdesigner wählen syntaktisch signifikante Leerzeichen, weil sie glauben (oder zumindest glauben, dass ihre potenziellen Benutzer glauben), dass die Semikolons und Klammern beim Lesen von Code Rauschen verursachen und die Produktivität beeinträchtigen. Ein weiterer häufiger Grund ist, dass ein schlechter / inkonsistenter Codierungsstil die Lesbarkeit beeinträchtigt. Durch Erzwingen eines gemeinsamen Einrückungsschemas ist die Lesbarkeit insgesamt besser. Dieser spätere Grund ist jetzt weniger wichtig, da IDEs mit automatischer Formatierung häufiger vorkommen, aber dennoch angewendet werden können.
quelle