[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 06/07 23:41 / Filesize : 200 KB / Number-of Response : 866
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

『コンパイラ・スクリプトエンジン』 相談室 2



1 名前:nanashi de fault [02/05/12 02:05]
前スレ1より
>yaccやlexの使い方やら言語仕様やらの話題。

前スレ

【コンパイラ・スクリプトエンジン】相談室
pc.2ch.net/test/read.cgi/tech/981672957/

前スレアーカイブ(かちゅ用)
www.1me.jp/hp/prg_c-s_lab

前スレに張られたリンク + x
>>2-6

112 名前:デフォルトの名無しさん mailto:sage [02/06/25 01:16]
DQN がドラゴンブック買うかよチクショー。

113 名前:コンパイラ構成法 mailto:sage [02/06/25 03:49]
おもわず検索してソースだけget。

114 名前:棄教者 ◆witdLTi2 mailto:sage [02/06/25 07:47]
>>113
あ。ほんとだ。
正誤表とソースがげtできる!
カムサハムニダ。

115 名前:デフォルトの名無しさん [02/06/30 20:21]
保守

116 名前:デフォルトの名無しさん mailto:sage [02/07/07 23:12]
やっと前スレが埋まったね。

117 名前:質問 [02/07/07 23:43]
どうしてこのスレはもりあがらないんですか?

118 名前:デフォルトの名無しさん mailto:age [02/07/07 23:49]
kmyaccとflexを組み合わせて使うことは可能なんですか?


119 名前:デフォルトの名無しさん [02/07/08 00:24]
生理的に可能

120 名前:デフォルトの名無しさん [02/07/08 00:31]
ありがとう
カムサハムニダ




121 名前:デフォルトの名無しさん [02/07/08 01:12]
ちうか、今の時代、構文解析なぞを勉強するのはあまり意味がない
気もするのだが... まだLALRとかが発明される前なら研究の
対象にはなっただろうが、今はyaccが使えればいいじゃん、と思う。

122 名前:デフォルトの名無しさん [02/07/08 01:13]
antlrの使い方がわかればなおよい。




と言ってる俺はyaccしか使えません首吊ってきます


123 名前:棄教者 ◆witdLTi2 [02/07/08 08:21]
>>121
yaccの文法はわかっても即コンパイラ・スクリプトが書けるとは限らないという罠。

124 名前:デフォルトの名無しさん mailto:sage [02/07/08 08:35]
>>121
いや〜、でも憶えないとコンフリクトの理由が分からなくて困ることとかない?
でも、なにも知らないところからだったら yacc 憶えた後の方が理解が早いので
手順として先に yacc は賛成。


125 名前:デフォルトの名無しさん mailto:sage [02/07/08 10:10]
>>121
コンパイラ・コンパイラの段階から自作できるようになって、初めて一人前。

126 名前:デフォルトの名無しさん mailto:sage [02/07/08 10:39]
コンパイラ・コンパイラ・コンパイラはどうやって作るんですか?

127 名前:  mailto:sage [02/07/08 11:02]
>>126
コンパイラ・コンパイラと一緒。

* (コンパイラ・コンパイラ)・コンパイラ
* (YACC のコンパイラ)・コンパイラ
* (C のコンパイラ)・コンパイラ


128 名前:デフォルトの名無しさん mailto:sage [02/07/08 14:19]
>>126
作る必要はありません。

129 名前:デフォルトの名無しさん mailto:sage [02/07/08 16:40]
>>126
コンパイラ・コンパイラ・コンパイラの段階から自作できるようになって、初めて神。

130 名前:デフォルトの名無しさん mailto:sage [02/07/09 03:40]
[コンパイラ]n ・ コンパイラの段階から自作できるようになって、初めて神。



131 名前:ふわふわ名無しさん mailto:sage [02/07/09 04:16]
結局のところ、コンパイラ・コンパイラさえ作れれば神。
証明↓

132 名前:デフォルトの名無しさん mailto:sage [02/07/11 03:28]
⊂(ΦωΦ)⊃フフフ・・・・

133 名前:棄教者 ◆witdLTi2 mailto:sage [02/07/11 16:15]
>>131
テユーカ、一番すごいのはダイレクトにマシンコードを吐き出すコンパイラをハックする人だと思う。

134 名前:デフォルトの名無しさん mailto:sage [02/07/11 18:45]
再帰下降ってみんなもう使ってないの?

135 名前:デフォルトの名無しさん mailto:sage [02/07/11 20:44]
>>134
JavaCCが、再帰下降のパーサを生成する。

WebGainが音信不通なんでどうなることやら。

136 名前:デフォルトの名無しさん [02/07/17 00:05]
昔のインタフェースの特集記事に色々とあったな


137 名前:デフォルトの名無しさん [02/07/22 00:34]
while文を使ってfor文を定義したいのですが、
for(ex1;ex2;ex3){s;}

ex1;
while(ex2){
s;
ex3;
}
と書こうと考えますた。
なんですが、前から順番に構文解析していく場合
sを先に評価してex3を評価するなんてことをどうやって実現するのでしょうか?
ジャンプ命令を使ったりしてどうにかするのでしょうか?
教えてください。

138 名前: mailto:sage [02/07/22 00:38]
>>137
「定義したい」とはどういう意味だ?

139 名前:デフォルトの名無しさん mailto:sage [02/07/22 00:38]
ブロック終端でのjumpの前の時点でex3を評価すればいいじゃん


140 名前:デフォルトの名無しさん [02/07/22 00:55]
>>139
つまりsを読んだ後、ex2の前にjumpする前にex3を評価するってことですよね?
でも前から解析していく際にex3はどのようにしておけばよいのでしょう。
プログラム書くときにex3のところをどうやって書けばいいのかが・・・考えてるんですけど
分からないんです・・・



141 名前:デフォルトの名無しさん mailto:sage [02/07/22 00:59]
>>140
ハァ?
それじゃfor()はどうやって実現してるんだよ?

142 名前: mailto:sage [02/07/22 01:12]
>>140
もしかして、構文木とか作らずに、字面のまま実行してたりする?

143 名前:デフォルトの名無しさん [02/07/22 01:16]
>>142
恥ずかしながらそうです。。。


144 名前:デフォルトの名無しさん mailto:sage [02/07/22 01:18]
それじゃ、構造化言語を作るのは無理だろ。

145 名前:デフォルトの名無しさん [02/07/22 01:23]
>>144
そうですか。。。
出直してきます。レスくれた方ありがとうございました。

146 名前: mailto:sage [02/07/22 01:31]
continueに対応できない罠

とかいう問題じゃなかったか…

147 名前:デフォルトの名無しさん [02/07/22 02:24]
www.combo.org/ これなんかもおもしろそう.


148 名前:デフォルトの名無しさん mailto:sage [02/07/22 03:53]
別に構文木を作らなくても、構造化言語のコンパイラは作れる。
というか、作ったことがある。
出力コードの最適化は難いし、jumpの塊になるけど、breakや
continueもちゃんと対応できた。

149 名前:デフォルトの名無しさん mailto:sage [02/07/22 11:00]
>>148
> 別に構文木を作らなくても、構造化言語のコンパイラは作れる。
不可能じゃないだろうが、for ループがネストすることを考えると、ジャンプ用の
ラベルの振り方とか面倒そうだ。(それって、結局、構文木を作ってるのと手間
変わらんのでは?)

150 名前:デフォルトの名無しさん [02/07/29 04:09]
字句解析をする際に予約語と予約語でない名前とを区別するにはどうするべきなんでしょうか?
つづりを切り出し照合せよなどと本には書いてあったのですが、意味がよく分かりません。
ハッシュ法を使って何とかするのでしょうか?



151 名前:デフォルトの名無しさん mailto:sage [02/07/29 05:24]
>>150
とりあえず単語切り出すところまではできてるとして、後は

static const char *keywords[] = {
  "if", "else", "while", ..., NULL
};

int is_keyword(const char *s)
{
  int i;
  for (i = 0; keywords[i] != NULL; ++i)
    if (strcmp(s, keywords[i]) == 0)
      return 1;
  return 0;
}

とか。キーワード数が増えたら、ベタな線形検索やめてハッシュや二分木を
使った方が良いかもしれんが、たかだか数十程度なら気にしなくて良い。

152 名前:ろうひ男爵 [02/07/29 09:44]
>>150
c言語+asmのマクロを展開するプログラムを作って、
当初は普通の検索(線形検索)で90秒かかった処理が、
ハッシュ(チェイン法)を使って15秒になったよ。
でも、そのときの登録語数が3万単語位なので、
cコンパイラ部分だけで使うくらいの語数(変数合わせて千単語ぐらい)だと、
それほど性能の差は無いと思うよ。
ちなみに、2本木の方が実装は難しいかも。

153 名前:デフォルトの名無しさん mailto:sage [02/07/29 10:36]
gperfつかっとけ

154 名前:デフォルトの名無しさん mailto:sage [02/07/29 12:13]
2本木ってなに?

155 名前:ろうひ男爵 [02/07/29 12:22]
すまん、2分木の事。
あと、90秒かかったのが5秒になったの間違えです。

156 名前:デフォルトの名無しさん mailto:sage [02/07/30 01:44]
2本木なんて初めて聞いたよ

157 名前:ろうひ男爵 [02/07/30 04:41]
>>156
すまんのう

158 名前:デフォルトの名無しさん mailto:sage [02/07/30 04:48]
>>157
ろうひ男爵、いいかんじのひとだね。

159 名前:デフォルトの名無しさん mailto:sage [02/07/30 23:38]
後学のため自前でスクリプトコンパイラを作ってみようと思い、
再起下降構文解析とかBNFとかLAL(1)等の解説されているページをみてまわっています。
a -> a b
b -> c
c -> X
このような一直線な処理は簡単にできる気がするのですが、
a -> a b|c
b -> X
c -> Y
のようにorが入るとたちまちパニックです。
上記の場合bの処理でfalseが帰った場合、
取得したトークンをスタック等に積んでおいて、
cでそのスタックを参照するというような仕組みになるんでしょうか?
それとももっとエレガントな仕組みがあるのでしょうか?
実は全くトンチンカンな事いっちゃってるんでしょうか?
つべこべ言わずYaccで仕組み覚えろモルァ!でしょうか?

160 名前:デフォルトの名無しさん mailto:sage [02/07/30 23:56]
>>159
まだコードやアルゴリズムを考える段階にないと思われ。

cspt1.ict.ru.ac.za/compilers/

ここにコンパイラ作りの基礎を書いた本一冊文のドキュメントがある。
LL文法の範囲内しか扱ってないけれど最初に手を着けるにはこれぐらいでいい。



161 名前:棄教者 ◆witdLTi2 mailto:sage [02/07/31 08:42]
>>159
Yaccを使いこなせるようになった方が手っ取り早いです。
yacc/lex プログラムジェネレータ on UNIX
五月女健治著
テクノプレス
ISBN4-924998-14-1

162 名前:デフォルトの名無しさん mailto:sage [02/07/31 13:58]
>>159
自前で作らなきゃいやなの?

163 名前:159 mailto:sage [02/07/31 14:39]
>>160
もっと基礎や概念みにつけるべきということですね。
英語はかなり苦手ですが、いい機会なので昼休み等に読んでいこうと思います。

>>161
昨日Yacc/Lex関係の本を探してみたのですが、
Flaxの本しかありませんでした(買いませんでした)
教えていただいた本を探してみようと思います。
(そういえばネットで買えるとこがありましたよね)

>>162
仕事には全く関係ないというか、完全に興味本位です。
あとオブジェクト指向を勉強してたとき感じたのですが、
自分の知らない技術理解すると、今までやってきたことを
違った視点で見れたりするじゃないですか。
そういうのも狙ってます。
(再起下降構文解析とかみててビビビときましたね)

164 名前:デフォルトの名無しさん mailto:sage [02/07/31 14:48]
>>161
LL の方が

 エラー回復が楽
 先読みするトークン数を容易に増やせる

って利点もあるから、俺は両方やることを推奨したい。ま、お勉強としては
手書きのパーサーも悪くないっしょ。

165 名前:デフォルトの名無しさん [02/07/31 20:00]
下の文法のパーサをつくれたらLALR(2)パーサジェネレータを名乗っていいですか?

//term
a
b
c
//non-term
START:
 E;
E:
 C a a|
 D a b;
C:
 A;
D:
 B;
A:
 a;
B:
 a;


166 名前:デフォルトの名無しさん mailto:sage [02/07/31 20:03]
>>165
実際にLR表作ってみたら?

167 名前:デフォルトの名無しさん mailto:sage [02/07/31 20:07]
>>166
できてるっぽいんですが、goto表をここに貼ってみればいいですか?

168 名前:デフォルトの名無しさん [02/07/31 21:22]
貼っていい?

169 名前:デフォルトの名無しさん mailto:sage [02/08/02 00:48]
イっていい?

170 名前:高速化 [02/08/07 02:49]
インテルのコンパイラでコンパイルするだけで高速化しました。
無料体験版があります。
www.xlsoft.com/jp/products/vtune/perftool.htm



171 名前:デフォルトの名無しさん [02/08/07 03:02]
ハッシュはどこら辺を参考にすればいいんでしょうかねぇ。

172 名前:デフォルトの名無しさん [02/08/15 00:22]
『コンパイラ構成法』を読みながらlex/yaccを勉強しているのですが、
ttp://216.239.51.100/search?q=cache:lYpgKL5fV34C:www.hara.cs.keio.ac.jp/kCompiler/+%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E6%A7%8B%E6%88%90%E6%B3%95+%E6%AD%A3%E8%AA%A4%E8%A1%A8&hl=ja&lr=lang_ja&ie=UTF-8
でダウンロード出来るであろうソースコードが相手先サーバーが動いていないか何かで、ダウンロード出来ません。

正誤表はグーグルキャッシュでゲットできたのですが。

ソースコードお持ちの方、どこかのアップローダに上げていただけませんか?


173 名前:棄教者 ◆witdLTi2 [02/08/15 15:30]
>>172
いま、鯖がdjみたいですね。
このまえはぼくもダウソできたので。
しばらくしたらもう一度渡来してみたらどうよ。

この本は親切で分かりやすい本です。おすすめです。
わからないところや面白い本はドラゴンブックで補充するとさらに良いでしょう。

174 名前:ろうひ男爵 [02/08/17 05:29]
>>171
'0'-'9' を 0-9
'@' を 10
'A'-'Z' を 11-36
'_' を 37
'a'-'z' を 38-63
それ以外を 0
にする文字変換テーブルを作り(chartbl[256])、
ハッシュ表(hashtbl[256])を256だとすると、

hashtbl[chartbl['最初の文字']+chartbl['真ん中の文字']+hashtbk['最後から2番目の文字']+chartbl['最後の文字']]
でハッシュ値が収得できるよ。


175 名前:デフォルトの名無しさん [02/08/27 16:01]
インタープリターの勉強したいんですが、どこかに参考コードとか、
いい本ありませんか?

176 名前:ろうひ男爵 [02/08/27 16:38]
どういった用途に使います?>>175
中間言語に落として、ゲームやツールに組み込む単純なスクリプト言語なら、
LL(1)が良いと思います。
それ以上に簡単な物の方がよいのでしたら、
構文解析もほとんど考えなくても良い言語にしたら簡単なんじゃないのでしょうか?
使用用途にもよりますが、以下ぐらいなら簡単に作れるのではないでしょうか?

命令を組み込みの物だけにする、
関数を使えなくする、構造化も出来なくする(手続き言語の古いMS-BASICみたいにする)
変数は$マークから始まるとか、特殊記号にする
算術計算式などを、別扱いにするか、専用の命令を作り、ADDとかにしする。
それでも、バックパッチぐらいは必要ですけど。

LLなら、そこまで難しくはないけど、
yaccとlexを使い、LALRって方法でも簡単に出来ますよ。

177 名前:デフォルトの名無しさん [02/08/27 16:53]
>>176
用途というか、PerlやHSPを使ってるうちに、どうやってコンパイラや
スクリプトが動くんだろうと思って、すごく簡単なものでもいいから作れたら
勉強がてらやるのもおもしろいかなーと漠然と思ったんです。

コンパイラに関してはぜんぜん知らなかったので、すこしWEBを見て
LL(k),LR(k)について勉強しましたが、言ってる事は理解できても
それをどうやってコードにしようと悩んでしまって。なにかコードがあれば
みながら勉強することができるのですが・・・言語はJAVAかCかPERLか、VB
くらいしか使えないので、どれかでやろうと思っています。

何かインタープリター系の本でコードが載っていて、いい本かなにかありますか?
お願いします。ちなみにUNIX系使えないのでYACCとかできません・・・

178 名前: ◆JAPH9PWA mailto:sage [02/08/27 17:42]
Macは知らないけど、Windowsならyaccあるよ
hp.vector.co.jp/authors/VA010446/toolbox1/

179 名前:デフォルトの名無しさん [02/08/27 17:49]
JavaCCで、構文と構文の隙間を埋めるような
柔軟な構文を定義する方法を教えてください。
Perlでいうところの (.*?) みたいなものが欲しいんです。お願いします。

180 名前:デフォルトの名無しさん [02/08/27 18:07]
www.tokumaru.org/index.htm

ここのコンパイラソースコードは参考にはならない?



181 名前:ろうひ男爵 [02/08/27 18:37]
>>177
でしたら、
コンパイラ構成法 原田 賢一 共立出版株式会社 ISBN: 4320029224 6,500円
が一番分かりやすいのですが、yaccとlexが必要です。

コンパイラの仕組み 情報科学こんせぷつ〈8〉 朝倉書店 ; ISBN: 4254127081
も物量的に少ないので読みやすいですが、消化不良のところが出てきます。
しかし、1日から一週間で読めると思います。

あと、インタープリタとコンパイラの違いは大きくないので、
ここのスレッドに色々質問すると良いかもしれません。

どちらにしろ、コンパイラ関連の本は難解な物が多く、
いろいろなアルゴリズムを理解していることが前提となったりするので、
軽くアルゴリズムの本を読んでおいた方がためになりますよ。

アルゴリズムを1冊ですますには、以下の本が良いと思います。
定本Cプログラマのためのアルゴリズムとデータ構造 近藤嘉雪 技術評論社

簡単なアルゴリズムの本は
C言語アルゴリズム+徹底入門 柏原正三 技術評論社
が読みやすいです。

182 名前:デフォルトの名無しさん mailto:sage [02/08/27 18:40]
金出す前にこれでも読んどけ。

www.hayalab.cs.ritsumei.ac.jp/~hayashi/materials/textbook.html

183 名前:Aoki [02/08/27 19:12]
実行速度が速いSmalltalkを実装するための技法をいろいろ教えて下さい。

184 名前:デフォルトの名無しさん mailto:sage [02/08/27 20:03]
>>179
JavaCCは少し使ったことがあるんで、答えられるようなら答えますけど、
Perlは知らないんで、質問の意図がわからないです。

185 名前:179 [02/08/27 20:28]
<ALL:~[]> /* Perlの(.*)相当だと思うのですが… */
void this () : {} {
  ( "{" this() "}" )+ )|(s = getAll() { println(s) } )
}
が、期待通りの動作をしてくれません。
左の構文を優先させたいのです。お願いします。

