Testando a linguagem bc no toybox 0.8.5

Testando a linguagem bc no toybox 0.8.5
Testando a linguagem bc no toybox 0.8.5 (referencia da calculadora, clique aqui)

    Esses dias postei no Instagram sobre os testes que estou realizando com a linguagem bc do terminal de comandos toybox. E como vi que teve uma boa repercussão pelo pessoal de meio acadêmico, então resolvi postar aqui também.

    Em Novembro de 2018 foi anunciado que o terminal de comandos toybox receberia suporte ao comando bc (confira aqui). Na verdade bc é uma linguagem Para realizar cálculos arbitrários ou simplesmente uma calculadora em linha de comando com suporte a linguagem de Turing compelto.

    Na versão 0.8.3 de maio de 2020, a linguagem entrou para a versão pendente. Como a versão 0.8.5 (o anuncio do lançamento pode ser conferido clicando aqui) foi lançada em Maio deste ano, eu resolvi verificar o progresso do comando.

Solucionando o problema de cálculos no Bash

    Realizar cálculos através do terminal de comandos não é nenhuma novidade. Isso é algo que há muito tempo já é natural de se realizar através de comandos como o echo.

Realizando cálculos através do comando echo.
Realizando cálculos através do comando echo.

    Porém, diferente do Ksh e o Zsh que são terminais muito mais poderosos (venha aprender mais sobre o zsh comigo clicando aqui), o Bash carece de suporte a unidade de ponto flutuante como pode conferido no exemplo abaixo:

Erro que ocorre no Bash ao tentar realizar calculo com valores quebrados.
Erro que ocorre no Bash ao tentar realizar calculo com valores quebrados.

    Mas para que você iria querer realizar este tipo de calculo pelo terminal? Pode ser que você precise escrever um shellscript que faça calculos de números exatos (não se sabe). 

    A questão é que no dia a dia, para facilitar as nossas vidas, nós arredondamos os valores; como é o caso da medida de onça que arredondamos para 30 gramas sendo que seu valor de real é de 28,3 gramas (mais especificamente 28,3495). O mesmo ocorre com outras medidas como galão (3785,41 mililitro) ou milha que corresponde a 1,6km (1,60934 km) e assim por diante. Dando um exemplo de situação na tecnologia é a velocidade de download da internet. Supondo que sua rede seja de 5 Megabits, o valor real dela é de 0.625Kbps e a de 10 Megabits corresponde a 1,25Kbps.

O comando (linguagem) bc como uma das soluções para o Bash

    Então, para solucionar este problema no Bash e obter resultados deste tipo de cálculo, é necessário utilizar algum tipo recurso externo como as linguagens Perl, awk (linguagem que eu gosto muito. Quem gosta de awk? Só eu mesmo...) e bc. bc é uma linguagem aritmética de precisão arbitrária (Página do Opengroup.org e do Plan9).

Solucionando o cálculos de ponto flutuante no Bash com a linguagem bc
Solucionando o cálculos de ponto flutuante no Bash com a linguagem bc

    Não é necessário digitar a sintaxe do bc conforme mostrei para obter o resultado do calculo; essa é uma das formas de se utilizar o comando. Digitando apenas bc, o terminal aparenta estar em hibernação, mas na verdade o terminal entra em um ambiente aguardando para receber informações (entrada). Ou seja, ele se torna uma calculadora.

Executando bc como uma calculadora.
Executando bc como uma calculadora.

Versão do bc no toybox

    A versão que utilizamos anteriormente foi desenvolvido por Philip A. Nelson (philnelson@acm.org) e forte participação de Steve Sommars (Steve.Sommars@att.com).

    Já na versão do toybox (desenvolvido por Gavin D. Howard e outros contribuidores) que apesar de que o terminal ainda está na versão 0.8.5 (estando 80% pronto para os seus objetivos), sua versão da linguagem bc já é funcional estando na versão 1.1.0, realiza as mesmas funções e ainda consegue ser mais amigável (o que é algo bem mais interessante pois desta forma o usuário sabe que está dentro de um ambiente).

Comando bc do toybox em sua versão 1.1.0
Comando bc do toybox em sua versão 1.1.0. Caso queira sair do ambiente de calculadora, ao pressionar a sequencia de teclas ctrl+c, o bc enviará a mensagem pedindo para digitar quit para sair.

Opções do comando bc do terminal toybox
Opções do comando bc do terminal toybox

