Perché Linux usa LF come personaggio newline?


87

Per quanto ne so, ogni sistema operativo ha un modo diverso di contrassegnare il carattere di fine linea (EOL). I sistemi operativi commerciali utilizzano il ritorno a capo per EOL (ritorno a capo e avanzamento riga su Windows, ritorno a capo solo su Mac). Linux, d'altra parte, utilizza solo il feed di riga per EOL.

Perché Linux non usa il ritorno a capo per EOL (e invece solo feed di riga)?


77
I Mac non usano CR solo da prima di OS X ... ora uso lo stile * nix LF, credo.
B Layer

33
Penso che ci siano / siano stati anche diversi sistemi operativi Unixy: s.
ilkkachu,

20
Spiegato su Wikipedia . Fondamentalmente Multics negli ultimi anni '60 (che ha ispirato Unix, che ha ispirato Linux) ha aggiunto un certo livello di astrazione per evitare che la codifica del testo fosse gravata da limitazioni dei dispositivi di teletipo in modo da non dover codificare newline su due caratteri (il che rende ancora meno senso 50 anni dopo ovviamente).
Stéphane Chazelas,

74
Il secondo paragrafo è una domanda valida, ma il primo paragrafo è così pieno di semplificazioni eccessive ed errori reali che lo sta annegando, con i rispondenti che devono correggere un mucchio di premesse incerte e difettose prima ancora di arrivare alla domanda.
JdeBP,

21
Che cosa? Linux è un'approssimazione libera di uno standard commerciale OS chiamato UNIX. I sistemi conformi a UNIX costano molti soldi allora e lo fanno ancora oggi.
errantlinguist il

Risposte:


334

Windows lo utilizza CRLFperché lo ha ereditato da MS-DOS.

MS-DOS utilizza CRLFperché è stato ispirato da CP / M che stava già utilizzando CRLF.

CP / M e molti sistemi operativi degli anni '80 e precedenti usati CRLFperché era il modo di terminare una riga stampata su un teletipo (tornare all'inizio della riga e saltare alla riga successiva, proprio come le normali macchine da scrivere). Ciò ha semplificato la stampa di un file perché era necessaria una pre-elaborazione minore o nulla. C'erano anche requisiti meccanici che impedivano la fruibilità di un singolo personaggio. Qualche tempo potrebbe essere necessaria per consentire il trasporto di ritorno e il rullo a ruotare.

Gnu / Linux usa LFperché è un clone Unix . 1

Unix usava un singolo carattere, LFdall'inizio per risparmiare spazio e standardizzare fino a un fine linea canonico, l'uso di due personaggi era inefficiente e ambiguo. Questa scelta è stata ereditata da Multics che la usava già nel 1964. Memoria, memoria, potenza della CPU e larghezza di banda erano molto scarse, quindi valeva la pena salvare un byte per linea. Quando è stato stampato un file, il driver stava convertendo il feed di riga (nuova riga) nei caratteri di controllo richiesti dal dispositivo di destinazione.

LFera preferito CRperché quest'ultimo aveva ancora un uso specifico. Riposizionando il carattere stampato all'inizio della stessa riga, ha permesso di sovrascrivere i caratteri già digitati.

Apple ha inizialmente deciso di utilizzare anche un singolo carattere ma per qualche motivo raccolse l'altro: CR. Quando è passato a un'interfaccia BSD, è passato a LF.

Queste scelte non hanno nulla a che fare con il fatto che un sistema operativo sia commerciale o meno.

1 Questa è la risposta alla tua domanda.


20
Multics ha utilizzato l'avanzamento di riga in accordo con la ISO / IEC 646 contemporanea, che lo prescriveva come modo per rappresentare sia il ritorno a capo che l'avanzamento di riga insieme, in un singolo carattere, se fosse necessaria una rappresentazione a un carattere.
JdeBP,

