Manual

do

Maker

.

com

A "linguagem do Arduino" é C ou C++?

A "linguagem do Arduino" é C ou C++?

A pergunta formada dessa maneira é esquisita, mas é normal ver a pergunta assim ou parecido com isso. Mas o ruim não é a pergunta; pergunta idiota é a que não foi feita, qualquer pergunta é válida. Mas não qualquer resposta. Vamos discorrer sobre a "linguagem do Arduino".

Forma de não responder

Cada um pergunta e responde o que quiser, mas se eu pudesse sugerir, diria para não responder "o arduino não tem linguagem, é um firmware bla,bla..." ou "é assembly mas a IDE bla,blabla...".  Isso não esclarecer nada, quem pergunta quer saber que linguagem é aquela que está sendo utilizada na API da IDE do Arduino para programá-lo. E aí até algumas pessoas com mais conhecimento respondem alguma coisa estranha.

Qual a "linguagem do Arduino" então?

Bom, vamos partir do seguinte princípio; C não é linguagem orientada a objeto; C++ é orientado a objeto e permite utilizar recursos de C e até chamar instruções de assembly (assim como o C também o permite fazê-lo com asm). A API do Arduino oferece o objeto String, logo, podemos dizer que a linguagem de programação utilizada na IDE do Arduino é C++.

Linguagem orientada a objeto

Essa é outra coisa que já vi pessoas comentando em grupo de maneira errada. Linguagem orientada a objeto não significa que ela é feita para desenhar janelas com botões. Uma instância de uma classe em C++ passa a ser um objeto. Um objeto possui métodos e atributos, mas normalmente quando programamos para Arduino não conseguimos ver isso claramente. Mas ainda assim, instanciamos objetos dependendo da biblioteca que utilizamos.

A impressora matricial que fiz, utiliza minha biblioteca (disponível no repositório oficial do Arduino). Trata-se de uma classe C++ e a instância foi feita assim (PrinterDuino):

#include <bbprinter.h>
...
Printer printer;

Nessa classe estão os métodos como AlignColumn, moveLine etc. Também atributos como pin_sleep_column, pin_step_column etc.

"Mas C tem um include para string.h"

O objeto String do Arduino tem um método chamado c_str(), justamente para fazer a conversão para "string" de C. Em C uma string nada mais é do que um array de char com terminador nulo. O terminador nulo é necessário para não haver invasão de memória quando estiver varrendo um array. Esse erro é comumente notado ao utilizar por exemplo, um display LCD 16x2, quando se manda imprimir um "hello" e aparecem caracteres estranhos após a palavra "hello" (ou qualquer outra palavra menor que 16 bytes). Daí tem gente que preenche com espaços o que excede a palavra impressa para completar as posições do display, mas bastaria o terminandor nulo '\0' ao final de "hello".

Quando utilizamos o objeto String do Arduino, não precisamos nos preocupar com esse tratamento, nem com muitas outras coisas, como concatenar strings, comparadores etc.

"Mas não roda C++ no Arduino, ele é só uma microcontrolada"

Verdade, é só uma microcontroladora e C++ é só uma linguagem de programação. Se o compilador tiver culhões para interpretar uma determinada linguagem e gerar um binário para a respectiva arquitetura, sem problemas, poderia ser Pascal. Basta que seja o propósito do compilador utilizado.

Se você prefere utilizar strcpy, strcmp, strcat, dtostrf e outros invés de utilizar o objeto String, está mais voltado para C do que C++. No final, quando se manda compilar é gerado um firmware com o código optimizado o máximo possível pelo compilador, que gera o binário para AVR. E assim é com toda a linguagem compilada; o compilador gera um código binário para a respectiva arquitetura, seja AVR, ARM, MIPS, X86 ou uma das diversas outras. No caso do Arduino, o tipo binário é AVR. No Linux, ELF32/ELF64, no Windows win32/win64, aoutb no NetBSD/FreeBSD etc.

"Como meu computador x86 gera código para microcontroladora então?"

Isso se chama "cross-compiling", que é quando estamos em uma plataforma gerando código para outra. Já escrevi artigos relacionados para compilar programas para Raspberry Pi a partir do computador pessoal x86 ou AMD64. Também escrevi um cross-compiling para a Omega.

Além de cross-compiling, tem também a compilação nativa em arquitetura virtualizada. Já mostrei como executar um Debian para ARM com QEMU nesse artigo. Mostrei como outras opções para Raspberry nesse artigo. E claro, temos a compilação nativa, gerando o binário na própria plataforma como Raspberry, Omega, VoCore etc.

Esses artigos devem dar uma visão melhor do que é compilação cruzada e como o código escrito na IDE do Arduino vira um programa para AVR. No caso do Arduino, o compilador se chama avr-gcc.

Conclusão

Podemos programar em C ou C++ na IDE do Arduino . Nem todos os recursos da linguagem estarão disponíveis, nem todos os recursos disponíveis funcionam da mesma maneira. Para utilizar chamadas de C em C++ ou C++ em C utiliza extern, mas nem vamos falar disso para não começar a complicar o assunto.

Que linguagem de programação se utiliza na IDE do Arduino? - Os elementos do Arduino são código C++.

Aproveite para ver algumas dicas interessantes sobre programação para Arduino nesse outro artigo.

Até a próxima!

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.