最もタメになる「初心者用言語」は Brainf*ck!

まず、世界中のプログラマが誰でも一番最初に作るであろう「Hello, world!」を標準出力に表示するプログラムを書いてみましょう。

C言語

2006-12-19

char main[]=
    "QVWUZ%@@@@%    P^JJJJJJJJJJJJJJJJJJJJJJJJ3B PVXH, PTXHHHH!0Z_18R_)8)8)8)8"
    ")8)8)8)8WV_38WX_)8)8)8@)8@@@@)8)8)8T_VXOOOOOOOOOOOOOOOOOOOOOOOOWYVX!75Hel"
    "lVP^17^GGGGVX!75o, wVP^17^GGGGVX!75orldVP^17^GGGGVX!75aJ@@5@@@@VP^17^VXP["
    "PZBBBBBBBBBBBBBBC@@@@AHI@AHI@AHI@AHI@AHI@AHI@j__^Y`";

このプログラムを hello.c という名前で保存し、gcc hello.c とコンパイルして ./a.out を実行します。コンパイラ環境を用意しないといけないため、初心者にとってC言語は敷居が高いと言われています。実際このプログラムは環境依存です。x86プロセッサのLinuxのlibc6環境で「Hello, world!」を出力します。さすがOSを記述できるほどの能力を持ったプログラミング言語、いきなり難易度が高すぎです。

Ruby

次に、Rubyで「Hello, world!」を出力するプログラムを書いてみましょう。

http://mono.kmc.gr.jp/~oxy/w/?rrencode

#!/usr/bin/env ruby

