Entrevista com Gavin Howard - O autor da linguagem bc do toybox

 

Entrevista com Gavin Howard - O autor da linguagem bc do toybox

    Recentemente eu postei em meu blog sobre o lançamento do bc 5.0 desenvolvido por Gavin Howard. Eu venho acompanhando o bc do Gavin desde de Noembro de 2018 quando foi anunciado que iria desenvolver um patch para o toybox. Também postei nom eu Instagram que estava testando a linguagem bc do Gavi mesmo que estava como pendente no  Toybox e desde então boas coisas vem aconcentendo. Uma delas é que eu conheci o próprio Gavin Howard que nos concedeu essa incrível entrevista. Espero que gostem :)


Gabriel: Antes muito obrigado por aceitar meu convite para essa entrevista.

Gavin: Muito obrigado! Muitas pessoas não ligam para a bc, então é legal que alguém ligue pelo menos uma vez. :)

Gabriel: Poderia nos contar um pouco sobre você? (Vida pessoal e profissional)

Gavin: Me formei na universidade há alguns anos em ciências da computação. Desde então, eu venho trabalhando em projetos pessoais enquanto lutava para conseguir e não conseguia manter um emprego. Minha esposa é a provedora. Tenho certeza que falhei em mantes empregos por causa de habilidades sociais, então eu sugeriria ao seu publico que eles desenvolvam essas habilidades cedo, mesmo que seja difícil.

    Desde meu emprego antigo, eu venho trabalhando na bc e em outro software, mas eu vou falar sobre esse software depois.


Gabriel: Por que decidiu desenvolver a bc?

Gavin: Só aconteceu, de verdade. Eu estava desempregado, alguém me pediu para construir um analisador para bc porque queria fazer a biblioteca matemática. Eu decidi fazer isso para experiencia de currículo.

    Bom, uma vez que eu desenvolvi o analisador, ele ainda não havia concluído, então eu decidi mergulhar e eu mesmo escrever a matemática. A essa altura, eu tinha um bc totalmente funcional. Levei coisa de um mês.

    E desde então eu venho a aperfeiçoando. Já fazem três anos e meio desde que eu concluí a implementação original. 


Gabriel: Quais são as principais diferenças entre o GNU bc e seu bc?

Gavin: Você mencionou que meu bc não possui alguns bugs que o GNU bc possui. Eu gostaria de explicar isso.

    bc é um programa que é padronizado pela POSIX. POSIX é um conjunto de padrões para sistemas operacionais que a maioria segue, incluindo Linux e Mac OSX (até certo ponto). POSIX não possui padrões somente para o sistema operacional; alguns padrões são para as ferramentas que o sistema operacional deve possuir agregadas a si. Entre estas estão o comando `ls`, o comando `mkdir`, o comando `ln` e o comando `bc`.

    O padrão bc define o que o bc tem que fazer e como deve se comportar. Se você escrever os seus scripts bc para seguir exatamente esse padrão, você pode muito bem contar com seu script executando em qualquer bc.

    O bug do GNU bc geralmente tem a ver com desvios do padrão bc. O meu bc não se desvia desse padrão de forma alguma, exceto por extensões que podem ser desabilitadas.

    Além disso, meu bc possui *muito* mais extensões que o GNU bc, que sim, possui algumas extensões. As extensões que meu bc possui e o GNU bc não inclui:
  1. Um gerador de número pseudo-aleatório semeado que gerará números de tamanhos arbitrários. Isso permite os usuários gerar números pseudo-aleatórios em Bash scripts.
  2. Um jeito de realizar entrada e saída de números em notações cientificas e de engenharia.
  3. Atribuir de strings a variáveis, passá-las para funções, e retorná-las das funções.
  4. Algumas funções extras builtin (abs()modexp()divmod()asciify() e etc).
  5. Alguns operadores extras para truncamento, extensão, e deslocamento decimal (não bitwise).
  6. Uma biblioteca matemática estendida com um monte (94, eu acho?) de extras funções uteis de matemáticas. (Uma função não é realmente útil exceto para a biblioteca em si).
  7. Uma flag de linha de comando para tornar mais fácil de cuidar de globals (ibaseobase, e scale).
Gabriel: Em uma conversa particular que tivemos, você me contou que seu bc foi adotado pela equipe do toybox para ajudar a construir o kernel Linux. Pode nos dar mais detalhes disso?

