¿Por qué Linux usa LF como el personaje de nueva línea?

87

Hasta donde sé, cada sistema operativo tiene una forma diferente de marcar el carácter de fin de línea (EOL). Los sistemas operativos comerciales utilizan el retorno de carro para EOL (retorno de carro y avance de línea en Windows, retorno de carro solo en Mac). Linux, por otro lado, solo usa el avance de línea para EOL.

¿Por qué Linux no utiliza el retorno de carro para EOL (y solo el avance de línea)?

Bagas Sanjaya
fuente
77
Las Mac no han usado CR solo desde antes de OS X ... ahora creo que usan * nix style LF, creo.
B Layer
33
Creo que también ha habido una serie de sistemas operativos Unixy comerciales.
ilkkachu
20
Explicado en Wikipedia . Básicamente, los Multics en los últimos años 60 (que inspiraron Unix, que inspiraron Linux) agregaron cierto nivel de abstracción para evitar que la codificación del texto se vea gravada por las limitaciones de los dispositivos de teletipo, por lo que no tuvo que codificar la nueva línea en dos caracteres (lo que hace aún menos sentido 50 años después, por supuesto).
Stéphane Chazelas
74
El segundo párrafo es una pregunta válida, pero el primer párrafo está tan lleno de simplificaciones excesivas y errores directos que lo está ahogando, y los respondedores tienen que corregir un montón de premisas dudosas y defectuosas incluso antes de llegar a la pregunta.
JdeBP
21
¿Qué? Linux es una aproximación libre de un estándar comercial de SO llamado UNIX. Los sistemas que cumplen con UNIX cuestan mucho dinero en ese entonces y todavía lo hacen hoy.
errantlinguist

Respuestas:

334

Windows usa CRLFporque lo heredó de MS-DOS.

MS-DOS usa CRLFporque se inspiró en CP / M que ya estaba usando CRLF.

CP / M y muchos sistemas operativos de los años ochenta y anteriores se usaban CRLFporque era la forma de terminar una línea impresa en un teletipo (volver al comienzo de la línea y saltar a la siguiente línea, como las máquinas de escribir normales). Esto simplificó la impresión de un archivo porque se requería menos o ningún procesamiento previo. También había requisitos mecánicos que impedían que un solo personaje fuera utilizable. Es posible que se requiera algún tiempo para permitir que el carro regrese y la platina gire.

Gnu / Linux usa LFporque es un clon de Unix . 1

Unix usó un solo carácter, LFdesde el principio para ahorrar espacio y estandarizar a un final de línea canónico, el uso de dos caracteres fue ineficiente y ambiguo. Esta opción fue heredada de Multics, que la utilizó desde 1964. La memoria, el almacenamiento, la potencia de la CPU y el ancho de banda eran muy escasos, por lo que valía la pena ahorrar un byte por línea. Cuando se imprimió un archivo, el controlador estaba convirtiendo el avance de línea (nueva línea) a los caracteres de control requeridos por el dispositivo de destino.

LFfue preferido CRporque este último todavía tenía un uso específico. Al reposicionar el carácter impreso al comienzo de la misma línea, permitió sobrepasar los caracteres ya escritos.

Manzana inicialmente decidió utilizar también un único carácter, pero por alguna razón recogió el otro: CR. Cuando cambió a una interfaz BSD, se movió a LF.

Estas opciones no tienen nada que ver con el hecho de que un sistema operativo sea comercial o no.

1 Esta es la respuesta a tu pregunta.

