Logo address

Hello World

最初のプログラミングでお馴染みの Hello World です。
#include <u.h>
#include <libc.h>

void
main(void){
	print("Hello World\n");
}
このファイルの名前を hello.c としましょう。
Plan9/i386 では次の手順でコンパイルし実行します。
(term% はプロンプトです)
	term% 8c hello.c               # hello.8 を生成する
	term% 8l hello.8               # 8.out を生成する
	term% 8.out                    # 8.out を実行する
	Hello World
	term%
UNIX の Hello World プログラムと結構違っていることに注意します。

Plan9 では2つの include 文

	#include <u.h>
	#include <libc.h>
で多くのの場合間に合ってしまいます。UNIXの様に include 文の山にはなりません。

printf ではなくて print であることに注意します。
Plan9 にも printf はありますが、UNICODE を扱えません。
print は Plan9 の UNICODE サポートの為に追加されました。

UNIX で旧来使用されてきたお馴染みの I/O 関数
printf, scanf, puts, gets などを使用したい時には

	#include <stdio.h>
を含めます。(stdio.h は libc.h の後に置きます)

コンパイルから実行へ至る手順ですが、
cc は使いません。
cc はPlan9 の ANSI/POSIX 環境として存在はするのですが、ネイテブな環境では
mk (make の Plan9 版)
を使いましょうとの主旨です。

Plan9 では分散OSなので何種類かのCPUをサポートする必要がある。
従って実行ファイルを作成するまでの手順は複雑になるので、cc コマンドに
任せないで mk で処理した方が得策と判断したのでしょうね。

Plan9 では makefile ではなく mkfile を用いる。
いちいち mkfile を作成するのは面倒と思うかも知れないが、mkfile の雛形を
作って置けばそれほどでもない。
私はさらに a.c の雛形も持っている。
必要な雛形をコマンドでカレントディレクトリに作成できるようにしておくのだ。

#include <u.h>
#include <libc.h>

void
usage(void)
{	print("usage: ....\n");
	exits("usage");
}

void
main(int argc, char *argv[])
{	int dflag, hflag;
	char *p, system[32];
	ARGBEGIN{
	case 'd':
		dflag++; break;
	case 'h':
		hflag++;
		p = ARGF();
		if(p==0) usage();
		strcpy(system, p);
		break;
		...
	default: usage();
	}ARGEND
	...
}
この雛形から不要なコードを削り、必要なコードを追加する。

main(...) の ... の中には環境変数が存在しない事に注意する。
Plan9 では環境変数は exec の引数として子プロセスに渡されるのではなく
ディレクトリ /env のファイルとして渡されるので扱いが全く異なるのだ。

実行時オプションの処理にマクロ(ARGBEGIN, ARGEND, ARGF)が準備されている。

Plan9 では exit(int n) を使わずに exits(char *err) を用いる。