Por que o Windows usa CR LF?

87

Eu entendo a diferença entre os dois, então não há necessidade de entrar nisso, mas estou apenas me perguntando qual é o motivo por trás do motivo pelo qual o Windows usa CR e LF para indicar uma quebra de linha. Parece que o método Linux (apenas usando LF) faz muito mais sentido, economiza espaço e é mais fácil de analisar.

Kyle
fonte
3
Newline # History
Tim Cooper
Aqui está a Wikipedia sobre a história da nova linha: en.wikipedia.org/wiki/Newline#History
Szocske
Pode ser interessante notar que CRLF no Windows é principalmente apenas uma convenção / padrão. A maioria dos programas oferece suporte para ambos (embora você possa ter que alterar as configurações). Eu pessoalmente quase nunca uso o CRLF, optando pelo LF no estilo UNIX; apenas alguns programas ainda têm problemas com arquivos que usam apenas LF.
Kevin
CR + LF é a maneira correta de fazer isso (é o padrão ), então a questão não é por que o Windows faz isso corretamente, mas por que Mac e Unix / Linux fazem isso incorretamente. O legado do LF autônomo é preguiça e pegar um atalho. Eu sempre CR + LF, exceto para certas coisas do Linux que ficam boquiabertas em CR + LF, então eu mudo para o modo LF para isso. IMO, interpretar incorretamente CR + LF é muito pior do que interpretar mal um LF autônomo.
InterLinked

Respostas:

97

Historicamente, ao usar impressoras matriciais os teletipos CR retornariam o carro para a primeira posição da linha enquanto LF alimentaria para a próxima linha. A utilização de CR + LF no próprio arquivo possibilitou o envio de um arquivo diretamente para a impressora, sem nenhum tipo de driver de impressora.

Obrigado @zaph apontando que eram teletipos e não impressoras matriciais

Anders Abel
fonte
47
Aborrecimento muito comum para um benefício muito pequeno.
Dávid Horváth
7
@Anders Na verdade, o motivo foi o teletipo, o CR voltou a cabeça de impressão para a esquerda e LF avançou o papel. Os teletipos precederam as impressoras matriciais.
zaph
5
@zaph É por isso que adoro Stack Overflow. 2 anos depois e recebo uma correção e aprendi algo novo.
Anders Abel
Como o Windows seguiu o Unix por tantos anos, é intrigante que eles não tenham seguido o modelo Unix de apenas LF.
belanger
32

@sshannin postou uma URL do blog de Raymond Chen, mas não funciona mais. O blog mudou seu software interno, então os URLs mudaram.

Depois de rastejar pelos posts antigos no novo blog, eu o encontrei aqui .

Citação do blog:

Por que o terminador de linha é CR + LF?

Este protocolo remonta à época dos teletipoquistas. CR significa “retorno do carro” - o caractere de controle CR retornou o cabeçote de impressão (“carro”) para a coluna 0 sem avançar o papel. LF significa “alimentação de linha” - o caractere de controle LF avançou o papel uma linha sem mover a cabeça de impressão. Portanto, se você quiser retornar o cabeçote de impressão à coluna zero (pronto para imprimir a próxima linha) e avançar o papel (para que ele imprima em papel novo), você precisa de CR e LF.

Se você acessar os vários documentos de protocolo da Internet, como RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) ou RFC 2616 (HTTP), verá que todos especificam CR + LF como o seqüência de terminação de linha. Portanto, a verdadeira questão não é “Por que CP / M, MS-DOS e Win32 usam CR + LF como terminador de linha?” mas sim "Por que outras pessoas optaram por diferir desses documentos de padrões e usar algum outro terminador de linha?"

O Unix adotou o LF simples como a seqüência de terminação de linha. Se você olhar as opções stty, verá que a opção onlcr especifica se um LF deve ser alterado para CR + LF. Se você errar essa configuração, obterá o texto da escada, onde

each
    line
        begins 

onde a linha anterior parou. Portanto, mesmo unix, quando deixado em modo bruto, requer CR + LF para encerrar linhas. O CR implícito antes do LF é uma invenção do Unix, provavelmente como uma economia, uma vez que salva um byte por linha.

A ancestralidade unix da linguagem C transportou esta convenção para o padrão da linguagem C, que requer apenas “\ n” (que codifica LF) para encerrar linhas, sobrecarregando as bibliotecas de tempo de execução para converter dados de arquivo brutos em linhas lógicas.

A linguagem C também introduziu o termo “nova linha” para expressar o conceito de “terminador de linha genérico”. Disseram-me que o comitê ASCII mudou o nome do caractere 0x0A para “nova linha” por volta de 1996, então o nível de confusão aumentou ainda mais.

Aqui está outra discussão sobre o assunto, de uma perspectiva unix

Eu mudei este segundo link para um instantâneo em The Wayback Machine, uma vez que a página real não está mais disponível.

Espero que isso responda a sua pergunta.

