パスワードを忘れた? アカウント作成
11978864 journal
プログラミング

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/ ]という言語がコンパイル時計算を最初から考慮に入れた静的な型づけをする手続き型言語といって売りだしてるようなので調べてみないとなぁ……と思う今日この頃。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2015年03月26日 19時47分 (#2785326)

    マクロやテンプレート地獄は勘弁願いたいがOpen C++みたいに構文木を直接扱うのもなあと思っていました
    今ではすっかりジェネラティブプログラミング嫌いになりましたが

    • 上にも書きましたがコンパイル時に展開を行うテンプレートは総称型を実現するための実装でしかなく、
      ジェネラティブ・プログラミングのために設計されたものではありません。

      オブジェクトコードの実行効率を考えてコンパイル時の展開で総称を実現し、
      柔軟な定義のために再帰的定義を可能にし、整数引数を用意し、特化による条件分岐を入れたら
      「おっと、チューリング完全になってしまったぞ?」ということが発見された。
      ……という経緯で生まれたものがC++のテンプレートメタプログラミング技法です。

      というわけでなにせ「目的外利用」なので
      テンプレートメタプログラミングでジェネラティブ・プログラミングを行うのが辛くなってもあまり文句は言えないでしょう。
      テンプレートメタプログラミングで唯一の利点は言語規格で仕様が定められ実用レベルの性能を持つコンパイラで今、現にサポートされているので
      ジェネラティブなコードをすぐに開発し、実験し始めることができるという点だけです。読み易さ、書き易さは期待できません。

      私の希望としては最初からジェネラティブ・プログラミングのためのメカニズムを備え、
      エディタやデバッガといったツールもきちんとそれをサポートできるようなプログラミング言語が欲しいよね……という感じです。

      親コメント
    • by Anonymous Coward

      > 構文木を直接扱う

      それなんてS式

    • by Anonymous Coward

      メタプログラミングは悪い設計をマクロなどに隠してしまう作用があるのが気になりますね
      オブジェクト指向などにもそういう傾向はいくらか見られますが
      もっとも、悪い設計がなんとか実装できるという意味では生産性を向上させているのかもしれませんが、保守は悪夢です

      • まぁ総称にせよジェネラティブにせよあまり一般の人がゴリゴリ書くものではなく、
        多くはライブラリやフレームワーク、内部DSLの作者が書くものかなとは思います。

        ジェネラティブ・プログラミングを可能にする機構の目的はライブラリやフレームワーク、内部DSLが提供するような抽象度の高い記述と
        それらの実行効率向上(=抽象化オーバーヘッドの削減)の両立であろうと思います。

        親コメント
        • by Anonymous Coward

          実行効率の向上は部分評価や特殊化でなされると思うのですが、これらは意味論をかえませんから、
          「プログラムを操作する」という共通点のみで、文法や意味論をかえてしまう機構といっしょくたにするのは筋が悪いと思いますよ

typodupeerror

犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー

読み込み中...