Por que o Linux usa LF como o caractere de nova linha?

87

Tanto quanto eu sei, todo sistema operacional tem uma maneira diferente de marcar o caractere de fim de linha (EOL). Os sistemas operacionais comerciais usam retorno de carro para EOL (retorno de carro e alimentação de linha no Windows, retorno de carro apenas no Mac). O Linux, por outro lado, apenas usa o feed de linha para o EOL.

Por que o Linux não usa retorno de carro para EOL (e apenas alimentação de linha)?

Bagas Sanjaya
fonte
77
Macs não usam CR apenas desde antes do OS X ... agora use * nix style LF, acredito.
B Camada
33
Eu acho que também existem / existem vários SOs comerciais Unixy.
Ilkkachu
20
Explicado na Wikipedia . Basicamente, o Multics nos últimos anos 60 (que inspirou o Unix, que inspirou o Linux) adicionou um certo nível de abstração para evitar que a codificação de texto fosse sobrecarregada pelas limitações dos dispositivos de teletipo, para que não fosse necessário codificar nova linha em dois caracteres (o que torna ainda menos sentido 50 anos depois, é claro).
Stéphane Chazelas
74
O segundo parágrafo é uma pergunta válida, mas o primeiro parágrafo é tão cheio de simplificações e erros claros que o afoga, com os respondentes tendo que corrigir um monte de premissas duvidosas e defeituosas antes mesmo de chegarem à pergunta.
JdeBP
21
O que? Linux é uma aproximação livre de um padrão comercial de sistema operacional chamado UNIX. Os sistemas compatíveis com UNIX custam muito dinheiro na época e ainda custam hoje.
errantlinguist

Respostas:

334

O Windows usa CRLFporque o herdou do MS-DOS.

O MS-DOS usa CRLFporque foi inspirado no CP / M que já estava sendo usado CRLF.

O CP / M e muitos sistemas operacionais dos anos 80 e anteriores usavam CRLFporque era a maneira de terminar uma linha impressa em um teletipo (retornar ao início da linha e pular para a próxima linha, como as máquinas de escrever comuns). Isso simplificou a impressão de um arquivo porque havia menos ou nenhum pré-processamento necessário. Havia também requisitos mecânicos que impediam que um único caractere fosse utilizável. Pode ser necessário algum tempo para permitir que o carro retorne e o cilindro gire.

O Gnu / Linux usa LFporque é um clone do Unix . 1 1

O Unix usou um único caractere, LFdesde o início, para economizar espaço e padronizar para um final de linha canônico, usando dois caracteres era ineficiente e ambíguo. Essa escolha foi herdada da Multics, que a utilizou desde 1964. Memória, armazenamento, potência da CPU e largura de banda eram muito escassas, portanto, vale a pena economizar um byte por linha. Quando um arquivo foi impresso, o driver estava convertendo o avanço de linha (nova linha) nos caracteres de controle exigidos pelo dispositivo de destino.

LFfoi preferido CRporque o último ainda tinha um uso específico. Ao reposicionar o caractere impresso no início da mesma linha, ele permitiu ultrapassar os caracteres já digitados.

A Apple inicialmente decidiu também utilizar um único personagem, mas por algum motivo escolheu o outro: CR. Quando mudou para uma interface BSD, mudou-se para LF.

Essas opções não têm nada a ver com o fato de um sistema operacional ser comercial ou não.

1 Esta é a resposta para sua pergunta.