OMA
fonte
Já que você não está realmente respondendo a pergunta, apenas corrigindo um link que ficou desatualizado, em um comentário , isso deveria ser um comentário mesmo. Enfim, obrigado pelo link correto. Adicione-o como um comentário, esta resposta pode ser excluída.
Tom Brunberg
1
OK, adicionei aqui o texto do blog, então se o link der errado novamente, o texto ainda estará disponível aqui. Acho que isso deve ser mantido como uma resposta, não apenas um comentário, uma vez que essa informação na verdade responde à pergunta feita originalmente.
OMA de
9
Eu realmente odeio a maneira como a Microsoft torna obsoletos seus links regularmente.
Mark Ransom
2
Esta resposta é mais detalhada do que a exceção e responde não apenas à pergunta feita, mas também à razão adivinhada para a pergunta, IMHO é melhor.
Alexei Martianov
18

Vem das máquinas de teletipo (e máquinas de escrever) dos dias de outrora.

Antes, quando você terminava de digitar uma linha, era necessário mover o carro da máquina de escrever (que segurava o papel e deslizava para a esquerda conforme você digitava) de volta ao início da linha (CR). Em seguida, você tinha que avançar o papel em uma linha (LF) para mover para a próxima linha.

Há casos em que você pode não querer avançar de linha ao retornar o carro, como se você fosse tachar um caractere com um travessão (você simplesmente o sobrescreveria).

Mas basicamente tudo se resume à convenção. O DOS usou a convenção CR / LF completa e o UNIX a encurtou um pouco. Agora estamos presos!

Dave Markle
fonte
2

Outros deram a resposta, mas eu queria acrescentar ... Acho que você é muito jovem para ter usado uma máquina de escrever? ;) A carruagem é um tambor. Movê-lo horizontalmente para a direita traz a cabeça do tipo estacionário de volta para a margem esquerda da página. Girar o carro com o dedo e o polegar avança a página em uma linha (s).

como judô
fonte
2
Máquina de escrever? Acho que vi um desses em um museu uma vez :)
Kyle
@Kyle Eu tive que rir e isso iluminou meu dia :)
likejudo
1

Da Wikipedia :

A sequência CR + LF era de uso comum em muitos dos primeiros sistemas de computador que adotaram máquinas de teletipo, normalmente um ASR33, como um dispositivo de console, porque essa sequência era necessária para posicionar essas impressoras no início de uma nova linha.

Nick Heidke
fonte
1

Eu vi mais de uma conta no sentido de que o motivo para enviar dois caracteres (e às vezes mais) em vez de um era para combinar melhor a taxa de transferência de dados com a taxa de impressão física ( isso foi há muito tempo ). Mover a cabeça de impressão demorava mais do que imprimir um único caractere e enviar caracteres extras era uma forma de evitar que a transferência de dados ficasse à frente do dispositivo de impressão. Portanto, a razão de termos vários caracteres de fim de linha no Windows é basicamente a mesma razão de termos teclados QWERTY - a intenção era tornar as coisas mais lentas .

Obviamente, o motivo pelo qual essa prática continua no Windows até hoje é baseada em alguma noção de compatibilidade contínua com versões anteriores e, em última análise, apenas simples inércia.

É importante notar, entretanto, que essa convenção não é estritamente aplicada pelo Windows no nível do sistema operacional . Qualquer aplicativo do Windows é livre para ignorar a convenção, dependendo dos outros aplicativos com os quais está tentando ser compatível.

Curiosamente, o artigo da Wikipedia sobre "Newline" afirma que o Windows 8 pode introduzir uma mudança no uso apenas de LF. O artigo também afirma que o Mac OS X introduziu uma transição de LF + CR para apenas LF.

Brent Bradburn
fonte
4
"Destinado a desacelerar as coisas" - carece de fontes.
Elliot Gorokhovsky
4
Na verdade, todo o primeiro parágrafo - citação necessária.
Elliot Gorokhovsky
2
Aqui está um artigo de Jeff Atwood intimamente relacionado que faz referência ao mesmo conteúdo da Wikipedia: The Great Newline Schism . Há muitos comentários de usuários inteligentes lá também - incluindo algumas comprovações do meu ponto de que esta não é uma preocupação no nível do sistema operacional e que a maioria dos aplicativos do Windows funcionará bem com arquivos de texto somente LF. Há também um comentário divertido: "O Windows 10 usa CR / LF para manter a compatibilidade com a máquina de teletipo Modelo 33 de 1963 ".
Brent Bradburn,
1
@RenéG Não preciso de citação, estive lá e vi pessoalmente. Algumas impressoras matriciais antigas exigiam até mesmo alguns NULs extras para garantir, porque conforme a taxa de transmissão da interface aumentava, o cabeçote não conseguia acompanhar nem mesmo dois caracteres de tempo. Esse problema foi embora quando o buffer e o controle de fluxo entraram em cena, mas as primeiras impressoras não tinham isso. Finalmente, quando as impressoras passaram a ter apenas saída, elas foram para uma interface paralela com handshaking embutido.
Mark Ransom
1
“Ao contrário da crença popular, o layout QWERTY não foi projetado para atrasar o digitador,…” - Propriedades | QWERTY - Wikipedia
Jason Sparc