Mostrando postagens classificadas por relevância para a consulta tinycc. Ordenar por data Mostrar todas as postagens
Mostrando postagens classificadas por relevância para a consulta tinycc. Ordenar por data Mostrar todas as postagens

3 compiladores que são capazes de compilar o kernel Linux - TinyCC

Com o retorno da galera no vídeo Debian, Fedora e Open Mandriva adotando o LLVM. Mas e o kernel Linux? em saber quais são os três compiladores que compilam o kernel Linux além do GCC, resolvi essa semana então debater o primeiro compilador de nossa lista que é o TinyCC. Esses vídeos fazem parte da série Muito além do GNU que sempre abordo muitas outras ferramentas que constituem o sistema operacional Linux.


Me surpreendo ver que um compilador tão poderoso não tenha ganhado o real espaço que ele merece. E para complementar, eu já tinha a ideia de escrever este artigo acrescentado a informação complementar que no vídeo É possível que um dia Linux saia da GPL? de Janeiro deste ano, eu mostro qual a licença o TinyCC era disponibilizado e qual licença ele está disponível hoje:


Links para o projeto:
Velocidade do TinyCC em testes:
http://savannah.nongnu.org/projects/tinycc
https://lists.nongnu.org/mailman/listinfo/tinycc-devel
http://lists.nongnu.org/archive/html/tinycc-devel/

FORKS:
https://lists.nongnu.org/archive/html/tinycc-devel/2017-04/msg00010.html
http://lists.gnu.org/archive/html/tinycc-devel/2005-09/threads.html
http://packages.debian.org/unstable/devel/tcc

http://www.tocadotux.com.br/2018/01/morre-aboriginal-linux.html

Compilando o kernel Linux kernel em apenas um segundo

Compilando o kernel Linux kernel em apenas um segundo

    Na SUSE Labs Conference de 2018, Michael Matz apresentou um tour em seu hobby utilizando o TinyCC e o que é necessário para fazê-lo compilar um kernel Linux funcional. Eu já tratei sobre o TinyCC e sua capacidade de compilar o kernel em até uns 10 segundos. Já Michael apresentou o mesmo TinyCC compilando o kernel durante o processo de boot em apenas 1 segundo.


 Mas como já mencionei em um dos meus vídeos, o TinyCC ainda não está pronto para produção. Mas uma outra noticia muito interessante foi que um cara chamado Sedat reportou ao projeto LLVM que ele compilou uma uma toolchain LLVM otimizada ThinLTO+PGO versão 12.0.0-rc1 que reduz o tempo de compilação em aproximadamente um terço do tempo.

V coreutils: Um coreutils escrito na linguagem V

coreutils in V

