Hello Worldとは

新しいプログラミング言語に初めて触れる際には、まず、その言語での最小限のプログラムを書いてみて、その基本動作を確認するのがよいでしょう。最小限のプログラムとしては、何らかのテストメッセージを画面に表示するだけのプログラムが適しています。そのテストメッセージとしては、習慣的に「Hello World」という文字列を使うことが多く、このようなプログラムのことをHello Worldのプログラムと呼びます。

Hello Worldのプログラムを記述してみることにより、その言語で最低限必要な文法や書式、コンパイルが必要な言語の場合はコンパイルの方法、さらに実行の方法を確認することができます。本格的なプログラムを作成する場合にも、ますはこのHello Worldのプログラムを雛型として利用すると便利です。

この連載では、さまざまなプログラミング言語の、さまざまな使用場面におけるHello Worldのプログラムを次々に紹介しながら、各言語のTipsや、ちょっと変わったHello Worldまで解説していきたいと思います。

C言語でのHello World

第1回は、最もポピュラーなプログラミング言語であるC言語を取り上げます。C言語でのHello Worldプログラムはリスト1のとおりです。

リスト1 printf()を使う方法(c_lang_printf.c)

#include <stdio.h>           ← 標準入出力ライブラリ関数を使うために必要

int                          ← int(整数)を返す関数として宣言
main()                       ← main()関数の開始
{                            ← 関数本体を{ }で囲む
  printf("Hello World\n");   ← printf()関数でメッセージを標準出力に出力
  return 0;                  ← 正常終了のため、main()関数の戻り値として0を返す
}                            ← main()関数の終了

このプログラムで実際にメッセージを出力しているのは、C言語の標準入出力ライブラリ関数であるprintf()を呼び出しているところです。このように、printf()の引数として、" "で囲んだ文字列を指定することにより、メッセージ表示が可能です。なお、文字列の最後には改行を表す"\n"が必要です。

そのほか、C言語として最小限の体裁を整えるため、main()関数の宣言、main()関数の戻り値としてreturnの記述、printf()関数を使うための#includeの記述などが必要です。

C言語のプログラムは、実行例1のようにコンパイルします。ここではコンパイラとしてgccを使い、念のため最適化オプション-O2)を付けています。作成された実行バイナリファイルを実行する際には、ファイルがカレントディレクトリにあることを明示するため、./をコマンド名の頭に付けて実行します。

実行例1 C言語のコンパイルと実行

$ gcc -O2 -o c_lang_printf c_lang_printf.c   ← gccでC言語のコンパイルを実行
$ ./c_lang_printf            ← 作成された実行バイナリファイルを実行
Hello World                  ← 確かにHello Worldが表示される
$                            ← シェルのプロンプトに戻る

printf()関数は、本来は10進数の表示そのほかの書式指定が可能な関数です。このため、文字列中に%が含まれている場合、%d(10進数表記に変換)などの書式指定文字列であると意図せずに解釈されてしまう可能性があります。

そこで、どのような文字列でも問題なく出力できるようにするには、printf()の第1引数を"%s"(単純な文字列に変換)とし、メッセージ本体は第2引数に移動します。リスト2の例では、わかりやすいように"\n"だけは第1引数の"%s"の直後に付けています。

リスト2 書式指定を考慮してprintf()を使う方法(c_lang_printf2.c)

#include <stdio.h>

int
main()
{
  printf("%s\n", "Hello World");  ← %sで、単純な文字列の書式を指定
  return 0;
}

fputs()/puts()を使う(書式指定は不要)

書式指定が必要ない場合、printf()ではなく、もっと単純な関数でメッセージを出力することができます。fputs()を使うと、リスト3のようになります。fputs()の場合、第2引数で出力先を指定する必要があり、ここには標準出力であるstdoutを指定します。

リスト3 fputs()を使う方法(c_lang_fputs.c)

#include <stdio.h>

int
main()
{
  fputs("Hello World\n", stdout);  ← fputs()では標準出力(stdout)を引数で指定
  return 0;
}

リスト4のようにputs()を使えば、stdoutの指定が不要になります。さらに、"\n"の改行も不要になり、出力文字列にはputs()関数側で"\n"が追加されます。

リスト4 puts()を使う方法(c_lang_puts.c)

#include <stdio.h>

int
main()
{
  puts("Hello World");       ← puts()では"\n"を付ける必要なし
  return 0;
}

write()を使う(システムコール直接呼び出し)

printf()やfputs()などの標準入出力ライブラリ関数を使わずに、システムコールと直結したwrite()関数を直接呼び出すこともできます。

write()を使う場合、リスト5のように第1引数で標準出力のファイル記述子である1番を指定し、第3引数で改行コードも含めた文字列の文字数である12文字を指定する必要があります。C言語の仕様で文字列の終端に付けられている'\0'は無視されます。また、write()の場合はインクルードファイルとしてunistd.hが必要です。

リスト5 write()を使う方法(c_lang_write.c)

#include <unistd.h>                ← write()ではインクルードファイルも変わる

int
main()
{
  write(1, "Hello World\n", 12);   ← 引数でファイル記述子と文字数を指定
  return 0;
}

なお、write()は低レベルの出力関数であるため、OSやコンパイラの環境によっては、改行コードがうまく出力されないことがあります。その場合は、文字列中の"\n"の記述を"\r\n"に修正し、(文字数も13文字にして)明示的にCR-LFを出力すると良いでしょう。