Kandoの日記: Nim言語、調べてみないとなぁ 7
日記 by
Kando
10年ほど前失業してた頃に就職活動としてC++テンプレートのコンパイル時展開を利用してで浮動小数点演算を実装し、FFTと動的計画法を計算していました。
「テンプレート・メタ・プログラミングによるFFTの適応的最適化」
http://ci.nii.ac.jp/naid/110002768692
このような所謂テンプレートメタプログラミングはジェネラティブプログラミング可能な実用レベルの処理系が今すぐに使えるという所に意味がありますが、元々C++のテンプレート機構は総称の1実装であってテンプレートメタプログラミングを意図して設計されてはいないので言語仕様としては人間にやさしくないという重大な欠点があります。
なのでこの曲芸的なテンプレートメタプログラミング事例は「ジェネラティブ・プログラミングの機能を最初から考慮に入れた言語が必要だよね!これはそういう言語があればこういうことができるというサンプル。」という趣旨でした。
…とはいえ中々そう言う仕事に取り組める状況でもないのでそういう言語の提案が出来ないまま10年が過ぎました。
(できるできないだけならLispでいいじゃんという御意見もあるでしょうが、もうちょっと普通の人が慣れ親しんだ系統の言語の拡張で提案したいなと。)
…と思っていたら最近Nim[ http://nim-lang.org/ ]という言語がコンパイル時計算を最初から考慮に入れた静的な型づけをする手続き型言語といって売りだしてるようなので調べてみないとなぁ……と思う今日この頃。
書いて極楽読んで地獄 (スコア:0)
マクロやテンプレート地獄は勘弁願いたいがOpen C++みたいに構文木を直接扱うのもなあと思っていました
今ではすっかりジェネラティブプログラミング嫌いになりましたが
多分書くのも読むのも地獄だけど、今そこにある (スコア:1)
上にも書きましたがコンパイル時に展開を行うテンプレートは総称型を実現するための実装でしかなく、
ジェネラティブ・プログラミングのために設計されたものではありません。
オブジェクトコードの実行効率を考えてコンパイル時の展開で総称を実現し、
柔軟な定義のために再帰的定義を可能にし、整数引数を用意し、特化による条件分岐を入れたら
「おっと、チューリング完全になってしまったぞ?」ということが発見された。
……という経緯で生まれたものがC++のテンプレートメタプログラミング技法です。
というわけでなにせ「目的外利用」なので
テンプレートメタプログラミングでジェネラティブ・プログラミングを行うのが辛くなってもあまり文句は言えないでしょう。
テンプレートメタプログラミングで唯一の利点は言語規格で仕様が定められ実用レベルの性能を持つコンパイラで今、現にサポートされているので
ジェネラティブなコードをすぐに開発し、実験し始めることができるという点だけです。読み易さ、書き易さは期待できません。
私の希望としては最初からジェネラティブ・プログラミングのためのメカニズムを備え、
エディタやデバッガといったツールもきちんとそれをサポートできるようなプログラミング言語が欲しいよね……という感じです。
Re: (スコア:0)
> 構文木を直接扱う
それなんてS式
Re: (スコア:0)
メタプログラミングは悪い設計をマクロなどに隠してしまう作用があるのが気になりますね
オブジェクト指向などにもそういう傾向はいくらか見られますが
もっとも、悪い設計がなんとか実装できるという意味では生産性を向上させているのかもしれませんが、保守は悪夢です
フレームワーク等の開発者向け (スコア:1)
まぁ総称にせよジェネラティブにせよあまり一般の人がゴリゴリ書くものではなく、
多くはライブラリやフレームワーク、内部DSLの作者が書くものかなとは思います。
ジェネラティブ・プログラミングを可能にする機構の目的はライブラリやフレームワーク、内部DSLが提供するような抽象度の高い記述と
それらの実行効率向上(=抽象化オーバーヘッドの削減)の両立であろうと思います。
Re: (スコア:0)
実行効率の向上は部分評価や特殊化でなされると思うのですが、これらは意味論をかえませんから、
「プログラムを操作する」という共通点のみで、文法や意味論をかえてしまう機構といっしょくたにするのは筋が悪いと思いますよ
Re:フレームワーク等の開発者向け (スコア:1)
コンパイル時計算やジェネラティブ・プログラミングと言ってもといっても
LispでS式加工する時のようになんでもありを良しとするつもりはないです。
テンプレートメタプログラミングとかでもそうですが部分評価や特殊化の機構を利用する
インターフェースとなる構文を用意してを効率化の機会を
プログラマに開放するところがミソであると思っています。