($,^$$&&@@_=$$);$><<($,|$$&&(%!%!<<(?!+?!+?!))%(?~-?>+?/-?'))+($,&$,||(%!%!
<<(?!+?!+?!))%(?|-?<+(?[-?;+?&-?!)));($,&$,||@_=$!);$><<($,^$$&&(%!%!<<(?!*
(?.-?-+?&-?$)))%(?}-?=+(?[-?;+?.-?")));($,&$,||@@_=$\);$><<($,|$$&&(%!%!<<(
?!+?!+?!))%(?|-?<+(?\\-?<+?.-?")));($,&$,||_=$$);$><<($,&$,||(%!%!<<(?!+?!+
?!))%(?|-?<+(?|-?\\+(?*-?"+?+-?$))))+($,&$,||(%!%!<<(?!*(?(-?'+?'-?%)))%(?}
-?]+?--?!));($,&$,||@_=$.);$><<($,|$$&&(%!%!<<(?!+?!+?!))%(?|-?\\+?!-?!))+(
$,&$,||(%!%!<<(?!*(?#-?"+?#-?!)))%(?~-?>+(?_-??+(?<-?,+?)-?"))));($,^$$&&@@
_=$&);$><<($,&$,||(%!%!<<(?!+?!+?!))%(?~-?>+(?_-??+(?)-?!+?.-?'))))+($,&$,|
|(%!%!<<(?!+?!+?!))%(?~-?>+(?{-?[+(??-?/+?/-?-))))+($,&$,||(%!%!<<(?!*(?--?
,+?)-?')))%(?{-?;+(?{-?[+?--?!)));($,^$$&&@@_=$;);$><<($,&$,||(%!%!<<(?!+?!
+?!))%(?}-?=+(?^-?>+?'-?#)));($,&$,||_=$.);$><<($,&$,||(%!%!<<(?!*(?/-?.+?)
-?')))%(?_-??+?$-?#));($,^$$&&@_=$&);$><<$/

一般的に、Rubyはプログラムの可読性が高く、再利用性も高く、綺麗でスマートプログラミングができる、と言われていますが、記号ばかりでとても人間の読めたものではありませんね。このようなプログラミングスタイルが横行するRubyはとても初心者に勧められるものではありません。

Perl

次に、Perlで「Hello, world!」を出力するプログラムを書いてみましょう。

ppencode - JAPH perl program encode

#!/usr/bin/perl -w

qq chop lc and print chr ord uc q chop uc and print chr ord q ne sin and 
print chr ord qw q le q and print chr ord q else and print chr ord q pop 
and print chr oct oct ord uc qw q bind q and print chr ord q q eq and print 
chr ord qw q warn q and print chr ord q pop and print chr ord q qr q and 
print chr ord q else and print chr ord qw q do q and print chr hex length 
q q semctl setpgrp chop q 

さきほどのRubyのプログラムと比べると記号が一切入っていないので、人間にとって非常に読みやすいコードになっていますね。
Perlの勉強を始めて半年の方にも大変わかりやすいとの評判です。

このようにPerlには220個の予約語(制御演算子や標準関数)が定義されていますが、これらの予約語を組み合わせるだけで任意の文字列を出力できるのです。
このプログラミングスタイルだと関数呼び出しやスコープの概念もなく、インデントを気にしなくてもいいので、タブ・スペース1,2,3,4,8派などの論争を呼びません。つまり、Perlは自由言語、フリーダムなのです。

Brainf*ck

Brainf*ck - Google 検索

Hello +++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..++
+.>-.------------.<++++++++.--------.+++.------.--------.>+. world!

今度はやっと「Hello」と「world!」の文字がコード中に出てきました。いままでのプログラミング言語では「Hello」の欠片も見えてきませんでした。それ比べてBrainf*ckはカンマ1文字を出力するのに大変苦労しているみたいですが(※ネタです)、予約語も8個しかなく(それ以外の文字はコメントとして無視される)、非常にわかりやすくなっているようです。220個の予約語があるPerlに比べると約27.5倍わかりやすいプログラミング言語だと言えます。しかも、無限のバッファがあればチューリング完全です。

JavaScriptで実装されたBrainf*ck処理系もありますので、ブラウザだけで開発を完結することができます。
Kazuho@Cybozu Labs: Re: BF2JS opimizing compiler

「Brainf*ckはプログラミング教育に最適!」

実際にBrainf*ck開発者のMülleru氏が作ったコンパイラのサイズは123バイト(※単位はキロバイトではありません!)、インタプリタは98バイト。Pentium4のL1キャッシュのラインサイズは64バイトなので、インタプリタコンパイラの処理系はそれぞれ2ラインで、L1キャッシュ全体は8キロバイトなのでプログラミング領域と処理系を含めて余裕でL1キャッシュ内に格納可能です。

習作用のJIT(Just In Time コンパイラ)処理系も作りやすいプログラミング言語なので言語処理系の学習には最適な用途だと思います。あと「自分の学籍番号(もしくははてなid)を出力するプログラムをBrainf*ckで作成せよ」という課題を学校で出したら解答をコピペできないから学生さんの教育用言語としても最適。自分の頭でチューリングマシンの動作と、人間とコンピュータの限界を考えることができるようになります。


以下、おまけ

PHP

"諸君、私はPHPが大好きだ" - ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

PHPで「Hello, world!」プログラム

Hello, world!

さすが、Webアプリ初心者にお勧めできる簡単な言語ですね。言語仕様に全く無駄がありません。
言語設計者の初心者への思いやりがひしひしと感じられるプログラミング言語です。

HQ9+

さらに文字列「Hello, world!」を出力する命令を「H」コマンドとして定義したのがHQ9+。

ライブドアブログ(livedoor Blog)| 読みたいブログが見つかる

H

たったこれだけの1バイト。もはやこれに勝てる言語は・・・。

最後に紹介するのはBrainCrash

BrainCrashとは、BrainF*ckをF*ckして拡張したナンセンス難解言語です。

BrainF*ckに新たな命令が加えられ、さらに以下の点で異なります。
* 実行時、メモリにはHello, world!に相当する72,101,108,108,111,44,32,119,111,114,108,100,33が0番地よりこの順で積まれる。
* 終了時、現在指し示すポインタの値を、ポインタの値が0になるまでポインタを進めて出力する。
実行時のポインタは0を指しています。

つまり、チューリング完全で且つ0バイトでHello, world!を出力することができるのです。

BrainCrashで「Hello, world!」プログラム

これはすごい。すばらしいゼロバイトの世界へようこそ!