Pourquoi Linux utilise-t-il LF comme caractère de nouvelle ligne?

87

Autant que je sache, chaque système d'exploitation utilise une méthode différente pour marquer le caractère de fin de ligne (EOL). Les systèmes d'exploitation commerciaux utilisent retour chariot pour EOL (retour chariot et saut de ligne sous Windows, retour chariot uniquement sous Mac). Linux, d’autre part, utilise uniquement le saut de ligne pour EOL.

Pourquoi Linux n'utilise-t-il pas le retour chariot pour EOL (et uniquement le saut de ligne)?

Bagas Sanjaya
la source
77
Les Mac n'ont pas utilisé CR uniquement depuis les versions antérieures à OS X ... maintenant, utilisez * nix style LF, je crois.
B Layer
33
Je pense qu’il existe / a eu plusieurs OS Unixy commerciaux: aussi.
ilkkachu
20
Expliqué sur Wikipedia . Fondamentalement, Multics dans les années 60 (inspiré d’Unix, inspiré de Linux) ajoutait un niveau d’abstraction afin d’éviter que l’encodage du texte ne soit encombré par des limitations relatives aux dispositifs télétypiques. Il n’a donc pas besoin d’encoder newline sur deux caractères sens 50 ans plus tard bien sûr).
Stéphane Chazelas
74
Le deuxième paragraphe est une question valable, mais le premier paragraphe est tellement rempli de simplifications excessives et d’erreurs flagrantes qu’il est en train de le noyer, les répondants devant corriger toute une série de prémisses douteuses et défaillantes avant même d’avoir posé la question.
JdeBP
21
Quelle? Linux est une approximation gratuite d'un standard de système d'exploitation commercial appelé UNIX. Les systèmes compatibles UNIX coûtaient beaucoup d'argent à l'époque et ils le font encore aujourd'hui.
errantlinguist

Réponses:

334

Windows utilise CRLFparce qu'il a hérité de MS-DOS.

MS-DOS utilise CRLFparce qu’il a été inspiré par CP / M qui l’utilisait déjà CRLF.

CP / M et de nombreux systèmes d’exploitation datant des années 80 et antérieures ont été utilisés CRLFparce que c’était le moyen de terminer une ligne imprimée sur un télétype (revenez au début de la ligne et passez à la ligne suivante, comme pour les machines à écrire classiques). Ceci simplifie l’impression d’un fichier car aucun pré-traitement n’est requis, voire nul. Il y avait aussi des exigences mécaniques qui empêchaient un seul personnage d'être utilisable. Il faudra peut-être un peu de temps pour permettre au chariot de revenir et à la rotation de la platine.

Gnu / Linux utilise LFparce qu’il s’agit d’un clone Unix . 1

Unix utilisait un seul caractère, LFdès le départ pour gagner de la place et se normaliser sur une fin de ligne canonique, utiliser deux caractères était inefficace et ambigu. Ce choix a été hérité de Multics, qui l’utilisait dès 1964. La mémoire, le stockage, la puissance du processeur et la bande passante étaient très rares, il était donc avantageux d’économiser un octet par ligne. Lorsqu'un fichier était imprimé, le pilote convertissait le saut de ligne (nouvelle ligne) en caractères de contrôle requis par le périphérique cible.

LFa été préféré à CRparce que ce dernier avait encore un usage spécifique. En repositionnant le caractère imprimé au début de la même ligne, cela permettait de surimprimer les caractères déjà saisis.

Apple a décidé d' abord d'utiliser également un caractère unique , mais pour une raison quelconque a pris l'autre: CR. Lorsqu'il est passé sur une interface BSD, il est passé à LF.

Ces choix n'ont rien à voir avec le fait qu'un système d'exploitation est commercial ou non.

1 Ceci est la réponse à votre question.