10
Dubito che la vera ragione per scegliere un singolo personaggio sia stata quella di risparmiare spazio. Il vero motivo era definire un singolo carattere di nuova riga che sia indipendente dal dispositivo di output (terminale, ecc.). Il driver del terminale (o simile) si occupa quindi di convertire la nuova riga nella sequenza di caratteri di controllo appropriata, in genere CR LF. Ciò consente una piacevole astrazione durante la programmazione con stringhe: la nuova riga viene presentata con un singolo \n, indipendentemente da un particolare dispositivo di output.
Johan Myréen,

14
Tuttavia, l'articolo del 1970 di Saltzer e Ossanna ( elaborazione del flusso di caratteri del terminale remoto in Multics ) è abbastanza chiaro che la ragione era l' indipendenza del dispositivo .
JdeBP

3
@JdeBP Questo documento afferma che la riduzione in forma canonica del flusso di caratteri che passa da e verso terminali remoti è l'oggetto di questo documento . Ridurre a una forma canonica era anche un modo per risparmiare spazio. Espressa diversamente, usare due personaggi era uno spreco di spazio inefficiente e ambiguo.
jlliagre,

46
E i teletipi lo hanno ottenuto da macchine da scrivere non elettriche. CR-LF descrive l'azione meccanica che fai quando premi la leva a sinistra. Riportare il "carrello" che trattiene il rullo (rullo) completamente a destra (che posiziona la sequenza di tasti nella prima posizione a sinistra) e girare la rotazione dell'altezza di una riga della piastra per passare alla riga digitabile successiva. Sì, sto certamente mostrando la mia età qui.
cdkMoose

17

L'articolo di Wikipedia su "Newline" fa risalire la scelta di NL come terminatore di linea (o separatore) a Multics nel 1964; purtroppo l'articolo ha poche citazioni a fonti ma non c'è motivo di dubitare che sia corretto. Ci sono due ovvi vantaggi in questa scelta rispetto a CR-LF: risparmio di spazio e indipendenza del dispositivo.

L'alternativa principale, CR-LF, ha origine nei codici di controllo utilizzati per spostare fisicamente il carrello della carta su una macchina del tipo di teletipo, in cui CR riporterebbe il carrello nella sua posizione iniziale e LF ruoterebbe il rullo di carta per spostare la posizione di stampa verso il basso di una posizione linea. I due caratteri di controllo compaiono nel codice ITA2 che risale al 1924 e che apparentemente è ancora in uso (vedi Wikipedia); apparentemente ITA2 li prese dalla variante Murray del codice Baudot che risale al 1901.

Per i lettori più giovani vale la pena notare che nella tradizione dei mainframe non esisteva un carattere newline; piuttosto un file era una sequenza di record che erano a lunghezza fissa (spesso 80 caratteri, basati su schede perforate) o lunghezza variabile; i record a lunghezza variabile erano in genere memorizzati con un conteggio dei caratteri all'inizio di ciascun record. Se si dispone di un file mainframe costituito da una sequenza di record a lunghezza variabile ciascuno contenente contenuti binari arbitrari, la conversione senza perdita di dati in un file in stile UNIX può essere una conversione complicata.

Linux, ovviamente, era solo una reimplementazione di Unix e Unix prese molte delle sue decisioni di progettazione da Multics, quindi sembra che la decisione chiave sia stata presa nel 1964.


12

Altre risposte hanno fatto risalire la catena dell'eredità agli anni '60 e ai teletipi. Ma ecco un aspetto che non hanno trattato.

Ai tempi dei teletipi, c'erano volte in cui era desiderabile fare qualcosa chiamato overstriking. A volte la sovrascrittura veniva utilizzata per oscurare una password, poiché non era possibile cancellarla. Altre volte, è stato fatto l'overtriking per ottenere un simbolo che non era nel font. Ad esempio, la lettera O e una barra producono un nuovo simbolo.
Il superamento è stato realizzato inserendo un ritorno a capo senza avanzamento di riga, sebbene a volte venisse usato backspace. Per questo motivo, le persone unix hanno deciso di non restituire il trasporto come separatore di riga e hanno optato invece per l'alimentazione di riga. Ciò ha funzionato bene anche per la lettura di testi prodotti utilizzando la convenzione CRLF. Il CR viene ingoiato e l'LF diventa il separatore.


