1 pontos por GN⁺ 2024-07-19 | 1 comentários | Compartilhar no WhatsApp
  • Breve entrevista com o Dr. Brian Kernighan, criador do AWK

    • Apresentação do Dr. Brian Kernighan

      • Dr. Brian Kernighan é um cientista da computação canadense que contribuiu para o desenvolvimento do UNIX no Bell Labs
      • Coescreveu com Dennis Richie o livro fundamental sobre a linguagem de programação C, "The C Programming Language"
      • Desde 2000, vem formando a próxima geração de programadores na Princeton University
      • É famoso por ter escrito o primeiro programa "Hello World!"
    • A nova ideia do AWK

      • A principal ideia do AWK são os arrays associativos (associative arrays)
      • Na época, era um conceito novo, mas hoje é usado na maioria das linguagens como função de biblioteca (hashmaps em Java ou C++) ou como parte da própria linguagem (dictionaries em Perl e Python)
      • Arrays associativos são estruturas muito poderosas e podem ser usados para simular vários tipos de estruturas de dados
      • O paradigma pattern-action também não era amplamente usado na época, mas é uma forma eficaz de organizar certos tipos de computação
    • Referências usadas ao criar a linguagem de programação

      • Dr. Kernighan: "Nenhuma"
      • Na década de 1970, havia muitas novas linguagens de propósito específico, e quase não existiam referências anteriores que servissem de base
      • Yacc foi uma ferramenta importante por permitir criar e experimentar gramáticas com facilidade
      • Lex desempenhava o mesmo papel no nível lexical, substituindo muito código tedioso por um conjunto de regras
      • Lex e Yacc são exemplos de linguagens pattern-action e formavam um ciclo positivo entre si
    • Conselho para jovens interessados em design de linguagens de programação

      • Ele aconselha projetar e implementar uma pequena linguagem de propósito específico
      • Isso é muito divertido e útil, além de ser bem mais fácil do que criar uma linguagem alternativa ao Rust ou ao C++
      • Recomenda encontrar uma tarefa que possa ser automatizada e criar um compilador simples com runtime
      • Um artigo relacionado escrito por Jon Bentley há muito tempo ainda continua atual
    • Fonte da imagem

      • Wikimedia Commons

Resumo do GN⁺

  • Dr. Brian Kernighan é uma figura importante que contribuiu para o desenvolvimento do UNIX e da linguagem C, além de ser o criador da linguagem AWK, que introduziu os arrays associativos e o paradigma pattern-action
  • Arrays associativos são estruturas de dados poderosas usadas hoje na maioria das linguagens de programação
  • Para jovens programadores, projetar e implementar uma pequena linguagem de propósito específico pode ser muito proveitoso
  • Yacc e Lex são ferramentas que facilitam a análise gramatical e lexical e são bons exemplos de linguagens pattern-action