jlliagre
fuente
20
Multics utilizó el avance de línea de acuerdo con la norma ISO / IEC 646 contemporánea, que lo prescribió como la forma de representar el retorno de carro y el avance de línea juntos, en un solo carácter, si se necesitaba una representación de un carácter.
JdeBP
10
Dudo que la verdadera razón para elegir un solo personaje sea ahorrar espacio. La verdadera razón fue definir un solo carácter de nueva línea que sea independiente del dispositivo de salida (terminal, etc.) El controlador de terminal (o similar) se encarga de convertir la nueva línea a la secuencia de caracteres de control apropiada, típicamente CR LF. Esto permite una buena abstracción cuando se programa con cadenas: la nueva línea se presenta con una sola \n, independientemente de algún dispositivo de salida en particular.
Johan Myréen
14
No obstante, el artículo de 1970 de Saltzer y Ossanna ( procesamiento de flujo de caracteres de terminal remota en Multics ) es bastante claro que la razón fue la independencia del dispositivo .
JdeBP
3
@JdeBP Este documento establece la reducción a la forma canónica del flujo de caracteres que pasan hacia y desde terminales remotas es el tema de este documento . Reducir a una forma canónica era una forma de ahorrar espacio (también). Expresado de manera diferente, el uso de dos personajes fue una pérdida de espacio ineficiente y ambigua.
jlliagre
46
Y los teletipos obtuvieron esto de máquinas de escribir no eléctricas. CR-LF describe la acción mecánica que realiza cuando empuja la palanca a su izquierda. Devuelva el "carro" que sujeta la platina (rodillo) completamente hacia la derecha (que coloca el golpe de teclado en la primera posición a la izquierda) y gire la platina una rotación de altura de la línea para pasar a la siguiente línea digitable. Sí, ciertamente estoy mostrando mi edad aquí.
cdkMoose
17

El artículo de Wikipedia en "Newline" rastrea la elección de NL como terminador de línea (o separador) a Multics en 1964; Desafortunadamente, el artículo tiene pocas citas de fuentes, pero no hay razón para dudar de que esto sea correcto. Hay dos ventajas obvias en esta elección sobre CR-LF: ahorro de espacio e independencia del dispositivo.

La alternativa principal, CR-LF, se origina en los códigos de control utilizados para mover físicamente el carro de papel en una máquina de teletipo, donde CR devolvería el carro a su posición inicial, y LF rotaría el rodillo de papel para mover la posición de impresión hacia abajo. línea. Los dos caracteres de control aparecen en el código ITA2 que data de 1924 y que aparentemente todavía está en uso (ver Wikipedia); aparentemente ITA2 los tomó de la variante Murray del código Baudot que data de 1901.

Para los lectores más jóvenes, vale la pena señalar que en la tradición del mainframe, no había un personaje de nueva línea; más bien, un archivo era una secuencia de registros que tenían una longitud fija (a menudo 80 caracteres, basados ​​en tarjetas perforadas) o una longitud variable; Los registros de longitud variable generalmente se almacenaban con un recuento de caracteres al comienzo de cada registro. Si tiene un archivo mainframe que consta de una secuencia de registros de longitud variable, cada uno de los cuales contiene contenido binario arbitrario, convertirlo sin pérdida a un archivo de estilo UNIX puede ser una conversión difícil.

Linux, por supuesto, fue solo una reimplementación de Unix, y Unix tomó muchas de sus decisiones de diseño de Multics, por lo que parece que la decisión clave se tomó en 1964.

usuario32929
fuente
12

Otras respuestas han rastreado la cadena de herencia hasta la década de 1960 y los teletipos. Pero aquí hay un aspecto que no cubrieron.

En los días de los teletipos, había momentos en los que era deseable hacer algo llamado sobresalir. A veces, se usaba el sobreescritura para ocultar una contraseña, porque borrar la contraseña simplemente no era factible. Otras veces, se realizó una superposición para obtener un símbolo que no estaba en la fuente. Por ejemplo, la letra O y una barra oblicua producen un nuevo símbolo.
El sobreesfuerzo se logró colocando un retorno de carro sin avance de línea, a veces se usaba un retroceso suficiente. Por esta razón, las personas de Unix decidieron no utilizar el retorno de carro como separador de línea, y optaron por el avance de línea. Esto también funcionó bien para leer textos producidos usando la convención CRLF. El CR se traga y el LF se convierte en el separador.

