Warum verwendet Linux LF als Zeilenumbruchzeichen?

87

Soweit ich weiß, kennzeichnet jedes Betriebssystem das Zeilenendezeichen (EOL) auf unterschiedliche Weise. Kommerzielle Betriebssysteme verwenden den Wagenrücklauf für EOL (Wagenrücklauf und Zeilenvorschub unter Windows, Wagenrücklauf nur unter Mac). Linux verwendet dagegen nur den Zeilenvorschub für EOL.

Warum verwendet Linux keinen Wagenrücklauf für EOL (und stattdessen nur Zeilenvorschub)?

Bagas Sanjaya
quelle
77
Macs haben CR erst seit OS X verwendet ... ich glaube, jetzt verwenden sie * nix style LF.
B Schicht
33
Ich denke, es gibt / gab auch eine Reihe kommerzieller Unixy-Betriebssysteme.
ilkkachu
20
Auf Wikipedia erklärt . Grundsätzlich hat Multics in den letzten 60er Jahren (was Unix und Linux inspirierte) ein gewisses Maß an Abstraktion hinzugefügt, um zu vermeiden, dass die Textcodierung durch Einschränkungen von Teletypgeräten beeinträchtigt wird, sodass keine Zeilenumbrüche mit zwei Zeichen codiert werden müssen (was noch weniger macht) Sinn natürlich 50 Jahre später).
Stéphane Chazelas
74
Der zweite Absatz ist eine gültige Frage, aber der erste Absatz ist so voller Vereinfachungen und offenkundiger Fehler, dass er übertönt, und die Antwortenden müssen eine ganze Reihe fragwürdiger und fehlerhafter Prämissen korrigieren, bevor sie überhaupt zur Frage gelangen.
JdeBP
21
Was? Linux ist eine kostenlose Annäherung an einen kommerziellen Betriebssystemstandard namens UNIX. UNIX-konforme Systeme kosten damals viel Geld und sind es auch heute noch.
Errantlinguist

Antworten:

334

Windows verwendet, CRLFweil es es von MS-DOS geerbt hat.

MS-DOS wird verwendet, CRLFweil es von CP / M inspiriert wurde, das bereits verwendet wurde CRLF.

CP / M und viele Betriebssysteme aus den achtziger Jahren und früher wurden verwendet, CRLFweil dies der Weg war, eine auf einem Teletyp gedruckte Zeile zu beenden (zum Zeilenanfang zurückkehren und zur nächsten Zeile springen, genau wie bei normalen Schreibmaschinen). Dies vereinfachte das Drucken einer Datei, da weniger oder keine Vorverarbeitung erforderlich war. Es gab auch mechanische Anforderungen, die verhinderten, dass ein einzelnes Zeichen verwendet werden konnte. Es kann einige Zeit dauern, bis sich der Schlitten zurückbewegt und die Walze dreht.

Gnu / Linux wird verwendet, LFweil es ein Unix- Klon ist . 1

Unix verwendete ein einzelnes Zeichen. LFVon Anfang an war es ineffizient und uneindeutig, zwei Zeichen zu verwenden, um Platz zu sparen und zu einem kanonischen Zeilenende zu standardisieren. Diese Wahl wurde von Multics übernommen, das sie bereits 1964 verwendete. Speicher, Speicher, CPU-Leistung und Bandbreite waren sehr sparsam, sodass es sich lohnte, ein Byte pro Zeile einzusparen. Beim Drucken einer Datei konvertierte der Treiber den Zeilenvorschub (neue Zeile) in die Steuerzeichen, die vom Zielgerät benötigt werden.

LFwurde vorgezogen, CRweil letztere noch eine bestimmte Verwendung hatten. Durch Neupositionieren des gedruckten Zeichens an den Anfang derselben Zeile konnten bereits eingegebene Zeichen überschrieben werden.

Apple entschied sich zunächst auch ein einzelnes Zeichen zu verwenden , aber aus irgendeinem Grund nahm das andere: CR. Beim Wechsel zu einer BSD-Schnittstelle wurde auf umgestellt LF.

Diese Auswahl hat nichts mit der Tatsache zu tun, dass ein Betriebssystem kommerziell ist oder nicht.

1 Dies ist die Antwort auf Ihre Frage.