186 名前:179 [02/08/27 20:35]
具体的には、(asdf()asdf((asdf)asdf))
みたいなのをパーズしたいと思ってます。
asdfの部分は、それが構文そのものを含む時以外は、
全ての文字を処理したいのです。

187 名前:デフォルトの名無しさん mailto:sage [02/08/27 20:46]
<ALL:~[]*>
すみませんこっちでした。

188 名前:184 mailto:sage [02/08/27 21:43]
まだようわからんけど、{asdf{}asdf{{asdf}asdf}}が無理やりパースできるようにしてみた。
解釈が間違えてたらごめん。

TOKEN :
{
  <ALL: (~["{","}"])+>
}

void Input() : {} {
 foo()
}

void foo() : {
 String s;
} {
  ( LOOKAHEAD(2) "{" ( foo() )* "}" )+
 | (s = getAll() { System.out.println(s); } )
}

String getAll() : {
Token t;
} {
 t = <ALL>
 { return t.image; }
}

189 名前:179 [02/08/27 21:58]
ありがとうございます。参考にします。

190 名前:デフォルトの名無しさん [02/08/28 05:15]
パスカルやCはLL?LR?どっちを使ってるの?最近のはやいコンパイラは
みんなLRかな?



191 名前:デフォルトの名無しさん mailto:sage [02/08/28 09:24]
最近のflexはスレッドセーフなCコードを吐くようになったのか。
%option reentrant