Grazie per questo preciso ricordo. Backspace e Carriage Return (da soli) sono stati utilizzati anche sulla stampante per produrre caratteri in grassetto o sottolineati. E per tornare alle origini, questi due comandi esistevano già nel 1930 per riportare la "carrozza" "nella sua posizione più a sinistra, per sovraincedere o per consentire di iniziare una nuova linea con l'aiuto della" nuova linea " chiave che ha fatto ruotare il rullo di un passo. Vedi: en.wikipedia.org/wiki/IBM_Electric_typewriter . Quindi "CR" + "LF" risalgono alla storia del computer.
dan

Potrebbe anche valere la pena notare che alcuni teletipi richiedono che un CR sia seguito da un carattere non stampabile per dare al carrello il tempo di scorrere completamente prima dell'arrivo del carattere di stampa successivo e non supporta affatto il backspacing, quindi inviare un LF dopo CR non è costato nulla e l'unico modo per ottenere la sovrastampa è stato tramite CR.
Supercat,

I "giorni dei teletipi" iniziano prima dell'era dei computer. negli anni '60 molti computer avevano un teletipo di console per l'operatore, e ancor più usavano ASCII come set di caratteri.
Walter Mitty,

7

Sebbene sia possibile tradurre la domanda storica in una domanda relativa al linguaggio C, la ragione per cui Linux e tutti i sistemi conformi a POSIX o POSIX devono utilizzare LF(o almeno qualunque sia il '\n'carattere C ) in quanto la nuova riga è una conseguenza dell'intersezione dei requisiti di C e POSIX. Mentre C consente a "file di testo" e "file binari" di differire (in effetti i file di testo possono essere basati su record costituiti da una sequenza di record di riga, oltre a cose meno esotiche come averlo '\n'tradotto in / da CR/ LFcome su DOS / Windows ), POSIX impone che la modalità testo e binaria si comportino allo stesso modo. Questo è in gran parte il motivo che piace agli strumenti da riga di comandocatsono potenti / utili; sarebbero molto meno se funzionassero solo con binario, o solo con testo, ma non con entrambi.


13
Questa scelta precede POSIX di molti anni. Come menzionato nella risposta di jlliagre, risale all'inizio di Unix, che lo ha copiato da Multics.
Barmar,

4
La scelta in Linux non precede POSIX da molti anni. Naturalmente POSIX ha codificato ciò che era già pratica esistente, poiché quella era la sua intera ragione di esistere.
R ..

Per quanto riguarda Linux, in primo luogo non c'era alcuna vera scelta. La libreria standard di Gnu utilizzata da Linux è contemporanea a POSIX e utilizzava il feed di linea sin dal suo inizio per ovvie ragioni di compatibilità perché è stata sviluppata, testata e utilizzata su sistemi Unix. Il kernel Linux è stato progettato per fornire chiamate di sistema come Unix a una libreria C standard (GNU o altro) e l'aggiunta della complessità richiesta per gestire in modo diverso file di testo e file binari sarebbe stata eccessiva e compromettere la compatibilità con il codice esistente. Sarebbe stato privo di senso da parte di Torvalds.
jlliagre,

@jlliagre: era ancora una scelta rendere qualcosa compatibile con le pratiche esistenti piuttosto che incompatibilità casuali gratuite. Puoi solo dire che non è stata una scelta nel contesto del presupposto del successo di Linux. Molte persone rendono il sistema operativo per hobbisti di giocattoli pieno di scelte stranamente gratuite e non vanno mai da nessuna parte.
R ..

@RI significa che Linux è solo un kernel e essenzialmente ha richiesto GNU per funzionare (inizialmente l'obiettivo di Torvald era di essere compatibile con minix invece di gnu, ma qui non fa differenza). La scelta newline non è correlata a Linux perché è stata fatta molto tempo prima che Linux fosse scritto. Ci sono state molte scelte stravaganti più o meno gratuite nelle varie versioni di Linux, non hanno impedito a Linux di avere successo. Uno dei motivi è probabilmente che molte di queste scelte sono state rivisitate in seguito.
jlliagre,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.