Acho massa que tenha aprendido coisas novas e essa é a vantagem de aprender linguagens diferentes: você sempre aprende maneiras diferentes de resolver problemas.
Só tem alguns erros no artigo que eu gostaria de corrigir. Espero que interprete meu comentário como um convite para aprender mais e não uma "crítica".
- C é uma linguagem de alto nível. Eu sei que a maioria das pessoas vão lhe dizer o contrário, mas como uma pessoa que estuda Programming Language Theory e é apaixonado por baixo nível, posso lhe afirmar que C é uma linguagem de alto nível. Uma linguagem de baixo nível é uma linguagem que abstrai muito pouco, praticamente nada, o código de máquina da arquitetura. E o código que a gente escreve em C não se parece nenhum pouco com o código de máquina, acredite.
- C é um pano. Do ponto de vista de quem programa em Python, C pode parecer "por debaixo dos panos" mas na real C é um "pano". É verdade que C não tem implementações de estruturas de dados na sua biblioteca padrão mas isso não faz com que programar em C seja ver as coisas por debaixo dos panos. Tem muito mais coisas para se estudar e entender por baixo dos panos da linguagem C.
- «Entender o por quê uma linguagem de baixo nível precisa ter uma tipagem estática[...]» - Bom, como eu disse C é uma linguagem de alto nível. Mas falando de linguagens de baixo nível é falsa a afirmação de que "precisam" ter tipagem estática. Assembly (que é baixo nível de verdade) não tem tipagem nenhuma (nem estática nem dinâmica).
- C abstrai a memória. Você não está lidando diretamente com como a memória de fato funciona programando em C. Até mesmo os ponteiros são abstrações, eles não refletem necessariamente como um endereço de memória funciona na arquitetura. Um exemplo: na arquitetura x86 os ponteiros abstraem o conceito de segmentação de memória. Além disso usar
malloc()
não faz com que você lide manualmente com alocação dinâmica de memória, a única coisa que o uso do combomalloc()
efree()
fazem é te dar o controle do lifetime de um objeto, que é por quanto tempo um objeto permanece alocado. Isso não é lidar com alocação dinâmica de memória manualmente, é uma abstração e lidar com isso manualmente é muito mais complicado do que só invocar uma função. Portanto dizer que "aprendeu de vez o que é memória" talvez seja um exagero.
Se quiser aprender mais sobre como as coisas funcionam por debaixo dos panos, sugiro estudar:
- Programming Language Theory (PLT): que é o ramo da ciência da computação que estuda a teoria e a implementação de linguagens de programação. Coisas como sistemas de tipos, paradigmas de programação, modelos de computação, metaprogramação, compiladores etc.
- Material sobre sistema de tipos: https://lucacardelli.name/papers/typesystems.pdf
- Material sobre paradigmas: https://www.info.ucl.ac.be/~pvr/VanRoyChapter.pdf
- Livro sobre compiladores: Compiladores: Princípios, Técnicas e Ferramentas (ISBN: 978-8588639249)
- Sistemas operacionais: assim você aprende sobre como programas são executados sobre sistemas operacionais e aprende como a memória funciona por debaixo dos panos. Além de outros pontos importantes como threads (mais concorrência e paralelismo), filesystem, sockets, system calls, interrupções, I/O etc.
- Livro sobre SO: Sistemas Operacionais Modernos (ISBN: 978-8543005676)
- Executáveis: assim você aprende sobre arquivo objeto e como executáveis funciona. Veja sobre os formatos ELF (usado no Linux e outros UNIX-Like) e/ou PE (usado no Windows).
- Bibliotecas dinâmicas e estáticas: assim você aprende como, por exemplo, a libc é carregada e como suas funções podem ser usadas por programas em C.
- Já escrevi um artigo que fala um pouco sobre isso, apesar desse não ser o foco do artigo: https://freedev.medium.com/hook-de-fun%C3%A7%C3%B5es-no-linux-fafa51c966b1
- Veja como
malloc()
funciona: assim você aprende como a alocação dinâmica de memória funciona por debaixo dos panos.- Já escrevi um artigo sobre isso: https://www.mentebinaria.com.br/artigos/entendendo-malloc-e-heap-na-glibc-r70/
- Assembly: é essencial aprender Assembly para entender como as coisas funcionam por debaixo dos panos. E como bônus você vai entender porque C não é uma linguagem de baixo nível.
- Eu escrevi um livro gratuito sobre Assembly x86-64. No livro inclusive eu ensino como o código de máquina da arquitetura funciona: https://mentebinaria.gitbook.io/assembly/
- A especificação da linguagem C: assim você aprende mais a fundo sobre a linguagem e aprende melhor sobre PLT.
- Pode baixar drafts gratuitos aqui: https://www.iso-9899.info/wiki/The_Standard
Bom, repito que espero que entenda que meu objetivo é lhe convidar a aprender mais sobre o assunto e não criticar.
Eu tenho uma comunidade no Discord onde a gente fala bastante sobre C, Assembly, segurança e outros temas legais de computação. Se tiver interesse em participar me dá um contato seu que eu mando o convite (pode ser o próprio nick no Discord).
Ou se não quiser mandar contato publicamente aqui, veja meus contatos no GitHub (tem meu e-mail lá): https://github.com/Silva97