192 名前:デフォルトの名無しさん [02/08/28 10:06]
>>182のリンクはいいリンクだ

193 名前:デフォルトの名無しさん mailto:sage [02/08/28 10:13]
>>190
パスカルはLL(1)じゃないの?

194 名前:デフォルトの名無しさん mailto:sage [02/08/28 10:58]
PascalはLL(1)でもパースできるように設計されているだけであって、
コンパイラがどうしているかは別。

195 名前:棄教者 ◆witdLTi2 mailto:sage [02/08/28 13:04]
>>182のリンク先にあるコンパイラのソースコードの解説、
これってWEBを使って吐き出されたのかなぁ。

スレとは関係ないのでsage
そういえば TeX とか WEB とか Knuth なスレってあったっけ?

196 名前:デフォルトの名無しさん [02/08/28 13:41]
Texスレはなぜかビジネスソフト板で見たような気がする。
Knuthスレはないんじゃないかな?

>>182のリンク先にある
www.hayalab.cs.ritsumei.ac.jp/~hayashi/materials/SCF.pdf
の元のコードってどこにあるの?ないぞ

197 名前:デフォルトの名無しさん [02/08/28 16:32]
knuthが作ったWEB言語って何?気になるんだけど

198 名前:デフォルトの名無しさん mailto:sage [02/08/28 22:53]
>>197
Knuthが提唱した文芸的プログラミングの実装、かな?
ドキュメントの中にソースコードを埋め込む形を取ることで、ソースとドキュメントの
間の不整合や、ドキュメント無きコーディングを避けるっていうものらしい。
コンパイルのためにはドキュメントの中からソースを抜き出してコンパイラに渡す
プログラムが必要になる。
で、Knuth自身が作った、TeXドキュメントからPascalプログラムを抜き出してコンパイルする
システムがWEBシステムの筈。