V coreutils: Um coreutils escrito na linguagem V

 No ano passado eu escrevi o artigo uutils: Um coreutils escrito na linguagem Rust. Neste artigo eu mencionei que existia outro coreutils escrito na linguagem V (The V Programming Language (vlang.io). V é uma linguagem de propósito geral que foi projetada para ser simples e fácil de manter,  para oferecer bastante poder e poder ser utilizada em quase todos os campos como sistemas operacionais, web, jogos, interface gráfica, dispositivos móveis, ciência, embarcados e muito mais. Existe até mesmo um sistema operacional chamado Vinix escrito na linguagem V e que já roda Bash, GCC e V.

Vinix is an effort to write a modern, fast, and useful operating system in the V programming language.
Vinix: Um sistema operacional escrito na linguagem V

 V é similar a linguagem Go contendo melhorias que podem ser conferidas aqui e também influenciada por Oberon, Rust, Swift, Kotlin e Python. Vale lembrar que a linguagem V ainda está em versão beta (versão 0.4.4 no exato momento que escrevo este artigo) e o autor afirma que não haverá muitas mudanças, apenas melhorias.

Hot code reloading em V. altere as coisas instantaneamente sem recompilar.

 Agora vamos a o que nos interessa que é o coreutils escrito na linguagem V. o V coreutils visa ser uma versão do coreutils mais próximo possível das especificação POSIX e  com muitas extensões GNU (nisso o GNU é muito bom: extensões. apesar que a maior parte delas não foi desenvolvida pelo projeto GNU). A equipe procura desenvolver a implementação de cada comando mas que não seja 100% de paridade, especialmente peculiaridades e efeitos colaterais não intencionais. O V coreutils está sob a licença MIT.

 Eu resolvi compilar e testar os comandos do V coreutils e uma boa parte deles estão prontos; um total de 56 de 109 comandos. O processo de compilação é simples; primeiro baixe o V coreutils utilizando o comando:
git clone https://github.com/vlang/coreutils.git
 Ou baixe o pacote .zip. Com o compilador V instalado em sua máquina, digite o comando
v run build.vsh
 O processo de compilação leva pouco mais de 6 segundos para concluir (sim, muito rápido).

V coreutils compilation process
Tempo do processo de compilação do V coreutils


 A principio aqui ocorre um problema. Assim como ocorre com o Rust coreutils, achei o tamanho dos binários exageradamente enorme. O resulta do processo de compilação é um diretório bin de 60MB e facilmente cada binário ocupando 1MB mesmo linkados dinamicamente... O que é um exagero se levarmos em conta que cada binário deveria ter apenas bytes...


 Porém, eu consegui a informação com o Alexey, autor da V lang, para tentar executar o comando v -prod -skip-unused file.v. Unindo essa informação com a que eu encontrei dentro do arquivo Makefile, eu encontrei a solução de otimização dos binários executando:

v run build.vsh -prod -skip-unused

 O processo de otimização dos binários leva bem mais tempo para concluir (desta vez ~2.30 minutos para a conclusão) porém gerou binários bem menores, alguns tendo tendo 100K - 200K; alguns ainda continuaram grandes, mas OK. O diretório bin no final ficou com 11MB (quase seis vezes menor do que o anterior). O comando cp por exemplo, que anteriormente ocupava 1MB (1008K), passou a ocupar 200K ao ser otimizado. Ainda os considero grandes, mas já é um ganho enorme.

V coretutils: optmized binaries compilation time
V coretutils tempo de compilação de binários otimizados

Resultado do tamanho dos binários após utilizar as opções de otimização.


BUGS E REPORT

 Erros ainda serão visíveis. Temos que levar em conta que se trata de um programa que ainda está em sua versão 0.01, sendo desenvolvido em uma linguagem que ainda em versão beta e que faz uso de certa forma do compilador TinyCC que ficou parado por um longo tempo.


 Então se trata de um baita desafio pela frente. Por exemplo, o comando mkdir já passou na maioria dos testes manuais, mas um bug é fácil de reproduzir. Quando se cria um diretório com a opção -m e definindo as permissões que deseja (644 neste exemplo para fins de testes), ao listar o diretório criado você descobre que diretório foi criado com as permissões de escrita para o proprietário (w sendo que selecionamos leitura e escrita), leitura para outros e stick bit sendo que não selecionamos a opção de stick bit. Este é um bug que vou reportar mas também preciso descobrir se esse é um comportamento que o projeto já havia planejado


 O comando cp, ao tentar copiar um diretório para outro não existente, cria um arquivo vazio.



CONCLUSÃO

 Como já mencionei outras vezes, não existe GNU/Linux uma vez que nem todas as ferramentas que utilizamos nas distribuição são do GNU (alias, elas são a minoria) e as do GNU são substituíveis. Esse já não é o primeiro pacote de comandos que eu apresento aqui, facilmente podemos contar alguns como o embutils, o 9base, o ubase, o Rust Coreutils, o V coreutils, o FreeBSDcoreutils o ChimeraCoreutils e podemos utilizar também busybox ou o toybox e ainda mais outros podem existir.

 SEJA LIVRE DE IDEOLOGIAS INUTEIS.


O coreutils na linguagem V pode ser baixado aqui

Mais sobre o coreutils pode ser conferido aqui

Toca do Tux: A queda da GPL?
 

Rust no kernel Linux: A guerra sem trégua

Strap in, get ready for more Rust drivers in Linux kernel

Rust no kernel Linux: A guerra sem trégua

 Em 2023 eu escrevi o artigo Rust no Linux: Um caso de amor e ódio e depois dessa nova temporada de Rust no kernel, eu estava pensando em fazer um vídeo porém, como ando muito ocupado, preferi escrever aqui no blog mesmo.

 Bom, a treta de Rust no kernel Linux continua. Tentaram de todas as formas e contra todos os gostos promover Rust no kernel Linux, houve resistência por parte de muitos desenvolvedores e até mesmo de Linus Torvalds mas por fim, foi feita a adoção. Depois disso houveram novos problemas, o principal responsável por Rust no kernel saiu do projeto e em Fevereiro desse ano, começou o processo tudo de novo; ninguém dá trégua nessa bagaça. Muitos desenvolvedores não apoiam sua adoção mas a cartada final dada por Greeg Kroah-Hartman:

"Adicionar outra linguagem não deveria ser um problema, já lidamos com coisas muito piores no passado."

"Sim, bases de códigos de linguagens mistas são grosseiras e difíceis de manter, mas somos desenvolvedores de kernel, droga. A gente vem mantendo e fortalecendo o Linux por mais tempo que qualquer um já pensou que fosse possível"

 Não tem como discordar do Gregg nesse ponto já que nós sysadmins passamos bastante por situações parecidas, mas alguns até mesmo abandonaram o desenvolvimento como Karol Herbst que deixou o desenvolvimento do driver nouveau depois que adotaram o driver Nova como substituto do Nouveau; Christoph Hellwig bateu de frente com todos (inclusive com Linus) e esse debate parece não tem fim.

 Estamos em um período de transição na tecnologia onde novos processadores, novos chips e novas linguagens estão surgindo. Muito se fala hoje em dia sobre segurança de memória (apesar que este assunto já dura mais de 30 anos) e seus benefícios; Em 2017 foram reportados cerca 40 CVEs somente do kernel Linux relacionados a falhas de segurança de memória. Então, se for para o bem, sim eu acredito que uma linguagem que possua recursos relacionados a segurança de memória deva ser adotada no desenvolvimento do Linux, mas Rust não é esta linguagem; outras linguagens são muito mais interessantes para se integrar ao kernel Linux do que Rust, como é o caso de Lua e Nim. Bom, o argumento que podem apresentar é que Lua é uma linguagem interpretada por scripts. Sim, porém o NetBSD possui drivers escritos em Lua, o carregador de boot do FreeBSD é escrito em Lua e o interpretador do rpm é escrito em Lua:


 Lua é uma linguagem que facilmente se comunica com a linguagem C e C se comunica com tudo; geralmente é comum incorporar códigos C a alguma aplicação Lua para se comunicar com outras coisas. Lua na verdade já nasceu tendo como uma de suas características ser amigável com a linguagem C; inclusive um dos melhores recursos da linguagem Lua é exatamente o design de sua API que lhe permite integrar seu código a bibliotecas C ou fazer com que scripts Lua sejam executados de forma muito rápida junto ao código C dos jogos. Alias, se precisar portar seu código Lua para C, se torna uma tarefa muito mais fácil do que qualquer outra linguagem. E SIM, LUA POSSUI SUPORTE A SEGURANÇA DE MEMÓRIA!

 Eu conheci Lua por volta de 2007 ou 2008 em um PDF como uma linguagem para integrar a linguagem C e fazer coisas que a linguagem C não faz; depois eu descobri que Lua já era amplamente utilizada em muitas aplicações como desenvolvimento da maioria dos jogos (inclusive liderando a parte de scripts de jogos e já até ganhou prêmios na parte de jogos), aplicações industriais, estações espaciais e petrolíferas, sistemas embarcados, os sites Wikipedia e Github são implementados em Lua, Netflix faz forte uso de Lua, Adobe Photoshop Lightroom, Ultradefrag, VLC, nmap, wireshark (1, 2), snort (1, 2), Metaplace, teclados da Logitech. Lua é um grande caso de sucesso e mais presente do que imaginamos sem essa necessidade de propaganda e comoção que foi feito em cima de Rust.

 Nim é outra linguagem muito mais apropriada e interessante para o kernel Linux (existem ao menos dois sistemas operacionais escritos em Nim) e seus recursos únicos, que eu vou descrever mais a frente, são muito mais interessantes do que Rust.

 Muitos projetos se beneficiarão de Rust enquanto que muitos outros não; alias, é uma lei natural. Exemplos reais são o Android que se beneficiou de Rust tendo redução de 76% para 24% de seus bugs enquanto que o port do fish shell de C++ para Rust não resultou em nenhum benefício, não entregou nenhum novo recurso e quando estes surgiram, não estavam vinculados a linguagem Rust... já outros projetos por outro lado, pode ser tornar até prejuízo a adoção de Rust tanto que há programas ques estão sendo migrados de Rust para outras linguagens como é o caso do gerenciador de pacotes da distribuição Glaucus Linux que foi portado de Rust para Nim (sintax mais simples e mais fácil de manter, melhor desempenho e menos uso de memória, de CPU) e a linguagem Roc que está sendo reescrita de Rust para Zig pela sua eficiência no processo de compilação ser maior e ter menos dependências (12. Valeu Nilton por compartilhar estas informações). É questão do que se adéqua ou não a necessidade (aprendam isso). Honestamente, esta terceira opção é a mais provável que venha acontecer com o kernel Linux. Sim, eu vejo isso acontecer.

 Não é de hoje que tentam substituir a linguagem C como menciona o próprio autor da linguagem C Plus Prolog (ou simplesmente C+P) que descreve sobre a  linguagem C como sendo a única linguagem útil* (*portável, com desempenho que mais se aproxima de Assembly e consegue se comunicar com tudo) e que cientistas vem tentando há quase 50 anos encontrar uma solução para (digamos) substituir a linguagem C. E alguns até criaram C mais parecida com a linguagem Prolog e outros criaram o inverso, Prolog parecido com C."

 O grande problema não é a linguagem Rust, o problema é mais uma questão psicológica. Os usuários estão querendo adotar Rust de forma eufórica e irracional, sem pesar na balança as vantagens e desvantagens assim como todas as linguagens possuem, sem pensar nas consequências; só estão querendo adotar acreditando que Rust é a oitava maravilha do mundo que solucionará todos os problemas da humanidade. A maioria não são desenvolvedores e os que são, além de nunca nem mesmo terem explorado o real potencial da linguagem C, estão cheios de amores por Rust... Rob Landley, autor do toybox que eu sempre menciono, disse em seu artigo de 21/09/2024 da melhor forma:

"Eu desisti de Rust porque todo puritano de Rust que eu encontro há anos trata NÃO escrever código em Rust como um pecado... ...A multidão "all must rust away" não conseguem explicar as vantagens de Rust a não ser "não é C"...

 A única coisa que vemos é essa frescura de "rewrite in Rust", o que é uma bela de uma burrice já que o kernel Linux possui quase 1 Gigabyte somente de código na linguagem C. Levariam vários anos só para porta-lo para Rust e mais muitos outros anos somente para torna-lo estável (reescrever drivers será uma mão de obra intensa e que introduzirá mais problemas do que soluções — reescritas sempre introduzem bugs). Por vezes eu já vi desenvolvedores sugerir aos desenvolvedores de Rust desenvolverem as mesmas soluções do zero ao invés de ficarem querendo reescrever tudo em Rust. O autor da linguagem Hare sugeriu:

"Um grupo motivado de talentosos desenvolvedores de sistema operacional em Rust poderiam construir muito rápido um kernel compatível como Linux do zero e sem necessidade de se envolverem na política LKML"... 

"Eu acho que se o montante de esforços sendo colocados no Rust-for-Linux fossem aplicados em um novo sistema operacional compatível com Linux, poderíamos ter algo pronto para produção para alguns casos de uso dentro de alguns anos."

..."desenvolver um sistema operacional baseado em um design comprovado como o do Linux é muito mais fácil e pode ser feito muito rápido. Eu trabalho em meu próprio sistema operacional de novo design (um microkernel) há alguns anos e ainda está travado no design e precisa urgentemente ser repensado; por outro lado eu escrevi um clone aceitável do Unix em menos de 30 dias."

 O MIT também já desenvolveu um kernel assim chamando Biscuit o e apresentou no Usenix de 2018. Biscuit é kernel monolítico POSIX escrito na linguagem Go e é tão compatível com Linux que roda as aplicações do próprio Linux sem nenhuma necessidade de modificação do código fonte das aplicações. Por que a galera de Rust não acata essa proposta? Outro grande exemplo de escrever algum programa do zero e não de porta-lo é o bzip2; no meu artigo Qual o futuro do Bzip2? descrevi que os novos mantenedores foram questionados se portariam bzip2 para Rust, o que foi respondido que eles preferem trabalhar no suporte a multithreading em C, que para Micah é algo que seria muito interessante principalmente nas futuras versões 1.2 ou 2.0, do que qualquer coisa em Rust (lembram-se que eu mencionei que muitos que estão cheios de amores por Rust nunca nem mesmo exploraram o real potencial da linguagem C? Aqui está uma prova disso) e por fim foi indicada a implementação do Bzip2 em Rust desenvolvida do zero.

 Lanldey também argumenta sobre o desenvolvimento de um sistema operacional escrito em Rust do zero e ainda apresenta a percepção das intenções da comunidade Rust:

"Se quizerem escrever um novo sistema operacional inteiramente em Rust, com kernel e userspace e toolchain, tudo em Rust, eu respeitaria isso e desejaria tudo de bom para eles. Mas não é o que eles querem. eles acreditam que lhes é devido Linux e eles querem sequestrar Linux (ainda que majoritariamente escrito em C)"... ..."E eles acreditam que ADICIONAR COMPLEXIDADE ADICIONAL resultará em sistemas melhores"

 Sim, essa é percepção que se passa; não é que querem ter uma linguagem secundária no kernel Linux com a intenção de melhorar sua segurança e sim de aos poucos dominar o kernel substituindo todo o código por Rust para se autopromover. Rescrever algo em Rust pode se tornar uma cilada; imaginem a complexidade será reescrever o código rust para outra linguagem; você pode acabar ficando atrelado a ela (coincidência ou não, já vi desenvolvedores reclamando de coisas parecidas do projeto GNU).

 O que esquecem de nós contar é exatamente os contras da linguagem: Curva de aprendizado terrível; difícil de debugar; complexa (não é a toa que o autor do minibase diz que o Rust coreutils o forneceu uma grande inspiração por lhe mostrar como não escrever o coreutils); tempo de compilação enorme; ecossistema pequeno; otimizada para a maioria dos processadores i686 e x86_64 porém, em outras plataformas como armel, armhf, armv7, mips{64}, powerpc{64} e riscv{64} carece de suporte de primeira classe, fora "recursos" de Rust que podem causar erros e bugs no LLVM; utilizar  HLL pode causar perdas de desempenho, uso excessivo de CPU, memória e I/O; foram o tamanho dos biários ser enorme.

rust coreutils
Diferença de tamanho dos binários UUtils e toybox



 Se gabam unicamente de segurança de memória sem mencionar à que custo... E tudo tem um custo. O artigo The benefits and costs of writing a POSIX kernel in a high-level language faz uma ótima análise descrevendo os benefícios de escrever seus programas e sistemas operacionais em linguagens com segurança de memória ao custo de sacrificar o desempenho que foi de 5% a 15%. Segurança de memória pode também afetar os seus programas; o autor da linguagem C3 descreve em seu artigo Por que eu parei tudo e comcei a escrever  em C de novo:

"...Quem consegue escrever um jogo de estratégia com milhares de units cada tendo sua própria versão de mundo sem ter um garbage collector rodando o inferno? De fato meu amigo tentou escrever o jogo e falhou. Garbage collectors são péssimos e todos os meu projetos em Lisp possuem aplicações muito limitadas apenas por causa do garbage collector. ..."

 Ok, o segundo argumento que podem querer apresentar é que Rust não utiliza garbage-collection por acreditarem não ser um recurso eficiente. Ao invés disso, Rust aplica a técnica de analisar o código fonte durante o processo de compilação para garantir que não haja brechas de segurança; PORÉM este tipo de recurso já é empregado na linguagem C há muito, mas muito tempo. A biblioteca dietlibc emprega ao menos seis linker warnings (avisos) durante o processo de compilação para ajudar os desenvolvedores escrever melhores códigos:

  1. Avisa se assert for utilizado (pode indicar debug code)
  2. Avisa se stdio for utilizado (bloat)
  3. Avisa se sprintf for utilizado  e indica utilizar snprintf por ser melhor e mais seguro¹
  4.  Avisa se *printf/*scanf for utilizado (bloat e recomenda utilizar -lowfat)
  5. Avisa se system for utilizado (risco de segurança)
  6. Avisa se mktemp/tempnam/tmpnam for utilizado (race condition)

 E esse é um dos grandes problemas; Rich Felker, autor da biblioteca musl, descreveu em seu artigo intitulado Overcommit que "há um monte de mal entendidos relacionados a gerenciamento de memória no Linux que levam à um monte de programas ruins que falham de forma robusta com condições de baixa memória e geram mitos". OK, gerenciamento de memória e segurança em memória são coisas diferentes, mas a mesma situação se aplica-se a ambos os casos, ou seja, não vai adiantar nada adotar outra linguagem se os desenvolvedores não souberem tratar corretamente seus códigos.

 Falando em musl, além de também fazer a mesma coisa por trabalhar com o conceito de quality safe code (visando ser correta no senso conformidades padrões e segurança) é utilizada para encontrar bugs através do recurso fail-safe da biblioteca.

 A Red hat adicionou a flag -FORTIFY_SOURCE aos compiladores GCC e Clang para detectar falhas como buffer over flow (1). O GCC também possui desde 1998 a extensão StackGuard que é uma Stack Smashing Protection (SSP) (1) que ajuda o compilador detectar e prevenir ataques buffer-overflow que alias, o OpenBSD faz forte usso deste recurso.

 O compilador tinycc possui a opção -b (bounds checker) há no mínimo 15 anos... E o GCC há uns 10... foram o recursos ASan (AddressSanitizer) que é um plugin detector de erros de memória para C/C++ utilizado inclusive no Google Chrome do Android, no Chrome OS, simulador do iOS, Linux, Mac, e Windows de 64 bits e disponível no LLVM há mais ou menos uns 15 anos (1, 2, 3), -fstack-protector-fsanitize=safe-stack, UBSan (-fsanitize=bounds) e o SafeCode. Alias, a própria Wiki do  ASan sugere o uso da ferramenta como cgroups para limitar o consumo de memória. Por que não incluir Pledge a esta lista? Ou seja, existem vários mecanismos para se utilizar somente com a linguagem C, mas a solução que encontraram foi adotar outra linguagem que pode gerar uma série de outros problemas... ... ... Enquanto isso Rust possui um recurso chamado unsafe que a galera de rust se refere como o "segredinho sujo" que eles utilizam em todos os lugares mas está tudo bem... São eles que estão usando... não é?

 Está certo que utilizar recursos como verificação do código fonte acaba gerando binários um pouco maiores por acabar adicionando mecanismos de segurança, mas em Rust isso tinha que ser tão exagerado? O Rust coreutils por exemplo, contendo apenas apenas 87 comandos e sendo linkado dinamicamente, possui o tamanho de mais de 12MB enquanto o toybox, sendo linkado estaticamente e contendo 233 comandos (quase três vezes mais que o Rust Coreutils), ocupa apenas 724KB (mais de 17 vezes menor levando em conta sua ligação estática e a quantidade de comandos). Já houve quem dissese que isso acontecem em Rust apenas em X86 por conta das dependências e não ocorre em embarcados. O que não é verdade pois geralmente Rust gera binários praticamente do mesmo tamanho.   

 O interessante mesmo é poder decidir quando utilizar segurança de memória. No livro Nim in action descreve que algumas linguagens de programação, como C, não possuem segurança de memória porque ela permite que programas sem atribuição possa acessar a memória. Por outro lado, linguagens possuem segurança de memória oferecem essa segurança ao custo de não permitir que programas acessem detalhes de baixo nível da memória quando se faz necessário; e é aí que Nim se torna uma linguagem muito interessante. Por padrão Nim já oferece proteção contra erros de memória porém, porém Nim oferece as duas opções (escrever códigos com ou sem segurança de memória) permitindo que você decida quando utilizar cada uma delas. Ainda no livro Nim in Action descreve que "...há situações quando muitos querem evitar garbage collectors; eles são considerados por muitos ser inadequados para certas aplicações como embarcados e jogos. Por essa razão, Nim possui suporte a um número diferente de garbage collectors com diferentes aplicações em mente. Garbage collector pode também ser removido completamente, lhe dando a habilidade de você mesmo gerenciar memória." ... "Aplicações escritas em Nim são muito rápidas, em muitos casos, tão rápidas quanto aplicações escritas em C, e mais de trinta vezes mais rápido do que aplicações escritas em Python. Eficiência é  maior prioridade, e alguns recursos toram otimização de código fácil. Isso vai de mãos dadas com um soft real-time garbage collector, que lhe permite especificar o montante de tempo que deve ser gasto coletando memória. Esse recurso se torna importante durante desenvolvimento de jogos, onde um garbage collector comum pode desacelerar a renderização de frames na tela se utilizar muito tempo coletando memória. Também é útil em sistemas real-time que precisam rodar em frames de tempo muito estrito." Nim, além de por padrão já proteger seu programa contra todos os tipos de erro de memória, possui também recursos muito mais interessantes como meta programação, style intensitivity; seu type system (que apesar de ser estática, incorpora o recurso type inference que lhe permite acelerar o desenvolvimento do seu código sem sacrificar a segurança), type safety e type-checking dinâmico; Generics (que lhe permite reutilizar o código sem sacrificar type safety) e muito mais.

 (13/08/2025) Linguagens como C e C++ possui suporte a segurança em memória, mas algo que é feito manualmente. Os desenvolvedores que devem verificar seus próprios códigos e identificar o problema (algo que já vimos aqui Rich Felker denunciando). Os desenvolvedores do Busybox por exemplo fazem isso muit bem, no dia 03/08/2025, Denys Vlasenko corrigiu o vazamento de memória  causado pela otimização do compilador.

 (13/08/2025) Além destes recursos, a equipe do Btrfs implementou no dia 12/08/2025 o ref_tracker que detecta vazamentos e printa os traços da pilha que ainda não liberadas e assim poderem corrigir os problemas.

 Vale ressaltar que essas técnicas de memory safety também são possíveis na linguagem C e C++ não somente manualmente como muitos acreditam mas também através de garbage collector para C e C++ que foi desenvolvido pelos três pesquisadores Hans-J. BoehmDemers Weiser (por isso o nome bdwgc) em meados da década de 90... Este recurso lhe permite utilizar garbage collector nas duas linguagens quando quiser bastabdo definir #include "gc.h" em seu código. O bdwgc também oferece o recurso Leak Detector.

 (28/03/2025) No dia 26 de Fevereiro de 2025 a equipe de desenvolvedores do XFS implementou o recurso garbage collection no zoned do XFS todo desenvolvido em C (e que vai para o kernel 6.15-rc). E no dia 19 de Março foi adicionado a opção gc_pressure no mount do XFS para evitar um risco no garbage collection em circunstancias distintas. O que nos leva a questionar se realmente se faz necessário a adoção de uma linguagem secundária no kernel Linux somente pelo recurso de segurança em memória ao custo de perda de desempenho, binários enormes, alto consumo de memória, CPU e etc sendo que tal recurso já está presente de tantas formas (linguagens mais adequadas, algoritmos, bibliotecas, flags, extensões), há tanto tempo (uns há quase trinta anos) e que já poderiam estar sendo empregados...

xfs: implement zoned garbage collection
Garbage Collection no zoned do XFS

Garbage Collection no f2fs


 E o mais interessante de tudo: Se lembram do artigo da Casa promovendo que todos deveriam migrar de linguagens como C e C++ para linguagens com segurança de memória? Pois é, estranhamente parece que a Casa Branca voltou atrás e não vai mais promover segurança de memória já que o mesmo link está indisponível.


 Bom, eu acho que agora sim neste segundo artigo eu tenha abordado elementos o suficiente para pensar no assunto; o assunto de segurança em memória vai muito além do que simplesmente adotar uma linguagem com tal recurso achanado que solucionará os problemas de forma definitiva.


QUER APRENDER LINUX? ENTÃO CONFIRA O MEU CURSO DE MIGRAÇÃO PARA LINUX CLICANDO AQUI :)
QUER APRENDER LINUX? ENTÃO CONFIRA O MEU CURSO DE MIGRAÇÃO PARA LINUX CLICANDO AQUI :)

Lançado novo Minicurso de atributos no Linux
E não esqueçam de conferir também o meu mini curso de atributos no Linux



O dia em que o pinguim adquire asas e cauda de um dragão de ferro.

O dia em que o pinguim adquire asas e cauda de um dragão de ferro.

O dia em que o pinguim adquire asas e cauda de um dragão de ferro.

 Desde que eu utilizo Linux, os asciduos usuários de Linux sempre utilizaram o argumento de Linux é somente o kernel enquanto que as ferramentas são do projeto GNU. Este argumento, além de fraco e inutil, deixa as pessoas confusas quanto ao Linux, desvirtua as pessoas do verdadeiro conhecimento tecnico e afasta-as de conhecer novas ferramentas que poderia ser muito mais uteis. Existem Muitas ferramentas que podem substituir as do projeto GNU tanto em empresas quanto no uso comum em seu dia a dia. conheça aqui algumas delas.

 Anos atrás (especificamente em 2010) li a noticia de ser possível compilar o Linux com o Clang. Eu, com a minha paixão pelos ideais de software era grande, discordei de tudo o que foi dito (paixão é fogo e nos cega). Alguns dias (ou semanas) depois, publicaram um benchmark entre algumas versões do GCC, do Clang, do ICC da Intel e do ovo de dragão (Dragon Egg). Passado algum tempo, tive a curiosidade de pesquisar sobre o Clang e acabei gostando do que descobri a respeito do compilador. Foi bom saber que haviam outras opções para compilar o Linux além do GCC; como em tudo o que há no Linux são outras opções (GUIs, editores de texto, navegadores, terminais de comando, comandos e tudo mais, a regra vale também para compiladores, bibliotecas e tudo mais). 
 Esse é o tipo de liberdade que gosto; a liberdade de escolher o que quero e o que vou utilizar; a liberdade se estende a muito mais do que as citadas pela GPL e não ficar preso ou limitado à uma única opção. Seria a mesma liberdade que tenho de ir ao mercado e poder escolher se quero presunto de uma marca ou de outra (a lei da concorrência existe para isso, assegurar o nosso direito como consumidor e desta forma, as empresas busquem conquistar seus clientes com a melhoria continua de seus produtos ou serviços).
 Como mencionei, eu até era extremo defensor de software livre e de código aberto (ainda defendo a adoção de ferramentas open source, mas não da forma que eu abordava anteriormente acreditando que software proprietário representam ameaças à humanidade), recebia newsletters da FSF por e-mail, porém, tomei antipatia quando Richard Stallman ficou cantando vitória sobre a morte de Steve Jobs. Mas ainda assim, continuei com os ideais de software livre e de código aberto.

 Certa vez participei de um podcast onde um dos convidados que não vou mencionar o nome (e por favor, não me perguntem quem é, pois não irei responder; citação de nome é difamação) era defensor de software livre. Até aí tudo bem, eu também era; o problema é que o cara não queria participar simplesmente pelo fato do software que iria ser utilizado para gravar não era (totalmente) livre; isso rendeu alguns comentários. Depois começou a ficar difícil interagir com ele, pois tudo para ele era somente software livre sem ouvir o que o outro lado tinha a dizer. Percebi que eles pregam a liberdade mas se tornam escravos de  tais ideais, se tornam flexíveis.

 Gosto de software livre e de código aberto, não deixei de usar as ferramentas do projeto GNU (e talvez não deixa de usar tão cedo), mas da comunidade eu passo longe (a não ser que venham me encher a paciência kkkk).

 Alguns dias atrás, um amigo conversou comigo sobre chamar o sistema de GNU/Linux ou simplesmente de GNU, e não somente de Linux (como assim?). Beleza; o assunto encerrado depois de longo debate entre nós. Coincidência ou não, um ou dois dias depois um seguidor do meu canal comentou a mesma coisa no meu vídeo "Linux (dando nome a criança):


 O nome correto é Linux e não de GNU/Linux (e muito menos somente de GNU. GNU seria horrível). Primeiro porque Linux é um nome proprietário (uma propriedade intelectual de Lius Torvalds que pode lhe autorizar utilzar seu nome ou não); segundo, não há somente ferramentas GNU presentes no sistema operacional Linux (isso sim é uma verdadeira falácia e desinformação); terceiro, as ferramentas GNU são substituíveis e quarto, ambos são projetos distintos com propósito e propostas diferentes. Essa guerra por reconhecimento de nome do sistema operacional é na verdade relacionada a ego e não ao argumento meritocracia. Mesmo que discordem de mim, eu afirmo:
O GNU só é um projeto bem sucedido e amplamente utilizado graças a sua adoção pelo Linux (mesmo o GNU sendo mais velho). Duvido que o Gnu seria amplamente conhecido se não fosse o Linux.
 Se considerarmos chama-lo de GNU/linux ou somente de GNU, então deveríamos considerar todos os outros projetos que utilizamos no Linux e que não fazem parte do GNU e que compoem o sistema operacional.

 Quando se fala de GNU, as pessoas só lembram do stallman; não nos lembramos de pessoas como Brian fox que foi o autor do Bash, do GNU Makeinfo, do GNU Info, do GNU Finger, thereadline e history libraries além de ter sido o mantenedor do GNU Emacs por um tempo (e há quem acredite que o Stallman que é o cara). Alias, em torno de 80% das pessoas nem sabem destas coisas e acabam dando créditos ao Stallman.

Brian Fox foi o autor do GNU Bash, do GNU Makeinfo, do GNU Info, do GNU Finger, thereadline e history libraries. Além de ter sido o mantenedor do GNU Emacs por um tempo (e tem gente que acha que o Stallman que é o cara)
Brian Fox, autor do GNU Bash

 Muitos não se lembram de Mark Adler, que foi um os criadores do Gzip (e que inclusive é um dos responsáveis pela missão espacial para Marte).
Mark Adler
Mark Adler, um dos autores do Gzip e um dos responsáveis pela missão de exploração ao planeta Marte.
 Muitos não se lembram de pessoas valiosas como essa. Já quando falamos de linux, o caso é o contrario disso; quem já esteve em um evento como a Linuxcon sabe que isso é bem diferente.

 Existem muitas ferramentas do GNU que são utilizadas no Linux, e disso todos nós já sabemos. Ferramentas como: GCC, make, Glibc, Bash, Coreutils, Emacs, Gzip e etc. A questão é que tais ferramentas são passíveis de substitução; é aí aonde a liberdade entra em cena.

 Então, para esclarecer esse assunto, selecionei aqui algumas dentre as muitas ferramentas que são possíveis utilizar no lugar das mencionadas do GNU. Não estou fazendo isso com a intenção de discussão, apenas procurando ajudar vocês a ampliarem seus conhecimentos e abrir os seus olhos para a gama de software de qualidade que o mundo proporciona.

 LLVM (Low Level Virtual Machine) é uma coleção de compiladores modulares e reutilizáveis que foi iniciado como um projeto de pesquisa na universidade de Illinois. Está sob licença open Source UIUC no estilo BSD. que mencionam que pretendem mantê-lo permanentemente aberto.O Clang, compilador que mencionei no inicio deste artigo, que é uma alternativa ao GCC, faz parte do LLVM. A palavra Clang (pronuncia-se cléng) é uma onomatopeia em inglês do som emitido pelo metal. O Clang possui as características de compilação mais rápida, menor uso de memória e melhores ferramentas de diagnósticos como no modelo apresentado abaixo:

gcc vs clang
Comparação das ferramentas de analise de log do GCC e do Clang.

Há muitos recursos e atributos interessantes no LLVM/Clang para os desenvolvedores e pessoas que integram sistema podem tirar vantagem quando desenvolver ou implantar seus próprios projetos. Um outro recurso interessante mencionado no site do Funtoo Linux, é a sua capacidade de compilação de programas Leiam o artigo em http://www.funtoo.org/Clang ou leia na imagem abaixo:

pode ocorrer de alguns programas não compilarem (como o glibc) por que eles dependem de extensões específicas do GCC (é por isso que todo o código do BSD pode ser compilado com o LLVM mas alguns códigos GNU não) [nota do redator: liberdade?] ou padrões depois de compilação com sucesso do LLVM (como o xorg-server) ... ... Os frontends do C/C++ do LLVM, clang and clang++ na versão 3.0 são estáveis o suficiente para ser self-hosting compilar Boost, Qt, LibreOffice, FreeBSD, algumas partes do kernel Linux kernel e muito mais.
Passe o cursor para ler a tradução.

 O FreeBSD foi o primeiro sistema operacional da família BSD a construir todo o seu Kernel com o CLANG (algo que ele se beneficiou já que a Apple foi a primeira a investir no LLVM) se livrando do antigo GCC que utilizavam (mesmo esse ainda baseada na GPLv2). O Debian já adota o clang, o Fedora também passou a adotar o LLVM/Clang, o Open Mandriva é quase 100% compilado com o LLVM, o Android e o OSX são 100% compilados com o LLVM/Clang.

 Existe o projeto da Linux Foundation que visa construir o kernel Linux totalmente utilizando o Clang. Foi de onde eu retirei a imagem do Tux com as asas e cauda de ferro. Um site realizou um benchmark entre os compiladores Intel C++, GNU C++ e LLVM Clang.



 Existem muitas empresas trabalhando e investindo recursos nesse projeto. Até mesmo a Microsoft está investido recursos financeiros no LLVM, pois irá basear o seu futuro .Net no LLVM.
Acompanhe a lista de empresas e projetos que utilizam o LLVM

 Na verdade, até aonde se sabe, existem quatro compiladores que são capazes de construir o kernel Linux sendo eles o GCC (que na verdade é o EGSC), o TinyCC do criador do ffmpeg, o ICC da Intel e o LLVM/Clang. Nos vídeos abaixo você pode conhecer melhor sobre os compiladores.




MUSL

 Musl (pronuncia-se mâssl) uma biblioteca C desenvolvida do zero. O site do Musl mostra um gráfico comparativo entre as bibliotecas C. A empresa OpenWall faz referência a biblioteca Musl por oferecer suporte nativo ao pacote TCB.


 Existe a distribuição Alpine Linux que faz uso dessa biblioteca ao invés da Glibc e do Busybox ao invés do Bash. Para quem não sabe o que é o Busybox, ele é conhecido como o canivete Suíço do Linux embarcado. É um conjunto de comandos dentro de um único executável. É o Busybox que fica dentro o initrd para o kernel utilizar no momento do boot. Foi originalmente desenvolvido por Bruce Perens que já foi presidente do projeto Debian assumindo o lugar de Ian Murdock.

toybox 0.8.6
Comandos do toybox 0.8.6

Comando reunidos no do Busybox.
Lista de comandos no Busybox

Terminais de comandos (11/02/2022)

O terminal de comando Bourne Shell de autoria de Jörg Schilling

 Existem vários terminais de comandos disponíveis para Linux cada um tendo suas particularidades. Alguns deles o Zsh (que muito recomendo inclusive no meu curso e já até entrevistei o criador do Oh-My-Zsh), o Fish shell que galera gosta muito (e com razão), o Ksh (Kornshell), o csh (C shell), o tcsh, o Bourne Shell mantido por Jörg Schilling e o toybox que tem bastante conteúdo por aqui.


Pacotes de comandos (15/04/2022)

 Aproveitando que falamos de terminais de comandos, existem também pacotes com comandos complementares como no caso o CoreUtils do GNU que, semelhantes a esse são o embutils criado por Felix von Leitner (criador da dietlibc que eu acho incrível); o 9base de origem do plan9 e portado para outros sistemas operacionais; o sbase que é uma coleção de comandos herdados dos Unix e portados para 5 Unix diferentes e o ubase que já é específico para Linux seguindo  mesmo espirito do Util-Linux e está sob licença MIT e X; o ubase pode ser compilado com o GCC, LLVM ou TCC e é altamente recomendado compilar com a musl.

sbase

ubase

sbase-box

 Até mesmo os comandos do toybox que podem ser compilados separadamente. Porém, estes pacotes não fornecem apenas um conjunto básico de comandos não sendo o suficiente para ter um sistema operacional em funcionamento. Como exemplo, o coreutils não fornece comandos para formatar partições, configurar rede, gerenciar processos, drivers, serviços e muito mais (o argumento apresentado para tentar chamar o Linux de GNU/Linux é simplesmente muito superficial e utilizado pela equipe do GNU e da FSF para se promover). Estes comandos são fornecidos por outros pacotes sendo muitos deles do próprio Linux e alguns deles criados pelo próprio Linus Torvalds e outros com sua participação:


XZ

 Tukaani, era uma distribuição derivada do Slackware (que merecia ter sido mencionada no meu vídeo sobre o Slackware devido a sua ótima contribuição) e que deu origem a alguns projetos. A distribuição não existe mais, mas as ferramentas que eram parte integrante da distribuição estão em pleno desenvolvimento.

 Em suas primeiras versões chamava-se de LZMA, é um compressor que nasceu na distribuição. O XZ hoje é utilizado fortemente pelo kernel desde de Dezembro de 2.013 e pelo Funtoo desde 2.008 (como mencionei no meu artigo parabenizando a equipe do Funtoo). O XZ apresenta melhor compressão do que o Gzip mesmo em compressões com o Gzip utilizando a opção "-9". Na verdade o XZ apresenta melhor compressão até mesmo que o Bzip2.

Star (11/02/2022)

 Eu conheci esse comando depois da live com o Luiz Anotnio do projeto Pindomara Copacabana. Start é uma versão do comando tar (dentro das conformidades POSIX 1003.1) com o maior desempenho que existe. Também de autoria de Jörg Schilling e mantido hoje por schilytools depois da morte de Jörg Schilling em Outubro de 2021 (este complemento é uma homenagem a Jörg Schilling). A Sintax do comando star pode ser conferido aqui na página do Fedora. Todos os projetos de Jeorg Schily podem ser conferidos aqui.

O comando star e suas opções de des/compactação.
O comando star e suas opções de des/compactação.

decompressing files using star
utilizando o star para descompactar arquivos. Apenas um exemplo de uso uma vez que um arquivo muito pequeno (apenas 4KB).


CMake

Cmake é uma ferramenta build system cross-platform. Como postado do Diolinux no artigo sobre Linux ser o ambiente mais utilizado em C e C++, é possível ver que o CMake é mais utilizada do que o GNU Make.


Dentre os casos de sucesso do CMake podemos ver o Netflix, o KDE, o game Second Life, sistemas de robóticas, o MySQL entre outros. Um coisa que considero a equipe do CMake é a sua humildade.

Scons

 Falando de CMake, eu não poderia deixar de citar o Scons, que também é uma ferramenta de construção. Escrita em Python, o Scons visa ser um substituto para o tradicional make e que possui funcionalidade integrada semelhando ao autoconf/automake.
 Muitos já elogiaram o Scons; pessoas como Eric S. Raymond, authr de "A Catedral e o Bazaar", Timothee Besset da id Software onde menciona que o Linux build system do Doom3 utiliza o Scons e que é show. Essa já é a segunda vez que ouço que o Scons é utilizado em compilação de alguma coisa relacionada a jogos. Gosto de considerar a parte da avaliação envolvendo jogos devido sua dificuldade de programação que envolve inteligencia artificial, simulação de física, renderização e etc.

MK

O mk surgiu no sistema operacional Plan9 como um simples substituto para o make, mas que provê várias extensões, flexível e execução em paralelo. É possível compilar o mk também para Linux, BSDs (Free/Net/OpenBSD e Darwin), Solaris, HP UX e OSF1.

Smake e Makefiles de autoria de Jörg Schilling (11/02/2022)

 Smake é focado em alta portabilidade já que GNU Make não está disponível para todas as plataforma que o Smake (Linux, Windows (até MSDOS), MacOSX (e versões anteriores), Solaris, SSPM, PPC, HPUX, AIX), gnu make não permite realizar debugging no Makefile.

O comando smake e suas opções de des/compactação.
O comando smake e suas opções de des/compactação.

 O Smake possui também seu Makefiles que permitem montar uma source tree via NFS e simultaneamente compilar (reutilizar) para todas as plataformas. Além do Cmake, do Scon, do MK e do Smake temos também o Ninja Buil e o Samurai é compatível com o Ninja Build (e até mesmo um concorrente direto).

smake examplo
Exemplo de uso do smake


Man

 Apesar de muito conhecido, incluí o Man nessa história por que o GNU possui o seu próprio, o comando info. Detesto o info; hora ele é útil, a maior parte do tempo não.

QT 

É um framework muito conhecido por ser utilizado no desenvolver o KDE. Menciono essa pois acho mais poderosa do que a GTK.

Existem muitos outros projetos que são possíveis substituir os do GNU como:
 Percebi que projetos fora do GNU ou até forks são em certos aspectos mais eficientes em seus propósitos. Não estou aqui difamando o projeto GNU, mas a mesma mensagem que deixo aos usuários de Windows envio também às comunidades de software livre de código aberto: Não devemos ficar presos unicamente à ideias ou paixões. O mundo é muito mais amplo do que possamos imaginar e podemos usufruir de tudo isso dando chance a outros projetos também. Adaptar ou morrer é um fato.

 Se uma ferramenta surge para bem e vindo a substituir a já existente, ela deve ser bem recebida. Isso é algo que acontece constantemente no Linux. Essas ferramentas vem para a melhoria das nossas próprias vidas. O que vejo é muita rivalidade inútil ao invés de foco na coisa mais importante, que é a melhoria contínua.

 Lembrem-se não somente do GNU, e sim de todos os projetos de open source que compoem o Linux (está muito longe de ter somente ferramentas do GNU presentes no sistema operacional). Lembrem-se de todas as licenças que também proporcionam e possibilitam a liberdade (GPL não é única. Existem em torno de 800 licenças). Lembrem-se de todas as pessoas que contribuem para esses projetos; graças a elas é que os projetos tem crescido e evoluído. E o mais importante unindo aos três itens mencionados, lembrem-se de serem livres (liberdade vai além da GPL, FSF e GNU).

Marcadores

A pior história sobre Linux que já ouvi (6) 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 (34) btrfs (32) bugs (2) Caixa de Ferramentas do UNIX (19) canonical (1) canto do Diego Lins (2) certificações Linux (7) Código Fonte (54) comandos (33) comp (1) compressores (9) container (8) CPU (19) cracker (1) criptografia (5) crowdfunding (9) cursos (24) daemons (13) Debian (31) desempenho (2) desenvolvimento (100) 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 (4) diocast (1) dioliunx (3) distribuições Linux (14) Docker (13) DragonflyBSD (24) driver (2) 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 (8) 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 (141) lançamento (64) leis (1) LFCS (1) libs (2) licenças (10) Linus (16) linus torvalds (2) Linux (194) linux foundation (3) linux para leigos (1) live (5) lkgr (1) 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 (176) musl (3) não viva de boatos (9) navegadores (5) NetBSD (7) newlib (1) nim (9) nimlang (1) nintendo (1) novatec (17) novidades (1) nuvem (1) o meu ambiente de trabalho (3) off-topic (12) ONLYOFFICE (4) open source (85) OpenBSD (8) OpenShift (1) oracle (1) os vários sabores de Linux (45) padrim (2) palestras e eventos (5) partições (6) pentest (8) performance (1) pipewire (1) plan9 (3) playstation (1) processadores (30) professor Augusto Manzano (11) Programação (71) 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 (16) segurança digital (27) servidor web (2) servidores (3) shell (10) shell script (8) sistema operacional (25) skarnet (2) smartphones (3) Software livre e de código aberto (152) sorteio (3) Steam (10) Steam no Linux (8) supercomputadores (4) suse (7) systemd (8) terminal (89) terminal de comandos (20) toca do tux (1) toybox (28) tutorial (6) Tux (3) ubuntu (1) 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)