jlliagre
quelle
20
Multics verwendete Zeilenvorschub in Übereinstimmung mit der heutigen ISO / IEC 646, die vorschrieb, dass sowohl Wagenrücklauf als auch Zeilenvorschub in einem einzigen Zeichen dargestellt werden sollten, wenn eine einstellige Darstellung erforderlich war.
JdeBP
10
Ich bezweifle, dass der wahre Grund für die Wahl eines einzelnen Charakters darin bestand, Platz zu sparen. Der eigentliche Grund bestand darin, ein einzelnes Zeilenumbruchzeichen zu definieren , das vom Ausgabegerät (Terminal usw.) unabhängig ist. Der Terminaltreiber (oder ein ähnlicher Treiber) sorgt dann für die Konvertierung des Zeilenumbruchs in die entsprechende Steuerzeichenfolge, normalerweise CR LF. Dies ermöglicht eine schöne Abstraktion beim Programmieren mit Strings: Die Newline wird \nunabhängig von einem bestimmten Ausgabegerät mit einem einzigen dargestellt .
Johan Myréen
14
Dennoch ist das 1970 Papier von Saltzer und Ossanna ( Remote - Terminal - Zeichen Stream - Verarbeitung in Multics ist) ganz klar , dass Geräteunabhängigkeit war der Grund.
JdeBP
3
@JdeBP In diesem Artikel wird die Reduktion des Zeichenstroms zu und von entfernten Terminals auf die kanonische Form beschrieben . Das Reduzieren auf eine kanonische Form war auch eine Möglichkeit, Platz zu sparen. Anders ausgedrückt war die Verwendung von zwei Zeichen eine ineffiziente und vieldeutige Verschwendung von Speicherplatz.
Juli
46
Und Teletypen bekamen dies von nicht elektrischen Schreibmaschinen. CR-LF beschreibt die mechanische Aktion, die Sie ausführen, wenn Sie den Hebel auf der linken Seite drücken. Schieben Sie den "Schlitten", der die Walze hält, ganz nach rechts zurück (wodurch sich der Tastenanschlag an der ersten Position links befindet) und drehen Sie die Walze um eine Umdrehung in Zeilenhöhe, um zur nächsten typisierbaren Zeile zu gelangen. Ja, ich zeige hier zugegebenermaßen mein Alter.
cdkMoose
17

Der Wikipedia-Artikel über "Newline" führt die Wahl von NL als Zeilenabschluss (oder Trennzeichen) auf Multics im Jahr 1964 zurück. Leider enthält der Artikel nur wenige Quellenangaben, aber es gibt keinen Grund zu bezweifeln, dass dies richtig ist. Diese Auswahl bietet zwei offensichtliche Vorteile gegenüber CR-LF: Platzersparnis und Geräteunabhängigkeit.

Die Hauptalternative, CR-LF, stammt von den Steuercodes, die zum physischen Bewegen des Papierwagens auf einem Fernschreiber verwendet werden, wobei CR den Wagen in seine Ausgangsposition zurückbringt und LF die Papierrolle dreht, um die Druckposition um eins nach unten zu bewegen Linie. Die beiden Steuerzeichen erscheinen im ITA2-Code aus dem Jahr 1924, der anscheinend noch verwendet wird (siehe Wikipedia). anscheinend hat ITA2 sie der Murray-Variante des Baudot-Codes von 1901 entnommen.

Für jüngere Leser ist es erwähnenswert, dass es in der Mainframe-Tradition keinen Newline-Charakter gab. Vielmehr war eine Datei eine Folge von Datensätzen, die entweder eine feste Länge (oft 80 Zeichen, basierend auf Lochkarten) oder eine variable Länge hatten. Datensätze mit variabler Länge wurden normalerweise mit einer Zeichenzahl am Anfang jedes Datensatzes gespeichert. Wenn Sie eine Mainframe-Datei haben, die aus einer Folge von Datensätzen variabler Länge besteht, von denen jeder beliebigen binären Inhalt enthält, kann das verlustfreie Konvertieren in eine Datei im UNIX-Stil eine schwierige Konvertierung sein.

Linux war natürlich nur eine Neuimplementierung von Unix, und Unix hat viele seiner Designentscheidungen von Multics getroffen, so dass es so aussieht, als ob die Schlüsselentscheidung 1964 getroffen wurde.

user32929
quelle
12

Andere Antworten haben die Vererbungskette bis in die 1960er Jahre zurückverfolgt und Teletypen. Aber hier ist ein Aspekt, den sie nicht behandelt haben.

In den Tagen der Teletypen gab es Zeiten, in denen es wünschenswert war, etwas zu tun, das als überstrapaziert bezeichnet wurde. Das Überschreiben wurde manchmal verwendet, um ein Kennwort zu verdecken, da das Löschen des Kennworts einfach nicht möglich war. Ein anderes Mal wurde überstrichen, um ein Symbol zu erhalten, das nicht in der Schriftart enthalten war. Beispielsweise erzeugen der Buchstabe O und ein Schrägstrich ein neues Symbol.
Ein Überstreichen wurde durch Setzen eines Wagenrücklaufs ohne Zeilenvorschub erreicht, obwohl manchmal ein Rückschritt verwendet wurde. Aus diesem Grund entschieden sich die Unix-Leute gegen Wagenrücklauf als Zeilentrenner und entschieden sich stattdessen für Zeilenvorschub. Dies funktionierte auch gut zum Lesen von Texten, die unter Verwendung der CRLF-Konvention erstellt wurden. Der CR wird verschluckt und der LF wird zum Trennzeichen.