詳しくは
www.google.com/search?hl=ja&ie=UTF-8&oe=utf-8&q=Knuth+WEB&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
でも見れ。

199 名前:デフォルトの名無しさん mailto:sage [02/08/28 22:54]
>>195
TeX総合スレ@数学板
science.2ch.net/test/read.cgi/math/1026634481/

200 名前:棄教者 ◆witdLTi2 [02/09/02 13:04]
>>111
原田本を今読んでいるところですが、気になった箇所があるので皆さんにお伺いします。
p.164下から11行目
> $p_m$ にアドレス $m+n$ の領域を割り付ける.
とあるのは
> $v_m$ にアドレス $m+n$ の領域を割り付ける.
ではないでしょうか。
ちなみに正誤表
www.hara.cs.keio.ac.jp/kCompiler/Errata/Errata.html
で確認したところ、掲載されていませんでした。
いきなり原田先生にメールして自分が間違っていたら恥ずかしいので、
2CHのハッカーの皆さんに確認してからメールをしようと思います。



201 名前:棄教者 ◆witdLTi2 [02/09/02 13:04]
テユーカ200get

202 名前:棄教者 ◆witdLTi2 mailto:sage [02/09/02 16:12]
>>182
p.15 の BNF の説明
> Backus Nauer Form  Backus Nauer Form (BNF) では、....
って the Jargon File には
Backus-Naur Form / Backus Normal Form って書いてあるんですけど。。。
Nauer って who?

