Executando verificação de segurança...
10

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".

  1. 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.
  2. 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.
  3. «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).
  4. 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 combo malloc() e free() 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:

  1. 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.
    1. Material sobre sistema de tipos: https://lucacardelli.name/papers/typesystems.pdf
    2. Material sobre paradigmas: https://www.info.ucl.ac.be/~pvr/VanRoyChapter.pdf
    3. Livro sobre compiladores: Compiladores: Princípios, Técnicas e Ferramentas (ISBN: 978-8588639249)
  2. 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.
    1. Livro sobre SO: Sistemas Operacionais Modernos (ISBN: 978-8543005676)
  3. 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).
  4. 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.
    1. 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
  5. Veja como malloc() funciona: assim você aprende como a alocação dinâmica de memória funciona por debaixo dos panos.
    1. Já escrevi um artigo sobre isso: https://www.mentebinaria.com.br/artigos/entendendo-malloc-e-heap-na-glibc-r70/
  6. 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.
    1. 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/
  7. A especificação da linguagem C: assim você aprende mais a fundo sobre a linguagem e aprende melhor sobre PLT.
    1. 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

Carregando publicação patrocinada...
3
1

Estou gostando muito do seu livro gratuito sobre Assembly x86-64.
Há tempos atrás aprendi um pouco de Assembly do Z80 e de alguns PIC, mas preciso me atualizar.

Quanto à classificação em linguagens de Alto e Baixo nível é útil mas é uma classificação antiquada; na época em que essa classificação começou a ser utilizada (há mais de 40 anos), era trivial separar as linguagens de Alto e Baixo nível; atualmente temos linguagens de mais Alto nível com relação umas às outras e de mais Baixo nível com relação umas às outras. Quero dizer que: Python é de mais alto nível do que PHP, que é de mais alto nível do que C++, que é de mais alto nível do que C, que é de mais alto nível do que Assembly, que por fim é de mais alto nível do que o executável.