Estou tentando construir meu sistema do zero, já que gosto muito da ideia de atomicidade de cada programa na abordagem do tipo Unix. Gostaria de preservá-la o máximo possível na minha construção.
Como o GNU binutils, de certa forma, viola esse princípio, gostaria de saber se existe apenas o GNU assembler, que não seria dependente do binutils?
Se não, há alguma alternativa mínima e performática ao GNU assembler? Eu conheço o yasm, mas caso haja um melhor, eu gostaria de saber.
Agradeço antecipadamente.
Não sou eu que vou lhe dizer como interpretar alguma filosofia, mas acho que sua suposição de que um assembler sem um linker seria útil para construir software está errada. O mesmo vale para um compilador; esses três precisam trabalhar bem juntos, e eles pertencerem a um e ao mesmo projeto de software faz muito sentido.
Geralmente, a "filosofia UNIX", como quer que você a defina, definitivamente não diz "todos os programas são completamente independentes sem código compartilhado entre si". O contrário deve ser o caso - uma das coisas legais sobre o UNIX "original" era que ele rapidamente suportava memória virtual e vinculação com bibliotecas. Então, de forma alguma os programas UNIX são "atômicos"! Isso é literalmente o oposto do que ser capaz de usar chamadas de sistema POSIX como
dlopen
, ou a ideia de memória compartilhada POSIX sugere (e isso existe desde pelo menos desde SysV, por volta de 1983, até onde uma busca rápida me diz.Então, talvez reduza seu "desejo por pureza" aí; o UNIX em si não foi feito para lhe dar programas atômicos, mas para permitir que você componha programas a partir de partes em bibliotecas de funções e faça com que eles trabalhem juntos em arquivos trocados por meio de um sistema de arquivos estável.
É por isso que C existe - porque Kernighan e Ritchie precisavam de uma linguagem que lhes permitisse fazer exatamente isso, construir programas que interagissem com componentes, e o assembler não fornecia uma convenção de chamada definida.
As pessoas confundem "nenhum pedaço de código pode ter mais de um propósito" com "compor scripts complexos canalizando a saída para a entrada padrão do próximo processo", mas esse conceito é na verdade muito menos central do que a ideia de que você pode chamar funções de bibliotecas que você poderia compartilhar com outras pessoas¹.
Dito isto:
Você pode, é claro, construir e instalar o GNU assembler sozinho, mas não será muito útil. Então, não há problema aqui para resolver; apenas ignore as coisas que você não quer.
Se você quiser construir um kernel, precisará usar o GNU assembler ou talvez o
llvm-as
concorrente (que é ainda mais modular e praticamente inútil sem o frontend clang C).¹ E, francamente, estou meio incomodado com a afirmação de que "cada programa tem apenas um propósito muito singular e esse é um bom design de sistema para tudo". Tenho certeza de que você prefere editar seus arquivos de texto em
ed
em vez devim
ouemacs
, e tenho certeza de que, como um purista do UNIX, você odeiaawk
com paixão, pois ele permite que você escreva programas complexos de processamento de texto em vez de compô-los por meio de concatenações infinitas de programas por meio de descritores de arquivo, e a ideia de que seu shell pode ser usado para iniciar programas e contar até 1000 é uma farsa para você - mas, para mim, programas com conjuntos de recursos úteis em vez de mínimos parecem tornar meu dia mais produtivo. Não tenho certeza de como alguém conciliaria "ferramentas de propósito único são as ideais" com o uso de um navegador da web, que explicitamente é tudo - um leitor de notícias, um cliente de plataforma de perguntas e respostas, um cliente de e-mail, um reprodutor de vídeo, uma coleção praticamente infinita de jogos, um cliente para redes de bate-papo por texto, ...