Gavin: No kernel Linux, há um header que precisa ser gerado durante a build. Esse header (include/generated/timeconst.h, veja https://github.com/torvalds/linux/blob/5bfc75d92efd494db37f5c4c173d3639d4772966/Kbuild#L16) possui as constantes para quantos milissegundos o kernel deve esperar antes de interromper um processo. Basicamente, esse header define o tamanho de fatias de tempo (https://en.wikipedia.org/wiki/Preemption_(computing)#Time_slice).

    Para gerar esse header, o kernel possui uma opção (CONFIG_HZ, encontrado em "Processor type and features" -> "Timer Frequency") que define o número de vezes por segundo que o kernel deve antecipar os processos. Essa frequencia precisa ser convertida numero de milissegundos por fatia. Originalmente, o script para fazer isso era em bc. Foi mudado para Perl por causa de bugs no GNU bc, mas retornaram depois que esses bugs podiam ser trabalhados ou corrigidos (veja https://github.com/torvalds/linux/commit/70730bca1331fc50c3caacaea00439de1325bd6e). O scritp é o kernel/time/timeconst.bc (https://github.com/torvalds/linux/blob/5bfc75d92/kernel/time/timeconst.bc).

    A razão que o bc é utilizado ao invés de Perl é porque bc é padrão POSIX, então o Linux pode esperar que ele exista no sistema, enquanto que Perl precisa ser explicitamente instalado. Dito isso, o script timeconst.bc  do Linux utiliza algumas extensões do GNU, que vence o propósito.

    Até aquele momento, o toybox não tinha o bc, e então, por si só, ele não era o suficiente para construir o kernel Linux, e devido o script Linux timeconst.bc utilizava extensões GNU, ele realmente precisava do GNU bc. Com essa adição do meu bc, que possui todas as extensões do  GNU bc, o toybox se tornou capas de construir o Linux sem quaisquer outras utilidades externas, um conquista memorável para o autor do toybox.

código bc dentro do Linux
código bc dentro do Linux


Gabriel: Na minha opinião pessoal, bc é um bom jeito de aprender a programas. Você concorda?

Gavin: Eu fortemente discordo, na verdade. A razão é proque há numerosas  armadilhas e ciladas que você pode cair quando escrever código bc (veja aqui https://git.yzena.com/gavin/bc/src/branch/master/manuals/development.md#lib-bc-1). Essas armadilhas incluem:
  1. Existem três variáveis globais (ibase, obase e scale) que controlam como o bc se comprota. Essas globais devem ser tratadas corretamente todo o tempo.
  2. As globais (ibase, obase e scale) devem ser salvas antes de ser modificadas em uma função, e devem ser restauradas antes de retornar de uma função.
  3. Se constantes são utilizadas, ibase deve ser explicitamente definida pela função (e restaurada antes de retornar) ou então as constantes serão implementadas da forma errada.
  4. Se a função exibir um número na saída, obase deve se explicitamente definida pela função (e restaurada antes de retornar) antes de exibir, ou o número será exibido de um jeito inesperado.
  5. Todas as variáveis  locais para a função devem estar em um auto statement no inicio da função, incluindo arrays. Se você não fizer isso, as variáveis ou arrays são presumidas ser globais e assim as versões globais serão utilizadas/modificadas. No entanto, "globais" nesse sentido *também* é errônea. Digamos que possui uma função que possui a variável `a` como uma variável local (ela aprece no auto statement). Se você chamar uma função que acessa uma "global" `a`, a `a` que ela acessa não a global verdadeira `a`, mas a versão de uma `a` na função que a chamou! Isso está no padrão, então eu não posso alterar isso, mas é algo a ser considerado.
  6. A ultima cilada é somente para código que quer ser portado para qualquer bc: você não pode utilizar *quaisquer* extensões.
    Essa ultima merece uma olhada mais de perto. O bc padrão POSIX é estrutura básica; ele não tem quase nada! Essas são algumas coisas que ele não possui:
  1. Nomes maiores do que um carácter.
  2. Clausulas `else` para `if` statements.
  3. A palavra-chave `continue` (apesar de possuir `break`).
  4. Um jeito fácil de exibir strings com caracteres escape (a palavra-chavet `print` no meu bc).
  5. Return statements *sem* parenteses.
  6. Você não pode comparar operadores fora `if` statements ou condinções loop.
  7. Você só pode somente utilizar *1* operador de comparação por `if` statement e loop, então nada de operadores `&&` ou `||`!
  8. Tecnicamente, parâmetros array são de alguma forma limitados também.
  9. Strings só podem ser exibidos e nada mais ser feito com ou a eles.
(Para tudo o que meu bc faz que bc padrão POSIX não, veja aqui see https://git.yzena.com/gavin/bc/src/branch/master/src/data.c#L265-L283).

    Dito isso, se você precisar escrever um script matemático em uma linguagem de números de precisão arbitrária, e Python não vai funcionar (Python possui suporte razoavelmente bom à matemática de precisão arbitrária), então bc pode ser o que você precisa.

    Além do mais, meu bc remove um monte dessas limitações. ela remove número 2 (se você utilizar a opção -g na linha de comando) e basicamente todas as limitações sob o número 6. O resto não pode ser eliminado porque eles não inerentes ao design do bc.

Gabriel: Como as pessoas podem contribuir para o seu projeto?

Gavin: Eu na verdade não recebo contribuições além de bug reports. Meu projeto atual está em https://git.yzena.com/Yzena/Yc, e eu explico minha politica em https://git.yzena.com/Yzena/Yc#open-source-not-open-contribution.

    A parte que *não* é escrita é que, Se eu mesmo escrever, eu posso garantir que o software está em tal alta qualidade que eu tenho vontade de assumir a responsabilidade por ele. Esse é o meu objetivo atual: Escrever software útil e aceitar responsabilidade por ele, por um preço. Eu acho que se eu não conseguir um emprego, eu posso gerar um emprego para mim ao vender software e aceitar responsabilidade por isso.

    (Mas mesmo se eu vender software, ele será open source! Eu só venderei proteção de responsabilidade, não o software em si).

    Dito isso, se você encontrar um bug no bc e concertá-lo, provavelmente eu ainda eu receba sua correção; eu nunca vou aceitar responsabilidade pelo bc. Você também é bem vindo em submeter bug reports para *todos* os meus programas.


Gabriel: Considerações finais?

Gavin: Atualmente estou escrevendo uma linguagem de programação, um build system e um VCS (Version Control System). Se qualquer pessoa do seu publico quiser me contatar com comentários ou perguntas sobre essas três coisas, ou sobre meu bc, eles são bem vindos. Eu vou tentar responder o mais rápido possível. Para encontrar meu endereço de e-mail, vá em https://gavinhoward.com/contact/.

Obrigado por me escutar!

Comente com o Facebook:

Nenhum comentário:

Postar um comentário

Viu algum erro e quer compartilhar seu conhecimento? então comente aí.

Observação: somente um membro deste blog pode postar um comentário.

Marcadores

A pior história sobre Linux que já ouvi (5) A.I (1) ambiente gráfico (19) AMD (14) analise (10) Andriod (16) android (7) Apple (1) arm (4) artigo (5) aws (1) bc (23) benchmark (6) BetrFS (1) blackhat (1) BSDs (29) btrfs (32) bugs (2) Caixa de Ferramentas do UNIX (19) canto do Diego Lins (2) certificações Linux (7) Código Fonte (54) comandos (30) comp (1) compressores (5) container (7) CPU (19) cracker (1) criptografia (5) crowdfunding (9) cursos (24) daemons (13) Debian (31) desempenho (1) desenvolvimento (90) desktop (19) DevOps (3) DevSecOps (4) dic (1) Dica de leitura (90) dica DLins (2) dicas do Flávio (27) Dicas TechWarn (1) diet libc (3) diocast (1) dioliunx (3) distribuições Linux (14) Docker (12) DragonflyBSD (22) driver (1) ead Diolinux (2) edição de vídeo (5) embarcados (1) EMMI Linux (4) emuladores (9) endless (5) English interview (3) Enless OS (2) entrevista (17) espaço aberto (82) evento (6) facebook (1) Fedora (10) filesystem (82) financiamento coletivo (2) fork (4) fox n forests (4) FreeBSD (20) Funtoo Linux (13) games (93) gerenciadores de pacotes (4) glaucus (2) GOG (3) google (8) gpu (3) hacker (2) hardware (104) hash (1) helenos (3) I.A (1) init system (10) Intel (15) inteligencia artificial (1) IoT (1) ispconfig (1) jogos (37) kde (1) kernel (138) lançamento (64) leis (1) LFCS (1) libs (2) licenças (8) Linus (16) linus torvalds (2) Linux (194) linux foundation (3) linux para leigos (1) live (5) LPI (8) LTS (1) Mac (1) machine learning (1) matemática (9) mesa redonda (27) microcontroladores (1) microsoft (6) microst (1) muito além do GNU (160) musl (3) não viva de boatos (9) navegadores (5) NetBSD (7) newlib (1) nim (1) nintendo (1) novatec (17) novidades (1) nuvem (1) o meu ambiente de trabalho (3) off-topic (12) open source (84) OpenBSD (6) OpenShift (1) os vários sabores de Linux (42) padrim (2) palestras e eventos (5) partições (6) pentest (8) performance (1) pipewire (1) plan9 (1) playstation (1) processadores (30) professor Augusto Manzano (11) Programação (64) promoção (1) propagandas com Linux (8) ps4 (1) real-time. (1) Red Hat (22) redes (4) resenha nerd (4) Resumo da Semana do Dlins (2) resumo do Tux (19) retrospectiva Linux (1) risc-V (14) RISCV (13) rtos (1) runlevel (2) rust (12) segurança digital (24) servidor web (1) servidores (2) shell (7) shell script (6) sistema operacional (25) smartphones (3) Software livre e de código aberto (151) sorteio (3) Steam (10) Steam no Linux (8) supercomputadores (4) suse (5) systemd (7) terminal (87) terminal de comandos (16) toca do tux (1) toybox (26) tutorial (6) Tux (3) unboxing (7) UNIX (17) UNIX Toolbox (14) vartroy (1) vga (1) virtualização (2) vulnerabilidade (6) wayland (5) web (1) whatsapp (1) whitehat (1) Windows Subsystem for Linux (2) wine (14) WoT (1) ZFS (15) zsh (3)