In der Computerprogrammierung ist der Einrückungsstil eine Konvention , die die Einrückung von Quellcodezeilen regelt . Ein Einrückungsstil legt im Allgemeinen eine einheitliche Anzahl von Leerzeichen vor jeder Zeile eines Blocks fest , damit die Codezeilen zusammengehörig erscheinen, und bestimmt, ob Leerzeichen oder Tabulatoren als Einrückungszeichen verwendet werden.
Überblick
Dieser Artikel befasst sich hauptsächlich mit Stilen für freie Programmiersprachen . Wie der Name schon sagt, muss der Code solcher Sprachen keinem festgelegten Einrückungsstil folgen. Einrückung ist eine sekundäre Notation , die oft dazu dient, die kognitive Belastung für Programmierer beim Verständnis der Codestruktur zu verringern . Sie kann die Trennung des Codes anhand des Kontrollflusses verdeutlichen .
Strukturierte Sprachen wie Python und Occam verwenden Einrückungen, um die Struktur zu bestimmen, anstatt geschweifte Klammern oder Schlüsselwörter zu verwenden; dies wird als Off-Side-Regel bezeichnet . In solchen Sprachen ist die Einrückung für den Sprachprozessor (z. B. Compiler oder Interpreter ) relevant. Programmierer müssen sich an die Einrückungsregeln der Sprache halten, können aber die Einrückungsgröße frei wählen.
Dieser Artikel befasst sich mit Sprachen, die geschweifte Klammern verwenden (die Blöcke mit geschweiften Klammern abgrenzen ), insbesondere mit Sprachen der C-FamilieBEGIN . Konventionen, die in einer Sprache Anwendung finden, lassen sich jedoch auch auf andere Sprachen übertragen. Beispielsweise kann eine Sprache, die anstelle von geschweiften Klammern die Schlüsselwörter `and` und ` or` verwendet, ENDangepasst werden, indem man BEGIN`and` als öffnende geschweifte Klammer behandelt usw.
Der Einrückungsstil gilt nur für textbasierte Sprachen. Visuelle Programmiersprachen verwenden Einrückungen im Allgemeinen nicht auf dieselbe Weise.
Forschung
Trotz der weitverbreiteten Verwendung von Einrückungsstilen wurde deren Nutzen bisher kaum erforscht. Erste Experimente von Weissman aus dem Jahr 1974 zeigten keinen Effekt. [ 1 ] Ein Experiment von Morzeck et al. [ 2 ] aus dem Jahr 2023 ergab einen signifikanten positiven Effekt für verschachtelte ifAnweisungen: Nicht eingerückter Code benötigte im Durchschnitt 179 % mehr Lesezeit als eingerückter Code. Ein Folgeexperiment von Hanenberg et al. [ 3 ] bestätigte diesen starken Effekt (wobei in diesem Experiment nicht eingerückter Code nur 113 % mehr Lesezeit benötigte) und zeigte, dass die Unterschiede in den Lesezeiten durch den überspringbaren Code (bei eingerücktem Code) erklärt werden können. In einem weiteren Experiment mit JSON-Objekten [ 4 ] benötigte nicht eingerückter Code sogar 544 % mehr Lesezeit.
Arten der Zahnspangenplatzierung
Die folgende Tabelle veranschaulicht, wie sich unterschiedliche Klammerformatierungen auf die Einrückung in Kontrollstrukturen auswirken. Aus Gründen der Einheitlichkeit beträgt die Einrückungsgröße im Beispielcode 4 Leerzeichen, obwohl dies je nach Programmierkonvention variieren kann.
| Beispiel | Name |
|---|---|
while ( x == y ) { foo (); bar (); } | Allman |
while ( x == y ) { foo (); bar (); } | GNU |
while ( x == y ) { foo (); bar (); } | Weißschmiede |
while ( x == y ) { foo (); bar (); } | K&R |
while ( x == y ) { foo (); bar (); } | Ratliff |
while ( x == y ) { foo (); bar (); } | Horstmann |
while ( x == y ) { foo (); bar (); } | Pico |
while ( x == y ) { foo (); bar (); } | Lispeln |
#define W(c,b) {while(c){b}} W ( x == y , f (); b ();) | APL |
C/C++-Stile
Zu den Merkmalen des Codierungsstils von C , C++ und anderen Programmiersprachen mit geschweiften Klammern gehören unter anderem:
- Platzierung von geschweiften Klammern im Verhältnis zu anderen Codeelementen
- Verwendung von Tabulatoren oder Leerzeichen
- Das Einschließen von einzelnen Anweisungsblöcken in geschweifte Klammern wird von Befürwortern als Vorteil angeführt, da der resultierende Code sicherer wird, da das Einfügen einer Anweisung nicht zu einem Kontrollfluss führen kann, der der Einrückung widerspricht. Ein angeführter Nachteil ist die längere Codelänge, da für die schließende geschweifte Klammer eines Blocks (mit Ausnahme des
else ifKonstrukts und einesdo{}whileBlocks) eine Zeile benötigt wird.
K&R
Der Kernighan-Ritchie-Stil (K&R-Stil) ist weit verbreitet für C- und C++-Code und bildet die Grundlage für viele abgeleitete Stile. Er findet Anwendung im ursprünglichen Unix-Kernel, in Kernighan und Ritchies Buch „The C Programming Language“ sowie in Kernighan und Plaugers Buch „The Elements of Programming Style“ .
Obwohl die Programmiersprache C diesen Stil nicht explizit definiert, wird er konsequent befolgt. Aus dem Buch:
Die Position der Zahnspange ist weniger wichtig, auch wenn es da unterschiedliche Meinungen gibt. Wir haben einen von mehreren beliebten Stilen ausgewählt. Suchen Sie sich einen Stil aus, der Ihnen gefällt, und tragen Sie ihn dann konsequent.
Bei dieser Schreibweise stehen die öffnenden und schließenden geschweiften Klammern einer Funktion in jeweils eigenen Zeilen und haben dieselbe Einrückung wie die Deklaration, während die Anweisungen im Funktionskörper zusätzlich eingerückt sind. Ein Block mit mehreren Anweisungen innerhalb einer Funktion hingegen hat seine öffnende geschweifte Klammer in derselben Zeile wie der Kontrollsatz, während die schließende geschweifte Klammer in einer eigenen Zeile bleibt, sofern nicht ein Schlüsselwort wie `on` oder else`on` folgt while.
Beispielcode:
int main ( int argc , char * argv []) { while ( x == y ) { do_something (); do_something_else (); if ( some_error ) fix_issue (); // Einzelanweisungsblock ohne geschweifte Klammern else continue_as_usual (); } final_thing (); }Ägyptische Zahnspangen
Die nicht ausgerichteten Klammern der mehrzeiligen Blöcke werden aufgrund ihrer Ähnlichkeit mit Armen in einigen fantasievollen Posen der alten Ägypter als „ägyptische Klammern“ (oder „ägyptische Klammern“) bezeichnet. [ 5 ] [ 6 ] [ 7 ]
Einzelne Aussagen
Ein Block, der nur aus einer einzigen Anweisung besteht, hat keine geschweiften Klammern, was eine Ursache für leicht zu übersehende Fehler wie den goto-Fehler ist .
Eine wahre Zahnspange
Der One True Brace Style [ 8 ] (abgekürzt 1TBS oder OTBS [ 9 ] ) ist eine Variante des K&R-Stils, bei der die geschweiften Klammern in einem Block aus nur einer Anweisung nicht weggelassen werden. [ 10 ]
bool is_negative ( int x ) { if ( x < 0 ) { return true ; } else { return false ; } }Obwohl es von Sprachen wie C/C++ nicht vorgeschrieben ist, stellt die Verwendung von geschweiften Klammern für einzelne Anweisungsblöcke sicher, dass das Einfügen einer neuen Anweisung nicht zu einem Kontrollfluss führt, der der Einrückung widerspricht, wie es beispielsweise bei Apples berüchtigtem goto fail-Bug zu sehen war .
Die Bedeutung des Begriffs „One True Brace Style“ (OTBS) ist in verschiedenen Quellen umstritten – je nach dem jeweils gebräuchlichsten Stil in der jeweiligen Sprache können geringfügige Unterschiede bestehen [ 11 ] [ 12 ], einzelne Autoren können je nach ihren subjektiven Präferenzen einen völlig anderen Stil als OTBS bezeichnen [ 13 ] , während andere ihn als „Hackerjargon“ für K&R abtun [ 14 ] .
Linux-Kernel
Der Quellcode des Linux-Kernels ist in einer Variante des K&R-Stils formatiert. [ 15 ] Linus Torvalds empfiehlt Mitwirkenden, sich daran zu halten. Zu den Attributen gehören:
- Verwendet Tabulatorzeichen zur Einrückung (nicht Leerzeichen) und geht davon aus, dass alle 8 Leerzeichen ein Tabulatorstopp erfolgt.
- Die Klammeranordnung entspricht K&R, wobei die Klammern von Funktionsdefinitionen in eigenen Zeilen stehen und die öffnende Klammer von zusammengesetzten Anweisungen in derselben Zeile wie die Kontrollklausel, getrennt durch ein Leerzeichen.
- Die Beschriftungen in einer
switchAnweisung sind am umschließenden Block ausgerichtet (es gibt nur eine Einrückungsebene). - Die maximale Zeilenlänge beträgt 100 Zeichen, wobei die vor 2020 geltende Grenze von 80 Zeichen bevorzugt wird. [ 16 ]
- Der Rumpf einer zusammengesetzten Anweisung (wie z. B. if, while und do-while) muss nicht in geschweifte Klammern eingeschlossen werden.
if-elseBenötigen jedoch eine oder mehrere Unteranweisungen Klammern, so müssen beide Unteranweisungen in geschweifte Klammern gesetzt werden.
int power ( int x , int y ) { int result ;if ( y < 0 ) { result = 0 ; } else { result = 1 ; while ( y -- > 0 ) result *= x ; } return result ; }Java
Ein Großteil des Java -Codes verwendet eine Variante des K&R-Stils, bei der die öffnende geschweifte Klammer nicht nur innerhalb von Funktionsblöcken, sondern auch bei Klassen- und Methodendeklarationen in derselben Zeile steht. Dieser Stil ist weit verbreitet, da die ursprünglichen Styleguides von Sun Microsystems [ 17 ] [ 18 ] [ 19 ] diese K&R-Variante verwendeten. Daher ist der Großteil des Standardquellcodes der Java-API in diesem Stil geschrieben. Er ist neben dem Allman-Stil auch ein beliebter Einrückungsstil für ActionScript und JavaScript .
Stroustrup
Bjarne Stroustrup adaptierte den K&R-Stil für C++ in seinen Büchern, wie zum Beispiel „Programming: Principles and Practice using C++“ und „The C++ Programming Language“ . [ 20 ]
Im Gegensatz zu den oben genannten Varianten verwendet Stroustrup kein „cuddled else“. Daher würde Stroustrup schreiben [ 20 ]
if ( x < 0 ) { puts ( "Negativ" ); negative ( x ); } else { puts ( "Nicht-negativ" ); nonnegative ( x ); }Stroustrup erweitert den K&R-Stil für Klassen und schreibt sie wie folgt:
class DoubleVec { public : // Konstruiert einen DoubleVec DoubleVec ( int s ) : elem ( new double [ s ]), sz ( s ) { } // Elementzugriff: Indexierung double & operator []( int i ) { return elem [ i ]; } int size () { return sz ; } private : // Zeiger auf die Elemente double * elem ; // Anzahl der Elemente int sz ; };Stroustrup rückt die Labels public:und nicht ein private:. Außerdem beginnt in diesem Stil die öffnende geschweifte Klammer einer Funktion in einer neuen Zeile, während die öffnende geschweifte Klammer einer Klasse in derselben Zeile wie der Klassenname steht.
Stroustrup ermöglicht es, kurze Funktionen in einer einzigen Zeile zu schreiben. Der Stroustrup-Stil ist ein benannter Einrückungsstil, der im Editor Emacs verfügbar ist . Stroustrup empfiehlt in seinen modernen C++ Core Guidelines ein vom K&R-Stil abgeleitetes Layout für C++ . [ 21 ]
BSD KNF
Die Berkeley Software Distribution (BSD)-Betriebssysteme verwenden einen Stil, der mitunter als „Kernel-Normalform“ (KNF) bezeichnet wird. Obwohl er hauptsächlich für Kernel-Code gedacht ist, findet er auch in Benutzerprogrammen breite Anwendung . Im Wesentlichen handelt es sich um eine umfassend dokumentierte Variante des K&R-Stils, wie er im Quellcode der Unix- Versionen 6 und 7 der Bell Labs verwendet wurde. [ 22 ]
Der SunOS-Kernel und die Benutzersprache verwenden einen ähnlichen Einrückungsstil. [ 22 ] Wie KNF basiert auch dieser auf AT&T-Stilrichtlinien und wird mitunter als Bill-Joy-Normalform bezeichnet. [ 23 ] Die SunOS-Richtlinie wurde 1996 veröffentlicht; ANSI C wird kurz erwähnt. Die Korrektheit der Einrückung einer Liste von Quelldateien kann mit dem von Bill Shannon entwickelten Programm cstyle überprüft werden . [ 22 ] [ 23 ] [ 24 ]
In diesem Stil ist der feste Tabulator (ts in vi ) auf acht Spalten eingestellt, während ein weicher Tabulator (sw in vi) oft ebenfalls als Hilfsfunktion definiert und auf vier Spalten gesetzt wird. Der feste Tabulator dient zum Einrücken von Codeblöcken, während ein weicher Tabulator (vier Leerzeichen) für zusätzliche Einrückung bei allen fortlaufenden Zeilen verwendet wird, die auf mehrere Zeilen aufgeteilt werden müssen.
Funktionsaufrufe verwenden kein Leerzeichen vor der Klammer, obwohl native C-Anweisungen wie `if` if, while`if` do, `if` switchund return`if` dies tun (wenn `if` returnmit Klammern verwendet wird). Funktionen, die in ihrem obersten Block keine lokalen Variablen deklarieren, sollten nach der öffnenden Blockklammer ebenfalls eine Leerzeile einfügen.
Beispiele:
while ( x == y ) { something (); something_else (); } final_thing ();if ( data != NULL && res > 0 ) { if ( JS_DefineProperty ( cx , o , "data" , STRING_TO_JSVAL ( JS_NewStringCopyN ( cx , data , res )), NULL , NULL , JSPROP_ENUMERATE ) != 0 ) { QUEUE_EXCEPTION ( "Interner Fehler!" ); goto err ; } PQfreemem ( data ); } else { if ( JS_DefineProperty ( cx , o , "data" , OBJECT_TO_JSVAL ( NULL ), NULL , NULL , JSPROP_ENUMERATE ) != 0 ) { QUEUE_EXCEPTION ( "Interner Fehler!" ); goto err ; } }static JSBool pgresult_constructor ( JSContext * cx , JSObject * obj , uintN argc , jsval * argv , jsval * rval ) {QUEUE_EXCEPTION ( "PGresult-Klasse nicht benutzerinstanziierbar" );return ( JS_FALSE ); }Allman
Der Allman-Stil ist nach Eric Allman benannt . Er wird manchmal auch als BSD-Stil bezeichnet , da Allman viele der Dienstprogramme für BSD Unix geschrieben hat (dies sollte jedoch nicht mit dem anderen „BSD KNF-Stil“ verwechselt werden; siehe oben).
Bei diesem Stil wird die zu einer Kontrollanweisung gehörige geschweifte Klammer in die nächste Zeile gesetzt und auf die gleiche Einrückungsebene wie die Kontrollanweisung eingerückt. Anweisungen innerhalb der geschweiften Klammern werden auf die nächste Einrückungsebene eingerückt. [ 14 ]
while ( x == y ) { something (); something_else (); }final_thing ();Dieser Stil ähnelt der Standardeinrückung, die von den Pascal- Sprachen und Transact-SQLbegin verwendet wird, wobei die geschweiften Klammern den Schlüsselwörtern und entsprechen end.
(* Beispiel für Allman-Code-Einrückung in Pascal *) Prozedur dosomething ( x , y : Integer ) ; begin while x = y do begin something () ; something_else () ; end ; end ;Die Folgen dieses Stils sind, dass der eingerückte Code durch fast ausschließlich aus Leerzeichen bestehende Zeilen klar vom umschließenden Anweisungsblock abgegrenzt ist und die schließende Klammer in derselben Spalte wie die öffnende Klammer steht. Manche empfinden dies als hilfreich, um zusammengehörige Klammern leichter zu finden. Der Blockierungsstil trennt außerdem den Codeblock von der zugehörigen Kontrollanweisung. Das Auskommentieren oder Entfernen einer Kontrollanweisung oder eines Codeblocks sowie Code-Refactoring verringern die Wahrscheinlichkeit von Syntaxfehlern durch hängende oder fehlende Klammern. Zudem ist er konsistent mit der Klammerplatzierung für den äußeren Funktionsblock.
Beispielsweise ist Folgendes syntaktisch noch korrekt:
// while (x == y) { something (); something_else (); }So ist es auch hiermit:
// for (int i=0; i < x; i++) // while (x == y) if ( x == y ) { something (); something_else (); }Selbst so, mit bedingter Kompilierung:
int c ; #ifdef HAS_GETCH while (( c = getch ()) != EOF ) #else while (( c = getchar ()) != EOF ) #endif { do_something ( c ); }Variante: Allman-8
Allman-8 verwendet die 8-Leerzeichen-Einrückung und die 80-Spalten-Beschränkung der Linux-Kernel-Variante von K&R. Dieser Stil soll die Lesbarkeit auf Beamern verbessern. Zudem erleichtern die Einrückungsgröße und die Spaltenbegrenzung das Erkennen übermäßig verschachtelter Codeblöcke. Diese Vorteile bieten angehenden Entwicklern und Lernenden eine implizite Hilfestellung im Umgang mit komplexerem Code.
Weißschmiede
Der Whitesmiths-Stil, auch Wishart-Stil genannt, wurde ursprünglich in der Dokumentation des ersten kommerziellen C-Compilers, dem Whitesmiths Compiler, verwendet. Er war auch in den Anfängen von Windows beliebt, da er in drei einflussreichen Windows-Programmierbüchern Verwendung fand: „ Programmer's Guide to Windows“ von Durant , Carlson & Yao , „Programming Windows“ von Petzold und „Windows 3.0 Power Programming Techniques“ von Norton & Yao.
Laut dem „Jargon File“ waren Whitesmiths und Allman 1991 die am weitesten verbreiteten Verstrebungsarten , wobei beide damals etwa gleich beliebt waren. [ 14 ] [ 25 ]
Bei diesem Stil wird die geschweifte Klammer einer Kontrollanweisung in die nächste Zeile eingerückt. Anweisungen innerhalb der Klammern werden auf die gleiche Einrückungsebene wie die Klammern selbst eingerückt.
Wie beim Ratliff-Stil wird die schließende Klammer genauso eingerückt wie die Anweisungen innerhalb der Klammern. [ 26 ]
while ( x == y ) { something (); something_else (); }final_thing ();Die Vorteile dieses Stils ähneln denen des Allman-Stils . Blöcke sind klar von Kontrollanweisungen abgegrenzt. Die Ausrichtung der geschweiften Klammern am Block unterstreicht, dass der gesamte Block konzeptionell und programmatisch eine einzige zusammengesetzte Anweisung darstellt. Die Einrückung der geschweiften Klammern verdeutlicht deren Unterordnung unter die Kontrollanweisung. Die schließende geschweifte Klammer steht nicht mehr mit der Anweisung, sondern mit der öffnenden.
Ein Beispiel:
if ( data != NULL && res > 0 ) { if ( ! JS_DefineProperty ( cx , o , "data" , STRING_TO_JSVAL ( JS_NewStringCopyN ( cx , data , res )), NULL , NULL , JSPROP_ENUMERATE )) { QUEUE_EXCEPTION ( "Interner Fehler!" ); goto err ; } PQfreemem ( data ); } else if ( ! JS_DefineProperty ( cx , o , "data" , OBJECT_TO_JSVAL ( NULL ), NULL , NULL , JSPROP_ENUMERATE )) { QUEUE_EXCEPTION ( "Interner Fehler!" ); goto err ; }else ifwerden als Anweisung behandelt, ähnlich wie die #elifPräprozessor-Anweisung.
GNU
Wie bei den Stilen von Allman und Whitesmiths werden geschweifte Klammern auch im GNU -Stil in einer eigenen Zeile mit zwei Leerzeichen eingerückt, außer beim Öffnen einer Funktionsdefinition, wo sie nicht eingerückt werden. [ 27 ] In beiden Fällen wird der darin enthaltene Code um zwei Leerzeichen von den geschweiften Klammern eingerückt.
Das von Richard Stallman populär gemachte Layout ist möglicherweise durch seine Erfahrung mit Lisp- Programmierung beeinflusst . [ 28 ] In Lisp entspricht ein Block (ein „progn“) einer Dateneinheit erster Klasse, und die eigene Einrückungsebene unterstreicht dies. In C hingegen ist ein Block lediglich Syntax. Dieser Stil findet sich auch in einigen Lehrbüchern zu den Programmiersprachen ALGOL und XPL aus den 1960er- und 1970er-Jahren. [ 29 ] [ 30 ]
Obwohl es sich nicht um eine Einrückung im eigentlichen Sinne handelt, sieht der GNU-Codierungsstil auch ein Leerzeichen nach einem Funktionsnamen vor – vor der öffnenden Klammer einer Argumentliste. [ 27 ]
static char * concat ( char * s1 , char * s2 ) { while ( x == y ) { something (); something_else (); } final_thing (); }Dieser Stil vereint die Vorteile von Allman und Whitesmiths und beseitigt so den möglichen Nachteil von Whitesmiths, dass geschweifte Klammern nicht vom Block abheben. Ein Nachteil besteht darin, dass die schließende geschweifte Klammer nicht mehr mit der zugehörigen Anweisung übereinstimmt. Ein weiterer möglicher Nachteil ist die mögliche Platzverschwendung durch zwei visuelle Einrückungsebenen für eine inhaltliche Ebene. In der Praxis ist dies jedoch unwahrscheinlich, da in Systemen mit einstufiger Einrückung jede Ebene üblicherweise mindestens vier Leerzeichen umfasst, was den 2 × 2 Leerzeichen im GNU-Stil entspricht.
Die GNU-Codierungsstandards empfehlen diesen Stil, und nahezu alle Maintainer von GNU-Projektsoftware verwenden ihn.
Der Texteditor GNU Emacs und der Befehl ` indent` der GNU-Systeme formatieren Code standardmäßig gemäß diesem Stil. [ 31 ] Benutzer, die nicht GNU Emacs oder einen ähnlich erweiterbaren/anpassbaren Editor verwenden, werden feststellen, dass die automatischen Einrückungseinstellungen ihres Editors für diesen Stil ungeeignet sind. Viele Editoren, die standardmäßig den KNF-Stil verwenden, kommen jedoch gut mit dem GNU-Stil zurecht, wenn die Tabulatorbreite auf zwei Leerzeichen eingestellt wird; ebenso passt sich GNU Emacs gut an den KNF-Stil an, indem die Tabulatorbreite einfach auf acht Leerzeichen gesetzt wird. In beiden Fällen geht durch die automatische Formatierung der ursprüngliche Zeilenabstand verloren, die automatische Zeileneinrückung funktioniert jedoch korrekt.
Steve McConnell rät in seinem Buch „Code Complete “ von diesem Stil ab: Er kennzeichnet Codebeispiele, die ihn verwenden, mit einem „Coding Horror“-Symbol, das besonders gefährlichen Code symbolisiert, und erklärt, dass er die Lesbarkeit beeinträchtigt. [ 26 ] Auch die Dokumentation zum Programmierstil des Linux-Kernels empfiehlt diesen Stil nicht und rät Lesern, eine Kopie der GNU-Codierungsstandards als „große symbolische Geste“ zu verbrennen. [ 32 ]
Horstmann
Die 1997 erschienene Ausgabe von „Computing Concepts with C++ Essentials“ von Cay S. Horstmann adaptiert Allmans Ansatz , indem die erste Anweisung eines Blocks in dieselbe Zeile wie die öffnende geschweifte Klammer gesetzt wird. Dieser Stil wird auch in Beispielen im „Pascal User Manual and Report“ von Jensen und Wirth verwendet . [ 33 ]
while ( x == y ) { something (); something_else (); //... if ( x < 0 ) { printf ( "Negativ" ); negative ( x ); } else { printf ( "Nicht-negativ" ); nonnegative ( x ); } } final_thing ();Dieser Stil vereint die Vorteile des Allman-Stils – die Beibehaltung der vertikalen Ausrichtung der Klammern für bessere Lesbarkeit und die einfache Kennzeichnung von Blöcken – mit der Einsparung einer Zeile im Vergleich zum K&R-Stil. Die Ausgabe von 2003 verwendet jedoch durchgehend den Allman-Stil. [ 34 ]
Pico
Dies ist der von den Entwicklern der Sprache Pico am häufigsten verwendete Stil. Pico kennt keine return-Anweisungen und verwendet Semikolons als Anweisungstrennzeichen anstelle von terminierenden Zeichen. Daraus ergibt sich folgende Syntax: [ 35 ]
Zeug(n): { x: 3 * n; y: do_stuff(x); y + x } Die Vor- und Nachteile ähneln denen der Bildschirmplatzersparnis beim K&R-Stil. Ein weiterer Vorteil ist die einheitliche Verwendung der öffnenden und schließenden geschweiften Klammern (beide teilen sich den Platz mit einer Codezeile), im Gegensatz zum K&R-Stil, bei dem eine geschweifte Klammer sich den Platz mit einer Codezeile teilt und die andere eine eigene Zeile bildet.
Ratliff
In dem Buch „Programmers at Work “ [ 36 ] beschreibt C. Wayne Ratliff, der Entwickler der populären Programmiersprachen der vierten Generation dBase -II und -III , einen Stil, der dem 1TBS-Stil ähnelt, bei dem die schließende geschweifte Klammer jedoch mit der Einrückung des verschachtelten Blocks übereinstimmt. Er gibt an, dass dieser Stil ursprünglich in Unterlagen von Digital Research Inc. dokumentiert wurde. Dieser Stil wird mitunter als Bannerstil bezeichnet [ 37 ] , möglicherweise aufgrund der Ähnlichkeit mit einem Banner an einer Stange. In diesem Stil, der dem Whitesmith-Stil in etwa dem K&R-Stil im Allman-Stil entspricht, ist die schließende geschweifte Klammer genauso eingerückt wie das letzte Element der Liste (und verliert dadurch an Bedeutung) [ 26 ]. Dieser Stil kann das visuelle Scannen erleichtern, da die Überschriften der Blöcke die einzigen Elemente sind, die auf dieser Ebene eingerückt werden (die Theorie dahinter ist, dass die schließende geschweifte Klammer des vorherigen Blocks den Lesefluss der Überschrift des nächsten Blocks im K&R- und Allman-Stil stört). Kernighan und Plauger verwenden diesen Stil im Ratfor-Code in Software Tools . [ 38 ]
// In C for ( i = 0 ; i < 10 ; i ++ ) { if ( i % 2 == 0 ) { do_something ( i ); } else { do_something_else ( i ); } }Abgeleitete C-Sprachstile
Die folgenden Stile können als „abgeleitete“ C-Stile betrachtet werden, da sie maßgeblich von den Einrückungsstilen anderer, nicht-C-sprachiger Sprachen beeinflusst sind. Sie können auf C-Code angewendet werden, der Teil eines Projekts ist, das größtenteils in einer dieser anderen Sprachen geschrieben wurde, wobei die Beibehaltung eines einheitlichen Erscheinungsbilds des Kerncodes Vorrang vor der Verwendung eines konventionelleren C-Stils hat.
Lisp-Stil
Der GNU-Stil wird zwar manchmal als von einem Lisp-Programmierer eingerückter C-Code beschrieben, man geht aber auch so weit, die schließenden geschweiften Klammern in der letzten Zeile eines Blocks zusammenzufügen. Bei diesem Stil ist die Einrückung die einzige Möglichkeit, Codeblöcke zu unterscheiden, er hat aber den Vorteil, keine überflüssigen Zeilen zu enthalten. Man könnte ihn leicht als Lisp-Stil bezeichnen, da er in Lisp-Code sehr verbreitet ist. In Lisp soll die Gruppierung identischer geschweifter Klammern am Ende von Ausdrucksbäumen verdeutlichen, dass es nicht Aufgabe des Benutzers ist, die Verschachtelungsebenen visuell zu verfolgen, sondern lediglich die Struktur des Baums zu verstehen.
Die traditionelle Lisp-Variante dieses Stils bevorzugt extrem schmale Einrückungen (typischerweise zwei Leerzeichen), da Lisp-Code üblicherweise sehr tief verschachtelt ist. Lisp kennt nämlich nur Ausdrücke ohne eine eigene Klasse von Anweisungen ; Funktionsargumente werden meist auf dieselbe Ebene eingerückt, um ihren gemeinsamen Status innerhalb des umschließenden Ausdrucks zu verdeutlichen. Dies liegt auch daran, dass Lisp – abgesehen von geschweiften Klammern – traditionell eine sehr prägnante Sprache ist, die selbst gängige Formen einfachen Boilerplate-Codes als nicht informativ auslässt, wie beispielsweise das elseSchlüsselwort `if` in einem if : then | elseBlock, und es stattdessen einheitlich als `if` darstellt (if expr1 expr2 expr3).
// C for ( i = 0 ; i < 10 ; i ++ ) { if ( i % 2 == 0 ) { do_something ( i );} else { do_something_else ( i ); do_third_thing ( i );}}
;; Lisp ( dotimes ( i 10 ) ( if ( = ( rem i 2 ) 0 ) ( do-something i ) ( progn ( do-something-else i ) ( do-third-thing i ))))Hinweis: prognDiese Prozedur wertet mehrere Teilausdrücke nacheinander auf ihre Auswirkungen aus und verwirft dabei alle Rückgabewerte außer dem letzten (n-ten). Wenn alle Rückgabewerte benötigt werden, valuessollte diese Prozedur verwendet werden.
Haskell-Stil
Das Haskell- Layout ermöglicht es, die Platzierung von geschweiften Klammern optional zu gestalten, obwohl geschweifte Klammern und Semikolons in der Sprache zulässig sind. [ 39 ] Die beiden folgenden Segmente sind für den Compiler gleichermaßen akzeptabel:
ohne Klammern = do text <- getContents let firstWord = head $ words text bigWord = map toUpper firstWord putStrLn bigWordbraceful = do { text <- getContents ; let { firstWord = head $ words text ; bigWord = map toUpper firstWord } ; putStrLn bigWord }In Haskell kann die Formatierung geschweifte Klammern ersetzen. Üblicherweise werden geschweifte Klammern und Semikolons in prozeduralendo Abschnitten und im Programmtext im Allgemeinen weggelassen. Der hier verwendete Stil wird jedoch häufig für Listen, Records und andere syntaktische Elemente verwendet, die aus Klammern oder geschweiften Klammernpaaren bestehen, die durch Kommas oder Semikolons getrennt sind. [ 40 ] Wenn im Code nach den Schlüsselwörtern where``, let`` oder of`` geschweifte Klammern und Semikolons weggelassen werden, ist die Einrückung relevant. [ 41 ]
APL-Stil
Um zu veranschaulichen, wie prägnant APL typischerweise ist, folgt hier die Implementierung der Stufenfunktion für Conways Spiel des Lebens :
life ← { ⊃ 1 ⍵ ∨ . ∧ 3 4 =+ / + ⌿ ¯1 0 1 ∘. ⊖ ¯1 0 1 ⌽ ¨ ⊂ ⍵ }Der APL- Stil in C ähnelt dem prägnanten Stil des APL-Codes und wird häufig in dessen Implementierungen verwendet. [ 42 ] Dieser Stil wurde von Arthur Whitney entwickelt und findet breite Anwendung in der Implementierung von K , seinem eigenen Projekt. Auch die Programmiersprache J ist in diesem Stil implementiert. Allerdings verwenden nicht alle APL-Implementierungen diesen C-Stil, insbesondere GNU APL und Dyalog APL.
Zusätzlich zur APL-C-Einrückung werden die Namen typischerweise auf ein oder zwei Zeichen verkürzt: Um die Einrückung zu reduzieren und Ausdrücke, die sich über mehrere Zeilen erstrecken, zu vereinfachen. [ 43 ]
Einbuchtungsgröße
Üblicherweise verwenden Programmierer für die Einrückung jedes Codeblocks die gleiche Breite an Leerzeichen, wobei die üblicherweise verwendeten Breiten zwischen 1 und 4 Leerzeichen variieren.
Ein 1983 durchgeführtes Experiment mit PASCAL-Code ergab, dass die Einrückungsgröße die Verständlichkeit signifikant beeinflusst. Einrückungsgrößen zwischen 2 und 4 Zeichen erwiesen sich als optimal. [ 44 ]
Obwohl beide Faktoren das allgemeine Layout des Codes beeinflussen, ist die Einrückungsgröße unabhängig vom hier besprochenen Einrückungsstil .
Tabulator vs. Leertaste
Üblicherweise verwendet ein Programmierer einen Texteditor, der Tabulatoren in festen Abständen (einer bestimmten Anzahl von Leerzeichen) einfügt, um die Einhaltung eines bestimmten Formats zu gewährleisten. Dieser Abstand wird als Tabulatorbreite bezeichnet . Manchmal speichert der Programmierer den Code mit Tabulatorzeichen – eines für jeden Tastendruck – oder er speichert eine Folge von Leerzeichen, deren Anzahl der Tabulatorbreite entspricht.
Das Speichern von Tabulatorzeichen im Code kann in unterschiedlichen Kontexten zu visuellen Fehlausrichtungen führen, was dem Wert des Einrückungsstils entgegenwirkt.
Programmierer sind sich uneins darüber, wie Tabulatorzeichen gespeichert werden sollen. Befürworter von Tabulatorzeichen argumentieren mit einfacherer Eingabe und kleineren Textdateien, da ein einzelnes Tabulatorzeichen die Funktion mehrerer Leerzeichen erfüllt. Gegner, wie beispielsweise Jamie Zawinski , behaupten, dass die Verwendung von Leerzeichen die plattformübergreifende Portabilität erhöht . [ 45 ] Andere, wie die Verfasser der WordPress -Codierungsstandards, vertreten die gegenteilige Ansicht: Tabulatoren würden die Portabilität verbessern. [ 46 ] Eine Untersuchung der 400.000 größten Repositories auf GitHub ergab, dass Leerzeichen häufiger vorkommen. [ 47 ]
Viele Texteditoren, darunter Notepad++ , TextEdit , Emacs , vi und nano , lassen sich so konfigurieren, dass Tabulatorzeichen entweder beim Drücken der Tabulatortaste gespeichert oder (entsprechend der eingestellten Tabulatorbreite) in Leerzeichen umgewandelt werden, sodass beim Drücken der Tabulatortaste keine Tabulatorzeichen in die Datei eingefügt werden. Einige Editoren können Tabulatoren in Leerzeichen und umgekehrt umwandeln.
Manche Textdatei-Pager , wie z. B. less , lassen sich auf eine Tabulatorbreite konfigurieren. Einige Tools, wie z. B. expand / unexpand, können mithilfe von Filtern dynamisch konvertieren.
Stilautomatisierung
Ein Tool kann die Formatierung von Code gemäß einem Einrückungsstil automatisieren, beispielsweise dem Unixindent -Befehl.
Emacs bietet Befehle zum Ändern der Einrückung, einschließlich des Drückens Tabeiner bestimmten Zeile. M-x indent-regionDadurch wird Code eingerückt.
Elastische Tabstopps sind ein Tabulatorstil, der die Unterstützung des Texteditors erfordert. Dabei werden ganze Textblöcke automatisch ausgerichtet, wenn sich die Länge einer Zeile im Block ändert.
Den Überblick über die Blöcke verlieren
Bei komplexerem Code kann es vorkommen, dass Programmierer beim Lesen die Blockgrenzen aus den Augen verlieren. Dies tritt häufig in großen Codeabschnitten auf, die viele verschachtelte Anweisungen mit mehreren Einrückungsebenen enthalten. Beim Scrollen zum Ende einer großen Anzahl verschachtelter Anweisungen kann der Kontext – wie beispielsweise die Kontrollstruktur am Anfang des Blocks – verloren gehen.
Lange, zusammengesetzte Anweisungen können ein Anzeichen für übermäßige Komplexität des Codes sein, die durch Refactoring behoben werden kann .
Programmierer, die auf das Zählen der öffnenden geschweiften Klammern angewiesen sind, könnten Schwierigkeiten mit Einrückungsstilen wie K&R haben, bei denen die öffnende Klammer nicht optisch von der zugehörigen Anweisung getrennt ist . Programmierer, die sich stärker auf Einrückungen konzentrieren, profitieren hingegen mehr von vertikal kompakten Stilen wie K&R, da die Blöcke kürzer sind.
Um den Überblick über Kontrollstrukturen wie `<code>` zu behalten for, kann eine große Einrückung, beispielsweise ein achtstelliger Tabulator, verwendet werden. Außerdem werden große Funktionen in kleinere, besser lesbare Funktionen aufgeteilt. Unter Linux wird dies im K&R-Stil so umgesetzt.
Manche Texteditoren ermöglichen es dem Programmierer, zwischen den beiden zusammengehörigen geschweiften Klammern eines Blocks zu springen. Beispielsweise springt vi% beim Drücken der Taste zur Klammer, die denselben Block umschließt wie der unter dem Cursor . Da die Cursortaste next(d. h. die nTaste ) die Richtungsinformation beibehält (ob zuvor die upoder die downTaste gedrückt wurde), könnte das Punktmakro (die .Taste ) verwendet werden, um den Cursor bei geeignetem Programmierstil auf die nächste geschweifte Klammer zu setzen [ 48 ] . Alternativ kann die Überprüfung der Blockgrenzen mithilfe der %Taste verwendet werden, um einen Programmierstandard durchzusetzen.
Eine weitere Möglichkeit, die Blockwahrnehmung zu gewährleisten, besteht darin, Kommentare nach der schließenden Klammer zu verwenden. Zum Beispiel:
for ( int i = 0 ; i < total ; i ++ ) { foo (); } //for (i)if ( x < 0 ) { bar (); } //if (x < 0)Ein Nachteil besteht darin, dass der gleiche Code an mehreren Stellen – oberhalb und unterhalb des Blocks – beibehalten werden muss.
Manche Editoren bieten Unterstützung für die Blockstruktur. Ein ein- und ausklappbarer Editor kann Blöcke je nach Einrückungsebene ein- und ausblenden. Einige Editoren heben übereinstimmende geschweifte Klammern hervor, sobald sich der Cursor daneben befindet.
Siehe auch
- Sekundärnotation
- Syntaxhervorhebung
- Einrückung (Satz) § Einrückung in der Programmierung
- Bachmanity Insanity , eine Silicon-Valley -Folge zum Thema
- Quellcode-Formatter
Referenzen
- ^ Weissman, Laurence Mark (1974). Eine Methodik zur Untersuchung der psychologischen Komplexität von Computerprogrammen . CSRG-37 (Technischer Bericht). Computer Systems Research Group, Universität Toronto . OCLC 1085612768. technicalreportc37univ – via Internet Archive .
- ^ Morzeck, Johannes; Hanenberg, Stefan; Werger, Ole; Gruhn, Volker (2023). Einrückung im Quellcode: Eine randomisierte Kontrollstudie zur Lesbarkeit von Kontrollflüssen in Java-Code mit großen Effekten . Proceedings der 18. Internationalen Konferenz für Softwaretechnologien – ICSOFT. Rom , Italien. S. 117–128 . doi : 10.5220/0012087500003538 . ISBN 978-989-758-665-1– über Stefan Hanenberg auf Google Drive (Vorabdruck).
- ^ Hanenberg, Stefan; Morzeck, Johannes; Gruhn, Volker (9. August 2024). „Einrückung und Lesezeit: Eine randomisierte Kontrollstudie zu den Unterschieden zwischen generierten eingerückten und nicht eingerückten if-Anweisungen“ . Empirical Software Engineering . 29 (5): 134. doi : 10.1007/s10664-024-10531-y . ISSN 1573-7616 .
- ^ Hanenberg, Stefan; Morzeck, Johannes; Werger, Ole; Gries, Stefan; Gruhn, Volker (2024). „Einrückung und Lesezeit: Ein kontrolliertes Experiment zu den Unterschieden zwischen generierten eingerückten und nicht eingerückten JSON-Objekten“ . In: Fill, Hans-Georg; Domínguez Mayo, Francisco José; van Sinderen, Marten; Maciaszek, Leszek A. (Hrsg.). Software Technologies . Communications in Computer and Information Science. Band 2104. Cham: Springer Nature Switzerland. S. 50–75 . doi : 10.1007/978-3-031-61753-9_4 . ISBN 978-3-031-61753-9Die
- ^ „Java Style Guide“ . Archiviert vom Original am 12. Juli 2018.
Die Verwendung von geschweiften Klammern im ägyptischen oder C-Stil ist zulässig.
- ^ „Ägyptische Klammern“ . Foldoc .
Ein humorvoller
Begriff für den K&R-Einrückungsstil, der sich auf die Haltung „eine Hand vorne oben, eine hinten unten“ bezieht
.
- ^ „Google JavaScript Style Guide“ .
Geschweifte Klammern folgen dem Kernighan- und Ritchie-Stil („Ägyptische Klammern“) für nichtleere Blöcke und blockartige Konstrukte.
- ^ Darwin, Ian F. (1988). Checking C programs with Lint . California: O'Reilly and Associates. S. 51. ISBN 9780937175309Die
- ^ "1TBS" .
- ^ „Künstlerischer Stil“ . Abgerufen am 4. August 2025 .
- ^ „Brace styles and JavaScript“ . 7. Januar 2013. Abgerufen am 8. November 2018 .
- ^ „ESLint-Brace-Style“ . Abgerufen am 24. Februar 2026 .
- ^ „Der einzig wahre Stil für Zahnspangen – Ailanto“ . 6. April 1998. Abgerufen am 4. August 2025 .
- ^ a b c „The Jargon File“ . 4.4.7. 29. Dezember 2003. Abgerufen am 18. August 2014 .
- ^ Eine detaillierte Beschreibung des Stils finden Sie unter kernel.org .
- ^ Larabel, Michael. „Der Linux-Kernel stellt den 80-Zeichen-Zeilencodierungsstil ein“ . Phoronix . Phoronix Media . Abgerufen am 1. Mai 2022 .
- ^ Reddy, Achut (30. März 2000). „Java Coding Style Guide“ (PDF) . Sun Microsystems. Archiviert vom Original (PDF) am 28. Februar 2006. Abgerufen am 30. Mai 2008 .
- ^ „Java Code Conventions“ (PDF) . Sun Microsystems. 12. September 1997. Archiviert vom Original (PDF) am 13. Mai 2008. Abgerufen am 30. Mai 2008 .
- ^ „Code Conventions for the Java Programming Language“ . Sun Microsystems. 20. März 1997. Abgerufen am 30. Mai 2008 .
- ^ Stroustrup , Bjarne (September 2010) . „PPP-Styleguide“ (PDF) .
- ^ Stroustrup, Bjarne. „C++-Kernrichtlinien“ . GitHub . Abgerufen am 3. November 2018 .
- ^ a b c Shannon, Bill (19. August 1996). „C Style and Coding Standards for SunOS“ (PDF) . 1.8. Sun Microsystems, Inc. Abgerufen am 15. Juni 2019 .
- ^ a b Gregg, Brendan. "DTraceToolkit Style Guide" . Abgerufen am 6. Februar 2015 .
- ^ Shannon, Bill (9. September 1998). "cstyle.pl" . illumos-gate . 1.58. Sun Microsystems, Inc . Abgerufen am 6. Februar 2015 .
- ^ „The Jargon File (Version 2.4.3)“ . 2.4.3. 23. Januar 1991. Abgerufen am 14. Mai 2024 .
- ^ a b c McConnell, Steve (2004). Code Complete: Ein praktisches Handbuch zur Softwareentwicklung . Redmond, WA: Microsoft Press. S. 746–747 . ISBN 978-0-7356-1967-8Die
- ^ a b „Formatierung Ihres Quellcodes“ . GNU-Codierungsstandards . Abgerufen am 6. Juni 2016 .
- ^ Stallman, Richard (28. Oktober 2002). „Meine Lisp-Erfahrungen und die Entwicklung von GNU Emacs (Redemanuskript auf der Internationalen Lisp-Konferenz)“ . Abgerufen am 6. Juni 2016 .
- ^ Baumann, Richard [in German] ; Feliciano, Manuel; Bauer, Friedrich Ludwig ; Samelson, Klaus (1964). Einführung in ALGOL – Eine Einführung für Nicht-Spezialisten mit Schwerpunkt auf den praktischen Anwendungen der algorithmischen Sprache . Reihe Automatische Berechnung. Englewood Cliffs, New Jersey, USA: Prentice-Hall, Inc. ISBN 0-13-477828-6. LCCN 64-10740 . ark:/13960/t6qz35p37 . Abgerufen am 23. Oktober 2022 .
{{cite book}}:ISBN-/Datumsinkompatibilität ( Hilfe ) - ^ WM McKeeman, JJ Horning und DB Wortman, A Compiler Generator , 1970, https://archive.org/details/compilergenerato00mcke
- ^ Getestet mit dem oben genannten Beispielquellcode unter Ubuntu 18.04 mit GNU indent 2.2.11 und GNU Emacs 25.2.2, gestartet mit
emacs --no-init-file. - ^ „Linux-Kernel-Codierungsstil“ . Abgerufen am 1. Januar 2017 .
- ^ Jensen, Kathleen; Wirth, Niklaus (1974). PASCAL-Benutzerhandbuch und Bericht . Springer-Verlag.
- ^ Horstmann Style Guide
- ^ Ohno, Asako (2013). „Eine Methodik zur Vermittlung eines vorbildlichen Programmierstils unter Berücksichtigung der Schwankungen im Programmierstil der Studierenden“. 2013 IEEE Frontiers in Education Conference (FIE) . S. 1908–1910 . doi : 10.1109/fie.2013.6685167 . ISBN 9781467352611S2CID 28385526 .
- ^ Lammers, Susan (1986). Programmierer bei der Arbeit . Microsoft Press. ISBN 978-0-914845-71-3Die
- ^ Pattee, Jim. „Artistic Style 2.05 Dokumentation“ . Artistic Style . Abgerufen am 24. April 2015 .
- ^ Kernighan, Brian W.; Plauger, PJ (1976). Software Tools . Addison-Wesley. ISBN 9780201036695Die
- ^ „Der Haskell-98-Bericht“ . haskell.org . Abgerufen am 3. März 2016 .
- ^ Lipovača, Miran. „Making Our Own Types and Typeclasses“ . learnyouahaskell.com . Abgerufen am 3. Februar 2016 .
- ^ Haskell Report 1.2 (1992), S. 131 B.4 „Layout“
- ^ „Das J Inkunabulum“ . jsoftware.com . Abgerufen am 19. Mai 2022 .
- ^ „Der J-Quellcode“ . github.com . Abgerufen am 12. September 2024 .
- ^ Miara, Richard J.; Musselman, Joyce A.; Navarro, Juan A. & Shneiderman, Ben (November 1983). „Program Indentation and Comprehensibility“ (PDF) . Communications of the ACM . 26 (11): 861–867 . doi : 10.1145/182.358437 . S2CID 11767796. Abgerufen am 3. August 2017 .
- ^ Zawinski, Jamie (2000). „Tabs versus Spaces: An Eternal Holy War“ . Abgerufen am 6. Juni 2016 .
- ^ „WordPress-Codierungsstandards“ . Abgerufen am 6. Juni 2016 .
- ^ Hoffa, Felipe (26. Juli 2017). „400.000 GitHub-Repositories, 1 Milliarde Dateien, 14 Terabyte Code: Leerzeichen oder Tabulatoren?“ . Medium . Abgerufen am 9. Juli 2019 .
- ^ Lamb, Linda (1998). Learning the vi editor . O'Reilly. ISBN 9781565924260Die
Externe Links
- C Style: Standards and Guidelines: Defining Programming Standards for Professional C Programmers , Prentice Hall, ISBN 0-13-116898-3/ ISBN 978-0-13-116898-5(Der vollständige Text ist auch online verfügbar). Straker, David (1992).
- Kontextueller Einzug
- GNU-Codierungsstandards