awk como mais uma das soluções para o Bash

    Outro forma de realizar os mesmo cálculos é utilizando o awk que é uma linguagem de processamento que surgiu na  AT&T Bell Labs. awk possui suporte a TCP/IP, é data-driven e é rica em expressões regulares (é possível até mesmo escrever seu scripts #!/usr/bin/awk -f).

    Devido a forte adoção de linguagens como Python, pode aparentar que awk ganhando ganhe destaque no mercado; mas acredite ou não, há empresas que contratam pessoas que tenham como qualidade saber shell script ou awk ou perl.

    Eu o conheci conheci awk utilizando a linguagem como os comandos grep e cut (e que inclusive há casos de retornar melhores resultados que ambos os comandos); mas é possível utilizá-la também para realizar os mesmo cálculos que bc.

Realizando o mesmo calculo em ponto flutuante, porém, com a linguagem awk.
Realizando o mesmo calculo em ponto flutuante, porém, com a linguagem awk.

    Porém, se tentar realizar o calculo de rede para descobrir a velocidade da sua rede (supondo que 5Megabits), a bc irá retornar o valor 0 (zero). Porém, utilizando a opção -l (ou --mathlib que utiliza rotinas matemáticas pré-definidas) a linguagem bc traz os resultados exatos do calculo. 

utilizando a linguagem bc com a opção --mathlib para rotinas matemáticas pré-definidas
utilizando a linguagem bc com a opção --mathlib para rotinas matemáticas pré-definidas

    Então, outras três opções a serem exploradas na linguagem bc são a -s (--standard para erro se quaisquer extensões non-POSIX forem utilizadas), a opção -w  (--warn para aviso se quaisquer extensões non-POSIX forem utilizadas) e a possibilidade de trabalhar com escala:

Trabalhando com escala de dentro do bc.
Trabalhando com escala de dentro do bc.

Trabalhando com escala como comando no bc.
Trabalhando com escala como comando no bc.

    Já a linguagem awk consegue naturalmente retornar a resposta de forma mais exata (o que não torna awk melhor que bc, apenas realiza a mesma função).

Calculando a velocidade de download com a linguagem awk
Calculando a velocidade de download com a linguagem awk

    Ambas as linguagens são muito boas para realizar este tipo de operação, mas a linguagem bc é especializada em cálculos. Vale a ressalva que bc é realmente uma linguagem permitindo que você até mesmo programe definindo variáveis, condicionais e loops (algo que pode ser estudando a manpage da bc); calcular a divisão casas decimais; potência; raiz quadrada; o valor de pi; converter o número hexadecimal 2D para decimal; converter o números decimais em hexadecimal, octal e binário; verificar se números são pares ou ímpares e muito mais.

Código para executar os números de Fibonacci.Código para executar os números de Fibonacci.
Código para executar os números de Fibonacci.



Exemplo de código bc extraído de sua man page (man 1 bc)
Exemplo de código bc extraído de sua man page (man 1 bc)

Outro exemplo de código bc extraído de sua man page (man 1 bc)Exemplo de código bc extraído de sua man page (man 1 bc)

Dicas finais

    Bom, além de ter em mãos duas soluções para cálculos utilizando ponto flutuante, três outras dicas que eu deixaria seriam:
  1. Analisar qual o melhor terminal para escrever seus scripts (geralmente os professores tem um forte vício em ensinar utilizando #!/bin/bash e o que pode ser um grande erro. De repente #!/bin/sh pode ser uma opção melhor).
  2. Foquem também awk para melhorar os seus scripts.
  3. venha aprender Linux comigo porque aqui você aprende de verdade e sem papo de ideologia ou filosofia ;)

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 (2) ambiente gráfico (19) AMD (14) analise (10) Andriod (16) android (7) Apple (1) arm (5) artigo (5) aws (1) bc (23) benchmark (6) BetrFS (1) blackhat (1) BSDs (31) btrfs (32) bugs (2) Caixa de Ferramentas do UNIX (19) canto do Diego Lins (2) certificações Linux (7) Código Fonte (54) comandos (33) comp (1) compressores (7) container (8) CPU (19) cracker (1) criptografia (5) crowdfunding (9) cursos (24) daemons (13) Debian (31) desempenho (2) desenvolvimento (97) desktop (19) DevOps (3) DevSecOps (4) dic (1) Dica de leitura (91) dica DLins (2) dicas do Flávio (27) Dicas TechWarn (1) diet libc (3) diocast (1) dioliunx (3) distribuições Linux (14) Docker (13) DragonflyBSD (22) driver (1) dropbear (3) 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 (11) filesystem (82) financiamento coletivo (2) fork (4) fox n forests (4) FreeBSD (21) Funtoo Linux (13) games (94) garbage collector (1) gerenciadores de pacotes (4) glaucus (6) GOG (3) google (9) gpu (3) hacker (2) hardware (104) hash (1) helenos (3) I.A (1) init system (12) Intel (15) inteligencia artificial (2) IoT (1) ispconfig (1) jogos (38) kde (1) kernel (140) 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 (172) musl (3) não viva de boatos (9) navegadores (5) NetBSD (7) newlib (1) nim (6) nintendo (1) novatec (17) novidades (1) nuvem (1) o meu ambiente de trabalho (3) off-topic (12) open source (84) OpenBSD (7) OpenShift (1) oracle (1) os vários sabores de Linux (44) padrim (2) palestras e eventos (5) partições (6) pentest (8) performance (1) pipewire (1) plan9 (2) playstation (1) processadores (30) professor Augusto Manzano (11) Programação (67) promoção (1) propagandas com Linux (8) ps4 (1) real-time. (1) Red Hat (23) 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 (13) segurança digital (24) servidor web (2) servidores (3) shell (9) shell script (8) sistema operacional (25) skarnet (2) smartphones (3) Software livre e de código aberto (151) sorteio (3) Steam (10) Steam no Linux (8) supercomputadores (4) suse (6) systemd (8) terminal (89) terminal de comandos (19) toca do tux (1) toybox (27) tutorial (6) Tux (3) unboxing (7) UNIX (17) UNIX Toolbox (14) vartroy (1) vga (1) virtualização (3) vulnerabilidade (6) wayland (5) web (1) whatsapp (1) whitehat (1) Windows Subsystem for Linux (2) wine (14) WoT (1) yash (1) ZFS (16) zsh (3)