jlliagre
fonte
20
Multics usou o Line Feed de acordo com a ISO / IEC 646 contemporânea, que o prescreveu como a maneira de representar o retorno de carro e o feed de linha juntos, em um único caractere, se uma representação de um caractere fosse necessária.
JdeBP
10
Duvido que a verdadeira razão para escolher um único personagem tenha sido economizar espaço. O verdadeiro motivo foi definir um único caractere de nova linha que seja independente do dispositivo de saída (terminal etc.). O driver do terminal (ou similar) cuida da conversão da nova linha na sequência de caracteres de controle apropriada, normalmente CR LF. Isso permite uma boa abstração ao programar com strings: a nova linha é apresentada com um único \n, independentemente de algum dispositivo de saída específico.
Johan Myréen
14
No entanto, o artigo de 1970 de Saltzer e Ossanna ( processamento de fluxo de caracteres de terminal remoto em Multics ) é bastante claro que a independência do dispositivo foi o motivo.
JdeBP
3
@JdeBP Este documento declara que a redução para a forma canônica do fluxo de caracteres que passa de e para terminais remotos é o assunto deste documento . Reduzir para uma forma canônica era uma maneira de economizar espaço (também). Expressado de maneira diferente, o uso de dois caracteres era um desperdício ineficiente e ambíguo de espaço.
Jlliagre
46
E os teletipos obtiveram isso de máquinas de escrever não elétricas. O CR-LF descreve a ação mecânica que você executa quando empurra a alavanca à sua esquerda. Retorne o "carro" que segura o cilindro (rolo) totalmente para a direita (que pressiona a tecla na primeira posição à esquerda) e gire o cilindro uma rotação de altura de linha para passar para a próxima linha que pode ser digitada. Sim, eu estou mostrando minha idade aqui.
cdkMoose
17

O artigo da wikipedia sobre "Nova linha" rastreia a escolha de NL como terminador de linha (ou separador) para Multics em 1964; infelizmente, o artigo tem poucas citações nas fontes, mas não há razão para duvidar que isso esteja correto. Há dois benefícios óbvios para essa escolha em relação ao CR-LF: economia de espaço e independência do dispositivo.

A principal alternativa, CR-LF, se origina nos códigos de controle usados ​​para mover fisicamente o carro de papel em uma máquina de teletipo, onde o CR retornaria o carro à sua posição inicial, e LF giraria o rolo de papel para mover a posição de impressão para baixo um linha. Os dois caracteres de controle aparecem no código ITA2, que remonta a 1924 e que aparentemente ainda está em uso (consulte a Wikipedia); aparentemente o ITA2 os tirou da variante Murray do código Baudot, que data de 1901.

Para leitores mais jovens, vale a pena notar que, na tradição do mainframe, não havia caracteres de nova linha; antes, um arquivo era uma sequência de registros com comprimento fixo (geralmente 80 caracteres, com base em cartões perfurados) ou comprimento variável; registros de tamanho variável eram normalmente armazenados com uma contagem de caracteres no início de cada registro. Se você tiver um arquivo de mainframe que consiste em uma sequência de registros de tamanho variável, cada um contendo conteúdo binário arbitrário, a conversão sem perdas em um arquivo no estilo UNIX pode ser uma conversão complicada.

O Linux, é claro, foi apenas uma reimplementação do Unix, e o Unix tomou muitas de suas decisões de design da Multics, então parece que a principal decisão foi tomada em 1964.

user32929
fonte
12

Outras respostas traçaram a cadeia de herança desde os anos 1960 e os teletipos. Mas aqui está um aspecto que eles não abordaram.

Nos dias dos teletipos, havia momentos em que era desejável fazer algo chamado de ultrapassagem. Overstriking às vezes era usado para ocultar uma senha, porque o apagamento da senha não era possível. Outras vezes, o overstriking foi feito para obter um símbolo que não estava na fonte. Por exemplo, a letra O e uma barra produzem um novo símbolo.
O impacto excessivo foi obtido ao colocar um retorno de carro sem avanço de linha, às vezes era usado um backspace. Por esse motivo, o pessoal do unix decidiu contra o retorno de carro como separador de linha e optou pelo avanço de linha. Isso também funcionou bem para a leitura de textos produzidos usando a convenção do CRLF. O CR é engolido e o LF se torna o separador.