1 comentários

 
GN⁺ 2024-07-19
Opiniões no Hacker News
  • Curiosidades pouco conhecidas sobre Brian Kernighan: ele entrou para o departamento de Ciência da Computação de Princeton em 2000, mas, quando ainda estava na Bell Labs Research, por volta de 1993, já havia dado pelo menos uma disciplina em Princeton.
    Um aluno costumava levar com frequência um notebook 386sx rodando Linux pré-1.0, e dizem que, quando Brian não se lembrava dos detalhes do comportamento do awk, esse aluno executava comandos awk e mostrava a “implementação correta”. Então Brian acabou tendo contato com Linux relativamente cedo.
    Há também um texto de 1994 em que ele colocou na internet a lista telefônica gratuita da AT&T: https://www.cs.princeton.edu/~bwk/800.html

    • Fico em dúvida se gawk é a implementação de referência do awk, ou se na verdade quem era bem diferente era o gsed
    • Dá a impressão de que “aquele aluno” era o próprio autor do comentário
  • Se houver interesse, a entrevista de uma hora e meia que Lex Fridman fez com BK é muito boa: https://www.youtube.com/watch?v=O9upVbGSBFo

    • O canal Computerphile no YouTube também tem muitas entrevistas com BK: https://www.youtube.com/results?search_query=computerphile+kernighan
      Às vezes sinto que viver nesta época é um privilégio enorme. É parecido com um matemático poder entrevistar Euler, ou um físico poder entrevistar Newton
    • Antigamente eu tinha visto algumas palestras dele e achado meio fracas, mas esta entrevista parece bem boa desde o começo, quando a conversa de verdade começa depois do anúncio
  • O livro Masterminds of Programming traz uma entrevista mais abrangente, incluindo Aho e Weinberger. Recomendo muito

  • Nesta semana estou lendo The Unix Programming Environment, de 1983, ou seja, com uns 35 anos de atraso. No livro, o awk realmente se destaca, e parece ser o que há de mais próximo das linguagens populares de hoje, como JavaScript, Lua, Python, Perl e Tcl.
    O que awk chama de “arrays associativos”, JavaScript chama simplesmente de “objetos”. O código-fonte do awk no Unix 7ª edição, de 1979, tem apenas 2.680 linhas segundo https://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/awk, e é impressionante que o executável tivesse 46 KB e rodasse no espaço de endereçamento de 64 KB do PDP-11. Parece que essa versão, e o awk apresentado no livro quatro anos depois, ainda não tinham funções definidas pelo usuário; o mesmo provavelmente valia para o V7 Bourne shell. Mas o bc tinha

    • O awk sem funções definidas pelo usuário é conhecido como old awk, ou também pelo nome retroativo oawk. No Heirloom ainda existe uma implementação que parece ser descendente dele, junto com o nawk, mais familiar: https://heirloom.sourceforge.net/man/awk.1.html
      O executável de 46 KB também era um pouco maior que o Turbo Pascal 3.02: https://prog21.dadgum.com/116.html Claro que o Turbo Pascal não tinha motor de expressões regulares
    • awk vai além disso. Olhando elementos como a palavra-chave function, for e in a, sintaxe sem ponto e vírgula, tratamento de tipos centrado em strings e delete x[e], fica bem claro que o awk foi uma base do JavaScript, e Brendan Eich também disse isso: https://brendaneich.com/2010/07/a-brief-history-of-javascript/
    • Li o mesmo livro e cheguei exatamente à mesma conclusão. Depois, ao ler The UNIX-Haters Handbook, passei a sentir que ferramentas Unix como awk, infelizmente, já não são boas o suficiente
    • Escrever como 01983, 01979 não é uma forma de escrever anos e, na verdade, é estranho até como forma de escrever números
    • Fiquei bem confuso com o 0 antes do ano. Achei que fosse algum formato de data obscuro
  • Lembro que, muito tempo atrás, alguém escreveu numa .sig da Usenet: “Perl é margarina, awk é manteiga”. Talvez a ordem fosse a inversa
    Perl tem muitos defeitos, mas, depois que descobri Perl, passei a usar awk muito menos

  • Tenho um exemplar de K&R autografado pelo Dr. Kernighan em uma conferência Unix na Austrália nos anos 80. É uma das coisas de que mais gosto
    Esse livro, The Practice of Programming, de Kernighan/Pike, e coisas como a revista Byte eram meu “Stack Overflow” dos anos 1980

  • É interessante vê-lo falar de arrays associativos como algo “relativamente novo”. Afinal, eles já existiam em Lisp havia quase 20 anos

    • Antes da internet, mesmo sendo experiente e conhecedor em uma área, era fácil nunca ter tido contato com algo que outra comunidade considerava básico, ou ver essas ideias se espalharem lentamente ao longo de décadas
      Mesmo quando comecei a programar nos anos 1990, uma boa parte do mundo C via estruturas de dados associativas, como tabelas hash, como algo meio exótico, para ser usado só quando realmente não havia alternativa. Achamos que o mundo da programação se move rápido, mas na prática não é bem assim — especialmente naquela época, era ainda mais lento. Muitas vezes, recursos que surgiram em alguma linguagem nos anos 1960–70 levaram décadas para ser amplamente adotados. O Lisp também tinha desempenho bem pior que outras opções da época, então talvez não fosse um bom caso para promover seus recursos
    • O PDF gratuito da primeira edição de The AWK Programming Language diz que os arrays associativos foram inspirados nas tabelas do SNOBOL4, mas não eram mais gerais
      O awk nasceu em máquinas lentas e com pouca memória, e as propriedades de seus arrays também foram resultado desse ambiente. Exemplos disso são limitar os subscritos a strings e, apesar do açúcar sintático, restringi-los a uma dimensão. O texto diz que uma implementação mais geral teria permitido arrays multidimensionais ou, no mínimo, arrays como elementos de arrays. A versão estável do SNOBOL4 é de 1967: https://en.wikipedia.org/wiki/SNOBOL
    • Common Lisp, naturalmente, tem tabelas hash embutidas. No MacLisp, mesmo olhando o Pitmanual, parece que não há; já em ZetaLisp/LML e InterLisp há
      Portanto, se não incluirmos alists ou listas de propriedades como arrays associativos embutidos em Lisp, isso parece ser praticamente da mesma época em que o awk nasceu, ou um pouco posterior
    • As alists do Lisp também são, em certo sentido, “arrays associativos”, mas são estruturas feitas com listas, não exatamente um recurso da linguagem, e não são eficientes o suficiente para os usos feitos em awk
      Em qualquer linguagem, dá para criar em poucos minutos algo parecido com um array associativo usando busca linear, mas isso é completamente diferente de algo embutido como recurso da linguagem, como em SNOBOL4, MUMPS, awk, Perl, Python, Tcl, Lua e JavaScript. O que o Lisp inicial oferecia para estruturar dados era cons, car, cdr, e isso não é a mesma coisa. Antes do awk, dentro do Unix também havia programas com arrays associativos, como símbolos do linker, compiladores C, assemblers, o kernel em forma de diretórios do sistema de arquivos e variáveis do shell, mas isso não era oferecido como recurso de linguagem de programação. O Bourne shell era o que chegava mais perto, pois dava para simular concatenando nomes de variáveis, como em eval myarray_$key=$val, e o tratamento de variáveis de shell no Bourne shell do V7 era implementado com busca em árvore binária
  • O fluxo de desenvolvimento que vai de expressões regulares para lex, yacc e awk é muito impressionante. Fica convincente a sensação de que eles construíram sobre trabalhos anteriores para chegar a resultados mais gerais

  • Sei que vou apanhar por dizer isso, mas acho que no GitHub há muitos programadores com repositórios mais bem escritos do que os desses lendários nomes da programação. Naquela época, o conjunto de talentos era muito menor

    • Fico curioso para saber quem, entre as pessoas de hoje, você considera excelente. É sempre divertido acompanhar a carreira e o que anda fazendo a nova geração
    • Acho que ninguém jamais afirmou que Brian Kernighan foi o melhor programador da história
    • É uma pergunta ingênua, mas tenho curiosidade real. Como se mede que alguém é melhor?