09/01/28 20:49:02
プログラミング言語処理系の開発に興味のある人達のスレッドです。
字句解析・構文解析から,データフロー解析,ループ並列化,データ分散,SSA変換,
CPS変換,レジスタ割付,命令スケジューリング,ソフトウェアパイプライン,
SIMD命令生成,VLIW向けクラスタリング,スクラッチメモリ向け最適化,リンク時最適化,
JIT,動的バイナリ変換等の各種最適化,それにVM,GC,低消費電力化などなど。
意味論に関する話題も歓迎です。
過去スレ
1 URLリンク(pc.2ch.net)
2 スレリンク(tech板)
3 スレリンク(tech板)
4 スレリンク(tech板)
5 スレリンク(tech板)
6 スレリンク(tech板)
7 スレリンク(tech板)
8 スレリンク(tech板)
9 スレリンク(tech板)
10 スレリンク(tech板)
11 スレリンク(tech板)
12 スレリンク(tech板)
関連リンクは多分 >>2-10 あたり
2:デフォルトの名無しさん
09/01/28 20:49:29
Wikiのまとめページ
URLリンク(www6.atwiki.jp)
★コンパイラ一般
・色々なツールの紹介
URLリンク(catalog.compilertools.net)
・コンパイラ関連のリンク集
URLリンク(www.ulis.ac.jp)
・スクリプティング言語資料室(仮) (リンク集)
URLリンク(www.kt.rim.or.jp)
・Compiler Construction
URLリンク(www.ie.u-ryukyu.ac.jp)
・情報システム工学実験 III コンパイラ・コンパイラ
URLリンク(math.cs.kitami-it.ac.jp)
・OS/Programming 簡単な C コンパイラ
URLリンク(www.csg.is.titech.ac.jp)
・正規表現
URLリンク(hp.vector.co.jp)
・コンパイラ研究・開発情報の一集積所
URLリンク(compilers.cs.uec.ac.jp)
・Links and Selected Readings
URLリンク(www.gnu.org)
・国産のコンパイラ共通インフラストラクチャCOINS
URLリンク(www.coins-project.org)
3:デフォルトの名無しさん
09/01/28 20:49:56
★字句・構文解析
・Lex and YACC primer/HOWTO (邦訳)
URLリンク(www.linux.or.jp)
・Turbo Pascal Lex/Yacc
URLリンク(www.musikwissenschaft.uni-mainz.de)
・Jim Roskind's LALR(1) C++ Grammar
URLリンク(www.empathy.com)
・Flexと Bisonを同時に使う
URLリンク(guppy.eng.kagawa-u.ac.jp)
・KITE_ASM (yacc,lex)
URLリンク(www.arch.cs.kumamoto-u.ac.jp)
・bison用のC++ LALR skeleton
URLリンク(www.bj-ig.de)
・ANTLR(非yaccのパーサジェネレータ)
URLリンク(www.antlr.org)
・JavaCC(Java Compiler Compiler)
URLリンク(javacc.dev.java.net)
URLリンク(village.infoweb.ne.jp)
URLリンク(www.asahi-net.or.jp)
・CUP, JLex, JFlex
URLリンク(www.cs.princeton.edu) (JLex, CUP)
URLリンク(www.jflex.de)
・SableCC
URLリンク(www.sablecc.org)
・¬<><∪∪ (notavacc)LALR(1)
URLリンク(ne.cs.uec.ac.jp)
・boost::spirit(C++のテンプレートでEBNFの構文を模倣)
URLリンク(spirit.sourceforge.net)
URLリンク(boost.cppll.jp)(マニュアル日本語化プロジェクト)
URLリンク(www.fides.dti.ne.jp)
4:デフォルトの名無しさん
09/01/28 20:50:53
★ごみ集め
・GC FAQ -- draft
URLリンク(www.iecc.com)
・A garbage collector for C and C++
URLリンク(www.hpl.hp.com)
・一般教養としての Garbage Collection
URLリンク(www.is.s.u-tokyo.ac.jp)
・Garbage Collection : Algorithms for Automatic Dynamic Memory Management
URLリンク(www.amazon.com)
★処理系,スクリプト
・kikyou.info (吉里吉里というゲームのスクリプト)
URLリンク(kikyou.info)
・tiny C コンパイラ (C)
URLリンク(www.watalab.cs.uec.ac.jp)
・6809用 Micro C コンパイラ
URLリンク(www.axe-inc.co.jp)
・Portable Object Compiler (Obj-C >> C のトランスレータ?)
URLリンク(users.pandora.be)
・自作コンパイラの部屋(PL/1, Pascal等)
URLリンク(www.tokumaru.org)
・『Rubyソースコード完全解説』サポートページ
URLリンク(i.loveruby.net)
・『やさしい Lisp の作り方』『やさしい Java インタプリタ の作り方』
URLリンク(www.okisoft.co.jp)
・MSによるPEフォーマット仕様書(日本語)
URLリンク(www.interq.or.jp)
5:デフォルトの名無しさん
09/01/28 20:51:26
★学会
・PLDI
URLリンク(research.microsoft.com)
コンパイラの研究に関する最新成果を知りたければまずはここ。
・POPL
URLリンク(www.cs.princeton.edu)
PLDIよりは理論寄りだが大いに参考になる。
・ICFP
URLリンク(icfp06.cs.uchicago.edu)
関数型言語に関する学会。とても難しい。
・OOPSLA
URLリンク(www.oopsla.org)
オブジェクト指向言語に関する学会。最近はやや低調?
・ICCC
URLリンク(www.st.cs.uni-sb.de)
ヨーロッパ系。派手さはないが堅実。
6:デフォルトの名無しさん
09/01/28 20:53:35
★参考書籍
・コンパイラ 原理・技法・ツール 1&2
URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.co.jp)
通称ドラゴンブック。バイブル。
・コンパイラ構成法 原田 賢一
URLリンク(www.amazon.co.jp)
URLリンク(www.hara.cs.keio.ac.jp) (ソース、正誤表のダウンロード)
・プログラミング言語処理系 岩波講座 ソフトウェア科学〈5〉 佐々 政孝
URLリンク(www.amazon.co.jp)
一冊で済ませたい人へ。
・コンパイラの構成と最適化 中田 育男
URLリンク(www.amazon.co.jp)
最適化がメインだが、構文解析からコード生成までの基本事項も解説されている。
・コンパイラの仕組み 渡邊 坦
URLリンク(www.amazon.co.jp)
薄い奴(185p)を読みたい人に。
・21st Century Compilers (Alfred V. Aho, Sethi, Ravi Sethi, Jeffrey D. Ullman, Monica Lam)
URLリンク(www.amazon.co.jp)
まだ出ていない。
・スモールコンパイラの制作で学ぶプログラムのしくみ
URLリンク(www.cbook24.com)
初心者向けの優しい解説本。
以上
7:デフォルトの名無しさん
09/01/28 21:07:26
>>1乙
8:デフォルトの名無しさん
09/01/29 12:12:16
>>1 乙これはポニーテールだからなんとかかんとか
テンプレ追加
PEG(解析表現文法),Packrat Parser
URLリンク(ja.wikipedia.org)
9:デフォルトの名無しさん
09/01/29 20:21:44
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ まピョーん☆
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
10:デフォルトの名無しさん
09/01/30 22:49:04
スクリプトエンジン作ってみたい。
お勧めのサイト教えて
11:デフォルトの名無しさん
09/01/30 23:13:10
>>10
数レス前も読めないのか…
12:デフォルトの名無しさん
09/01/30 23:35:19
やっぱいいや
13:デフォルトの名無しさん
09/01/31 12:13:29
@wiki 更新しときました。
14:デフォルトの名無しさん
09/02/02 23:15:27
「★字句・構文解析」に追加。
caper
URLリンク(naoyuki.hirayama.googlepages.com)
15:デフォルトの名無しさん
09/02/03 04:46:47
>>10
サイトでないけど
URLリンク(www.amazon.co.jp)スクリプトエンジン-プログラミング-坂本-千尋/dp/4797347627/ref=sr_1_1?ie=UTF8&s=books&qid=1233603981&sr=8-1
これで最低限の知識は得られると思う
16:デフォルトの名無しさん
09/02/06 17:32:19
パーサジェネレータは検索すれば山ほどひっかかるけど、
スキャナージェネレータは少ないね。
すぐに見つかるのはLex, Flex, JLex, JFlexくらいか。
UINTVAL = "[0-9]+";
のように書けばスキャナークラスを生成してくれる、
お手軽スキャナージェネレータは無いのかな?
17:デフォルトの名無しさん
09/02/07 01:05:33
>>16
つ「正規表現」
18:デフォルトの名無しさん
09/02/07 15:58:49
各コードジェネレーターが生成したコードの処理速度を比較結果を掲載しているサイトってないの?
19:デフォルトの名無しさん
09/02/07 16:22:18
ここで聞いていいのかわからんけど、ActionScriptのDSL処理系ってない?
ActionScriptっていちいちコンパイルせなあかんやん?
面倒なんよね
オンザフライで処理してくれるDSLあると便利何やけど、emebedded向けなライブラリないかな?
検索してるんだけど、全然でてこないんだ
20:デフォルトの名無しさん
09/02/07 21:19:58
>19
むかしActionScriptで書かれたJavaScript実装で、fiberみたいなこともできるのがあったけど、
ググッたら出てこなかったorz...
21:デフォルトの名無しさん
09/02/07 21:21:40
>>16
マイ・オートマトンブームを起こすしかない。
22:デフォルトの名無しさん
09/02/07 22:54:30
>>16
PEGでいいじゃん
23:19
09/02/08 01:06:23
みなさん、ありがとう。
wonderfl関係あさってたらいろいろ発見しますた。
wonderflでポケコンでシューティング | wonderfl build flash online
URLリンク(wonderfl.kayac.com)
2009-01-08 - Simple Inspiration
URLリンク(d.hatena.ne.jp)
Cannon macro language
URLリンク(www.yomogi.sakura.ne.jp)
ゲーム用のちっこいDSLがあればなーと思ってたので調度よかった・・・
wonderflのはまあコンパイルはしないといけないけど、文字列を外部にだせばどんだけでもいけるよね
24:デフォルトの名無しさん
09/02/10 22:34:36
Xtalの作者ってバンダイナムコゲームスで活動してるんだな…
25:デフォルトの名無しさん
09/02/24 02:01:57
保守
26:デフォルトの名無しさん
09/03/07 14:16:19
jp.ne.cappuccino.keisuken.lex
が字句解析してくれるみたいです。
URLリンク(cappuccino.jp)
27:16
09/03/25 05:11:37
>>17
>>21
>>22
>>26
何気なく書いただけなのに、暖かいレスさんくす。
他にもJavaの場合には、標準ライブラリのStreamTokenizerを使っても
字句解析らしきことができるようです。
URLリンク(www5b.biglobe.ne.jp)
28:デフォルトの名無しさん
09/04/03 20:03:50
XtalのPEG採用って、言語仕様側じゃなくて、アプリ側だったのか。
言語仕様側だったらセミナーにはぜひ行ったところだったんだが。
29:デフォルトの名無しさん
09/04/03 20:31:43
Xtalスクリプトのコンパイラ自体はC++でがりがり書いてるからな。
PEGパーサを組み込みライブラリとして持つとのことようだが(詳しくはソースコード参照)
30:デフォルトの名無しさん
09/04/03 22:05:00
コンパイラつーか、パーサね。
パーサジェネレータ使わずにがりがり書いてるね。腕力のある人はうらやましいわ。
31:転載
09/04/05 09:38:58
IGDA Japan chapter - ニュース
URLリンク(www.igda.jp)
13:10 - 14:00
「ごく簡単な並列処理スクリプトシステムの設計と実装」
□講師
小久保啓三(HAL東京)
(株)スクウェアでの代表作「ロマンシング・サガ」「FF5」「クロノトリガー」「FF7」。クロノトリガーとFF7では、スクリプトシステムの設計と実装に携わる。
14:00 - 14:50
「『サクラ大戦Ⅴ』でのスクリプト運用事例」
□講師
秋葉晴樹(セガ)
株式会社セガ 第三CS研究開発部 リードプログラマ。
代表作は、サクラ大戦シリーズ、のび太の新魔界大冒険、ブレイザードライブ。
サクラ大戦シリーズは3から参加、主にADVパートのプログラムを担当。
15:20 - 16:10
「汎用スクリプト言語Xtal 設計と実装」
□講師
石橋立宣(バンダイナムコゲームス)
NBGI プログラマ。
PSP塊魂のエンディングミニゲームやシステム周り担当。
PSP太鼓のADV部分やシステム周り担当。
趣味で、C++組み込み用スクリプト「Xtal」を開発。
16:10 - 17:00
「Squirrelスクリプトを使った実装と活用」
□講師
神尾隆司(スクウェア・エニックス)
Wiiウェア 小さな王様と約束の国 ファイナルファンタジー・クリスタルクロニクル の開発に関わる。
北出智(スクウェア・エニックス)
PS2 聖剣伝説4、Wiiウェア 小さな王様と約束の国 ファイナルファンタジー・クリスタルクロニクル 等の開発に関わる。
32:デフォルトの名無しさん
09/04/07 12:55:27
誘導されてきました。よろしくお願いします。
自作ソフトで使うマクロの文法を、拡張しようと思い、
lexやらyaccやらbisonやら調べ始めたのですが・・・難しい・・・
例えば呼び出し前に新たなトークンを追加したり、関数定義みたいなことが
出来るようにするサンプルを探しているのですが、見つかりません。
・自作ソフトはプラグインで拡張可能になっていて、マクロのプラグイン名
を自前で解析していますが、区切り文字の検出とか括弧の扱いとか、自力
では限界なので・・・プラグイン名を追加トークンにして、ライブラリお
任せ一発という形に出来ればと思っています。
(プラグイン辞書の関数ポインタ呼び出しみたいな形)
・マクロの中で関数マクロの定義が出来るようにといいのですが、
function hoge(a, b, c) = {
age; sage(a, b); uge(c);
}
hoge(1, 2, 3);
こういうのを実現しているサンプルなどありましたら教えてください。
33:デフォルトの名無しさん
09/04/07 13:20:14
現状、どういう風に構文解析とかしていて、どういう風にマクロを実行したり
プラグインを呼び出したりしてるわけ?
34:デフォルトの名無しさん
09/04/07 14:32:15
今の時点の文法はシンプルです。プラグイン名と引数、セミコロンのみ。
hoge[(...)]; [...]
プラグイン名を配列に積み上げて、一括でマクロ構文を読み込み、
セミコロンで分割して、参照の配列に積み直し。
動かすときに、それぞれのインターフェースを順に呼び出す形です。
これだと代入操作ひとつ出来ないので、何か良い方法を探しています。
35:デフォルトの名無しさん
09/04/07 15:06:31
関数名だろうが変数名だろうが,言語組み込みじゃないトークンは
トークン化の時点では何も考えず全部「識別子」一括りでおk
36:デフォルトの名無しさん
09/04/07 15:21:59
そもそも、「変数」といったものをどうやって実現したらいいのか、とか、
スクリプトを読み込んで、関数定義があったら何をして、関数の呼び出しが
あったら何をするのか、とか、そういうことがそもそも全くわかってないのでは?
なんか配列って言ってるけど、リストとか木とかをポインタで操るコードは
書ける? それができないと本格的な処理系は無理。
37:デフォルトの名無しさん
09/04/07 15:35:53
目先にとらわれて本質が見えてない感じがする
高レベルな言語を触ったりしてみてもいいんじゃない
38:デフォルトの名無しさん
09/04/07 16:24:26
>>35
なるほど。最後にまとめてチェックすればいいという考え方ですね。
>>36
その通りです。yaccやbisonのサンプルを探してみても、文書を
解析するところまでで、その先を実際にどうやっているかの例が
なかなか・・・。
唯一良さそうな例を見つけました。
>URLリンク(www.ibm.com)
生のソースもとれるようですし、これで勉強してみます。
ホントはもう少しシンプルな例があればいいのですが・・・
39:デフォルトの名無しさん
09/04/07 16:53:02
yacc 電卓、で検索すれば簡単な電卓の例がいくつも出てくると思うが...
40:デフォルトの名無しさん
09/04/07 17:02:05
yacc/lexを自作するところから始めるのがお勧め。
41:デフォルトの名無しさん
09/04/09 07:11:35
LLVMの簡単な使い方ってどこ見ればいいのですかね?
42:デフォルトの名無しさん
09/04/09 08:21:46
>>41
URLリンク(llvm.org)
43:デフォルトの名無しさん
09/04/09 13:17:44
これはワクテカじゃないか?
InfoQ: LLVMおよびRubyの総まとめ:llvmruby、yarv2llvmおよびregexpllvm、Rubinius
URLリンク(www.infoq.com)
InfoQ: MacRuby 0.5にLLVMをベースにした高速VMが搭載される
URLリンク(www.infoq.com)
44:デフォルトの名無しさん
09/04/12 03:35:20
おー、世の中にはこんな便利なものがあるのか。
たとえ苦労してでも勉強して使いこなしたいところだな。
45:デフォルトの名無しさん
09/04/13 18:14:29
>>38
コンドーさんの「yaccによるCコンパイラ」がおすすめ
・・・なんだけど、プレミアがついちゃって高いんだよなあ
46:デフォルトの名無しさん
09/04/25 12:04:35
>>38
yaccやbisonでないと駄目なのかい?
古くさくて使いにくいから、今からパーサを書くなら
他にいいジェネレータがありそうだけど。
C++、C#、Javaならばcaperがお薦め。
(Javaジェネレータはまだレポジトリから落としてビルドする必要がある)
URLリンク(naoyuki.hirayama.googlepages.com)
URLリンク(code.google.com)
どうしてもyaccやbisonがいいなら、以下を読めばいいよ。
URLリンク(guppy.eng.kagawa-u.ac.jp)
47:デフォルトの名無しさん
09/04/25 14:37:19
>>46
日本語の文書!!
いや実は挫折してました。ごめんなさい。がんばります。
48:デフォルトの名無しさん
09/04/26 18:29:20
紙メディアで出てるGNUのBison解説とかどうかな?
49:デフォルトの名無しさん
09/04/28 22:46:38
>>48
以下のことですな。
URLリンク(www.amazon.co.jp)入門-チャールズ-ドネリー/dp/4756130658
内容は>>46の一番下と同じなのだけど、絶版で値段が高騰しているのが問題かな。
紙媒体だと電車の中などで読めるのがいいんだけどね。
50:デフォルトの名無しさん
09/04/28 23:31:19
そういえばこんなのが出るとか
Flex & Bison - by J Levine (2009/8/31)
URLリンク(www.amazon.co.jp)
51:デフォルトの名無しさん
09/04/29 08:10:34
> 内容は>>46の一番下と同じなのだけど、絶版で値段が高騰しているのが問題かな。
うわわわ。絶版してたのか。
52:46=49
09/04/29 10:37:05
>>47
> yaccやbisonのサンプルを探してみても、
> 文書を解析するところまでで、
> その先を実際にどうやっているかの例がなかなか・・・。
>
> 日本語の文書!!
日本語で書かれていて意味解析以降も
全部載っているドキュメントを探してきた。
URLリンク(ecs.kuis.kyoto-u.ac.jp)
Flexの解説 (GNU公式ドキュメントの日本語訳) もあった。
Flex入門
URLリンク(ascii.asciimw.jp)
53:52の続き
09/04/29 10:41:59
読みやすいように、要点だけ説明しておこう。
まずは字句解析から。
まずはソースファイルを読み込み、字句解析にかける。
字句解析では文字列を切って、種類を表すタグを付ける。
(タグはenumなどの定数)
例えば、
int main(void) {return 0;}
ならば、字句解析の結果は
elem(INT, "int");
elem(ID, "main");
elem(PAREN_L, "(");
elem(VOID, "void");
elem(PAREN_R, ")");
elem(BRACE_L, "{");
elem(RETURN, "return");
elem(INTLITERAL, "0");
elem(SEMICOLON, ";");
elem(BRACE_R, "}");
のようになる。
(elemはC++のクラスのつもり)
引数は左がenum定数で右は文字列ね。
一行を1つの構造体 (またはクラスやタプル) に入れると便利。
(Flexだと種類と文字列を別々に取得するんだったかな?)
54:52の続き
09/04/29 10:55:29
字句解析の結果を構文解析にかける。
上の例だと、ベタに書くと以下のようになる。
Program
: INT ID PAREN_L VOID PAREN_R BRACE_L RETURN INTLITERAL SEMICOLON BRACE_R
;
「=」の右側には、どういう種類の文字列がどういう順で並んでいるかを書く。
これだと本当に上の例しか読めなくなるので、
例えばVOID型で中身の無い関数も定義できるようにすると、以下のようになる。
(「|」は「または」という意味, 複数のパターンのどれでもいい場合に使う)
Program
: INT ID PAREN_L VOID PAREN_R BRACE_L RETURN INTLITERAL SEMICOLON BRACE_R
| VOID ID PAREN_L VOID PAREN_R BRACE_L BRACE_R
;
これで、以下のコードも読めるようになった。
void main(void) {}
55:52の続き
09/04/29 10:58:05
しかし、こうやって全部のパターンを網羅していくときりが無いよね。
だから、部分的に抜きだして共通化する。
上の例だと、
Program
: ReturnType ID PAREN_L VOID PAREN_R BRACE_L Body BRACE_R
;
ReturnType
: INT
| VOID
;
Body
: // 空の場合は何も書かない
| RETURN INTLITERAL SEMICOLON
;
こんな具合に、共通でない部分を追い出してやるわけだ。
# void型なのにreturnしている関数や
# int型なのにreturnしていない関数も読めるようになったことに注意。
構文解析では、一度に完璧な定義を書こうとせずに、
少しずつ解析できるパターンを増やしていくとやりやすいと思う。
56:デフォルトの名無しさん
09/05/02 17:46:16
>>30
LLVMもbisonパーサから手書きのパーサにかえたんだっけ。
案外、手書きの方が開発しやすいのかな?
57:デフォルトの名無しさん
09/05/05 15:51:13
構文の規模や性質や、頻繁に規則をいじるかどうか、などなどによる。
58:デフォルトの名無しさん
09/05/19 01:30:41
FlashのActionScriptで自作言語を作ろうとして
URLリンク(www.hakkaku.net)
URLリンク(www.hakkaku.net)
を先日から見ているんだが、字句解析の部分がさっぱりわからん。
構文解析のkmyaccの部分は良く分かるんだが、lexにあたる部分を
手書きしているらしく、なんか自力でトークンを探して分割したり
クラスをゴリゴリ作ったりしている。正直ムリポ。
その辺に落ちてるlex/flexで代用したいんだが、どうやればいいんだろう?
もしそれがムチャなことなら、「kmlex」的なものはないだろうか?
59:デフォルトの名無しさん
09/05/19 04:26:19
このレベルがわからないんじゃ
言語なんて作るの無理
60:デフォルトの名無しさん
09/05/19 07:28:20
AS3.0以降はRegExpあるから、自作してもすぐ出来るだろ
61:デフォルトの名無しさん
09/05/19 07:50:10
RegExpで字句解析するの?
62:デフォルトの名無しさん
09/05/19 08:10:18
RegExpで字句解析しないの?
63:デフォルトの名無しさん
09/05/19 08:23:56
な・・・RegExpで字句解析しただと!?
64:デフォルトの名無しさん
09/05/19 09:11:48
パース、構文木生成、式解釈、ニーモニック生成、コード出力をやるだけだ。
慣れたらゼロからでも数日で実装できる。
65:デフォルトの名無しさん
09/05/26 01:25:57
LLVMを勉強したいです
書籍ってありますか?
66:デフォルトの名無しさん
09/05/26 02:14:25
本家のドキュメントがよい。
67:デフォルトの名無しさん
09/05/26 09:20:42
本家にkaleidoscopeっていう処理系を作りながらllvmを憶えるチュートリアルがあるよ。
68:デフォルトの名無しさん
09/05/26 23:32:34
>>61
「文字列の先頭からアルファベットに引き続く、空白までの連続部分のマッチ」に
該当すれば、それを予約語として認識し、文字列からその部分を取り除いて
再度先頭から…を繰り返しているんだろう。
>>62
getChr()で一文字づつ文字を読み込んで、「空白の次にアルファベットだから
このトークンは予約語」というアタリの付けかたをしているんだろう。
69:デフォルトの名無しさん
09/05/28 17:16:46
ドラゴンブック二版の邦訳買ってきたよ。すごい紙薄い。
70:デフォルトの名無しさん
09/05/28 18:16:41
いい紙なのかな。TAOCPみたいな?
71:デフォルトの名無しさん
09/05/29 00:45:48
バラシテスキャンしないと
72:デフォルトの名無しさん
09/05/29 22:22:08
URLリンク(up2.viploader.net)
バーコード邪魔
73:デフォルトの名無しさん
09/05/29 22:49:06
[これはひどい]
絵本とかでバーコードがシールになってて、買ったらはがせるのあるけど、
そうしてほしいところだな。技術書だから無理に決まってるけど。
74:デフォルトの名無しさん
09/05/29 22:53:56
なんか本当に剣と魔法の挿絵になってね?
75:デフォルトの名無しさん
09/05/29 23:01:57
楯が Syntax Directed Translation
剣が LALR Parser Generation
鎧が……読めにゃい
竜が Complexity of Compiler Design かな?
76:デフォルトの名無しさん
09/05/29 23:24:16
拡大
URLリンク(up2.viploader.net)
77:デフォルトの名無しさん
09/05/29 23:32:24
Data Flow Analysis か
78:デフォルトの名無しさん
09/05/30 00:32:32
コンパイラ第2版ってどこ改訂されたの?
79:デフォルトの名無しさん
09/05/30 02:55:37
全面的に
80:デフォルトの名無しさん
09/05/30 03:02:46
読みやすくなってる?
81:デフォルトの名無しさん
09/05/30 16:40:02
>>75
もう画像流れてるわ
第一版と同じで鎧は syntax directed translation じゃなかろうか
default を「省略時解釈」とか、そういうのが無くなってるといいんだが
82:デフォルトの名無しさん
09/05/30 18:24:48
> 第一版と同じで鎧は syntax directed translation じゃなかろうか
それは盾だって>>75に
> default を「省略時解釈」とか、そういうのが無くなってるといいんだが
往年の教科書では定番だったよねそういう訳
83:デフォルトの名無しさん
09/05/30 19:28:33
最近の本は「既定の…」になるの?w
84:デフォルトの名無しさん
09/05/30 21:09:37
ごめん、data flow analysis だな
85:デフォルトの名無しさん
09/06/06 01:03:33
検索でここまで辿り着きました。
宜しくお願いします。
現在、オブジェクト指向のクラスの実装などが、
コンパイラでどのように実現されているのかに興味を持ち、勉強中です。
コンパイラの本も何冊か買い、簡単に目を通しましたが、
殆どが手続き型言語のコンパイラの解説で終わっており、資料の少なさに困っています。
自分で探した範囲で、オブジェクト指向型言語のクラスの実装等に触れられている本は、
『コンパイラの構成と最適化』(朝倉出版)しか見つけることが出来ませんでした。
『コンパイラ―原理・技法・ツール』の第2版版が最近出版されたようなので、
書店で立ち読みをして見ましたが、オブジェクト指向言語に関しては、
余り記述がされていないようです(短時間立ち読みをした程度なので、見落としてるだけなのかもしれませんが…)。
上で記述した以外に、オブジェクト指向言語の具体的な実装について書かれたコンパイラ等の書籍などがご存知の方がいらっしゃいましたら、本の題名等をご教示頂けると幸いです。
86:デフォルトの名無しさん
09/06/06 01:21:19
なぜそんなにオブジェクト指向にこだわるのか理由がよく分からないな。
まあ、単純にオブジェクト指向を特徴としている言語の実装が知りたいなら、
ソースコードを入手して眺めるのが一番早いだろう。
RubyやPythonなんかでどうだ?
87:デフォルトの名無しさん
09/06/06 01:24:05
>>85
gcc読んでここでその成果全部書けよ
そしたら教えてやるから
88:デフォルトの名無しさん
09/06/06 01:40:21
>>85
"Rubyソースコード完全解説"
89:デフォルトの名無しさん
09/06/06 01:43:11
『いまどきのプログラミング言語の作り方』に、ちょっとだけ載ってたかなあ
90:デフォルトの名無しさん
09/06/06 03:16:32
>>86
OOPにこだわる切欠は、自分で作ったCのプログラムを逆アセンブルして、アセンブリ言語の勉強をしていた時、JavaなどのOOP言語では、どのようにソースコードがバイトコードなどに置き換えられ、クラス等がどの様に実装されているのかに興味を惹かれたためです。
PythonやRudyに関しては、恥ずかしながら名前しか知りませんでした。
ソースコードもダウンロードしてみました。
再度の質問になり恐縮ですが、これはコンパイラのソースコードではないかと考えていますが、その様な理解で良いのでしょうか?
どちらにせよ、自分の勉強不足は明らかなので御指摘を元に、勉強してみます。
アドバイスをありがとう御座います。
>>87
まだ勉強を始めたばかりで、恥ずかしながらgccについては、知りませんでした。
gccについて、これから勉強してみたいと思います。
>>88
検索して見つけることが出来ました。
Amazonで買おうかとも思いましたが、プレミアが付いているようで、とても高いですね。
Webで本文が見られるみたいなので、それを見させていただきます。
ご教示ありがとうございます。
>>89
Amazonでも今は取り扱っていないようですね。
評判の良い本のようなので、購入を検討してみます。
ありがとうございました
91:デフォルトの名無しさん
09/06/06 03:31:26
>>90
RubyやPythonは、オブジェクト指向のスクリプト言語だ。
現代のスクリプト言語はいったんバイトコードにコンパイルされてから実行される形式が一般的で、
従ってコンパイラと呼びうるすべての要素がソースコード内に含まれている。
そしてそこから先(バイトコードをどのように動かすかの仮想マシンの実装)もあるわけだ。
いい教材になるわけで。
92:90
09/06/06 10:21:50
>>91
そうなんですか。
その事については、知りませんでした。
コンパイラの動作をソースコードを読むことで確認出来るというのは、
私のように学習を目的としている者にはありがたい話です。
Rudyは書籍やWebでの資料が充実しているようなので、これから調べてみます。
ご教示、ありがとう御座いました。
93:デフォルトの名無しさん
09/06/06 11:25:22
>>92
Rubyソースコード完全解説という神書籍があってだな、絶版だが、初版が無料公開されているのでオススメ
Rubyソースコード完全解説
URLリンク(i.loveruby.net)
94:デフォルトの名無しさん
09/06/07 19:53:04
>>90
参考までに、Javaのバイトコード仕様はSunのサイトで閲覧できる (英語)。
SunのJDKに付属しているjavapとかで逆アセンブルできるよ。
他にEclipse用のプラグイン「Bytecode Outline plugin for Eclipse」とかでも。
Eclipse用だと「Classfile Inspector」(有料 99Euro)ってのもあったけど、いまググったら
サイトが消滅したようだ。
95:デフォルトの名無しさん
09/06/08 07:45:39
速攻MinCamlコンパイラ概説
URLリンク(min-caml.sourceforge.net)
96:デフォルトの名無しさん
09/06/08 10:54:28
>>85
英語は読めますか?
97:デフォルトの名無しさん
09/06/08 11:07:20
あんまり道を示しすぎてもパンクすると思うんだが。
85とは関係なしに紹介したいサイトがあるなら、俺が消化するから構わず続けてくれ。
98:デフォルトの名無しさん
09/06/08 11:54:40
URLリンク(www.amazon.com)
URLリンク(www.amazon.com)
この辺りの概説書にはOOの実装のこと"も"解説してる。
URLリンク(www.amazon.com)
はOO関連のコンセプトの整理がうまい。実装についても書いてある。
全般的な概説書はやはり記述がプアになるので、C++に限れば一番詳しいのは、訳書の
URLリンク(www.amazon.co.jp)
これだけど、今は絶版なので、
URLリンク(www.amazon.com)
原書を読めばいい。
ARM(注解 C++リファレンスマニュアル)も詳しく説明している。これも絶版なので、
URLリンク(www.amazon.com)
Objectのslot accessでC++と全く異なるアプローチで有名なのが、
URLリンク(code.google.com)
Selfの元の論文が、
URLリンク(research.sun.com)
にある。JITと相性がよい。
もちろんaccessが遅くていいなら他にも幾らでもやりかたはある。
Objective-Cなんかはhash引いている。
99:デフォルトの名無しさん
09/06/08 13:07:35
普段はレキサ・パーサレベルの話しか出ないのに、堰を切ったようにいろいろ出てくるな
実はみんな、教えることに飢えてたのか?
100:デフォルトの名無しさん
09/06/08 19:40:03
lexerかparserより先に進んだ質問者がなかなかいないからじゃないかな
101:デフォルトの名無しさん
09/06/08 23:19:24
じゃあ俺がお前らの意見を聞いて
万人が理解できるlexerとparserの
サンプル書いてやる
ということでまず何をすればいいぉ?
102:デフォルトの名無しさん
09/06/09 00:00:12
文法決めれ
103:デフォルトの名無しさん
09/06/09 00:09:06
>>101
かっこに対応した四則演算とかどうだ
104:デフォルトの名無しさん
09/06/09 19:58:23
四則演算はネット上にゴロゴロしてるからイラネ
105:デフォルトの名無しさん
09/06/09 20:18:37
forループとif-else-endifの構文サンプル
106:90
09/06/09 22:05:49
>>93
教えて頂いて、ありがとう御座います。
絶版の資料が無料で公開されているのは、ありがたいですね。
>>94
Javaのバイトコードにも、興味があります。
Java仮想マシン仕様は、日本語の書籍でも出版されているので、今度読むつもりでした。
仮想マシンの概念は、コンピュータのアーキテクチャとも密接に関わってくる事項なので、興味深いですね。
>>96
正直、英語はまともには読めません。
日本語の資料で勉強するのに限界を感じているので、
英語の勉強をやり直そうと思ってます。
>>98
今まで知らなかった資料が多いので、参考になります。
英語の資料が多いですね。
コンパイラの勉強の前に、英語をやり直して、
資料をまともに読めるようになってから、勉強をし直すべきかもしれません。
コンパイラの勉強は、思っていたよりもしんどそうですが、
今まで知らなかった資料を紹介していただいたので、今後の勉強の指針が見えた気がします。
教えていただいた資料を参考に、頑張ってみます。
107:デフォルトの名無しさん
09/06/09 22:28:05
>>105
それだッッッ
ブロックの扱いがどうやればいいのか
悩みまくっている俺にはおいしいです ^q^
^
108:デフォルトの名無しさん
09/06/09 22:57:09
>>101 lexer parser 何てどうとでもなるから
cps とか ssa あたりの内部表現の評価手法を,
最適化方法に合わせた一覧として提示してくれ
109:デフォルトの名無しさん
09/06/10 00:05:45
>>108
どうとでもならない人のための相談室スレだと思うんだ。
だから、出来る人は我慢して、ここはレベルを下げて欲しいんだ。
110:デフォルトの名無しさん
09/06/10 00:11:32
平行すりゃいいじゃん
誰か一人のためのスレってわけでもないんだし。
111:デフォルトの名無しさん
09/06/10 00:32:56
>>108
オレは専門家じゃないのでCPSもSSAもどちらの用語も知らなかったが、
これってLLVMで全部実装されてるんじゃね?
やはりLLVMの包括的な解説記事が欲しいところだな。
112:デフォルトの名無しさん
09/06/10 00:43:18
>>107
Pascalのone pass compiler読め。
URLリンク(homepages.cwi.nl)
113:デフォルトの名無しさん
09/06/10 01:19:43
>>111
LLVMは既に提出されているものをうまくつなぎ合わせてるだけ
つなぎ合わせ方法はいくらでもある
各要素項目を網羅的に解説したものがほしい
つか、現場にいるとそっち系をゆっくり、みてる暇がない
114:デフォルトの名無しさん
09/06/10 01:43:17
>>113
実務者としては、実装されてない方法より
既に実装されているものの解説のほうが遥かに役に立つ。
>各要素項目を網羅的に解説したものがほしい
この分野に詳しくないので外野の意見だが、それなら洋書を漁って読めばいいんじゃね?
115:デフォルトの名無しさん
09/06/10 01:45:38
>>108
Tiger Bookや"Practical Improvements to the Construction
and Destruction of Static Single Assignment Form."は読んだの?
116:デフォルトの名無しさん
09/06/10 01:48:23
>>114
> 実務者としては、実装されてない方法より
> 既に実装されているものの解説のほうが遥かに役に立つ。
ぶっちゃけここで質問している人が、
現実に使われているコンパイラのソースを参考にして、
自分のコードに反映させるのは難しいと思う。
そのくらいコンパイラは複雑化している。
さらに学習用のコンパイラは関数型言語で書かれているものが多く、
実務指向の人とは相容れないものがあるだろう。
謙虚な気持ちで学習するのが一番。
117:デフォルトの名無しさん
09/06/10 02:21:44
>>114
> 実務者としては、実装されてない方法より
> 既に実装されているものの解説のほうが遥かに役に立つ。
要素手法が見えにくいんだよね。まとまってしまうと。
ましてや、cps とか ssa 使った状態での複合リダクションとなると。
> この分野に詳しくないので外野の意見だが、それなら洋書を漁って読めばいいんじゃね?
そりゃたくさん持ってるさ
ただ、現場をかかえてるとそっちばっかやってるわけに行かなくなるんだよな
>>116
> さらに学習用のコンパイラは関数型言語で書かれているものが多く、
> 実務指向の人とは相容れないものがあるだろう。
それは気にならないんだけど、細切れの論文掻き集めて整理やり直す時間はとれねぇよ
118:デフォルトの名無しさん
09/06/10 11:16:43
実務指向でコンパイラを今時つくりたい、なんて人はいないと思う
スクリプトでDSLをさっくり組むならともかく
119:デフォルトの名無しさん
09/06/13 19:19:12
>>90
URLリンク(www.amazon.co.jp)コンパイラとバーチャルマシン-Text-今城-哲二/dp/4274133087
↑この本に、オブジェクト指向も例外処理も分かりやすく載ってるよ。
薄くてすぐに読めるし、お薦め。
ただ、日本語で概要が載っているだけなので、
実装するには自分で知恵を絞らないとだけど。
現代的なコンパイラは、内部で何度も変換を繰り返して、
最終的に実行可能なコードをはく。
オブジェクト指向の場合は、最初の方で非オブジェクト指向の
Cみたいなコード (AST) に変換してしまうと、
後はよく書籍に載っているような方法が使えていいと思う。
コンパイラを全部 (シンタックスシュガーの除去から
アセンブラの出力まで) 自作するのは、大規模過ぎて現実的じゃない。
だから、自分が関心を持っている部分以外は
なるべく既存のものを利用するといいと思う。
例えばCのコードを書きだすコンパイラを書けば、
アセンブラごとにジェネレータを自分で書かなくても
多くの環境で動くし、最適化もCコンパイラに頼める。
例外処理などはCでは実装しにくいので、
必要ならLLVM IRを出力するという方法もあるよ。
120:デフォルトの名無しさん
09/06/13 19:25:19
>>118
「実務」の中身によるんじゃないかな?
121:119
09/06/13 19:32:59
以前、Javaバイトコードに変換するコンパイラも書いたことがあるけど、
Javaだと「.class」ファイルはクラス単位でオブジェクト指向になっていて、
オブジェクト指向「からの」変換はJVMが担当している。
だから、バイトコードの仕様を読んでも、あまり参考にはならないと思う。
同じ理由で、JVMをターゲットにした (「.class」ファイルを生成する)
コンパイラも皆、参考にならないと思う。
122:デフォルトの名無しさん
09/06/13 20:10:29
リンゴの本見ればコンパイラなんて3日で書けるだろ
123:デフォルトの名無しさん
09/06/15 10:39:22
>>121
最近はclassファイルを扱うためのライブラリがたくさんあるよ。
124:デフォルトの名無しさん
09/06/15 11:15:34
>>121 が言ってるのは、Java のオブジェクト指向的な面
(動的バインディングとか)が実現されてるのは、Java VM自体
なので(invokevirtual命令とか)、オブジェクト指向言語を
ふつうのCPU上で実現するコンパイラの参考にはならん、と
いうこと。
125:デフォルトの名無しさん
09/06/16 21:52:36
ドラゴンブック超える神本の出版が確定!
プログラミング言語を作る
プログラミング言語を作るなんて究極の楽しみだ!
126:デフォルトの名無しさん
09/06/17 09:50:36
>>125
著者の「プログラミング言語を作る」のサイトはぐだぐだ進行な上に
今ブログをチェックしてみたら最新エントリがエロゲの話で
しかもトンデモ理論だったので失笑せざるを得なかった
立ち読みはしてみるつもりだけど、はずれじゃないかなぁ
127:デフォルトの名無しさん
09/06/17 10:18:52
前橋さんが言語本出すのか。
まあ、変なものにはならないでしょ。
128:デフォルトの名無しさん
09/06/17 18:57:40
>>125
作者乙
129:デフォルトの名無しさん
09/06/17 20:24:01
>>128
あの人の作る言語は神レベルの美しさだぞ
お前こそ何言ってるんだw?
130:デフォルトの名無しさん
09/06/17 20:26:33
>>129
どの人??
131:デフォルトの名無しさん
09/06/18 08:43:47
>>125 >>129 は信者だろうな。
ポインタ本とか、Java謎本とか、結構悪くなかったと思うけど、今回もそういう
他に類例のないところを押さえる趣向かねぇ。
ドラゴンブックに代わる、なんてことはないないw
132:デフォルトの名無しさん
09/06/18 09:01:10
>ドラゴンブックに代わる、なんてことはないないw
学術書と実用系趣味本を一緒にすること自体おかしいよね
133:デフォルトの名無しさん
09/06/18 09:59:07
ドラゴンブック買ったけど、全然役に立たなかった。オナニー書籍
りんご本のほうがよほど役に立ったわ
というくらい
134:デフォルトの名無しさん
09/06/18 10:21:41
>>133
具体的に書かれてないと、単に難しいことが理解できなかった可哀想な趣味グラマにしか見えないな
135:デフォルトの名無しさん
09/06/18 10:50:14
ドラゴンブック喧嘩せず
136:デフォルトの名無しさん
09/06/18 12:07:40
ドラゴンブックは、
字句解析、構文解析はツールを使うから詳しくなる気はないし、
構文解析向けの言語理論にも興味ないって人にはまったく不向き。
構文解析ツール作ってみたいなって人、
計算機科学科の学生には今でもいい本の一つ。
137:デフォルトの名無しさん
09/06/18 14:08:10
そこから先のバックエンドについても、高度な話の基本になるところを
押さえてあるからね。
138:デフォルトの名無しさん
09/06/18 16:24:11
>>136
「内容に興味のない人には不向き」っていうことですねわかります
139:デフォルトの名無しさん
09/06/18 16:44:12
>>138
当たり前の事ではないか
140:デフォルトの名無しさん
09/06/18 17:41:11
特定書籍の信者って面白いね。
反撃が全部「ぼくは君をこういうキャラに設定したぞ。どうだ悔しいだろう」だし。
141:デフォルトの名無しさん
09/06/18 17:45:52
>>140
具体的に書かれてないと、単に難しいことが理解できなかった可哀想な趣味グラマにしか見えないな
142:デフォルトの名無しさん
09/06/18 20:23:54
>>140
構文が曖昧です。君からキャラへの変換は明示的なキャストが必要です。
143:デフォルトの名無しさん
09/06/18 22:43:48
coinsの利用についてはどうよ?
COINSコンパイラ・インフラストラクチャ
URLリンク(www.coins-project.org)
144:デフォルトの名無しさん
09/06/18 22:52:47
coinsは最凶最悪
145:デフォルトの名無しさん
09/06/19 00:01:52
>>139
いやだから、内容に興味があるのは”前提”として、
その人たちにとって良い本かを議論しないと意味ないじゃんという話
まぁ全体的にいい本っていう論調だし俺も同意するが
146:デフォルトの名無しさん
09/06/19 00:06:19
まずドラゴンブック読めない奴はゴミ
これ世界の常識あるね
147:デフォルトの名無しさん
09/06/19 06:51:19
このスレで勧められ板から、ドラゴンブックせっかく奮発して買ったのに、
いきなりしょっぱなからはじめから変な数式ばっかでいやになった…。
論文とかたまに見るけど、どうして人にわかるように書かないんだろうか?
大学行ってたら、小学生でもわかるように、って習わなかったんだろうか?
148:デフォルトの名無しさん
09/06/19 07:24:21
小学生でもわかるように書くと厚さと著作にかかる時間とが値段が10倍になりますがよろしいか。
149:デフォルトの名無しさん
09/06/19 07:26:33
>>147
え?あの程度の数式読めないの?
何それこわい
150:デフォルトの名無しさん
09/06/19 07:28:12
10倍じゃ全然きかないか
151:デフォルトの名無しさん
09/06/19 07:36:55
>>147
貴様は人間の屑だ
152:デフォルトの名無しさん
09/06/19 08:23:43
>>147
ただ単に読むのが早すぎただけでしょ。積読して、適正になったらまた読む
153:デフォルトの名無しさん
09/06/19 10:09:04
小学生でもわかるように、ってのは 無 理 。
大学の教科書で、小学生でもわかるように書いてあるものなど皆無です。
高校生で奮発して読もうと思っているなら、学校の先生にでも相談しなさい。
多分集合の記号とか論理式とかでつまづいてるんじゃないかと思うんだけど。
154:デフォルトの名無しさん
09/06/19 23:36:05
先に簡単なの何冊か読めばいいのに
155:デフォルトの名無しさん
09/06/20 00:00:30
ドラゴンブックが一番簡単
これも読めないゆとりは来るな
156:デフォルトの名無しさん
09/06/20 00:07:00
ドラゴンブック読まなくてもコンパイラ作れるけどね
157:デフォルトの名無しさん
09/06/20 00:13:25
読まないと読めないは違う
158:デフォルトの名無しさん
09/06/23 16:33:02
数年前、文系の見方で書いたとかいうコンパイラの本ってあったよね
日本のコンパイラの第一人者が監修になってたから、わりと買った人多い?
たとえ話がぜんぜん例えになってなくて大混乱
巻末のJavaで書いたコンパイラのプログラムはほとんどCからの丸写しみたいなつくりだった。
159:デフォルトの名無しさん
09/06/23 16:38:45
上のほうですでに出てたかw
160:デフォルトの名無しさん
09/06/23 17:15:05
むしろ、ドラゴンブックは、それさえ読めれば、相当なコンパイラが書ける本だろ。
確かLSI-Cの作者がそう言ってたと中村正三郎か誰かが書いていた記憶がある。
161:デフォルトの名無しさん
09/06/23 17:27:01
コンパイラを書けるくらいの人なら読める
162:デフォルトの名無しさん
09/06/23 17:45:10
>>160
「ドラゴンブックを読めば誰でもLSI-Cぐらいのコンパイラは書ける」だなw
163:デフォルトの名無しさん
09/06/23 19:39:56
LSI-Cのひとはyacc互換のコンパイラコンパイラも作っていましたよね。
「ドラゴンブック読めば誰でもコンパイラコンパイラは書ける」なの?
164:デフォルトの名無しさん
09/06/23 19:57:12
スクリプトエンジンプログラミング 買ってきた。半分くらい読んだとこ。
なんか書いてみたいなレベルの自分にとっては、ぴったりのイメージ
なんだが、この本あんまり話題に上らないね・・・
C++出来ない自分にゃ読み替えるのが大変w
javaVM向けの中間言語を吐くやつのサンプルとかがあると、最高
だったんだけど。
165:デフォルトの名無しさん
09/06/23 20:40:34
>>162
LSI-Cは1980年代始めから中頃までが全盛期だと思うが、
当時最高の最適化を行なう最強コンパイラですよ。
作者はデータフロー解析、レジスタカラーリングは、
原論文をバリバリ読んでいた人だと思う。
かなりの腕前の人。
166:デフォルトの名無しさん
09/06/23 21:33:02
>>165
いやいや、>>162は作者がそう言ったので
中村正三郎か誰かがしょんぼり、という話w
167:デフォルトの名無しさん
09/06/23 22:14:46
>>164
ちょっと薄い本だけど、日立の人が書いた、Javaのバイトコード
を吐くコンパイラがサンプルで載ってる本あったね。
って調べたらあった↓
URLリンク(www.amazon.co.jp)
168:デフォルトの名無しさん
09/06/23 23:13:16
>>167
著者の最初に名前上がってる人、コボラーだね。
169:デフォルトの名無しさん
09/06/23 23:15:27
まじかよw
興味あったけど買うのよしたw
170:デフォルトの名無しさん
09/06/23 23:19:24
作者じゃないが。最近発売された「プログラミング言語を作る 」がインタープリタ
もバイトコードコンパイラのソースも載ってるぞ。買って読んでないから内容は
知らんが。
171:デフォルトの名無しさん
09/06/23 23:20:09
MiniCamlで良いじゃん。
172:デフォルトの名無しさん
09/06/24 00:34:54
スレ住人に聞くけどJIT関係の最適化に関するプロファイリングネタはここでいいのかな?
173:デフォルトの名無しさん
09/06/24 04:30:55
さっきJavaで書かれた独自形式の中間言語を出力する
コンパイラが欲しいと書いてる人がいたが、
よくよく考えてみると、.NETやJavaなどのそれ自体が
中間言語でかかれててJITコンパイラまで付いてる環境では、
下手に独自で作るよりもその環境の中間言語を出力してしまう、
要するにコンパイラそのものを作ってしまったほうが簡単なんだよな。
中間言語の書式や(基本的に)仮想マシンの仕様を考えなくて済む。
だからJavaにおけるGroovy、.NETにおけるIronPythonなど、
中身はインタプリタというよりもコンパイラそのものだ。
174:デフォルトの名無しさん
09/06/24 05:51:31
そこでLLVMやCOINSが出てくるわけだ。
175:デフォルトの名無しさん
09/06/24 07:32:42
プログラミング言語を作るは神本
ドラゴンブック不要といわれる理由がよくわかる
読んでみろ
176:デフォルトの名無しさん
09/06/24 07:41:40
はい。
177:デフォルトの名無しさん
09/06/24 08:03:25
はいじゃないが。
178:デフォルトの名無しさん
09/06/24 10:29:52
>>170,175
信者か作者かしらんがいい加減うざい
179:デフォルトの名無しさん
09/06/24 11:43:34
そう思わせるのが目的のアンチかもよ
180:デフォルトの名無しさん
09/06/24 22:29:32
プログラミング言語を作る
買って読んでみたぞ
普通の本だろこれ
金返せよ
181:デフォルトの名無しさん
09/06/24 22:40:43
え?俺の本からは神様が出てきたぞ?正に神本だと思ったw
182:デフォルトの名無しさん
09/06/24 23:16:58
>>181
作者乙
183:デフォルトの名無しさん
09/06/24 23:20:30
間違えた、紙だったw
>>182
偽エスパー乙
184:デフォルトの名無しさん
09/06/24 23:25:07
無理に面白いこと言おうとしなくてもいいよ
185:デフォルトの名無しさん
09/06/25 07:31:29
ドラゴンブック持ってないのに
コンパイラの本書いてるやついるけど
あいつは何なの?
186:デフォルトの名無しさん
09/06/25 07:35:37
分かりません。
187:デフォルトの名無しさん
09/06/25 14:13:43
>>169
いや、コボラーはコボラーでもIBMの奴隷って意味のコボラーじゃないからw
188:デフォルトの名無しさん
09/06/27 23:40:48
>>160
確か、LSI-Cの作者がそれしか読んでないとかいってただけだと思う。
万人に当てはまるわけではない と
189:デフォルトの名無しさん
09/06/28 00:30:24
大昔の話じゃいろいろ説明をつけないと通じないんだなあ……
というかその大昔の時点で意味わかってなかったのか?
LSI-Cの最適化は凄いとよく言われたが
詰めが甘くて実際には骨折り損だという話もあったよ
コンパイル時間はMS-Cの倍だったしね
190:デフォルトの名無しさん
09/06/28 01:40:22
>>189
8080版の最適化の話だろすごかったの
191:デフォルトの名無しさん
09/06/28 07:18:31
LSI-C(笑)
192:デフォルトの名無しさん
09/06/28 07:19:14
4004(笑)
193:デフォルトの名無しさん
09/06/28 09:20:58
>>189
知りもしないことをよくもまあ
194:デフォルトの名無しさん
09/06/28 11:56:45
知ってる人だけ。。。
MSX-Cは変数が自動でレジスタに割り当てられるんだけど、
そうなるとポインタを介したアクセスと一貫性がなくなる。
195:デフォルトの名無しさん
09/06/28 12:01:02
MSX-C = LSI-C
196:デフォルトの名無しさん
09/06/28 21:23:22
>>194
変数のポインタを取り出せばメモリ上に確保しなおしてたよ
それともループ内に持ち込んだ変数を割り込み処理で外部から変更した時に関与が出ないって意味で言ってる?
197:デフォルトの名無しさん
09/06/28 21:59:34
#include <stdio.h>
#pragma nonrec
main()
{
int n;
int *p;
p = &n;
n = 10;
*p = 100;
printf("n = %d\n", n);
}
MSX-C のマニュアルに載ってたサンプル。
これで「n = 10」と表示されるそうな。
198:デフォルトの名無しさん
09/06/28 23:10:50
なんじゃこりゃ。
これが仕様なの?
199:デフォルトの名無しさん
09/06/28 23:30:24
往年の8ビットマイコン用Cコンパイラの#pragmaか
コード書く人もコンパイラの振る舞いにあわせて組んでたんだね
200:デフォルトの名無しさん
09/06/28 23:40:43
逆だろ。
pragmaはコンパイルの動作を指定するためにある。
201:デフォルトの名無しさん
09/06/29 00:14:16
MSX-CでC言語を勉強したんだけど、これによくはまった。
レジスタに割り当てないこともできるけど。
#pragma nonrecはローカル変数をstaticがついているかのようにする。
non-recursiveの略。CPUの制限でスタック上の変数にアクセスするのが
遅いからです。コードの再利用のことを考えてのことだと思う。
あとMSX-Cはlongと浮動小数点数がないんです。
#ifもない。if文で代用とマニュアルにありました。実行されないコードは
生成されない。
なにかの役に立つかな?
202:デフォルトの名無しさん
09/06/29 00:17:14
#pragma有効で組むか
さもなくば死か
この時代にCを開発用途に使えたという時点である意味幸運だったとも言える
203:デフォルトの名無しさん
09/06/29 12:13:13
8080でのスタックフレームってめんどくさいよな
204:デフォルトの名無しさん
09/06/29 23:59:31
高級言語を意識して設計されてないから仕方ない
Z80だとIX/IYで強引にやるのか?汎用/裏レジスタで最適化とかしてたら凄いが
205:デフォルトの名無しさん
09/06/30 00:51:28
IX/IYは人間向きのレジスタで、
便利ではあるけど遅いからコンパイラは使わない。
(HD64180あたりになると結構速かったが)
LSI-C(MSX-C)はもちろん裏レジスタ使いまくり。
206:デフォルトの名無しさん
09/06/30 22:30:31
むかし見たLSI-C80の広告ではIXかIYをフレームポインタに使っていた
コードが掲載されていた。
MSX-Cは裏レジスタ,IX,IYを使うコードは生成しなかったと思う。
付属のライブラリでは使っているかもしれませんが。
スタック上のローカル変数アクセスの方法はどうだったか記憶にありません。
MSX-Cのアセンブリ言語出力をZ80に最適化するプログラムを書いた人もいるようです。
僕も出力を見ていたときすこし考えたことありました。
アセンブリ言語レベルで8080から8086に変換するプログラムの存在を古い本で読んだのも思い出しました。
207:デフォルトの名無しさん
09/06/30 23:41:00
コンパイラが将来性のない
回顧主義者おっさんのたまり場であることがよくわかる
だから日本は研究でも実業でもこの分野でチョン以下になる。
208:デフォルトの名無しさん
09/06/30 23:51:29
>>207
そんな愚にも付かないことを言ってるヒマがあったら、
LLVM向けに何かメジャーな言語を移植するのだ。
209:デフォルトの名無しさん
09/07/01 00:01:25
LLVMは糞だろ
210:デフォルトの名無しさん
09/07/01 00:22:10
>>209
どこがどう糞なの?
211:デフォルトの名無しさん
09/07/01 23:55:53
>>210
Milepost GCCがあるから不要
自分でコードをチューニングするという古臭い時代は終わったの
自動的に学習して最適なコードを出力してくれるからLLVM自体不要なの
212:デフォルトの名無しさん
09/07/02 00:01:16
幼稚園児かw
213:デフォルトの名無しさん
09/07/02 00:15:27
>>211
というか、同じようなアイデアのllvm-gccのほうが有名なわけだが?
214:デフォルトの名無しさん
09/07/02 00:20:21
>>211
完全自動化だし、今年後半のコンパイラ関係の
賞総なめにするって言われてるけどねぇ
EUレベルの国家プロジェクトと田舎大学の糞プロジェクト
比較されてもねぇ
215:デフォルトの名無しさん
09/07/02 00:23:40
幼稚園児だな
216:デフォルトの名無しさん
09/07/03 07:15:50
ヒント:実績
217:デフォルトの名無しさん
09/07/03 17:26:47
Milepost GCCのICIな人たちが次はLLVMでやってみるって言ってんですがねえ…
218:デフォルトの名無しさん
09/07/03 18:29:02
基地外は相手にするなよ
219:デフォルトの名無しさん
09/07/03 21:43:00
>>217
妄想乙
220:デフォルトの名無しさん
09/07/04 00:33:17
>>219
君がろくに論文も読んでないのが良く分かりました。
221:デフォルトの名無しさん
09/07/05 14:42:00
このスレふつうのコンパイラをつくろうを
宣伝したやつフルボッコにするからな
222:デフォルトの名無しさん
09/07/05 15:27:47
まず>>221が・・・
223:デフォルトの名無しさん
09/07/05 15:45:49
>>221
>>221
>>221
224:デフォルトの名無しさん
09/07/05 15:59:24
>>221
>>221
>>221
>>221
>>221
>>221
225:デフォルトの名無しさん
09/07/05 19:14:05
著者の関係者なのか?
226:デフォルトの名無しさん
09/07/05 22:26:25
8080でLLVM実装まだ?
227:デフォルトの名無しさん
09/07/06 17:28:44
ゼッパチでよければ
228:デフォルトの名無しさん
09/07/07 16:05:46
x86用のコードを吐くCコンパイラの、64bit整数(long long)まわりを読んでいます。
addl $1,%eax
adcl $0,%eax
みたいな簡単なものは理解できたのですが、シフト演算や乗算・除算になると
追い方が悪いのか理解力が弱いのかさえ分からなくなってきました。
この手のことを解説したサイトって無いのでしょうか。
229:デフォルトの名無しさん
09/07/07 17:55:56
>>228
たぶん自分で調べたほうが早い。
最適化をかけないデバッグビルドで、
演算させるたびに何か関数(printf)でも呼び出す形にするといいよ。
230:デフォルトの名無しさん
09/07/07 18:16:51
デバッガ知らないの?gdb?
231:デフォルトの名無しさん
09/07/07 18:21:05
前提知識であるx86のアセンブリの知識はあるの?
232:デフォルトの名無しさん
09/07/08 01:09:36
$(GCC)/gcc/longlong.h
まじお勧め
233:デフォルトの名無しさん
09/07/08 06:52:57
>>229
そうですか。急がば回れってことなんでしょうか。
おれ、このリーディングが終わったらまとめ書くんだ。
>>230
acid
使い方が分からないので、スタックトレースにしか使ってません。
>>231
数年前に、はじめて読む8086を流し読みした程度の知識です。
分からない命令はインテルのpdf引きながら読んでいます。
>>232
URLリンク(www.opensource.apple.com)
mullを1回で、(long)*(long)はできるのですね。おもしろい。
234:デフォルトの名無しさん
09/07/08 09:10:38
>>230
gcc使う人はたいていデバッガ使わないでしょ。
デバッガに頼り切ってるのはVS厨が多い。
235:デフォルトの名無しさん
09/07/08 09:36:37
> gcc使う人はたいていデバッガ使わないでしょ。
そういう人って
デバッグがデバッガに頼り切りではないという面もあるにしろ
デバッガを使いこなせてないという面もあるんじゃないかな。
236:デフォルトの名無しさん
09/07/08 09:59:40
>>234
それは偏見。
組み込みLinux開発ではgdbくらい使いこなせないとお話になりません。
237:デフォルトの名無しさん
09/07/08 17:28:59
>>236
それは偏見。
組み込みLinux開発ではgdb使ってるようではお話になりません。
238:デフォルトの名無しさん
09/07/08 17:31:41
gdbは使いこなせるけど使ってないケースもあるわけで
239:デフォルトの名無しさん
09/07/08 17:35:33
printfの方が高機能なわけで
240:デフォルトの名無しさん
09/07/08 17:56:46
Caper良さそうなのですが字句解析(Lexar)には
何を使うのがいいでしょうか?
おすすめを教えてください。
241:デフォルトの名無しさん
09/07/08 18:34:20
Caper良さそうなのですが字句解析(Lexar)には
何を使うのがいいでしょうか?
おすすめを教えてください。
242:デフォルトの名無しさん
09/07/08 18:53:24
手書きでOK
243:デフォルトの名無しさん
09/07/08 19:48:27
手書きでいいと思う
文字列→数値のパースみたいなランタイムの処理に流用しやすいし
244:デフォルトの名無しさん
09/07/08 23:21:38
本気で速度気にするならflex出力を手修正とかがいいんじゃないか
245:デフォルトの名無しさん
09/07/09 01:22:53
アセンブリから機械語にどうやって変換しているんですか?
246:デフォルトの名無しさん
09/07/09 01:54:23
まずOPコードを暗記するんだ
相対アドレスも数をこなせば暗算できるようになる
247:デフォルトの名無しさん
09/07/09 09:40:02
>>245
アセンブラを使う。
gccに-vオプションつけてみな。
248:デフォルトの名無しさん
09/07/09 09:50:38
>>241
Caperはgcc+Perlで開発されているので字句解析にはPerlを使うと馴染みやすい。
Linuxには必要なものがすべて揃っている。
249:デフォルトの名無しさん
09/07/09 10:10:50
>>247
あなたの作っているコンパイラに対してアセンブラは自前ですか?
250:デフォルトの名無しさん
09/07/09 10:16:58
母国語でおk
251:デフォルトの名無しさん
09/07/09 16:11:15
アセンブラどころかリンカもローダも自作したが
最初は使えるものを使って、徐々に置き換えていけばいいんじゃない
252:デフォルトの名無しさん
09/07/21 23:01:50
Richard Bornatのコンパイラの本でお勧めですか?
253:デフォルトの名無しさん
09/07/21 23:26:02
日本語でおk
254:デフォルトの名無しさん
09/07/24 21:58:11
やさしいコンパイラ(デコイ本)はやめたほうがいい
ふつうの方は神本確定の出来だった
255:デフォルトの名無しさん
09/07/25 00:56:59
やさしいコンパイラ貶して
ふつうの方宣伝してる人は
まったく具体的な指摘がないんだよな
256:デフォルトの名無しさん
09/07/25 01:09:34
と、ここぞとばかりに架空の傾向を持ち出すわけですね。
257:デフォルトの名無しさん
09/07/25 09:32:51
ふつうのコンパイラ良書なんでしょうか
学生なのでちょっと資金余裕がなくて
258:デフォルトの名無しさん
09/07/25 09:38:48
研究室で買ってもらえばいい。あるいは図書館。
259:デフォルトの名無しさん
09/07/26 02:01:07
mingw-jpの使い方まったくわからないので
どなたか教えてもらいたいのですが
260:デフォルトの名無しさん
09/07/26 17:17:33
言語ワークベンチは究極的には完全にプログラミング方法を変えるかもしれない
URLリンク(www.infoq.com)
261:デフォルトの名無しさん
09/07/26 17:40:02
>>260 なんかスタイルシートが効いてなくて生々しいレイアウトになってない?
262:デフォルトの名無しさん
09/07/26 17:57:19
>>261
今見たが、特に問題ないぞ。
263:デフォルトの名無しさん
09/07/27 11:25:26
>>261
うちの環境だとこうなってる
IE6 ちゃんと出る
FireFox スタイルシートが効かない
Google Chrome スタイルシートが効かない上に画像も表示されない
264:263
09/07/27 11:30:13
今見たら直ってました。
265:261
09/07/27 12:19:46
うーん。うちのFirefoxだと変わらずだな。
エラーコンソールになんか出てるけど、それが原因を示してるのかわからん...
266:デフォルトの名無しさん
09/07/27 13:05:55
>>265
リロードしたらOKになったよ、うちのFX
267:デフォルトの名無しさん
09/07/27 14:00:29
うちもFirefoxだと一度目はスタイルシート読み込まれないな
まぁスレには関係ない話題だが
268:デフォルトの名無しさん
09/07/28 14:39:17
>>260
どっちかというと設計よりの話だね。
269:デフォルトの名無しさん
09/08/01 04:41:50
.NET周りで使えるもの、という条件だが。
・Lexical analyzer and parser generator
単純だがよくできている。構文木を食わせてソースコードを吐かせるBison式。
最初これで作りかけていたが、パーサーを構築できてもそのパーサーが予定の挙動をしない場合、デバッグの方法が困難。
(テーブルに分解されてしまうため、ソースが追いかけられない)
パーサーの動作は高速と思われる。
・Irony
パース、構文木構築までをやってくれるコンパイラを動的に構築してくれる。
簡単なGUIのパーサーチェッカーが付いていて、開発がかなり楽
(すごい楽かはもっと楽なものがあるのかどうか知らないので……)
動的に構築する分lapgより遅いかもしれないが、とりあえず自分の目的にはこれで十分なので。
ただ、コンパイル済みコードを吐かすために自分用の構文木を
もう一度作り直す羽目になるのは激しくビミョー……。
(別にそのまま構文木を消化していったっていいわけだが。
まあ少なくともテキスト形式で出力するにはあの構文木のオブジェクト構造は向いてないな)
270:デフォルトの名無しさん
09/08/01 04:55:36
修正と補足。
「構文木を食わせて~」は、「BNF定義を食わせて~」が正しい。
lapgもIronyもどちらもEBNFではなくBNF式。(Wikipediaで調べた限りでは)
ただしどちらもパースに正規表現が使える。
lapgは非Ascii文字の正規表現パースがどうも挙動が怪しい……。
Ironyはホワイトスペースの除去以外にも非構文要素を取り除けるチャンスがあるので小回りが効くようだ。
(といったところも気に入っている)
271:デフォルトの名無しさん
09/08/01 13:51:44
JetBrains Meta Programming System
これが最強他は全て旧世代の糞技術
272:デフォルトの名無しさん
09/08/01 14:25:38
>>271
どんなものか説明してみれ
273:デフォルトの名無しさん
09/08/01 14:32:14
.NET向けの旧来のスタイルのものとしてはGPPG/GPLEXが定番
GPPGはIronRubyにも使われてる
274:デフォルトの名無しさん
09/08/01 15:05:06
ドラゴンブック買ってきたぞ!さあ読むぞ!
275:デフォルトの名無しさん
09/08/01 16:48:45
>>273
なるほど……。
現在はMPPG/MPLEXと名前が変わってるようだけどね。
どうせいずれVisual Studioの胸を借りる(SDKを使ってオレ様IDEを作る)予定なので、
はじめからこちらで構文解析を実装しておいた方が
構文の強調、InteliSenceなどで使い回しが利くかもしれない。
結構進んでてあとはエラー周りくらいだったんだが、破棄してしまうかなぁ……。
276:デフォルトの名無しさん
09/08/01 16:55:06
MPPG/MPLEXはまた別物だよ(MSがVisual Studio SDK用にカスタマイズしたもの?)
本家はURLリンク(plas.fit.qut.edu.au)で開発継続中でドキュメントも充実してる
277:デフォルトの名無しさん
09/08/01 17:30:29
>>276
HPみてみたら、GPPG is closely related to the “Managed Package Parser Generator” application
って書いてるね。
今仕様を決めているスクリプトは文法がPythonに似ているので
IronPythonがどうなってるか調べてみたら、こっちはパーサーを自前で書いてる……?
(ソースコード中に直接コメントでBNFが書いてある)
278:デフォルトの名無しさん
09/08/01 17:42:08
ともあれ、BNF定義の中に直接コード片が埋め込めるGPPG/MPPGの仕様は興味深いね。
ただそれだけに、PDFドキュメントだけじゃなくて実際に動くサンプルプロジェクトが欲しいところだなぁ。
どっかにお手ごろなのが落ちてないかな。
279:デフォルトの名無しさん
09/08/01 18:06:36
>>276のサイトにあるパッケージには電卓のサンプルが付いてる。
言語なら
URLリンク(www.iunknown.com)
これなんか手ごろで面白い。あとは大規模だけどIronSchemeやIronRubyくらいかな。
280:デフォルトの名無しさん
09/08/01 18:20:30
>>278
> ともあれ、BNF定義の中に直接コード片が埋め込めるGPPG/MPPGの仕様は興味深いね。
>>276のサイトも見ないで聞くがyaccなんかのアクションとは違うもの?
281:デフォルトの名無しさん
09/08/01 18:41:28
同じです
言語定義が処理系を実装する言語に依存しないというのは,むしろ流行りの売り文句です
282:デフォルトの名無しさん
09/08/01 18:47:36
>>281
> 同じです
じゃあ>>278は何が興味深いんだろうか?
> 言語定義が処理系を実装する言語に依存しないというのは,むしろ流行りの売り文句です
JavaでいうとSableCC的なやつかな
JavaCC+JJTree、ANTLRでもできるが
283:デフォルトの名無しさん
09/08/01 19:06:25
> GPGP is a generator for LALR(1) parsers. It accepts a
> “YACC/BISON-like” input specification and produces a C# output
> file. The parsers that it produces are thread-safe, with all parser
> state held within the parser instance.
プログラミング言語非依存でもないよ。
284:デフォルトの名無しさん
09/08/01 19:09:44
>>280,281
278だが、その点で言えば、269で挙げたLexical analyzer and parser generatorはC++/Java/C#形式で吐き出せるよ。
だがこちらとしては、実装言語の非依存性などどうでもよい。
パーサーを実装しやすい仕様になっていればそれでいいわけ。
実装しやすさという観点で言えば、BNF式ごとにコードが埋め込めるGPPGは小回りが利きそうだし、
コンパイラやエラー処理があらかじめ一通り実装された状態で使えるIronyよさげ、というわけで。
285:デフォルトの名無しさん
09/08/01 19:14:10
>>284
話の流れが見えてなくてすまないが、要は昔ながらのコンパイラ・コンパイラが
欲しくてGPPGがそうだってだけ?
仕様が興味深いというから何か目新しいネタがあるのかと期待しちゃったんだが
286:デフォルトの名無しさん
09/08/01 19:16:39
ANTLRみたいなのって,C#にも対応してるよと謳ってるのが多いけど
ランタイムの実装が糞すぎて使い物にならないのが多いんだよね
287:デフォルトの名無しさん
09/08/01 19:28:14
>>286
学者風情が作った糞ライブラリに
期待するなよw自作しろ
288:デフォルトの名無しさん
09/08/01 19:37:36
>>284>>286>>287
ノイズレスはやめてくれ
289:デフォルトの名無しさん
09/08/01 19:47:26
>>285
他のやつらとこのスレの趣旨的にはどうか分からないが、
オレとしては自分で仕様を決めたスクリプトを他の形式にコンパイルするのに
必要十分な環境をそろえられればいい。
GPPG(MPPG)はスレの流れからするとyaccに仕様が近いようだが、(いわゆる昔ながらのコンパイラ・コンパイラ)
別にそれにこだわりはない。
むしろIronyによる作りやすさを評価してるくらいだ。
ともあれ、構文木を作った後が大変なんだがな……。
290:デフォルトの名無しさん
09/08/01 21:50:56
確かに、はじめてyaccを知ったときは大変興味深かった。
>289はGPPG?で今その感動を味わっているわけだ。
291:デフォルトの名無しさん
09/08/01 21:55:08
>>289
あんなバグフィックスも含めて、
ちゃんとメインテナンスされてるどうかわからんツールよく使えるな。
近況はブログにでも書いてて欲しい。
292:デフォルトの名無しさん
09/08/01 22:02:23
>>291
リリース版しか見てないだろ。
Subversionのリポジトリみたら今月に至るまでコミットされつづけてるぞ。
というか、作者に連絡して修正パッチを投げてさっき返事が来たところだ。
codeplexにおけるプロジェクトratingsも★5つだし、どこが気に入らないのか知らないが、
まあオレが使いこなせれば済むことだからいいや。
293:デフォルトの名無しさん
09/08/01 22:27:30
yaccを知らずに僕らは生まれた~
lexを知らずに僕らは育った~
294:デフォルトの名無しさん
09/08/02 10:06:57
PEG世代の歌か?
295:デフォルトの名無しさん
09/08/03 00:01:46
夏休みなんで
C++でPEGかpackratのパーサ作ってみたいのですが
何を参考に作るのが面白いでしょうか?
296:デフォルトの名無しさん
09/08/03 00:13:52
ポリエチレングリコール?
いやいや・・
297:デフォルトの名無しさん
09/08/03 00:23:12
>>295
PEGは新しい概念で古い言語向けにはあまり実装されて無いんじゃね?
Haskell、Pythonあたりを使うことをお勧めする。
298:デフォルトの名無しさん
09/08/03 11:42:07
URLリンク(pdos.csail.mit.edu)
Packrat の総本山に、C++ 実装へのリンクがいくつかあるよね。
299:デフォルトの名無しさん
09/08/03 12:00:32
PEGって使いやすいの?
CFGに比べた利点・欠点とか
こういうのが書きやすいとか書きづらいとかありますか。
300:デフォルトの名無しさん
09/08/03 12:29:13
原理的には、バックトラックのあるトップダウンパーザの受け入れる文法そのもの
なので、CFGに比べて、原理を理解してしまえば直感的。
利点とも欠点ともとれるけど、レキシカルアナライザと統合される。
ナイーブな(メモ化なし)実装だと、指数的に時間がかかり、かつ無駄が多い。
301:デフォルトの名無しさん
09/08/03 12:41:16
C#の処理系ってことでIronMetaを眺めてみたが、こりゃあ異次元行ってるな。
ぱっと見ただけじゃさっぱりわからんぞ……。
302:デフォルトの名無しさん
09/08/03 12:56:06
? これ別にC#をパースしてるわけじゃないと思うよ
yaccみたいにテキスト的に処理してるだけだろ
303:デフォルトの名無しさん
09/08/03 12:58:29
>>302
まあそうなんだけど、C#自体の文法と似通っていて、
どこまでがC#の文法なのかが非常にわかりにくい。
どう見ても構文の宣言とラムダ式の定義が混じって見える。
304:デフォルトの名無しさん
09/08/04 01:55:34
>>303
そもそもそういう人が処理系なんて書けるの?
305:デフォルトの名無しさん
09/08/04 07:32:04
>>304
んんー、昨日いっぱいまでで、Irony使って大体書き上げてしまったぞ。
単独ファイルのコンパイルは文法の厳密化とか以外は大体こんなもの。
あとはエラー出力を整理してGUIくっつけて複数ファイルのコンパイルに対応したらおしまい。
ソースコード吐き出し式よりライブラリ式の方がオレには使いやすいようだ。
306:デフォルトの名無しさん
09/08/04 10:55:30
C#って文法は単純でも中身は超複雑だぞw
307:デフォルトの名無しさん
09/08/04 12:43:57
中身w
308:デフォルトの名無しさん
09/08/04 16:08:03
PEGのパーザジェネレータ作るのはかなり簡単だよ。LL(1)やLALR(1)のパーザジェネレータ
作るのと比べてもかなり簡単。LLやLR系だと文法に対するグローバルな解析が必要になるけど
PEGはそういうのしなくていいし。パーザジェネレータじゃなくてパーザコンビネータならもっと簡単に書ける
無名関数に相当する機能がある言語だったら、大体100行程度で基本的な機能を持ったものを作れる
309:デフォルトの名無しさん
09/08/04 16:14:10
PEGの利点:
・原理的にyaccとかのLALR(1)より強力なので、yaccでハンドリングするのが難しい文法も簡単に扱える(ことがある)
・レクサとパーザが統合されてるので、Rubyの"#{exp}"みたいな式埋め込み文字列みたいな文法も簡単に扱える
・Rubyとかではトリッキーな事をしてこの問題を回避している
・アルゴリズムが簡単なので挙動を理解しやすい=文法をデバッグしやすい(かも)
PEGの欠点:
・ナイーブな実装では最悪の場合指数関数時間(だけど、実用上最悪ケースはそんなに起きないと思う)
・メモ化(Packrat)しても、定数係数でLLやLRとかの非バックトラック型のパーザよりは遅い
・Packratだと、状態付きパーザを扱うのが難しい(シンボル表を参照しながらパーズする場合など)
・レクサとパーザが統合されてるので、空白とかの処理がやや面倒
310:デフォルトの名無しさん
09/08/04 16:14:12
それはPackratパーザ?
それともバックトラック?
311:デフォルトの名無しさん
09/08/04 16:15:27
>>310
Packratも基本的には、単にナイーブなPEGパーザをメモ化するだけなので、多少手間が増えるくらいで、実装は難しくは無い
312:デフォルトの名無しさん
09/08/04 16:28:07
とりあえずLISP系でスマートに実装してみて!
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
313:デフォルトの名無しさん
09/08/04 16:43:41
>>312
OK. 1時間くらい待っててくれ
314:デフォルトの名無しさん
09/08/04 16:50:54
なんかPEG/Packrat詳しい人がいるみたいなので質問させてくれ。
手元のPEGのサンプルは四則計算を解釈していて、いきなりインタプリタとして動くようになっている。
いきなり動かすんじゃなくて構文木構築の段階で動作をとめることはできるんだろうか?
それから途中まで解析した文脈を情報として続く解釈で再利用できるだろうか?
例えばPythonの文法を考えてもらうとして、
# ***ここから***
if [Expr]:
[Sentence]
[Sentence]
[Sentence]
# ***ここまで***
Pythonでは構文の範囲は字下げで表現しているので、
if文の範囲を調べるのに字下げの数を数えないといけない。
どうやって解釈させたらいいのかわからなくて戸惑っているところなんだが。
315:デフォルトの名無しさん
09/08/04 17:21:20
そのサンプルは、構文木を作ってから四則演算を実行してるんじゃなくて、
いきなり構文を解析しながら四則演算をしてるんじゃなかろうかという気がするが。
オフサイドルールとかはPEGの鬼門だということかと。
確か原論文では、それを理由にHaskellはムズいとして、Javaのパーザを
実装していた。
多分さがせば解決方法が出てる論文もあるだろうと思うのだけど。
パーザを状態付きにする方法は原論文にある。
316:デフォルトの名無しさん
09/08/04 17:56:21
>>309
> 定数係数で
この言葉遣いはちょっと変なのでは?
>>314
字下げ処理はレキサの仕事と割りきってしまえばそれほど難しくはないでしょ。
先読みして{と}に相当するものに変換できるから。
317:313
09/08/04 18:20:40
(use srfi-9)
(define-record-type result
(make-result x y) result? (x value) (y next))
(define (app parser f)
(lambda(in)
(define r (parser in))
(if r (make-result (f (value r)) (next r)) #f)))
(define (term str)
(lambda(in)
(if (equal? (string-scan in str ' index) 0)
(make-result str (substring in (string-length str) (string-length in))) #f)))
(define (/: x y) (lambda(in) (or (x in) (y in))))
(define (^: x y)
(lambda(in)
(define r1 (x in))
(if r1
(let ((r2 (y (next r1))))
(if r2 (make-result (cons (value r1) (value r2)) (next r2)) #f))
#f)))
(define (seq p . parsers) (fold (lambda(x y) (^: y x)) p parsers))
(define (rep0 parser)
(lambda(in)
(let loop ((rest in) (rs '()))
(define r (parser rest))
(if r (loop (next r) (cons (value r) rs)) (make-result (reverse rs) rest)))))
(define (rep1 parser) (^: parser (rep0 parser)))
(define (? parser) (/: parser (app (term "") (lambda(v) '()))))
(define (& parser) (! (! parser)))
(define (! parser) (lambda(in) (if (parser in) #f (make-result '() in))))
(define-syntax rule
(syntax-rules() ((_ name body) (define name (lambda(in) (body in))))))
318:313
09/08/04 18:25:10
なんとか1レスの範囲に収めたが、そのせいもあって、読みづらくなってる。その辺は読む側
の環境で適当になんとかしてくれ。あと、Gaucheのライブラリ関数string-scan使ったので、Gauche
でしか動かんと思う。string-indexとかに置き換えれば、他のSchemeでもたぶん動くと思われ。
Schemeは普段使わないんで、Scheme使いの人からするとアレなコードかもしれんが、そのへんは勘弁。
使い方は以下のような感じ。文脈自由文法では表現できない、A^n B^n C^nの文法。
(rule S (seq (& (^: A (! (term "b")))) (rep1 (term "a")) B (! (term "c"))))
(rule A (seq (term "a") (? A) (term "b")))
(rule B (seq (term "b") (? B) (term "c")))
(display (S "aaabbbccc"))
319:313
09/08/04 18:28:52
Pythonのインデントルールみたいなのは、レキサがインデント処理する事が前提だから、PEG/Packrat
で処理する場合でも、レキサを別に用意した方が書きやすいと思う。レキサがあったらPEGじゃないというわけ
じゃないので別に構わないはず(基本単位が文字の代わりにトークンになるだけ)。
320:デフォルトの名無しさん
09/08/04 19:26:20
>313
うお、本当にできてる!
たしかにこれはクロージャ使えない言語では無理だ
こういう風になったけど合ってますか?
gosh> (display (S "aaabbbccc"))
#<result 0pbb1788>#<undef>
gosh> (define res (S "aaabbbccc"))
res
gosh> (result? res)
#t
gosh> (value res)
(((() #0="a" #0# #0#) (#1="b" (#1# (#1#) . #2="c") . #2#) . #2#))
gosh> (next res)
""
321:313
09/08/04 19:34:21
>>320
たぶんそれであってる。まあ、これだけだと構文エラー時のエラーメッセージ
表示とかどうしようも無いし、実用的にしようと思うと、色々付け足す必要があるけど、
コアの部分はこれくらい簡単だということで。
322:デフォルトの名無しさん
09/08/04 23:05:50
みんな論文みながら作ってるの?
どうやってpackrat実装すればいいかよくわからん
323:デフォルトの名無しさん
09/08/04 23:21:12
21世紀…人類はいまだに左再帰問題を克服できずにいた
324:313
09/08/05 00:55:09
>>322
一応、自分が作ったときは論文参考にしたけど、基本的にナイーブなPEGパーザ+メモ化に過ぎ無いから
それさえわかっていれば、自力で実装することもできると想う。ヒントとして、上で書いたSchemeによる
パーザコンビネータで、各非終端記号の解析結果をメモ化するにはどうすればいいか考えてみて。
Rats!とか高度な最適化してる奴はまあソース読むしかないと思うけど。
325:デフォルトの名無しさん
09/08/05 01:16:54
左再帰の論文もあったような。
326:デフォルトの名無しさん
09/08/05 02:07:47
これのことかな。
Packrat Parsers Can Support Left Recursion (PEPM 2008)
Alessandro Warth, James R. Douglass, and Todd Millstein
URLリンク(www.tinlizzie.org)
327:デフォルトの名無しさん
09/08/08 18:40:53
COBOLインタープリタを作ろうと思ったが挫折。
制定されているキーワードの数が尋常じゃない。
商用COBOLコンパイラを作っているメーカーの人はマジ天才。
328:デフォルトの名無しさん
09/08/08 19:51:58
何でそんなものを作ろうと思ったんだw
329:デフォルトの名無しさん
09/08/09 03:42:55
COBOLかっこいいじゃん。大文字で。
Cを使える人はいっぱいいるけど、COBOLはそうはいない。
だからこっそり開発して職場のヒーローになろうと思ってね。
でも道は遠かった・・・使うのと作るのとは別物なのだ。
330:デフォルトの名無しさん
09/08/09 09:26:31
>>327
> 制定されているキーワードの数が尋常じゃない。
何のためにパーサジェネレータがあるんだか
まあ、BNF 打ち込むだけで疲労困憊ってのはあるかもしれんが…
331:デフォルトの名無しさん
09/08/09 09:32:18
大文字使いたいだけならマクロでも使えばいいじゃん
332:デフォルトの名無しさん
09/08/09 10:31:58
>>330
やっぱ疲労困憊ら?(静岡弁で)
333:デフォルトの名無しさん
09/08/09 11:53:19
>COBOL
ほとんどは命令の名前なんだから、Identificationのレベルで区切って、
命令の判別はあとの段階にまわした方が簡単になるんじゃない?
あとはまあ、フリーソフトのCOBOLの処理系なんて昔ならともかく今ならいくつもあるんだし、作らないという手も。
334:デフォルトの名無しさん
09/08/12 15:03:20
ゲームのNPCとかにスクリプトを使いたいんだけど
参考になるサイト教えて、lexとかyaccとか難しいのはいらない
335:デフォルトの名無しさん
09/08/12 15:32:59
>>334
とっつきは悪いかもしれないけど、yacc&lexを使った方が
結局は落だと思うよ。
336:デフォルトの名無しさん
09/08/12 16:35:21
>>334
オープンソースのスクリプトの処理系を組み込んだ方が普通は楽。
オレはそれにシナリオ記述用の独自形式のスクリプトと2種類用意しているが。
337:デフォルトの名無しさん
09/08/12 17:11:04
>>334
ゲームの性質(リアルタイムとかアドベンチャーとか)にもよるけど
ゼロから勉強しなきゃいけないならYaccとかbisonとかの支援受けるのは悪くないと思うよ
組み込みでスクリプトをその場解析する必要があるならLRのパーサを裸で実装したマイクロPlan(1970年代のbitの記事)とかもあるからそういうレガシーなものもいいかもしれない(これは中間コードVMとしても結構興味深い)
っというわけで334がどういうものを欲しているかによって回答が異なるのだな
338:デフォルトの名無しさん
09/08/12 21:00:13
luaは洋ゲーで良く使われてる
339:デフォルトの名無しさん
09/08/12 21:21:39
>>337
マイクロPlan懐かしすぎ
臨時増刊捨てなきゃよかった
340:デフォルトの名無しさん
09/08/12 23:00:14
>>339
同じく後悔してる
他にもmicro StarTrekやTinyBASICのソースもあったんだよな
>>334
ゼロから勉強するつもりで、もし入手できるなら「翻訳系構成法序論」がお勧め。
えらく堅苦しい題名だけど、たった136ページで翻訳系(コンパイラ)から
翻訳器生成系(yaccのようなコンパイラコンパイラ)まで作成方法が解説してある。
言語はPascal系なModula-2だけど、難解なアルゴリズムではないから、
C/Javaなどに慣れていれば読解に問題はないと思う。
あと、自前で言語処理系を作らないつもりなら、Tcl/Ruby/Pytonみたいな
汎用スクリプト言語をゲームアプリの中に「埋め込む」ことも検討できる。
ゲーム専用のスクリプトエンジンについては、よく分からんなぁ。
341:デフォルトの名無しさん
09/08/13 01:44:52
老婆心だが、Tcl/Ruby/Python のうち、Rubyを組み込むのは
やめたほうがいいと忠告しておこう
Tclはもともと組み込みのための処理系だし、Pythonもある程度
考えてあって商用も含めて実績も多い。
R(以下略
342:デフォルトの名無しさん
09/08/13 01:51:34
PL/0まじおすすめ
許されるのは小学生までだけど
343:デフォルトの名無しさん
09/08/13 01:59:01
>>334
tclかluaを使うことにして、公式ドキュメントを。
344:デフォルトの名無しさん
09/08/13 02:48:09
>>334
あとはまあ、NPCの台詞や動き程度なら、
イベントの発生条件とイベントの内容をデータとして書ければいいわけだから、
スクリプト言語を使うまでもなく、
XMLやYAMLなどで宣言的データとして書く方法もある。
ちょうど、同じようなものを自分で作ろうとしているところ。
345:デフォルトの名無しさん
09/08/13 03:15:15
>>341
スレ違いの質問で悪いが、続きを聞かせてくれ。
実際、Pythonを組み込んだオプソだけど高機能な3Dソフトを
知っているし、それに対してRubyはvimくらいしか実績を知らない。
ただ、Rubyの組み込みに何か技術的に致命的な欠陥があったりするのか、
あるいは、それほどPythonが組み込みに優れているのかまでは分からないんだ。
それとも単に>>341の印象で語ってるのか?
346:デフォルトの名無しさん
09/08/13 03:35:11
>>345
341ではないが、代わりに答えてみよう。
Rubyでは処理系そのものをライブラリの形で差し替えたり、
あるいはJavaや.NETの枠組みで処理系そのものを再実装したりの試みは広く行われているが、
Rubyを組み込みスクリプトとして使用する例はオレもRPGツクールXPくらいしかしらない。
あまりその辺の分野は活発ではないような気がする。
いい加減スレ違いだから、これ以上の話はRubyのスレに行ってくれ。
347:デフォルトの名無しさん
09/08/13 10:55:31
独自に実装かつ、yacc&lexは難しいと言うなら、LISPかForthがいいんじゃね?
LISPはよく見るから、あえてForthでやってみてくれ。
348:デフォルトの名無しさん
09/08/13 13:30:18
>>345
ruby は GC というかメモリ管理まわりの兼ね合いで
組み込みがかなり面倒、という話を聞いたことがある
349:デフォルトの名無しさん
09/08/13 14:10:04
スレチだけど、言語実装の話でもあるので、ちょっとRubyの話を続けると、
組み込みに向かないのは、evalがあるのが大きいと思う。
そのせいで、パーサとVMが独立できないので、言語まるごと組み込む必要が
あるのが大変なんじゃないかと。
1.9でその辺は変わったみたいだけど。
350:デフォルトの名無しさん
09/08/13 14:27:07
行の1文字目で処理を分ける程度でいいんじゃね?
351:デフォルトの名無しさん
09/08/13 14:33:22
1文字で思い出したけど、変数名が1文字の場合はハッシュ使わないで
26個のテーブルってのどう?
352:デフォルトの名無しさん
09/08/13 14:41:29
いつの時代のBASICだよ
353:デフォルトの名無しさん
09/08/13 15:08:53
Rubyの話をもちっと聞かせてくれ。
俺も拡張機能用にPythonを組み込んだアプリは良く見るが
Rubyを組み込んだアプリは見たことが無い。
これは単にRubyが歴史が浅いからなのか、それともRubyが組み込みで使えない深い理由があるのか?
354:デフォルトの名無しさん
09/08/13 15:33:13
>>352
難読化したjQueryとかじゃね?
355:デフォルトの名無しさん
09/08/13 16:00:40
じゃあこのスレっぽく話を広げようか
俺341だけど、言いだしっぺっぽいので
まず指摘されてたけど、メモリ管理の点で、1.8時代はネイティブスレッドとは
破滅的に相性が悪かったし、ウィンドウシステム・3D・DirexX関係も
相性はあまりよくない。
それに対してPythonは参照カウントとマーク&スイープの組み合わせで、
マーク&スイープもおとなしいタイプ。
参照カウントってのはちょっとダサいが、質実剛健だしその点では好感。
あと、これは俺の想像だけど、Pythonの作者は、PythonからCを使うってのと
CからPythonを使うってのを対称的で対等なものとして考えている雰囲気があるし、
技術的に変なこだわりはなくて、いろんなところに配慮しながら無難な実装をしてる。
Rubyは実装技術オタクのMatzが作ったので、変なところでこだわってたり
無駄に離れ業やってたりしてタチが悪い
ただし、Rubyは将来的にはマルチVMも可能にしようという方向で動いてるようだから
そこらへんは変わってくるかもしれない
356:デフォルトの名無しさん
09/08/13 20:56:15
とりあえず Google SketchUp が Ruby 組み込みだったはず。
357:デフォルトの名無しさん
09/08/14 01:20:18
Q. 64bitプログラムとは、どのような文を書くといいのですか
A. コンパイラが64bitコンパイルできるなら何でも64bitプログラムになります
心底「ダメだこのバカ」と思った
358:デフォルトの名無しさん
09/08/14 09:35:58
>>357
つぶやきはtwitterで
359:デフォルトの名無しさん
09/08/14 11:41:34
>>357
スレ違い
64bitのソフトウェアってどうやって作るの?
スレリンク(tech板)
そのセリフの人物によっては
ハズレの外注を引いたときの対応 2人目
スレリンク(prog板)
【まるで】使えない新人 0x1C
スレリンク(prog板)
など
360:デフォルトの名無しさん
09/08/14 21:52:07
トークンという物について質問させてください。
例えば s = "ABC"; という文があった場合トークンは、
1. s
2. =
3. "
4. ABC
5. "
6. ;
でいいのでしょうか? とくに文字列が "ABC" で1つのトークンなのか
"とABCと"で3つのトークンなのかがわかりません。
361:デフォルトの名無しさん
09/08/14 21:59:32
s
=
"ABC"
;
と分けるのが一般的かと思います