Walter Mitty
fonte
Obrigado por esta memória precisa. Backspace e Carriage Return (sozinho) também foram usados ​​na impressora para produzir caracteres em negrito ou sublinhado. E, voltando às origens, esses dois comandos já existiam em 1930 para fazer com que o "carro" retornasse à sua posição mais à esquerda, para ultrapassar ou permitir iniciar uma nova linha com a ajuda da "nova linha". chave que fez girar o rolo um passo. Veja: en.wikipedia.org/wiki/IBM_Electric_typewriter . Então, "CR" + "LF" estão namorando antes do histórico do computador.
dan
Também pode ser interessante notar que alguns teletipos exigiam que um CR fosse seguido por um caractere não imprimível, para dar tempo ao carro para o ciclo completo antes da chegada do próximo caractere de impressão e não suportava backspacing, enviando um LF após o CR não custou nada e a única maneira de realizar a superimpressão foi via CR.
Supercat
Os "dias dos teletipos" começam antes da era do computador. na década de 1960, muitos computadores tinham um teletipo de console para o operador, e ainda mais usavam o ASCII como seu conjunto de caracteres.
precisa
7

Embora você possa traduzir a pergunta histórica em uma pergunta sobre a linguagem C, a razão pela qual o Linux e todos os sistemas em conformidade com POSIX ou POSIX-ish devem usar LF(ou pelo menos qualquer que seja o '\n'caractere C ) como a nova linha é uma conseqüência da interseção dos requisitos de C e POSIX. Enquanto C permite que "arquivos de texto" e "arquivos binários" sejam diferentes (na verdade, os arquivos de texto podem ser baseados em registros, consistindo em uma sequência de registros de linha, além de coisas menos exóticas, como '\n'traduzir para / de CR/ LFcomo no DOS / Windows ), O POSIX exige que o modo texto e binário se comportem da mesma maneira. Essa é a razão pela qual as ferramentas de linha de comando, comocatsão poderosos / úteis; eles seriam muito menos se trabalhassem apenas com binário, ou apenas com texto, mas não com os dois.

R ..
fonte
13
Essa escolha antecede o POSIX por muitos anos. Como mencionado na resposta do jlliagre, ele remonta ao início do Unix, que o copiou do Multics.
Barmar
4
A escolha no Linux não é anterior ao POSIX por muitos anos. É claro que o POSIX codificou o que já era uma prática existente, uma vez que essa era toda a sua razão de existir.
R. ..
No que diz respeito ao Linux, não havia uma escolha real a fazer em primeiro lugar. A biblioteca padrão do Gnu usada pelo Linux é contemporânea do POSIX, e estava usando o feed de linha desde o seu início por razões óbvias de compatibilidade, porque foi desenvolvida, testada e usada em sistemas Unix. O kernel do Linux foi projetado para fornecer chamadas de sistema do tipo Unix a uma biblioteca C padrão (GNU ou outra) e adicionar a complexidade necessária para lidar de maneira diferente com arquivos de texto e arquivos binários teria sido um exagero e quebraria a compatibilidade com o código existente. Isso teria sido sem sentido de Torvalds.
Jlliagre
@jlliagre: Ainda era uma opção tornar algo compatível com as práticas existentes, em vez de incompatibilidades gratuitas aleatórias. Você pode apenas dizer que não foi uma escolha no contexto de assumir o sucesso do Linux. Muitas pessoas fazem SOs de hobbyistas de brinquedos cheios de opções gratuitas e malucas e nunca vão a lugar algum.
R ..
@RI significa que o Linux é apenas um kernel e requer essencialmente que o GNU funcione (inicialmente o objetivo do Torvalds era ser compatível com minix em vez de gnu, mas isso não faz diferença aqui). A escolha da nova linha não está relacionada ao Linux, porque foi feita muito tempo antes da criação do Linux. Houve muitas opções malucas mais ou menos gratuitas nas várias versões do Linux, elas não impediram o sucesso do Linux. Uma das razões provavelmente é que muitas dessas opções foram revisadas mais tarde.
Jlliagre