203 名前:デフォルトの名無しさん mailto:sage [02/09/02 16:33]
ドイツ語綴り->Nauer
英語綴り->Naur
だったと思う。

204 名前:棄教者 ◆witdLTi2 mailto:sage [02/09/02 17:15]
グーグルすると
backus naur form で日本語限定だと213件, 言語非限定だと約20700件ヒット。
backus nauer form で日本語限定だと9件, 言語非限定だと253件ヒット。
おまけに「スペリング修正候補 backus <b>naur</b> form」として修正を勧告される。

205 名前:棄教者 ◆witdLTi2 mailto:sage [02/09/02 17:16]
×backus naur form で日本語限定だと213件
○backus naur form で日本語限定だと215件

206 名前:デフォルトの名無しさん [02/09/03 21:12]
インタープリタの仮想機械に興味を持ち、調べています。

調べてみた JVM、CRI、Python はいずれもスタックマシンのようでしたが、レ
ジスタマシンと比較して何かメリットがあるのでしょうか。

207 名前:デフォルトの名無しさん mailto:sage [02/09/03 22:29]
Forthハッカーの伝統。
というのは半分冗談だけど、中間コードが簡単/短くできるからじゃないんですか。
コンパイラも作りやすいし。

208 名前:デフォルトの名無しさん mailto:sage [02/09/04 00:53]
詳しくは知らんけど、インタープリタの仮想機械では、
レジスタのアクセスがメモリをアクセスするのと同じ。
パイプラインとかハードウェアで実装する場合の利点が
いかせられないからだと思う。

