C OU NÃO C, EIS A QUESTÃO

I. INTRODUÇÃO
A escolha da linguagem a ser usada no desenvolvimento de um projeto com microcontroladores é um fator de extrema importância, pois impacta em diversos aspectos: tempo (e, portanto custo) de desenvolvimento, custo de ferramentas de desenvolvimento, portabilidade de código, facilidade de depuração, futuras alterações e atualizações tecnológicas, dentre outros.
No universo dos computadores pessoais há diversas opções de linguagens, podendo atender a necessidade específicas de cada desenvolvedor ou projeto.
No universo dos microcontroladores existe também a possibilidade de se programar em diversas linguagens de programação de médio e alto nível, tais como C/C++, Pascal, Basic e Java. Em oposição a essas linguagens existe sempre a opção de se programar na linguagem Assembly nativa de cada microcontrolador.
É muito discutida entre os profissionais da área qual a melhor linguagem de programação para microcontroladores. Essa discussão concentra-se principalmente na questão das vantagens e desvantagens de uma linguagem de médio ou alto nível em relação ao Assembly nativo do microcontrolador.
Obviamente deve-se considerar, em primeiro lugar, a linguagem mais adequada para cada aplicação em especial. Além disso, é importante considerar também o quanto o desenvolver está familiarizado com uma linguagem e o fator subjetivo de qual linguagem lhe agrada mais. Apesar de ter sempre em mente essas premissas, vamos expor aqui porque, na maioria das vezes e para grande parte dos desenvolvedores, a linguagem C é a mais adequada. linguagem-C

1.2. Passado e Futuro da linguagem C

Desde seu surgimento no início dos anos 70, a linguagem C sofreu alterações, ampliações, tornou-se um padrão estável e gerou descendentes.
C foi desenvolvido inicialmente para a implementação do sistema operacional Unix. Como o Unix se popularizou e foi portado para várias plataformas diferentes, foi necessário implementar compiladores C para diferentes arquiteturas. Foi então que a características de portabilidade do C se tornou mais evidente.
Em meados dos anos 80 a ANSI (American National Standard for Information Systems) criou uma norma padronizando o C, criando uma língua comum a ser reconhecida por todos os compiladores C.
Em virtude da evolução da computação, o C gerou várias linhas de evolução. Para atender aos conceitos da programação orientada a objeto foi desenvolvido o C++. Seguindo essa linha, surgiu a linguagem Java. Para aplicações para Internet a linguagem PHP é descendente direto do C. Para aplicações para celulares foi criado o C#. Além disso, várias ferramentas usam C/C++ para desenvolver código com interface gráfica amigável, como o Visual C++ ou o Borland C++ Builder.

1.3. C é a melhor opção

Há quem defenda ferrenhamente que o desenvolvedor profissional deva trabalhar em Assembly. Os principais argumentos a favor desse modo de pensar são a eficiência (em temos de ocupação de memória) do código gerado por um programador experiente, o menor tempo de execução do programa e o controle total, já que nada é feito sem que o programador saiba e queira. A eficiência de código é importante na medida em que a memória disponível nos componentes em questão é restrita e tem grande impacto no custo do componente. Também se perde o controle do código gerado, já que toda vez que
um compilador é usado o código Assembly produzido sai do controle do desenvolvedor. No passado, compiladores pouco confiáveis apresentavam erros de implementação difíceis de serem depurados. E ainda, se o conjunto de instruções não possuir certas características o uso de compiladores gera um código significativamente maior e mais lento que um de mesmas funções em Assembly.
Por outro lado, é mais difícil de se desenvolver algoritmos complexos em Assembly, tornando o trabalho de desenvolvimento mais lento e mais caro. Realizar operações matemáticas complexas (por exemplo, com variáveis do tipo ponto flutuante) torna-se bastante confuso. Como a linguagem nativa e os modelos de memória de cada arquitetura de microcontroladores diferem, é exigido um tempo muito longo de estudo para se adaptar a um novo conjunto de instruções. Instruções de mesma função podem ter mnemônicos totalmente diferentes em diferentes conjuntos de instrução. A grande quantidade de linhas de código e a pouca inteligibilidade tornam os processos de depuração demorados e difíceis. Sendo o Assembly uma linguagem de programação não estruturada os custos de desenvolvimento, depuração e manutenção tendem a ser maiores. Por fim, o reaproveitamento de código e a portabilidade de programas entre uma arquitetura e outra é quase impossível, resultando na reescrita de várias centenas ou milhares de linhas de programa.
No passado era possível a um desenvolvedor especializar-se nessa ou naquela arquitetura, tornando-se cada vez mais experiente no uso de um set de instruções e realizando todos seus projetos com alguns poucos microcontroladores compatíveis. Hoje, porém, a variedade de microcontroladores é muito grande. Praticamente todos os fabricantes de circuitos integrados digitais têm suas famílias de microcontroladores. A concorrência de preço entre esses fabricantes e a diversidade de configurações dos microcontroladores exige que as empresas optem por usar diferentes arquiteturas em diferentes projetos, ou mesmo substituir componentes em produtos já existentes. É necessário que o desenvolvedor de sistemas microcontrolados seja capaz de se adaptar aos diferentes modelos de memória e conjunto de instruções, com pouco tempo para o estudo detalhado de cada caso.
A solução então é utilizar uma linguagem de mais alto nível, que por princípio são independentes do hardware. O desenvolvedor concentra seu trabalho na criação de algoritmos e funcionalidades no projeto e deixa o trabalho de implementação para o compilador. Surge então outro problema: qual linguagem usar?