Walter Mitty
fuente
Gracias por esta memoria precisa. Retroceso y retorno de carro (solo) también se utilizaron en la impresora para producir caracteres en negrita o subrayados. Y para volver a los orígenes, estos dos comandos ya existían en 1930 para hacer que el "carro" "regresara" a su posición más a la izquierda, ya sea para dar un golpe o permitir iniciar una nueva línea con la ayuda de la "nueva línea". clave que hizo girar el rodillo un paso. Ver: en.wikipedia.org/wiki/IBM_Electric_typewriter . Entonces "CR" + "LF" están saliendo antes del historial de la computadora.
dan
También vale la pena señalar que algunos teletipos requieren que un CR sea seguido por un carácter que no se imprima para dar tiempo al carro para que se complete el ciclo antes de que llegue el siguiente carácter de impresión, y no admitió el retroceso en absoluto, por lo que enviar un LF después del CR no costó nada, y la única forma de lograr la sobreimpresión fue a través de CR.
supercat
Los "días de teletipos" comienzan antes de la era de la computadora. En la década de 1960, muchas computadoras tenían un teletipo de consola para el operador, y aún más usaban ASCII como su conjunto de caracteres.
Walter Mitty
7

Si bien podría traducir la pregunta histórica en una pregunta sobre el lenguaje C, la razón por la que Linux y todos los sistemas conformes con POSIX o POSIX-ish deben usar LF(o al menos cualquiera que sea el '\n'carácter C ) ya que la nueva línea es una consecuencia de la intersección de los requisitos de C y POSIX. Mientras que C permite que los "archivos de texto" y los "archivos binarios" difieran (de hecho, los archivos de texto pueden estar basados ​​en registros que consisten en una secuencia de registros de línea, además de cosas menos exóticas como haber '\n'traducido a / desde CR/ LFcomo en DOS / Windows ), POSIX exige que el texto y el modo binario se comporten igual. Esta es en gran parte la razón por la cual las herramientas de línea de comando comocatson poderosos / útiles; serían mucho menos si solo trabajaran con binario, o solo con texto, pero no con ambos.

R ..
fuente
13
Esta elección es anterior a POSIX por muchos años. Como se menciona en la respuesta de jlliagre, se remonta al comienzo de Unix, que lo copió de Multics.
Barmar
44
La elección en Linux no es anterior a POSIX por muchos años. Por supuesto, POSIX codificó lo que ya era una práctica existente, ya que esa era toda su razón de existir.
R ..
En lo que respecta a Linux, no había una elección real que hacer en primer lugar. La biblioteca estándar de Gnu que utiliza Linux es contemporánea para POSIX, y estaba utilizando alimentación de línea desde su inicio por razones obvias de compatibilidad porque fue desarrollada, probada y utilizada en sistemas Unix. El kernel de Linux fue diseñado para proporcionar llamadas de sistema similares a Unix a una biblioteca C estándar (GNU u otra) y agregar la complejidad requerida para manejar archivos de texto y archivos binarios de manera diferente habría sido excesivo y rompería la compatibilidad con el código existente. Eso habría sido absurdo de Torvalds.
jlliagre
@jlliagre: Todavía era una opción hacer algo compatible con las prácticas existentes en lugar de incompatibilidades gratuitas al azar. Solo puede decir que no fue una elección en el contexto de asumir el éxito de Linux. Muchas personas hacen que los sistemas operativos para aficionados a los juguetes estén llenos de opciones extravagantes gratuitas y nunca van a ningún lado.
R ..
@RI significa que Linux es solo un núcleo y esencialmente requería que GNU funcionara (inicialmente, el objetivo de Torvald era ser compatible con minix en lugar de gnu, pero eso no hace ninguna diferencia aquí). La elección de la nueva línea no está relacionada con Linux porque se hizo mucho antes de que se escribiera Linux. Ha habido muchas opciones extrañas más o menos gratuitas en los diversos lanzamientos de Linux, no impidieron que Linux tuviera éxito. Una de las razones probablemente es que muchas de estas opciones fueron revisadas más tarde.
jlliagre