Estou atualmente ministrando um curso de programação de microcontroladores. E como sempre surge a polêmica: Linguagem de alto nivel? Baixo nivel? O que é isso? O que utilizar, e quando?
Bom... "nivel" é um conceito relativo. Todos concordam que as linguagens Assembly são baixo nivel. Mas a partir daí, o cenário fica muito mais confuso!
Essa classificação foi criada quando só existiam os Assemblers e os compiladores procedurais. Nesse cenário, as linguagens Assembly foram consideradas "baixo nivel", porque seus comandos descrevem código nativo de máquina, numa relação um-para-um, portanto estamos na camada mais baixa possível de interação com o hardware. As linguagens compiladas foram, como um todo, consideradas de "alto nivel", pois seus comandos são compilados para código de máquina numa relação um-para-N, e o programador não vê mais os detalhes desse código.
Mas depois as coisas começaram a se complicar. Apareceram as linguagens não-procedurais, nas quais o programador descreve tarefas, e os compiladores se encarregam da geração de comandos. Como chamar isso? Altíssimo nivel? Além disso, apareceram linguagens como o "C", hoje largamente empregado em microcontroladores. O "C", embora compilado, conserva uma relação muito mais direta entre código fonte e código de máquina. Ele "disfarça" muito menos o hardware, e protege muito menos o programador de seus erros de lógica - e nesse aspecto lembra bastante um Assembler. Tanto que alguns programadores que nunca usam Assembler passaram a chamar o "C" de "baixo nivel".
De qualquer forma, eu falava de programação de microcontroladores. E nesse tipo de programação eu nunca vi serem utilizadas linguagens não-procedurais, já que isso nos colocaria longe demais da camada de hardware, o que é inviável nesse tipo de ambiente. Mesmo linguagens de alto nivel são poucas nesse ambiente. Quase exclusivamente "C". E assim voltamos ao princípio de tudo. Num microcontrolador, Assembly é baixo nivel. Linguagem compilada é alto nivel. Ponto.
E agora, depois de falar tudo isso, podemos responder à pergunta. Repetindo o que já disse em ocasiões anteriores: Aconselho sempre meus alunos a estudar cuidadosamente cada "core" de microcontrolador que forem utilizar. E para isso, nada melhor do que programar em Assembler. Depois que conhecerem bem o "core", o "C" é uma boa pedida, pois vai economizar bastante em esforço e tempo de programação.
Ahhh... mas não se esqueçam de dar uma olhada no código de máquina gerado pelo compilador... até hoje não inventaram um compilador tão esperto quanto um programador, e se vocês forem bons nisso sempre poderão otimizar o código gerado!
Minha cabeça é pequena para a quantidade de ideias que me ocorrem. Elas surgem, crescem, juntam-se a outras que já habitam por lá, e quando dou por isso elas estão transbordando, saindo pelo ladrão! Aí o único jeito para não desperdiça-las é encontrar outra morada. Um lugar onde elas vivam e cresçam felizes. E o que pode ser mais feliz para uma boa ideia do que ser partilhada com os donos de outras ideias tão interessantes quanto?
Mostrando postagens com marcador Programação. Mostrar todas as postagens
Mostrando postagens com marcador Programação. Mostrar todas as postagens
segunda-feira, 5 de setembro de 2011
quarta-feira, 20 de julho de 2011
Poliglota? Eu??
- Professor, qual é a melhor linguagem de programação?
Ai, meu santo padin Padre Cícero... vocês só fazem perguntas impossíveis???
Vou ter que me repetir, e responder... depende! Melhor pra que, bro?
Eu já esqueci mais linguagens de programação do que sei atualmente... incluindo algumas que aprendi quando a maioria de vocês ainda não estava nem na prancheta de desenho!
Senão vejamos: Fortran, Algol, Cobol, Basic, Miis/Mumps, dBase/Clipper, Linc, Pascal, Delphi/Pascal, C/C++, Assembler '80, Assembler '86, Assembler PIC16, Assembler 8051, Assembler S08, Java... (as amarelas são as obsoletas, que já não uso há tanto tempo que certamente esqueci tudo!)
Putz, será que esqueci alguma?
Na década de '60, Niklaus Wirth, que considero um gênio na área da informática, tanto quanto considero meu ídolo Ferdinand Porsche na área da mecânica, desenhou o Algol, a primeira linguagem de programação estruturada.
O projeto do Algol é tão bom e consistente que, baseado nele, Wirth desenhou o Pascal, publicado em '70 e em uso até hoje e, 50 anos depois do Algol, todos programamos em C e Java, cujas estruturas e sintaxe são notavelmente parecidas com as do Algol e do Pascal.
Aliás, é interessante notar que o Unix tem a fama de ser o primeiro sistema operacional desenvolvido em linguagem de alto nível - C - mas muuuitos anos antes, na década de '60, os equipamentos Burroughs utilizavam um sistema operacional, o Burroughs MCP, totalmente desenvolvido em Algol.
Mas vamos simplificar, deixar de lado as reminiscências históricas, e responder à pergunta:
Programar sistemas comerciais em um PC é bem diferente de programar sistemas de automação em microcontroladores.
Em um PC, geralmente temos hardware sobrando, e estamos bastante isolados da camada física do hardware. No máximo vemos a camada de APIs do SO. Portanto não há razão para se utilizar um Assembler, e iremos sempre programar em alto nivel. Se essa pergunta me fosse feita poucos anos atrás, eu não hesitaria em citar o Delphi/Pascal (e seu irmão Kylix para quem gera código para Linux) como a melhor alternativa. É uma linguagem bem estruturada, poderosa, e extremamente bem documentada.
No entanto o Delphi, nos últimos anos, "parou no tempo", e seus recursos para programação web-based são muito fracos. E ele começou a perder fôlego. Aí apareceu o Java, já no fim dos anos '90.
Hesitei muito em utilizar o Java. Em primeiro lugar, como programador "antigo" (aiii... que termo horrível!) tenho um enorme respeito pelos recursos de hardware, que são tratados pelos programadores modernos como inesgotáveis. E o Java não é um código nativo - sua proposta é ser um código universal, que rode em qualquer plataforma. Lindo isso - pena que não é verdade. Até hoje não se conseguiu realizar a utopia de um código realmente independente da plataforma. Sempre existe aquele pequeno detalhe diferente que nos obriga a particularizar o código. Só que para ser universal ele roda sobre uma outra camada de software, a JVM (Java Virtual Machine). Ou seja, no fundo é um código interpretado. Daí bem menos eficiente.
Mas finalmente me rendi ao inevitável. E o inevitável é utilizar o que o mundo todo utiliza. Não adianta um dinossauro ficar falando que Cobol é a melhor linguagem do mundo, se nem compiladores Cobol se encontra mais para as plataformas modernas! Assim passei a programar Java, feliz da vida - procuro sempre ver o lado bom das coisas - porque ele é bem estruturado, e sua sintaxe quase igual à do C, que conheço bem e utilizo muito.
Já quando se fala de microcontroladores... Aqui, senhores, o buraco é mais embaixo! Estamos programando em um ambiente pequeno. Poucos recursos. Hardware extremamente limitado. Diretamente sobre o hardware, ou em um SO muito simples, basicamente um gerenciador de tarefas, algumas vezes nem mesmo preemptivo.
Nesse caso (sei que muitos discordam de mim, mas mantenho minha posição) é necessário conhecer muito bem o seu hardware! Conhecer o Assembler do "core" utilizado, para ser capaz de otimizar os loop mais apertados - codificando em Assembler ou, no mínimo, verificando o código gerado pela linguagem de alto nivel. Se olharem na lista ali em cima, vocês verão os "Assembler" de todos os "core" que eu utilizei a fundo até hoje.
E, claro, conhecer uma linguagem de mais alto nivel adequada, que ninguém é de ferro para desenvolver toda uma aplicação complexa em Assembler. E aí, no domínio dos microcontroladores, a única opção atual - e parece que por mais um bom tempo - é o C.
Ai, meu santo padin Padre Cícero... vocês só fazem perguntas impossíveis???
Vou ter que me repetir, e responder... depende! Melhor pra que, bro?
Eu já esqueci mais linguagens de programação do que sei atualmente... incluindo algumas que aprendi quando a maioria de vocês ainda não estava nem na prancheta de desenho!
Senão vejamos: Fortran, Algol, Cobol, Basic, Miis/Mumps, dBase/Clipper, Linc, Pascal, Delphi/Pascal, C/C++, Assembler '80, Assembler '86, Assembler PIC16, Assembler 8051, Assembler S08, Java... (as amarelas são as obsoletas, que já não uso há tanto tempo que certamente esqueci tudo!)
Putz, será que esqueci alguma?
Na década de '60, Niklaus Wirth, que considero um gênio na área da informática, tanto quanto considero meu ídolo Ferdinand Porsche na área da mecânica, desenhou o Algol, a primeira linguagem de programação estruturada.
O projeto do Algol é tão bom e consistente que, baseado nele, Wirth desenhou o Pascal, publicado em '70 e em uso até hoje e, 50 anos depois do Algol, todos programamos em C e Java, cujas estruturas e sintaxe são notavelmente parecidas com as do Algol e do Pascal.
Aliás, é interessante notar que o Unix tem a fama de ser o primeiro sistema operacional desenvolvido em linguagem de alto nível - C - mas muuuitos anos antes, na década de '60, os equipamentos Burroughs utilizavam um sistema operacional, o Burroughs MCP, totalmente desenvolvido em Algol.
Mas vamos simplificar, deixar de lado as reminiscências históricas, e responder à pergunta:
Programar sistemas comerciais em um PC é bem diferente de programar sistemas de automação em microcontroladores.
Em um PC, geralmente temos hardware sobrando, e estamos bastante isolados da camada física do hardware. No máximo vemos a camada de APIs do SO. Portanto não há razão para se utilizar um Assembler, e iremos sempre programar em alto nivel. Se essa pergunta me fosse feita poucos anos atrás, eu não hesitaria em citar o Delphi/Pascal (e seu irmão Kylix para quem gera código para Linux) como a melhor alternativa. É uma linguagem bem estruturada, poderosa, e extremamente bem documentada.
No entanto o Delphi, nos últimos anos, "parou no tempo", e seus recursos para programação web-based são muito fracos. E ele começou a perder fôlego. Aí apareceu o Java, já no fim dos anos '90.
Hesitei muito em utilizar o Java. Em primeiro lugar, como programador "antigo" (aiii... que termo horrível!) tenho um enorme respeito pelos recursos de hardware, que são tratados pelos programadores modernos como inesgotáveis. E o Java não é um código nativo - sua proposta é ser um código universal, que rode em qualquer plataforma. Lindo isso - pena que não é verdade. Até hoje não se conseguiu realizar a utopia de um código realmente independente da plataforma. Sempre existe aquele pequeno detalhe diferente que nos obriga a particularizar o código. Só que para ser universal ele roda sobre uma outra camada de software, a JVM (Java Virtual Machine). Ou seja, no fundo é um código interpretado. Daí bem menos eficiente.
Mas finalmente me rendi ao inevitável. E o inevitável é utilizar o que o mundo todo utiliza. Não adianta um dinossauro ficar falando que Cobol é a melhor linguagem do mundo, se nem compiladores Cobol se encontra mais para as plataformas modernas! Assim passei a programar Java, feliz da vida - procuro sempre ver o lado bom das coisas - porque ele é bem estruturado, e sua sintaxe quase igual à do C, que conheço bem e utilizo muito.
Já quando se fala de microcontroladores... Aqui, senhores, o buraco é mais embaixo! Estamos programando em um ambiente pequeno. Poucos recursos. Hardware extremamente limitado. Diretamente sobre o hardware, ou em um SO muito simples, basicamente um gerenciador de tarefas, algumas vezes nem mesmo preemptivo.
Nesse caso (sei que muitos discordam de mim, mas mantenho minha posição) é necessário conhecer muito bem o seu hardware! Conhecer o Assembler do "core" utilizado, para ser capaz de otimizar os loop mais apertados - codificando em Assembler ou, no mínimo, verificando o código gerado pela linguagem de alto nivel. Se olharem na lista ali em cima, vocês verão os "Assembler" de todos os "core" que eu utilizei a fundo até hoje.
E, claro, conhecer uma linguagem de mais alto nivel adequada, que ninguém é de ferro para desenvolver toda uma aplicação complexa em Assembler. E aí, no domínio dos microcontroladores, a única opção atual - e parece que por mais um bom tempo - é o C.
Assinar:
Postagens (Atom)