209 名前: mailto:sage [02/09/04 02:05]
>>206
仮想マシンで最もコストが高いのが、コードのフェッチとデコード。
スタックマシンなら、コードも短いしオペランドも要らない。

210 名前:デフォルトの名無しさん mailto:sage [02/09/04 11:34]
>>207-209
ありがとうございました。

まとめると、ネイティブコードまでコンパイルするのでなければ、レジスタマ
シンでも結局はメモリへのアクセスを行うことになるので、スタックマシンに
対する利点はなく、むしろコードが短くなる分だけスタックマシンの方が速度
的に有利、というところですかね。



211 名前:ろうひ男爵 [02/09/04 12:20]
>>210
たしかに、
ネイティブコードへ最適化する場合、レジスタマシンの方が有利ですよね。
広域レジスタとローカルレジスタを割り当てたりした方が最適化しやすいですからね。

一方、インタプリタの場合、おっしゃるとおり
レジスタマシンと言っても結局メモリアクセスされるので、
スタックマシンに対するメリットはないですね。
それだったら、簡単に設計でき、
なおかつコードが短くなるスタックマシンの方が有利でしょう。

自分的には出力されたコードがレジスタマシンの方が読みやすいので、
レジスタマシンを使ってます。(インタプリタですが)


212 名前:デフォルトの名無しさん mailto:sage [02/09/04 14:39]
つーかJITコンパイル等でチューニングを詰めていくと
結局どっちも速度的に大差ないという話。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef