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.

Conteúdo excluído
1

Sim, são coisas muito diferentes. C é uma linguagem de alto nível e Assembly linguagem de baixo nível, por isso a diferença absurda entre as duas.

[...]mas uma é de montagem e a outra é de propósito geral[...]

"De montagem" não é um "tipo" de linguagem. Quando as pessoas dizem que "Assembly é linguagem de montagem" é um erro de tradução. Assembly é, de fato, a palavra montagem em Inglês. Portanto em Inglês "Assembly language" é traduzido para "linguagem de montagem". Confira no Google Tradutor:

translate

E ser ou não uma linguagem de propósito geral não tem nada a ver com o assunto. O oposto de "linguagem de propósito geral" é "linguagem de propósito específico" e não "linguagem de montagem". Exemplos de linguagens de propósito específico são: AWK, SQL, RegExp etc.

[...]muito do que chamamos de "Assembly" só fazem sentido em Assembly x86

Na introdução do meu livro explica isso muito bem. Não existe "uma" linguagem Assembly. O ponto é que Assembly é uma notação em formato de texto para o código de máquina da arquitetura. E como cada arquitetura diferente têm um código de máquina diferente, por consequência disso o Assembly de cada arquitetura será diferente.

É por isso que Assembly é considerado linguagem de baixo nível. Veja que cada instrução Assembly é de fato uma instrução real do processador, porém em notação em formato de texto. Que é diferente de uma linguagem de alto nível como C, onde as instruções não refletem em nada instruções reais do processador. São instruções totalmente abstratas projetadas para um modelo de máquina abstrata. Que é isso que a gente chama de linguagem de alto nível.