1 :
デフォルトの名無しさん :
2001/02/09(金) 07:55 yaccやlexの使い方やら言語仕様やらの話題。
2 :
リンク :2001/02/09(金) 07:58
3 :
これでどうよ :2001/02/09(金) 11:14
4 :
デフォルトの名無しさん :2001/02/09(金) 11:26
5 :
デフォルトの名無しさん :2001/02/09(金) 21:17
ガベージコレクタはマークスイープ法の他に何かありますか? C/C++でガーベジコレクタは必要だと思いますか? LISP/Schemeだとセルの大きさが一定な事が多いから、かなり回収率が良い気がしますが、この推論は正しいですか?
6 :
デフォルトの名無しさん :2001/02/09(金) 21:20
スクリプトの実行は一般的にインタプリティング、または仮想機械で行なうので遅いです。 ネイティブオブジェクトコードに変換して実行するうまい方法はありますか?
9 :
デフォルトの名無しさん :2001/02/09(金) 21:31
GCは束縛されているオブジェクトのメモリの移動まではできないから、 malloc/freeの問題と同じと考えて良いでしょうか。 best-fit法とかfast-fit法ぐらいしか知らない者で…。
10 :
6>8 :2001/02/09(金) 21:33
おお!凄いですね。ゲームで使われているのですか。 もしかして、最近のエミュレータとかもこういう形式ですかね。
11 :
5 :2001/02/09(金) 21:39
>7 参照カウンタ(リファレンスカウンタ)は自己参照がある場合は使えないですね。 JargonとCopyingはどんなアルゴリズムかな。
12 :
4 :2001/02/09(金) 21:58
13 :
デフォルトの名無しさん :2001/02/09(金) 23:29
>>9 メモリ領域の移動(空き領域を1つにまとめる。デフラグみたい?)
はメモリコンパクションって呼んで
厳密にはGCとは別物
ただ一緒にやってしまうGCの実装も多そうだし
アルゴリズムによっては下記みたいに自動的に
コンパクションもできてしまうものもある
>>11 Copyingはたしかヒープを2つに分けて片方がいっぱいになったら
必要なものだけたどってもう一方にコピーするヤツだと思った
メモリの無駄が多いけどコンパクションも一緒にできる
>>10 64とか、プレステなんかの
MIPS系列のCPU積んだマシンは
たいていこの手法ですね。
ただ、もっと動的な再コンパイルですが。
jump/callの部分でコード変換したものを
キャッシングすることで速度を稼いでいるようです。
fpse.emuforce.comがソース公開です。
15 :
スクリプト系 :2001/02/10(土) 00:34
16 :
デフォルトの名無しさん :2001/02/10(土) 00:42
LISPやSchemeはスクリプトに入るのかな?実装は一番楽だと思うけど。
17 :
デフォルトの名無しさん :2001/02/10(土) 00:45
あ、CommonLISPやR5RSとかの規格に準拠させるならそれなりに大変なんだけども。 それでも他の言語よりは楽かな?
自作コンパイラage
Schemeが流行るといいなage
20 :
デフォルトの名無しさん :2001/02/10(土) 19:47
CommonLISPはそれなりなんてレベルじゃないよ。 schemeもR5RSにキッチリあわせようとすると一月はかかるね。
22 :
デフォルトの名無しさん :2001/02/10(土) 22:43
俺の上司が昔8KバイトのROMにLISPのインタプリタ を押し込んでいたな・・。
>21 最新のR5RSじゃなくてもR4RSに準拠すればオンライン上にある大抵のスクリプトは通るよ。 (あんま変わらないかもしれないけど。) がんばってね。
昔8086のsmallモデルでも動くschemeをCで作ったけど、だいたい2kステップぐらいだった。
26 :
デフォルトの名無しさん :2001/02/11(日) 04:41
期待age
27 :
デフォルトの名無しさん :2001/02/12(月) 00:15
参考書籍 yacc/lex プログラミングジェネレータ on UNIX - 五月女健治 - tp
28 :
デフォルトの名無しさん :2001/02/12(月) 01:28
>>27 その本って絶版じゃなかったっけ。図書館いけばあると思うけど。(啓学出版ってつぶれたんじゃ?)
参考書籍
C stepupシリーズ(3) yaccによるCコンパイラプログラミング
ソフトバンク
ISBN4-89052-136-4
内容:
簡単な8086のASMコードを吐くCコンパイラサブセットの実装が載っている。
niftyにこれの全ソースが落ちているのを昔見ました。
29 :
デフォルトの名無しさん :2001/02/12(月) 01:32
コンパイラを作る方法 翔泳社 ISBN4-88135-072-2 内容: Pascal-Bという処理系の実装(+仮想マシン)
30 :
デフォルトの名無しさん :2001/02/12(月) 01:37
CプログラムブックI,II,III アスキー出版局 ISBN失念 内容: I にForceインタプリタ II にREDAというコンパイラ、makeの実装、 III にlispの実装
31 :
デフォルトの名無しさん :2001/02/12(月) 01:40
それから、niftyのFPLとかに結構な量の処理系があった。
32 :
デフォルトの名無しさん :2001/02/12(月) 01:52
技評の本で、Cライクなコンパイラ、インタプリタと アセンブラを作成する本があったな。 会社にあるのでいまは挙げられないけど、あとで調べておくよ。
33 :
デフォルトの名無しさん :2001/02/12(月) 02:05
34 :
デフォルトの名無しさん :2001/02/12(月) 02:30
たしか'mc'なんとかでしょ>32 デバッグコンソール環境も付いてた筈。(ただしNEC9801用)
35 :
デフォルトの名無しさん :2001/02/12(月) 02:36
昔、アジソンウェスレイ出版社の本でCのインタプリタが載ってるのがあったなあ。 その本は当時としてはかなり内容が濃かった。(マルチスレッドとかTSRとかエディタ、DBなど) 多分もう売ってない。工業系の図書館いけばあると思うけど。
36 :
デフォルトの名無しさん :2001/02/12(月) 02:58
大学の図書館にコンパイラの本なんて腐るほど置いてあった。
37 :
デフォルトの名無しさん :2001/02/12(月) 07:02
ハードカバーで活版印刷のやつも沢山あった
38 :
デフォルトの名無しさん :2001/02/13(火) 01:29
解析を行うにはyacc/lexを選ぶしか方法は無いんでしょうか? yacc/lex以外の手段はありませんか? 自分でやるのは大変過ぎるからパスですけど…
bison/flex あと、kmyaccとか言うのがなかったっけ?
40 :
デフォルトの名無しさん :2001/02/13(火) 02:10
>39 それ全部似た様なモノでしょ? C程度の構文なら自分でスタック作ってやった方が速いよ。>38
41 :
39 :2001/02/13(火) 08:47
>>40 マジレスしちゃいやん♥
42 :
デフォルトの名無しさん :2001/02/13(火) 12:23
43 :
ISO :2001/02/13(火) 12:32
Perlに決定しました。
それは置いといて、
>>42 別に色々あってもいいんじゃない?
ALGOL 200x,,,
45 :
デフォルトの名無しさん :2001/02/13(火) 18:46
LL構文解析はスタック作って、ヒープ領域に置いたほうがいい? それとも、再帰使ってスタック領域を利用した方がいい?
46 :
sage :2001/02/13(火) 19:12
>>45 LL構文解析に限った話題じゃないね sage
エラー処理はOSに任せてスタック使ったら?
>>32 ,33 技評の本で、Cライクなコンパイラ、インタプリタと
アセンブラを作成する本があったな。
たぶんこれじゃないですか?
「ハイクラスC言語 コンパイラ&インタプリタ」舟本奨 監修 末石吾朗+小林優 著
8080CPUもどきアセンブリコードを生成するコンパイラと、
そのアセンブリコードを実行するインタプリタのソースが載っています。
48 :
しつもん :2001/02/14(水) 01:41
ソースが見やすいけど複雑な言語、(私が思うにC/C++みたいな) ソースはみずらいけど簡単な言語、(私が思うにRubyみたいな) どちらの方が一般に好まれますかね?
49 :
デフォルトの名無しさん :2001/02/14(水) 01:59
ドラゴンブックを読んでるんですが、数学的な証明の部分とかも ちゃんと理解しないとコンパイラは書けませんか?
50 :
デフォルトの名無しさん :2001/02/14(水) 02:33
>>49 いらないと思う。
コンパイラ技術の論理的なこと(???)を理解するには
ドラゴンブックはいい本かもしれないけどあんまり実践的じゃない。と思う。:-)
51 :
デフォルトの名無しさん :2001/02/14(水) 02:36
BNFで表したCやC++やJavaやJavaScriptの文法って どっかにないでしょーか?
52 :
デフォルトの名無しさん :2001/02/14(水) 02:46
>>51 CならK&Rの付録についていたような、、、
53 :
デフォルトの名無しさん :2001/02/14(水) 12:15
>43 ソフトごとにマクロ言語を覚えるのが面倒です(^^; 誰かが優秀な言語のスクリプトエンジンを公開すれば 多分それがデファクトになるのかなぁとも思うんですけどね。
55 :
デフォルトの名無しさん :2001/02/14(水) 15:25
>>53 うーむ。
優秀ってのはよくわからないけど、
o GNU Makefile,VC++,BCBなどのプロジェクトファイルが付属している。
-> .libや.aなどのバイナリも付属させる?
o なるべく小さく。
-> 考え方にもよると思うけどソースファイルで50KBぐらいが限度?
o Lisp系の文法でも良いかもしれないけど、普及するとは考えにくい
(「わ、括弧だ」で敬遠する人がいるかもしれない)。
-> なのでC言語ライクにする。
o ライブラリに依存しない。
-> 構築するのが面倒になるから。
こんなの?
それと聞きたいんだけど、例外処理っていると思う?
型なし言語だとして
try
{
throw "例外";
}
catch e
{
print e, "\n";
}
おお、おもしろそう
57 :
デフォルトの名無しさん :2001/02/15(木) 00:33
compiler.age();
58 :
デフォルトの名無しさん :2001/02/15(木) 12:56
59 :
55 :2001/02/15(木) 23:13
>>58 >>55 は「こんなのだったらーいいなー」ってのを書いただけです。。。^^;
作ってるのは作ってるんですけどForthっぽい+自前のGCを装備というやつです。
60 :
デフォルトの名無しさん :2001/02/15(木) 23:41
age
ほんとに頭よい人は、日本語の文法に由来するコンピュータ言語を 開発してます。英語の文法に由来する言語なんて開発したって、ま してそれらを理解して使っているレベルでは奴隷以外の何物でもな いよん。原点に返って日本語で考えることからスタートしないと 日本はいつまでたっても追いつかないのだ。つーか、中国に追い越 されるよん。あっちの人はさすがに精神的な文化レベルは日本にも ひけをとらないため、ユニークな言語があるよん。それも中国語に 由来する文法で考えたコンピュータ言語が。
62 :
デフォルトの名無しさん :2001/02/16(金) 01:10
>>61 これは日本語に由来してますか?
10 a =
# 10をaに代入する
>>61 こんなスレにも煽りがいるのか。
そんなあなたはMINDを使っててください。
あと、そのユニークな中国製言語の具体例を挙げてください。
さぁ、どうぞ。
ま、面白そうかなとは思うけどね。 しょせんは英語読めない人間の戯言でしょ。 時に、中国語の文法は日本語より英語の文法に近いんじゃなかったっけw
何を言う! 我らにはギコBASICがあるではないか!
ば〜か、中国語が英語に似てるにはS+Vと動詞に慣用的にくっつく 一部の前置詞くらいのもの。時制なんか日本語のほうに近いよ。 例えば中国語に完了形なんてない。 中国製の言語か?自分で調べろ。誰がタダで教えるか。 確かに俺は英語読めないかもしれんが、少なくとも64よりはあ るよん。 あおったつもりはない。聖書を読んでああでもないこうでもない と屁理屈いってるやつと同じレベルの君たちに危機感をもっただ けだよん。
>62 おっと見落としてた。何がいいたんだ?なんの反応もできないが しょせん俺もバカだから許してくれ。一言いわせてもらえば そーいう解釈する普通の日本人がどれだけいるかが問題だ。 そーいうルールを作ったとして、拡張、応用していけるかが問題 だな。拡張、応用するにしたがって解釈するのにヘイコラとなっ たらその言語は失敗だ! それしか胃炎。
68 :
デフォルトの名無しさん :2001/02/16(金) 06:45
>>66 えっと、プログラミング言語についてかんがえてるんですよね。
時制ってそんなに関係のあるものってわけでもないと思います。
むしろS+Vみたいな部分のほうが大切。
69 :
デフォルトの名無しさん :2001/02/16(金) 09:21
おお。bakaの意見は、煽りと思わせつつ、かなり建設的ではないか!
わけわかんないこと叫んでるbakaがいるなー。 英語に由来しようが、日本語に由来しようが、 数あるプログラミング・パラダイムに沿って プログラムを組み立てられなければ実用性なし。 せいぜい理想を追っかけててください。
71 :
デフォルトの名無しさん :2001/02/16(金) 10:56
>>baka バカなら黙ってろ。 ところでMLみたいな関数型言語を作ってみようという人はいませんか?
>>66 >中国製の言語か?自分で調べろ。誰がタダで教えるか。
そりゃ、知らないものは教えようがないよね。
73 :
デフォルトの名無しさん :2001/02/16(金) 11:18
>>68 そうだね、プログラム言語に過去とか現在なんて概念はないし。
>>66 が言ってることは、ちんぷん漢文だよ(藁
74 :
デフォルトの名無しさん :2001/02/16(金) 11:20
75 :
デフォルトの名無しさん :2001/02/16(金) 11:45
話題を変えようぜ。 関数型言語ってどんなのなんですか? 全部が関数で作られてるとか???
77 :
デフォルトの名無しさん :2001/02/16(金) 12:02
>>75 ループが無いとか、
変数に代入ができない(するべきではない)とか、
わたしも最初、「こんなのでプログラム書けるの?」と不思議でした。
でも、慣れるとCやJavaよりすっきりとしたコードで
プログラムできるんですよ。
日本語では
「プログラミング言語ML」ウルマン、アスキー
「プログラミング言語」武市正人 岩波講座ソフトウェア科学
が関数型言語を解説しています。
79 :
デフォルトの名無しさん :2001/02/17(土) 00:27
完全なオブジェクト指向の言語ってどうもとっつきずらいです… C++なんかはオブジェクト指向のいいとこどりみたいでいいかんじだと思うんですが、 どうでしょう? やっぱりオブジェクト指向なら完全にオブジェクト指向でいかないとだめなもんですか?
オブジェクト指向プログラミング言語と他のオブジェクト指向なんちゃら はちょっと違うよーん。JavaとかC#みたいなのはそのオブジェクト指向設計 とかと親和性が高いというのが使いやすい人にとっては使いやすいよーん。
>78 Lisp/Schemeも関数型言語じゃなかった? ローカル変数使えるけど。 MLが完全な関数型に近いと聞くけど、どうちがうのか調べてないのでわからんです。
82 :
デフォルトの名無しさん :2001/02/17(土) 02:27
83 :
デフォルトの名無しさん :2001/02/17(土) 03:28
言語処理系は一から自分でアルゴリズムを考えようとすると死にそう ですが、みなさんどんな本を読みましたか? 洋書の定番として読みにくさの順で、 ドラゴンブック タイガーブック あたりだと思いますが、他にもっと読みやすい本とかないでしょうか? パーサや正規表現の解説も「yaccとlexに頼れ」で飛ばすんじゃなく、 ある程度わかりやすく説明して本がいいのですが。
C++はテンプレートがかなりいい。 でも、規則の組み合わさり方が複雑すぎる。
>>85 まあまあ、別に「よーん」って言おうが言うまいが、コンピュータ言語
について話す上では関係ないことだし。
つーか、そんなとこにいちいち突っ込む君の方が馬鹿じゃん。
ていうか意味わかんねーなと思ったけど、80。
よーん、、87がいじめるモナー  ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ∩_∩ ( ´Д⊂ヽ ⊂ ノ 人 Y し (_)
赤塚ファンが苛められてるな。 いや、とりみきファンの可能性も、、
90 :
83 :2001/02/17(土) 18:14
91 :
not 83, not 90 :2001/02/17(土) 23:19
92 :
部外者A :2001/02/18(日) 00:20
ドラゴンブックは翻訳されてるけど。>83 他に何か?
93 :
ミトコンドリ子 :2001/02/18(日) 03:13
>>83 プログラミング言語処理系 岩波講座ソフトウェア科学5
ISBN4-00-010345-8
なんてどうかしら? 適当に端折られてるから、ドラゴンブックよりは
読みやすいかもしれないわ。
ついでに、タイガーブックってしらないんだけど、正式名称教えていただけ
ないかしら。
94 :
部外者A :2001/02/18(日) 03:19
それ持ってるけど、内用はまんまドラゴンブックの縮小版って感じだね。>93 (それでも辞典並みに分厚いけど)
95 :
デフォルトの名無しさん :2001/02/18(日) 03:25
>>93 あー思い出した。俺もそう思うよ。
>>94 読み比べるとやっぱり読みやすいと思うよ。
ただそれを元に実装しようと思うと足りない情報があって、
結局ドラゴンブック読むことになるって感じかな……
どうよ。
96 :
部外者A :2001/02/18(日) 03:27
>94 x内用 o内容 薄っぺらいのが良いなら、 計算機科学/ソフトウェア技術講座7「コンパイラの理論と実現」 ISBN4-320-02382-X 共立出版 2700円 てのもある。 最後にC--というコンパイラの実装が乗っている。 これのパーサはyaccを使った物と、再帰下降の2種類が掲載されている。
97 :
ミトコンドリ子 :2001/02/18(日) 03:28
>>95 そうそう、そのとおり。
理屈だけ知るなら93
実装までするならドラゴンブックって感じかしらね。
98 :
デフォルトの名無しさん :2001/02/18(日) 06:12
実装だけならドラゴンブックいらん・・・。
99 :
83 :2001/02/18(日) 07:13
>>93 ドラゴンブックとは、
Modern Compiler Implementation in ML/Java/C
Andrew W. Appel
ISBN 0-521-58274-1
ISBN 0-521-58388-8
ISBN 0-521-58390-X
のことです。
ドラゴンブックの竜に対して、こちらの表紙は虎になっています。
ドラゴンブックよりも薄くて読みやすいとか、新しい分だけ最近の
トピックを押さえているとかの良い部分もあるんですが、字句解析
や構文解析の説明をはしょり気味な内容です。
理論よりも自分で実装することに興味があるので、ドラゴンブック
は読んでてつらいのです…
100 :
83 :2001/02/18(日) 07:20
>>99 一行目の「ドラゴンブックとは、 」は「タイガーブックとは、 」の間違いです。
101 :
デフォルトの名無しさん :2001/02/18(日) 07:47
102 :
デフォルトの名無しさん :2001/02/18(日) 08:35
>>101 え?理論なんて全然知らなくても、yaccなどの助けで
実装できるよ。
一方、構文解析等の理論は本格的な学問で奥が
かなり深い。
103 :
デフォルトの名無しさん :2001/02/18(日) 08:49
104 :
83 :2001/02/18(日) 10:19
>>103 えと、yacc/lexを使いたくないというんではなく、ブラックボックスなのが
気持ち悪いので、いちおう基本理論の理解だけしておきたいという程度
です。「ドラゴンブック読め!」と言われるのはわかっているんですが、
難解で…
105 :
83 :2001/02/18(日) 10:22
age忘れ。
106 :
103 :2001/02/18(日) 10:22
だからね、まとめると、
ドラゴンブック = 理論+実装
>>93 = 理論
なので、
>>93 読め。
107 :
コンパイラ屋(休日出勤) :2001/02/18(日) 11:53
最近はTiger Book以外にもいい本が沢山でているよ.以下は どれも実際の処理系を作るのに役立つ内容です. Reinhard Wilhelm, et al., Compiler Design, Addison-Wesley, 1995, ISBN 0-201-42290-5. Steven Muchnick, Advanced Compiler Design and Implementation, Morgan Kaufmann, 1997, ISBN 1-55860-320-4. Robert Morgan, Building an Optimizing Compiler, Digital Press, 1998, ISBN 1-55558-179-X. 中田育男, コンパイラの構成と最適化, 朝倉書店, 1999, ISBN 4-254-12139-3,9500円. Dick Grune, et al., Modern Compiler Design, Wiley, 2000, ISBN 0-471-97697-0. Michael L. Scott, Programming Language Pragmatics, Morgan Kaufmann, 2000, ISBN 1-55860-442-1.
108 :
83 :2001/02/18(日) 12:59
>>107 ありがとうございます。
コンパイラ初心者におすすめというか、あまりアカデミックでない実践
指向な本はこの中にあるでしょうか?
英語でもかまわないのですが、コードの例が多い方が嬉しいです。
竜本も虎本もコンパイラの完結したコード例がついてないのが、
ちょっと好きになれません。
ところで理系の本の著者名でよく見るet al.って、どういう意味なんで
しょうか?ネタに訊いているわけではなくて、本当に知りません。
>108 et al.「〜と愉快な仲間達」
110 :
ミトコンドリ子 :2001/02/18(日) 13:43
>>107 情報ありがとう。
>>83 =108
コードの例が載ってなくても、アルゴリズムが理解できて、
実装できるようになんなきゃダメよ。それにドラゴンブックだって、
ちゃんと擬似コードで説明してるじゃない。
コンパイラじゃなくても、わりとアカデミックよりな文献だと
環境が特定されているサンプルコード(打ち込んだらすぐ動く)なんて
ついていること少ないわよ。擬似コードすらないこともザラよ。
(分野によるのかしら?)
逆に、理論からコードに起こすことが、必要ない、やりたくない、
できない、人のためにlex/yaccみたいな処理系が普及してるわけでしょ?
がんばりなさい。
et al.って、「ほか何人か」って意味じゃなかったかしら。
辞書に載ってるわよ。
111 :
83 :2001/02/18(日) 14:40
112 :
コンパイラ屋(休日出勤) :2001/02/18(日) 15:14
107です.以下の本は動くコード例付です. David L. Clarke, et al, Systems Software Programming: The Way Things Work, Prentice Hall, 1997, ISBN: 0-13-490558-X. (邦訳 システムソフトウェアプログラミング―コンパイラの設計法と並行処理の基礎, 小松伸行訳,プレンティスホール出版,1998, ISBN 4-89471060-9, 4800円) 疋田輝雄・石畑清,コンパイラの理論と実現 (計算機科学・ソフトウェア技術講座7), 共立出版, 1998, ISBN 4-32002382-X, 2700円. 原田賢一,コンパイラ構成法, 共立出版,1999, ISBN 4-3200292-2, 6500円.
113 :
コンパイラ屋(休日出勤) :2001/02/18(日) 15:38
実際に動く処理系をインプリメントするには,コンパイラ本だけで なくこんな本も結構役に立ちます.もっともインタプリタを作るに はここまでいろいろ知らなくても十分なんとかなりますが. Richard Jones, Rafael D Lins, Garbage Collection : Algorithms for Automatic Dynamic Memory Management, Wiley, 1996, ISBN 0-471-94148-4. Jonathan B. Rosenberg, How Debuggers Work : Algorithms, Data Structures, and Architecture, Wiley, 1996, ISBN 0471149667. 邦訳: デバッガの理論と実装,吉川邦夫訳, アスキー, 1998, ISBN: 4-7561-1745-7, 3500円. John R. Levine, Linkers and Loaders, Morgan Kaufmann, 1999, ISBN 1-55860-496-0.
114 :
コンパイラ屋(休日出勤) :2001/02/18(日) 15:40
そうそう,スクリプト言語ならこんな本もいいかもしれません. Randy M. Kaplan, Constructing Language Processors for Little Languages, Wiley, 1994, ISBN 0-471-59754-6.
115 :
コンパイラ厨房(83) :2001/02/18(日) 15:44
>>コンパイラ屋(休日出勤)さん 趣味でやる練習としては、既にある言語のサブセットを作ってみるのが 一番いいんでしょうか? たとえば、どうせ実用にはしないからということで最適化は後回しにして、 SchemeやCのサブセットとか。
大事な本をわすれてはおらぬか? 麻宮騎亜, コンパイラ1, 講談社,1999,ISBN 4062606100. 麻宮騎亜, コンパイラ2, 講談社,1999,ISBN 4062606119.
118 :
デフォルトの名無しさん :2001/02/18(日) 17:00
119 :
コンパイラ厨房 :2001/02/18(日) 18:29
インターフェース増刊でコンパイラ実装の特集号があった記憶がある んですが、あれはどうでしょうか?
120 :
デフォルトの名無しさん :2001/02/19(月) 19:45
age
Grail+プロジェクトで技術的援助を求めてるみたい。 2ちゃんで支援要請しなさい、それはあるから。 と書いてみる。
122 :
Yet another コンパイラ屋 :2001/02/19(月) 20:23
Grail+プロジェクトって何ですか?
本ばっか読んでてもしょうがない。 実践しろ。>コンパイラ厨房 スキルは後から付いてくるから。
本読むのはスキルのためではないと思うが。
コンパイラ厨房へ: とりあえずそこらへんの小さなインタプリタのソースを読め 自分でも何か作れ 本もきっちり読め 以上.下がってよし.
126 :
デフォルトの名無しさん :2001/02/20(火) 01:55
スクリプトエンジンってやっぱり最適化なんてサ行はしてないですよね? ソース書く人が自分で最適化するんですよね?
127 :
言い訳パターン1 :2001/02/20(火) 02:21
>>126 そこまで速度が要求される場面には使わないでください。
もしくはC言語で拡張してください。
とか。。。
128 :
デフォルトの名無しさん :2001/02/20(火) 02:31
言い訳というよりは、それをやったら「スクリプト」でなくなるという 感じではないかね。
129 :
126 :2001/02/20(火) 05:22
>>127 CGIとして使う場面でも速度を求められる場合があると思いますが…
どちらにせよ遅いより速い方がいいですし、
それに最適化って速さだけじゃないでしょ?
CGIって最適化してコンパイルされたものをどっかに保存してそれを実行みたいなふうにはできないのでしょうか?
CGIファイルが更新されたらまた再コンパイルして。
130 :
デフォルトの名無しさん :2001/02/20(火) 07:41
>>129 CGI自体のオーバーヘッドがそれなりにあるので、Java Servletを使う
方が得策です。
130につっこみいれてぇ…
132 :
デフォルトの名無しさん :2001/02/20(火) 09:35
挿れちゃってくださいな。>131 そして逝かせちゃってください。
さすがにネタだと思われ。
134 :
デフォルトの名無しさん :2001/02/20(火) 14:25
>>129 mod_perlは最適化はどうかは知らないが
メモリ上にperlスクリプトをコンパイルした状態で保持します。
135 :
デフォルトの名無しさん :2001/02/22(木) 02:57
アセンブラからCソースを吐くようなコンパイラ(逆コンパイラ?)ありませんか? 結構おもしろいとおもうんだけど、やっぱ難しいのかな?
でこんぱいら
でじこんぱいら
138 :
コンパイラ厨房 :2001/02/23(金) 18:39
>>123 >>125 じゃあ、とりあえずインタプリタを作るとして…
やっぱ、お約束通りSchemeからでしょうか?
139 :
デフォルトの名無しさん :2001/02/24(土) 17:22
>>138 実装は大丈夫なのか?
これくらい楽勝だろうな
問題:Cソースからコメントを抜き出し表示する関数を100行以内でつくれ
補足:ANSI-Cにのっとった全てのパターンで動作すること
(注:コピペ)
140 :
デフォルトの名無しさん :2001/02/24(土) 20:10
>>139 138->139の話の流れ方がよくがわからんのだが・・・
ANSI-Cにのっとった全てのパターンとは何?
コメントって/*...*/は良しとして、//は含めるの?
だったらネストとか行末の0x5cも頭にいれなきゃだめだねぇ...
141 :
コンパイラ厨房 :2001/02/25(日) 05:05
目的としては、あとで適当に使いまわして、自作ソフト用の組み込み スクリプト言語として使えるような言語の骨組みを作るということで。 Scemeって実装は楽そうだけど、自分で使いたいかって考えると… あんなカッコだらけのソースコード見たくないですよ、カテジナさん! ついでに愛用エディタの秀丸だと、対応カッコのハイライト機能も ないですよ、マーベットさん!
>>141 秀丸に対応括弧のハイライト機能はあるよん
>>142 ホントだ。
最近Visual Studioばっか使ってたから、鬱だ、氏のう。
とりあえずschemeのインタプリタ書いて あとでパーサだけ取り替えれば?
145 :
デフォルトの名無しさん :2001/02/26(月) 00:34
そういやLips/Schemeって、数式は逆ポーランド表記で括弧が必要ない のに、それ以外の部分で括弧だらけだよね。どういうポリシーだ?
○ Lips × Lisp
147 :
デフォルトの名無しさん :2001/02/26(月) 00:38
>>145 ?言いたいことがよくわからない。
LispもSchemeも1+2や10-5は
(+ 1 2)
(- 10 5)
こう書くよ。
逆だ…鬱。
149 :
145 :2001/02/26(月) 00:46
>>147 加減乗除の演算子優先順位と括弧のハ・ナ・シ。
中置法だと括弧を使うでしょ。
150 :
デフォルトの名無しさん :2001/02/26(月) 01:02
>>145 =149
それ以外ってどこよ?
元々括弧だらけですが、何か?
151 :
デフォルトの名無しさん :2001/02/26(月) 01:03
>>149 lispの括弧は優先順位と何の関係もないからなあ。
言ってることがわからない。
なぜ同列の問題として扱ってるのか。
152 :
デフォルトの名無しさん :2001/02/26(月) 01:11
Lisp/Schemeの構文の (+ 1 (- 2 1) 3 4 5) こういうのを中置記法で書くと、 1 + (2 - 1) + 3 + 4 + 5 になるけど、これとごっちゃにしてるんだろうね145は。
153 :
コンパイラ厨房 :2001/02/26(月) 05:23
皆さんがちょこっと使ってみるかと思うようなスクリプト言語って、どんな のでしょうか? Perlみたいに色んなところで使い回せる汎用言語じゃなく、秀丸マクロ みたいにソフト依存のad-hocな組み込み言語で、あまり覚えるのに労力 払いたくねぇ!って場合、 CやPascalっぽい言語(Algol系) Lisp/Schemeっぽい言語 BASICっぽい言語 上記が適当に混ざった言語(構文に一貫性なし) の中だと、個人的な好みではAlgol系なんですが… ちなみに構文の話です。
154 :
デフォルトの名無しさん :2001/02/26(月) 07:50
使ってるうちに覚えるとか 使ってるうちに慣れるとかってのはヤダな… スクリプトって手軽なのが瓜なわけだから 使いたいって時にパッとはじめられる感じのがいい。 個人的にはPascalが好きだけど。
155 :
デフォルトの名無しさん :2001/02/26(月) 16:35
PASCAL だったらこんなプロジェクトがあるそうですよ。
http://homepage1.nifty.com/ht_deko/ppa.html > PPA(Poor-Pascal for Application)はDelphi/C++Builder用のPascalインタプリタコンポーネントです。
> 1) Project-PPA(PPA-ML)に参加し、積極的にPPA開発に寄与すると約束する。
> 2) 1)が不可能な場合、Project-PPAに決められた金額(\10,000)を送金する。
ただ利用条件ちょっと厳しいんで、私のような低級プログラマでは
使いたくても使えませんけど(泣
156 :
デフォルトの名無しさん :2001/02/26(月) 18:03
PPAかー。俺も見つけて、利用条件で引いたよ。
157 :
デフォルトの名無しさん :2001/02/26(月) 21:58
初歩的な話ですみません。 flex bison 使い始めたばかりなのですが、 正規表現考えるのめんどくさぁ、 浮動小数点の表現みたいな、複雑怪奇なのとか 文字列みたいに複数行にまたがるとかそういったパターンは いやになりそう。 どこか正規表現集ってないかなぁ?
158 :
デフォルトの名無しさん :2001/02/26(月) 23:30
abcdefg.y contains 1 shift/reduce conflict うう
160 :
デフォルトの名無しさん :2001/02/26(月) 23:44
作(使)ってるうちに嫌でも慣れるぞ>155 その中だとLISP/Schemeはちょこっとしたプログラムなら完成するのが比較的早いと思う。
私も、アプリケーションのカスタマイズ用の言語が欲しくて 探したりしたりしてるのですが PPAに毛が生えかけたぐらいのが言語仕様的にも 手のひらにすっぽり収まる感じでちょうどいいと思うんですよ それか、UWSCのスクリプトかなぁ www07.u-page.so-net.ne.jp/ca2/umiumi
162 :
デフォルトの名無しさん :2001/02/27(火) 09:42
私は配布条件がゆるいので Python を使ってますけど、 付属スクリプトを梱包する必要があるのと、 実行速度が遅めなのがちょっと。
163 :
デフォルトの名無しさん :2001/02/27(火) 09:49
>>162 附属スクリプト?
なんで?そんなことライセンスに一言も書いてないよ。
>>155 なんだか凄い利用条件だ。
いろんな世界があるもんですね。
165 :
デフォルトの名無しさん :2001/02/28(水) 12:21
>>163 付属スクリプトで実装されている機能を使っているんだろう。
166 :
デフォルトの名無しさん :2001/02/28(水) 13:09
>163 165 C で言うところの標準ライブラリ的な機能が 付属のスクリプトで実装されているんで。
167 :
デフォルトの名無しさん :2001/03/13(火) 15:21
メモリー管理で、もっと賢い方法あったら教えてください。 文字列演算なんかで、たとえば %union { char * str ; } %token STRING <- flex の方は \"[^\"]*\" とかといった感じ %type <s> str exp: str ';' | ; str: STRING '+' STRING { $$ = str2( $1 , $2 ) ; } | STRING { $$ = str1() ; } ; %%
168 :
デフォルトの名無しさん :2001/03/13(火) 15:21
続き C言語側 char * str2( char * l , char * r ) { char * ret = new char [ strlen( l ) + strlen( r ) + 1 ] ; strcpy( ret , l ) ; strcat( ret , r ) ; delete [] l ; // もう使用しないので削除 delete [] r ; // もう使用しないので削除 return ret ; } char * str1() { char * ret = new char [ yyleng + 1 ] ; strcpy( yytext , yytext ) ; return ret ; }
169 :
デフォルトの名無しさん :2001/03/13(火) 15:21
続き とまあ、現在このようにしているわけですが、 見るからに、見てのとおりで、 メモリーの解放忘れの嵐を食らうはめになります。 皆さんはどのようにされてますか?
170 :
デフォルトの名無しさん :2001/03/13(火) 17:44
171 :
デフォルトの名無しさん :2001/03/14(水) 12:55
169 です。
>>170 すばやいレスどうもありがとう誤差います。
実は英語があんまり得意ではないのですが、内容はガベージコレクション
関連の内容なのでしょうか。
僕の例の場合、メモリを開放する必要のある瞬間は、より上位の文法の
ツリーが解決した瞬間なんですね、ですから何とかガベージコレクション
のような大規模なものを用いなくてもなんとか、いい方法が存在しそうな
気がします。
という訳で・・・
だれかそういった場合の良い方法、こんなのあるよとかないでしょうか?
172 :
デフォルトの名無しさん :2001/03/14(水) 12:57
std::stringつかえよ。
173 :
デフォルトの名無しさん :2001/03/14(水) 13:03
>>172 いきなりトンチンカンな事書くな、解決ぜんぜんせんやんけボケ
C++おぼえたてを自慢したい年頃なんでしょ(^^; ちなみに私はコンテナに登録する方式ですが、美しくない・・・ぅぅ
union にデストラクタと代入演算子がつけられたらと思う今日この頃。
176 :
170 :2001/03/14(水) 15:55
おぶじぇくてぃぶぅシーだああぁぁああ。たすけてー。
>>171 おれと同じじゃん。
しかし、なぜに Objective C な訳?
180 :
170 :2001/03/14(水) 19:02
181 :
かい :2001/03/15(木) 01:50
アプリのマクロ言語としてRubyを使うって手はないの? 実装が大変?
182 :
デフォルトの名無しさん :2001/03/15(木) 02:44
つーか、でかすぎ>181
183 :
デフォルトの名無しさん :2001/03/15(木) 08:28
>175 Unionのメンバを含むクラスじゃダメなの?
184 :
デフォルトの名無しさん :2001/03/15(木) 13:05
169 です。
>>174 コンテナクラス作って全部ほうりこむという方法ですか、
確かに手間は少しは省けそうですが、決定的な解決策には
なりにくそうですね。
昨日スタックのクラスを作って中身の取り出し用メンバ
を工夫してやってみました、これでかなりいけるような感じ
ですが、やっぱり決定打にはなってないです。
プロのコンパイラ屋さんのコード見てみたい今日この頃。
>>176 181
見てるこちらは、ちょっと困ったかも(笑)
185 :
169 :2001/03/15(木) 13:17
>>175 コントラクタとデストラクタがあればフック関数つくれるということでしょうか。
たしかにあったら使えるかも知れませんね。
>>184 ガベージコレクションでもいろいろ種類があるそうですから、
その中で一番実装が簡易なものを使うのが良さそうな気がします。
(トリッキーな方法を使うぐらいなら、ですが。)
187 :
デフォルトの名無しさん :2001/03/20(火) 00:22
コンパイラを作ってみたいのですが、 大学の授業とかで使われるような解りやすいソースで、 Cのコンパイラのソースってどこかにありませんか?
189 :
デフォルトの名無しさん :2001/03/20(火) 01:51
190 :
デフォルトの名無しさん :2001/03/20(火) 12:27
191 :
デフォルトの名無しさん :2001/03/20(火) 13:53
Cマガの99/10に昔のコンパイラに関する記事がCDに収録されています。 印刷しても字が読み取りにくかったから、 ディスプレイで読んでるけど、つかれるなぁ。 まだ読み始めですが、既に読み終えた方、どうでしたか?
192 :
名無しさん@こんせぷつ :2001/03/21(水) 15:20
>>188 この書籍のサンプルコードですね。
情報科学こんせぷつ8
コンパイラの仕組み
電通大 渡邊 坦著
SBN4-254-12708-1
A5判 196頁 定価(3,500円+税)
「問題解決に必要な技術を具体的に解説した実践書。(朝倉書店のページより)」
〔内容〕概要/字句解析/演算子順位/再帰的下向き構文解析/
記号表と中間語/誤り処理/実行環境とレジスタ割付/コード生成
/Tiny C/他
UNIXUSERの書評見て買ったら、いい本だった。巻末のコードは読みにくい
ので、
>>188 のサイトからゲットすべし。
193 :
デフォルトの名無しさん :2001/03/21(水) 16:01
>>192 初耳なんだけど、どこの出版社から何時出た本なの?
194 :
デフォルトの名無しさん :2001/03/21(水) 16:58
情報科学こんせぷつ〈8〉 コンパイラの仕組み ISBN:4254127081 185p 21cm(A5) 朝倉書店 (1998-04-01出版) ・野崎 昭弘・黒川 利明・疋田 輝雄・竹内 郁雄・岩野 和生【編】・渡辺 坦【著】 NDC分類:007.64 販売価:\3,500(税別)
195 :
デフォルトの名無しさん :2001/03/21(水) 20:04
tinyCはmips用のコードを吐き出すようですが、 これをpentium用に変えるにはどうしたらいいのでしょう? だれか講義してみない?
196 :
デフォルトの名無しさん :2001/03/21(水) 20:25
>>192 この本はなかなかわかりやすかったよ。
コンパイラの本を2冊読んだけど、断然そっちがわかりやすかった。
でも、あんまり深いことは書いてないんだよなぁ。
>>197 TinyCとMicroCって全然別物なんじゃ…
199 :
デフォルトの名無しさん :2001/03/21(水) 23:11
>>191 スキャン画像を無理やりpdfにしてるから
スクロールが重くてしかたない
なめてんのか、と思った
内容も浅いんで専門書読んだほうがいいでしょう
200 :
デフォルトの名無しさん :2001/03/22(木) 01:24
Zendはどう? と、流れをぶちきってみます
C--
202 :
デフォルトの名無しさん :2001/03/22(木) 23:27
今日、194の本立ち読みしてきた。 で、FirstとかFollowとかよくわからなかった。 それを使って表を作ってそれをもとにプログラム書くみたいだけど(LL(1))、 とりあえず意味はよくわからんかったけど、方法はわかったような…。 だれか、FirstとFollowの説明だれかお願いします。 金がないので買えませんでした。
203 :
デフォルトの名無しさん :2001/03/23(金) 00:51
Firstが、その非終端記号の一番初めに来る可能性のある終端記号の一覧。 Followが、その非終端記号の直後に来る可能性のある終端記号の一覧。
205 :
デフォルトの名無しさん :2001/03/23(金) 23:11
yaccの解説本だと、電卓とかCライクな言語が解説されている本が多いけど、 N88-BASICみたいな昔ながらのステートメントを並べるタイプの言語を yaccで解説している書籍orURLご存知ありませんか?
>>205 Cライクな言語でも、N88-BASICでも、必要な考え方は
同じだと思うけど。
207 :
デフォルトの名無しさん :2001/03/24(土) 16:23
>>206 Cライクだと、関数の引数とか省略できないのですが、N88-BASICだと途中の引数を
省略できたりします。その辺が一番の悩みどころなんです…。頭悪くてすみません。
208 :
デフォルトの名無しさん :2001/03/24(土) 16:39
>>207 そうですねぇ、こんな感じでどうでしょ。
Statement:
Statement arg_list {}
;
arg_list:
arg_list arg
;
arg:
ほげほげ {}
| {}
;
うまくでるかな、ちなみに私の黄金パターンです。
ちなみに書籍は見たこと無い(^^;
209 :
デフォルトの名無しさん :2001/03/24(土) 16:40
ぎゃぁ!!やっぱりつぶれた! 適当にスペースあると思ってみてね。
210 :
デフォルトの名無しさん :2001/03/24(土) 16:42
yacc&lexで FORI=0TO10STEP100のFORI=0をFOR I = 0と解釈して FORI=0をFORI = 0と解釈できるの?
211 :
デフォルトの名無しさん :2001/03/24(土) 16:45
もういっぺん、なんか間違ってるし・・・ Stat: Stat arg_list {} ; arg_list: arg_list ',' arg { 引数取り込み処理} | arg_list ',' ',' { 引数スキップ処理 } | arg_list ; さっきのより、こっちの方が簡単?
212 :
デフォルトの名無しさん :2001/03/24(土) 16:50
>>210 すみません、意味良くわかんないです。
詳しく説明してもらえれば答えられるかも?
213 :
デフォルトの名無しさん :2001/03/24(土) 17:01
>>210 なんとな〜く意味判ってきた、
要するに、先に FOR がくっつくのかという問題ですね。
それは lex に仕事させればいいです。
正規表現に後ろが hoge の時マッチするというやつあります(たしかあんまり使わないから忘れた)
それで {変数}={式}TOが登場するときに決定すればいいです。
214 :
デフォルトの名無しさん :2001/03/24(土) 17:12
まだ間違ってる(^^; arg_list: arg_list ',' arg { 引数取り込み処理} | arg_list ',' ',' { 引数スキップ処理 } | arg <- ここね ;
215 :
デフォルトの名無しさん :2001/03/25(日) 05:04
>>214 何度もありがとうです。アホなんで直ぐには理解できませんが、
レスを参考にして頑張ってみます!
216 :
デフォルトの名無しさん :2001/03/25(日) 15:38
yacc lex は、頭つかうより体つかってやってみてね。 どっかのクソ教授の書いた本なんか使えるようになってからでなきゃ理解できんものばっかりです。 まあ、コンピュータ関連のツールは総じて頭より体なんですが・・・
体育会系アホプログラマ発見
すまんねぇアホで。 でも実際頭で憶えられんもんって一体いくつあるんでしょ。 頭使えると云うのでしたら理屈書いてみたら? 論破してやろうか?
219 :
デフォルトの名無しさん :2001/03/28(水) 21:23
220 :
デフォルトの名無しさん :2001/03/28(水) 21:30
つーか、むしろ理屈わかっても使えなかったりするからな。
221 :
デフォルトの名無しさん :2001/03/30(金) 20:44
lexでレキシカルアナライザ生成すると遅いという話を聞きますが、 パーサはyaccで作るのと、LRとかで手書きするのとで速度にそれほど差が出る ものなのでしょうか。 手書きコードは極端に酷くなく、作るのはコンパイラでなくインタプリタを想定。 保守性は無視で…。
222 :
デフォルトの名無しさん :2001/03/30(金) 21:16
LRって手書きするものなの? LLとかならわかるけれど。
223 :
>221 :2001/03/31(土) 01:49
lexと手書きでは確かに速度に差がでまくるね。 まあトークン切り出しは比較的簡単だから手作業でも良い。メンテも可能。 yaccと手書きについては、複雑な文法をメンテする手間を考えたら yaccの方がよい。 再帰下降とかLL(1)のみで完結する文法なら手作業でもいいけど。 速度は手作業が有利なのには変わりなし。
Cライクなスクリプトエンジン考えてたんだけど、はたと気がつけば普通のC言語のプログラムと何ら代わらないと言うことに気がついた(鬱だ‥‥‥ ということで、スクリプトエンジンの利点って?
225 :
デフォルトの名無しさん :2001/03/31(土) 07:56
自分のソフトに組み込める
他人に技術力を誇示できる
228 :
デフォルトの名無しさん :2001/03/31(土) 10:10
ソフトを拡張してくれる人が出てくる
229 :
デフォルトの名無しさん :2001/03/31(土) 11:58
>>224 WZ editorのマクロがCライクだったような気が。
>>224 実行速度が遅い言い訳になる。
「いや、何せスクリプトで動作しているものですので・・・」
231 :
デフォルトの名無しさん :2001/03/31(土) 16:03
232 :
デフォルトの名無しさん :2001/03/31(土) 16:24
234 :
デフォルトの名無しさん :2001/03/31(土) 17:25
>>223 よほど特異でなければ、flex 程度でいいと思うよ。
文脈依存型の文法で語彙の意味がコロコロ変わるのは手書きにすると
てき面に効くような気がする。
あと、流し込み型ではなくて、う〜ん例えばタブの位置で文法が
決まるようなミョウチクリンな言語を作る場合とか、
例の上の方で発言されていた fori=0to の問題見たいなのとかは、変わると思うよ。
ちなみにタコが strcmp とか使って作った奴使うくらいなら間違いなく flex の方が
いや・・・lex でもその方が速い。
はっきりいって素人じゃ flex には勝てんです。
素直に flex で書いて、チューニングした方がいい。
235 :
デフォルトの名無しさん :2001/03/31(土) 17:27
236 :
デフォルトの名無しさん :2001/03/31(土) 17:41
237 :
デフォルトの名無しさん :2001/03/31(土) 19:11
bison/flexが出力するソースはなんであんなに汚いんだ。 C++/Java用のパーサクラスを出力するようなツールってないんかな。
238 :
デフォルトの名無しさん :2001/03/31(土) 19:26
239 :
名無しさん :2001/03/31(土) 19:31
逆にどうすれば美しいスケルトンになると思う? 漏れもジェネレーターやるから意見聞きたい。 lexでC++をサポートするのは文字コードの実装の 抽象化って意味で効果的だけど。
240 :
厨房 :2001/03/31(土) 20:28
その前に、きれい、汚いってどういうこと?
んこまみれかどうか
例:C++はんこまみれ
C++は んこ まみれ ? C++ はんこ まみれ ?
「んこ」って何よ。 うんこ?まんこ?ちんこ?どれ?
245 :
USO800委員会 :2001/04/01(日) 03:30
そんなの「げんご」に決まってるだろ。 嘘です。今日は4月1日です。
んこ:うんこまんこちんこの抽象クラス
247 :
デフォルトの名無しさん :2001/04/03(火) 13:40
んこあげ
他の派生クラス例 あんこ、インコ、援交〜、温厚〜、金庫〜、健康〜、参考〜、センコ〜 炭坑〜、天候〜、敦煌〜、軟膏〜、判子、メンコ、四個、ワンコ
んこ { public: &nbsp;&nbsp;static におい } んこ::におい = くさい;
んこ &大便(食い物) { if(食い物.量 > 腹八分) { if (rand()&1) throw 便秘; return げり; } return うんこ; }
251 :
デフォルトの名無しさん :2001/04/04(水) 23:07
>>234 だいぶ前の話なんですが…どうしても気になったもので
strcmpよりも高速な文字列比較の方法ってどのような物なのでしょうか?
自前でstrcmp相当の関数をinlineするとか、その程度しか思いつかないのですが
252 :
デフォルトの名無しさん :2001/04/04(水) 23:09
>>251 strcmpが遅いんじゃなくて、strcmpを正面から使うような
単純なアルゴリズムが遅いってことじゃない?
253 :
デフォルトの名無しさん :2001/04/05(木) 03:17
>>251 strcmpでバカ正直に比較していたら、
最悪用意されているシンボルの回数だけ比較することになるだろ?
だったら素直に決定性有限オートマン使っとけって事
254 :
>251 :2001/04/05(木) 05:01
hashがお手軽。 最適なのはトライ木かな。(文字単位で区切られた木を作る)
255 :
254>251 :2001/04/05(木) 05:07
あとスライド辞書圧縮(LZ系)とかのソース見るのもいいかと。
256 :
デフォルトの名無しさん :2001/04/05(木) 11:22
>>253 オートマトンの間違いだろ。
しかも251は構文解析ではなく字句解析の話をしているのでないのか?
lex を使えば字句解析もオートマトンになるにょ
258 :
251 :2001/04/05(木) 16:11
なるほど そういう意味の文章だったんですね 文意を誤解していました さすがに厨房な私でもstrcmpで逐次比較するような事はしないでハッシュ使ってます
259 :
デフォルトの名無しさん :2001/04/05(木) 16:20
260 :
デフォルトの名無しさん :2001/04/05(木) 16:21
ハッシュはお手軽だけど、すべての数値文字列とかといった 抽象的な対象に使えないので、字句解析にはちょいと向かないと思う。 やっぱオートマトンじゃないかな。
261 :
252 :2001/04/05(木) 16:25
ずっとオートマンだと思ってたよ、、、 人前で発言しなくてよかったぞ。 アリガト>256
262 :
256 :2001/04/05(木) 19:05
正規表現で字句解析か。 正規表現で字句解析するよりstrcmp使ったほうが速くないかな? 正規表現ってコンパイルしてバックトラックしながら文字列のマッチングしてたら結構遅くなるように思う。 NFAからDFA作って最短一致のみの正規表現にすれば高速になるのかな。 まぁでもコンパイルの時間がかかるのはあまり気にしないでいいか。 要は生成したブツが速く動けばいいわけだし。
263 :
デフォルトの名無しさん :2001/04/05(木) 19:49
正規表現は自分で実装した事ないんで実際にどの程度複雑なのか判りませんが 字句解析では、シンボルテーブルとハッシュ組み合わせています でも、最近のコンピュータは速いですから、よっぽど長大なソースでも扱わない 限りどちらでも大差ないような気もします・・・
264 :
monner :2001/04/05(木) 20:34
ええーっとですね、演算子ORを含む正規表現って 全部のパターンを同時に比較する というか、仮想機械が動いている可能性がゼロになるまで 入力を行っているだけなんでめっちゃ速いです。 ただしNFAの場合は実行中に仮想機械のタスクが 増化するような状況になる(2チャンオリジナル 正規表現ライブラリ参照)ので、実際の速度は低下します。 DFAの場合は実行する前にテーブルがパンクしなければ 最高のパフォーマンスで走ります。 (圧縮方式によっては速度の低下はあるが) 蛇足:DFAでデータベース組めればとんでもない速度 が出ますが、メモリーも天文学的容量になる
>>264 厨房ですみません。「2チャンオリジナル正規表現ライブラリ」ってなんでしょう?
267 :
>>264 :2001/04/05(木) 22:14
268 :
デフォルトの名無しさん :2001/04/06(金) 02:23
最近Cの標準ライブラリに正規表現使えるようにするライブラリが 追加されたと聞いたんですけど、本当ですか? 本当なら、どういう使い方をするんですか?
regcmpとかはかなり前からPOSIXの標準だろ。 man -k regcmp ただ、漢字対応しっかりやってるシステムは 意外と少ない。
270 :
デフォルトの名無しさん :2001/04/06(金) 13:19
>264 超高速字句解析の話 最近字句解析の高速化をしていて思ったことですが、テーブル圧縮はむしろ有効に働くことが時にあります。 理由はおそらく、キャッシュとメインメモリの間のスピードのギャップでしょう。 なにしろ最近はアクセスタイムのギャップが10倍を超えようとしてます(もう超えてるのかな?)、こうなってくるとせっかくの工夫がこの問題で一発で台無しになってしまいます。 ゲーム屋あたりではバスボトルネックっていってヒイヒイいってます。 それで自作物字句解析は、より小さいテーブルを作るアルゴリズムを中心に私は考えています。 まあ、そんなことしてまで高速化してるのは精精、とあるCGツールのプラグインが掃き出すクサレギガバイト級テキストファイル(んなもんつくるなぁぁぁ)のパースくらいなもんでが。 >262 ちょいと横槍 lex だというなら正規表現のコンパイル時間は関係ないよ。 あとは monner 氏(女史?)の書かれてるとおり。
271 :
デフォルトの名無しさん :2001/04/12(木) 16:18
272 :
デフォルトの名無しさん :2001/04/12(木) 18:07
へ...へぼすぎる
>>271 だれか構文解析という言葉を教えてやれ
>>271 落せない。なんでtext/htmlなんだ。
つーか、なんだPLATHOMEって。
>>271 ,272
人が一生懸命つくってるのをそういうふうにするのは嫌いだな。
275 :
デフォルトの名無しさん :2001/04/13(金) 12:24
276 :
271 :2001/04/13(金) 13:54
>>274 私は紹介しただけなんですけど・・・
Webで公開されているものを紹介しちゃダメなの???
ていうか、2chで紹介するってのは、ある意味そのサイトに対する 攻撃だよな?
279 :
271 :2001/04/13(金) 14:32
そーですか・・・じゃあ削除願を出してきますよ。 すいませんでした。
281 :
デフォルトの名無しさん :2001/04/14(土) 03:24
攻撃になるかどうかはサイトの内容と、紹介された時の 2ch側の状況によるけどな。
>>271 なるほど、こういう計算をやっているから皆が口をそろえて
「Lispは遅い、メモリを食う」って言うのか!(w
でもさらっと目を通したところ、とりあえず
動作に関しては致命的な問題はなさそうだったぞ
(だよね?)。
作者の苦労が偲ばれ、思わず目頭が熱くなったのは
俺だけだろうか・・・
283 :
デフォルトの名無しさん :2001/04/14(土) 10:48
>>271 -272を攻撃ととるか意見ととるかでその作者の資質がわかるな。
LISP系はガベコレ前提だからね・・ ところでLISP系でガベコレしない(必要ない)実装ってあるのかな?
やべ、hageてた・・
やーい、ハゲハゲ〜
288 :
272 :2001/04/14(土) 15:20
>>287 こんな恥ずかしいものを公開できる心理を教えてくれ
>>280 >>287 私はFlameを起こすような真似はあまり好きではないですし、
折角のいいスレが打ち止めになるのも嫌なので。。。
みなさんマターリ逝きましょう。
291 :
デフォルトの名無しさん :2001/04/15(日) 17:13
Lisp系の実装は仕事ではたまにやりますが、 物作るときに不便でないですか>皆様? いや、だめっちゅうんじゃなくて、LISPで ゲーム作ってる人もいるし、便利だと思ってる 人がいるなら、ちょっと使える風につくろうかなぁと。
292 :
252 :2001/04/15(日) 17:58
javaとRubyの中間くらいの言語希望 いや、今書いてるんだが、ハジメテなのも手伝って あまり思うように逝ってないんだよね。
293 :
>291 :2001/04/15(日) 18:25
LISPの良い点はリストが簡単に書ける所なんだけど、それ以外は結局 Cとかで組み込み関数作ってそれを呼出すだけになってしまう。 Schemeだと環境のコピー(保存)も発生するから、長々と定義書くのを躊躇したくなる。 それ以前にガベコレの問題があるからねえ・・ (大規模になると探索のコストが結構かかる) リアルタイム処理に向いてるとは言えないかな
294 :
デフォルトの名無しさん :2001/04/21(土) 20:27
>294 じゃ、やめとけよ
296 :
294 :2001/04/21(土) 22:07
言語的にイケてますか? もし学ぶ価値のあるものなら頑張ろうと思うのですが....
知るか
298 :
デフォルトの名無しさん :2001/04/22(日) 21:07
何でもかんでも他人の影しか追えんような、開拓者精神に
欠ける野郎はプログラミングなんかやるんじゃねぇ、と
>>295 ,
>>297 さんは仰ってます。
切り番get!
301 :
入門者 :2001/04/25(水) 00:38
yacc系パーサ自動生成ツールで、ツールの使い方でなく、文法定義の方法というか コツについて詳しく述べられている書籍をご存知の方居られませんか? 啓学出版の、Cコンパイラ設計 という本が良いと聞いていましたが、 絶版で入手できませんでした。よろしくお願いします。
図書館使えば? あとはこのスレの前に方に十分紹介されてると思うけど。
>>301 Java 言語仕様書にも付録的に何か書いてあったような。
304 :
デフォルトの名無しさん :2001/04/25(水) 21:04
タイトルが動物の本がいいと思います。 アスキー出版からでてます。 Bison 入門 石川直太訳 大きな本屋さんなら置いてあるとおもいます。
切り番get!
アレ内容に割に高い。1500円だけど あれの元文書オンラインでどっかにあった様な・・
内容の
308 :
デフォルトの名無しさん :2001/04/26(木) 17:35
309 :
304=308 :2001/04/26(木) 17:37
おお、bison は日本語化されてない(笑)
310 :
デフォルトの名無しさん :2001/04/26(木) 17:39
311 :
301 :2001/04/28(土) 18:36
失礼しました。 過去ログで紹介されていた本を図書館で探してみました。洋書は読めないので、和書だけですが、 ・C stepupシリーズ(3) yaccによるCコンパイラプログラミング ソフトバンク ・プログラミング言語処理系 岩波講座ソフトウェア科学5 ・計算機科学/ソフトウェア技術講座7「コンパイラの理論と実現」共立出版 が、ありました。まだ、ざっと目を通しただけですが、残念ながら文法定義の手法そのものについてはあまり触れられていないようです。 そこで、やはり、啓学出版のCコンパイラ設計という本を入手したいと思いまして、古本屋に行こうと思います。ここは田舎で大きな古本屋などないため、大阪まで行こうと思いますが、こういった専門書がありそうなお店をご紹介いただけませんでしょうか。
すいません、スレ違いだったのにageてしまいました…。
313 :
デフォルトの名無しさん :2001/05/01(火) 20:59
314 :
デフォルトの名無しさん :2001/05/02(水) 02:14
ユニコードと C++ OPP に対応してる flex/bison 処理系ってありますか? ライブラリ化されてるとうれしいんですが.. どちらも C 時代なのでソースコードが汚いんですよね
flexにはC++のスケルトンは用意されていて使える。 実装したけれど使うメリットがないというコメントがtarに入ってる。 lexはマルチバイトパッチのやり方やテーブル構造の工夫で UNICODE対応は可能だけど、 ただ対応しただけではテーブルサイズが爆発的に増える。 たとえばマルチバイトパッチの仕組ではA+を(A)+に置き換え、 [AB]を(A|B)に置き換えるものがある。 またjava用のもののソースも見たけど、0x100以上のコードの 処理が実装されてなかったり、テーブルの圧縮の部分が シングルバイトのものと同じのしか見てない。
316 :
デフォルトの名無しさん :2001/05/02(水) 17:22
>>314 ほんと、これ欲しいんですよね。
だ〜れも作らないし、えっお前作れって(^^;
ひまできたら冗談抜きで作りたいんだよなぁ。
#flex の C++ 版・・・ありゃほんと〜に使えねぇ。
#作った本人も爆死してるんじゃないだろうか(笑)
#あれは、クラス化するよりも、テンプレート使って抽象アルゴリズムにするのが
#正攻法なのかもしれないと思ってます。
317 :
314 :2001/05/02(水) 19:28
>>315 ありがとうございます。大変勉強になります。
考えてみると yacc/bison は特にユニコードに対応する必要なさそうですね
flex のスケルトン見てみたのですが、なんて言うか・・
これって OOP じゃないような..感じです(^-^;
>またjava用のもののソースも見たけど
JFlexでしょうか? u100以上は処理しないのは keyword が実質 ASCII と等価な
マッピング部分限定になっちゃいますよね。一応、ASCII だけでも使えますけど・・
utf8 に適当に変換して騙しながら使うことになりそうです。
BMP 超えたコードが来たらこれもアウトですが...
318 :
314 :2001/05/02(水) 20:03
>>316 はいです。作れるなら作りたいんですけど
時間と才能と経験がほしいところです... (^^;
理想としては flex source -> intermediate code になって
flex object がそれ読んで処理してくれれば.. って感じなんですが..
319 :
名無しさん@1周年 :2001/05/02(水) 23:29
javacでのエラーの時、MS-DOSプロンプトって どうやって、スクロールさせるの?
>>319 Win95/98のコンソールは、スクロールできません。
エラー出力が見たいなら、ファイルに出力を書き込んでからそれ見てちょ。
WinNT、Linuxとかなら標準エラー出力をファイルにリダイレクト。
Win95/98はリダイレクトできないので、ソースの中でPrintStream
開いて、System#setErr()で標準エラー出力をそっちに変更しちまえ。
あげよう
322 :
デフォルトの名無しさん :2001/05/04(金) 06:54
>>319 javac -J-Djavac.pipe.output=true Foo.java > error.txt
323 :
デフォルトの名無しさん :2001/05/04(金) 19:32
324 :
デフォルトの名無しさん :2001/05/14(月) 12:45
墜落ピンチ!!サルベージあげ
325 :
デフォルトの名無しさん :2001/05/14(月) 13:25
>>314 構文解析器は兎も角、字句解析器は自力で作っても大して
時間変わらないんじゃない?極端に複雑なのは別にして。
C言語くらいのなら数時間あれば一通り作れるでしょ?
少なくとも325には無理だ。(藁
>数時間 すごい、私もできないことないと思うけど、数時間で作れとか言われたら 血尿でるかも。
>>327 字句解析器ならすぐ作れないか?
仕様はK&Rでも見ればいいし、lexerは決まりきった書き方があるし。
とはいえ、設計から完成までで数時間で作れといわれたら丁重にお断りするけど(笑
実コーディング時間が数時間なら同意。
329 :
デフォルトの名無しさん :2001/05/17(木) 11:58
>>327 lexがやってるのと同じように1文字読むごとに状態遷移して、ってのは無理だけどね。
一度数字がきたら、A〜F以外の非数字が来るまで数字として読む、シンボルの先頭に
許される文字がきたら空白や記号を読むまで、シンボルとして読む、って感じで。
漏れも字句解析は手書きだよ。日本語を扱えるようにするにはこれが一番。
K&RのBNFみたって数時間で作れるのかねぇ。甘いよ。 全然C言語がわかってない。
数時間で作れない330はタコプログラマー
332 :
デフォルトの名無しさん :2001/05/17(木) 13:30
333 :
デフォルトの名無しさん :2001/05/17(木) 14:06
>>330 字句解析器と構文解析器の違い知ってる?
自分は優良プログラマだと言いたいなら、数時間で作れる などと言わない方が賢明です。(藁
336 :
デフォルトの名無しさん :2001/05/17(木) 18:54
<数> ::= <数字>* <数字> ::= 0|1|2|3|4|5|6|7|8|9
337 :
デフォルトの名無しさん :2001/05/17(木) 19:11
+ 鬱駄根用
338 :
デフォルトの名無しさん :2001/05/18(金) 07:25
僕もコンパイラに興味があるんですけど、本などを読むと <数> ::= <数字>* 336さんが書かれたような表記をよくみます。これって どのように読むのでしょうか?
BNF 表記
EBNF 表記
結合規則
優先順位
lex yacc bison
などで検索
>>338 現行の言語の仕様書や本とかには必ず付いてると思いますが。
<数> ::= <数字>* <数>は<数字>の後に*がついたもの???? 頭痛い
「どのように読むのか」って、どのように発音するのか?って意味かと おもたよ。 「山カッコ 数字 山カッコ閉じ スター」ってかんじでしょうか
<数> ::= <数字>* <数> ::= <数字>{<数字>} <数> ::= <数字>|<数> <数字> どれがいいのですか
344 :
デフォルトの名無しさん :2001/05/19(土) 02:05
>340 *は0回以上、+は1回以上の繰り返しじゃなかった?
345 :
デフォルトの名無しさん :2001/05/19(土) 02:07
>343 3つ目はそのままでは実装しにくい。
346 :
345 :2001/05/19(土) 02:08
間違えた、スマソ
347 :
デフォルトの名無しさん :2001/05/20(日) 07:58
あげておく
348 :
デフォルトの名無しさん :2001/05/21(月) 18:47
じゃあ俺も
349 :
困憊羅 :2001/06/01(金) 02:00
Cでpascalコンパイラをつくったソースがのってる本とかないですかねー
350 :
デフォルトの名無しさん :2001/06/01(金) 02:11
351 :
困憊羅 :2001/06/01(金) 15:18
352 :
デフォルトの名無しさん :2001/06/01(金) 21:10
コンパイラを作る方法 生越 って本がまさにそれ>351
353 :
age :2001/06/04(月) 06:05
ねぇ、話題つきた?
今ないだけ、そのうちでてくる。
355 :
おしらせ :2001/06/11(月) 14:49
もっとマシなものなら考えるけどなー こんな誰でも作れる程度のものを公開するなよ
357 :
デフォルトの名無しさん :2001/06/13(水) 19:04
構文解析ってあるじゃないですか? 具体的にどんなコードをはけばいいんですか?
358 :
名無しさん :2001/06/13(水) 19:27
基本は構造をトレースすること。 1+2*3は ADD(1, MUL(2, 3))という構造、 IF COND THEN STMT1 ELSE STMT2は IF(COND, STMT1, STMT2) トレースのやり方は 入門書に有るけど、 X ::= A B; というパターンの定義があると スタックにAとBが乗っかると Xに変換するという仮想機械を造って実現する。 2つ目の条件式 Y ::= X B でABBがスタックにあると最終的にYという結果になる. 続きがいるならまた後で。
359 :
デフォルトの名無しさん :2001/06/14(木) 07:39
つまり、仮想機械の設計次第でコードが変わるということですか?
構文解析は関係ないんじゃない? 構文解析は構文木作って終わりだよね?
361 :
デフォルトの名無しさん :2001/06/14(木) 09:54
蛇足だが、 構文解析の結果が木になるとは限らないぞ。 たまたま木になる文法の言語かどうか?ということだ。 たとえばForth系言語だと木じゃなくフラット構造にしかならない。 木をバイトコード(フラット)形に展開する手順を ユーザーがやってくれるようなもんだからな。 木になる文法のほうが人間様にとってはふつー快適だとは思われるが。
362 :
デフォルトの名無しさん :2001/06/14(木) 15:03
アセンブラもフラットだ。 木になる文法、言い換えれば構造化された文法かね。
363 :
デフォルトの名無しさん :2001/06/15(金) 13:39
アセンブラはフラットじゃないだろ。 ニモニックとオペランドという構造もってるから。
確かにそういわれればFORTHの方が単純だな、、
365 :
デフォルトの名無しさん :2001/06/16(土) 01:40
>>363 汗は、1行の範囲内では構造を持った文法だ、とでも
呼ぶべきなのかも。
上下方向は…ありゃアセンブラという言語(?)から見れば
あくまでセマンティックの問題でしかないよねえ?
どこへどう飛ぶかは100%プログラマの責任であって
「アセンブル」エラーで教えてくれたりはしないという。
>>364 言語処理系作るの、マヂ、楽よ。
厨房の夏休みの自由研究の題材でもいいくらいに、楽。
他にも楽な言語は多いだろうけど、
構文というものを"いっさい"処理しなくていい言語なんてのは
Forth系くらいしかないんじゃないかな。
>>365 Forthってどういうコードになるんですか?
後置記法って事しか知らないから、簡単に解析きぼん
解析じゃなくて解説
>>368 実用レベルの汎用言語を作るのは難しいが、
機能を絞った処理系なら本当に楽だぞ。
lex+yacc使ってインタプリタで最適化なしとか。
>>365 Forthってどういうシンタックスになるんですか?
後置記法って事しか知らないから、簡単に解説きぼん
ForthとFortranを読み間違えたよ・・・。鬱だ。
372 :
デフォルトの名無しさん :2001/06/16(土) 11:57
Forthは知らぬけど、同類だといわれてるPostScriptについて。 ひたすら「オペレータ」つまり単語を並べる。それだけだ。あれの文法は。 それを計算機(言語処理系)が順に処理する。それだけだ。 だからlexは使うとしてもyaccは要るかどうか怪しい。 1 2 add print ってのはそれぞれ、 1を記憶する(記憶場所としては御存知Stackを使う) 2を記憶する 1つ前の記憶と2つ前の記憶を取りだし、足し、記憶する 1つ前の記憶を取りだし、画面出力する (printってのは標準OPじゃないが、説明用 って意味。機械はそれぞれを順に実行するだけ。 味噌は、「どの単語がどの場面で出たか?」なんてことを 機械はいっさい感知(&関知)してない、ってことだ。 ふつーの言語は関知する。*がポインタなのか掛け算なのかとか、 ,が引数区切りなのかそうじゃないのかとか、を考える。 で、PSには、それが無い。そういう意味ではアセンブラと同じだ。 なにがどんな順で出たかの責任はプログラマが負う。 { 1 2 > } { 1 print } { 2 print } if {と}は、実行ブロック(実行可能配列ってのが正式名称。 つまりプログラムも所詮はOperatorの配列に過ぎぬ。 実行可能だというフラグがONになるだけ)としての 切りだし処理を開始する/終了する、という、これまた単なるOP。 ifは、3つ前に記憶したブロックを評価し、 真なら2つ前のブロックを、偽なら1つ前のブロックを、評価する という、これまた単なるOP。 それ以外のヒネリは、いっさいなし。 /aaa 1 def /bbb {1 print} def defは、2つ前のシンボル名で、1つ前の値を、「辞書」に登録するというOP。 aaaというシンボル名で1を登録。 bbbというシンボル名で{1 print}という実行可能配列を登録。 /aaa 1 def aaa print >>>>> 1 3 dict begin /aaa 2 def print end >>>>> 2 aaa print >>>>> 1 dictは容量n個の辞書を作って記憶するOP。 beginは1つ前の記憶を取りだし辞書Stackに記憶するOP。 endは辞書Stackのtopの辞書を捨てるOP。 Stackが1つ増えた(辞書Stack)だけで、ローカル変数も実現。 名前(変数名?)解決の規則は、辞書をStackのTopから順に下に 検索するというもの。TOPで空振りしたら2つ目に当たる。 言い忘れたがStackは、OperandStack(さっきから記憶記憶と書いてるあれ) と辞書Stackが有る。他にGraphicに特化したStackもあるが本質じゃないんで割愛。
373 :
デフォルトの名無しさん :2001/06/16(土) 14:34
>つまりプログラムも所詮はOperatorの配列に過ぎぬ。 結局、コンパイル(?)されると、 プログラム全体がソース見たマンマの順序の 巨大な実行可能配列になる、と考えるとすっきるする。 バイトコードならぬオペレーターコードとでも言うのかな。 ん?おぺこーど? まぁただ、{}ぐらいは実行時じゃなくコンパイル時に解釈する ようにしたほうが、実装は楽かな。 そうすると結局コンパイル結果は、ひたすらまっすぐなコード配列、 ではなくて、時折サブルーチン呼び出しの枝が伸びた 木のような形のコードツリーが、内部的に出来あがる。 木といっても構文木の木とは全然違う形&意味だ。 構文木は実行順序に対して垂直に刺さった木(の根?)みたいな感じ だが、上記コードツリーは実行順序に沿わせる向きに寝かせた木 という感じだ。 それと今更だが、というか見れば判るが、 実行可能配列つまりルーチンもまた FirstClassObjectになっているわけだ。 実行の区切りが見えない(あくまでOPの処理内容に依存)ので やりたくはないが、死ぬ気でやろうと思えば恐らく Lispと同じ位(ってLispは知らぬのだが)の 記述能力はあると思われ。
374 :
デフォルトの名無しさん :2001/06/16(土) 19:03
lispぐらい知っっててほしいけど・・ 形としては、 (func param param ...) 基本的にこれしかない。 syntaxも例えばifなら (if test-expr true-expr false-expr) つまり先頭がfuncやifの様なシンボルで、 それが何かに関連付けられていればその文を実行できる。 関数だとparam部分が全て評価されてから関数に渡るけど、 ifの様なsyntaxの場合は部分的に評価される test-exprを評価し、真ならtrue-exprが評価される偽ならfalse-expr 無名関数 ((lambda (x y) (+ x y)) 1 2) =>3 これは、2引数を取る無名関数。 (lambda (x y) (+ x y))がfuncに対応し、1 と 2がparamに対応する (define func (lambda (x y) (+ x y))) と定義すれば (func 1 2) 3 で普通の関数と同じ結果になる あとはこれの応用。 処理系はforthに次いで簡単に書ける。
375 :
デフォルトの名無しさん :2001/06/16(土) 19:38
>lispぐらい知っっててほしいけど まぁそう言うな。PSだって知らぬ人多いだろう。 Lispほど知る必要無いというのもある意味真実だが(藁 前置か後置かの違い、 前置を実現するためのカッコが有るかないかの違い、 その2つ程度なんだろうな、LispとPSの差は。 両者の中間みたいな感じの言語を 作ることは{できる,試みる意味(藁)は有る}か?ってのが 今ちょっと感じている疑問というか興味。 どうなんだろう?ていうかナニをもって中間なのかも よく判らないのだが… >無名関数 {add print} 1 2 1 1 rot ####Stack上の積み順を「回転」させるOP。これで無名手続きがTOPになるよね? execute ####StackTopのポインタ(?)を「実行」するOP。 こんな感じか。Stack処理手順を手作業しないとならんのは ちとダサイところ。
376 :
デフォルトの名無しさん :2001/06/16(土) 22:45
>>374 lispは他にリスト操作もあるからね。quoteの概念を理解できるか
どうかってのがある。(使い続けていれば自然に身につくけど)
>>375 繰返しは
{test-expr} {body-expr} while
ですか?
「{test-expr} が真の間 {body-expr} を繰り返す」
と書けますね。(これがMIND?)
>両者の中間みたいな感じの言語を
間をとると中置記法?
lispは式をリストと見なす事ができるので、中置記法は後づけで作れます。
forth系でのやり方は知りませんが、多分同様な事が可能でしょう。
所でforth系はスタックを直接操作するからgcみたいな機構は必要無い?
作りたくなってきた。
377 :
デフォルトの名無しさん :2001/06/17(日) 00:46
もうあんまり覚えてないんだが…。 たしかforthだとimmediate wordってのがあって、 これはcompilation mode(だと思った)でも動作する。 それ以外のwordは、compilation modeだとそのword自体が走るんじゃなくて そいつへの呼出にcompileされる。 : func (: はcompilation modeに入るword) 1 2 + ; (; でcompilation modeを抜ける)
378 :
デフォルトの名無しさん :2001/06/17(日) 06:29
Forthはなかなか日本語の資料(文法とか)が検索でみつからない。 見つかった処理系は Portable Forth GNU ANSI Forth SCMForth (Schemeで書かれたサブセットらしい) あとはPostScriptで検索した方が早いかな?
381 :
デフォルトの名無しさん :2001/06/17(日) 13:01
>>376 PSでリストの代用になりそうなものを探すとすると
配列と辞書くらいかな。サイズ2の配列か辞書を作ればいい。
まぁ言語が直接支援してくれないんで辛いけど。
同様に、Objectの代用になりそうなものも
配列か辞書だな。勿論これも直接は使い勝手悪いが。
>{test-expr} {body-expr} while
んな感じ。whileそのものは無いけど
似たようなのは有るし当然自作も可能。
>間をとると中置記法?
なんか違うような気がする(^^;
>所でforth系はスタックを直接操作するからgcみたいな機構は必要無い?
Stackゆーても(PSは)Stackに記録される値はあくまでPointerなので
あるObject(文字列にせよ辞書にせよ配列にせよ)が
複数箇所(StackやArrayやDict)から同時に参照されることは有るし、
そういう意味ではリファレンスカウントだけじゃ循環参照が云々…
とかいうアッチ方面の問題は、同じように全部抱えてると言えます。
面倒ならboehmGCだな(藁
>>377 それって、インタラクティブに(BASICみたいに)ソースを
1行づつ入力&実行するモードと、そうでないモードとを
うまく使い分けるための機能、でもあるわけですよね?きっと。
直接関係ないがPSにはbindというOPが有るらし。
/aaa { 1 2 add foo } bind def
と書くと、1つ前の実行可能配列の中の
アドビ(藁)定義済みOPを、その名前への参照じゃなくて
実行実体(?)への参照に置換してくれるそうだ。
ここではaddがソレだな。
これで実行が少し速く効率的になる、らし。
定義済みOPをどっか別のReadOnly辞書で一元管理してる模様。
まぁ類似実装系を自作するときには、面倒なら省ける機能の
筆頭でもあろうけど(藁
383 :
デフォルトの名無しさん :2001/06/17(日) 18:40
急にアツイ議論がage
384 :
デフォルトの名無しさん :2001/06/18(月) 00:39
トランスレータも面白いよ
>>382 > それって、インタラクティブに(BASICみたいに)ソースを
> 1行づつ入力&実行するモードと、そうでないモードとを
> うまく使い分けるための機能、でもあるわけですよね?きっと。
いや、Forthにはインタラクティブかどうかって区別はほとんどなかっ
たような。
immediate wordっていうのは何をするためのものかというと、例えば
ifならまず条件ブランチ命令をおいて、そのアドレスを記憶しておく。
そのあとthenで条件ブロックが終ったところでブランチ命令のところ
に終端までのオフセットを書き込む。
つまりほんとにコンパイラのコードジェネレータと同じようなことを
したりするためのもの。
> アドビ(藁)定義済みOPを、その名前への参照じゃなくて
> 実行実体(?)への参照に置換してくれるそうだ。
つまりデフォルトでlate bindingなのをその時点でbindしちゃうわけ
ね。Forthはlate bindingじゃないし、前方参照も許してないからそう
いうのはないけど。
Forthの実装もいろいろで、小さいwordはその場にインライン展開して
しまうのとかもあったはず。
おもしろいのは、m68000用でipにA7レジスタを使うやつ。各wordの終
りにはrts命令がおかれてる。
386 :
デフォルトの名無しさん :2001/06/18(月) 02:50
forthの条件式if then else これの文法がよくわかりませんでした。 そこで、問題 (a) if (b) else (c) then (d) (a)〜(d)は式とします。 例えば、(a)〜(d)にそれぞれ何が入るんでしょう? また、条件式と関係の無い式を(a)〜(d)の中から選びなさい。(15点)
(a) 条件式 (b) (a)が真のときに実行される式 (c) (a)が偽のときに実行される式 (d) 条件式と関係の無い式
ありがとうございました。
>>387 やっぱり条件式はifの前に書くんですね。
thenの位置が謎ですが。
389 :
デフォルトの名無しさん :2001/06/24(日) 13:48
あげ
Forthって、データもアドレスも16bitだったときはエレガントな設計だと思ったけど
やれ倍精度整数だ実数だとかいいだしてから、ちょっとうざくなってきた
インタプリタもワードを並べて置いただけの頃は数バイトで済んでたのにね
何やかんや言っていても、私は今でもあこがれてるな
http://www.forth.org/ FIGなんてまだあったんだなぁ
391 :
デフォルトの名無しさん :2001/06/29(金) 06:02
lispはC言語の関数呼出しだけで構成されてると思えば、 ほぼ同じ見方ができるけど、 C言語 a(b(c())); lisp (a(b(c))) forthはスタックが丸見えだからc b aという感じに記述するから違和感あり?
>>391 forthは境目がないのが痛い。
どっからどこまでをどう括って解釈すべきか?は、
あくまでコンテクストと意味に依存するから、
コードを理解できるかどうかは
ほぼ語彙の知識の有無に依存しちまう。
人間様には痛い。
age
394 :
デフォルトの名無しさん :2001/07/08(日) 18:24
WindowsのGUIインタフェース持たせてる処理系って、 コールバック関数の辺りとかはどうやってるの? 例えばWNDCLASSに登録するコールバック関数とか。 やっぱり内部で専用に作ったCのコールバック関数を用意してるのかな?
>>394 どの処理系?
まあ、処理系がサポートしてその部分を隠してるなら、何だかの方法で
フックしておく必要はあると思うけど・・・
内容としては若干スレ違い気味?
396 :
デフォルトの名無しさん :2001/07/09(月) 00:58
>>395 えーと、WindowsのGUIをサポートしてる処理系の事です。
(メジャーなスクリプトや言語の処理系はほとんど対応してると思いますけど。)
CALLBACKやWINAPI(__stdcall)の関数を引数のつじつま合わせて呼び出すのって、
Cでそのままの型でテンプレート持っておくか、アセンブラで書くしか無いですよね?
Cの関数にしちゃうと、コールッバックの形だけ関数定義が必要になってしまうんで、
他にいい方法が無いか探してます。
アセンブラでやるしかないですかね。
LRESULT CALLBACK WndProc(HWND hwnd, UINT m, WPARAM w, LPARAM l)
というコールバックだったら
引数は、
8[esp] ;hwnd
12[esp] ;m
16[esp] ;w
20[esp] ;l
戻り方は、
ret 16
としないといけないみたいなので、引数やret xxxの決定をどうやって
動的にやるのかがわかれば良いんですが。
398 :
デフォルトの名無しさん :2001/07/09(月) 07:00
>>394 多分、GUIの作成をサポートした処理系のことを言ってるんだと思うけど、
スクリプトで動的に生成されるプロシージャーは全ウインドウ共通にする。(ウインドウのタイプごとに分けてもいい)
内部で処理したいメッセージ等は共通のプロシージャーに直接書く。
HWNDをキーとしたハッシュテーブルを作っておき、CreateWindowしたあとに戻り値のHWNDと必要なデータ(多分メッセージがきたときのスクリプトの飛び先の情報なんかになるかな)とともに保管する。
どのウインドウからのメッセージなのかは第一引数のHWNDでわかるから保存しておいたハッシュのデータをもとに適切な処理をすればいい。
(ボタンなどの子ウインドウからのメッセージの場合はWM_COMMANDのlparamがメッセージの送り元になるので注意。)
こんな感じでどうでしょうか
訂正 スクリプトで動的に生成されるプロシージャーは ↓ スクリプトで動的に生成される"ウインドウの"プロシージャーは
>>396 混乱してませんか?
とりあえず簡単なインタプリタ(コンソールベースがいいと思う)を作ってみてはどうでしょう。
コンパイラであれば、その部分はテンプレート的に生成しておいて、あとで命令スケジューリングして
依存関係を考慮しつつ並べ替えます。
スクリプトの場合は考える必要はないです、やり方は 398 さんのやり方が妥当だと思います。
>>400 あなたも混乱してません?発言がdel厨房っぽいぞ(藁
402 :
401 :2001/07/09(月) 09:21
アゲときます。
403 :
401 :2001/07/09(月) 09:25
私も混乱気味、スクリプト−>インタプリタ(自爆
>>400 もしかして、サンク方式なんかやばいですかね。
405 :
デフォルトの名無しさん :2001/07/09(月) 13:34
>>401 てゆーかまんまdel亡です。
delにおいてくだんの問題はこう解決されてる、っていう頁ね。
>>404 -405
特許頁見たら、del発売の頃から申請して
今ごろやっと通ったという特許らしい。
とはいえ、ふつー誰でもやる技法だと思うんだがな。
ヘジ(delを作った人らしい)もヤキまわったか(わら
407 :
396 :2001/07/09(月) 21:04
みなさんありがとうございます。
汎用性を考えて、コールバック関数のアセンブラコードを動的に生成する事を
考えています。
例えば、RegisterClassをインタプリタで実行するときに必要な、
WNDCLASS構造体のコールバック関数を設定する時、
インタプリタ言語側のシンタックスで
LRESULT func(HWND, UINT, WPARAM, LPARAM);;
という型の関数が必要である事を処理系に伝えます。
処理系側で、コールバック関数のテンプレートをヒープにコピーして
インストラクションコードを追加/書き換えた物を登録する。
という方法です。
(でもアセンブラスキルはいまいちなので、完成するかどうかは判りませんが。)
なるべく同期処理を行なわずにスレッドセーフにしたいのもあります。
>>398 さんの方法も考えたんですが、汎用性が無くなるのが嫌なんです。
>>401 コンソールベースのインタプリタはもう存在します。
DLLを動的にロードしてAPIを直接扱ってGUI対応するのが目標です。
>>407 どう汎用性がなくなるのかよくわからんが、コールバックだけを動的に変えたいだけなら
SetWindowLong()でできるぞ。詳しくはMSDNあたりを参照してくれ。
409 :
デフォルトの名無しさん :2001/07/09(月) 22:50
>>408 そんなんじゃ出来ないから質問してるんじゃないの?
410 :
401 :2001/07/09(月) 23:10
要するに DLL から関数の型情報が動的に取り出せるか という事と 型からどのようにスタックフレームが決定されるのか という問題ですね。 この辺になってくると、Windows の知識がかなりいりそうですね。 自分はこのへんになってくるとゲーム屋のMIPS屋なので ウインドウズは Windows は GDI かじった程度なので知識量不足です。 このへんはウインドウズの低レベルインターフェイスの 詳しい人が出てくるのを待ちますか・・・(^^; お役に立てなくてすみません。 >>アセンブラコードを動的に生成 ちなみにコードの自動生成はあんまりお勧めできないです、 近年のCPUの状況を考えると・・・ テーブルジャンプしたほうがいいとかいう事になるかもしれません。 なぜかといいますと、インストラクションキャッシュとデータキャッシュは、 まず間違いなく分かれていますから、生成したコードを実行するには キャッシュを一旦全部メインメモリーにフラッシュして再度読み込みしないと いけません、8K〜16Kbyteをメインメモリに書き込むとなると これはかなりタスクスイッチ並に嫌なものがありますので、 できれば最終手段にしたほうがいいのでは、と感じています。 もしも、どうしてもやりたいならば、次の様にしてみることをお勧めします。 ret_2: ret 2 ret_6: ret 4 ret_8: ret 6 ... とコードどを全部あらかじめスタテックに生成しておいて、これにテーブル 式でジャンプしてみてください、このほうがはるかに効率が良いはずです。(多分)
411 :
396 :2001/07/09(月) 23:14
>>408 伝わりませんでしたか?
例えばRegisterClassに登録するコールバックと、
EnumWindows、EnumChildWindowsに設定するコールバックの関数の型は、
それぞれ違いますよね?(EnumWindowsとEnumChildWindowsは同じですが。)
また、将来新たに作られたり、ユーザー側が作ったDLLのコールバック関数も、
型が同じとは到底思えません。
その全てのコールバック関数の動的対応をどうするか、について質問しているのですが。
414 :
396 :2001/07/09(月) 23:28
>>410 その方法は衛生的で良いですね。
まだ引数をどうするかの問題が残ってますが。
それと、書き換えは遅くなる可能性があるんですね。勉強になりました。
でも一度作って、それを使いまわす状況ならいいでは?
とも思ったんですが違いますか?
415 :
401 :2001/07/09(月) 23:30
>>410 多分OKだと思います。
スクリプト中のどこかにまとめて宣言しておいて、
起動前に全部作ってしまうのがいいかも知れませんね。
416 :
396 :2001/07/10(火) 01:04
>>415 そうですか。
とりあえず作ってみます。
みなさんありがとうございました。
417 :
デフォルトの名無しさん :2001/07/10(火) 02:51
int *fun1(...)、long *int(...)の二つの関数ポインタを作って、 無理矢理キャストするというのは駄目かな?
>>417 パスカル式には、それは使えません。
スタックフレームを呼び出し側で処理しているC型の呼び出しのみ有効です。
419 :
396 :2001/07/10(火) 20:14
なんとか動く物が作れました。__cdecl/__stdcall (まだEnumWindowsでしかテストしてないですけど。) これの実装、コード量の割にかなり辛かったです。 (アセンブラをあんまり触わってないのが原因ですが。) とにかく、DLL-APIの直呼出しと、コールバックが使える様になった事で、 かなり表現の幅が広がった様な気がします。
420 :
396 :2001/07/11(水) 00:33
無事、ウィンドウのメッセージループまで行き着くことができました。 それにしても、winapiインクルードファイルの変換は大変ですね。 今の所メッセージは全部DefWindowProcに渡してるからいいけど、 インタプリタ側で処理を追加していくと、かなり遅くなりそうです・・。 というわけで、お答え下さった方々、ありがとうございました。
Rubyに入ってるwin32api呼び出しモジュールのソースや、 HSP用のloadlib.dllのソースが任意のdllの関数を呼び 出すためにマシン語使ってたな。
誰かソースからドキュソメント作成するのに便利なawkのスクリプトがあったらおせーて! hellプ(for ActiveServerPages)
ちなみに関数一覧と変数一覧をコメントつきで生成するやつは自力で作った。 それっぽいやつヨロピク
424 :
デフォルトの名無しさん :2001/07/11(水) 23:17
age
sage
>>422 -423
思いっきりスレ違い、スクリプトすれかVBスレに逝きなはれ。
427 :
デフォルトの名無しさん :2001/07/14(土) 02:19
スクリプト言語で二重ロード防止策ってどんな方法が良いんでしょう? C/C++は#ifndef#define#endif、マクロ定義 Pascal/perl/lispなどはuseとかrequireとか。 やっぱ後者の様にロードされてなかったらロードするって処理を 言語側でやった方がわかりやすいのかな。 こう考えるとC/C++のマクロって汚いですね。
perlは一度読んだファイル名を%INCにつっこんでるだけなので汚いかと。
429 :
デフォルトの名無しさん :2001/07/14(土) 02:44
>>427 -428
管理に、違う名前空間を使うか、グローバル変数として持つのか。
ぐらいの違い?
ふつーの変数にしとけば、プログラム側で覗けるから
便利なんじゃない?(前例が無ければ後者がお勧め)
どちらにしろ特別な処理はあんま増やさない方が良いよ。
430 :
デフォルトの名無しさん :2001/07/14(土) 02:53
>>427 二重ロードされても問題ないような文法にしてしまうとか・・・(藁)
それは、ともかくとして
インクルード宣言作りは「ファイル分離の目的」というのを明確にするべきではないだろうかと最近考えてたりします。
C++ のテンプレートなどは、綺麗に分離されない文法なので、ソースがあるべきところと宣言のあるべきところがゴチャゴチャになってしまいます。
#まあ、自己責任で出来ないことはないんですが・・・
作る言語の構造を考えて、これはどのようにコードが分類されれば、綺麗に整頓できるかが分かれば、インクルードの形式もそれに伴って綺麗な形の物を考える事ができると思います。
先に構造ありき、次に分類方法を考えて、それができたらインクルード方法と思います。
431 :
デフォルトの名無しさん :2001/07/14(土) 02:53
Cのマクロって大した事できないくせに実装が大変。 CINTの作者とか苦労してそうだね。ハゲてるし。
432 :
デフォルトの名無しさん :2001/07/14(土) 02:59
>>431 (hageはともかく)同意。
NULLとかの誤解も多いし。
あのプリプロセス処理は早めにつぶすべきだったと思う。
確かに便利だけど、代替手段は他にもあったと思う。
>>431 マクロの実装は大変か?
たいしたことないと思うが。手を抜きすぎて不便なのはわかるが。
434 :
デフォルトの名無しさん :2001/07/14(土) 12:24
lispのマクロは単純な割に使い勝手が良い。 これはマクロが完全に言語の一部だから。
435 :
427 :2001/07/14(土) 23:57
ありがとうございました。 後者で作ってみます。名前空間の独立は考えていないので、 グローバル変数か何かに、load情報を記録していくことになりそうです。
436 :
デフォルトの名無しさん :2001/07/15(日) 00:04
スクリプト言語の作者はハゲますか?
CINTの本(何かの雑誌の別冊っぽい作り)のCDROMに、 作者を写したmovieが入っているのだが、ハゲていたな。確かに。
440 :
デフォルトの名無しさん :2001/07/19(木) 02:13
>>439 そういうこと言わない、気にしたらストレス溜まってハゲが加速する。
ハゲ板逝け
442 :
デフォルトの名無しさん :2001/07/19(木) 03:06
初心者な質問ですみません。 yacc/lexでファイル終端の構文エラーを検出する方法を教えて下さい。 line : hogehoge semicolon {} | error semicolon {} ; こう書くと semicolon が無いとうまくエラーになってくれないので 終端の semicolon の無い行のエラーが検出できなくて困っています。
443 :
デフォルトの名無しさん :2001/07/22(日) 02:00
h-age
EOFを終端記号としてエラー認識すれば良いと思われ。
>>442
445 :
442 :2001/07/22(日) 23:48
>>444 ありがとうございます。
お教えのとおりやってみたらできました。
gerogero
ソース読みこむ ↓ トークンに分割 ↓ 中間コード生成 ↓ 実行 ↓ (゚д゚)ウマー
448 :
デフォルトの名無しさん :2001/07/30(月) 04:47
僕はスクリプト言語の作者ですけど、今の所ハゲてません。
>>436 でも無関係な友人がハゲていってる様です。
どうすればいいでしょう?
わたしゃ、使い捨てCトランスレータ屋です。 スクリプト屋同様ヤバイです。 以前使ってたハツモールヘアグロアーSは効きましたよ。 今なんとか大丈夫、でもまたデコあたりが・・・ もうハゲ・ズラ板プログラム技術出張所ですな(藁
450 :
デフォルトの名無しさん :2001/07/30(月) 05:06
ANTLRを使いたいんだけど、日本語の資料どっかにありません?
453 :
デフォルトの名無しさん :2001/07/30(月) 22:13
age
454 :
デフォルトの名無しさん :2001/08/01(水) 00:59
>454 なにがわからないんだ
456 :
デフォルトの名無しさん :2001/08/04(土) 14:18
age
457 :
デフォルトの名無しさん :2001/08/07(火) 08:51
age
458 :
デフォルトの名無しさん :2001/08/08(水) 02:12
誰か・・・・
なんだ?ハゲてきたか?>458
460 :
デフォルトの名無しさん :2001/08/08(水) 17:06
コンパイラつくりてえage
462 :
デフォルトの名無しさん :2001/08/09(木) 22:11
なんか作れ
463 :
デフォルトの名無しさん :2001/08/10(金) 02:27
age
464 :
デフォルトの名無しさん :2001/08/10(金) 03:36
>462 おまえが作れ
465 :
デフォルトの名無しさん :2001/08/10(金) 07:38
466 :
デフォルトの名無しさん :2001/08/11(土) 04:59
定期age
testes
468 :
デフォルトの名無しさん :2001/08/12(日) 00:10
定期age
469 :
デフォルトの名無しさん :2001/08/13(月) 05:36
トランスレーターってどれぐらいの種類があるんですか?
470 :
デフォルトの名無しさん :2001/08/13(月) 22:36
ageたい・・・
Cのコンパイラをつくりたいのですが そのへんのことについてくわしくのってる書籍はありますか?
>>471 とりあえず、K&R持ってなかったら買う。
仕様載ってるから。
その後、自分の気に入ったのを買う。
人からすすめられたやつもいいかもしれないけど、
なるべく、自分に合うやつがいいとおもう。
一回どっかで立ち読みでもするといいよ。
でも、コンパイラ本って少ないんだよな・・・
コンパイラ構成法 - 原田 を始めに読むのがいいかも?。 情報科学こんせぷつ8 コンパイラの仕組み と上の本を併用ってのは? 2冊で1万だし。 コンパイラの構成と最適化、は最適化が気になり始めてからのほうが いいと思う。
ありがとうございます。
475 :
デフォルトの名無しさん :2001/08/13(月) 23:58
>>472 >とりあえず、K&R持ってなかったら買う。
>仕様載ってるから。
Cコンパイラ作りたいって人間に「仕様載ってるから」って
理由でK&Rを進めるのかよ(*´Д`*)
>>475 C の構文が BNF で書いてあるから結構使えるよ。
>>475 それ以外の理由「でも」薦めるべき、という意味なら賛同するが、
それ以外の理由「で」薦めるべき、というなら賛同しない。
仕様書をパスして作ったんじゃ最早Cじゃないので。
Cもどきを作るというなら話は別だが、471はCだと書いてるね。
Cコンパイラ作るとかって段階になると、K&Rじゃぜんぜん足らないだろ。
K&Rを100万回よんでも、Cコンパイラは作れません。 BNFだけでコンパイラは作れません。
K&Rとドラゴンブックでいいでしょ。ダメ? というかコンパイラ作りたい人がK&R持ってないとは思えなかったりして。
481 :
デフォルトの名無しさん :2001/08/14(火) 00:20
475
>>477 Cコンパイラ作るのにK&Rを勧めるのは悪いとは言わないけど、
あまりに初歩的すぎるから、驚いたんだよ。
K&Rに載ってる情報量じゃ、それこそCもどきしか作れない。
>>480 >K&Rとドラゴンブックでいいでしょ。ダメ?
だめだね。
>>480 ドラゴンブック読んでる人間はこういう発言はしないと思われ。
484 :
デフォルトの名無しさん :2001/08/14(火) 20:48
アセンブラしらなくてもCのコンパイラつくれますか?
485 :
名無しさん :2001/08/14(火) 20:53
できる。ネイティブコード吐かない奴。
486 :
デフォルトの名無しさん :2001/08/14(火) 20:54
CでCのコンパイラとか?
487 :
名無しさん :2001/08/14(火) 20:57
ペンバートン&ダニエルズは PascalでPascal書いてる。 「P4-Pascalの言語処理系」(共立)
BASICでBASICインタプリタ作れるし、 アセンブラでアセンブラを作れる。
489 :
デフォルトの名無しさん :2001/08/15(水) 00:12
>>487 今更Pascal「ごとき」低レベルな言語を書いてもレベルが低いと
言っているようなものだね。
JavaならOS非依存だからコンパイラなど作る必要なし。
もっとレベルの高い会話をしろよ。
490 :
あ :2001/08/15(水) 00:15
>>489 >JavaならOS非依存だからコンパイラなど作る必要なし。
おまえ、 自分の言ってることを分かってるか?
>>490 ネタでしょう・・・
もし、ネタじゃないなら、この板も落ちたもんです・・・
>>489 あからさまにdel厨を煽っています。無視しましょう。
493 :
デフォルトの名無しさん :2001/08/15(水) 08:22
ageぇ
まあjavacというものの存在についての知識はデフォということで、
>>492 それにすら成ってないと思うのに一票。PascalとCは同程度。
むしろ、色々な面について
(コンパイラを作るのが楽な)簡単な言語のほうが「良い」わけだから、
華々しさフクザツさを競うほうがドキュ。
>>491 ネタだとしても489は諧謔性が低すぎます。笑いも取れないネタに価値なし。
そういやJavaBytecode用のアセンブラ、ってのも誰か作ってたよな(藁
>>495 Ant があるしねえ。
Ant の便利クラス作りまくりアプローチは好きでなかったりするが。
497 :
デフォルトの名無しさん :2001/08/16(木) 21:16
プログラミングの超初心者でもわかるようなyaccでのコンパイラの作り方の 解説のページってありませんか。
498 :
♯6411 :2001/08/16(木) 21:22
>>497 データ構造とかの知識がひととおりないと
コンパイラなんてつくれないでしょー
漏れ的には超初心者なんて自称してる限りは
無理無理と思われ。
499 :
デフォルトの名無しさん :2001/08/16(木) 21:36
では、コンパイラを作るための一歩にまず何からはじめれば よいですか。
まずコンパイラを作ってみること
>>497 yacc,lexはまぁどうにか覚えるとして、498のように
データ構造がほげららというなら、「デザインパターン」
の、Visitor, Composite のあたり。ネタではなくマジ
です。
503 :
デフォルトの名無しさん :2001/08/16(木) 22:25
コンパイラやインタプリタをいきなりつくるよりは、
別の言語に翻訳するコンバータをつくるのが楽で楽
しいカモよ
>>497
コンパイラ関係の書籍って、あんま売ってないんだよなあ
506 :
497 :2001/08/16(木) 22:36
502さんと504さんの言っていることがわからない僕はもうどうしようも ないでしょうか?
とりあえず、コンパイラつくるまえに もう少し基本的なお勉強を・・・
508 :
♯6411 :2001/08/16(木) 22:39
>>504 禿げしく胴衣。
マジアドバイス。ホントに超初心者なら、
まずはいろんなコンバータつくってみるってのは
どうかな? 言語トランスレータに限らず、
その手のものはいろんな意味で勉強になるから。
なぜならば、人様のファイルフォーマットを捌く
ってことは、データ構造の勉強になるのだよ…
コンパイラ系の本ってさ、すっごく少なくない?
皆さん、ありがとうございます。 もっと基本的なことを学んでからコンバータというものを作ってみよう と思います。
少ないけど名著率は高いでしょ? それで問題ないと思う。
512 :
♯6411 :2001/08/16(木) 22:52
>>505 >>509 つくりたがる人間も決して多くないし、
いざ造ろうとするとそれはそれでいろんな
知識が要求されて大変だからね。
漏れは10年以上前、工房出たばっかりのときに、
当時の上司にyacc本渡されて、それで
自分の人生が1/8くらい決まったもんだしなー。
一時期は赤いドラゴン本読みふけってたし。
それでも、マシンコードを吐くコンパイラは
未だ掻いたことなし。スクリプトインタプリタは
大量生産できるようになったけどね。
自作言語作ったらまず、 自作言語->Cのトランスレータ作ったら良いと思う。
514 :
デフォルトの名無しさん :2001/08/16(木) 23:20
>>506 デザインパターンってのは、上の書き込みだと書籍の名前だよ。
yaccの雑誌だと、「yacc/lex 五月女健治 啓学出版 1992」
ISBN4-7665-1140-9 が異様に親切で簡単でかなりおすすめ
できるんだが間違いなく絶版だろうなぁ・・。
516 :
デフォルトの名無しさん :2001/08/16(木) 23:24
おっ 同じもの??
s/雑誌/書籍/ スマソ
519 :
デフォルトの名無しさん :2001/08/17(金) 00:23
LispToCのトランスレーターって、 制御構造あたりは簡単に作れそう。 Schemeは継続と末尾再帰があるから、大変かな。
520 :
デフォルトの名無しさん :2001/08/17(金) 18:05
恩返しage
521 :
デフォルトの名無しさん :2001/08/17(金) 20:11
啓学出版って、*潰れた*んじゃ?
522 :
♯6411 :2001/08/17(金) 20:37
>>521 そう。潰れたかどうかは覚えてないけど、
絶版になってしまったので、yaccスキー連中が
右往左往するハメに陥ってたわけだな(w
ところで、漏れが最初手にした書籍は、
啓学出版なんだけど、五月女さんじゃなかったん
だよなー。誰だっけ? 誰かフォローきぼんぬ。
525 :
pf :2001/08/18(土) 20:59
貴重な良スレage
>yacc/lex, 五月女健治著, 啓学出版 今日池袋のジュンク堂にあった
全ページすわり読みするしかない。
528 :
デフォルトの名無しさん :2001/08/23(木) 17:45
age
テクノプレスで注文したけど、なんの連絡もこない。
530 :
デフォルトの名無しさん :01/08/28 21:47 ID:o3vII6Bs
Pentium用のコード生成を解説した本って無いですか? アセンブラまでじゃなくて、ちゃんと機械語までの変換 を解説した本が欲しいのですが・・・
533 :
デフォルトの名無しさん :01/08/29 01:31 ID:GIhJkjc.
>>530 VisualC++とかならasm/codファイルの出力とか参考になると思うよ。
534 :
デフォルトの名無しさん :01/08/29 02:31 ID:M4BjMY5w
>534 ありきたりな内容だな
536 :
534 :01/08/29 12:35 ID:LA57eUsQ
言うの忘れたけど、
>>534 は、
>>530 へ。
機械語まで・・・ってのがよくわからんけど。
本の説明こぴぺ。
>具体例を示すためにC言語とPentiumプロセッサ(アセンブリコードが
>比較的読みやすい)を主たる対象とした.
537 :
530 :01/08/30 17:54 ID:s3V0FXOw
>>534 その本は持ってます。Pentium用だし、作者が好きなので。
でも、なぜかアセンブラを生成する所までしか解説してないんですよね。
movのフォーマットだけははじめの方に解説されてました。
ちゃんと1と0の列の機械語まで変換してexeを生成したいのです。
インテルのサイトはいい文献がたくさん転がってましたが、
命令のフォーマットの解説は残念ながら見つけられません
でした。
命令のフォーマットって言う人は少ないね。 ftpからもぐっていけばpdfでそれぞれのCPUに対応したリファレンスが置いてあるよ。
539 :
デフォルトの名無しさん :01/08/31 02:19 ID:JrJLvbeM
540 :
530 :01/09/06 00:15 ID:igcvqESo
どうもありがとうございます。 80386なのでちょっと古いですが、 Intel 80386 Programmer's Reference Manual www7.informatik.uni-erlangen.de/~msdoerfe/embedded/386index.htm のChapter17に非常に詳しい解説がありました。
542 :
デフォルトの名無しさん :01/09/14 20:17
ドラゴンブックにガベージコレクションとか載ってるか?
543 :
デフォルトの名無しさん :01/09/14 22:50
544 :
デフォルトの名無しさん :01/09/14 23:09
>>543 それはタイガーブックだ。ついでに、タイガーブックは米国のamazonで評判悪いぞ。
545 :
デフォルトの名無しさん :01/09/14 23:42
546 :
デフォルトの名無しさん :01/09/14 23:44
547 :
デフォルトの名無しさん :01/09/15 04:31
中間コード(バイトコード)設計の上で参考になる資料ってありますか? なるべくシンプルなのが良いんですが
548 :
♯6411 :01/09/15 23:36
>>547 中間コードが処理系内部で閉じてるんだったら
なんでもいいんでは? あえてバイトコードに
こだわる必要なし。
ちなみにgccは木を作ってるね。
549 :
デフォルトの名無しさん :01/09/16 02:52
>>548 なんでもいいって、なんかあるでしょう?
木とか、そんな解答じゃなくて、
もっと具体的なやつ教えてください。
>>549 ターゲットとなる全てのプロセッサのマニュアル。
プロセッサが1種類だけなら中間コードなんていらん。
>>551 -552
シンプルなの、つってんじゃん。
バカ?
554 :
デフォルトの名無しさん :01/09/16 10:21
どこか忘れたけど、mov命令だけの CPUの話があった。 シンプルだろ。
556 :
デフォルトの名無しさん :01/09/16 10:31
>>547 金持ち(ビルゲイツ並み)になるための良い方法はないでしょうか?
なるべく楽なのが良いんですが
558 :
デフォルトの名無しさん :01/09/18 01:35
>>547 =549=553
人間失格
そして・・・
age
559 :
デフォルトの名無しさん :01/09/20 11:41
コンパイラのバグを発見するために、わざときわどいソースコードを 読ませたりしてバグを探したりすると思うんですが、 そういうテスト用コードは、どこに行けば手に入れられるでしょうか? 言語はCです。
560 :
デフォルトの名無しさん :01/09/20 14:02
>>555 なんか出来の悪いDSPなんかだと 特殊な処理は特定のメモリ番地に書き込む事で発動される
なんてのが大量にあるよね
割算用のアドレスがあってそこに書き込んでから何ステップ後に読むと割算結果が得られるとかね
これ、使う方はなんかキツイんだよね。
を加算とか論理演算でもやられると読む方は嫌になるかもね
;1+2
mov (AddSrc),#1
mov (AddDst),#2
NOP
mov reg,(AddDst)
age
562 :
デフォルトの名無しさん :01/09/28 13:36
>>559 gcc の test suite でも使ったら?
563 :
デフォルトの名無しさん :01/09/28 14:13
Flex + BISONでCもどきのインタープリタを作成しています。 なんとか動いてはいるのですが、食わせるスクリプトによって fatal flex scanner internal error--end of buffer missed といったエラーがでます。 Flexの吐いたコードから発生しているエラーと思われるのですが、 このエラーはいったい何なのか教えていただけないでしょうか。 使用しているFLEXはversion 2.5.4です。
保守sage
>>562 ありがとう、そういうのを探してたです、多謝!
grep "end of buffer missed" *.c *.h
567 :
デフォルトの名無しさん :01/10/13 00:31
EOL(End Of Line) ってマイナーでしょうか? よく"\r\n"や"\n"直接書くかわりに定数にしてるんですが。
おれは使ってるが
std::endlなら使う
570 :
エロゲープログラマー :01/10/13 22:17
ADVゲームのスクリプト言語のためになるツールってあります?
とりあえずDNMLで検索>570 ほかにも沢山あるけどな。
572 :
デフォルトの名無しさん :01/10/13 22:35
スクリプトからスタックマシンへの展開って、 式とかはなんとなく判るんですけど、繰返しや条件文って どうなるんでしょう? ラベルとか飛び先を用意しないと駄目ですか? >a + b push a push b call + >if (t) a else b push t test jmp label_a label:a a jmp label:ifend label:b b label:ifend
>>572 蛇足の助言。ifみたいな制御機能は、マシン自体に実装せずに
それ自体をライブラリにしてしまう、という手もある。
SmalltalkやPostScriptがやっている。
「関数ポインタ」みたいなものをFirstClassObjectとして扱えるような
言語仕様であるということにしとくと、結構幸せになる。
575 :
デフォルトの名無しさん :01/10/14 02:16
>>570 たぶん、ゲームエンジンに食わせるバイナリーを
作成するためのコンパイラがだとおもいますが、
lex yacc が一般的だと思いますよ。
少し難しいですが、がんばってくださいね。
576 :
デフォルトの名無しさん :01/10/14 02:18
lex yacc のソースってフリーなのですか?
>>576 フリーつーかライセンスはあるよ?
それと、片手間でlex/yaccのソース見てもわかんないと思うよ。
この場合は、既存のツクール使うのが正解と思うけどなあ。
pascal( or Object Pascal)に移植されたソースなんて無いですかね? Cよりpascalの方が得意なので。
579 :
専門学生学校 :01/10/14 02:30
おお、同士よ
>>570 学校の課題でADVを作っていますが、バイナリーを直接いじっています。
ソースコードからバイナリーを制作するツールはいつか作りたいと思っていますが、
むずかしくって、作れません。
だれかイイ知恵を下さい。プリーズ。
>>579 インタプリタから作るといいよ
1行入力して文を解釈するってやつ。
最初は条件文とgotoだけ。
581 :
Hの専門家 :01/10/14 02:40
命令を1文字にするといいよ。 m文字列 s選択肢1,選択肢2,選択肢3 とかみたいに。 アリスのシステムも2文字だったけど、 あれってこれと同じ方法だと思います。
初歩から始めるなら 1)トークン分割モジュールを作る。 2)文字列をコマンドIDと数値へと変換するモジュールを作る。 3)コマンドIDの列を実行するモジュールを作る。 この3ステップで簡易インタプリタを作るところから始めるといい。 この程度でも次のようなスクリプトが作れる。 Def Input1 null Begin FugaFuga showMessage "なんたらかんたら" waitInput Input1 ifEqualGoTo Input1 KEY_1 Hoge ifEqualGoTo Input2 KEY_2 HogeHoge End Begin Hoge showImage "KEY_1_Pressed.bmp" showMessage "KEY_1 を押したね?" exit End Begin HogeHoge showImage "KEY_2_Pressed.bmp" showMessage "KEY_2 を押したね?" exit End
>>582 インデントが消えた・・・。
Def Input1 null
Begin FugaFuga
showMessage "なんたらかんたら"
waitInput Input1
ifEqualGoTo Input1 KEY_1 Hoge
ifEqualGoTo Input2 KEY_2 HogeHoge
End
Begin Hoge
showImage "KEY_1_Pressed.bmp"
showMessage "KEY_1 を押したね?"
exit
End
Begin HogeHoge
showImage "KEY_2_Pressed.bmp"
showMessage "KEY_2 を押したね?"
exit
End
>>582 コマンドIDの列って、、
変数とユーザー関数定義を実装するにはそれなりのセンスが
必要だと思うけど。
>>584 そうかい?
パフォーマンスを度外視すれば
コマンドID列を保持する vector をラベルでキー付けして
STL の map に突っ込むだけで御仕舞い。
STL の使い方が分からなくても
自作の可変長配列に線形探索程度で挿入・検索をやっても
それなりに使えると思うよ。
念のために言っとくと、
スクリプトの各行の先頭単語はコマンドIDのラベルを表し、
以後行末までの空白で区切られたトークンはパラメータを表してる。
この程度ならセンスと言うほどのものは必要ないと思うがなぁ。
586 :
デフォルトの名無しさん :01/10/14 03:50
レベルが低いな。 本気で言語を作る気があるなら、まず最初にLispを作れ。 初心者でも、やる気があるやつがかかれば、5日で作れる。
>>586 それはLISPをある程度知ってる人が前提。
初心者に5日は無理。
でも今時の若い人は気力と強引さでカバーするかも?
Lispは出発点じゃなくて終着点、に一票。 素晴らしいものだとは思うけど それだけに最初に知ってしまうと 他の言語と疎遠になってしまいがちじゃないかな。 漏れはLisperじゃないけどそういう言語に思える。<Lisp
589 :
デフォルトの名無しさん :01/10/14 04:02
よし、じゃあ俺が今日から作ってみるよ。眠いので寝てからだが。 SchemeはSICP読んでる、レベル。 Schemeもどきの末尾再帰の最適化とかは無し、継続もなし、 マクロは未定、って感じでいいか?
がんばってね。>589
Lisp系ははじめてな上に、GCはリファレンスカウントしか知らないので、 そのうちマーク&スイープとかについてヘルプ出すかも。 その時はよろしく。
>>587 Lispの概略は3時間もあればつかめるだろ。
>>588 言語としては終着点でも良いけど、構文解析がかなり楽な部類だから、
Lispから初めて感じをつかむべきだ、といってるんだが。
別にフルセットのSchemeやCommonLispである必要は無いんだし。
GCだって搭載しなくても構わない。
字句解析のレベルで、文字列認識のバッククオートの処理が ちゃんと思いつかなかったので、ふて寝。 "test\\"とかがちゃんと認識出来ない。 厨房過ぎる>自分
(´-`).。oO(噂のオートマトンで状態遷移モデルを作るんだ・・・)
(´-`).。oO(mark&sweap gcはクヌースのアルゴリズムが有名かな・・・?)
Lispは正直シナリオライタさんなんかに理解してもらえん(藁 なんてね。
597 :
専門学生学校 :01/10/14 08:57
どの方法も難しそうですね。 1文字命令というのが一番簡単そうなのでやってみます。 DirectDrawでゴリゴリ動かすのはわかるんですが、 コンパイラーを作る本は難しくってよく理解できませんでした。 ヒントをヒントを有り難うございました。
起きました。 今からやってみます。 そうか、状態遷移でやればいいんですね。 バックスラッシュがあったら遷移させて、次の文字はそのままコピー、と。 適当に静的に確保した配列にstrcatしていく、とかいう駄目な仕様に決定。 文字列の最大の数が決まってしまいますし、reallocやる気も無いです、はい。 どうせならDFA書いて、正規表現に変換、とかやる方がいいかな? まあいいです。面倒なのでとりあえず普通に遷移をflexで書いてみます。 <INITIAL> "\"" {buf[0] = '\0';BEGIN(STRING)} <STRING> [^\\]* strcat(buf,yytext); <STRING> "\\" BEGIN(ESCAPE) <ESCAPE> . {strcat(buf,yytext);BEGIN{STRING}} という感じですかね? DFAは 4 " ↑" \ 1--->2------>3 ↑ |. +-------+ という感じでしょうか。誰か正規表現変換、やってください。 これでスペースがずれてたら鬱だ。
とりあえずscanが終了。 %{ char buf[1024]; %} %s STRING BACK %% <INITIAL>"\"" {buf[0] = '\0';BEGIN(STRING);} <INITIAL>"(" fprintf(stderr,"'('\n"); <INITIAL>")" fprintf(stderr,"')'\n"); <INITIAL>[1-9][0-9]* fprintf(stderr,"int,yytext=%s\n",yytext); <INITIAL>"0" fprintf(stderr,"int,0\n"); <INITIAL>(0|[1-9][0-9]*)\.[0-9]+ fprintf(stderr,"double,yytext=%s\n",yytext); <INITIAL>[^(0-9"\n \t][^ \t\n]* fprintf(stderr,"symbol=%s;\n",yytext); <STRING>[^\"\\]+ {strcat(buf,yytext);} <STRING>"\\" {BEGIN(BACK);} <STRING>"\"" {fprintf(stderr,"buf=%s\n",buf);BEGIN(INITIAL);} <BACK>. {strcat(buf,yytext);BEGIN(STRING);} %% int main(){ yylex(); return 0; } こんな感じです。 次はyaccに進みます。
get
601 :
デフォルトの名無しさん :01/10/15 01:21
>>596 音楽用MIDIシーケンサのスクリプトに採用されてる事例がある。
ミュージシャンは理解するのか?
最近めっきりつかってないけど ウィングルーヴすげーよ。 しかも俺はそれを最初にみたのは オランダのサイトだったゾ。からきし言葉 わかんなかったけどな。 ダイレクトサウンドもまだ全盛じゃ なかったころだったし、結構儲けただろうな
GIMPやoutoCADがScheme、Lisp採用してるぞ。
コンパイラを書いていて思ったんだが、 Tokenizerに任せる部分と、Parserに任せる部分の切り分けが良く分からない。 文字列("[^\"]*")なんかはTokenizerに任せちゃってる例が多いんだけど、 Tokenizeの意味を考えると、 DQUOTE/STRINGに分解してParserに任せる方が正しい気もするし。 皆はその辺、どうやって決定してるの? (手動で書き起こすの前提です)
lambda式あたりの実装が汚いながらも終わりました。 ただ、primitiveな演算は今の所+とlambdaのみ。 クロージャ回りで大苦戦しました。 environmentは線型リストの線型リスト、 id作成も線型リスト、cons等も通常の構造体をmallocで生成、 GCはリファレンスカウント、という厨房コーディングです。 面倒なので、(define (text x) ...)の形式はサポートしない予定。 (define test (lambda (x) (+ x 3)))とかは当然出来ますが。 doubleとintをサポートしてみたら、+のコードが長くなって鬱。 もう少し真面目に作っても、確かに5日あれば終わりそうです。
>>604 その正規表現だと、\\"でおわらない予感。
というチャチャは置いといて、今日の朝から遊びで作ったSchemeでは、
\"((\\.)|([^\\"]))*\" return STRING_LITERAL;
とかなってる。
"の回りの遷移なんてたかだかDFAなんだから、lexの方で処理するのが正しい気がする。
他の人の意見きぼん。
ちなみに#や'は字句、とみなした。
どちらもLispでは構文にかかわってくる事なので。
結局こんな感じ。
%{
#include "y.tab.h"
%}
%%
[ \t\n]+ /* space */
\;[^\n]*\n /* comment */
' return QUOTE;
\"((\\.)|([^\\"]))*\" return STRING_LITERAL;
\( return LPAR;
\) return RPAR;
[1-9][0-9]* return INT_LITERAL;
0 return INT_LITERAL;
(0|[1-9][0-9]*)\.[0-9]+ return DOUBLE_LITERAL;
[^(0-9"\n \t#'][^ \t\n)]* return IDENTIFIER;
\# return SHARP;
%%
単純なリストじゃ無理だろ。 使用リストと、変数格納イメージがないと。
とりあえずマーク&スイープ、プリミティブな型の扱いを 除けば理解したが、Cのスタックの下限を得る方法を知ら ないので挫折。 上限は最後に定義したローカル変数、とかでいいのかな。 という訳でScheme厨房の私には、5日で実装、は無理そうです。 適当な処理系を覗くと、mainの(void *)&argvをbottomに使ったり してるようですが、そういう物なんですか? 確かに割合い最初の方にスタックに積まれる物な気はしますが... それとコピーイングとマーク&スイープ、どっちがScheme向きですか?
610 :
デフォルトの名無しさん :01/10/16 02:25
>>609 Cのスタックをスキャンしてるのか?
どこが変数で、どこがPCとか正確には見てないだろ?
だったらconservativeにやるしかないから、
コピーGCは無理と思われ。
ところで、lambdaさえあればリストも整数演算も作れるぞ。
defineなしで再帰もできるよ。
>>609 Scheme向きってのは特に無いと思うけど。
小さく作るならマーク&スイープで十分。
コピーはフラグメントが発生しない利点があるが、
普通に作ると遅い。これは実験済。
でも配列を大量に使う場合はコピーの方が良いかもね。
2つを組み合わせるって手もある。
インクリメンタルやジェネレーションなどは慣れてから。
>>610 lambdaだけで再帰は無理でしょ。一応set!も無いと。
(でもSICPにはlambdaだけで済ます方法が載ってたりする。)
613 :
デフォルトの名無しさん :01/10/16 02:46
>>612 できるもん!
(((lambda (le)
((lambda (f)
(le (lambda (x) ((f f) x))))
(lambda (f)
(le (lambda (x) ((f f) x))))))
(lambda (fact)
(lambda (n)
(if (zero? n) 1 (* n (fact (- n 1))))))) 10)
=>362880
>>613 そうそうこういうやつ(w
よくやるよね。
615 :
デフォルトの名無しさん :01/10/16 02:53
>>611 むー、漏れの経験ではコピーの方が何倍も速いがなー。
ヒープがいっぱいだと別だが。
いずれにせよジェネレーションGCの方が桁違いに速い
と思われ。
>>613 internal-define or letrecをこう言う風に変換する
マクロがあると面白いかもしれない。(変換結果が)
うおっ、諦めた瞬間に反応が(藁
>>610 はい、Cのスタックスキャン、です。ついでにレジスタも。
PC等は見てないです。setjmp使う軟弱な奴。
conservativeにやるつもりだったのですが。
それだとコピーって使えないんですか。
よくしらんドキュソなもんで。
なお、再帰、普通にdefineがあるので実装してみたいのだけど、
ifやら条件式やらを実装していないので無限ループしか試せず。
つまらんです。
なお、関数のCの方での登録回りは、適当なハッシュとか作らなかったので、
いちいち登録する都度ifが増える、という終わった実装になってます。
続きを真面目にやるならハッシュ書くけど、、、
ハッシュ書くの、もう飽きた。
なお、id生成が線型リスト辿ったりする終わり気味実装。
やっぱりインタープリタ作るのは面倒臭いYO!
そういえばGCのデバッグってどうやったらいいか見当が つかんのですが、もつかないのですが、皆さんはどう やってるんですか? リファレンスカウントとかなら簡単に出来たのですが。
619 :
デフォルトの名無しさん :01/10/16 03:12
>>617 スタックやレジスタの中の良くわからん値を
ポインタと見なしちゃったとき、コピーGC
だとその値を書き換えちゃうだろ。
GCのデバッグはね〜。難しい。
>>619 あ、なるほど。
intの値とか書きかえちゃまずいか。
621 :
デフォルトの名無しさん :01/10/16 03:20
んじゃ、ifなしでfactを。 下の定義の後、 (((c-fact (c-1+ (c-1+ (c-1+ c-0)))) (lambda (x) (+ x 1))) 0) =>6 になるはず。(長文すまそ) (define c-true (lambda (x) (lambda (y) x))) (define c-false (lambda (x) (lambda (y) y))) (define (((c-if p) then) else) ((p then) else)) (define (c-not p) ((p c-false) c-true)) (define c-0 c-false) (define c-zero? c-not) (define (c-1+ n) (lambda (x) (lambda (y) (x ((n x) y))))) (define ((c-+ m) n) ((m c-1+) n)) (define ((c-* m) n) ((m (c-+ n)) c-0)) (define ((c-cons m) n) (lambda (z) ((z m) n))) (define (c-car p) (p c-true)) (define (c-cdr p) (p c-false)) (define (U p) ((c-cons (c-cdr p)) (c-1+ (c-cdr p)))) (define (c-1- n) (c-car ((n U) ((c-cons c-0) c-0)))) (define c-1 (c-1+ c-0)) (define (c-fact n) (((c-if (c-zero? n)) (lambda (x) (c-1 x))) (lambda (x) (((c-* n) (c-fact (c-1- n))) x))))
c-ifが未定義っぽいですが。 core吐いて落ちた(<ーへぼい処理系だ...)
どうでもいいけど、何でCのスタックまでスキャンするの? GCをマルチスレッドで走らせたりしてるわけ?
624 :
デフォルトの名無しさん :01/10/16 03:45
>>622 >>622 ああ、(define (fn body))の書き方なしなんだっけ。
んじゃ、
(define c-true (lambda (x) (lambda (y) x)))
(define c-false (lambda (x) (lambda (y) y)))
(define c-if
(lambda (pred) (lambda (then) (lambda (else) ((pred then) else)))))
(define c-not (lambda (pred) ((pred c-false) c-true)))
(define c-0 c-false)
(define c-zero? c-not)
(define c-1+ (lambda (n) (lambda (x) (lambda (y) (x ((n x) y))))))
(define c-+ (lambda (m) (lambda (n) ((m c-1+) n))))
(define c-* (lambda (m) (lambda (n) ((m (c-+ n)) c-0))))
(define c-cons (lambda (m) (lambda (n) (lambda (z) ((z m) n)))))
(define c-car (lambda (p) (p c-true)))
(define c-cdr (lambda (p) (p c-false)))
(define U (lambda (p) ((c-cons (c-cdr p)) (c-1+ (c-cdr p)))))
(define c-1- (lambda (n) (c-car ((n U) ((c-cons c-0) c-0)))))
(define c-1 (c-1+ c-0))
(define c-fact
(lambda (n)
(((c-if (c-zero? n))
(lambda (x) (c-1 x)))
(lambda (x) (((c-* n) (c-fact (c-1- n))) x)))))
>>623 えーと、C側の話で、関数の呼び出しの中で、一時的にローカ
ル変数に保持されてる奴ってのがスタック見ないと回収されて
しまう気がするのですが。
>>624 そのまま食わせたら、落ちたのでまたバグかー、
とか思っていたら、インデントが全角スペースだったんですね。
そりゃそうか。
で、実行したら、なんか解釈はされたけど、値は出力されず。
あれ?なんか処理が返ってこない...
デバッガなりprintfで追うのは、もう眠いので明日にします。
とりあえずテストの為にscmで動かしたら普通に動いた。
何やってるのかはまったく理解してませんが。
補足: バグかーってのは自分の書いた処理系の、って話しです。
>>625 Rubyみたいに、拡張ライブラリをCでかけるようにする、とかで無い限り、
一度メモリにフラッシュしてからGCかけて、もう一度読み出すようにすればいいと思うんだが。
勘違いしてる?
628 :
デフォルトの名無しさん :01/10/16 08:41
>624 あんた、スゴすぎるよ・・
と思ったら、 Error: Illegal function (10) ときたよ。
>>629 guileだとちゃんと動いたよ。
(((c-fact (c-1+ (c-1+ (c-1+ (c-1+ c-0))))) (lambda (x) (+ x 1))) 0)
が24になった。
コピペしくじったんでは?
了解。ok
>>627 どうやって?
eval_sexp(struct obj *s_exp){
struct obj *o_car,*o_cdr;
o_car = car(s_exp);
o_cdr = cdr(s_exp)
:
:
}
というコードがあったとする。このo_carやo_cdrがeval_sexp
から抜けると解放されるには、スタック見るしか無くない?
フラッシュ、っていうのをどうやるのか理解してないのだが。
せっかくなので、お隣り(?)のLispスレにあった、 タグ使う方法を試してみてます。 外部にgcマーク用のビットマップを持つ、というのが、 どういう感じになるかはわかりませんが、やってみます。
634 :
デフォルトの名無しさん :01/10/16 21:00
>>633 例えば1024個のセルが収まるメモリブロックに対して、
128byte(1024bit)のビットマップを用意するという事だと思う。
各ビットは1つのセルに対応する。
でもなあ・・各メモリブロックに対応するビットマップを
探索する処理って効率よく書ける?
>>634 >128byte(1024bit)のビットマップを用意するという事だと思う。
組んでる途中ですが、おそらくそういう事っぽいですね。
ただ面倒なので
char bitmap[][1024]って感じにしちゃってますが。
union obj heap[slots][SLOT_SIZE];
という感じだとして、
for(i = 0; i < slots;i++){
if(ptr >= (char *)&heap[i] && ptr <= (char *)&heap[i] + SLOT_SIZE){
return [i,(ptr-(char *)&heap[i])/sizeof(union obj)];
}
}
って感じでbitmapの添字は取れるかなぁ、とか思ってますが。
甘いか?
>char bitmap[][1024]って感じにしちゃってますが。 char bitmap[1024]の間違い。 実際は、 char bitmap[slots][SLOT_SIZE]; という感じ。
>>634 仮定:
consセルのページにはconsセルしか入っていない。
ページサイズ 2^P バイト(2^Pバイト境界にアライン済)、
ページ間は不連続
セルのアラインメント 2^A バイト
ページの先頭にはbitmapへのポインタ(またはハンドル?)が入る。
#define PAGE_MASK ((1 << P) - 1)
#define BIT_MASK ((1 << A) - 1)
void mark(obj *o)
{
if (IS_CELL(o)) {
cell *base = (cell *)(((unsigned long)o)&~PAGE_MASK);
int offset = o - base;
char *mark_byte = *(char **)base + (offset >> A);
int mark_bit = (1 << (offset & BIT_MASK));
if (! (*mark_byte & mark_bit)) {
*mark_byte |= mark_bit;
mark(CAR_UNSAFE(o));
mark(CDR_UNSAFE(o));
}
} else ...
}
バイトマップにするともう少し速い。
ページの先頭にbitmap自体を入れるのはやめた方がよい。
(ダイレクトマップトキャッシュだとひどいことになる。)
Aは「セルのアラインメント」じゃなくて「log2(CHAR_BIT)」だな。 それに、offset計算の時にoのタグを剥がしてない。 欝だ氏の雨
ふぅ、やっとローカル変数で保持しておけば、GCで解放されなくなった。
マーク&スイープ、通常の使用の分には結構早いですね。
文字列は、セルに入れるのは通常のmallocで確保してるので、
あまり文字列がたくさんすぎて、しかもセルがたくさん余っていると
malloc失敗するけどGC起動されない、とかもあるかも。
うーむ。やっぱり文字列の領域もgcで管理するべきか?
まあ素人でも5日で終わる、ってのは本当かも。
今日で2日目だか3日目だかだし。
Scheme実装って面白いですね。
consセルをどこまで切り詰めるか、とか工夫のしがいがあるし。
>>637 やっぱりconsセルの領域はわけた方がいいですか...
一緒にしてしまった。
>>637 sweepは速いよね >ビットマップ
>>639 やっぱりconsセルの領域はわけた方がいいですか...
一緒にしてしまった。
大きさが同じオブジェクトなら混ぜても別に不都合はないと思われ。
フリーリストも一緒にしちゃえば問題なし。
>>639 Scheme実装はココからが面白いところ。
継続を作らずしてSchemeに非ず。
642 :
デフォルトの名無しさん :01/10/19 12:01
どこかにLALR(1)の実装の仕方を解説してるページってないですか?
>>642 yaccの使い方って事なら
本が山ほどある。
bisonのオンラインドキュメント
でも可。
それともパーザジェネレータ自体を
作りたいの?
とりあえず、当初の予定の5日が経過した現在。
結局define回りのシンタックスシュガーとか、
+-*/とか、比較演算とか、それっぽいのを一通り実装
した辺りで終了。継続までは手が出ず。
set!も実装してない。
http://www.geocities.co.jp/SiliconValley-SanJose/8306/lisp2.tgz においとく。
まあSICP厨房な俺だと5日で完成は無理だった、という事で。
tagged pointerに初めて手を出したのと、GCもリファレンスカウンタ
じゃない奴は始めて組んだので、そこらへんで予想よりも手間取った。
GCのデバッグはもうやりたくない(T_T)
R5RSとか探したりとかもしてたので、実際はもうちょっと進むと思われ。
やっぱりForth系の方が楽ですねぇ。
これからジェネレーショナルなGCにでも手を出すか、中間
コード生成して末尾再帰の最適化やるか、って方向だとは
思うけど、、、
まずは継続でも実装してみるかもしれんけど、そろそろ飽
きるかも。とりあえず勉強にはなりました。
いろいろ教えてくれたこのスレの人々に感謝。
645 :
デフォルトの名無しさん :01/10/21 22:18
age
646 :
デフォルトの名無しさん :01/10/21 22:49
以下 解答してください 問2 a = 5+(6+(7+b)); をコンパイルした結果はどうなるかを、自分の頭で考えて示せ。 a = 0+(1+(2+(3+(4+(5+(6+(7+b)))))))-(0+(1+(2+(3+(4+(5+(6+(7+b)))))))); は、どうなるだろうか? 自分が、どのように考えて、その結果を出したのか、そして、それをアルゴリズムにするにはどうすれば良いのかを考えよう。 ヒント まず式を木の形に書いて、構造を調べる push, pop を使ってスタックを使う方法もある 実際のコンパイラの出力と比較してみよう。 -------------------------------------------------------------------------------- 問2 上のプログラムをIntel CPU上で、gcc -O -S test.c を使ってコンパイルすると最適化がかかる。最適化した場合としない場合で、どのような違いが出るか? (ヒント diff を使うと簡単...) 問1で、これらの結果を実際のアセンブラで実行しテストするには、どうすれば良いか考えて実行せよ。 これらの命令が実際に生成されるCのソースコードを考えて、それをコンパイラに通し、実際に命令が生成されることを確認せよ。(ただし、データのアドレスは、変わっても良いとする)
>>648 ああ、なるほど。
という事は646は自分で勉強でやってるのかな?
話題提供なら、
movl b %ebx
addl $7 %ebx
add $6 %ebx
add $5 %ebx
movl %ebx a
って感じか?
以下 解答してください 問 HSPで a = 2 + 7 * 2 をコンパイルした結果はどうなるかを、自分の頭で考えて示せ。 HSPが、どのように考えて、その結果を出したのか、そして、それをアルゴリズムにするにはどうすれば良いのかを考えよう。
定数の畳み込みの話?
>>649 足し算の優先順位って、知ってる?
コンパイラなら、定数の畳み込みぐらいして欲しいのだが。
HSPなんて使った事ねー
654 :
デフォルトの名無しさん :01/10/22 00:40
yaccやlexってなに?
仮想マシンの種類ってスタックマシンとレジスタマシンだけですか?
657 :
デフォルトの名無しさん :01/10/23 00:27
>>656 他にもいっぱいあるよ。
memory to memoryもあるし、
SICD machineとか、
chemical abstract machineとか、
categorical abstract machineとか、
while-if machineとか、
・・・
×SICD ○SECD
命令スケジューリングについて教えて下さい できれば、具体的
660 :
♯6411 :01/10/23 13:27
ミクロレベルのスケジューリングは ターゲット依存な部分が大きいので 具体的に掻くと逝ってもなあ… 最適化を考えなきゃ、スケジューリングなんて楽勝だぞ(w
660 できればスケジューリングについてわかりやすく書いてある書籍 またはあなたのバイブル教えて!
>>661 MINIX本には、ラウンドロビンか何かの実装ならそのまんま
のってた気がするが。あれじゃ駄目?
他にもオライリーかなんかのC++の組み込みの、
ダニの本だと、組み込み用のへぼいスケジューリング
のコードがのってた気がする。
>662 Oreily の本は薄く、読みやすそうで気になってました。 スケジューリングについて調べるために、購入して読んでみます。
666 :
デフォルトの名無しさん :01/10/23 17:38
vectorでダウンロードしたあとにガッカリする度 HSP製だった>VB製だった
誤送信スマソ。(鬱)
668 :
デフォルトの名無しさん :01/10/23 19:01
>662 MINIX本とは?
662 はOSのプロセススケジューリングと勘違いしてない?
プロセサ内部での 主記憶から 演算器までの過程での内部命令のスケジューリングの ことです 具体的にどういう処理をやっているのかよくわかりません
ごめん、本当に勘違いしてた。 逝ってくる。
673 :
デフォルトの名無しさん :01/10/24 14:36
>>671 ちょっとここじゃ解説しきれない。
アーキテクチャの本読め。
「スコアボーディング」「トマスロのアルゴリズム」
「アウトオブオーダ実行」「リザーベーションステーション」
「リオーダーバッファ」とか載ってるヤツを。
日本語だと「スーパースカラプロセッサ」M.Johnson(日経BP社)
あとはインテルのマニュアル読め。
674 :
デフォルトの名無しさん :01/10/27 00:08
>>673 >ちょっとここじゃ解説しきれない
さわりで良いから解説きぼん。
675 :
デフォルトの名無しさん :01/10/28 17:01
<AGE> アゲ―――(゜∀゜)――― </AGE>
676 :
デフォルトの名無しさん :01/10/28 18:00
671の指すマニュアルは無料の上、日本語版だよ。 www.intel.comの下アサリまくれ!オモシロイから。
677 :
デフォルトの名無しさん :01/10/28 19:56
Windows用のネイティブコンパイラを作成するためには、 どのような情報が必要ですか?
>>677 ネイティブってことは、86系に限ればPentiumの命令セットとか、
そういう資料なんじゃないの?
あとAPIの呼出し規約とか。
EXE/DLLのフォーマットとか。
binutilsやnasmなんかのソースを読んでみるとか
680 :
デフォルトの名無しさん :01/10/29 02:10
>>677 とりあえず、COMモデルのコンパイラを作ってから
Windowsへ移行した方がいいぞ。
もうやってるんだったら、余計なこと言ってごめんね。
681 :
デフォルトの名無しさん :01/10/29 14:58
COMモデルって何だ? CP/M形式のものか? それとも、Component Object Modelベースのコンパイラ? わけわかんねー。
682 :
デフォルトの名無しさん :01/10/29 17:59
ちなみに 681 != 677 です
lexやyaccをつかうのに、Cygnus gnu-win32というのが が必要らしいのでダウンロードしたいのですが、 >2のHPにいってもどれなのかわかりません。 どれをダウンロードすればいいんですか? 初心者ですみません。
677でも680でもないけど文脈からCP/M形式のことではないかと。
686 :
デフォルトの名無しさん :01/10/29 18:43
bisonじゃなくてbyaccが欲しいんだけど
687 :
デフォルトの名無しさん :01/10/29 19:00
>>681 COMモデル=CP/M形式のコンパイラのことだろ。
アロケータが必要ないし、
APIの事を必要とせずに作れるからだろ。
多分680は全てを一からスクラッチすることを念頭に置いてると思われ。
689 :
デフォルトの名無しさん :01/10/29 21:31
GPLのソフトのソースから技術情報等を学んで作った(コピペじゃない) ソフトをGPL以外のライセンス(ソースが非公開とか)で配布することは 可能ですか?
スレ違いのような気がするけど
>>689 OK
GPL の法的根拠は著作権ですが、著作権法では、アルゴリズムやそこに書かれた情報などは保護対象
ではありません。そのソースコードで使われているアルゴリズムが特許で保護されていたり、ソースコード
を入手するにあたって機密保持契約などを結んでなければ問題なしです(NDA と GPL が両立するかどう
かは、また別の問題)。
便乗でスマン。 GPLのソフトのソースを別の言語に移植したものって、ライセンスは変更可能なのか? たとえば、C言語で作られたものを、pascalになおしたとか。 # 当然、実際そんなことがあるとすると、ベタ移植ではなく機能アップするだろうが
>691 むり
>>691 自分が著作権を持ってるソースの場合、それとも GPL で流通しているソースを移植した場合
の話?
>685 ありがとうございます。 さっそくダウンロードしたんですが、 使い方がいまいち・・・ どっか解説とかしてるホームページとかありますか? 初心者でほんとスイマセン。。
>>694 はい。
>>3 後は、オライリーから出てる Lex&Yacc 本買うか、
小さ目の処理系のソースコードを読むかだね。
696 :
デフォルトの名無しさん :01/11/02 23:50
さがってないし。鬱。
言語の意味論を勉強するのによい本はありませんか?
ソース?
701 :
デフォルトの名無しさん :01/11/07 21:44
702 :
デフォルトの名無しさん :01/11/13 20:20
ageたい
703 :
デフォルトの名無しさん :01/11/14 02:35
以前Perlのソースを読もうとして挫折した者です。 PerlにもRubyのHacking Guideのような、ソース読解の 手引きのようなものがあるとうれしいのですが、、、。 どなたか、ご存知の方いらっしゃいますか? (スレ違いかもしれませんが)
704 :
kumiko :01/11/14 20:44
ランタイムエラーで、「”)”がありません」と出てくるのですが、 エラーのラインを見ても、何もありません。 どんな事が考えられるのでしょうか? 教えてください。
706 :
デフォルトの名無しさん :01/11/14 20:51
gawk '$1=="TEST" {print}' SAMPLE ってすると gawk: cmd. line:1 '$1==TEST gawk: cmd. line:1 ^ Invalid char ''' in expression とエラーが返ってきます。 なぜでしょうか?教えて下さい。
707 :
デフォルトの名無しさん :01/11/16 01:45
708 :
デフォルトの名無しさん ? ◆LpRapTLM :01/11/16 18:28
Bison に hogehoge.c みたいなもんを吐かせたら、 ↓ static void __yy_memcpy (to, from, count) char *to; char *from; unsigned int count; { (snip ;-) } こんな関数があって、インタフェースがキモイです。(涙) なにかパラメタとか弄らなきゃいけないでしょうか?
古いK&Rのころの書式? 昔のコンパイラを通すためなのかな?
>>708 はK&Rに触れた事無いかし?
(イヤミとかじゃ無くてホントに知りたいだけ。最近の人は知らなくて当然だと思うし)
俺は全部ANSIにして、そのあとC++に書き換えたよ。
GNUって、どれもソース汚いよねぇ。(暴言?)
ていうかコーディングはともかく、IFDEFの嵐がかなわん。
age
コンパイルとおって正常に使えればいいんだよ・・・
本格的にbisonの出力を読んでみたいひとは別として
普通はそのままか、簡単なフィルタを通すだけでに
つかうだろうね。
>>710 みたいに書き換えることも考えられるけど
そうすると文法ファイルを書き換えるたびに出力ファイルを
書き直さないといけない。
>>712 違う違う、それじゃyacc使う意味無いって。
書き換えたのはtemplateファイルの方だよ。
こだわらないのは勝手だけどさ。
俺は必要が有ってそうしたの。
714 :
デフォルトの名無しさん ? ◆LpRapTLM :01/11/19 10:22
みなさん禿しく thanx!
>>709 >古いK&Rのころの書式?
>昔のコンパイラを通すためなのかな?
吐かれたソースのコメントにも「互換性のため」
みたいなことが書いてありました。
K&R なのかぁ…。
K&R の C は忘れちゃっていました。
Panafacom A-30 を使わなくなって以来、触ってないので。ゴメソ
>>710 >ていうかコーディングはともかく、IFDEFの嵐がかなわん。
あー、漏れ的には IFDEF のほうに共感。ていうか
クロス開発なので、自分で IFDEF 増やしてます。(激鬱
さらに IFDEF 増やす方向で (劇毒
bison.simple あたりを弄ってみることにします。
715 :
デフォルトの名無しさん :01/11/19 21:41
俺は自分で作った言語に機能追加する時は#ifdefで全部切り分けしてるから もう何がなんだかわからん状態ですが何か?
ageさせて
718 :
デフォルトの名無しさん :01/12/19 22:39
あげ
719 :
デフォルトの名無しさん :01/12/22 07:33
ふっ、言語処理系に興味を持つ厨房がこんなに少ないようじゃ、 日本の情報産業の未来は暗いな。 つーわけで、さらにage。
パラメータLシステム言語ってどうよ? あれって新しいパラダイム変化を起こせるんだろか。
721 :
デフォルトの名無しさん :01/12/22 11:27
722 :
デフォルトの名無しさん :01/12/22 13:00
言語処理系に興味を持つリアル厨房ですが、何か?
723 :
デフォルトの名無しさん :01/12/22 13:03
とりあえずlispかforth処理系つくってその上で プリプロセッサ書けば早いと思う。
724 :
デフォルトの名無しさん :01/12/22 13:23
思いつきで恐縮ですが、オブジェクト指向lispってないんですか?
725 :
デフォルトの名無しさん :01/12/22 13:34
726 :
デフォルトの名無しさん :01/12/22 15:00
CommonLISPのCLOSってのはすごいぞ。>724
何年前の話だ
>>727 現役で使われている Fortran や C だって何年前の話だか。
729 :
デフォルトの名無しさん :01/12/24 12:49
最近注目されてる技術ってほとんどLISPからきてると思うけど
730 :
デフォルトの名無しさん :01/12/24 14:52
正規表現 -> NFA -> DFA と手作業でやって正規表現を認識するプログラムを作りました。 (flexだとまさに一瞬・・・) プログラムのテストをしっかりやりたいのですが、 正規表現から生成される文字列を自動作成するには?
入門書を逆読みして、ヌルエブルな部分式を消去して、 leftpos/followposを追えばなんとかなりそ。 できたらダウンロードしに行くわ。
732 :
デフォルトの名無しさん :01/12/29 19:40
shell の自作とかもこのスレで良いのかな? 良い教材があったら教えてください。
>>720 Lシステムの記号置換規則で実行可能なコード列を作るということですか?
まさかLシステムで生成可能な記号列を再帰関数とかで作るという話ではないですよね。
前者なら興味アル!
735 :
デフォルトの名無しさん :02/01/02 16:23
本にのってるとうりにやって、 cygwinのbisonでy.tab.cファイルつくったあと、 gccでコンパイルしようとしたんですが、 undefined reference to 'yyerror'ってのがでます。 これは何がまちがってるんでしょうか?
間違ってない。yyerrorを定義すればok
>736 ありがとうございまふ
じゃあ、 undefined reference to 'WinMain@16'ってのは main関数がないということでしょうか?
win32で作ってない?それ。
モロにWin32です。 どうすれば(゜□゜)???
741 :
デフォルトの名無しさん :02/01/02 18:36
gccに -ly はつけた?
-lyをつけると can not find -lyに・・・・ なんでだー
743 :
デフォルトの名無しさん :02/01/02 18:54
自分で↓を定義しないとだめかも? yyerror(char *s) { printf("%s\n", s); }
-Lyにしたら こんどはundefined reference to 'WinMain@16' が! もうわからん。
おちつけ。 まずは標準出力だけのプログラムでやっとけ。
", s);
747 :
デフォルトの名無しさん :02/01/03 08:17
/lib/
>>744 まだキミにはプログラムを作る以前の知識が足りない模様。
たとえば、「WinMain」で検索するとか、やってみたかい?
それがどういう物かを調べてみなよ。
あ、空のmain関数 かいたら 解決しました。 おさわがせしました。
750 :
デフォルトの名無しさん :02/01/05 15:16
>>563 fatal flex scanner internal error--end of buffer missed
lex&yaccプログラミング a nutshell
にflex2.3.7のエラーメッセージというのが
載っていて、
flex自身が使っているflex字句解析ルーチンで、致命的な内部エラーが発生した。
解決方法: システムのソフトウェア管理者に報告する。
だそうです。
751 :
厨房です。 :02/01/05 16:01
先輩社員が「Cコンパイラぐらい誰でも作れる」と言ってたので 試しにサブセット(実数、構造体、typedef、型変換など無し。関数の引数も無い)を 再帰的下向き法で作ろうとしたのですが、失敗しました。 前にPascalのサブセット(コンパイラの教科書に載っている程度のおもちゃ)を 作ったことがあったので、簡単かなと思ったのですが、甘かったです。 まず、構文解析部の型定義(宣言子)の複雑さ、char *(*(*array[10][5])())(); など ネストした構造を解析して、型リストを記号表に登録するのにかなり苦労しました。 記号表もほんとはハッシュを使うべきなのでしょうが、静的配列で逃げました。 しかし、そこまでは泥縄式になんとか作ったのですが、式の木を作る段階になって 投げてしまいました。 演算子(代入式からprimaryまで)ごとの構文解析部はなんとか構文図に従って できたのですが、木を作るときの型チェックなどのやりかたがわからなくて。 特に配列とポインタの相互変換や、代入時の「左辺値」のチェックなどが。 もっとも、自分がC言語自体について厨房だったせいもありますが。 int array[][10] が許され、int array[][] は許されないとか、 "abc"[5] という表現はOKだとか、今までわかりませんでした。 この時点で挫折したので、当然、文の解析やコード生成までたどり着けませんでした。 やっぱりCのコンパイラって難しいと思いました(少なくとも僕には)。 ANSI互換のを作れる人が神様に思えます。 どなたか(もちろんサブセットでもいいので)作成したことのある方、 ヒントやポイントを教えていただけたらと思います。 最近、gccやlccやcint、bcc(linux8086)などのソースを見たのですが、難しくて あまりわからなかったです。(この中ではbccが比較的コンパクトでした。)
>先輩社員が「Cコンパイラぐらい誰でも作れる」 ほんとかよ・・・ いまCもどきのコンパイラつくってるけど、すっげーむずかしい。 現役プログラマーの人たちって みんな簡単につくれるものですか?
誰でも作れるけど、簡単にはいかないと思われ。
ドラゴンブックを順に読みながら作ればある程度のものは作れるよ、Cのサブセットのインタプリタなら作ったことある。
でも、自分の書いたコードが、なんでちゃんと動くのか(特に構文解析)は、よくわからなかった(うはは
コード出力のところは、.objのファイルフォーマット読んで、面度くさくなってやめたよ。
>>751 は、コードの動きが読めないと納得しないタイプなんじゃないかな?
>char *(*(*array[10][5])())(); などネストした構造を解析
これを意識してるくらいだからね。
たとえば ( ) は、優先順位を変えるだけ(関数の()は別ね)だから、ツリーにしたときにいなくなっちゃうもんだし、
ネストがいくら深くなっても、基本的にやることは優先順位と方向の表にしたがってツリーを作るだけ。
>"abc"[5] という表現はOKだとか
これも、ポインタ式と整数式の組み合わせなんだから、当然おっけ、っていうかこれを気にする必要は無いんだよね。
で、インデクシングはポインタ式と整数式の組み合わせだってわかってれば、5["abc"]も(文法的には)おっけってのも、
知らずに実装できるわけだ。
なんか、考えすぎで行き詰まったようなかんじがするなぁ。
(あ、俺用語がおおくてゴメソ)
>>754 ああ俺も似たようなこと思った、
単にまだ抽象的な構造を脳内に描く能力が
足りないだけじゃないかなあと。
やってればそのうちできるようになるよ。
756 :
デフォルトの名無しさん :02/01/06 20:58
おいおいおい勘弁してくれよ、ここ集まってるオタクどものレベルの低さ。
今更Cコンパイラのサブセット?(爆笑
おいおいおい、せめて並列コンパイラの大域最適化ぐらいに話題のレベル上げろよ。
ホントだせーな。恥ずかしいよ、コンパイラの開発にやってたもんとしては。
>>751 お前は処理系の開発うんぬんよりも、先にK&Rのカス本でも読んで逝ってしまえ。
全くどこの会社だよお前。C言語もろくにできないカス。
今更Cのサブセット?ゴミ増やしてどーすんだよ。ばーか(w
>>752 コンパイラ開発はカスとプログラマを峻別する試金石なんだよ〜。
お前もカスレベル?(w
>>754 今更ドラゴンブックかよ。それ読んでお前もサブセット?しかもインタプリタ?
おいおいゴミを増やすなっつーの。お前だけで十分よ。
Cコンパイラやるなら最低でもデータフロー解析ぐらいやれって(w
この季節、女もいねーオタカスどもはヒサンだな(ワラ
>>756 以上、ホームグラウンドの話題になって急にいきがる自己陶酔型冬厨の見本です。
又は、ネタの見本としてもお使いください。
758 :
デフォルトの名無しさん :02/01/06 21:30
>>756 コンパイラ作る人ってたぶんマイコン用だろ。
まぁ、簡単というのはそれまでの知識や経験によりけりだと思うんだけれども
たとえば折りはC->アセンブラ変換とかPASCALアセンブラ変換なら
やれないことはないと思う
がobjファイル(Win)への変換とか具体的なEXEへのリンクは
ちょっと調べないとわからん...というか今はしらん。
で実際コンバータレベルでも作ったとして
結構文法処理は厳密にできるかわからん。ようは規格をチェックするのが大変だから
結局独自仕様になっちゃう
でも例えばこれがボードPCだったとしたら基本的なマシン語構造がわかっているから
できるかもしれないなと思う。
でもだれかがもう作っているなら金を出してそれを買うな。
NASMは確かソースがあるから
C->アセンブラ
アセンブラ->バイナリ
というのが0からコンパイラ作る場合作業分担しやすい方法だと思うけれど
OSがほとんどAPIもってるから効率よく実行できるサブセット型は意外と速いかも
つーかプログラムはやればできっかも知れないけれど
仕事だったら仕様書とかドキュメントとか著作権や特許の調査とか
検査成績書とか
そっちのほうが疲れるんじゃないのか?
>>756 >恥ずかしいよ、コンパイラの開発にやってたもんとしては。
おまえは日本語を勉強しろ。
スレたってから もうすぐ1年か
>759 なんでオマエがはずかしがるのか
あ、 >759 → >756
再帰下降でCの文法って扱えるの?
LALRだ。
(怒らないで、名前間違えた. 764!=1)
766 :
デフォルトの名無しさん :02/01/06 22:00
といいますかコンパイラの基礎理論的なところはすでに太古の昔に 完成されております故、いまさらコンパイラの開発程度で粋がっているのは 程度が知れるデございます。
たぶん>756もそれが言いたかったんだろうけれど、 ちょっと興奮しただけだと思う。大目に見よう。
ってーか、例えば再起下降パーサ(LLだよね?)わかるんだったら、 Pascal,Modula,Eiffel系の言語処理系作ってみる、っつう学習方法がある. 有名どころでは、Knuth 本の PL0 や、それを日本語で焼きなおした本もあった. あと、構文解析については、ドラゴン本きっちり読んで理解して実践までできる 奴ぁー一握りだと思われ. もっと薄い本(漏れは培風館の「コンパイラ」)読んで理解して、 実装はYacc/Bison任せにしたほうがよさそう.
間違えました. × Knuth本のPL0 ○ Wirth本のPL0
>756は>766のようなことを小耳にはさんだことがあるだけの冬厨でしょ。
Pascal や PL/0 コンパイラはソースがよく落ちてるから参考になると思われ。
>>756 は大目にみてやるってことで。
構文解析の話にグローバルオプティマイズの話で割り込むあたり、ちょっとかわいいなって思ったんだけどな。
>>766 等、まともなプログラムも作れず女もいないゴミどもへ(ワラ
おいおいおい、カスの証明だなお前ら。その「基礎理論」でグローバルオプティマイザでも
作ってみろよ。俺が作り上げたようにな。
まったく、何もできねーんなら黙ってな。オバカさん(w
つーか、お前らゴミ書きのある部分は俺の処理系の恩恵受けてんだから
はいつくばって感謝でもしてりゃいーんだよ。
774 :
デフォルトの名無しさん :02/01/07 01:59
>>773 レベルが低いとわめかれてもどうしようもない。
ただ一言レベルが高くてよかったねとしか言いようが無い。
話が合わないのが嫌なら出てけば?
煽ってもつまらないでしょ。
はい。筑波りました。感謝。
っで
>>756 のいう並列処理系最適化って、
何を勉強すれば作れるの?
>>756 が並列コンパイラの大域最適化って言ってるから検索してみたんだが、
どうも、並列分散処理での最適化って、計算の目的に特有のものか、あとは、
配列の計算の最適化(グローバルではないだろうな)くらいしか見つからないんだ。
もうちょっと探してみるよ。
つか、スレ違いだな。
まースレ違いだが、SMPのラック・サーバに、Gbitイーサ仕込んで、 戯れてみたいテーマではある。
>>756 はグローバルオプティマイズ厨と認定されました
>756はレベル高すぎて空回りしてる気が。 もうちょっとレベル下げて技術話でもしてくださいよ。 せっかく専門の人なんでしょうから……。
ええー。経験者そうだから情報引き出したいなぁ。
ずっと昔 (1995年ごろだったっけ?) Stallman が Tcl はいやだといって Scheme ベースのスクリプト言語を作ろうといっていたことがありましたよね? いわゆる GNU Extension Language Plans というやつですが、結局そういう言語ってできたんでしょうか? たとえば Rush とかもあったような気がするんですが、結局この話はどこに流れていったのでしょうか?
俺はそれより2chOSの行方がきになる
>>773 ここのスレタイトルは「相談室」だよ。
子供電話相談室に「夕日はどうして赤いの?」って質問してきた子供に対して、
「今時夕日がどうして赤いかなんて低レベルな質問するなんて笑わせるぜ、
黒点活動と磁気嵐とについて研究してきた俺から見るとな!」
って突っ込み入れているようなもの(藁
だいたいコンパイラ屋なんて縁の下の力持ちなんだから、だまって精進して、
わかる人に「いい仕事してますねぇ」って認められても「仕事ですから」って
職人気質で答えていれば、かえって尊敬されるのに。
>786 > guileのことか? そう、それでした、GIMP にも使われているそうですね。 Scheme を中間言語として…なんていうアプローチもあったようですが。 ていうか、guile の一環として多言語からのコンバータみたいなものもあるのかも。 コンバータというか、guile でパーサとかを作っちゃうとかみたいな。 面白そうなのでちょっとマニュアル(あんまり整備されてないけど)読んでみます。 Scheme スレの方が適切なきがしてきたので逝きます。
789 :
デフォルトの名無しさん :02/01/11 18:41
いっしゅうねーん
>Rubyにはリファレンスカウントではない真のガーベージコレクタがある。 >よってリファレンスカウントでは生じるようなメモリリークが発生しない。 ObjectPascalの文字列や動的配列とかはリファレンスカウントで自動的に メモリ管理されているけど、不完全ということ? 誰か解説してください。
age
循環参照だけだろ。リファレンスで不都合が生じるのは。 つまりA->B->C->Aで参照関係の在る場合。 文字列だけなら真のGC不要。 あと、ObjectPascalどころか、STL/MFCもリファレンスだと思った。
>792 > 循環参照だけだろ。リファレンスで不都合が生じるのは。 なるほど、リファレンスカウントでは問題が生じますね。 それが生じるプログラム書いたこと無かったから、問題として認識してませんでした。
794 :
デフォルトの名無しさん :02/01/14 13:27
>A->B->C->Aで参照関係の在る場合 って、こういうこと? a := obj new; // obj:1 b := a; // obj:1+1=2 c := b; // obj:2+1=3 a := c; // obj:3-1+1=3 a := nil; // obj:3-1=2 b := nil; // obj:2-1=1 c := nil; // obj:1-1=0 不都合って何?
795 :
デフォルトの名無しさん :02/01/14 13:59
>>794 a:=obj new; b:=obj new. c:=obj new;
a.ref:=b; b.ref:=c; c.ref:=a;
みたいにすると、それぞれ参照カウント2になって、
a:=obj new; b:=obj new; c:=obj new;
ってすると、最初の3つのobjは参照カウントが1になったまま、GCされない、ってかんじで、どでしょ?
>795 mark and sweep だと最初の3つのオブジェクトはみなしごになるので GC の mark から外れて sweep されてなくなる、ってことですね。
797 :
デフォルトの名無しさん :02/01/14 14:21
マークスイープだと、3つのオブジェクトはマークされないから GCされるけど、参照カウントだと、カウントが0になってない からGCされない、ってことです。
798 :
デフォルトの名無しさん :02/01/14 16:16
あと、メモリ管理を自前できっちりやるつもりで、 廃棄予定のデータを、メモリ管理機構がきっちりつかんでいて、 仮想記憶がふくれあがる&GCがやけに遅い、っていうことも、 一般にはありがちだわな。
799 :
デフォルトの名無しさん :02/01/14 16:18
Ruby に関しては、次期バージョンで、 データ・オブジェクトの寿命特性を考慮した、 Generation GCつうやつに切り替えたつう話だそうです。
incr-gcやgene-gcとかって何年も昔からある技術だけど 最近出た新しいのってないの?
RubyもGC無しでやって欲しい。
>801 なしってことは、明示的に消滅させるってことですか??
>>803 明示的に消滅させそこねた場合はどうするの?
>>801 もう見てらんない。
Delphiでも使ってなさいってこった。
>804 松下のって…何?
>805 多分、メモリリーク発生。 C で malloc したけど free しなかったのと同じ。 C++ で new したけど delete しなかったのと同じ。
>>805 そんなこと行ってたらCも使えなくなるでしょ。
GCってそんなに便利か?
むしろ失うものが大きすぎる。
>809 厨房はすっこんでろ
Ruby の言語仕様で GC なしは無理だろ。
>807 PanasonicのGC
>>809 Ruby に関していえば、保守的 GC のおかげで
C で拡張ライブラリ書くのがかなり楽。
>812 ゲームキューブ…………か……
オブジェクトが自身の寿命を管理するオブジェクト指向GCってないの?
>>800 Steeleは何をやっているのだろう?
818 :
デフォルトの名無しさん :02/01/14 18:21
http://guppy.eng.kagawa-u.ac.jp/~kagawa/1999/SysProg/both.html でお勉強中です。
ちょっと書き換えただけで
"lexer.l", line 19: unrecognized rule
って起こられます。なにがいけないのでしょうか?
{ident} {strcpy( &yylval.strval,yytext);return IDENT;}
この行でエラーだそうです。
よろしくご教授お願いします。
%{
void yyerror(char*);
#define YY_SKIP_YYWRAP
int yywrap() { return 1; }
#include "parser.h" /* parser.hは bisonが生成するファイル */
%}
delim [ \t]
ws {delim}+
letter [A-Za-z]
digit [0-9]
ident {letter}{{letter}|{digit}}*
number {digit}+(\.{digit}+)?(E[+\-]?{digit}+)?
%%
{ws} { /* ここでは何もしない */ }
{number} { sscanf(yytext, "%lf", &yylval.dval); return NUMBER; }
{ident} {strcpy( &yylval.strval,yytext);return IDENT;}
[+\-\*\/\(\)] { return yytext[0]; }
"\n" { return EOL; }
. { yyerror("不正な文字です。"); return EOL; }
%%
819 :
デフォルトの名無しさん :02/01/14 18:39
ident { letter } [ { letter } | { digit } ] * じゃないの?
820 :
デフォルトの名無しさん :02/01/14 18:41
>>819 さん
ご指摘のとおりでした。どうもありがとうございます。
821 :
デフォルトの名無しさん :02/01/15 03:44
http://www.catnet.ne.jp/t-press/yacc.html でダウンロードしたファイルのANSPARSE.Yをwin2kのbisonにかけているのですが、
ansparse.y:159: type clash (`' `name') on default action
ansparse.y:160: type clash (`' `name') on default action
ansparse.y:209: type clash (`' `name') on default action
ansparse.y:255: type clash (`' `name') on default action
ansparse.y:303: type clash (`' `name') on default action
というエラーがでてきて困っています。
意味がわからないのですが、対処法はないでしょうか?
>>821 default action ってことは、暗黙のアクション
$$ = $1
を使っていて、$$ と $1 の型が違うんじゃない。明示的に空のアクション {} を書いてみたら。
823 :
デフォルトの名無しさん :02/01/15 04:16
アクションが何も書かれてないと思っていたのですが、 暗黙のアクションがあったわけですね。なるほど。 明示的に空のアクションを作ってとりあえずエラーを回避できました。 たすかりました。 それにしてもCのパーサーややこしいです。初心者にはつらめ・・・
>>821 で得たyaccソースのアクション部にコードを生成するコードを埋め込んでコンパイラ作りたいと思っているのですが、
これは通常の方法なんですか?
いまいち、具体的にどのようにコードジェネレータを作ればいいか悩んでいます。
なにかヒントはないでしょうか?
825 :
デフォルトの名無しさん :02/01/15 18:37
緊急で質問です。 TeXで「V」を表示させるコードを教えてください。 よろしくお願いいたします。
>>825 出入り禁止にされたくなかったらマルチポストはやめるんだな
827 :
デフォルトの名無しさん :02/01/15 19:24
誰もおしえてくれねーからあっちこっちで聞いたんだが、 ここの板のレベルは低いね。 もういいよ。やれやれ… スレたてねーだけ感謝してくれ。
本読みながら 簡単Cもどきコンパイラつくってるけど、 すっげえムズイ・・・・ こんなの最初につくった人はすげえ
831 :
デフォルトの名無しさん :02/01/16 13:48
>>829 公開されているコンパイラのソースを実際に読んでみることを勧める。
(gccなど大きくて複雑なものは勧めない。が、自信があるなら別)
ドラゴンブック等などの参考書を読んだだけではわからない所は多いと思う。
>>824 学習用であれば、コードジェネレーターはレジスタ割り当てを考慮しないスタック使用のテンプレート変換でも
いいと思う。
やっと本みながら int型の計算と条件分岐やらループができた。 ムズかしー
833 :
デフォルトの名無しさん :02/01/18 00:01
yaccのプログラムの中でCStringとかCMapなどを使いたいのですが、 #include <afxcoll.h> を入れただけで、エラーがいっぱいでてきます。いったい何なんでしょ?
834 :
デフォルトの名無しさん :02/01/18 00:06
GUIも作れるスクリプト言語作成中なんだけど、 コールバックで詰まってしまった・・・
835 :
デフォルトの名無しさん :02/01/18 00:14
こういうのはあれかな。 アセンブラ使うしかないか。
834=835? つか、コールバックをスクリプト側にディスパッチする方法なのか、 スクリプトの文法構成をどうしようか、という話なのか、どっちよ?
837 :
デフォルトの名無しさん :02/01/18 08:43
834でも835でもないが、もしかしたら同じネタの話が過去にあったかも。 どのスレか忘れたけど。そのときは @r:ret @r4:ret 4 @r8:ret 8 って感じのリターン分岐を作ってやった方がJITでやるよりも 効率がいい、見たいな話だった。そういうこと?>834
838 :
yacc聞いてもいいですか :02/02/01 14:09
昨日C言語の質問スレに書いてしまって2重投稿になることをお許しください yaccで、 expr : expr1 expr2 と書いて、expr2の処理を先に実行させる方法があるでしょうか。 その結果をexpr1の処理の中で使いたいんです。
839 :
デフォルトの名無しさん :02/02/01 18:29
>>834 もしコールバックをスクリプト側にディスパッチする話なら
GNU ffcall
が役に立つのでは?
ffcall,alloc_callback
とかで検索してみてちょ。
>>838 expr2 : hogehoge ...
の{}の中でフラグでも立てて、どっかに結果をしまっとけば?
841 :
デフォルトの名無しさん :02/02/01 21:07
842 :
yacc聞いてもいいですか :02/02/01 21:56
>>840 レスありがとうございます。そのようにしたいのですが、
expr1のアクションの方が、expr2のアクションより先に実行されてしまい
ますよね。
>>842 スキャナがトークンを返したところから expr : expr1 expr2 までのとこ、
具体的におしえて欲しいなり
844 :
yacc聞いてもいいですか :02/02/02 10:11
>>843 どうも、お世話になります。これは、MIDIデータを表現するMuse
http://village.infoweb.ne.jp/~atomic/soft/software.htm の文法解釈を行おうとしているものです。
lex/yaccは、TP Lex/Yaccを、コンパイルはDelphiを使っています。
問題は、onpu : tone_or_waon len_set のところです。
tone_or_waonの中にも、len_setがあって、1番下の行でemptyの場合にはそれ
以前に記憶した変数onpuLenを適用してしまうのですが、そうではなく、
tone_or_waonの後ろにあるlen_setの結果を適用したいのです。つまり「問題
はここです」と書いた1つ下の行のonpuLen := $2;を実行したあとに、
tone_or_waonの中身を解釈したいのです。
%start muse_data
%token <ShortString> TONE_NAME ONPU_LEN
%token WA_REPEAT
%left '^' '~'
%left '`'
%token <Integer> OCTAVE_REL OCTAVE_ABS DIGIT
%type <ShortString> muse_word onpu waon tones tone_in_waon tone_or_waon renpu
%type <Char> waon_start waon_end renpu_start renpu_end
%type <TOnpuLen> len_set len_or_empty
muse_data : muse_word | muse_data muse_word;
muse_word : onpu | octave_descripts;
octave_descripts : {{無関係なので省略}} ;
onpu : tone_or_waon len_set { { 問題はここです。}
onpuLen := $2;
writeOnpu($1, onpuLen);
};
tone_or_waon : TONE_NAME | waon ;
waon_start : '[' { waonStart; };
waon_end : ']' { $$ := ']'; };
waon : waon_start tones waon_end { $$ := $3; }
| WA_REPEAT {無関係なので省略};
tones : tone_in_waon | tones tone_in_waon ;
tone_in_waon : TONE_NAME len_set { writeOnpu($1, $2); }
| octave_descripts ;
len_set : len_or_empty
| len_set '^' len_set { 省略 }| len_set '~' len_set { 省略 }
| len_set '`' DIGIT { 省略 };
len_or_empty : ONPU_LEN { 省略 }
| /* empty */ { $$ := onpuLen; };
オプションが省略されてるかどうか、次の構文にマッチするまで判定できないのって やった事ないわ、ごめん。 len_setがemptyにマッチしないようにして、 onpu : tone_or_waon {音符の保存} | tone_or_waon len_set {音符+len_setを保存} ここではwriteOnpuを呼ばない で、次の構文にマッチしたら、取っておいた音符情報を保存、くらいしか思いつかないや。
コンパイラを作るにはlexとかyaccとかをやるといいらしい。 lex&yaccプログラミングとかいう本が図書館にあったので読もうとしてみた… が、1ページでやる気をなくす。
847 :
yacc聞いてもいいですか :02/02/03 00:17
>>845 考えていただいてありがとうございます。
結局、lexで語順を入れ替えて渡すように改造中です。
もういいかげん構文解析に力を注ぐのはやめようよ。不毛だよ。 S式で書けばいいじゃん。括弧だらけになるのは慣れれば問題ないよ。 エディタも助けてくれるし。 まあ、XMLでもいいけどさ…
849 :
デフォルトの名無しさん :02/02/09 01:32
記号表をどうゆうふうに作ればいいのかわからんので、導いてくれ。 「記号」と一口に言っても、各種リテラル、クラス名、変数名、メソッド名と いろいろ種類があるわけで、これを名前空間毎に分けて管理して、さらに 生存期間とスコープについても考慮しなきゃいけない。 つーわけで頭ん中がオーバーフローっす。 概要でもいいし、この辺について詳しい記述がある解説書でもいいんで、 何かポインタちょうだい。
記号表とかから一旦離れて、 LISP作ってみれば一発でわかるよ>849
851 :
デフォルトの名無しさん :02/02/09 01:46
>>850 早速のレスありがと。
でも、オレ頭堅い人なんでlisp/schemeはちょっと苦手なんだよね
(継続とか、概念がわからん)。lispのインタープリタ作ればわかる
という、その所以についてもうちっと教えてくれない?
>851 何をしたいのかわからないけど、頭硬い人にLISPは無理。 まあ、LISPのシンボルとスコープの概念を理解できれば 名前空間その他なんて屁の河童です。
>849 黒豹本にその辺のPerlでの実装方法が載っていたような。
>>853 どうも、今度本屋行ったら探してみるよ
やっぱ本一冊でコンパイラ作るのは難しいのかなー
黒豹本、読み返してみたらあくまでもPerl処理系そのものでの実装方法なので (Perlで記号表を書いている訳ではない)あまり参考にならないかも。 Perlってこの辺グチャグチャだし。
856 :
デフォルトの名無しさん :02/02/09 04:19
>継続とか、概念がわからん ここではそんなの覚える必要無いじゃん。
>>855 いまいち文意が読みとれんのだけど、Perlのための記号表を
他の言語(Cなど)で書いてるってこと?もしそうだったら
読む価値あるのではないかと思うけど。
>>856 確かに。schemeなら多少わかるんでソース付きのインタープリタ
探してみようかしら。
858 :
デフォルトの名無しさん :02/02/15 10:56
yacc おしえてくださいな。 a.y b.y common.l という感じで作ってます。 字句解析は共通の common.l でやりたいのですが、 例えば a.y, b.y でそれぞれ %token STRING とやっても、 STRING が a と b で同じ値になるとは限りませんよね。 とりあえず対応表を作ってやってるんですが、 こういう場合のスマートなやりかたはあるんでしょうか。
って よく見たら %token STRING 300 とかできるんですね.... 逝ってきます..
860 :
デフォルトの名無しさん :02/02/15 18:52
>859 自己解決厨 (・∀・)イイ!!
自己解決厨というのは「解決しました」だけ書いてそのままのやつ。 厨とまではいかないだろ
中間コードを出力するスクリプトコンパイラを作るためにyaccに挑戦してみようと思ってます。 早速調べてみたんですが、検索しても「BNF文法を使って・・・」とは書いてあるんだけど、 肝心のBNF文法について記述されているものが見つかりませんでした。 x : expr + expr | expr - expr みたいなものを連ねていけば良いのはわかるんですが、、、 すみませんが、「BNF文法」について解説しているHP等紹介して頂けないでしょうか?
>>862 BNF記法で検索すると、幸せになれるかも。
BNF「文法」じゃなくて「記法」ね。
たびたびすみません...
>>859 の方法でとりあえず動くようにはなったんですが、
そのままだと定数 300 を a.y b.y 両方に書くことになって
保守性がアレなので、なにかいい方法ないでしょうか。
外部プリプロセッサ(m4等)はできれば避けたいので...。
1こ作って#includeしれば?
>>865 yacc宣言部で include できるのですか?
調べているうちに思ったよりいろいろ面白い事が出来そうだなと思ったんで、
1冊書籍を注文してみました。「lex & yacc」ってやつです。
>>863 発見しました。ありがとうございます。
868 :
デフォルトの名無しさん :02/02/24 14:50
一ヶ月くらい前から知識ほとんど0でドラゴンブックを読み進めているんだけど、どうも章ごとの練習問題の解答例がないせいですっきりしない。 明快な解答とは行かないまでも、指針みたいなものがあるHPってないかな? 英語でもOK(っていうか最初から日本語は期待してない)なんで、知っている人がいたら教えてね。
869 :
デフォルトの名無しさん :02/02/26 04:43
誰かいませんか?
>誰かいませんか? 何故「誰かいませんか?」とき(略)
872 :
デフォルトの名無しさん :02/03/12 09:14
>>869 SECDR Schemeというのがあって、
これは末尾再帰を付加したSECDマシンの拡張を使ったScheme処理系らしいです。
これを作ったのは日本人です。
マシン自体の日本語での説明はあまりなかった気がするけど
ソースがわかりやすかったんで参考になるかと。
昔、niftyで落とせました。
873 :
デフォルトの名無しさん :02/03/20 06:47
良スレなんでageとくわ。
javaのクラスファイルを吐く簡単なスクリプトを作ってます。 a = 1 + 2とか整数だけの式は思ったより簡単に処理できましたが .演算子とかクラスが入ってくるとどう処理していいのか分からなくなります。 objはObj型のインスタンスで Obj型のインスタンスを返すFunc()メソッドを持っているとして a = (obj.Func()).Func(); これってどう処理したらいいのでしょうか。 ノードひとつひとつに型を保持したらいいの? うーん、こういうのもlispで作ったほうが分かりやすいのなら 作り直おそうかな。。。
.演算子→.(ドット)演算子
なにがしたいんだい?
ドット演算子のノードをコンパイルできないんです。 . --- instance | . --- instance | var こんな木構造のノードが・・・って分からないですね。。。 すみません、やっぱlispにしてみます。
つーか874だけでは助言しようもないよ >a = 1 + 2とか整数だけの式は思ったより簡単に処理できましたが 簡単に処理できた、とは? a = 1 + 2 の式ではどんな出力になったの?
>>878 えっと
const 1
const 2
iadd
istore 0
です。
>>878 今CLOSの本読んでたんですが、find-classとslot-valueを同時にやろうとして混乱してたみたいです。
lispの表記って気持ち悪いですけど、この表記で考えるとすっきりしますね。
メンテ
882 :
デフォルトの名無しさん :02/04/21 03:38
良スレあげ
883 :
デフォルトの名無しさん :02/04/21 04:17
おいおい 独りでインタプリタ作りますた とか 一週間でコンパイラ作り上げますた とか強者はいないのか?え?
>>883 俺は違うけど、そういう人はごろごろいると思われ。
でもあまり書き込まない。
>>883 そうそう、自慢するような事でもないし。キミも作ってみ。
886 :
デフォルトの名無しさん :02/04/21 08:19
>880 気持ち悪いのは最初だけだよ(ケケケ
887 :
デフォルトの名無しさん :02/04/21 08:24
>>883 Lisp/Scheme スレの過去ログでそんな話題がちらほらあったよ。
C で 2000 行くらいのインタプリタのサンプルもあるから試してみれば?
インタプリタのようなものなら作った。中途半端だけど。 糞コードになって飽きてやめた。 ifとgotoとgosubとforとかしかないN88似のBASIC そのときはネット環境になかったし、資料も手元になかった。 変数の名前はどうしたらいいのか1週間悩みつづけた(藁 自慢するほどのものではないのでクレと言われてもageません。
7行スレにBASICがあるよ。
>889 アレ、意外に速いよ オレのクソインタプリタよりも(w
891 :
デフォルトの名無しさん :02/04/21 18:06
島唄
892 :
デフォルトの名無しさん :02/04/24 05:16
ウィン32でのAPPの作り方を教えてくださいお願いします!
なんじゃ?APPって
あっぷっぷ
895 :
デフォルトの名無しさん :02/04/30 00:19
コンパイラ・インタプリタ方式の処理系を作成しているのですが VMの命令実行部はswitch-caseかthreaded-codeのどちらで 処理した方が速いのでしょうか? それとも差は余りないのですか?
実験してみた?
898 :
デフォルトの名無しさん :02/04/30 05:34
関数ポインタジャンプじゃないの?
900 :
デフォルトの名無しさん :02/04/30 16:49
例えばgccみたいにgotoのラベルをvoid *型変数に入れて、 間接ジャンプできるとする。 void *p = &lab; lab: ... goto p; みたいに。 while (1) { switch (*pc++) { case OP1: /* OP1命令の処理 */ break; case OP2: /* OP2命令の処理 */ break; ... } } とするかわりに、処理ルーチンの入口番地をVMの命令コードにしてしまうと、 while (1) { goto *pc++; label_OP1: /* OP1命令の処理 */ continue; label_OP2: /* OP2命令の処理 */ continue; ... } } と書ける。さらに最適化すると、 label_OP1: /* OP1命令の処理 */ goto *pc++; label_OP2: /* OP2命令の処理 */ goto *pc++; ... みたいになる。これが(direct) threaded code。 関数ポインタを使うのと比べて、returnの処理がいらない。
901 :
デフォルトの名無しさん :02/04/30 18:15
>>900 >gotoのラベルをvoid *型変数に入れて
もうこの時点で理解不能。
いや、理解はできるけどラベルを変数に〜って、できたっけ?
902 :
デフォルトの名無しさん :02/04/30 18:17
あ、gcc*だと*できるのか・・便利だね。 これの利点は関数呼び出し程のコストが掛からない、ってか?
突然ですが。
http://www.empathy.com/pccts/roskind.html に、Jim Roskindというヒトが書いたC++のソースのyaccによるパーサ(でいいよね?)が
あるようです。
templateには対応してない(らしい)ですが。
言語・環境は問わないんで他にC++を解析するようなモノを
どなたかご存知ありませんか?
C++のソースのparsingについては
かなり難しいらしいが
現にdoxygenみたいなのもあるんだし。
templateくらい自分で書き足しなさい。 C++3rdにBNFでの記述無かったか?
>903 そういえばそうですな・・・ みんなそうしてるんだろうか。 がんばってみるか〜 g++のソースは読めたもんじゃなかったし
>>903 =
>>905 doxygenってソース公開されてないのか?
doxygenで目的が達成できるなら、そのソースを取ってくればいいと思うんだが。
age
>>903 結局そうやって集めて何に使うのかね。
目的と手間考えたらアホらしくなるんじゃないかと。
特にC++の場合。
ぬおお sagaってる・・・ >908 結構需要はあるとオモーウヨ VC++のIDEについてるクラスブラウザの もっと正確で使いやすいのを作りたい。 結構身の程知らずだけど・ 反応が少ないのはやっぱりスタンダードなのが無いからかなぁ とりあえずdoxygenのコードを漁るか・・・
911 :
デフォルトの名無しさん :02/05/01 23:55
BSD Magazine の「マイ・シェルを書こぷ」期待 age
912 :
デフォルトの名無しさん :02/05/02 22:46
誰かC++の現在進行形の仕様を満たしたcfrontのオープンソース版を 作って公開してくれ。
>912 「cfrontは使い物にならない」との指摘を 外国のどっかの掲示板で受けている人を見かけたヨ ってかグローバル変数のコンストラクタ関係の所為でC++−>Cの変換が出来ないと 聞いた(確か。
物凄くちっこい86アセンブラ書いたYO!! 命令はmov,add,subだけでAXレジスタonlyで コメント書けなくてエラーチェックもしてないけど・・・(w 結論=使えない俺
次は jmp $+n jz $+n だ!
>>913 c++のプログラムエントリをcのそれにそのままマップするとそうなるけど、
cのプログラムエントリでコンストラクタを起動するように書けば問題ないだろ?
>916う〜確かに あと例外処理とか・・・が無かった気が?<-cfront よく覚えてない。
テンプレートとか考えると、そのCコンパイラで gccをコンパイルしたほうが早い。
実際cfrontが実用化されてる路線で未来が進んでいたら、 どんな環境でもCコンパイラさえあれば済む時代がありえたってのに・・ ─────金のせいですべてが捻じ曲げられた未来が、ここにはあった。
>>916 複数のファイルに分かれているものを、どうやって一箇所に集める?
>>920 んー、確かに無理っぽい。
Javaみたいにコードががクラスの中にしかなければ
(使うクラスは全て分かるから)Singletonパターンで
初期化ルーチンを呼べば良いが、クラスと関係ない
初期化コードは呼び出しようがないな。
例えば、
#include <class1.h>
Class1 c(100);
しか書いてないファイルがあったとして、この初期化
コードをmainから呼ぶようにする方法がない。
>>919 cfrontって速度的にどうだったの?
なんかc++→c→asm→elfってコンパイルするのが遅そうな気がするんだけど。
>実際cfrontが実用化されてる路線で未来が進んでいたら、 >どんな環境でもCコンパイラさえあれば済む時代がありえたってのに・・ なぜgccをつかわないのですか?
>>921 c++って中間ファイル(*.o)を吐き出すのも仕様に含まれていたっけ?
そうでないなら、その機能を省略して、実行ファイルかライブラリ
を直接吐く(1つのcソースにまとめちゃう)仕様にしても問題ないと思うんだけど。
>>924 ライブラリを使うには、いちいちソースからコンパイルし直すわけ?
開発中に1行なおしたら全部ビルドし直す?
そんな不便なもの誰が使う?
926 :
デフォルトの名無しさん :02/05/03 18:30
>>922 その意味でも遅いし native コンパイラでないと使えない最適化手法がある
から、オブジェクトコードの質も悪い。
>>925 そら、そうだが。
cfrontで完全なc++は一応実現できるんじゃないかってことだ
可能だろうな。 もしそうなってたらC++の普及には逆効果だったろうけど。
例外は無理だろ
例外もできるんじゃないか? longjmp使って。
いや、cfrontの方向で進んでいたら、テンプレートやらとはまた違った 発想とかも出てきてたんじゃないかって事なんだけど。 今のC++と同じものをめざすって意味じゃないよ。 速度にしたってインクリメンタルコンパイルとかあるじゃないか。 おまえら、もっと想像力を働かせろ!
932 :
デフォルトの名無しさん :02/05/03 23:28
>>930 スタック巻き戻し(ローカル変数のデストラクタ呼び出し)はどうするんだ?
PC (プログラムカウンタ) とデストラクタを呼び出す変数の対応表を記録しておく
のが一般的だが、その手法って C コンパイラを介すと使えんよな。
>>932 スタックをスキャンしてヒープにコピー。
>>932 ローカルなデストラクタ呼び出しが必要なところで必ず
setjmpしておき、throw時にはそのチェーンを1つずつたどって
デストラクタを呼び出していけば良いんでは。
あるいは、PCのかわりに「位置ID」整数をコンパイラが割り当てて
(文字列でも良いけど)、それと変数の対応表を作っておく。
実行時には位置IDを自分で作ったスタックに積むか、チェーンにする。
>>934 > 実行時には位置IDを自分で作ったスタックに積むか、チェーンにする。
それは、さすがにパフォーマンスに与える影響がクリティカルな気が。
>>935 「遅くても良いからとにかく実現できるか」という文脈だから…
937 :
デフォルトの名無しさん :02/05/04 01:33
>>921 >Class1 c(100);
>しか書いてないファイルがあったとして、この初期化
うーん、そんなのプリプロセス段階で
mainに写し書いちゃえばいいんでは?
デバッガで挙動が違うって文句は来そうだけど。
そういう仕様です、でいいじゃん。
>>932 オブジェクトかブロック毎に隠しリンクでも持たせておいて、
スタック巻き戻しをする前に例外をキャッチするところまで
デストラクタ関数を起動する。だめ?
(うお、ageやがった。)
>>937 >うーん、そんなのプリプロセス段階で
>mainに写し書いちゃえばいいんでは?
だから分割コンパイルは無理だよね?という話。
それをあきらめればできるってのは分かった。
>オブジェクトかブロック毎に隠しリンクでも持たせておいて、
>スタック巻き戻しをする前に例外をキャッチするところまで
>デストラクタ関数を起動する。だめ?
>>934 とどう違うの?
どうやらがいしゅつだったようですね。
>>938 > だから分割コンパイルは無理だよね?という話。
オリジナルの cfront は nm (オブジェクトファイルからシンボル情報を抽出する
コマンド) を使ってシンボル情報を抽出、その情報を使って非ローカルオブジェ
クトのコンストラクタを走らせるコードを生成してたんじゃかった?
えーっと、ファイルごとの初期化ルーチンを __ファイル名_init() とかの名前にしておいて、それを呼び出すとか? Unix依存だがそれなら可能かな。
>>941 それならnmなんていらないじゃん。
標準的なCでできるってことだね。
944 :
デフォルトの名無しさん :02/05/05 03:56
>>943 なぜ?
ファイルがリネームされたときとかの話?
分割コンパイルだと、どのモジュールを利用するか特定できないから、 スタートアップルーチンを走らせる手段がない。
?リンク時には分かるよね? その時にスタートアップルーチンを動的に 作れば、っていう話だと思っていたのだが。
>>947 そっか。ライブラリね。
トリッキーなライブラリの作り方をすれば
何とかなりそうな気もするが、nm使った方が楽だな。
じゃあ、
1.まずmain()の前に__init_all()を呼び出すスタートアップルーチンを
用意しとく。
2.可能な限りリンクしてみる。
3.__init_xxxx()という関数名をnmで探す。
4.それらを呼び出す__init_all()を作ってリンク。
で、完成。
__init_xxxx()の間の依存関係は、
1.xxxxにmangleしておいて、__init_all()で正しい順で呼ぶ。
2.各__init_xxxx()が判断して「後でもう一回呼べ」という値を返す。
__init_all()の中で、そういうやつがいなくなるまで繰り返し呼ぶ。
デバッグでeaxが使えないのは何故なんでふか?
950 :
デフォルトの名無しさん :02/05/05 16:47
ロボ鉄
>>949 お返事ありがとうございます m(..)m
そ、そういうことだったのですか。
ワケワカラン
ワラタ GW厨万歳
次スレテンプレ用意
>>960 次スレ立てろ >> 961
もう少し・・・・ もう少しなんだ・・・・ 2chよ!私は帰ってきた〜!!
957 :
デフォルトの名無しさん :02/05/06 11:27
>>956 ML版がメインでCとJavaは誤植だらけという噂を聞いたので
ML版を読んだよ。ML版については、とってもよかった。Java
版とC版の真実は知らない。
次の人、ヨロシク
960 :
デフォルトの名無しさん :02/05/06 19:43
スタックマシンからレジスタマシンへ命令の変換は簡単に出来るけど、 その逆って出来ないんですか?
>>960 非効率なだけで 出来ない訳じゃないだろ
962 :
デフォルトの名無しさん :02/05/06 20:55
>>960 もちろんできるよ。
たとえば x86 の浮動小数点コプロセッサはスタックマシンだけど、ふつーの C 言語
などで書かれた式(変数を自由に使える高級言語は、いってみればレジスタ数無制
限のレジスタマシン用アセンブラみたいなものだよね)をコンパイルできるでしょ?
ただし、純粋なスタックマシン、即ちスタックトップしか見えずにスタックトップとその
下のものを入れ替えたりできないマシンだと、極めて非効率で実用に耐えない筈。
どうにかAH-DH,AL-DLまで使えるようにしたでやんすでワショーイ 徹夜明けなんで来てます来てます、ピピピ(´∀`;)
寝るのも仕事のうちだぞ
1000に成るまで密かに頑張りまっす。 今日はmovのword ptr とbyte ptr修飾子?もサポーテッド、OK!
LL(K)で質問なんですが、 G=({S,D},{0,1},S,P) S->S1 D S.v=2*S1.v + D.v S->D S.v=3*D.v D->0 D.v=2 D->1 D.v=1 のグラマーで、左再帰を削除して、syntaxとsemantic ruleに直して、 S.vというグラマーを作らないといけないのですが、どのようにして つくったらいいでしょうか?ヒントだけでもいいので教えてください。 お願いします。
967 :
デフォルトの名無しさん :02/05/11 22:59
そろそろ次のスレ立てるか・・・
てことで、
>>968 よろしく
968 :
デフォルトの名無しさん :02/05/11 23:01
>>967 >そろそろ次のスレ立てるか・・・
言ーだしっぺの法則つーことで、あとよろしく。
はい。がんばります。 つか、残り31レスどうしようか・・・
ねぇ アセンブラマクロのdbはどうやって実装しようか?
お好きなように
974 :
KOKUYO :02/05/30 14:10
質問!!member関数を、第2引数のリストの深いレベルまで 第1引数を探索して取り除くように拡張した関数はどうやって 作ればいいんですか? あと、二重以上のリストを第一引数として受け取り、 深さ1のリストとして返す関数はどうすればいいんですか? 動作例)(makeflat '(a(b c)((d(e)f)g)h)) →(a b c d e f g)
975 :
デフォルトの名無しさん :02/05/30 14:11
マルチはともかくなぜこのスレに書いたのか分からん・・・
コソーリ 1000 でも狙うか。 途中で DAT オチするのがオチかもしれんが。
LALR(1)
文脈自由文法
979
980
ふうむ
982?
1000!
1000!
あとはすきにして
1
む?
ん?
1000
1
0
1000 :
1000 :02/07/07 15:57
さあ、はじめりです。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。