Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
プログラミング言語

概要

Arduinoについていろいろ見ていると、実際のところスケッチはどのプログラミング言語で書くのか、正確には、どのプログラミング言語のコンパイラが使われているのかという疑問がわいてきたので確認してみました。

目的

Arduinoで利用するプログラミング言語は何なのかを確認します。

疑問点

もともと、ArduinoではC++を使うのだと思っていました。実際、ArduinoのFAQページの「Can I program the Arduino board in C? 」という項目にはは以下のように書いてあり、avr-g++を使うものだと思っていました。

In fact, you already are; the Arduino language is merely a set of C/C++ functions that can be called from your code. Your sketch undergoes minor changes (e.g. automatic generation of function prototypes) and then is passed directly to a C/C++ compiler (avr-g++). All standard C and C++ constructs supported by avr-g++ should work in Arduino. For more details, see the page on the Arduino build process.

しかし、いろいろ見てみると疑問に思うところがいくつか出てきました。

Arduino-1.5.2についてくるファイルの中に、platform.txt(hardware/arduino/{avr,sam}/platform.txt)というファイルがあります。このファイルの中に、C言語用のコンパイラとC++言語用のコンパイラを規定するような記述がありました。また、Arduino-1.0.4のIDEのソースコードの中に、getCommandCompilerCPP()というメソッドとgetCommandCompilerC()というメソッドがあります。なぜわざわざCコンパイラを呼び出すコードがあるのか?

よくよく考えるとC++ではboolという型が標準で用意されているのにわざわざbooleanという型が用意されているのはなぜ?

実験

C++言語では、「__cplusplus」というマクロが定義されているので、このマクロが定義されているのかどうかでC++言語なのかC言語なのかを判断するような簡単なプログラムを作成して実験しました。

ファイルの拡張子により異なる言語が利用されるのではないかとの推測し、複数の拡張子のファイルを作成しどの言語が利用されるのかを確認することにしました。Arduinoではタブを利用して、複数のファイルを取り扱うことができるので、.ino、.cpp、.cのそれぞれの拡張子のファイルを作成し、それぞれ、どのコンパイラ(言語)が利用されるのかを確認しました。

以下にスケッチを示します。

実際に実験する場合は、以下のファイルを同一のディレクトリに配置して、.inoファイルを開いてください。直接Arduinoソフトウェアに打ち込むときは、ファイル名が表示されているタブの右側の「▼」を左クリックすると、メニューが出てくるので新規タブを追加してください。

language.ino

extern char *string_c;
extern char *string_cpp;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.print(".ino: ");
#ifdef __cplusplus
  Serial.println("C++");
#else
  Serial.println("C");
#endif
  Serial.print(".c  : ");
  Serial.println(string_c);
  Serial.print(".cpp: ");
  Serial.println(string_cpp);
}

void loop() {
  // put your main code here, to run repeatedly: 
}

test.c

#ifdef __cplusplus
  char *string_c = "C++";
#else
  char *string_c = "C";
#endif

test.cpp

#ifdef __cplusplus
  char *string_cpp = "C++";
#else
  char *string_cpp = "C";
#endif

結果は以下の通りでした。

結果を以下にまとめてます。

ファイルの拡張子 言語
.ino C++
.c C
.cpp C++

通常は.inoファイルだけを利用することが多いので、C++を意識しておけばいいと思います。ライブラリを作成したり、複数のファイルにスケッチを書く場合は、拡張子を意識しておかないと、例えばリンクがうまくできないなど、言語の差が影響を及ぼす可能性があります。

バージョン

Arduino 1.0.4



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2013 garretlab all rights reserved.
inserted by FC2 system