jlliagre
la source
20
Multics a utilisé Line Feed en accord avec la norme ISO / CEI 646 actuelle, qui la prescrivait comme moyen de représenter le retour chariot et la saut de ligne ensemble, en un seul caractère, si une représentation à un caractère était nécessaire.
JdeBP
10
Je doute que la vraie raison de choisir un seul personnage était de gagner de la place. La vraie raison était de définir un seul caractère de nouvelle ligne indépendant du périphérique de sortie (terminal, etc.). Le pilote de terminal (ou similaire) se charge ensuite de convertir la nouvelle ligne en séquence de caractères de contrôle appropriée, généralement CR LF. Cela permet une abstraction agréable lors de la programmation avec des chaînes: la nouvelle ligne est présentée avec un seul \n, indépendamment de certains périphériques de sortie.
Johan Myréen
14
Néanmoins, le papier de 1970 de Saltzer et Ossanna ( Traitement de flux de caractères de terminaux distants en Multics ) indique clairement que c’est l’indépendance des périphériques qui en était la raison.
JdeBP
3
@JdeBP Cet article traite de la réduction sous forme canonique du flux de caractères passant vers et depuis des terminaux distants . Réduire à une forme canonique était un moyen de gagner de la place (aussi). Exprimé différemment, utiliser deux caractères était un gaspillage d’espace inefficace et ambigu.
jlliagre
46
Et les télétypes ont reçu cela des machines à écrire non électriques. CR-LF décrit l'action mécanique que vous effectuez lorsque vous poussez le levier sur votre gauche. Retournez le "chariot" qui maintient la platine (rouleau) tout à fait à droite (ce qui place la frappe au premier endroit à gauche) et lancez la platine d'une rotation en hauteur pour passer à la ligne suivante. Oui, je montre bien mon âge ici.
cdkMoose
17

L'article de Wikipédia sur "Newline" explique le choix de NL comme terminateur de ligne (ou séparateur) par Multics en 1964; Malheureusement, l'article contient peu de citations dans les sources, mais il n'y a aucune raison de douter que cela soit correct. Ce choix présente deux avantages évidents par rapport au CR-LF: un gain de place et l’indépendance de l’appareil.

La principale alternative, CR-LF, provient des codes de contrôle utilisés pour déplacer physiquement le chariot de papier sur un télécopieur, où CR ramènerait le chariot à sa position initiale et LF ferait pivoter le rouleau de papier pour déplacer la position d'impression vers le bas. ligne. Les deux caractères de contrôle apparaissent dans le code ITA2, datant de 1924 et apparemment toujours utilisé (voir Wikipedia); apparemment, ITA2 les a empruntés à la variante Murray du code Baudot, datant de 1901.

Pour les jeunes lecteurs, il convient de noter que dans la tradition du mainframe, il n’y avait pas de caractère de nouvelle ligne; un fichier est plutôt une séquence d'enregistrements de longueur fixe (souvent 80 caractères, basés sur des cartes perforées) ou de longueur variable; Les enregistrements de longueur variable étaient généralement stockés avec un nombre de caractères au début de chaque enregistrement. Si vous avez un fichier mainframe constitué d'une séquence d'enregistrements de longueur variable contenant chacun un contenu binaire arbitraire, la conversion de ce fichier sans perte en un fichier de style UNIX peut s'avérer délicate.

Linux, bien sûr, n’était qu’une nouvelle implémentation d’Unix, et Unix a pris de nombreuses décisions de conception de la part de Multics. Il semble donc que la décision clé ait été prise en 1964.

utilisateur32929
la source
12

D'autres réponses ont retracé la chaîne de l'héritage jusqu'aux années 1960 et les télétypes. Mais voici un aspect qu'ils n'ont pas abordé.

À l'époque des télétypes, il était parfois souhaitable de faire quelque chose qui s'appelle une surimpression. Le fait de surcharger a parfois été utilisé pour masquer un mot de passe, car son effacement n’était tout simplement pas faisable. D'autres fois, la surimpression était utilisée pour obtenir un symbole qui n'était pas dans la police. Par exemple, la lettre O et une barre oblique produisent un nouveau symbole.
La surexploitation a été obtenue en introduisant un retour chariot sans saut de ligne, même si un retour arrière a parfois été utilisé. Pour cette raison, les utilisateurs Unix ont décidé de ne pas retourner chariot comme séparateur de ligne et ont opté pour un saut de ligne. Cela a également bien fonctionné pour la lecture de textes produits avec la convention CRLF. Le CR est avalé et le LF devient le séparateur.