Para muitas pessoas a resposta é: o C! Vejamos por que.

Em primeiro lugar, o C é considerado uma linguagem de médio nível, isto é, mais amigável para o ser humano, mas mantendo recursos de baixo nível. Em virtude disso, o C permite gerar códigos mais eficientes quando comparado com outros compiladores. Há também a vantagem da independência do hardware que permite que um projeto seja portado de uma arquitetura para outra com poucas alterações no código. Essas características do C não são por acaso. A linguagem foi desenvolvida no início dos anos 70 por Dennis Ritchie especificamente para o desenvolvimento do sistema operacional UNIX. Na época o dilema era quase o mesmo: construir sistemas operacionais em assembly era demorado e dispendioso e todo o trabalho tinha que ser refeito a cada novo processador criado. Os computadores da época tinham pouca memória e os modelos usados por Ritchie não eram capazes de implementar operações de ponto flutuante diretamente. Ritchie desenvolveu uma linguagem simples, fácil de ser aprendida, mas com recursos que permitem o desenvolvimento de programas complexos, como sistemas operacionais, que permite portabilidade de código sem prejudicar as funcionalidades de baixo nível, gerando um código bastante “enxuto”, isto é, eficiente no uso da memória.
Por ser uma linguagem estruturada, o C exige que o programador siga boas práticas de programação, evitando assim erros que, em Assembly, poderiam passar despercebidos.
A portabilidade de código fica garantida, pois existe uma norma que rege a linguagem C. Todo compilador que segue o padrão ANSI deve conseguir reconhecer o mesmo código gerado, independente da arquitetura alvo. Os compiladores C profissionais são bastante confiáveis, geram código eficiente e livre de bugs de implementação.
Uma vantagem adicional do C são as bibliotecas de funções que acompanham os compiladores. Além das bibliotecas convencionais do padrão ANSI a maioria dos compiladores possui bibliotecas para uso das funcionalizadas específicas de cada microcontrolador. Além do ganho de tempo em se usar as bibliotecas já prontas existe também um ganho de eficiência de código, já que essas funções são normalmente implementadas em Assembly para otimização de memória e tempo.
Como o C é utilizado também em computadores, trata-se de uma linguagem muito difundida nas escolas e universidade. Também os profissionais que tiveram uma formação acadêmica voltada para o PASCAL terão facilidade em desenvolver em C.

Na tabela 2.1 se pode observar uma comparação entre as linguagens C e Assembly.

tabela-1

Contudo, não se deve entender que o estudo da linguagem Assembly deve ser negligenciado. Assim como o bom piloto de corrida entende tanto da mecânica de seu carro quanto os engenheiros que o projetaram, o bom desenvolvedor deve ter sólidos conhecimentos da arquitetura, modelo de memória e conjunto de instruções Assembly do microcontrolador com o qual trabalha. É imprescindível conhecer bem o assembly, até para poder conseguir os melhores resultados em C. Sempre é possível analisar o código Assembly gerado pelo compilador, buscando formas de otimizá-lo. Além disso, em situações críticas, é possível inserir linhas de código Assembly dentro de um programa escrito em C.

1.4. Conclusão
Por essas e por outras razões os fabricantes de microcontroladores têm, já há alguns anos, desenvolvido arquiteturas de microcontroladores otimizadas para o uso da linguagem C. Alguns tipos de instruções e modos de endereçamento são incluídos para tornar mais fácil a tradução do código C para o código de máquina. Isso acontece com o PIC18 no set de instruções convencional e mais pronunciadamente no set estendido.
Como adaptações do processador ao C podem citar as instruções voltadas para endereçamento indireto e para leitura de constantes na memória de programa, além da presença de diversos ponteiros para endereçamento indireto de variáveis (facilitam a implementação de vetores, matrizes e variáveis do tipo ponteiro).
Esperamos ter demonstrado que a linguagem C tem sido cada vez mais usada no desenvolvimento com microcontroladores, trazendo diversas vantagens que justificam seu uso em aplicações profissionais.
Uma última observação deve ser feita quanto ao uso de linguagens orientadas a objeto. Apesar da orientação a objeto ser uma tendência na programação e trazer inegáveis benefícios ao desenvolvimento de software, hoje ainda ela não usada em larga escala. Uma provável causa é o maior consumo de memória que a técnica acarreta. Contudo já existem compiladores que permitem trabalhar de forma orientada a objetos (em C++, Java, etc). No futuro otimizações na arquitetura dos microcontroladores serão feitas para tornar o código orientado a objeto mais leve aos microcontroladores.

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Site hospedado por WordPress.com.

Acima ↑

%d blogueiros gostam disto: