Então, tentei fazer um pouco de pesquisa sobre isso, procurando os manuais PDP-10 / TOPS-10 para descobrir qual era o estado da arte antes dos tubos. Achei isso , mas o TOPS-10 é notavelmente difícil de pesquisar no Google. Existem algumas boas referências sobre a invenção do pipe: uma entrevista com McIlroy , sobre a história e o impacto do UNIX .
Você tem que colocar isso no contexto histórico. Poucas das ferramentas e conveniências modernas que tomamos como garantidas existiam.
"No início, Thompson nem programava no próprio PDP, mas usava um conjunto de macros para o montador GEMAP em uma máquina GE-635". (29) Uma fita de papel foi gerada no GE 635 e depois testada em o PDP-7 até que, de acordo com Ritchie, "um kernel Unix primitivo, um editor, um assembler, um shell simples (interpretador de comandos) e alguns utilitários (como os comandos rm, cat, cp do Unix) foram concluídos. Nesse ponto, o sistema operacional era autossuficiente, os programas podiam ser escritos e testados sem recorrer à fita de papel e o desenvolvimento continuou no próprio PDP-7 ".
Um PDP-7 se parece com isso . Observe a falta de uma tela interativa ou disco rígido. O "sistema de arquivos" seria armazenado na fita magnética. Havia até 64kB de memória para programas e dados.
Nesse ambiente, os programadores tendiam a endereçar o hardware diretamente, como emitindo comandos para girar a fita e processar os caracteres, um de cada vez, lidos diretamente na interface da fita. O UNIX forneceu abstrações sobre isso, de modo que, em vez de "ler do teletipo" e "ler da fita" serem interfaces separadas, elas foram combinadas em uma, com a adição de canal crucial de "leitura da saída de outro programa sem armazenar uma cópia temporária no disco" ou fita ".
Aqui está McIlroy sobre a invenção de grep
. Eu acho que isso faz um bom trabalho de resumir a quantidade de trabalho necessária no ambiente pré-UNIX.
"O Grep foi inventado para mim. Eu estava criando um programa para ler texto em voz alta por meio de um sintetizador de voz. Como eu inventei as regras fonéticas, verificaria o dicionário de Webster em busca de palavras que possam falhar. Por exemplo, como você lida com o dígrafo ' ui ', que é pronunciado de várias maneiras diferentes:' fruit ',' guile ',' culpado ',' angústia ',' intuit ',' beguine '? Eu dividiria o dicionário em pedaços que se encaixam no buffer limitado do ed um comando global para selecionar uma lista. Eu desagregaria essa lista repetindo varreduras com ed para ver como cada regra proposta funcionava. "
"O processo foi tedioso e terrivelmente inútil, já que o dicionário teve que ser dividido (não era possível deixar uma cópia dividida on-line). Em seguida, ed copiou cada parte para / tmp, digitalizou-a duas vezes para realizar o comando g, e finalmente jogou fora, o que também leva tempo ".
"Uma tarde, perguntei a Ken Thompson se ele poderia retirar o reconhecedor de expressões regulares do editor e criar um programa de uma passagem para fazê-lo. Ele disse que sim. Na manhã seguinte, encontrei uma nota no meu correio anunciando um programa chamado grep. Funcionou como um encanto. Quando perguntado sobre o que esse nome engraçado significava, Ken disse que era óbvio. Representava o comando do editor que simulava g / re / p (expressão regular global impressa) ".
Compare a primeira parte disso com o cat names.txt | awk '{print $2 ", " $1}' | sort | uniq | column -c 100
exemplo. Se suas opções são "construir uma linha de comando" versus "escrever um programa especificamente para esse fim, manualmente, em assembler", vale a pena construir a linha de comando. Mesmo que demore algumas horas lendo os manuais (em papel) para fazê-lo. Você pode anotá-lo para referência futura.