(これは古い日記です)

さて、このまま止まってしまうのもあれなので、何か書きます。じゃあとりあえずC++絡みで。

C++にはTemplateという機能がある。これは簡単にいってしまえば、Cのマクロの凄い奴、といった感じの機能である。もともとはデータ構造で型を抽象化するためのもので、現在STLとなっているものを実装するために作られた(多分)。

// int 型の可変長配列の作成
std::vector<int> v;

しかし、パラメータには型だけでなく、値もとることができる。そのため、例えばフィボナッチ数列の20番目の値を求める、といったことができる。

// Fibonacci.h
#ifndef __FIBONACCI_TEST__
#define __FIBONACCI_TEST__
template<unsigned int i>
struct Fibonacci {
    static const int value = Fibonacci<i - 1>::value + Fibonacci<i - 2>::value;
};
template<>
struct Fibonacci<1> {
    static const int value = 1;
};
template<>
struct Fibonacci<2> {
    static const int value = 1;
};
#endif // __FIBONACCI_TEST__
// Main.cpp
#include <iostream>
#include "Fibonacci.h"
template<unsigned int i>
void OutputFibonacci()
{
    OutputFibonacci<i - 1>();
    std::cout << "Fibonacci<" << i << ">::value == " << Fibonacci<i>::value << '\n';
}
template<>
void OutputFibonacci<1>()
{
    std::cout << "Fibonacci<" << 1 << ">::value == " << Fibonacci<1>::value << '\n';
}
int main()
{
    OutputFibonacci<20>();
    std::cout << std::flush;
    return 0;
}

ここで重要なのは、この計算が「コンパイル時に」行われるという点である。コンパイル後、フィボナッチ数列の20番目の値は定数として実行ファイルに埋め込まれ、実行時には定数を出力するだけである。つまり、フィボナッチ数列の計算は、コンパイラが行っている。これを利用すれば、おそらく円周率を100万桁まで求める、みたいなことが、コンパイル時に行えることになる。

ということで、ニューロの人とか、だれかやりませんか?数十時間かかる計算をコンパイル時に。g++が計算してくれます。コンパイルに数十時間かかりますが。

実際は、テンプレートをまともに実装している処理系があまりないので難しいとは思いますが。上の計算、100番目の値を計算しようとしたら、「オプションコンテキストの応答深度の上限を超過」とかいうエラーが出てコンパイルできませんでした(Borland C++ Compiler 5.5.1)。