aruduino言語は実はC/C++そのものだった。

aruduinoスケッチのソース(*.pde)をIDEからコンパイルすると、ソースと同じ階層に"applet"というディレクトリが作られ、その下にいくつかファイルが作られる。そのなかに(ソースと同じファイル名).cppと言うファイルがある。拡張子よりC++言語で書かれていると推測される。中の構文をみてもC/C++のように見える。*1
このファイルともとのソースと比べるとヘッダファイルのインクルードと、関数の宣言、main()関数が追加されているところだけが異なる。

  • もとのソース(arduinoのサンプルから抜粋。Blink.pde)
int ledPin = 13;                // LED connected to digital pin 13
void setup()                    // run once, when the sketch starts
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}
void loop()                     // run over and over again
{
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(1000);                  // waits for a second
}
  • applet/Blink.cpp

<追記 2009/06/03> ソースコードが一部間違っていたので修正しました。

#include "WProgram.h"
void setup();
void loop();
//↑ここより上が追加された
int ledPin = 13;                // LED connected to digital pin 13
void setup()                    // run once, when the sketch starts
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}
void loop()                     // run over and over again
{
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off
  delay(1000);                  // waits for a second
}
//↓ここより下が追加された
int main(void)
{
	init();
	setup();  
	for (;;)
		loop();
	return 0;
}


一方、arduino開発環境のインストールディレクトリからhardware/cores/arduino/と降りていくとMakefileが見つかる。このMakefileの中にヘッダファイルのインクルードとmain()関数の追加を行う処理が書かれている。

applet_files: $(TARGET).pde
# (中略)
	test -d applet || mkdir applet
	echo '#include "WProgram.h"' > applet/$(TARGET).cpp
	cat $(TARGET).pde >> applet/$(TARGET).cpp
	cat $(ARDUINO)/main.cxx >> applet/$(TARGET).cpp

Makefileの中の処理をさらに読むと、こうしてつくられた *.cpp ファイルをAVRのコンパイラコンパイルしていることがわかる。

applet/$(TARGET).elf: $(TARGET).pde applet/core.a 
	$(CC) $(ALL_CFLAGS) -o $@ applet/$(TARGET).cpp -L. applet/core.a $(LDFLAGS)

以上と、*.pdeがコンパイルされるときにはarduinoIDEからこのMakefileが実行されるらしいということにより、Arduino言語とはC/C++から関数の宣言やmain関数の定義を自動で行うようにしたものであり、AVRのC/C++コンパイラで解釈できる構文は基本的に何でもArduino言語の中でも使えるということになるようだ。class定義とかもできそうだ。

*1:C/C++はあんまり詳しくないので。。