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