Walter Mitty
la source
Merci pour cette mémoire précise. Le retour arrière et le retour chariot (seuls) ont également été utilisés sur l’imprimante pour produire des caractères gras ou soulignés. Et pour remonter aux origines, ces deux commandes existaient déjà dans les années 1930 pour que le "chariot" "revienne" à sa position la plus à gauche, soit pour superposer soit pour permettre de commencer une nouvelle ligne à l'aide de la "nouvelle ligne". clé qui fait tourner le rouleau d'un pas. Voir: en.wikipedia.org/wiki/IBM_Electric_typewriter . Donc, "CR" + "LF" datent avant l'histoire de l'ordinateur.
dan
Il convient également de noter que certains télétypes exigent qu'un CR soit suivi d'un caractère non imprimable afin de permettre au chariot de fonctionner correctement avant que le prochain caractère d'impression n'arrive, et ne prend pas du tout en charge le retour arrière, donc l'envoi d'un LF après CR. ne coûtait rien, et le seul moyen de réaliser la surimpression était via CR.
Supercat
Les "jours des télétypes" commencent avant l'ère de l'informatique. dans les années 1960, de nombreux ordinateurs avaient un téléscripteur pour la console et utilisaient encore plus d’ASCII comme jeu de caractères.
Walter Mitty
7

Bien que vous puissiez traduire la question historique en une question sur le langage C, la raison pour laquelle Linux et tous les systèmes conformes à POSIX ou POSIX-ish doit utiliser LF(ou au moins quel que soit le '\n'caractère C ) car la nouvelle ligne est une conséquence de l'intersection des exigences de C et POSIX. Bien que C permette aux "fichiers texte" et aux "fichiers binaires" de différer (en fait, les fichiers texte peuvent être basés sur des enregistrements, consistant en une séquence d’enregistrements de ligne, en plus de choses moins exotiques, comme la '\n'traduction en / de CR/ LFsimilaire à DOS / Windows ), POSIX exige que le mode texte et le mode binaire se comportent de la même manière. C’est en grande partie la raison pour laquelle les outils de ligne de commande tels quecatsont puissants / utiles; ils le seraient beaucoup moins s'ils ne travaillaient qu'avec du binaire, ou seulement du texte, mais pas les deux.

R ..
la source
13
Ce choix est antérieur à POSIX de plusieurs années. Comme mentionné dans la réponse de Jlliagre, cela remonte au début d'Unix, qui l'a copié à partir de Multics.
Barmar
4
Le choix sous Linux ne précède pas POSIX de nombreuses années. Bien entendu, POSIX a codifié ce qui existait déjà dans la pratique, puisque c’était là sa raison d’être.
R ..
En ce qui concerne Linux, il n'y avait pas vraiment de choix à faire en premier lieu. La bibliothèque standard Gnu utilisée par Linux est semblable à POSIX et utilisait depuis sa création le saut de ligne pour des raisons évidentes de compatibilité, car elle avait été développée, testée et utilisée sur des systèmes Unix. Le noyau Linux a été conçu pour fournir à une bibliothèque C standard (GNU ou autre) des appels système analogues à ceux d'UNIX. La complexité requise pour gérer différemment les fichiers texte et les fichiers binaires aurait été excessive et aurait rendu impossible la compatibilité avec le code existant. Cela aurait été absurde de Torvalds.
Jlliagre
@jlliagre: C'était toujours un choix de faire quelque chose de compatible avec les pratiques existantes plutôt que d'incompatibilités gratuites aléatoires. Vous pouvez seulement dire que ce n'était pas un choix dans le contexte de la réussite de Linux. Beaucoup de gens font des systèmes d'exploitation pour amateurs de jouets des choix de farces gratuites et ils ne vont jamais nulle part.
R ..
@RI signifie que Linux n’est qu’un noyau et qu’il nécessite essentiellement GNU pour fonctionner (au départ, le but de Torvalds était d’être compatible avec minix au lieu de gnu, mais cela ne fait aucune différence ici). Le choix de nouvelle ligne n’est pas lié à Linux car il a été fait bien avant l’écriture de Linux. Il y a eu beaucoup de choix farfelus plus ou moins gratuits dans les différentes versions de Linux, ils n’ont pas empêché Linux de réussir. Une des raisons est probablement que beaucoup de ces choix ont été revisités plus tard.
jlliagre