CR e LF nos marcadores de "fim de linha"
Cada um dos três sistemas operacionais, mais comuns em notebooks e desktops, utilizam diferentes marcadores de "fim de linha".
No Windows a marcação de "fim de linha" acontece com 2 caracteres: CR+LF
No UNIX/Linux, com um caractere: LF
No MAC, com um caractere: originalmente, CR, e a partir da versão X (10), LF
Vamos, neste artigo, ignorar essa discordância e focar em entender o que são CR e LF?
Primeiramente, indo direto ao ponto, os significados desses caracteres são:
- CR: Carriage Return, que significa "voltar para o início da linha"; é o caractere 13, 0x0D, também representado por \r (return).
- LF: Line Feed, que significa "ir para a próxima linha"; é o caractere 10, 0x0A, também representado por \n (new line).
"Caracteres" que são "sinais"
Computadores trabalham, em sua grande maioria hoje, com sistema binário.
Sistema binário nada mais é que um sistema numérico em que os números utilizam apenas dois algarismos em suas representações, 0 e 1.
Para termos letras, símbolos e outras coisas nos computadores, além de valores para cálculos, temos que dar significados especiais a alguns valores binários.
Uma das primeiras tentativas de padronização desses valores que foi amplamente aceita foi a tabela ASCII, formalizada no início dos anos 1960. Esta tabela se referia a cada valor como um "sinal", no sentido de "sinal" elétrico processado nos computadores, equivalente a um valor binário de sete dígitos. Assim, a tabela ASCII definiu "significados" para os "sinais" de 0 a 127, que são os possíveis valores desse número.
Essa tabela lista:
- 95 símbolos gráficos, imprimíveis: letras, algarismos, símbolos de pontuação e matemáticos; e
- 33 sinais de controle, não-imprimíveis.
A tabela ASCII não criou símbolos, apenas propôs uma padronização. É claro que letras e algarismos já existiam antes da tabela ASCII. :)
Da mesma forma, vários sinais de controle também já existiam. Alguns, como os CR e LF, já estavam em uso há décadas, nos padrões de comunicação por telégrafos.
CR e LF são "sinais" não-imprimíveis, que representam comandos. Por isso, vou chamá-los de "comandos".
Contexto histórico
Espero que o conhecimento de um pouco de história facilite o entendimento do uso atual dos comandos CR e LF.
CR e LF foram definidos em uma época em que não existiam monitores. Então, essas "linhas" citadas nas descrições de suas funções ("voltar para o início da linha" e "ir para a próxima linha"), não são "linhas" de texto na tela, são "linhas" impressas.
As primeiras impressoras eram inspiradas em máquinas de escrever e, como nestas, uma linha recebia uma sequência de caracteres que eram "carimbados" no papel, em sequência, da esquerda para a direita. Um exemplo dessa impressora é o Teletipo Modelo 33.
Ao chegar na margem direita, ou no último caractere que deveria ser impresso em uma determinada linha, era necessário mandar um comando para a impressora reposicionar o cabeçote de impressão no início da próxima linha.
Reposicionar o cabeçote de impressão seria uma ação semelhante a reposicionarmos o cursor que indica onde estamos escrevendo em um editor de texto. Onde estiver o cursor é onde irá ser inserido o próximo caractere digitado.
Imprimindo na Teletipo Modelo 33
Nesse tipo de impressora, o "comando" reposicionar o cabeçote de impressão no início da próxima linha era duplo. Um CR e um LF.
Agora, se você reler o significado desses caracteres talvez faça mais sentido.
Um CR, "voltar para o início da linha", posiciona o cabeçote junto à margem esquerda, e um LF, "ir para a próxima linha", avançava o papel o suficiente para que novas impressões sejam feitas abaixo das anteriores.
Vamos definir uma tarefa de impressão, que será utilizada em exemplos a seguir: Imprimir "Oi" no início da linha e "--" abaixo (sem as aspas).
Imaginando o fluxo de dados enviado para a impressora para executar a tarefa definida, depois de iniciarmos a comunicação com a impressora, esta reage a cada caractere enviado.
Enviamos "O", imprime "O", enviamos "i", imprime "i", enviamos CR, volta o cabeçote para o início da mesma linha, enviamos LF, a impressora avançava o papel uma linha, enviamos "-", imprime "-", enviamos "-", imprime "-".
Isso foi o suficiente para concluirmos a tarefa.
Me parece que isso esclarece bem o significado de CR e LF.
Imprimindo na IBM 1132
Agora vou falar de "impressora de linha". Também muito antiga, porém mais moderna que a citada anteriormente. Um exemplo: IBM 1132
Essas impressoras não tinham, como na Teletipo Modelo 33, um cabeçote que se reposicionava para imprimir um caractere em diferentes posições na linha.
Essas impressoras tinham 132 "cabeçotes" fixos, um "cabeçote" para cada possível posição de impressão na linha, e imprimiam em um formulário largo.
Só por curiosidade, exatamente esse modelo de impressora de linha eu cheguei a utilizar na UFF.
Agora, imaginando o fluxo de dados enviado para a impressora para executar a tarefa definida e a reação desta a cada caractere enviado.
Enviamos "O", prepara o primeiro cabeçote para imprimir "O", enviamos "i", prepara o segundo cabeçote para imprimir "i", (não enviamos CR, afinal não existe para ela "mover cabeçote") enviamos LF, entende que tudo está preparado para a impressão da linha, então todos os cabeçotes imprimem ao mesmo tempo, ou seja, é impresso "Oi", então, avançava o papel uma linha e reposiciona todos os cabeçotes para "imprimir" espaço (equivalente a não imprimir nada), enviamos "-", prepara o primeiro cabeçote para imprimir "-", enviamos "-", prepara o segundo cabeçote para imprimir "-", enviamos LF, manda "--" para o papel, avançava o papel uma linha e reposiciona todos os cabeçotes.
Esse segundo exemplo foi mostrado para levantar dois pontos importantes.
Primeiramente, para ficar claro que não é obrigatório o uso dos mesmos comandos em todos os contextos. Dependendo do contexto o uso dos comandos pode mudar. Na primeira impressora o CR era necessário. Na segunda não.
Além disso, há contextos em que um caractere de comando é útil para indicar um estado, não apenas para indicar uma ação. No caso, estou falando do uso do LF, que, mais que comandar "avance o papel", indica que a linha está concluída.
Voltando aos tempos atuais, lembro dois pontos semelhantes aos apresentados acima, porém em outros contextos.
Primeiramente, o uso de CR e/ou LF para indicar fim de cada linha em um arquivo de texto, que muda conforme o contexto. No caso, conforme o sistema operacional.
Além disso, arquivos de configuração muitas vezes exigem que linhas com informações relevantes apresentem um indicador de fim de linha, mesmo que não haja nenhuma informação a ser apresentada na próxima linha.
Conclusão
Enfim, espero que o assunto "fim de linha" tenha ficado bem mais claro para vocês agora.
Links
- Tabela ASCII
- Impressora Teletipo Modelo 33
- Impressora IBM 1132