ぼくらの疑問つぶやき帳からの質問です。
Chironianさんの疑問の種(もう流れてしまいましたが)からヒントを得て
T4の話で思ったんですが、汎用的なコードジェネレーターの仕組みが提供されている言語(環境含む)って少ない気がします。私が知らないだけでしょうか。
という疑問をつぶやきました。
コード生成を支援するテキストテンプレートのような機能について、拡張ライブラリーでは珍しくないですが、T4のようにデフォルトで使用できるものはあまり聞いたことがありません。
言語機能や開発環境にあらかじめ組み込まれているようなものはあるでしょうか?
言語自体がテンプレートであるPHPみたいなのもありますね。
なのでPHPは例外と言うことでお願いします。
追記:以下の条件を満たしているのが望ましいです。
- コード生成の自由度: 自身のコード生成にも、HTMLの生成にも使える、など
- 実績: 実際に広く使われている手法であること
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
反射的に「C言語のプリプロセッサ」というのが思い浮かびましたが、そういう答えを期待しているのではなさそうですね……
投稿2016/08/16 09:51
総合スコア145121
0
コードジェネレイターとはちょっと違うかもしれませんが、
COBOLにはCOPY句というものがあります。
COPYで、呼び出し元のコードに呼び出し先のコードを展開してコンパイルすることが出来ます。
これだけなら、サブルーチンやレコード定義の共通化ですが、
面白いことに、オプションで展開時に文字列置換をすることが出来ます。
投稿2016/08/18 21:30
総合スコア2883
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/20 11:30
2016/08/20 11:37
2016/08/20 11:45
2016/08/20 11:51
0
言語機能や開発環境にあらかじめ組み込まれているようなものはあるでしょうか?
言語機能の一部としてマクロシステムを取り込んでいるものが該当するでしょうか。開発環境の方は、モダンなIDEは一通りコード・スニペット機能を持っていると思います。
- LISP
- Scheme
- C, C++ (プリプロセッサマクロ)
- Scala
- Template Haskell
- Rust
- (etc...)
少し毛色は異なりますが yacc/lex などのパーサ/字句解析器ジェネレータも、ドメイン固有言語(DSL)から異なる言語のソースコードを生成するものですね。
余談:個人的にはマクロシステム有りの言語はそう珍しくないと思ってました。C#のT4はちょっと癖が強すぎて苦手。
投稿2016/08/17 01:05
編集2016/08/17 01:11総合スコア6189
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/17 17:41
2016/08/18 00:10
2016/08/18 12:57
2016/08/18 14:52
2016/08/18 14:56
0
ベストアンサー
実績: 実際に広く使われている手法であること
実績と言うことだと、アセンブラマクロの話になってしまいますが、IBM系メインフレームだと、OS自身も含む各種ソフトの定義ファイルを、マクロを使ってアセンブルすることで、バイナリデータや定型テキストを生成しています(何でも生成できます)。
Unix/Linuxなどだと、各種ソフトが定義ファイルを自前で構文解析して読み込んでいますが、その部分を下請けに出しているわけです。
テンプレートエンジン的な物も1980年代からあります。言語か開発環境かというと、スクリプト言語内蔵の開発&実行環境ですかね。ざっくり言うと、「ウェブブラウザとHTTPサーバーを1つのソフトにしたようなもの」でしょうか。
投稿2016/08/16 14:25
総合スコア84423
0
こんにちは。(なんとなく呼ばれたような気がしたので出てきてしまいました。)
一部のアセンブラもあると思います。Repeat擬似命令とかマクロとか。貧弱ですがアセンブラですし。
もちろん、maisumakunさんも言及しているようにC言語のプリプロセッサもそこそこ強力なコード生成できますね。
clangで使われているテクニックは、なかなか強力です。
でも、これって標準かというと、言語設計者は想定していなかった使い方っぽいので標準とは言えないかも?
ところで、C#のT4テキストテンプレートやRubyのincludeによるMixinは、スッゴイ頭の良い人達が#defineでパラメータを定義して#includeでそれを展開するテクニックをたいへん使いやすくしたものではないかと推測してます。
投稿2016/08/16 10:31
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/16 10:47
2016/08/16 12:48
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/16 10:04