Walter Mitty
quelle
Vielen Dank für diese genaue Erinnerung. Rücktaste und Wagenrücklauf (allein) wurden auch auf dem Drucker verwendet, um fette oder unterstrichene Zeichen zu erzeugen. Und um zu den Ursprüngen zurückzukehren, existierten diese beiden Befehle bereits 1930, um den "Wagen" in seine äußerste linke Position "zurückzukehren", entweder um einen Überhub auszuführen oder eine neue Linie mit Hilfe der "neuen Linie" beginnen zu lassen. Schlüssel, der die Walze einen Schritt drehen ließ. Siehe: en.wikipedia.org/wiki/IBM_Electric_typewriter . "CR" + "LF" datieren also vor der Computergeschichte.
Dan
Es kann auch erwähnenswert sein, dass für einige Teletypen ein CR gefolgt von einem nicht druckenden Zeichen erforderlich ist, damit der Wagen vor dem Eintreffen des nächsten druckenden Zeichens vollständig durchlaufen kann, und dass das Zurücksetzen überhaupt nicht unterstützt wird. Senden Sie daher ein LF nach CR hat nichts gekostet, und der einzige Weg zum Überdrucken war über CR.
Supercat
Die "Tage der Teletypen" beginnen vor dem Computerzeitalter. In den 1960er Jahren hatten viele Computer einen Konsolen-Teletyp für den Bediener und verwendeten noch mehr ASCII als Zeichensatz.
Walter Mitty
7

Während Sie die historische Frage in eine Frage nach der C - Sprache übersetzen könnte, dem Grund , dass Linux und alle POSIX-konforme oder POSIX-ish Systeme müssen verwenden LF(oder zumindest , was die C '\n'Zeichen ist) als Newline ist eine Folge der Kreuzung der Anforderungen von C und POSIX. Während C erlaubt, dass sich "Textdateien" und "Binärdateien" unterscheiden (tatsächlich können Textdateien satzbasiert sein und aus einer Folge von Zeilendatensätzen bestehen, zusätzlich zu weniger exotischen Dingen wie dem '\n'Übersetzen nach / von CR/ LFwie unter DOS / Windows ), POSIX schreibt vor, dass sich Text- und Binärmodus gleich verhalten. Dies ist vor allem der Grund, warum die Kommandozeilen-Tools mögencatsind mächtig / nützlich; Das wäre viel weniger, wenn sie nur mit Binärdateien oder nur mit Text arbeiten würden, aber nicht mit beiden.

R ..
quelle
13
Diese Wahl ist um viele Jahre älter als POSIX. Wie in der Antwort von jlliagre erwähnt, geht es auf den Anfang von Unix zurück, das es von Multics kopiert hat.
Barmar
4
Die Wahl unter Linux ist nicht viele Jahre älter als POSIX. Natürlich hat POSIX die bereits existierende Praxis kodifiziert, da dies der ganze Grund war, zu existieren.
R ..
Für Linux gab es zunächst keine wirkliche Wahl. Die Gnu-Standardbibliothek, die von Linux verwendet wird, ist POSIX-zeitgemäß und hat aus offensichtlichen Kompatibilitätsgründen von Anfang an den Zeilenvorschub verwendet, da sie auf Unix-Systemen entwickelt, getestet und verwendet wurde. Der Linux-Kernel wurde entwickelt, um Unix-ähnliche Systemaufrufe für eine Standard-C-Bibliothek (GNU oder andere) bereitzustellen, und das Hinzufügen der Komplexität, die erforderlich ist, um Textdateien und Binärdateien unterschiedlich zu behandeln, wäre übertrieben und würde die Kompatibilität mit vorhandenem Code beeinträchtigen. Das wäre unsinnig von Torvalds gewesen.
Juli
@jlliagre: Es war immer noch eine Entscheidung, etwas mit bestehenden Praktiken zu vereinbaren, anstatt zufällige, unbegründete Inkompatibilitäten. Man kann nur sagen, dass dies keine Wahl war, um den Erfolg von Linux vorauszusetzen. Viele Leute machen Spielzeug-Hobby-Betriebssysteme voller verrückter Entscheidungen und gehen nie irgendwohin.
R ..
@RI bedeutet, Linux ist nur ein Kernel und GNU musste unbedingt funktionieren (anfangs war Torvalds Ziel, mit Minix anstelle von Gnu kompatibel zu sein, aber das macht hier keinen Unterschied). Die Newline-Wahl hat nichts mit Linux zu tun, da sie lange vor dem Schreiben von Linux getroffen wurde. In den verschiedenen Linux-Releases gab es viele mehr oder weniger unbegründete verrückte Entscheidungen, die Linux nicht daran hinderten, erfolgreich zu sein. Einer der Gründe dafür ist wahrscheinlich, dass viele dieser Entscheidungen später erneut getroffen wurden.
Juli