プログラミング言語処理系の開発に興味のある人達のスレッドです。
字句解析・構文解析から,データフロー解析,ループ並列化,データ分散,SSA変換,
CPS変換,レジスタ割付,命令スケジューリング,ソフトウェアパイプライン,
SIMD命令生成,VLIW向けクラスタリング,スクラッチメモリ向け最適化,リンク時最適化,
JIT,動的バイナリ変換等の各種最適化,それにVM,GC,低消費電力化などなど。
意味論に関する話題も歓迎です。
Wikiのまとめページ
http://www6.atwiki.jp/compilerandscriptengine/
「コンパイラ・スクリプトエンジン」相談室16
2014/07/20(日) 11:16:19.37ID:p6eMVAxc
187デフォルトの名無しさん
2015/02/19(木) 19:51:00.22ID:rp3PUwqb 無かったらエラー表示するとき不便だろ
188デフォルトの名無しさん
2015/02/19(木) 21:27:05.57ID:wg16DBik 展開後の行番号の方がいらなくね?
プリプロセッサ文てコンパイラ側でも処理するよね?
#line とか
プリプロセッサ文てコンパイラ側でも処理するよね?
#line とか
189デフォルトの名無しさん
2015/02/19(木) 21:31:56.28ID:uOq48O3O コメントはプリプロセサで置き換えたらいかんのか
190デフォルトの名無しさん
2015/02/21(土) 01:08:42.33ID:XnZFjwve SmalltalkのVM上にJavaVMを構築してんだけど、
VMの話もここで良いんだよね。
VMの話もここで良いんだよね。
191デフォルトの名無しさん
2015/02/21(土) 12:59:06.48ID:eVOI8zE3 OK
192デフォルトの名無しさん
2015/02/21(土) 23:58:08.89ID:bst4VCEg >>182
Cのスキャナって正規表現だけで表現できるんか?(構文解析しないで良いエディタのhilightingとかは大丈夫だけど)
Cのスキャナって正規表現だけで表現できるんか?(構文解析しないで良いエディタのhilightingとかは大丈夫だけど)
193デフォルトの名無しさん
2015/02/22(日) 01:27:09.68ID:0QFgdJ2i >>191
了解。
SmalltalkのVM上でDalvik VM用のclassも動かしたいんですが、
いちいちDalvik用のVMまで作るのがメンドイです。
Dalvik用のclass形式からJavaVM用のclass形式に変換するオススメのLibraryを教えて下さい。
Libraryの言語はSmalltalkに書き直しますので何でもいいです。
了解。
SmalltalkのVM上でDalvik VM用のclassも動かしたいんですが、
いちいちDalvik用のVMまで作るのがメンドイです。
Dalvik用のclass形式からJavaVM用のclass形式に変換するオススメのLibraryを教えて下さい。
Libraryの言語はSmalltalkに書き直しますので何でもいいです。
194デフォルトの名無しさん
2015/02/23(月) 17:30:23.57ID:FikKUZMK195デフォルトの名無しさん
2015/02/23(月) 17:38:19.44ID:FikKUZMK196デフォルトの名無しさん
2015/02/23(月) 17:41:10.47ID:FikKUZMK javaで書いたDalvikのVM
http://www.eflow.jp/topics/090317.html
http://www.eflow.jp/topics/090317.html
197デフォルトの名無しさん
2015/02/23(月) 22:14:05.07ID:Fe2dvIpV C++で完結するって所に惹かれてboost::spiritを試してみたが…、これは死ねる。
198デフォルトの名無しさん
2015/02/24(火) 01:43:04.58ID:f8A7qwV2 共通部分式の除去のやり方がわかんねえ
定数伝播、四則演算も含む組み込み関数の畳み込み、使わない変数の除去、
ループ展開等を同じパスでやってるんだけど
共通部分式の除去とそれをやるのに必要な不変式の判定はまた別でやった方がいいのかな
不変式かどうかはループ最適化でも使えそうなんだけど混乱してきた
定数伝播、四則演算も含む組み込み関数の畳み込み、使わない変数の除去、
ループ展開等を同じパスでやってるんだけど
共通部分式の除去とそれをやるのに必要な不変式の判定はまた別でやった方がいいのかな
不変式かどうかはループ最適化でも使えそうなんだけど混乱してきた
199片山博文MZ ◆T6xkBnTXz7B0
2015/02/24(火) 08:04:58.95ID:UGr8Bbp/ >>198
ある計算式eについて、eの部分式を互いに参照するエントリーとして再帰的にテーブルに登録する。
登録するときにソートと重複チェックを行えば、テーブルは一意化できる。
テーブルの各エントリーの参照構造は、木構造のノードを成す。
ある計算式eについて、eの部分式を互いに参照するエントリーとして再帰的にテーブルに登録する。
登録するときにソートと重複チェックを行えば、テーブルは一意化できる。
テーブルの各エントリーの参照構造は、木構造のノードを成す。
200デフォルトの名無しさん
2015/02/24(火) 11:33:08.23ID:wemgVVUb >>198
式の属性に関する再帰方程式の近似解をニュートン法のように求めること、
これがデータフロー計算解法の本質と理解できてないんじゃない?
ドラゴンブックのavailable, killedの説明の所読んでみれば?
同じパス内でループしながら収束するまで計算するのよ。
式の属性に関する再帰方程式の近似解をニュートン法のように求めること、
これがデータフロー計算解法の本質と理解できてないんじゃない?
ドラゴンブックのavailable, killedの説明の所読んでみれば?
同じパス内でループしながら収束するまで計算するのよ。
201デフォルトの名無しさん
2015/02/24(火) 11:35:18.85ID:wemgVVUb ドラゴンブックのどの節か書こうとしたけど本が見つからない...
とりあえず、ここのp.10から。
http://dragonbook.stanford.edu/lecture-notes/Stanford-CS143/20-Optimization.pdf
とりあえず、ここのp.10から。
http://dragonbook.stanford.edu/lecture-notes/Stanford-CS143/20-Optimization.pdf
202デフォルトの名無しさん
2015/02/24(火) 17:44:49.00ID:H95vOz7j203デフォルトの名無しさん
2015/02/24(火) 17:53:23.22ID:avE+zAm1 多分ちゃんと読んだ方がかえって早い。
共通部分式A,Bがあって、例えばBの方の除去をやると、
Bの到達性がAの到達性にも付与される。
このことは他の属性に影響を及ぼしうる。
よってもう一度計算をしないとより正確な属性を求められない。
以下ループ。
よって収束するまで繰り返すことになる。
共通部分式A,Bがあって、例えばBの方の除去をやると、
Bの到達性がAの到達性にも付与される。
このことは他の属性に影響を及ぼしうる。
よってもう一度計算をしないとより正確な属性を求められない。
以下ループ。
よって収束するまで繰り返すことになる。
204デフォルトの名無しさん
2015/02/24(火) 18:04:39.54ID:H95vOz7j 変化がなくなるまで最適化処理を繰り返すのはわかった
205デフォルトの名無しさん
2015/02/24(火) 19:26:42.04ID:wUDy2moe >>197
コンパイル時間がか?
コンパイル時間がか?
206片山博文MZ ◆T6xkBnTXz7B0
2015/02/24(火) 20:45:40.84ID:UGr8Bbp/ __declspecとか__attribute__などをパースできないと正確な構造体型のサイズ
を求めることができない。しかしattribute周りの文法がメチャクチャやなあ。
を求めることができない。しかしattribute周りの文法がメチャクチャやなあ。
207片山博文MZ ◆T6xkBnTXz7B0
2015/03/03(火) 01:05:04.60ID:t6l1EelO 次は"typed value"の扱いだな。定数にも型がある。型付きの値を
扱えなければ、正確な定数値を求めることはできない。
扱えなければ、正確な定数値を求めることはできない。
208デフォルトの名無しさん
2015/03/03(火) 04:49:45.03ID:ZU1MaIS8 最適化なんてイラナイよね、何処まで処理系に依存する気なんだよw
209デフォルトの名無しさん
2015/03/08(日) 14:52:45.39ID:u8r5MR2m 初心者だがHSPって凄いね
自分でHSPみたいなの作ろうとすると途端につまづくw
内部でメッセージハンドルに登録していく言語だと思うんだけど
こんなにwinを感じさせない文法でwinと親和性高く作れるとは
自分でHSPみたいなの作ろうとすると途端につまづくw
内部でメッセージハンドルに登録していく言語だと思うんだけど
こんなにwinを感じさせない文法でwinと親和性高く作れるとは
210デフォルトの名無しさん
2015/03/08(日) 17:15:18.44ID:8c6PRT7L ランタイムの機能の量で躓くならともかくあの文法でつまづくなら>>1で概要把握して本読めば
211デフォルトの名無しさん
2015/03/09(月) 14:52:03.75ID:MIZIuI1f 文法とOSに何の関係が?
212デフォルトの名無しさん
2015/03/09(月) 16:12:25.65ID:J8WIpDef いただきジャンガリアンに辛酸をなめさせられたのだろうよ
213デフォルトの名無しさん
2015/03/09(月) 17:25:40.74ID:VM1FVYaf うーん初心者だから言い方わかんないんだけど
コマンドプロンプトのスクリプトってコマンドに従って単に実行していくだけだよね
でもwinだと実行されるのは素直に考えるとメッセージが来たとき
cでウインアプリつくるときはメッセージ毎に処理を書くけど上から順に読むスクリプトは
それはできないわけだからどう整合性取るのかなってことで悩んでた
結局メッセージ毎にリストがあってコマンドを読んだらそのリストに関数ポインタ名で追加、
メッセージ毎に呼ばれる関数はその種別のリストを上から順に実行していく
こんな感じで作ったけどこれでいいのかな
コマンドプロンプトのスクリプトってコマンドに従って単に実行していくだけだよね
でもwinだと実行されるのは素直に考えるとメッセージが来たとき
cでウインアプリつくるときはメッセージ毎に処理を書くけど上から順に読むスクリプトは
それはできないわけだからどう整合性取るのかなってことで悩んでた
結局メッセージ毎にリストがあってコマンドを読んだらそのリストに関数ポインタ名で追加、
メッセージ毎に呼ばれる関数はその種別のリストを上から順に実行していく
こんな感じで作ったけどこれでいいのかな
214デフォルトの名無しさん
2015/03/12(木) 21:28:48.21ID:BlO2EFmA そりゃ文法じゃなくて実行モデルだな。
イベント駆動ってことでしょ。
イベント駆動ってことでしょ。
215デフォルトの名無しさん
2015/04/13(月) 21:09:38.60ID:qtTodoaL 「Cのコンパイラなら何日かかけて作っても良いが、C++は、一人で
作るのは嫌だ。文法をきちんとカバーするのに日数がかかりすぎるから」
と言われたよ。
作るのは嫌だ。文法をきちんとカバーするのに日数がかかりすぎるから」
と言われたよ。
216デフォルトの名無しさん
2015/04/22(水) 02:22:50.19ID:eOWj6Ffd javaに近い構文の言語をつくろうとしてるんだけど、
ようやくchar配列に変換したソースから関数の外側を構文解析できた。
山括弧<>、文字列リテラル、コメントに気をつけつつ、
なんとか関数の中を無視してクラス・変数・関数の名前や型名を取得して
関数の中身にとりかかるところ。
関数の中身は丸括弧()が難関になりそう。
AAAA bbbb = ((HHHH)cccc.dddd.eeee(ffff.gggg(), jjjj)).iiii();
bbbb.kkkk = -10/(8-3)-9/-3
ようやくchar配列に変換したソースから関数の外側を構文解析できた。
山括弧<>、文字列リテラル、コメントに気をつけつつ、
なんとか関数の中を無視してクラス・変数・関数の名前や型名を取得して
関数の中身にとりかかるところ。
関数の中身は丸括弧()が難関になりそう。
AAAA bbbb = ((HHHH)cccc.dddd.eeee(ffff.gggg(), jjjj)).iiii();
bbbb.kkkk = -10/(8-3)-9/-3
217デフォルトの名無しさん
2015/04/22(水) 20:33:48.48ID:rBARkljm >>216
まるで違う言語に見えてしまうのだが。
まるで違う言語に見えてしまうのだが。
218デフォルトの名無しさん
2015/04/22(水) 21:30:55.14ID:eOWj6Ffd >>217
最初はクラス名、メンバ変数、メンバ関数を全部調べてからじゃないと
関数の中身に取り掛かれないと思ってた。
でもクラス名・変数名・関数名に区別は不要で、記号をヒントに階層を分解して、
それから型名の存在の有無・整合性を調べるという風にフェーズを分けれそう。
でも()が演算の優先順位、型キャスト、メソッド...どれに使われているのか
区別できるかは不安。for文とかは最初に予約語が入るからやりやすそうだけど。
Person person = ((Factory)group.cache.getFactory(provider.getResource(), url)).create();
person.id = -10/(8-3)-9/-3;
最初はクラス名、メンバ変数、メンバ関数を全部調べてからじゃないと
関数の中身に取り掛かれないと思ってた。
でもクラス名・変数名・関数名に区別は不要で、記号をヒントに階層を分解して、
それから型名の存在の有無・整合性を調べるという風にフェーズを分けれそう。
でも()が演算の優先順位、型キャスト、メソッド...どれに使われているのか
区別できるかは不安。for文とかは最初に予約語が入るからやりやすそうだけど。
Person person = ((Factory)group.cache.getFactory(provider.getResource(), url)).create();
person.id = -10/(8-3)-9/-3;
219デフォルトの名無しさん
2015/04/22(水) 22:59:19.66ID:LKLiXgla いまいち分からないけど、識別子の次にあったら関数呼び出しで
それ以外は式とかでいけないの
それ以外は式とかでいけないの
220デフォルトの名無しさん
2015/04/22(水) 23:28:51.38ID:eOWj6Ffd いけるか分からない。とりあえずやってみるってところ
221デフォルトの名無しさん
2015/04/23(木) 08:14:58.39ID:+O6VWDUu222デフォルトの名無しさん
2015/04/27(月) 01:02:40.49ID:RiYFohCl メソッドの中が上手くいかんというか何から始めたら良いのか分からん
コンパイル速度が遅くなるけど、分解フェーズを何層にも分けて
何度もループで調べていけば良いのかな
コンパイル速度が遅くなるけど、分解フェーズを何層にも分けて
何度もループで調べていけば良いのかな
223デフォルトの名無しさん
2015/04/27(月) 06:59:39.15ID:EFAP6joI コンパイラの教科書の一冊でも読んで構文解析を勉強してみ
224デフォルトの名無しさん
2015/04/27(月) 09:38:16.26ID:ZDDsb7dY C系のクソみたいな構文ルールをそのまま真似てどうすんの
自作なら作りやすいようにキーワード追加すればいいのよ
キャスト式にキーワード付けなかったのは最大の誤りの一つ
自作なら作りやすいようにキーワード追加すればいいのよ
キャスト式にキーワード付けなかったのは最大の誤りの一つ
225デフォルトの名無しさん
2015/04/27(月) 09:56:10.90ID:qDIHhHi0 SSA形式からスタックマシンのコード生成の最適化みたいなのに参考になる文献ってないかな?
226デフォルトの名無しさん
2015/04/27(月) 14:22:00.53ID:RiYFohCl >>224
そうだね。HaxeとかFlashからぱくって、C形式のキャストは無くしてみるわ
int i = cast Integer ( 0.005f );
int i = 0.005f as Integer;
そうだね。HaxeとかFlashからぱくって、C形式のキャストは無くしてみるわ
int i = cast Integer ( 0.005f );
int i = 0.005f as Integer;
227デフォルトの名無しさん
2015/04/28(火) 18:20:14.24ID:PlNb5vya 最終的に何を目指そうかしら
1)LLVMで動かす
→ 超難しそう
2)Luaのように組み込みスクリプトとして動かす
→ 重そう。メモリ管理は全部ウィークポインタで良いのかな
(C/C++組み込みならnew&deleteするようなスクリプトでも良さそう)
3)JavaScriptなどに変換
→ たぶん例外のバックトレースとかを変換するデバッグ環境が必須
1)LLVMで動かす
→ 超難しそう
2)Luaのように組み込みスクリプトとして動かす
→ 重そう。メモリ管理は全部ウィークポインタで良いのかな
(C/C++組み込みならnew&deleteするようなスクリプトでも良さそう)
3)JavaScriptなどに変換
→ たぶん例外のバックトレースとかを変換するデバッグ環境が必須
228片山博文MZ ◆T6xkBnTXz7B0
2015/05/05(火) 23:02:55.34ID:p1RbtT4Y229デフォルトの名無しさん
2015/05/09(土) 18:57:31.49ID:SYpntI8c バイトコードインタプリタつくっているんだけど
スタックマシンのコンパイラについて
パラメータスタック(データスタック)はヒープ上におくべき?
それともネイティブの領域におくべき?
スタックマシンのコンパイラについて
パラメータスタック(データスタック)はヒープ上におくべき?
それともネイティブの領域におくべき?
230デフォルトの名無しさん
2015/05/09(土) 19:41:52.28ID:SYpntI8c231デフォルトの名無しさん
2015/05/09(土) 20:41:51.08ID:DhZyBtDK >>230
ネイティブスタックにデータも置くって事だよね?
データスタックは分けておいた方がイロイロ楽だったので列挙
たしかこんなの
GC使う様な実装の時の仕分け
実行パスがJITでコンパイルコードと非コンパイルVMコードの行ったり来たりするとき
例外のスタックトレース(これもJIT時のアレコレあり)
チープマシンにVM仕込むときアセンブラで書くのが楽しい
最後はちげぇけど
ネイティブスタックにデータも置くって事だよね?
データスタックは分けておいた方がイロイロ楽だったので列挙
たしかこんなの
GC使う様な実装の時の仕分け
実行パスがJITでコンパイルコードと非コンパイルVMコードの行ったり来たりするとき
例外のスタックトレース(これもJIT時のアレコレあり)
チープマシンにVM仕込むときアセンブラで書くのが楽しい
最後はちげぇけど
232デフォルトの名無しさん
2015/05/09(土) 21:02:43.06ID:SYpntI8c >>231
自分のVMは典型的なスタックマシンで
パラメータスタック(データスタック)とコールスタックは別です。
そのうちデータスタックをヒープ内におくか
アセンブリでかかれたほうのネイティブの領域におくかってことです。
ネイティブ領域においたほうが実際のアドレスとVM上でのアドレスの変換がないので
速度としては速いのですが
欠点としてバイトコードからスタックを参照することができません
焦点とてしてはそもそもバイトコードからスタックを参照することがあるのかということで、
基本的になければネイティブ領域におこうかとおもっています
これまでつくった経験がないので設計としてどちらがよいかわからずお聞きしました
自分のVMは典型的なスタックマシンで
パラメータスタック(データスタック)とコールスタックは別です。
そのうちデータスタックをヒープ内におくか
アセンブリでかかれたほうのネイティブの領域におくかってことです。
ネイティブ領域においたほうが実際のアドレスとVM上でのアドレスの変換がないので
速度としては速いのですが
欠点としてバイトコードからスタックを参照することができません
焦点とてしてはそもそもバイトコードからスタックを参照することがあるのかということで、
基本的になければネイティブ領域におこうかとおもっています
これまでつくった経験がないので設計としてどちらがよいかわからずお聞きしました
233デフォルトの名無しさん
2015/05/10(日) 09:31:50.02ID:ZQGgJB6p >>232
> 焦点とてしてはそもそもバイトコードからスタックを参照することがあるのかということで、
バイトコードの設計は終わってるんじゃないのか?
バイトコードの設計終わってりゃ参照の必要があるかどうかはわかってるだろうし、バイトコードの設計終わってないのに VM の構成考えてるならお前が終わってる
> 焦点とてしてはそもそもバイトコードからスタックを参照することがあるのかということで、
バイトコードの設計は終わってるんじゃないのか?
バイトコードの設計終わってりゃ参照の必要があるかどうかはわかってるだろうし、バイトコードの設計終わってないのに VM の構成考えてるならお前が終わってる
234デフォルトの名無しさん
2015/05/10(日) 09:50:11.77ID:YKkUWNQO235デフォルトの名無しさん
2015/05/19(火) 18:50:21.34ID:a+aajTcz 番兵の文字は
utf-8でも16でも32でも-1でいいんですか?
utf-8でも16でも32でも-1でいいんですか?
236デフォルトの名無しさん
2015/06/24(水) 17:14:03.39ID:ZsIPeucp 動的型付けってLLVMだとどうやって実装するんだろ
237デフォルトの名無しさん
2015/07/10(金) 19:59:28.32ID:h+kJ9m+3 構文解析+Cに変換して内部でgcc呼んでコンパイルするプログラムはコンパイラって呼んでいいの?
238デフォルトの名無しさん
2015/07/10(金) 20:11:15.28ID:tLjH7MQJ トランスレータじゃねえの
239デフォルトの名無しさん
2015/07/11(土) 08:23:11.34ID:SvdcMd32 >>238
変換したCコードを出すならトランスレーターだけどバイナリまで出すならコンパイラーでいいだろ
変換したCコードを出すならトランスレーターだけどバイナリまで出すならコンパイラーでいいだろ
240片山博文MZ ◆T6xkBnTXz7B0
2015/07/28(火) 03:30:13.81ID:92wk7rzR 果たして文法を仮想化できるか
241デフォルトの名無しさん
2015/08/19(水) 08:24:37.58ID:zh/OeKTd 凄いこと発見したんだけれどもΛの記号は上の尖がったところがルートで
下の二つの棒が辺を表しているんだな
下の二つの棒が辺を表しているんだな
242デフォルトの名無しさん
2015/08/19(水) 22:05:03.04ID:caRlC37E 言語非依存の仮想マシンっていうアイデアがいまいち大成功していないように見えるのって
なんか理由があるのかな。
なんか理由があるのかな。
243デフォルトの名無しさん
2015/08/19(水) 22:59:51.18ID:7Z0FzJPx 落ちてたllvmスレを立て直した
【最速へ】LowLevelVirtualMachine 2【LLVM】
http://peace.2ch.net/test/read.cgi/tech/1439992758/
【最速へ】LowLevelVirtualMachine 2【LLVM】
http://peace.2ch.net/test/read.cgi/tech/1439992758/
245デフォルトの名無しさん
2015/08/20(木) 00:06:05.42ID:BI1Ot8hx >>244
実際に成功していても成功していないよ・う・に・見・え・るって話じゃないの?
XCodeのコンパイラがllvm,clangだってのは開発者にしか見えないしclangの話だけ聞いているとgccが組み込み機のCPUに対応してたころみたいに派手に活躍してるとは感じられないって事じゃ無いの?
実際に成功していても成功していないよ・う・に・見・え・るって話じゃないの?
XCodeのコンパイラがllvm,clangだってのは開発者にしか見えないしclangの話だけ聞いているとgccが組み込み機のCPUに対応してたころみたいに派手に活躍してるとは感じられないって事じゃ無いの?
246デフォルトの名無しさん
2015/08/20(木) 04:55:31.33ID:uOqBPetd たぶん外国には、CASL2のような仮想アセンブラを使う、
情報処理試験が無いのだろう
2人の大学生が作ったLLVMに、Appleが飛びついた。
それで、Lattner はAppleに就職した
情報処理試験が無いのだろう
2人の大学生が作ったLLVMに、Appleが飛びついた。
それで、Lattner はAppleに就職した
247デフォルトの名無しさん
2015/08/20(木) 11:06:47.70ID:XXXu8/KU 良く言えば新世代の輝き
悪く言えば発展途上の不安定さ
さらに組み込みで言えばカバー範囲の幅広さは犠牲にされがち
将来性でメシが食えるのはごく一部
悪く言えば発展途上の不安定さ
さらに組み込みで言えばカバー範囲の幅広さは犠牲にされがち
将来性でメシが食えるのはごく一部
248デフォルトの名無しさん
2015/08/20(木) 11:31:12.43ID:WmW0wMbd 痛い文章だ
249デフォルトの名無しさん
2015/08/24(月) 00:47:20.35ID:OjRQ25eS マルチメソッドを効率よく実装するにはどのようにすればよいですか?
250デフォルトの名無しさん
2015/08/24(月) 01:10:40.39ID:YG1kZeuQ マルチメソッドって何?
251デフォルトの名無しさん
2015/08/24(月) 01:36:14.61ID:OjRQ25eS OOPの最も基本的な機能です
引数によって、メソッドが切り替わります
多態といいます
引数によって、メソッドが切り替わります
多態といいます
252デフォルトの名無しさん
2015/08/24(月) 02:01:55.26ID:YG1kZeuQ オーバーロードのことですか?
ではマングリング
ではマングリング
253デフォルトの名無しさん
2015/08/24(月) 02:21:03.16ID:OjRQ25eS マルチメソッドはオーバーロードでは無いです
一般にオーバーロードは静的ですが、
マルチメソッドは動的です
一般にオーバーロードは静的ですが、
マルチメソッドは動的です
254デフォルトの名無しさん
2015/08/24(月) 08:00:36.10ID:WVPITNbu255デフォルトの名無しさん
2015/08/24(月) 08:19:25.57ID:jJXNOMmM clojureのdefmultiみたいな奴じゃないの?
256デフォルトの名無しさん
2015/08/24(月) 11:49:46.23ID:BYoao/vR 多重ディスパッチのニッチな要求に応えるものか
それとも単純な動的バインディングだけの問題なのか
それとも単純な動的バインディングだけの問題なのか
257デフォルトの名無しさん
2015/08/26(水) 18:36:02.43ID:XR0u/yGZ マルチメソッドはC++相談室を検索すればなんなのかがわかる
259デフォルトの名無しさん
2015/08/30(日) 19:15:42.50ID:nhXJHOe7 型を連想配列やトライ木で管理すればO(1)
260デフォルトの名無しさん
2015/08/30(日) 20:08:17.93ID:brcjELIg >>259
clojureはソレだね
clojureはソレだね
261デフォルトの名無しさん
2015/09/17(木) 12:38:19.48ID:mHCGeegj 中間言語の設計に関するノウハウとかアンチパターンとかが書かれた本誰か知ってる?
LLVMとかP-codeとかJava VMとか、あるいはKnuthのMIX/MMIXみたいな機械語に近いレベルの言語を
ソフトウェア実装すること前提に設計する場合について知りたい。
今言語設計してて、そろそろ構文解析できそうだから学んでおきたいんだけど。
LLVMとかP-codeとかJava VMとか、あるいはKnuthのMIX/MMIXみたいな機械語に近いレベルの言語を
ソフトウェア実装すること前提に設計する場合について知りたい。
今言語設計してて、そろそろ構文解析できそうだから学んでおきたいんだけど。
262デフォルトの名無しさん
2015/09/17(木) 19:56:34.99ID:7ftMaB4B 最初はネイティブに落とした方がいいぞ
中間言語とか遠回りしてたらアホみたいだぞ
中間言語とか遠回りしてたらアホみたいだぞ
263デフォルトの名無しさん
2015/09/18(金) 15:07:01.58ID:QAQ6VXx0 そんな物他人に教わるくらいならおとなしく既存のを使っとけ
264デフォルトの名無しさん
2015/09/18(金) 20:35:24.73ID:F4ynHS7Z 本として出して需要あるか?もしかしたらサーベイ論文なら探せばあるかも
265261
2015/09/18(金) 21:16:12.07ID:ArWsl8Ey266デフォルトの名無しさん
2015/09/18(金) 22:17:11.93ID:i7DEL3du267261
2015/09/19(土) 09:19:04.79ID:YlOPp2hb >>266
swiftのように演算子をユーザー定義出来て、
c++のように同名異引数の関数を定義出来て、
Lispのように引数間のカンマが要らず、
Rubyのようにカッコを省ける
そんな言語を設計中です。
それらの両立のために実行中に文法を書き換えて構文解析器を再構成するという手法を採ってるので、コンパイル出来ないんですよね……
clispのリードマクロを文脈依存に拡張したものだと言えば大体あってるかと。
ちょっとErlang関連の資料を見てみます。
swiftのように演算子をユーザー定義出来て、
c++のように同名異引数の関数を定義出来て、
Lispのように引数間のカンマが要らず、
Rubyのようにカッコを省ける
そんな言語を設計中です。
それらの両立のために実行中に文法を書き換えて構文解析器を再構成するという手法を採ってるので、コンパイル出来ないんですよね……
clispのリードマクロを文脈依存に拡張したものだと言えば大体あってるかと。
ちょっとErlang関連の資料を見てみます。
268デフォルトの名無しさん
2015/09/19(土) 10:26:16.30ID:7hgo9IJ4 >>267
列挙してあることはシンタックス上のことで全部コンパイル時に静的に解決出来そうに見えるけど無理なの?
列挙してあることはシンタックス上のことで全部コンパイル時に静的に解決出来そうに見えるけど無理なの?
269デフォルトの名無しさん
2015/09/19(土) 11:29:33.20ID:I9CWDfzW270261
2015/09/19(土) 12:48:32.00ID:YlOPp2hb >>268
今考えてる言語では、演算子の扱いが関数を引数の場所に関して一般化した第一級オブジェクトなので
前置引数の個数や後置引数の個数は実行してみるまで分からないので
コンパイル時の識別子を用いた構文解析は無理です。
前置演算子と一引数関数が別物って変だと思ったのでそうしました。
c++風に書くと、こんな感じのが通るイメージです。
g = [](a,b){return a - b;};
if (複雑な式) {
f = [](a|b,c){return a + b + c;}; // (a|b)で前置引数としてa、後置引数としてbと示すものとする。
} else {
f = [](a,b|c){return a + b + c;};
}
// gは2引数演算子、fは3引数演算子。
// ここではgの優先順位はfより低いものとする(c++での表現方法が無いので)。
// カッコやカンマを省いてある場合、上の条件のどちらが走っても構文上は受理される。
// 複雑な式の結果によって、これはg(1, f(2, 3, 4))及びg(f(1, 2, 3), 4)のどちらにもなりうる。
cout << (g 1 2 f 3 4) << endl;
>>269
そういうわけで一度に全部読み込んでコンパイルしてから実行するという事が出来ないので、
折角だからVMも設計しようと思った次第です。
ASTから中間言語に落とすとcontinuationの実装が楽になるので。
今考えてる言語では、演算子の扱いが関数を引数の場所に関して一般化した第一級オブジェクトなので
前置引数の個数や後置引数の個数は実行してみるまで分からないので
コンパイル時の識別子を用いた構文解析は無理です。
前置演算子と一引数関数が別物って変だと思ったのでそうしました。
c++風に書くと、こんな感じのが通るイメージです。
g = [](a,b){return a - b;};
if (複雑な式) {
f = [](a|b,c){return a + b + c;}; // (a|b)で前置引数としてa、後置引数としてbと示すものとする。
} else {
f = [](a,b|c){return a + b + c;};
}
// gは2引数演算子、fは3引数演算子。
// ここではgの優先順位はfより低いものとする(c++での表現方法が無いので)。
// カッコやカンマを省いてある場合、上の条件のどちらが走っても構文上は受理される。
// 複雑な式の結果によって、これはg(1, f(2, 3, 4))及びg(f(1, 2, 3), 4)のどちらにもなりうる。
cout << (g 1 2 f 3 4) << endl;
>>269
そういうわけで一度に全部読み込んでコンパイルしてから実行するという事が出来ないので、
折角だからVMも設計しようと思った次第です。
ASTから中間言語に落とすとcontinuationの実装が楽になるので。
271デフォルトの名無しさん
2015/09/19(土) 13:15:38.32ID:hJISNbn0 g 1 2 f 3 4は構文解析後にはどういうツリーになっているの?
フラットなままで構文解析終えて実行時にまたプチ構文解析をするの?
フラットなままで構文解析終えて実行時にまたプチ構文解析をするの?
272261
2015/09/19(土) 13:24:30.87ID:YlOPp2hb >>271
字句解析でばらばらにしてLL(1)でカッコの対応等について解いた背の低い木にして、その後実行時にLR(1)で式毎に再度解析するので
> フラットなままで構文解析終えて実行時にまたプチ構文解析をするの?
これであってます。
字句解析でばらばらにしてLL(1)でカッコの対応等について解いた背の低い木にして、その後実行時にLR(1)で式毎に再度解析するので
> フラットなままで構文解析終えて実行時にまたプチ構文解析をするの?
これであってます。
273デフォルトの名無しさん
2015/09/19(土) 14:10:09.60ID:I9CWDfzW おもしろい事かんがえてるなー
ElixirとかBEAM-VMとか参考になるんじゃねぇの?
ElixirとかBEAM-VMとか参考になるんじゃねぇの?
274261
2015/09/19(土) 15:18:02.65ID:YlOPp2hb >>273
高信頼・並列分散に特化したVMのようにあちこちで言われてるみたいですね、ErlangのBEAM-VM.
そう考えるとLLVMは解析容易性特化、JVMはVM自体の実装容易性特化といった所でしょうか。
VMを作るなら何かに特化させるべきなような気がしてきました。
高信頼・並列分散に特化したVMのようにあちこちで言われてるみたいですね、ErlangのBEAM-VM.
そう考えるとLLVMは解析容易性特化、JVMはVM自体の実装容易性特化といった所でしょうか。
VMを作るなら何かに特化させるべきなような気がしてきました。
275デフォルトの名無しさん
2015/09/20(日) 00:52:44.57ID:m4tWKm8w 演算子に限定する意味は何だろう
cout << (g 1 2 f 3 4) << endl;
こんなの一見して何してるのか判らないしいっそ構文ごと第一級にすればいい
そもそも実行時に構文解析機まで走らせる重い処理系って必要なのかなあ
クロージャじゃあかんのかね
cout << (g 1 2 f 3 4) << endl;
こんなの一見して何してるのか判らないしいっそ構文ごと第一級にすればいい
そもそも実行時に構文解析機まで走らせる重い処理系って必要なのかなあ
クロージャじゃあかんのかね
276デフォルトの名無しさん
2015/09/20(日) 09:22:45.62ID:tHziPwGz この程度のアイデアしかないようじゃ才能ないわな
277261
2015/09/20(日) 11:27:11.87ID:oZCwg6h7 >>275
今作ってる実装だと構文はhead, body, precedence, directionをキーとするオブジェクトの配列になってるので
構文も第一級オブジェクトのインスタンスになっています。
説明不足ですんません。
コードは現在こんな感じ。もし読みたければどうぞ。
https://gist.github.com/pixie-grasper/d07388493204a5e370a2
debug-printが多かったりコメントが少なかったりしますが……
> そもそも実行時に構文解析機まで走らせる重い処理系って必要なのかなあ
必要性については私にはまだ分かりませんが、
私は昔レキシカルスコープもクロージャもポインタも継続もマクロも無い素晴らしく酷い言語(古いBASIC)で全てを考えていたので、
その経験から、どんな機能も使い慣れると必要になってくると思っています。
>>276
私馬鹿なもんで。
いいアイデアがあったら是非とも実現してくだされ。
今作ってる実装だと構文はhead, body, precedence, directionをキーとするオブジェクトの配列になってるので
構文も第一級オブジェクトのインスタンスになっています。
説明不足ですんません。
コードは現在こんな感じ。もし読みたければどうぞ。
https://gist.github.com/pixie-grasper/d07388493204a5e370a2
debug-printが多かったりコメントが少なかったりしますが……
> そもそも実行時に構文解析機まで走らせる重い処理系って必要なのかなあ
必要性については私にはまだ分かりませんが、
私は昔レキシカルスコープもクロージャもポインタも継続もマクロも無い素晴らしく酷い言語(古いBASIC)で全てを考えていたので、
その経験から、どんな機能も使い慣れると必要になってくると思っています。
>>276
私馬鹿なもんで。
いいアイデアがあったら是非とも実現してくだされ。
278デフォルトの名無しさん
2015/09/20(日) 11:30:35.69ID:O6Xw3ijC279デフォルトの名無しさん
2015/09/20(日) 18:18:01.68ID:tHziPwGz >>277
絶対真似しないと約束するなら教えてもいいぞ
絶対真似しないと約束するなら教えてもいいぞ
281デフォルトの名無しさん
2015/09/20(日) 20:15:16.31ID:9UpT3677 >>274
BEAMは引数のMatchで分ける処理がVMにあるんでそういう意味でオモシロイコト -> BEAM参考になるんじゃねぇのって話です
BEAMは引数のMatchで分ける処理がVMにあるんでそういう意味でオモシロイコト -> BEAM参考になるんじゃねぇのって話です
282261
2015/09/20(日) 21:59:23.12ID:oZCwg6h7 >>281
調べてみました。
BEAMだと実行時にモジュール名、関数名、及び引数の数を指定して呼び出す関数を同定するんですね。
実引数の数がコンパイル時には分かるから命令語に引数の数を組み込めるのだと思いますが……
今考えてる言語だと、実引数の数が自明じゃないので使いにくい気がします。
助言、ありがとうございます。
調べてみました。
BEAMだと実行時にモジュール名、関数名、及び引数の数を指定して呼び出す関数を同定するんですね。
実引数の数がコンパイル時には分かるから命令語に引数の数を組み込めるのだと思いますが……
今考えてる言語だと、実引数の数が自明じゃないので使いにくい気がします。
助言、ありがとうございます。
283デフォルトの名無しさん
2015/09/21(月) 19:55:02.85ID:x6IKJHaI スクリプト型の言語って実行時にコンパイル(構文解析?)が発生するから、コンパイル型の言語より遅いのですよね。
では、アプリケーションの起動時にスクリプトを読み込んだ後のパフォーマンスは、スクリプト型もコンパイル型も大差ないのでしょうか?
では、アプリケーションの起動時にスクリプトを読み込んだ後のパフォーマンスは、スクリプト型もコンパイル型も大差ないのでしょうか?
284デフォルトの名無しさん
2015/09/21(月) 20:31:03.01ID:XzxcjOEi 大差あります
285デフォルトの名無しさん
2015/09/21(月) 21:42:55.66ID:LoRahTLC >>283
「スクリプト型の言語」やら「コンパイル」やらが何を意味してるのかにも依りますが、
よくある速度重視の構成だと、読み込み時に構文解析や意味解析、中間コード生成を終わらせて
実行時に中間コードを(1)実行可能バイナリに変換するパターンと、(2)仮想マシン上でエミュレートするパターンとの二通りがあります。
(1)の場合は変換処理そのものがそれなりに重く、
しかも高度な最適化を掛けるとそれ自体に時間が掛かってしまうので
最適化は殆ど掛けられずコンパイラ型言語の2〜3倍は遅くなりますし、
(2)の場合は1命令実行するのに命令を読み込んで比較してジャンプして、
とCPUがアナログ回路上で並列処理してる計算を逐次的に実行するのでかなり重くなります。
「スクリプト型の言語」やら「コンパイル」やらが何を意味してるのかにも依りますが、
よくある速度重視の構成だと、読み込み時に構文解析や意味解析、中間コード生成を終わらせて
実行時に中間コードを(1)実行可能バイナリに変換するパターンと、(2)仮想マシン上でエミュレートするパターンとの二通りがあります。
(1)の場合は変換処理そのものがそれなりに重く、
しかも高度な最適化を掛けるとそれ自体に時間が掛かってしまうので
最適化は殆ど掛けられずコンパイラ型言語の2〜3倍は遅くなりますし、
(2)の場合は1命令実行するのに命令を読み込んで比較してジャンプして、
とCPUがアナログ回路上で並列処理してる計算を逐次的に実行するのでかなり重くなります。
286デフォルトの名無しさん
2015/09/22(火) 13:12:55.44ID:f7gaXzgp 比較にならない
スクリプトは柔軟性重視なので速度を出すためのチューニングは後回しにされる
起動時にある程度最適化できるものもあるが、
最適化のために数十秒〜数分かけたりもできない
また実行直前にならないと決まらない内容も多く無駄になってしまう
そもそもコンパイラ型で速度重視のソフトを作る場合は
開発者自身やライブラリがメモリレイアウトなど制御し効率を考慮したコードを書く(書ける)
スクリプトは柔軟性重視なので速度を出すためのチューニングは後回しにされる
起動時にある程度最適化できるものもあるが、
最適化のために数十秒〜数分かけたりもできない
また実行直前にならないと決まらない内容も多く無駄になってしまう
そもそもコンパイラ型で速度重視のソフトを作る場合は
開発者自身やライブラリがメモリレイアウトなど制御し効率を考慮したコードを書く(書ける)
287デフォルトの名無しさん
2015/09/25(金) 18:30:15.12ID:TpmuUHaP 自分でC言語っぽいスクリプト言語とかデータ形式作ってみたけど、どうだろ?
ちなみにスクリプト言語はSC3_Compilerってのに入ってるが。
ttps://osdn.jp/users/mitubasa/pf/BuildContainer/files/
ちなみにスクリプト言語はSC3_Compilerってのに入ってるが。
ttps://osdn.jp/users/mitubasa/pf/BuildContainer/files/
レスを投稿する
