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.
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:
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).
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.
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. 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. |
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.
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 |
Trabalhando com escala de dentro do 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).
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:
- 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).
- Foquem também awk para melhorar os seus scripts.
- venha aprender Linux comigo porque aqui você aprende de verdade e sem papo de ideologia ou filosofia ;)
QUER APRENDER A UTILIZAR LINUX DE VERDADE, ENTÃO VENHA APRENDER COMIGO ;) |
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.