バイリンガルプログラミング

先日の言語融合とはちょっと違いますが、ひとつのプログラムファイルに二種類の言語で同じ文字列を出力するプログラムを書いてみました。バイリンガルプログラミングとでも呼んでみましょうか。

次の hw.sh は"Hello, World!"を出力する、Bシェルで書かれたプログラムです。

% cat hw.sh
#include  /*
g++ -x c++ -c -o hw hw.sh -DC=*/ 
#define echo main() { int g; std::cout <<
echo "Hello, World!";
#define hw ; std::cout << std::endl; }
g++ hw

これは、このように使います。(分かりきったことですね)

% sh hw.sh
Hello, World!

hw.sh はC++プログラムでもあり、

% g++ -x c++ hw.sh
% ./a.out
Hello, World!

とすることが可能です。ソースファイルの拡張子がshなので、-xオプションで言語を明示する事をお忘れなく!そして、この手続きは hw.sh にも書かれていて、hw.sh は自分自身をコンパイルして a.out が作られます。

% sh hw.sh
Hello, World!
% ./a.out
Hello, World!

分かりやすくするために、このプログラムに対して、sh と C++ それぞれのシンタックスで色付けしてみると、以下のようになります。

sh

#include <iostream> /*
g++ -x c++ -c -o hw hw.sh -DC=*/ 
#define echo main() { int g; std::cout <<
echo "Hello, World!";
#define hw ; std::cout << std::endl; }
g++ hw

C++

#include <iostream> /*
g++ -x c++ -c -o hw hw.sh -DC=*/ 
#define echo main() { int g; std::cout <<
echo "Hello, World!";
#define hw ; std::cout << std::endl; }
g++ hw

プリプロセッサ命令が#からはじまってshではコメント扱いされるので、これをうまく使うとこんなこともできますよ、という例ですが、「とことんメタプログラミングをすればどんな言語だって組み合わせる事ができるんじゃないかなぁ・・・」の軽い具体化とも言えるかもしれません。生産性は良く無いですが・・・。