【コンパイラ・スクリプトエンジン】相談室

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
yaccやlexの使い方やら言語仕様やらの話題。
2リンク:2001/02/09(金) 07:58
3これでどうよ:2001/02/09(金) 11:14
4デフォルトの名無しさん:2001/02/09(金) 11:26
ここも。
http://compilers.iecc.com/

それとガベージコレクタの話題もOKにしない?
5デフォルトの名無しさん:2001/02/09(金) 21:17
ガベージコレクタはマークスイープ法の他に何かありますか?
C/C++でガーベジコレクタは必要だと思いますか?
LISP/Schemeだとセルの大きさが一定な事が多いから、かなり回収率が良い気がしますが、この推論は正しいですか?
6デフォルトの名無しさん:2001/02/09(金) 21:20
スクリプトの実行は一般的にインタプリティング、または仮想機械で行なうので遅いです。
ネイティブオブジェクトコードに変換して実行するうまい方法はありますか?
74:2001/02/09(金) 21:20
>>5
> ガベージコレクタはマークスイープ法の他に何かありますか?
http://www.iecc.com/gclist/GC-faq.html
とかどうですか?
84:2001/02/09(金) 21:24
>>6
そういう用途にはスクリプト言語を使わずに
Cで書いたのを呼び出すとかしたほうがいいと思います。

一応こんなのもあるみたいです(ネイティブコードを実行させている)。
http://www19.freeweb.ne.jp/computer/yaneurao/ygs2k/
9デフォルトの名無しさん:2001/02/09(金) 21:31
GCは束縛されているオブジェクトのメモリの移動まではできないから、
malloc/freeの問題と同じと考えて良いでしょうか。
best-fit法とかfast-fit法ぐらいしか知らない者で…。
106>8:2001/02/09(金) 21:33
おお!凄いですね。ゲームで使われているのですか。
もしかして、最近のエミュレータとかもこういう形式ですかね。
115:2001/02/09(金) 21:39
>7
参照カウンタ(リファレンスカウンタ)は自己参照がある場合は使えないですね。
JargonとCopyingはどんなアルゴリズムかな。
124:2001/02/09(金) 21:58
>>11
(よく知らないですが)Jargonってのはアルゴリズムじゃなくて
その分野特有の言葉のことだと思うんですけど、、、

http://www.iecc.com/gclist/GC-algorithms.html#Jargon
root setとかlive dataとか書いてるし。
13デフォルトの名無しさん:2001/02/09(金) 23:29
>>9
メモリ領域の移動(空き領域を1つにまとめる。デフラグみたい?)
はメモリコンパクションって呼んで
厳密にはGCとは別物
ただ一緒にやってしまうGCの実装も多そうだし
アルゴリズムによっては下記みたいに自動的に
コンパクションもできてしまうものもある
>>11Copyingはたしかヒープを2つに分けて片方がいっぱいになったら
必要なものだけたどってもう一方にコピーするヤツだと思った
メモリの無駄が多いけどコンパクションも一緒にできる
14デフォルトの名無しさん:2001/02/09(金) 23:38
>>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とかの規格に準拠させるならそれなりに大変なんだけども。
それでも他の言語よりは楽かな?
18デフォルトの名無しさん:2001/02/10(土) 12:52
自作コンパイラage
19デフォルトの名無しさん:2001/02/10(土) 18:46
Schemeが流行るといいなage
20デフォルトの名無しさん:2001/02/10(土) 19:47
CommonLISPはそれなりなんてレベルじゃないよ。
schemeもR5RSにキッチリあわせようとすると一月はかかるね。
21デフォルトの名無しさん:2001/02/10(土) 21:00
>>20
一ヶ月ですむならやってみようかなぁ…
22デフォルトの名無しさん:2001/02/10(土) 22:43
http://www.jah.ne.jp/~naoyuki/index.html
scheme実装とか載ってる。
あとソースも公開されてるし。参考になるかな
23デフォルトの名無しさん:2001/02/10(土) 23:27
俺の上司が昔8KバイトのROMにLISPのインタプリタ
を押し込んでいたな・・。
24デフォルトの名無しさん:2001/02/10(土) 23:28
>21
最新のR5RSじゃなくてもR4RSに準拠すればオンライン上にある大抵のスクリプトは通るよ。
(あんま変わらないかもしれないけど。)
がんばってね。
25デフォルトの名無しさん:2001/02/10(土) 23:30
昔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
>>28
その本、今日買ったんですけど・・・
>>32
気が狂うほど期待です
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以外の手段はありませんか?
自分でやるのは大変過ぎるからパスですけど…
39デフォルトの名無しさん:2001/02/13(火) 01:56
bison/flex

あと、kmyaccとか言うのがなかったっけ?
40デフォルトの名無しさん:2001/02/13(火) 02:10
>39
それ全部似た様なモノでしょ?
C程度の構文なら自分でスタック作ってやった方が速いよ。>38
4139:2001/02/13(火) 08:47
>>40
マジレスしちゃいやん♥
42デフォルトの名無しさん:2001/02/13(火) 12:23
[PolyEditのマクロ言語エンジンの解説]
http://www.doga.co.jp/ptdoga/rensai/cmaga/9611.htm

つーか。
ソフト製作が容易になったせいでコンパイラの需要が増えたのか。
or コンパイラ技術が簡単になったのか。

なんにしても最近独自のスクリプト言語増えすぎ。
なにか標準的な言語を策定してくださいませませ>ISO

43ISO:2001/02/13(火) 12:32
Perlに決定しました。
それは置いといて、

>>42
別に色々あってもいいんじゃない?
44デフォルトの名無しさん:2001/02/13(火) 13:06
ALGOL 200x,,,
45デフォルトの名無しさん:2001/02/13(火) 18:46
LL構文解析はスタック作って、ヒープ領域に置いたほうがいい?
それとも、再帰使ってスタック領域を利用した方がいい?
46sage:2001/02/13(火) 19:12
>>45
LL構文解析に限った話題じゃないね sage
エラー処理はOSに任せてスタック使ったら?
4732ではないですが:2001/02/13(火) 21:34
>>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
>>51CならK&Rの付録についていたような、、、
53デフォルトの名無しさん:2001/02/14(水) 12:15
>43
ソフトごとにマクロ言語を覚えるのが面倒です(^^;

誰かが優秀な言語のスクリプトエンジンを公開すれば
多分それがデファクトになるのかなぁとも思うんですけどね。
54デフォルトの名無しさん:2001/02/14(水) 12:35
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";
}
56デフォルトの名無しさん:2001/02/14(水) 16:17
おお、おもしろそう
57デフォルトの名無しさん:2001/02/15(木) 00:33
compiler.age();
58デフォルトの名無しさん:2001/02/15(木) 12:56
>>55
ソースでの配布キボンヌ。
5955:2001/02/15(木) 23:13
>>58
>>55 は「こんなのだったらーいいなー」ってのを書いただけです。。。^^;
作ってるのは作ってるんですけどForthっぽい+自前のGCを装備というやつです。

60デフォルトの名無しさん:2001/02/15(木) 23:41
age
61baka:2001/02/16(金) 00:51
ほんとに頭よい人は、日本語の文法に由来するコンピュータ言語を
開発してます。英語の文法に由来する言語なんて開発したって、ま
してそれらを理解して使っているレベルでは奴隷以外の何物でもな
いよん。原点に返って日本語で考えることからスタートしないと
日本はいつまでたっても追いつかないのだ。つーか、中国に追い越
されるよん。あっちの人はさすがに精神的な文化レベルは日本にも
ひけをとらないため、ユニークな言語があるよん。それも中国語に
由来する文法で考えたコンピュータ言語が。

62デフォルトの名無しさん:2001/02/16(金) 01:10
>>61
これは日本語に由来してますか?
10 a =
# 10をaに代入する
63デフォルトの名無しさん:2001/02/16(金) 01:48
>>61
こんなスレにも煽りがいるのか。
そんなあなたはMINDを使っててください。

あと、そのユニークな中国製言語の具体例を挙げてください。
さぁ、どうぞ。
64デフォルトの名無しさん:2001/02/16(金) 02:28
ま、面白そうかなとは思うけどね。
しょせんは英語読めない人間の戯言でしょ。

時に、中国語の文法は日本語より英語の文法に近いんじゃなかったっけw
65デフォルトの名無しさん:2001/02/16(金) 02:40
何を言う! 我らにはギコBASICがあるではないか!
66baka:2001/02/16(金) 02:45
ば〜か、中国語が英語に似てるにはS+Vと動詞に慣用的にくっつく
一部の前置詞くらいのもの。時制なんか日本語のほうに近いよ。
例えば中国語に完了形なんてない。
中国製の言語か?自分で調べろ。誰がタダで教えるか。
確かに俺は英語読めないかもしれんが、少なくとも64よりはあ
るよん。
あおったつもりはない。聖書を読んでああでもないこうでもない
と屁理屈いってるやつと同じレベルの君たちに危機感をもっただ
けだよん。
67baka:2001/02/16(金) 02:55
>62

おっと見落としてた。何がいいたんだ?なんの反応もできないが
しょせん俺もバカだから許してくれ。一言いわせてもらえば
そーいう解釈する普通の日本人がどれだけいるかが問題だ。
そーいうルールを作ったとして、拡張、応用していけるかが問題
だな。拡張、応用するにしたがって解釈するのにヘイコラとなっ
たらその言語は失敗だ!
それしか胃炎。


68デフォルトの名無しさん:2001/02/16(金) 06:45
>>66
えっと、プログラミング言語についてかんがえてるんですよね。
時制ってそんなに関係のあるものってわけでもないと思います。
むしろS+Vみたいな部分のほうが大切。
69デフォルトの名無しさん:2001/02/16(金) 09:21
おお。bakaの意見は、煽りと思わせつつ、かなり建設的ではないか!
70デフォルトの名無しさん:2001/02/16(金) 09:41
わけわかんないこと叫んでるbakaがいるなー。
英語に由来しようが、日本語に由来しようが、
数あるプログラミング・パラダイムに沿って
プログラムを組み立てられなければ実用性なし。
せいぜい理想を追っかけててください。
71デフォルトの名無しさん:2001/02/16(金) 10:56
>>baka
バカなら黙ってろ。

ところでMLみたいな関数型言語を作ってみようという人はいませんか?
72デフォルトの名無しさん:2001/02/16(金) 11:14
>>66
>中国製の言語か?自分で調べろ。誰がタダで教えるか。

そりゃ、知らないものは教えようがないよね。
73デフォルトの名無しさん:2001/02/16(金) 11:18
>>68
そうだね、プログラム言語に過去とか現在なんて概念はないし。
>>66が言ってることは、ちんぷん漢文だよ(藁
74デフォルトの名無しさん:2001/02/16(金) 11:20
>>66
君が>>64よりも英語ができると思った根拠を示せ。
75デフォルトの名無しさん:2001/02/16(金) 11:45
話題を変えようぜ。
関数型言語ってどんなのなんですか?
全部が関数で作られてるとか???
76デフォルトの名無しさん:2001/02/16(金) 11:49
>>66
今何時ですか?
77デフォルトの名無しさん:2001/02/16(金) 12:02
>>75
この辺とか。
http://www.gin.or.jp/users/daikoku/ml/whatml.htm

Appelのコンパイラ本(タイガーブック)にはML、Java、C版があって、
本来意図したのはML版だそうです。なのでJava版やC版の記述に
は不自然な箇所が結構あるそうなのですが、私はC版しか読んで
ないので、具体的にどこなのかよくわかりません。

タイガーブック
http://www.cs.princeton.edu/~appel/modern/
ドラゴンブックよりも実践指向で、オブジェクト指向言語とか最近の
トピックも押さえているので、ぜひ日本語版が出てほしい本です。
78デフォルトの名無しさん:2001/02/16(金) 22:41
>>75
ループが無いとか、
変数に代入ができない(するべきではない)とか、
わたしも最初、「こんなのでプログラム書けるの?」と不思議でした。
でも、慣れるとCやJavaよりすっきりとしたコードで
プログラムできるんですよ。

日本語では
「プログラミング言語ML」ウルマン、アスキー
「プログラミング言語」武市正人 岩波講座ソフトウェア科学
が関数型言語を解説しています。
79デフォルトの名無しさん:2001/02/17(土) 00:27
完全なオブジェクト指向の言語ってどうもとっつきずらいです…
C++なんかはオブジェクト指向のいいとこどりみたいでいいかんじだと思うんですが、
どうでしょう?
やっぱりオブジェクト指向なら完全にオブジェクト指向でいかないとだめなもんですか?
80デフォルトの名無しさん:2001/02/17(土) 00:45
オブジェクト指向プログラミング言語と他のオブジェクト指向なんちゃら
はちょっと違うよーん。JavaとかC#みたいなのはそのオブジェクト指向設計
とかと親和性が高いというのが使いやすい人にとっては使いやすいよーん。
81部外者A:2001/02/17(土) 01:31
>78
Lisp/Schemeも関数型言語じゃなかった?
ローカル変数使えるけど。
MLが完全な関数型に近いと聞くけど、どうちがうのか調べてないのでわからんです。
82デフォルトの名無しさん:2001/02/17(土) 02:27
83デフォルトの名無しさん:2001/02/17(土) 03:28
言語処理系は一から自分でアルゴリズムを考えようとすると死にそう
ですが、みなさんどんな本を読みましたか?
洋書の定番として読みにくさの順で、

ドラゴンブック
タイガーブック

あたりだと思いますが、他にもっと読みやすい本とかないでしょうか?

パーサや正規表現の解説も「yaccとlexに頼れ」で飛ばすんじゃなく、
ある程度わかりやすく説明して本がいいのですが。
84デフォルトの名無しさん:2001/02/17(土) 05:50
C++はテンプレートがかなりいい。
でも、規則の組み合わさり方が複雑すぎる。
85デフォルトの名無しさん:2001/02/17(土) 06:41
>>80
>よーん
馬鹿?(ワラ
86デフォルトの名無しさん:2001/02/17(土) 06:51
>>85
まあまあ、別に「よーん」って言おうが言うまいが、コンピュータ言語
について話す上では関係ないことだし。
つーか、そんなとこにいちいち突っ込む君の方が馬鹿じゃん。
87デフォルトの名無しさん:2001/02/17(土) 11:20
ていうか意味わかんねーなと思ったけど、80。
88デフォルトの名無しさん:2001/02/17(土) 12:57
よーん、、87がいじめるモナー
         ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄
           ∩_∩
          ( ´Д⊂ヽ
         ⊂    ノ
           人  Y
          し (_)
89デフォルトの名無しさん:2001/02/17(土) 14:01
赤塚ファンが苛められてるな。
いや、とりみきファンの可能性も、、
9083:2001/02/17(土) 18:14
だれか洩れの質問>>83に答えてください。
91not 83, not 90:2001/02/17(土) 23:19
>>83
ageなきゃ意味ないだろー。
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
実装だけならドラゴンブックいらん・・・。
9983: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

のことです。
ドラゴンブックの竜に対して、こちらの表紙は虎になっています。

ドラゴンブックよりも薄くて読みやすいとか、新しい分だけ最近の
トピックを押さえているとかの良い部分もあるんですが、字句解析
や構文解析の説明をはしょり気味な内容です。

理論よりも自分で実装することに興味があるので、ドラゴンブック
は読んでてつらいのです…
10083:2001/02/18(日) 07:20
>>99
一行目の「ドラゴンブックとは、 」は「タイガーブックとは、 」の間違いです。
101デフォルトの名無しさん:2001/02/18(日) 07:47
>>99
実装より理論のが簡単なんだって。
102デフォルトの名無しさん:2001/02/18(日) 08:35
>>101
え?理論なんて全然知らなくても、yaccなどの助けで
実装できるよ。
一方、構文解析等の理論は本格的な学問で奥が
かなり深い。
103デフォルトの名無しさん:2001/02/18(日) 08:49
>>102
yacc/lexに頼らないってのがそもそもの前提じゃん。
>>83
を参照。
10483:2001/02/18(日) 10:19
>>103
えと、yacc/lexを使いたくないというんではなく、ブラックボックスなのが
気持ち悪いので、いちおう基本理論の理解だけしておきたいという程度
です。「ドラゴンブック読め!」と言われるのはわかっているんですが、
難解で…
10583:2001/02/18(日) 10:22
age忘れ。
106103: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.
10883:2001/02/18(日) 12:59
>>107
ありがとうございます。
コンパイラ初心者におすすめというか、あまりアカデミックでない実践
指向な本はこの中にあるでしょうか?

英語でもかまわないのですが、コードの例が多い方が嬉しいです。
竜本も虎本もコンパイラの完結したコード例がついてないのが、
ちょっと好きになれません。

ところで理系の本の著者名でよく見るet al.って、どういう意味なんで
しょうか?ネタに訊いているわけではなくて、本当に知りません。
109デフォルトの名無しさん:2001/02/18(日) 13:27
>108
et al.「〜と愉快な仲間達」
110ミトコンドリ子:2001/02/18(日) 13:43
>>107
情報ありがとう。

>>83=108
コードの例が載ってなくても、アルゴリズムが理解できて、
実装できるようになんなきゃダメよ。それにドラゴンブックだって、
ちゃんと擬似コードで説明してるじゃない。
コンパイラじゃなくても、わりとアカデミックよりな文献だと
環境が特定されているサンプルコード(打ち込んだらすぐ動く)なんて
ついていること少ないわよ。擬似コードすらないこともザラよ。
(分野によるのかしら?)

逆に、理論からコードに起こすことが、必要ない、やりたくない、
できない、人のためにlex/yaccみたいな処理系が普及してるわけでしょ?
がんばりなさい。

et al.って、「ほか何人か」って意味じゃなかったかしら。
辞書に載ってるわよ。
11183:2001/02/18(日) 14:40
>>106
>>93読んでみます。
ただ、海外在住なもので入手がちょっと大変です。
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のサブセットとか。
116コンパイラ屋(にせもの):2001/02/18(日) 16:11
大事な本をわすれてはおらぬか?

麻宮騎亜,
コンパイラ1,
講談社,1999,ISBN 4062606100.

麻宮騎亜,
コンパイラ2,
講談社,1999,ISBN 4062606119.

117デフォルトの名無しさん:2001/02/18(日) 16:22
Delphi屋になってから、Lex/Yaccから遠ざかってたけど
http://www.musikwissenschaft.uni-mainz.de/~ag/tply/tply.html
ここらあたりから勉強し直してみよーかなーと言ってみるテスト
やっぱPL/0からかな
118デフォルトの名無しさん:2001/02/18(日) 17:00
> 原田賢一,コンパイラ構成法,
> 共立出版,1999, ISBN 4-3200292-2, 6500円.

これはコードがネットに落ちてるから拾ってくるといーよ。
本の値段はちと高いな...

ttp://www.hara.ics.keio.ac.jp/kCompiler/index.html
119コンパイラ厨房:2001/02/18(日) 18:29
インターフェース増刊でコンパイラ実装の特集号があった記憶がある
んですが、あれはどうでしょうか?
120デフォルトの名無しさん:2001/02/19(月) 19:45
age
121ななしさん:2001/02/19(月) 20:17
Grail+プロジェクトで技術的援助を求めてるみたい。
2ちゃんで支援要請しなさい、それはあるから。
と書いてみる。

122Yet another コンパイラ屋:2001/02/19(月) 20:23
Grail+プロジェクトって何ですか?
123デフォルトの名無しさん:2001/02/19(月) 23:16
本ばっか読んでてもしょうがない。
実践しろ。>コンパイラ厨房
スキルは後から付いてくるから。
124デフォルトの名無しさん:2001/02/20(火) 00:56
本読むのはスキルのためではないと思うが。
125デフォルトの名無しさん:2001/02/20(火) 01:03
コンパイラ厨房へ:
とりあえずそこらへんの小さなインタプリタのソースを読め
自分でも何か作れ
本もきっちり読め
以上.下がってよし.
126デフォルトの名無しさん:2001/02/20(火) 01:55
スクリプトエンジンってやっぱり最適化なんてサ行はしてないですよね?
ソース書く人が自分で最適化するんですよね?
127言い訳パターン1:2001/02/20(火) 02:21
>>126
そこまで速度が要求される場面には使わないでください。
もしくはC言語で拡張してください。
とか。。。
128デフォルトの名無しさん:2001/02/20(火) 02:31
言い訳というよりは、それをやったら「スクリプト」でなくなるという
感じではないかね。
129126:2001/02/20(火) 05:22
>>127
CGIとして使う場面でも速度を求められる場合があると思いますが…
どちらにせよ遅いより速い方がいいですし、
それに最適化って速さだけじゃないでしょ?
CGIって最適化してコンパイルされたものをどっかに保存してそれを実行みたいなふうにはできないのでしょうか?
CGIファイルが更新されたらまた再コンパイルして。
130デフォルトの名無しさん:2001/02/20(火) 07:41
>>129
CGI自体のオーバーヘッドがそれなりにあるので、Java Servletを使う
方が得策です。
131デフォルトの名無しさん:2001/02/20(火) 08:00
130につっこみいれてぇ…
132デフォルトの名無しさん:2001/02/20(火) 09:35
挿れちゃってくださいな。>131
そして逝かせちゃってください。
133デフォルトの名無しさん:2001/02/20(火) 10:09
さすがにネタだと思われ。
134デフォルトの名無しさん:2001/02/20(火) 14:25
>>129 mod_perlは最適化はどうかは知らないが
メモリ上にperlスクリプトをコンパイルした状態で保持します。
135デフォルトの名無しさん:2001/02/22(木) 02:57
アセンブラからCソースを吐くようなコンパイラ(逆コンパイラ?)ありませんか?
結構おもしろいとおもうんだけど、やっぱ難しいのかな?
136デフォルトの名無しさん:2001/02/22(木) 03:08
でこんぱいら
137デフォルトの名無しさん:2001/02/22(木) 19:29
でじこんぱいら
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って実装は楽そうだけど、自分で使いたいかって考えると…
あんなカッコだらけのソースコード見たくないですよ、カテジナさん!

ついでに愛用エディタの秀丸だと、対応カッコのハイライト機能も
ないですよ、マーベットさん!
142デフォルトの名無しさん:2001/02/25(日) 07:40
>>141
秀丸に対応括弧のハイライト機能はあるよん
143コンパイラ厨房:2001/02/25(日) 08:34
>>142
ホントだ。
最近Visual Studioばっか使ってたから、鬱だ、氏のう。
144デフォルトの名無しさん:2001/02/25(日) 13:13
とりあえずschemeのインタプリタ書いて
あとでパーサだけ取り替えれば?
145デフォルトの名無しさん:2001/02/26(月) 00:34
そういやLips/Schemeって、数式は逆ポーランド表記で括弧が必要ない
のに、それ以外の部分で括弧だらけだよね。どういうポリシーだ?
146145:2001/02/26(月) 00:35
○ Lips
× Lisp
147デフォルトの名無しさん:2001/02/26(月) 00:38
>>145
?言いたいことがよくわからない。
LispもSchemeも1+2や10-5は
(+ 1 2)
(- 10 5)
こう書くよ。
148146:2001/02/26(月) 00:42
逆だ…鬱。
149145: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
159デフォルトの名無しさん:2001/02/26(月) 23:41
abcdefg.y contains 1 shift/reduce conflict
うう
160デフォルトの名無しさん:2001/02/26(月) 23:44
作(使)ってるうちに嫌でも慣れるぞ>155
その中だとLISP/Schemeはちょこっとしたプログラムなら完成するのが比較的早いと思う。
161デフォルトの名無しさん:2001/02/26(月) 23:48
私も、アプリケーションのカスタマイズ用の言語が欲しくて
探したりしたりしてるのですが
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
附属スクリプト?
なんで?そんなことライセンスに一言も書いてないよ。
164age!:2001/02/28(水) 11:36
>>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
いきなりトンチンカンな事書くな、解決ぜんぜんせんやんけボケ
174デフォルトの名無しさん:2001/03/14(水) 14:22
C++おぼえたてを自慢したい年頃なんでしょ(^^;
ちなみに私はコンテナに登録する方式ですが、美しくない・・・ぅぅ
175デフォルトの名無しさん:2001/03/14(水) 14:33
union にデストラクタと代入演算子がつけられたらと思う今日この頃。
176170:2001/03/14(水) 15:55
177デフォルトの名無しさん:2001/03/14(水) 17:04
おぶじぇくてぃぶぅシーだああぁぁああ。たすけてー。
178174:2001/03/14(水) 17:44
>>171
おれと同じじゃん。
しかし、なぜに Objective C な訳?
179174:2001/03/14(水) 17:46
間違えた
>>171>>176
180170:2001/03/14(水) 19:02
>>177
Objective-Cってやってみればわかるけど
(C++と比較にならないほど)素直でいい言語だぞ。

この辺から読んでみるとか。
http://www.fsinet.or.jp/~nito/OSPT/Objective-C.html

コンパイラはGNUの実装もあるけど
Stepstone系のObjective-Cコンパイラ(トランスレーターだけど)
http://users.pandora.be/stes/compiler.html
が個人的には好き。
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
見てるこちらは、ちょっと困ったかも(笑)

185169:2001/03/15(木) 13:17
>>175
コントラクタとデストラクタがあればフック関数つくれるということでしょうか。
たしかにあったら使えるかも知れませんね。

186デフォルトの名無しさん:2001/03/17(土) 11:32
>>184
ガベージコレクションでもいろいろ種類があるそうですから、
その中で一番実装が簡易なものを使うのが良さそうな気がします。
(トリッキーな方法を使うぐらいなら、ですが。)
187デフォルトの名無しさん:2001/03/20(火) 00:22
コンパイラを作ってみたいのですが、
大学の授業とかで使われるような解りやすいソースで、
Cのコンパイラのソースってどこかにありませんか?
188デフォルトの名無しさん:2001/03/20(火) 00:34
>>187
URL忘れたけど、電通大(http://www.uec.ac.jp/)の情報工学科 渡辺研究室にTinyCってのがあるよー。

uecの学生より
189デフォルトの名無しさん:2001/03/20(火) 01:51
>>188
ここですね。
http://watalab.cs.uec.ac.jp/tinyCabs.html
ゆっくり勉強したいと思います。どうもありがとう。

あと、bisonとflex関連も見つけたんでリンクしときます。
http://www.omoikane.co.jp/i/info/html/bison-1.28/bison-ja_toc.html
http://www.omoikane.co.jp/i/info/html/flex-2.5.4/flex-ja_toc.html

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デフォルトの名無しさん:2001/03/21(水) 20:27
198デフォルトの名無しさん:2001/03/21(水) 20:41
>>197
TinyCとMicroCって全然別物なんじゃ…
199デフォルトの名無しさん:2001/03/21(水) 23:11
>>191
スキャン画像を無理やりpdfにしてるから
スクロールが重くてしかたない
なめてんのか、と思った
内容も浅いんで専門書読んだほうがいいでしょう
200デフォルトの名無しさん:2001/03/22(木) 01:24
Zendはどう?

と、流れをぶちきってみます
201デフォルトの名無しさん:2001/03/22(木) 02:16
C--
202デフォルトの名無しさん:2001/03/22(木) 23:27
今日、194の本立ち読みしてきた。
で、FirstとかFollowとかよくわからなかった。
それを使って表を作ってそれをもとにプログラム書くみたいだけど(LL(1))、
とりあえず意味はよくわからんかったけど、方法はわかったような…。

だれか、FirstとFollowの説明だれかお願いします。
金がないので買えませんでした。
203デフォルトの名無しさん:2001/03/23(金) 00:51
>>202
YaccとLex使ってください。
204デフォルトの名無しさん:2001/03/23(金) 02:34
Firstが、その非終端記号の一番初めに来る可能性のある終端記号の一覧。
Followが、その非終端記号の直後に来る可能性のある終端記号の一覧。
205デフォルトの名無しさん:2001/03/23(金) 23:11
yaccの解説本だと、電卓とかCライクな言語が解説されている本が多いけど、
N88-BASICみたいな昔ながらのステートメントを並べるタイプの言語を
yaccで解説している書籍orURLご存知ありませんか?
206デフォルトの名無しさん:2001/03/24(土) 11:57
>>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 は、頭つかうより体つかってやってみてね。
どっかのクソ教授の書いた本なんか使えるようになってからでなきゃ理解できんものばっかりです。
まあ、コンピュータ関連のツールは総じて頭より体なんですが・・・
217いつでもどこでも名無しさん:2001/03/28(水) 10:32
体育会系アホプログラマ発見
218216:2001/03/28(水) 14:00
すまんねぇアホで。
でも実際頭で憶えられんもんって一体いくつあるんでしょ。
頭使えると云うのでしたら理屈書いてみたら?
論破してやろうか?
219デフォルトの名無しさん:2001/03/28(水) 21:23
yaccあげ
ついでに >>216 激しく同意
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)のみで完結する文法なら手作業でもいいけど。
速度は手作業が有利なのには変わりなし。
224デフォルトの名無しさん:2001/03/31(土) 07:47
Cライクなスクリプトエンジン考えてたんだけど、はたと気がつけば普通のC言語のプログラムと何ら代わらないと言うことに気がついた(鬱だ‥‥‥

ということで、スクリプトエンジンの利点って?
225デフォルトの名無しさん:2001/03/31(土) 07:56
>>224
コンパイルしなくて済む。
226>224:2001/03/31(土) 08:34
自分のソフトに組み込める
227>224:2001/03/31(土) 08:37
他人に技術力を誇示できる
228デフォルトの名無しさん:2001/03/31(土) 10:10
ソフトを拡張してくれる人が出てくる
229デフォルトの名無しさん:2001/03/31(土) 11:58
>>224
WZ editorのマクロがCライクだったような気が。
230デフォルトの名無しさん:2001/03/31(土) 13:55
>>224
実行速度が遅い言い訳になる。
「いや、何せスクリプトで動作しているものですので・・・」
231デフォルトの名無しさん:2001/03/31(土) 16:03
>>224
多くても安心。
232デフォルトの名無しさん:2001/03/31(土) 16:24
>>224
パクりパクられの関係なのに平和
233デフォルトの名無しさん:2001/03/31(土) 17:12
>>224
突然のお客様にも安心
234デフォルトの名無しさん:2001/03/31(土) 17:25
>>223
よほど特異でなければ、flex 程度でいいと思うよ。
文脈依存型の文法で語彙の意味がコロコロ変わるのは手書きにすると
てき面に効くような気がする。
あと、流し込み型ではなくて、う〜ん例えばタブの位置で文法が
決まるようなミョウチクリンな言語を作る場合とか、
例の上の方で発言されていた fori=0to の問題見たいなのとかは、変わると思うよ。
ちなみにタコが strcmp とか使って作った奴使うくらいなら間違いなく flex の方が
いや・・・lex でもその方が速い。
はっきりいって素人じゃ flex には勝てんです。
素直に flex で書いて、チューニングした方がいい。

235デフォルトの名無しさん:2001/03/31(土) 17:27
レス先間違い >>223 -> >>221
236デフォルトの名無しさん:2001/03/31(土) 17:41
>>224
萌えられる。
237デフォルトの名無しさん:2001/03/31(土) 19:11
bison/flexが出力するソースはなんであんなに汚いんだ。
C++/Java用のパーサクラスを出力するようなツールってないんかな。
238デフォルトの名無しさん:2001/03/31(土) 19:26
>237
検索せよ。
JavaCC
http://www.metameta.com/
とか。
239名無しさん:2001/03/31(土) 19:31
逆にどうすれば美しいスケルトンになると思う?
漏れもジェネレーターやるから意見聞きたい。
lexでC++をサポートするのは文字コードの実装の
抽象化って意味で効果的だけど。
240厨房:2001/03/31(土) 20:28
その前に、きれい、汚いってどういうこと?
241>240:2001/04/01(日) 00:46
んこまみれかどうか
242>240:2001/04/01(日) 00:50
例:C++はんこまみれ
243デフォルトの名無しさん:2001/04/01(日) 01:57
C++は んこ まみれ ?
C++ はんこ まみれ ?
244名無しさん:2001/04/01(日) 03:08
「んこ」って何よ。
うんこ?まんこ?ちんこ?どれ?
245USO800委員会:2001/04/01(日) 03:30
そんなの「げんご」に決まってるだろ。
嘘です。今日は4月1日です。
246>244:2001/04/01(日) 03:56
んこ:うんこまんこちんこの抽象クラス
247デフォルトの名無しさん:2001/04/03(火) 13:40
んこあげ
248デフォルトの名無しさん:2001/04/03(火) 15:31
他の派生クラス例
あんこ、インコ、援交〜、温厚〜、金庫〜、健康〜、参考〜、センコ〜
炭坑〜、天候〜、敦煌〜、軟膏〜、判子、メンコ、四個、ワンコ
249デフォルトの名無しさん:2001/04/03(火) 16:45
んこ
{
public:
&nbsp;&nbsp;static におい
}

んこ::におい = くさい;
250デフォルトの名無しさん:2001/04/04(水) 04:14
んこ &大便(食い物) {
 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がお手軽。
最適なのはトライ木かな。(文字単位で区切られた木を作る)
255254>251:2001/04/05(木) 05:07
あとスライド辞書圧縮(LZ系)とかのソース見るのもいいかと。
256デフォルトの名無しさん:2001/04/05(木) 11:22
>>253
オートマトンの間違いだろ。
しかも251は構文解析ではなく字句解析の話をしているのでないのか?
257>256:2001/04/05(木) 12:45
lex を使えば字句解析もオートマトンになるにょ
258251:2001/04/05(木) 16:11
なるほど
そういう意味の文章だったんですね
文意を誤解していました
さすがに厨房な私でもstrcmpで逐次比較するような事はしないでハッシュ使ってます
259デフォルトの名無しさん:2001/04/05(木) 16:20
260デフォルトの名無しさん:2001/04/05(木) 16:21
ハッシュはお手軽だけど、すべての数値文字列とかといった
抽象的な対象に使えないので、字句解析にはちょいと向かないと思う。
やっぱオートマトンじゃないかな。
261252:2001/04/05(木) 16:25
ずっとオートマンだと思ってたよ、、、
人前で発言しなくてよかったぞ。
アリガト>256
262256:2001/04/05(木) 19:05
正規表現で字句解析か。
正規表現で字句解析するよりstrcmp使ったほうが速くないかな?
正規表現ってコンパイルしてバックトラックしながら文字列のマッチングしてたら結構遅くなるように思う。
NFAからDFA作って最短一致のみの正規表現にすれば高速になるのかな。

まぁでもコンパイルの時間がかかるのはあまり気にしないでいいか。
要は生成したブツが速く動けばいいわけだし。
263デフォルトの名無しさん:2001/04/05(木) 19:49
正規表現は自分で実装した事ないんで実際にどの程度複雑なのか判りませんが
字句解析では、シンボルテーブルとハッシュ組み合わせています
でも、最近のコンピュータは速いですから、よっぽど長大なソースでも扱わない
限りどちらでも大差ないような気もします・・・
264monner:2001/04/05(木) 20:34
ええーっとですね、演算子ORを含む正規表現って
全部のパターンを同時に比較する
というか、仮想機械が動いている可能性がゼロになるまで
入力を行っているだけなんでめっちゃ速いです。
ただしNFAの場合は実行中に仮想機械のタスクが
増化するような状況になる(2チャンオリジナル
正規表現ライブラリ参照)ので、実際の速度は低下します。
DFAの場合は実行する前にテーブルがパンクしなければ
最高のパフォーマンスで走ります。
(圧縮方式によっては速度の低下はあるが)

蛇足:DFAでデータベース組めればとんでもない速度
が出ますが、メモリーも天文学的容量になる

265デフォルトの名無しさん:2001/04/05(木) 21:28
>>264
厨房ですみません。「2チャンオリジナル正規表現ライブラリ」ってなんでしょう?
266名無しさん:2001/04/05(木) 21:39
267>>264:2001/04/05(木) 22:14
268デフォルトの名無しさん:2001/04/06(金) 02:23
最近Cの標準ライブラリに正規表現使えるようにするライブラリが
追加されたと聞いたんですけど、本当ですか?
本当なら、どういう使い方をするんですか?
269名無しさん:2001/04/06(金) 10:54
regcmpとかはかなり前からPOSIXの標準だろ。
man -k regcmp
ただ、漢字対応しっかりやってるシステムは
意外と少ない。
270デフォルトの名無しさん:2001/04/06(金) 13:19
>264
超高速字句解析の話

最近字句解析の高速化をしていて思ったことですが、テーブル圧縮はむしろ有効に働くことが時にあります。
理由はおそらく、キャッシュとメインメモリの間のスピードのギャップでしょう。
なにしろ最近はアクセスタイムのギャップが10倍を超えようとしてます(もう超えてるのかな?)、こうなってくるとせっかくの工夫がこの問題で一発で台無しになってしまいます。
ゲーム屋あたりではバスボトルネックっていってヒイヒイいってます。
それで自作物字句解析は、より小さいテーブルを作るアルゴリズムを中心に私は考えています。

まあ、そんなことしてまで高速化してるのは精精、とあるCGツールのプラグインが掃き出すクサレギガバイト級テキストファイル(んなもんつくるなぁぁぁ)のパースくらいなもんでが。

>262
ちょいと横槍 lex だというなら正規表現のコンパイル時間は関係ないよ。
あとは monner 氏(女史?)の書かれてるとおり。
271デフォルトの名無しさん:2001/04/12(木) 16:18
スクリプト言語 Rythp (ソースあり)
>LISPを良く理解せずに形だけ似たようなのに仕立て上げようと
>ヘボプログラマが適当に作るとこんなのができあがります、って感じの言語です。
http://hp.vector.co.jp/authors/VA017441/lib/

ソースが付属しているので、参考までに。
272デフォルトの名無しさん:2001/04/12(木) 18:07
へ...へぼすぎる >>271
だれか構文解析という言葉を教えてやれ
273デフォルトの名無しさん:2001/04/13(金) 01:33
>>271
落せない。なんでtext/htmlなんだ。
つーか、なんだPLATHOMEって。
274デフォルトの名無しさん:2001/04/13(金) 11:29
>>271,272
人が一生懸命つくってるのをそういうふうにするのは嫌いだな。
275デフォルトの名無しさん:2001/04/13(金) 12:24
>>274

作者か?(藁
276271:2001/04/13(金) 13:54
>>274
私は紹介しただけなんですけど・・・
Webで公開されているものを紹介しちゃダメなの???
277デフォルトの名無しさん:2001/04/13(金) 13:55
>>276
そうだ
278デフォルトの名無しさん:2001/04/13(金) 14:14
ていうか、2chで紹介するってのは、ある意味そのサイトに対する
攻撃だよな?
279271:2001/04/13(金) 14:32
そーですか・・・じゃあ削除願を出してきますよ。
すいませんでした。
280デフォルトの名無しさん:2001/04/13(金) 15:36
>>278
それはそうだが、
>>279
何も削除依頼せんでも。
281デフォルトの名無しさん:2001/04/14(土) 03:24
攻撃になるかどうかはサイトの内容と、紹介された時の
2ch側の状況によるけどな。
282デフォルトの名無しさん:2001/04/14(土) 10:44
>>271
なるほど、こういう計算をやっているから皆が口をそろえて
「Lispは遅い、メモリを食う」って言うのか!(w

でもさらっと目を通したところ、とりあえず
動作に関しては致命的な問題はなさそうだったぞ
(だよね?)。
作者の苦労が偲ばれ、思わず目頭が熱くなったのは
俺だけだろうか・・・
283デフォルトの名無しさん:2001/04/14(土) 10:48
>>271-272を攻撃ととるか意見ととるかでその作者の資質がわかるな。
284>282:2001/04/14(土) 13:11
LISP系はガベコレ前提だからね・・
ところでLISP系でガベコレしない(必要ない)実装ってあるのかな?
285284:2001/04/14(土) 13:14
やべ、hageてた・・
286デフォルトの名無しさん:2001/04/14(土) 14:50
やーい、ハゲハゲ〜
287さくしゃ:2001/04/14(土) 15:17
>>272 自分でも同意。

>>273 わりぃ間違えてた。

>>275 ハズレ〜

>>279 いや別に消さんでも。

>>282 ホントにこんな計算やってるLISPがあったら笑えるネ。

>>283 んなこと言われると反応しづらいじゃねーかコラ。
288272:2001/04/14(土) 15:20
>>287
こんな恥ずかしいものを公開できる心理を教えてくれ
289271=279:2001/04/14(土) 16:35
>>280 >>287
私はFlameを起こすような真似はあまり好きではないですし、
折角のいいスレが打ち止めになるのも嫌なので。。。
290デフォルトの名無しさん:2001/04/15(日) 13:51
みなさんマターリ逝きましょう。
291デフォルトの名無しさん:2001/04/15(日) 17:13
Lisp系の実装は仕事ではたまにやりますが、
物作るときに不便でないですか>皆様?
いや、だめっちゅうんじゃなくて、LISPで
ゲーム作ってる人もいるし、便利だと思ってる
人がいるなら、ちょっと使える風につくろうかなぁと。
292252:2001/04/15(日) 17:58
javaとRubyの中間くらいの言語希望
いや、今書いてるんだが、ハジメテなのも手伝って
あまり思うように逝ってないんだよね。
293>291:2001/04/15(日) 18:25
LISPの良い点はリストが簡単に書ける所なんだけど、それ以外は結局
Cとかで組み込み関数作ってそれを呼出すだけになってしまう。
Schemeだと環境のコピー(保存)も発生するから、長々と定義書くのを躊躇したくなる。
それ以前にガベコレの問題があるからねえ・・
(大規模になると探索のコストが結構かかる)
リアルタイム処理に向いてるとは言えないかな
294デフォルトの名無しさん:2001/04/21(土) 20:27
http://free01.plala.or.jp/~yfuji/

このスクリプト言語はどうですか?
ウィンドウが扱える簡単なプログラムが作れそう
でも説明書がわけわからなくて作れない....
295デフォルトの名無しさん:2001/04/21(土) 21:19
>294
じゃ、やめとけよ
296294:2001/04/21(土) 22:07
言語的にイケてますか?
もし学ぶ価値のあるものなら頑張ろうと思うのですが....
297>296:2001/04/21(土) 23:32
知るか
298デフォルトの名無しさん:2001/04/22(日) 21:07
>>295, >>297

なんかいやなことでもあったのか?
それとも作者とか?
299デフォルトの名無しさん:2001/04/22(日) 21:41
何でもかんでも他人の影しか追えんような、開拓者精神に
欠ける野郎はプログラミングなんかやるんじゃねぇ、と
>>295,>>297 さんは仰ってます。
300300:2001/04/22(日) 23:27
切り番get!
301入門者:2001/04/25(水) 00:38
yacc系パーサ自動生成ツールで、ツールの使い方でなく、文法定義の方法というか
コツについて詳しく述べられている書籍をご存知の方居られませんか?

啓学出版の、Cコンパイラ設計 という本が良いと聞いていましたが、
絶版で入手できませんでした。よろしくお願いします。
302>301:2001/04/25(水) 00:43
図書館使えば?
あとはこのスレの前に方に十分紹介されてると思うけど。
303壊れたデバイスさん:2001/04/25(水) 12:58
>>301
Java 言語仕様書にも付録的に何か書いてあったような。
304デフォルトの名無しさん:2001/04/25(水) 21:04
タイトルが動物の本がいいと思います。
アスキー出版からでてます。
Bison 入門
石川直太訳

大きな本屋さんなら置いてあるとおもいます。
305300:2001/04/25(水) 22:10
切り番get!
306>304:2001/04/25(水) 22:52
アレ内容に割に高い。1500円だけど
あれの元文書オンラインでどっかにあった様な・・
307306:2001/04/25(水) 23:14
内容の
308デフォルトの名無しさん:2001/04/26(木) 17:35
http://math.cs.kitami-it.ac.jp/~fuchino/proin/experimentIII-2000/jikken.html
ここ、
>アレ内容に割に高い。1500円だけど
しょうがないよ、だって読む人限られてるもん。
309304=308:2001/04/26(木) 17:37
おお、bison は日本語化されてない(笑)
310デフォルトの名無しさん:2001/04/26(木) 17:39
>>308
GNUへの寄付金も入ってるしね。
311301:2001/04/28(土) 18:36
失礼しました。

過去ログで紹介されていた本を図書館で探してみました。洋書は読めないので、和書だけですが、
・C stepupシリーズ(3) yaccによるCコンパイラプログラミング ソフトバンク
・プログラミング言語処理系 岩波講座ソフトウェア科学5
・計算機科学/ソフトウェア技術講座7「コンパイラの理論と実現」共立出版
が、ありました。まだ、ざっと目を通しただけですが、残念ながら文法定義の手法そのものについてはあまり触れられていないようです。

そこで、やはり、啓学出版のCコンパイラ設計という本を入手したいと思いまして、古本屋に行こうと思います。ここは田舎で大きな古本屋などないため、大阪まで行こうと思いますが、こういった専門書がありそうなお店をご紹介いただけませんでしょうか。
312301:2001/04/28(土) 18:39
すいません、スレ違いだったのにageてしまいました…。
313デフォルトの名無しさん:2001/05/01(火) 20:59
http://www.omoikane.co.jp/i/info/html/bison-1.28/bison-ja_toc.html
もう、どうでもよくなってるかもしれないけど、これ見つけました。
314デフォルトの名無しさん:2001/05/02(水) 02:14
ユニコードと C++ OPP に対応してる flex/bison 処理系ってありますか?
ライブラリ化されてるとうれしいんですが..
どちらも C 時代なのでソースコードが汚いんですよね
315デフォルトの名無さん:2001/05/02(水) 10:13
flexにはC++のスケルトンは用意されていて使える。
実装したけれど使うメリットがないというコメントがtarに入ってる。
lexはマルチバイトパッチのやり方やテーブル構造の工夫で
UNICODE対応は可能だけど、
ただ対応しただけではテーブルサイズが爆発的に増える。
たとえばマルチバイトパッチの仕組ではA+を(A)+に置き換え、
[AB]を(A|B)に置き換えるものがある。
またjava用のもののソースも見たけど、0x100以上のコードの
処理が実装されてなかったり、テーブルの圧縮の部分が
シングルバイトのものと同じのしか見てない。
316デフォルトの名無しさん:2001/05/02(水) 17:22
>>314
ほんと、これ欲しいんですよね。
だ〜れも作らないし、えっお前作れって(^^;
ひまできたら冗談抜きで作りたいんだよなぁ。

#flex の C++ 版・・・ありゃほんと〜に使えねぇ。
#作った本人も爆死してるんじゃないだろうか(笑)
#あれは、クラス化するよりも、テンプレート使って抽象アルゴリズムにするのが
#正攻法なのかもしれないと思ってます。
317314:2001/05/02(水) 19:28
>>315
ありがとうございます。大変勉強になります。
考えてみると yacc/bison は特にユニコードに対応する必要なさそうですね
flex のスケルトン見てみたのですが、なんて言うか・・
これって OOP じゃないような..感じです(^-^;

>またjava用のもののソースも見たけど
JFlexでしょうか? u100以上は処理しないのは keyword が実質 ASCII と等価な
マッピング部分限定になっちゃいますよね。一応、ASCII だけでも使えますけど・・
utf8 に適当に変換して騙しながら使うことになりそうです。
BMP 超えたコードが来たらこれもアウトですが...
318314:2001/05/02(水) 20:03
>>316
はいです。作れるなら作りたいんですけど
時間と才能と経験がほしいところです... (^^;

理想としては flex source -> intermediate code になって
flex object がそれ読んで処理してくれれば.. って感じなんですが..
319名無しさん@1周年:2001/05/02(水) 23:29
javacでのエラーの時、MS-DOSプロンプトって
どうやって、スクロールさせるの?
320デフォルトの名無しさん:2001/05/03(木) 00:02
>>319
Win95/98のコンソールは、スクロールできません。
エラー出力が見たいなら、ファイルに出力を書き込んでからそれ見てちょ。

WinNT、Linuxとかなら標準エラー出力をファイルにリダイレクト。
Win95/98はリダイレクトできないので、ソースの中でPrintStream
開いて、System#setErr()で標準エラー出力をそっちに変更しちまえ。
321デフォルトの名無しさん:2001/05/03(木) 20:12
あげよう
322デフォルトの名無しさん:2001/05/04(金) 06:54
>>319
javac -J-Djavac.pipe.output=true Foo.java > error.txt
323デフォルトの名無しさん:2001/05/04(金) 19:32
既出かも知れないけど…
http://gaogao.moemoe.gr.jp/main.html#id6did4

> DMonkey
> Delphiアプリケーションへの組込みを目的としたスクリプトエンジン

JavaScriptのサブセットだそうです。ソース付き。
324デフォルトの名無しさん:2001/05/14(月) 12:45
墜落ピンチ!!サルベージあげ
325デフォルトの名無しさん:2001/05/14(月) 13:25
>>314
構文解析器は兎も角、字句解析器は自力で作っても大して
時間変わらないんじゃない?極端に複雑なのは別にして。
C言語くらいのなら数時間あれば一通り作れるでしょ?
326デフォルトの名無しさん:2001/05/14(月) 17:21
少なくとも325には無理だ。(藁
327デフォルトの名無しさん:2001/05/14(月) 18:08
>数時間
すごい、私もできないことないと思うけど、数時間で作れとか言われたら
血尿でるかも。
328デフォルトの名無しさん:2001/05/16(水) 00:47
>>327
字句解析器ならすぐ作れないか?
仕様はK&Rでも見ればいいし、lexerは決まりきった書き方があるし。
とはいえ、設計から完成までで数時間で作れといわれたら丁重にお断りするけど(笑
実コーディング時間が数時間なら同意。
329デフォルトの名無しさん:2001/05/17(木) 11:58
>>327
lexがやってるのと同じように1文字読むごとに状態遷移して、ってのは無理だけどね。
一度数字がきたら、A〜F以外の非数字が来るまで数字として読む、シンボルの先頭に
許される文字がきたら空白や記号を読むまで、シンボルとして読む、って感じで。
漏れも字句解析は手書きだよ。日本語を扱えるようにするにはこれが一番。
330デフォルトの名無しさん:2001/05/17(木) 12:50
K&RのBNFみたって数時間で作れるのかねぇ。甘いよ。
全然C言語がわかってない。
331デフォルトの名無しさん:2001/05/17(木) 13:02
数時間で作れない330はタコプログラマー
332デフォルトの名無しさん:2001/05/17(木) 13:30
今から作って明日までにアプせよ>>331
333デフォルトの名無しさん:2001/05/17(木) 14:06
>>330
字句解析器と構文解析器の違い知ってる?
334デフォルトの名無しさん:2001/05/17(木) 14:17
自分は優良プログラマだと言いたいなら、数時間で作れる
などと言わない方が賢明です。(藁
335デフォルトの名無しさん:2001/05/17(木) 15:10
>>334
同意。
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さんが書かれたような表記をよくみます。これって
どのように読むのでしょうか?
339デフォルトの名無しさん:2001/05/18(金) 07:28
BNF 表記
EBNF 表記
結合規則
優先順位
lex yacc bison
などで検索>>338
現行の言語の仕様書や本とかには必ず付いてると思いますが。
340デフォルトの名無しさん:2001/05/18(金) 10:58
<数> ::= <数字>*
<数>は<数字>の後に*がついたもの????
頭痛い
341デフォルトの名無しさん:2001/05/18(金) 12:19
>>340
繰り返しだよバカ
342デフォルトの名無しさん:2001/05/18(金) 13:25
「どのように読むのか」って、どのように発音するのか?って意味かと
おもたよ。
「山カッコ 数字 山カッコ閉じ スター」ってかんじでしょうか
343デフォルトの名無しさん:2001/05/18(金) 17:22
<数> ::= <数字>*
<数> ::= <数字>{<数字>}
<数> ::= <数字>|<数> <数字>
どれがいいのですか
344デフォルトの名無しさん:2001/05/19(土) 02:05
>340
*は0回以上、+は1回以上の繰り返しじゃなかった?
345デフォルトの名無しさん:2001/05/19(土) 02:07
>343
3つ目はそのままでは実装しにくい。
346345: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
>>349
あるよ。
このスレの過去ログ参照
351困憊羅 :2001/06/01(金) 15:18
>>350
29 desuka?
352デフォルトの名無しさん:2001/06/01(金) 21:10
コンパイラを作る方法 生越
って本がまさにそれ>351
353age:2001/06/04(月) 06:05
ねぇ、話題つきた?
354デフォルトの名無しさん:2001/06/04(月) 11:23
今ないだけ、そのうちでてくる。
355おしらせ:2001/06/11(月) 14:49
http://www.fuel.co.jp/~bull/monner/doc/
このサーバーから降ろしてくれと言われたので近々公開停止になります。
利用禁止ではありません。
ミラーしてくれる人がいたら[email protected]まで。
356デフォルトの名無しさん:2001/06/11(月) 15:11
もっとマシなものなら考えるけどなー
こんな誰でも作れる程度のものを公開するなよ
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
つまり、仮想機械の設計次第でコードが変わるということですか?
360デフォルトの名無しさん:2001/06/14(木) 08:25
構文解析は関係ないんじゃない?
構文解析は構文木作って終わりだよね?
361デフォルトの名無しさん:2001/06/14(木) 09:54
蛇足だが、
構文解析の結果が木になるとは限らないぞ。
たまたま木になる文法の言語かどうか?ということだ。

たとえばForth系言語だと木じゃなくフラット構造にしかならない。
木をバイトコード(フラット)形に展開する手順を
ユーザーがやってくれるようなもんだからな。

木になる文法のほうが人間様にとってはふつー快適だとは思われるが。
362デフォルトの名無しさん:2001/06/14(木) 15:03
アセンブラもフラットだ。
木になる文法、言い換えれば構造化された文法かね。
363デフォルトの名無しさん:2001/06/15(金) 13:39
アセンブラはフラットじゃないだろ。
ニモニックとオペランドという構造もってるから。
364デフォルトの名無しさん:2001/06/15(金) 14:25
確かにそういわれればFORTHの方が単純だな、、
365デフォルトの名無しさん:2001/06/16(土) 01:40
>>363
汗は、1行の範囲内では構造を持った文法だ、とでも
呼ぶべきなのかも。

上下方向は…ありゃアセンブラという言語(?)から見れば
あくまでセマンティックの問題でしかないよねえ?
どこへどう飛ぶかは100%プログラマの責任であって
「アセンブル」エラーで教えてくれたりはしないという。

>>364
言語処理系作るの、マヂ、楽よ。
厨房の夏休みの自由研究の題材でもいいくらいに、楽。
他にも楽な言語は多いだろうけど、
構文というものを"いっさい"処理しなくていい言語なんてのは
Forth系くらいしかないんじゃないかな。
366デフォルトの名無しさん:2001/06/16(土) 01:45
>>365
Forthってどういうコードになるんですか?
後置記法って事しか知らないから、簡単に解析きぼん
367デフォルトの名無しさん:2001/06/16(土) 01:46
解析じゃなくて解説
368デフォルトの名無しさん:2001/06/16(土) 02:48
>>365は一度も作った事の無いドキュン
369デフォルトの名無しさん:2001/06/16(土) 05:42
>>368
実用レベルの汎用言語を作るのは難しいが、
機能を絞った処理系なら本当に楽だぞ。
lex+yacc使ってインタプリタで最適化なしとか。
370デフォルトの名無しさん:2001/06/16(土) 08:17
>>365
Forthってどういうシンタックスになるんですか?
後置記法って事しか知らないから、簡単に解説きぼん
371デフォルトの名無しさん:2001/06/16(土) 11:15
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で検索した方が早いかな?
379デフォルトの名無しさん:2001/06/17(日) 06:41
ANSI FORTH 規格書 (英語)
http://www.taygeta.com/forth/
380デフォルトの名無しさん:2001/06/17(日) 06:47
電通大のForthの解説 (日本語)
http://www-lab.ee.uec.ac.jp/text/forth/
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だな(藁
382デフォルトの名無しさん:2001/06/17(日) 13:08
>>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
トランスレータも面白いよ
385377:2001/06/18(月) 01:18
>>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点)
387デフォルトの名無しさん:2001/06/18(月) 03:00
(a) 条件式
(b) (a)が真のときに実行される式
(c) (a)が偽のときに実行される式
(d) 条件式と関係の無い式
388デフォルトの名無しさん:2001/06/18(月) 03:29
ありがとうございました。>>387
やっぱり条件式はifの前に書くんですね。
thenの位置が謎ですが。
389デフォルトの名無しさん:2001/06/24(日) 13:48
あげ
390デフォルトの名無しさん:2001/06/24(日) 15:50
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という感じに記述するから違和感あり?
392デフォルトの名無しさん:2001/06/30(土) 11:34
>>391
forthは境目がないのが痛い。
どっからどこまでをどう括って解釈すべきか?は、
あくまでコンテクストと意味に依存するから、
コードを理解できるかどうかは
ほぼ語彙の知識の有無に依存しちまう。
人間様には痛い。
393デフォルトの名無しさん:2001/07/06(金) 18:12
age
394デフォルトの名無しさん:2001/07/08(日) 18:24
WindowsのGUIインタフェース持たせてる処理系って、
コールバック関数の辺りとかはどうやってるの?
例えばWNDCLASSに登録するコールバック関数とか。
やっぱり内部で専用に作ったCのコールバック関数を用意してるのかな?
395デフォルトの名無しさん:2001/07/08(日) 23:51
>>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の決定をどうやって
動的にやるのかがわかれば良いんですが。
397デフォルトの名無しさん:2001/07/09(月) 06:08
>>394 >>396
何をやりたいのかサパーリ分からん
398デフォルトの名無しさん:2001/07/09(月) 07:00
>>394
多分、GUIの作成をサポートした処理系のことを言ってるんだと思うけど、

スクリプトで動的に生成されるプロシージャーは全ウインドウ共通にする。(ウインドウのタイプごとに分けてもいい)
内部で処理したいメッセージ等は共通のプロシージャーに直接書く。
HWNDをキーとしたハッシュテーブルを作っておき、CreateWindowしたあとに戻り値のHWNDと必要なデータ(多分メッセージがきたときのスクリプトの飛び先の情報なんかになるかな)とともに保管する。
どのウインドウからのメッセージなのかは第一引数のHWNDでわかるから保存しておいたハッシュのデータをもとに適切な処理をすればいい。
(ボタンなどの子ウインドウからのメッセージの場合はWM_COMMANDのlparamがメッセージの送り元になるので注意。)

こんな感じでどうでしょうか
399398:2001/07/09(月) 07:46
訂正

スクリプトで動的に生成されるプロシージャーは

スクリプトで動的に生成される"ウインドウの"プロシージャーは
400デフォルトの名無しさん:2001/07/09(月) 08:40
>>398
del方面から話題2つ。

1:delにおける解決方法
http://www.asahi-net.or.jp/~HA3T-NKMR/vcl3-1.htm

2:delにおける独占方法(わら
この特許にひっかからないようにヤらないと駄目だな
http://www.borland.co.jp/news/patent.html
401デフォルトの名無しさん:2001/07/09(月) 09:19
>>396
混乱してませんか?
とりあえず簡単なインタプリタ(コンソールベースがいいと思う)を作ってみてはどうでしょう。
コンパイラであれば、その部分はテンプレート的に生成しておいて、あとで命令スケジューリングして
依存関係を考慮しつつ並べ替えます。
スクリプトの場合は考える必要はないです、やり方は 398 さんのやり方が妥当だと思います。

>>400
あなたも混乱してません?発言がdel厨房っぽいぞ(藁
402401:2001/07/09(月) 09:21
アゲときます。
403401:2001/07/09(月) 09:25
私も混乱気味、スクリプト−>インタプリタ(自爆
404代打名無し:2001/07/09(月) 11:48
>>400
もしかして、サンク方式なんかやばいですかね。
405デフォルトの名無しさん:2001/07/09(月) 13:34
>>404
ATLで似たようなことやってるよ
406デフォルトの名無しさん:2001/07/09(月) 20:21
>>401
てゆーかまんまdel亡です。
delにおいてくだんの問題はこう解決されてる、っていう頁ね。

>>404-405
特許頁見たら、del発売の頃から申請して
今ごろやっと通ったという特許らしい。

とはいえ、ふつー誰でもやる技法だと思うんだがな。
ヘジ(delを作った人らしい)もヤキまわったか(わら
407396:2001/07/09(月) 21:04
みなさんありがとうございます。
汎用性を考えて、コールバック関数のアセンブラコードを動的に生成する事を
考えています。
例えば、RegisterClassをインタプリタで実行するときに必要な、
WNDCLASS構造体のコールバック関数を設定する時、
インタプリタ言語側のシンタックスで
LRESULT func(HWND, UINT, WPARAM, LPARAM);;
という型の関数が必要である事を処理系に伝えます。
処理系側で、コールバック関数のテンプレートをヒープにコピーして
インストラクションコードを追加/書き換えた物を登録する。
という方法です。
(でもアセンブラスキルはいまいちなので、完成するかどうかは判りませんが。)
なるべく同期処理を行なわずにスレッドセーフにしたいのもあります。

>>398さんの方法も考えたんですが、汎用性が無くなるのが嫌なんです。

>>401
コンソールベースのインタプリタはもう存在します。
DLLを動的にロードしてAPIを直接扱ってGUI対応するのが目標です。
408398:2001/07/09(月) 22:05
>>407
どう汎用性がなくなるのかよくわからんが、コールバックだけを動的に変えたいだけなら
SetWindowLong()でできるぞ。詳しくはMSDNあたりを参照してくれ。
409デフォルトの名無しさん:2001/07/09(月) 22:50
>>408
そんなんじゃ出来ないから質問してるんじゃないの?
410401: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
...

とコードどを全部あらかじめスタテックに生成しておいて、これにテーブル
式でジャンプしてみてください、このほうがはるかに効率が良いはずです。(多分)
411396:2001/07/09(月) 23:14
>>408
伝わりませんでしたか?
例えばRegisterClassに登録するコールバックと、
EnumWindows、EnumChildWindowsに設定するコールバックの関数の型は、
それぞれ違いますよね?(EnumWindowsとEnumChildWindowsは同じですが。)
また、将来新たに作られたり、ユーザー側が作ったDLLのコールバック関数も、
型が同じとは到底思えません。
その全てのコールバック関数の動的対応をどうするか、について質問しているのですが。
412401:2001/07/09(月) 23:15
>>410
ん、esx 操作すりゃいいか(藁)
413401:2001/07/09(月) 23:19
>>412
esx -> esp
鬱だし脳
414396:2001/07/09(月) 23:28
>>410
その方法は衛生的で良いですね。
まだ引数をどうするかの問題が残ってますが。
それと、書き換えは遅くなる可能性があるんですね。勉強になりました。
でも一度作って、それを使いまわす状況ならいいでは?
とも思ったんですが違いますか?
415401:2001/07/09(月) 23:30
>>410
多分OKだと思います。
スクリプト中のどこかにまとめて宣言しておいて、
起動前に全部作ってしまうのがいいかも知れませんね。
416396:2001/07/10(火) 01:04
>>415
そうですか。
とりあえず作ってみます。
みなさんありがとうございました。
417デフォルトの名無しさん:2001/07/10(火) 02:51
int *fun1(...)、long *int(...)の二つの関数ポインタを作って、
無理矢理キャストするというのは駄目かな?
418401:2001/07/10(火) 12:23
>>417
パスカル式には、それは使えません。
スタックフレームを呼び出し側で処理しているC型の呼び出しのみ有効です。
419396:2001/07/10(火) 20:14
なんとか動く物が作れました。__cdecl/__stdcall
(まだEnumWindowsでしかテストしてないですけど。)
これの実装、コード量の割にかなり辛かったです。
(アセンブラをあんまり触わってないのが原因ですが。)
とにかく、DLL-APIの直呼出しと、コールバックが使える様になった事で、
かなり表現の幅が広がった様な気がします。
420396:2001/07/11(水) 00:33
無事、ウィンドウのメッセージループまで行き着くことができました。
それにしても、winapiインクルードファイルの変換は大変ですね。
今の所メッセージは全部DefWindowProcに渡してるからいいけど、
インタプリタ側で処理を追加していくと、かなり遅くなりそうです・・。
というわけで、お答え下さった方々、ありがとうございました。
421デフォルトの名無しさん:2001/07/11(水) 04:59
Rubyに入ってるwin32api呼び出しモジュールのソースや、
HSP用のloadlib.dllのソースが任意のdllの関数を呼び
出すためにマシン語使ってたな。
422VB厨房:2001/07/11(水) 17:01
誰かソースからドキュソメント作成するのに便利なawkのスクリプトがあったらおせーて!
hellプ(for ActiveServerPages)
423VB厨房:2001/07/11(水) 17:04
ちなみに関数一覧と変数一覧をコメントつきで生成するやつは自力で作った。
それっぽいやつヨロピク
424デフォルトの名無しさん:2001/07/11(水) 23:17
age
425デフォルトの名無しさん:2001/07/11(水) 23:36
sage
426デフォルトの名無しさん:2001/07/12(木) 00:04
>>422-423
思いっきりスレ違い、スクリプトすれかVBスレに逝きなはれ。
427デフォルトの名無しさん:2001/07/14(土) 02:19
スクリプト言語で二重ロード防止策ってどんな方法が良いんでしょう?
C/C++は#ifndef#define#endif、マクロ定義
Pascal/perl/lispなどはuseとかrequireとか。
やっぱ後者の様にロードされてなかったらロードするって処理を
言語側でやった方がわかりやすいのかな。
こう考えるとC/C++のマクロって汚いですね。
428デフォルトの名無しさん:2001/07/14(土) 02:29
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とかの誤解も多いし。
あのプリプロセス処理は早めにつぶすべきだったと思う。
確かに便利だけど、代替手段は他にもあったと思う。
433デフォルトの名無しさん:2001/07/14(土) 07:47
>>431
マクロの実装は大変か?
たいしたことないと思うが。手を抜きすぎて不便なのはわかるが。
434デフォルトの名無しさん:2001/07/14(土) 12:24
lispのマクロは単純な割に使い勝手が良い。
これはマクロが完全に言語の一部だから。
435427:2001/07/14(土) 23:57
ありがとうございました。
後者で作ってみます。名前空間の独立は考えていないので、
グローバル変数か何かに、load情報を記録していくことになりそうです。
436デフォルトの名無しさん:2001/07/15(日) 00:04
スクリプト言語の作者はハゲますか?
437デフォルトの名無しさん:2001/07/15(日) 00:27
>>436
オレはハゲてないよ。
438デフォルトの名無しさん:2001/07/15(日) 21:06
>>436
すまん、はげそうです
439デフォルトの名無しさん:2001/07/17(火) 04:40
CINTの本(何かの雑誌の別冊っぽい作り)のCDROMに、
作者を写したmovieが入っているのだが、ハゲていたな。確かに。
440デフォルトの名無しさん:2001/07/19(木) 02:13
>>439
そういうこと言わない、気にしたらストレス溜まってハゲが加速する。
441デフォルトの名無しさん:2001/07/19(木) 02:34
ハゲ板逝け
442デフォルトの名無しさん:2001/07/19(木) 03:06
初心者な質問ですみません。
yacc/lexでファイル終端の構文エラーを検出する方法を教えて下さい。

line : hogehoge semicolon {}
   | error semicolon {}
   ;

こう書くと semicolon が無いとうまくエラーになってくれないので
終端の semicolon の無い行のエラーが検出できなくて困っています。
443デフォルトの名無しさん:2001/07/22(日) 02:00
h-age
444デフォルトの名無しさん:2001/07/22(日) 02:12
EOFを終端記号としてエラー認識すれば良いと思われ。>>442
445442:2001/07/22(日) 23:48
>>444
ありがとうございます。
お教えのとおりやってみたらできました。
446デフォルトの名無しさん:2001/07/27(金) 20:47
gerogero
447デフォルトの名無しさん:2001/07/29(日) 16:29
ソース読みこむ

トークンに分割

中間コード生成

実行

(゚д゚)ウマー
448デフォルトの名無しさん:2001/07/30(月) 04:47
僕はスクリプト言語の作者ですけど、今の所ハゲてません。>>436
でも無関係な友人がハゲていってる様です。
どうすればいいでしょう?
449デフォルトの名無しさん:2001/07/30(月) 05:02
わたしゃ、使い捨てCトランスレータ屋です。
スクリプト屋同様ヤバイです。
以前使ってたハツモールヘアグロアーSは効きましたよ。
今なんとか大丈夫、でもまたデコあたりが・・・

もうハゲ・ズラ板プログラム技術出張所ですな(藁
450デフォルトの名無しさん:2001/07/30(月) 05:06
ANTLRを使いたいんだけど、日本語の資料どっかにありません?
451デフォルトの名無しさん:2001/07/30(月) 05:30
452デフォルトの名無しさん:2001/07/30(月) 21:35
>>450
(参考になるかはともかく)けっこう日本語のページあるみたいだけど
http://www.google.co.jp/search?hl=ja&safe=off&q=ANTLR&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
453デフォルトの名無しさん:2001/07/30(月) 22:13
age
454デフォルトの名無しさん:2001/08/01(水) 00:59
>>452
すまぬ、そのへんは見ました。
455デフォルトの名無しさん:2001/08/01(水) 01:53
>454
なにがわからないんだ
456デフォルトの名無しさん:2001/08/04(土) 14:18
age
457デフォルトの名無しさん:2001/08/07(火) 08:51
age
458デフォルトの名無しさん:2001/08/08(水) 02:12
誰か・・・・
459デフォルトの名無しさん:2001/08/08(水) 02:32
なんだ?ハゲてきたか?>458
460デフォルトの名無しさん:2001/08/08(水) 17:06
書き込みないねえ

http://www.southern-storm.com.au/treecc.html
暇つぶしにこれをつかってみます。
461デフォルトの名無しさん:2001/08/08(水) 18:23
コンパイラつくりてえ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
>>464
オマエモナー
466デフォルトの名無しさん:2001/08/11(土) 04:59
定期age
467ひlrm;ろゆき@菅lrm;直人:2001/08/11(土) 05:01
testes
468デフォルトの名無しさん:2001/08/12(日) 00:10
定期age
469デフォルトの名無しさん:2001/08/13(月) 05:36
トランスレーターってどれぐらいの種類があるんですか?
470デフォルトの名無しさん:2001/08/13(月) 22:36
ageたい・・・
471名無し:2001/08/13(月) 22:40
Cのコンパイラをつくりたいのですが
そのへんのことについてくわしくのってる書籍はありますか?
472デフォルトの名無しさん:2001/08/13(月) 22:54
>>471
とりあえず、K&R持ってなかったら買う。
仕様載ってるから。
その後、自分の気に入ったのを買う。
人からすすめられたやつもいいかもしれないけど、
なるべく、自分に合うやつがいいとおもう。

一回どっかで立ち読みでもするといいよ。

でも、コンパイラ本って少ないんだよな・・・
473デフォルトの名無しさん:2001/08/13(月) 22:58
コンパイラ構成法 - 原田
を始めに読むのがいいかも?。

情報科学こんせぷつ8 コンパイラの仕組み
と上の本を併用ってのは?
2冊で1万だし。

コンパイラの構成と最適化、は最適化が気になり始めてからのほうが
いいと思う。
474471:2001/08/13(月) 22:59
ありがとうございます。
475デフォルトの名無しさん:2001/08/13(月) 23:58
>>472
>とりあえず、K&R持ってなかったら買う。
>仕様載ってるから。

Cコンパイラ作りたいって人間に「仕様載ってるから」って
理由でK&Rを進めるのかよ(*´Д`*)
476デフォルトの名無しさん:2001/08/14(火) 00:02
>>475
C の構文が BNF で書いてあるから結構使えるよ。
477デフォルトの名無しさん:2001/08/14(火) 00:07
>>475
それ以外の理由「でも」薦めるべき、という意味なら賛同するが、
それ以外の理由「で」薦めるべき、というなら賛同しない。
仕様書をパスして作ったんじゃ最早Cじゃないので。
Cもどきを作るというなら話は別だが、471はCだと書いてるね。
478デフォルトの名無しさん:2001/08/14(火) 00:07
Cコンパイラ作るとかって段階になると、K&Rじゃぜんぜん足らないだろ。
479デフォルトの名無しさん:2001/08/14(火) 00:13
K&Rを100万回よんでも、Cコンパイラは作れません。
BNFだけでコンパイラは作れません。
480476:2001/08/14(火) 00:18
K&Rとドラゴンブックでいいでしょ。ダメ?
というかコンパイラ作りたい人がK&R持ってないとは思えなかったりして。
481デフォルトの名無しさん:2001/08/14(火) 00:20
475>>477
Cコンパイラ作るのにK&Rを勧めるのは悪いとは言わないけど、
あまりに初歩的すぎるから、驚いたんだよ。
K&Rに載ってる情報量じゃ、それこそCもどきしか作れない。
482デフォルトの名無しさん:2001/08/14(火) 00:23
>>480
>K&Rとドラゴンブックでいいでしょ。ダメ?

だめだね。
483デフォルトの名無しさん:2001/08/14(火) 00:29
>>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の言語処理系」(共立)
488デフォルトの名無しさん:2001/08/14(火) 23:32
BASICでBASICインタプリタ作れるし、
アセンブラでアセンブラを作れる。
489デフォルトの名無しさん:2001/08/15(水) 00:12
>>487
今更Pascal「ごとき」低レベルな言語を書いてもレベルが低いと
言っているようなものだね。
JavaならOS非依存だからコンパイラなど作る必要なし。
もっとレベルの高い会話をしろよ。
490:2001/08/15(水) 00:15
>>489
>JavaならOS非依存だからコンパイラなど作る必要なし。

おまえ、 自分の言ってることを分かってるか?
491デフォルトの名無しさん:2001/08/15(水) 00:45
>>490
ネタでしょう・・・
もし、ネタじゃないなら、この板も落ちたもんです・・・
492デフォルトの名無しさん:2001/08/15(水) 07:54
>>489
あからさまにdel厨を煽っています。無視しましょう。
493デフォルトの名無しさん:2001/08/15(水) 08:22
ageぇ
494デフォルトの名無しさん:2001/08/15(水) 08:32
まあjavacというものの存在についての知識はデフォということで、

>>492
それにすら成ってないと思うのに一票。PascalとCは同程度。
むしろ、色々な面について
(コンパイラを作るのが楽な)簡単な言語のほうが「良い」わけだから、
華々しさフクザツさを競うほうがドキュ。

>>491
ネタだとしても489は諧謔性が低すぎます。笑いも取れないネタに価値なし。

そういやJavaBytecode用のアセンブラ、ってのも誰か作ってたよな(藁
495デフォルトの名無しさん:2001/08/15(水) 18:03
Java用Makeなんてのもある(もちろんJavaで書いてある)
いったい誰が使うのでしょう・・・
http://sourceforge.net/projects/jmk
496デフォルトの名無しさん:2001/08/16(木) 01:10
>>495
Ant があるしねえ。
Ant の便利クラス作りまくりアプローチは好きでなかったりするが。
497デフォルトの名無しさん:2001/08/16(木) 21:16
プログラミングの超初心者でもわかるようなyaccでのコンパイラの作り方の
解説のページってありませんか。
498♯6411:2001/08/16(木) 21:22
>>497 データ構造とかの知識がひととおりないと
コンパイラなんてつくれないでしょー
漏れ的には超初心者なんて自称してる限りは
無理無理と思われ。
499デフォルトの名無しさん:2001/08/16(木) 21:36
では、コンパイラを作るための一歩にまず何からはじめれば
よいですか。
500デフォルトの名無しさん:2001/08/16(木) 22:03
まずコンパイラを作ってみること
501デフォルトの名無しさん:2001/08/16(木) 22:17
>>499
大学入れ。
502デフォルトの名無しさん:2001/08/16(木) 22:25
>>497
yacc,lexはまぁどうにか覚えるとして、498のように
データ構造がほげららというなら、「デザインパターン」
の、Visitor, Composite のあたり。ネタではなくマジ
です。
503デフォルトの名無しさん:2001/08/16(木) 22:25
>>501
僕は、高専に入るつもりだけど・・・
504デフォルトの名無しさん:2001/08/16(木) 22:27
コンパイラやインタプリタをいきなりつくるよりは、
別の言語に翻訳するコンバータをつくるのが楽で楽
しいカモよ>>497
505名無しさん:2001/08/16(木) 22:35
コンパイラ関係の書籍って、あんま売ってないんだよなあ
506497:2001/08/16(木) 22:36
502さんと504さんの言っていることがわからない僕はもうどうしようも
ないでしょうか?
507名無しさん:2001/08/16(木) 22:38
とりあえず、コンパイラつくるまえに
もう少し基本的なお勉強を・・・
508♯6411:2001/08/16(木) 22:39
>>504 禿げしく胴衣。

マジアドバイス。ホントに超初心者なら、
まずはいろんなコンバータつくってみるってのは
どうかな? 言語トランスレータに限らず、
その手のものはいろんな意味で勉強になるから。
なぜならば、人様のファイルフォーマットを捌く
ってことは、データ構造の勉強になるのだよ…
509%%%:2001/08/16(木) 22:48
コンパイラ系の本ってさ、すっごく少なくない?
510497:2001/08/16(木) 22:51
皆さん、ありがとうございます。
もっと基本的なことを学んでからコンバータというものを作ってみよう
と思います。
511デフォルトの名無しさん:2001/08/16(木) 22:52
少ないけど名著率は高いでしょ?
それで問題ないと思う。
512♯6411:2001/08/16(木) 22:52
>>505
>>509
つくりたがる人間も決して多くないし、
いざ造ろうとするとそれはそれでいろんな
知識が要求されて大変だからね。
漏れは10年以上前、工房出たばっかりのときに、
当時の上司にyacc本渡されて、それで
自分の人生が1/8くらい決まったもんだしなー。
一時期は赤いドラゴン本読みふけってたし。

それでも、マシンコードを吐くコンパイラは
未だ掻いたことなし。スクリプトインタプリタは
大量生産できるようになったけどね。
513デフォルトの名無しさん:2001/08/16(木) 23:16
自作言語作ったらまず、
自作言語->Cのトランスレータ作ったら良いと思う。
514デフォルトの名無しさん:2001/08/16(木) 23:20
>>506
デザインパターンってのは、上の書き込みだと書籍の名前だよ。

yaccの雑誌だと、「yacc/lex 五月女健治 啓学出版 1992」
ISBN4-7665-1140-9 が異様に親切で簡単でかなりおすすめ
できるんだが間違いなく絶版だろうなぁ・・。
515デフォルトの名無しさん:2001/08/16(木) 23:22
テクノプレス
−プログラムジェネレータ on UNIX−
五月女健治 著
ISBN4-924998-14-1
http://www.catnet.ne.jp/t-press/yacc.html
516デフォルトの名無しさん:2001/08/16(木) 23:24
おっ
同じもの??
517514:2001/08/16(木) 23:25
s/雑誌/書籍/
スマソ
518デフォルトの名無しさん:2001/08/16(木) 23:30
>3.yacc/lex, 五月女健治著, 啓学出版
>
>絶版.
>入門者にとって分かりやすく,特にyaccでのエラー処理に関して詳しい.
>改訂されたものが,テクノプレスから出ている.

改訂らしい。
ソース
http://www.ulis.ac.jp/library/Kanpo/Vol14No3/nakai.html
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

ところで、漏れが最初手にした書籍は、
啓学出版なんだけど、五月女さんじゃなかったん
だよなー。誰だっけ? 誰かフォローきぼんぬ。
523デフォルトの名無しさん:2001/08/17(金) 23:05
524♯6411:2001/08/17(金) 23:16
>>523 それだーさんくすー
525pf:2001/08/18(土) 20:59
貴重な良スレage
526デフォルトの名無しさん:2001/08/18(土) 21:33
>yacc/lex, 五月女健治著, 啓学出版
今日池袋のジュンク堂にあった
527デフォルトの名無しさん:2001/08/19(日) 11:46
全ページすわり読みするしかない。
528デフォルトの名無しさん:2001/08/23(木) 17:45
age
529デフォルトの名無しさん:2001/08/23(木) 18:06
テクノプレスで注文したけど、なんの連絡もこない。
530デフォルトの名無しさん:01/08/28 21:47 ID:o3vII6Bs
Pentium用のコード生成を解説した本って無いですか?
アセンブラまでじゃなくて、ちゃんと機械語までの変換
を解説した本が欲しいのですが・・・
531デフォルトの名無しさん:01/08/28 21:58 ID:aZXv.NLA
>>530
意味不明。
Intel行け。
532デフォルトの名無しさん:01/08/29 00:02 ID:SXxGnN5k
>>531
なるほど。
533デフォルトの名無しさん:01/08/29 01:31 ID:GIhJkjc.
>>530
VisualC++とかならasm/codファイルの出力とか参考になると思うよ。
534デフォルトの名無しさん:01/08/29 02:31 ID:M4BjMY5w
535デフォルトの名無しさん:01/08/29 07:07 ID:JQLDr6so
>534
ありきたりな内容だな
536534:01/08/29 12:35 ID:LA57eUsQ
言うの忘れたけど、
>>534
は、
>>530
へ。
機械語まで・・・ってのがよくわからんけど。


本の説明こぴぺ。
>具体例を示すためにC言語とPentiumプロセッサ(アセンブリコードが
>比較的読みやすい)を主たる対象とした.
537530:01/08/30 17:54 ID:s3V0FXOw
>>534
その本は持ってます。Pentium用だし、作者が好きなので。
でも、なぜかアセンブラを生成する所までしか解説してないんですよね。
movのフォーマットだけははじめの方に解説されてました。
ちゃんと1と0の列の機械語まで変換してexeを生成したいのです。

インテルのサイトはいい文献がたくさん転がってましたが、
命令のフォーマットの解説は残念ながら見つけられません
でした。
538デフォルトの名無しさん:01/08/30 18:02 ID:.S8.cB/w
命令のフォーマットって言う人は少ないね。
ftpからもぐっていけばpdfでそれぞれのCPUに対応したリファレンスが置いてあるよ。
539デフォルトの名無しさん:01/08/31 02:19 ID:JrJLvbeM
とりあえず、http://www.gnu.org/software/gcc/readings.html じゃねーの?
540530:01/09/06 00:15 ID:igcvqESo
どうもありがとうございます。
80386なのでちょっと古いですが、

Intel 80386 Programmer's Reference Manual
www7.informatik.uni-erlangen.de/~msdoerfe/embedded/386index.htm

のChapter17に非常に詳しい解説がありました。
http://buri.sfc.keio.ac.jp/~yosuke/keisan-kino-ron/index.html

既出っぽいけど、KEIO SFC の計算機口論の授業のページ。
コンパイラの基礎だな。
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
http://www.yfcbookshelf.com/compiler's%20books2.htm#Information&Computing別巻5コンパイラT
547デフォルトの名無しさん:01/09/15 04:31
中間コード(バイトコード)設計の上で参考になる資料ってありますか?
なるべくシンプルなのが良いんですが
548♯6411:01/09/15 23:36
>>547
中間コードが処理系内部で閉じてるんだったら
なんでもいいんでは? あえてバイトコードに
こだわる必要なし。

ちなみにgccは木を作ってるね。
549デフォルトの名無しさん:01/09/16 02:52
>>548
なんでもいいって、なんかあるでしょう?
木とか、そんな解答じゃなくて、
もっと具体的なやつ教えてください。
550rr:01/09/16 05:54
>>549
スタックとオペラントとジャンプの羅列
>>549
JavaVMの仕様書
>>549
ターゲットとなる全てのプロセッサのマニュアル。
プロセッサが1種類だけなら中間コードなんていらん。
>>551-552
シンプルなの、つってんじゃん。
バカ?
554デフォルトの名無しさん:01/09/16 10:21
>>553
あまりいきがるなよ。
どこか忘れたけど、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
565559:01/10/07 11:58
>>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として扱えるような
言語仕様であるということにしとくと、結構幸せになる。
574572:01/10/13 23:37
>>573

なるほど。
ちょっと見えてきました。
575デフォルトの名無しさん:01/10/14 02:16
>>570
たぶん、ゲームエンジンに食わせるバイナリーを
作成するためのコンパイラがだとおもいますが、
lex yacc が一般的だと思いますよ。
少し難しいですが、がんばってくださいね。
576デフォルトの名無しさん:01/10/14 02:18
lex yacc のソースってフリーなのですか?
>>576
フリーつーかライセンスはあるよ?
それと、片手間でlex/yaccのソース見てもわかんないと思うよ。
この場合は、既存のツクール使うのが正解と思うけどなあ。
578576:01/10/14 02:25
pascal( or Object Pascal)に移植されたソースなんて無いですかね?
Cよりpascalの方が得意なので。
579専門学生学校:01/10/14 02:30
おお、同士よ>>570
学校の課題でADVを作っていますが、バイナリーを直接いじっています。
ソースコードからバイナリーを制作するツールはいつか作りたいと思っていますが、
むずかしくって、作れません。
だれかイイ知恵を下さい。プリーズ。
>>579
インタプリタから作るといいよ
1行入力して文を解釈するってやつ。
最初は条件文とgotoだけ。
581Hの専門家: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
591589:01/10/14 04:06
Lisp系ははじめてな上に、GCはリファレンスカウントしか知らないので、
そのうちマーク&スイープとかについてヘルプ出すかも。
その時はよろしく。
>>587
Lispの概略は3時間もあればつかめるだろ。

>>588
言語としては終着点でも良いけど、構文解析がかなり楽な部類だから、
Lispから初めて感じをつかむべきだ、といってるんだが。

別にフルセットのSchemeやCommonLispである必要は無いんだし。
GCだって搭載しなくても構わない。
593589:01/10/14 04:53
字句解析のレベルで、文字列認識のバッククオートの処理が
ちゃんと思いつかなかったので、ふて寝。
"test\\"とかがちゃんと認識出来ない。

厨房過ぎる>自分
(´-`).。oO(噂のオートマトンで状態遷移モデルを作るんだ・・・)
(´-`).。oO(mark&sweap gcはクヌースのアルゴリズムが有名かな・・・?)
Lispは正直シナリオライタさんなんかに理解してもらえん(藁
なんてね。
597専門学生学校 :01/10/14 08:57
どの方法も難しそうですね。
1文字命令というのが一番簡単そうなのでやってみます。
DirectDrawでゴリゴリ動かすのはわかるんですが、
コンパイラーを作る本は難しくってよく理解できませんでした。
ヒントをヒントを有り難うございました。
598589:01/10/14 11:18
起きました。
今からやってみます。

そうか、状態遷移でやればいいんですね。

バックスラッシュがあったら遷移させて、次の文字はそのままコピー、と。
適当に静的に確保した配列に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
     ↑      |.
     +-------+

という感じでしょうか。誰か正規表現変換、やってください。
これでスペースがずれてたら鬱だ。
599589:01/10/14 12:08
とりあえず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に進みます。
600600:01/10/14 15:52
get
601デフォルトの名無しさん:01/10/15 01:21
>>596
音楽用MIDIシーケンサのスクリプトに採用されてる事例がある。
ミュージシャンは理解するのか?
602sage:01/10/15 01:39
最近めっきりつかってないけど
ウィングルーヴすげーよ。
しかも俺はそれを最初にみたのは
オランダのサイトだったゾ。からきし言葉
わかんなかったけどな。
ダイレクトサウンドもまだ全盛じゃ
なかったころだったし、結構儲けただろうな
GIMPやoutoCADがScheme、Lisp採用してるぞ。
コンパイラを書いていて思ったんだが、
Tokenizerに任せる部分と、Parserに任せる部分の切り分けが良く分からない。
文字列("[^\"]*")なんかはTokenizerに任せちゃってる例が多いんだけど、
Tokenizeの意味を考えると、
DQUOTE/STRINGに分解してParserに任せる方が正しい気もするし。

皆はその辺、どうやって決定してるの?
(手動で書き起こすの前提です)
605589:01/10/15 02:12
lambda式あたりの実装が汚いながらも終わりました。
ただ、primitiveな演算は今の所+とlambdaのみ。
クロージャ回りで大苦戦しました。

environmentは線型リストの線型リスト、
id作成も線型リスト、cons等も通常の構造体をmallocで生成、
GCはリファレンスカウント、という厨房コーディングです。
面倒なので、(define (text x) ...)の形式はサポートしない予定。
(define test (lambda (x) (+ x 3)))とかは当然出来ますが。
doubleとintをサポートしてみたら、+のコードが長くなって鬱。

もう少し真面目に作っても、確かに5日あれば終わりそうです。
606589:01/10/15 02:19
>>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;

%%
607589:01/10/15 14:03
リファレンスカウントが嫌になったので、
GCの勉強します。
どこかに単純な線型リストにGCを適用する例、
とか無いですか?

作りかけをアップしておきます。
内容は見るに値しませんが。
http://www.geocities.co.jp/SiliconValley-SanJose/8306/lisp.tgz
defineとlambdaと+だけ出来ます。
Lisp系を初めて作る奴が、一日かけて適当に組むとこういうのが出来る、
という事で。
単純なリストじゃ無理だろ。
使用リストと、変数格納イメージがないと。
609589:01/10/16 02:17
とりあえずマーク&スイープ、プリミティブな型の扱いを
除けば理解したが、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をこう言う風に変換する
マクロがあると面白いかもしれない。(変換結果が)
617609:01/10/16 02:56
うおっ、諦めた瞬間に反応が(藁

>>610

はい、Cのスタックスキャン、です。ついでにレジスタも。
PC等は見てないです。setjmp使う軟弱な奴。
conservativeにやるつもりだったのですが。
それだとコピーって使えないんですか。
よくしらんドキュソなもんで。
なお、再帰、普通にdefineがあるので実装してみたいのだけど、
ifやら条件式やらを実装していないので無限ループしか試せず。
つまらんです。

なお、関数のCの方での登録回りは、適当なハッシュとか作らなかったので、
いちいち登録する都度ifが増える、という終わった実装になってます。
続きを真面目にやるならハッシュ書くけど、、、
ハッシュ書くの、もう飽きた。

なお、id生成が線型リスト辿ったりする終わり気味実装。
やっぱりインタープリタ作るのは面倒臭いYO!
618609:01/10/16 02:59
そういえばGCのデバッグってどうやったらいいか見当が
つかんのですが、もつかないのですが、皆さんはどう
やってるんですか?
リファレンスカウントとかなら簡単に出来たのですが。
619デフォルトの名無しさん:01/10/16 03:12
>>617
スタックやレジスタの中の良くわからん値を
ポインタと見なしちゃったとき、コピーGC
だとその値を書き換えちゃうだろ。

GCのデバッグはね〜。難しい。
620617:01/10/16 03:15
>>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))))
622620:01/10/16 03:28
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)))))
625620:01/10/16 04:00
>>623

えーと、C側の話で、関数の呼び出しの中で、一時的にローカ
ル変数に保持されてる奴ってのがスタック見ないと回収されて
しまう気がするのですが。

>>624

そのまま食わせたら、落ちたのでまたバグかー、
とか思っていたら、インデントが全角スペースだったんですね。
そりゃそうか。

で、実行したら、なんか解釈はされたけど、値は出力されず。
あれ?なんか処理が返ってこない...
デバッガなりprintfで追うのは、もう眠いので明日にします。
とりあえずテストの為にscmで動かしたら普通に動いた。
何やってるのかはまったく理解してませんが。
626625:01/10/16 04:01
補足:
バグかーってのは自分の書いた処理系の、って話しです。
>>625
Rubyみたいに、拡張ライブラリをCでかけるようにする、とかで無い限り、
一度メモリにフラッシュしてからGCかけて、もう一度読み出すようにすればいいと思うんだが。
勘違いしてる?
628デフォルトの名無しさん:01/10/16 08:41
>624
あんた、スゴすぎるよ・・
629628:01/10/16 09:32
と思ったら、
Error: Illegal function (10)
ときたよ。
>>629
guileだとちゃんと動いたよ。
(((c-fact (c-1+ (c-1+ (c-1+ (c-1+ c-0))))) (lambda (x) (+ x 1))) 0)
が24になった。

コピペしくじったんでは?
631628:01/10/16 12:20
了解。ok
632620:01/10/16 13:08
>>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
から抜けると解放されるには、スタック見るしか無くない?
フラッシュ、っていうのをどうやるのか理解してないのだが。
633620:01/10/16 18:12
せっかくなので、お隣り(?)のLispスレにあった、
タグ使う方法を試してみてます。

外部にgcマーク用のビットマップを持つ、というのが、
どういう感じになるかはわかりませんが、やってみます。
634デフォルトの名無しさん:01/10/16 21:00
>>633
例えば1024個のセルが収まるメモリブロックに対して、
128byte(1024bit)のビットマップを用意するという事だと思う。
各ビットは1つのセルに対応する。
でもなあ・・各メモリブロックに対応するビットマップを
探索する処理って効率よく書ける?
635633:01/10/16 21:23
>>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の添字は取れるかなぁ、とか思ってますが。
甘いか?
636635:01/10/16 21:31
>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自体を入れるのはやめた方がよい。
(ダイレクトマップトキャッシュだとひどいことになる。)
638637:01/10/17 03:20
Aは「セルのアラインメント」じゃなくて「log2(CHAR_BIT)」だな。
それに、offset計算の時にoのタグを剥がしてない。

欝だ氏の雨
639635:01/10/17 03:31
ふぅ、やっとローカル変数で保持しておけば、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のオンラインドキュメント
でも可。

それともパーザジェネレータ自体を
作りたいの?
644635:01/10/20 02:34
とりあえず、当初の予定の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のソースコードを考えて、それをコンパイラに通し、実際に命令が生成されることを確認せよ。(ただし、データのアドレスは、変わっても良いとする)
>>646

宿題スレでやれよ。
答えてやるから。
649647:01/10/21 23:34
>>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ってなに?
>>654
検索しろ厨房&もう寝ろ。
仮想マシンの種類ってスタックマシンとレジスタマシンだけですか?
657デフォルトの名無しさん:01/10/23 00:27
>>656
他にもいっぱいあるよ。
memory to memoryもあるし、
SICD machineとか、
chemical abstract machineとか、
categorical abstract machineとか、
while-if machineとか、
・・・
×SICD
○SECD
659:01/10/23 13:02
命令スケジューリングについて教えて下さい

できれば、具体的
660♯6411:01/10/23 13:27
ミクロレベルのスケジューリングは
ターゲット依存な部分が大きいので
具体的に掻くと逝ってもなあ…

最適化を考えなきゃ、スケジューリングなんて楽勝だぞ(w
661659:01/10/23 14:27
660

できればスケジューリングについてわかりやすく書いてある書籍
またはあなたのバイブル教えて!
>>661

MINIX本には、ラウンドロビンか何かの実装ならそのまんま
のってた気がするが。あれじゃ駄目?
他にもオライリーかなんかのC++の組み込みの、
ダニの本だと、組み込み用のへぼいスケジューリング
のコードがのってた気がする。
663♯6411:01/10/23 15:04
>>661 いまGoogleで見つけたYO! 参考にしてね。

http://wwwsoc.nacsis.ac.jp/ssj2/
664:01/10/23 16:31
>662
Oreily の本は薄く、読みやすそうで気になってました。
スケジューリングについて調べるために、購入して読んでみます。
665 ◆vf4n5adY :01/10/23 17:20
 
666デフォルトの名無しさん:01/10/23 17:38
vectorでダウンロードしたあとにガッカリする度
HSP製だった>VB製だった
誤送信スマソ。(鬱)
668デフォルトの名無しさん:01/10/23 19:01
>662
MINIX本とは?
662 はOSのプロセススケジューリングと勘違いしてない?
>>669 sageだし、ネタだろ?
671659:01/10/23 20:54
プロセサ内部での
主記憶から 演算器までの過程での内部命令のスケジューリングの
ことです
具体的にどういう処理をやっているのかよくわかりません
672669:01/10/23 21:13
ごめん、本当に勘違いしてた。
逝ってくる。
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 です
683Ss:01/10/29 18:27
lexやyaccをつかうのに、Cygnus gnu-win32というのが
が必要らしいのでダウンロードしたいのですが、
>2のHPにいってもどれなのかわかりません。
どれをダウンロードすればいいんですか?
初心者ですみません。
677でも680でもないけど文脈からCP/M形式のことではないかと。
>>683
Cygwin 版ではない Win32 native の lex, yacc もありますよ。

http://unxutils.sourceforge.net/

flex.exe が lex, bison.exe が yacc 互換のプログラム。
686デフォルトの名無しさん:01/10/29 18:43
bisonじゃなくてbyaccが欲しいんだけど
687デフォルトの名無しさん:01/10/29 19:00
>>681
COMモデル=CP/M形式のコンパイラのことだろ。
アロケータが必要ないし、
APIの事を必要とせずに作れるからだろ。
多分680は全てを一からスクラッチすることを念頭に置いてると思われ。
>>687
アロケータじゃなくてリロケータだろ
689デフォルトの名無しさん:01/10/29 21:31
GPLのソフトのソースから技術情報等を学んで作った(コピペじゃない)
ソフトをGPL以外のライセンス(ソースが非公開とか)で配布することは
可能ですか?
スレ違いのような気がするけど

>>689
OK

GPL の法的根拠は著作権ですが、著作権法では、アルゴリズムやそこに書かれた情報などは保護対象
ではありません。そのソースコードで使われているアルゴリズムが特許で保護されていたり、ソースコード
を入手するにあたって機密保持契約などを結んでなければ問題なしです(NDA と GPL が両立するかどう
かは、また別の問題)。
便乗でスマン。
GPLのソフトのソースを別の言語に移植したものって、ライセンスは変更可能なのか?
たとえば、C言語で作られたものを、pascalになおしたとか。
# 当然、実際そんなことがあるとすると、ベタ移植ではなく機能アップするだろうが
>691
むり
>>691
自分が著作権を持ってるソースの場合、それとも GPL で流通しているソースを移植した場合
の話?
694Ss:01/10/29 22:22
>685
ありがとうございます。
さっそくダウンロードしたんですが、
使い方がいまいち・・・
どっか解説とかしてるホームページとかありますか?
初心者でほんとスイマセン。。
>>694
はい。 >>3
後は、オライリーから出てる Lex&Yacc 本買うか、
小さ目の処理系のソースコードを読むかだね。
696デフォルトの名無しさん:01/11/02 23:50
bison/flexでC言語ライクなスクリプトエンジン作ろうと思ったら
良いページを発見。
ttp://www.oishi.info.waseda.ac.jp/~oishi/interpreter/ma.html
早速解析してたら、CINTなるCインタプリタがソース公開されてると聞いて
そっちにも手を出してます。

CINTをユーザープログラムに組み込む方法を探してます。
書籍では1冊あったんですが、HPでは英文しか見当たらないようですね・・・(T^T)
ぼちぼち読んでみますが、何かご存知でしたら情報共有しましょう!
過去ログにもCINTはあんまりないようですし。(←需要が無い?)
sage
さがってないし。鬱。
言語の意味論を勉強するのによい本はありませんか?
699696:01/11/05 21:09
ttp://www.oishi.info.waseda.ac.jp/~oishi/interpreter/ma.html
を元に見よう見まねで電卓を作ってみる。++,+=,16進数等を追加。
http://page.freett.com/pluteus/works/bin/calc.lzh
まだif文などにバグあり。
switch〜case文、break文、continue文、配列変数なども実装したいけど、
どこかにソースないですかねぇ?
700700:01/11/07 12:08
ソース?
701デフォルトの名無しさん:01/11/07 21:44
>>696
サンクス。
702デフォルトの名無しさん:01/11/13 20:20
ageたい
703デフォルトの名無しさん:01/11/14 02:35
以前Perlのソースを読もうとして挫折した者です。
PerlにもRubyのHacking Guideのような、ソース読解の
手引きのようなものがあるとうれしいのですが、、、。
どなたか、ご存知の方いらっしゃいますか?
(スレ違いかもしれませんが)
704kumiko:01/11/14 20:44
ランタイムエラーで、「”)”がありません」と出てくるのですが、
エラーのラインを見ても、何もありません。
どんな事が考えられるのでしょうか?
教えてください。
>>704
???スレ違いか?
↓こっちの方がよくない?

***すれ立てるまでもない質問はここで 第6刷***
http://pc.2ch.net/test/read.cgi/tech/1004183881/
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
Perl? >>703
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の嵐がかなわん。
711_:01/11/17 18:59
age
コンパイルとおって正常に使えればいいんだよ・・・
本格的にbisonの出力を読んでみたいひとは別として
普通はそのままか、簡単なフィルタを通すだけでに
つかうだろうね。
>>710 みたいに書き換えることも考えられるけど
そうすると文法ファイルを書き換えるたびに出力ファイルを
書き直さないといけない。
713710:01/11/17 19:31
>>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で全部切り分けしてるから
もう何がなんだかわからん状態ですが何か?
>>715
CVS いれてブランチ切れば?
717_:01/11/27 12:49
ageさせて
718デフォルトの名無しさん:01/12/19 22:39
あげ
719デフォルトの名無しさん:01/12/22 07:33
ふっ、言語処理系に興味を持つ厨房がこんなに少ないようじゃ、
日本の情報産業の未来は暗いな。

つーわけで、さらにage。
パラメータLシステム言語ってどうよ?
あれって新しいパラダイム変化を起こせるんだろか。
721デフォルトの名無しさん:01/12/22 11:27
>>719
だったらスレをモリアゲテ・・・
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システムで生成可能な記号列を再帰関数とかで作るという話ではないですよね。
前者なら興味アル!
こんなヤツ。
ttp://www.comp.pu-toyama.ac.jp/~nishida/Pubresult/pllangj.html
ttp://www.comp.pu-toyama.ac.jp/~nishida/Sotuken/plsystem.html

Lシステム自体は実用的な範囲で、生物系のオブジェクトの生成なんかに
使われるのは知っているけれど、
言語自体に採用して便利になるのかよくわからん。
だもんで、思い切って話題振ってみたの。
735デフォルトの名無しさん:02/01/02 16:23
本にのってるとうりにやって、
cygwinのbisonでy.tab.cファイルつくったあと、
gccでコンパイルしようとしたんですが、
undefined reference to 'yyerror'ってのがでます。
これは何がまちがってるんでしょうか?
間違ってない。yyerrorを定義すればok
>736
ありがとうございまふ
738735:02/01/02 17:19
じゃあ、
undefined reference to 'WinMain@16'ってのは
main関数がないということでしょうか?
win32で作ってない?それ。
740735:02/01/02 17:31
モロにWin32です。
どうすれば(゜□゜)???
741デフォルトの名無しさん:02/01/02 18:36
gccに -ly はつけた?
742735:02/01/02 18:44
-lyをつけると
can not find -lyに・・・・
なんでだー
743デフォルトの名無しさん:02/01/02 18:54
自分で↓を定義しないとだめかも?


yyerror(char *s)
{
 printf("%s\n", s);
}
744735:02/01/02 19:33
-Lyにしたら
こんどはundefined reference to 'WinMain@16'
が!
もうわからん。
おちつけ。
まずは標準出力だけのプログラムでやっとけ。
746_:02/01/02 22:47
", s);
747デフォルトの名無しさん:02/01/03 08:17
/lib/
>>744
まだキミにはプログラムを作る以前の知識が足りない模様。
たとえば、「WinMain」で検索するとか、やってみたかい?
それがどういう物かを調べてみなよ。
749735:02/01/03 11:09
あ、空の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
763厨房2:02/01/06 21:46
再帰下降でCの文法って扱えるの?
764冬房=1:02/01/06 21:53
LALRだ。
765764:02/01/06 21:55
(怒らないで、名前間違えた. 764!=1)
766デフォルトの名無しさん:02/01/06 22:00
といいますかコンパイラの基礎理論的なところはすでに太古の昔に
完成されております故、いまさらコンパイラの開発程度で粋がっているのは
程度が知れるデございます。
たぶん>756もそれが言いたかったんだろうけれど、
ちょっと興奮しただけだと思う。大目に見よう。
768正月房:02/01/06 22:51
ってーか、例えば再起下降パーサ(LLだよね?)わかるんだったら、
Pascal,Modula,Eiffel系の言語処理系作ってみる、っつう学習方法がある.

有名どころでは、Knuth 本の PL0 や、それを日本語で焼きなおした本もあった.

あと、構文解析については、ドラゴン本きっちり読んで理解して実践までできる
奴ぁー一握りだと思われ.
もっと薄い本(漏れは培風館の「コンパイラ」)読んで理解して、
実装はYacc/Bison任せにしたほうがよさそう.
769正月房:02/01/06 22:53
間違えました.

× Knuth本のPL0
○ Wirth本のPL0
>756は>766のようなことを小耳にはさんだことがあるだけの冬厨でしょ。
Pascal や PL/0 コンパイラはソースがよく落ちてるから参考になると思われ。
>>756は大目にみてやるってことで。
構文解析の話にグローバルオプティマイズの話で割り込むあたり、ちょっとかわいいなって思ったんだけどな。
773756:02/01/07 01:54
>>766等、まともなプログラムも作れず女もいないゴミどもへ(ワラ

おいおいおい、カスの証明だなお前ら。その「基礎理論」でグローバルオプティマイザでも
作ってみろよ。俺が作り上げたようにな。
まったく、何もできねーんなら黙ってな。オバカさん(w
つーか、お前らゴミ書きのある部分は俺の処理系の恩恵受けてんだから
はいつくばって感謝でもしてりゃいーんだよ。
774デフォルトの名無しさん:02/01/07 01:59
>>773
レベルが低いとわめかれてもどうしようもない。
ただ一言レベルが高くてよかったねとしか言いようが無い。
話が合わないのが嫌なら出てけば?
煽ってもつまらないでしょ。
756 は一体何がしたいのだろう。

>>756
仕事に疲れているならこの板にでも行ってなごんでくれ
http://ton.2ch.net/bird/
はい。筑波りました。感謝。

っで >>756 のいう並列処理系最適化って、
何を勉強すれば作れるの?
777776:02/01/07 02:08
>>756 こっちかよ「マルチプロセッサプログラミングを語るスレ」
 http://pc.2ch.net/test/read.cgi/tech/1005408405/
>>756が並列コンパイラの大域最適化って言ってるから検索してみたんだが、
どうも、並列分散処理での最適化って、計算の目的に特有のものか、あとは、
配列の計算の最適化(グローバルではないだろうな)くらいしか見つからないんだ。
もうちょっと探してみるよ。
つか、スレ違いだな。
まースレ違いだが、SMPのラック・サーバに、Gbitイーサ仕込んで、
戯れてみたいテーマではある。
>>756はグローバルオプティマイズ厨と認定されました
>756はレベル高すぎて空回りしてる気が。
もうちょっとレベル下げて技術話でもしてくださいよ。
せっかく専門の人なんでしょうから……。
>>756は放置って事でいいじゃん。
ええー。経験者そうだから情報引き出したいなぁ。
784ほえ:02/01/07 21:44
ずっと昔 (1995年ごろだったっけ?) Stallman が Tcl はいやだといって Scheme ベースのスクリプト言語を作ろうといっていたことがありましたよね?
いわゆる GNU Extension Language Plans というやつですが、結局そういう言語ってできたんでしょうか?
たとえば Rush とかもあったような気がするんですが、結局この話はどこに流れていったのでしょうか?
俺はそれより2chOSの行方がきになる
>>784
guileのことか?
>>773
ここのスレタイトルは「相談室」だよ。

子供電話相談室に「夕日はどうして赤いの?」って質問してきた子供に対して、

「今時夕日がどうして赤いかなんて低レベルな質問するなんて笑わせるぜ、
 黒点活動と磁気嵐とについて研究してきた俺から見るとな!」

って突っ込み入れているようなもの(藁

だいたいコンパイラ屋なんて縁の下の力持ちなんだから、だまって精進して、
わかる人に「いい仕事してますねぇ」って認められても「仕事ですから」って
職人気質で答えていれば、かえって尊敬されるのに。
788ほえ:02/01/07 22:17
>786
> guileのことか?
そう、それでした、GIMP にも使われているそうですね。
Scheme を中間言語として…なんていうアプローチもあったようですが。
ていうか、guile の一環として多言語からのコンバータみたいなものもあるのかも。
コンバータというか、guile でパーサとかを作っちゃうとかみたいな。
面白そうなのでちょっとマニュアル(あんまり整備されてないけど)読んでみます。
Scheme スレの方が適切なきがしてきたので逝きます。
789デフォルトの名無しさん:02/01/11 18:41
いっしゅうねーん
>Rubyにはリファレンスカウントではない真のガーベージコレクタがある。
>よってリファレンスカウントでは生じるようなメモリリークが発生しない。

ObjectPascalの文字列や動的配列とかはリファレンスカウントで自動的に
メモリ管理されているけど、不完全ということ?
誰か解説してください。
age
循環参照だけだろ。リファレンスで不都合が生じるのは。
つまりA->B->C->Aで参照関係の在る場合。
文字列だけなら真のGC不要。
あと、ObjectPascalどころか、STL/MFCもリファレンスだと思った。
793ほえ:02/01/14 08:28
>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されない、ってかんじで、どでしょ?
796ほえ:02/01/14 14:06
>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無しでやって欲しい。
802ほえ:02/01/14 17:14
>801
なしってことは、明示的に消滅させるってことですか??
>>802
そう。
>>800
松下のGCとか?
>>803
明示的に消滅させそこねた場合はどうするの?
>>801
もう見てらんない。
Delphiでも使ってなさいってこった。
807ほえ:02/01/14 17:30
>804
松下のって…何?
808ほえ:02/01/14 17:31
>805
多分、メモリリーク発生。
C で malloc したけど free しなかったのと同じ。
C++ で new したけど delete しなかったのと同じ。
>>805
そんなこと行ってたらCも使えなくなるでしょ。
GCってそんなに便利か?
むしろ失うものが大きすぎる。
>809
厨房はすっこんでろ
Ruby の言語仕様で GC なしは無理だろ。
>807
PanasonicのGC
>>809
Ruby に関していえば、保守的 GC のおかげで
C で拡張ライブラリ書くのがかなり楽。
814ほえ:02/01/14 17:43
>812
ゲームキューブ…………か……
オブジェクトが自身の寿命を管理するオブジェクト指向GCってないの?
>>815
それリファレンスカウンタだろ
>>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のパーサーややこしいです。初心者にはつらめ・・・
824821:02/01/15 18:36
>>821
で得たyaccソースのアクション部にコードを生成するコードを埋め込んでコンパイラ作りたいと思っているのですが、
これは通常の方法なんですか?

いまいち、具体的にどのようにコードジェネレータを作ればいいか悩んでいます。
なにかヒントはないでしょうか?
825デフォルトの名無しさん:02/01/15 18:37
緊急で質問です。

TeXで「V」を表示させるコードを教えてください。
よろしくお願いいたします。
>>825
出入り禁止にされたくなかったらマルチポストはやめるんだな
827デフォルトの名無しさん:02/01/15 19:24
誰もおしえてくれねーからあっちこっちで聞いたんだが、
ここの板のレベルは低いね。
もういいよ。やれやれ…

スレたてねーだけ感謝してくれ。
こういう捨て台詞は本人が書くんだろうか。
必ず「レベルが低い」という文句が入るのが興味深いね。

日本語のページからTeX ローマ数字を検索しました。 約134件中1 - 50件目 ・検索にかかった時間0.43秒
http://www.google.co.jp/search?num=50&hl=ja&q=TeX+%83%8D%81%5B%83%7D%90%94%8E%9A&lr=lang_ja

スレ違いなので終了
本読みながら
簡単Cもどきコンパイラつくってるけど、
すっげえムズイ・・・・
こんなの最初につくった人はすげえ
>>825
すれ違い氏ね
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
838yacc聞いてもいいですか: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
>>839
GPLに汚染されるよ
842yacc聞いてもいいですか:02/02/01 21:56
>>840
レスありがとうございます。そのようにしたいのですが、
expr1のアクションの方が、expr2のアクションより先に実行されてしまい
ますよね。
>>842
スキャナがトークンを返したところから expr : expr1 expr2 までのとこ、
具体的におしえて欲しいなり
844yacc聞いてもいいですか: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ページでやる気をなくす。
847yacc聞いてもいいですか: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
どうも、今度本屋行ったら探してみるよ
やっぱ本一冊でコンパイラ作るのは難しいのかなー
855853:02/02/09 03:43
黒豹本、読み返してみたらあくまでも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 で同じ値になるとは限りませんよね。

とりあえず対応表を作ってやってるんですが、
こういう場合のスマートなやりかたはあるんでしょうか。
859858:02/02/15 11:13
って よく見たら
%token STRING 300
とかできるんですね....
逝ってきます..
860デフォルトの名無しさん:02/02/15 18:52
>859
自己解決厨 (・∀・)イイ!!
自己解決厨というのは「解決しました」だけ書いてそのままのやつ。
厨とまではいかないだろ
中間コードを出力するスクリプトコンパイラを作るためにyaccに挑戦してみようと思ってます。
早速調べてみたんですが、検索しても「BNF文法を使って・・・」とは書いてあるんだけど、
肝心のBNF文法について記述されているものが見つかりませんでした。
x : expr + expr
| expr - expr
みたいなものを連ねていけば良いのはわかるんですが、、、
すみませんが、「BNF文法」について解説しているHP等紹介して頂けないでしょうか?
>>862
BNF記法で検索すると、幸せになれるかも。
BNF「文法」じゃなくて「記法」ね。
864858:02/02/19 00:36
たびたびすみません...

>>859 の方法でとりあえず動くようにはなったんですが、
そのままだと定数 300 を a.y b.y 両方に書くことになって
保守性がアレなので、なにかいい方法ないでしょうか。
外部プリプロセッサ(m4等)はできれば避けたいので...。
1こ作って#includeしれば?
866858:02/02/19 01:29
>>865
yacc宣言部で include できるのですか?
調べているうちに思ったよりいろいろ面白い事が出来そうだなと思ったんで、
1冊書籍を注文してみました。「lex & yacc」ってやつです。

>>863
発見しました。ありがとうございます。
868デフォルトの名無しさん:02/02/24 14:50
一ヶ月くらい前から知識ほとんど0でドラゴンブックを読み進めているんだけど、どうも章ごとの練習問題の解答例がないせいですっきりしない。
明快な解答とは行かないまでも、指針みたいなものがあるHPってないかな?
英語でもOK(っていうか最初から日本語は期待してない)なんで、知っている人がいたら教えてね。
869デフォルトの名無しさん:02/02/26 04:43
TR-SECD に関する日本語で読める文献は無いでしょうか?
こんな感じの
http://www.cs.utexas.edu/users/boyer/ftp/nqthm/trsecd/trsecd.html
870age:02/03/11 01:12
誰かいませんか?
>誰かいませんか?

何故「誰かいませんか?」とき(略)
872デフォルトの名無しさん:02/03/12 09:14
>>869
SECDR Schemeというのがあって、
これは末尾再帰を付加したSECDマシンの拡張を使ったScheme処理系らしいです。
これを作ったのは日本人です。
マシン自体の日本語での説明はあまりなかった気がするけど
ソースがわかりやすかったんで参考になるかと。
昔、niftyで落とせました。
873デフォルトの名無しさん:02/03/20 06:47
良スレなんでageとくわ。
874_:02/03/30 16:34
javaのクラスファイルを吐く簡単なスクリプトを作ってます。
a = 1 + 2とか整数だけの式は思ったより簡単に処理できましたが
.演算子とかクラスが入ってくるとどう処理していいのか分からなくなります。
objはObj型のインスタンスで
Obj型のインスタンスを返すFunc()メソッドを持っているとして
a = (obj.Func()).Func();
これってどう処理したらいいのでしょうか。
ノードひとつひとつに型を保持したらいいの?
うーん、こういうのもlispで作ったほうが分かりやすいのなら
作り直おそうかな。。。
875874:02/03/30 16:38
.演算子→.(ドット)演算子
なにがしたいんだい?
877874:02/03/30 16:54
ドット演算子のノードをコンパイルできないんです。
. --- instance
|
. --- instance
|
var
こんな木構造のノードが・・・って分からないですね。。。
すみません、やっぱlispにしてみます。
つーか874だけでは助言しようもないよ
>a = 1 + 2とか整数だけの式は思ったより簡単に処理できましたが
簡単に処理できた、とは?
a = 1 + 2
の式ではどんな出力になったの?
879874:02/03/30 17:38
>>878
えっと
const 1
const 2
iadd
istore 0
です。
880874:02/03/30 18:25
>>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 行くらいのインタプリタのサンプルもあるから試してみれば?
888>>883:02/04/21 08:45
インタプリタのようなものなら作った。中途半端だけど。
糞コードになって飽きてやめた。
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
>>895
threaded-code
って何?
関数ポインタジャンプじゃないの?
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*だと*できるのか・・便利だね。
これの利点は関数呼び出し程のコストが掛からない、ってか?
903s:02/04/30 21:02
突然ですが。
http://www.empathy.com/pccts/roskind.html
に、Jim Roskindというヒトが書いたC++のソースのyaccによるパーサ(でいいよね?)が
あるようです。
templateには対応してない(らしい)ですが。
言語・環境は問わないんで他にC++を解析するようなモノを
どなたかご存知ありませんか?
C++のソースのparsingについては
かなり難しいらしいが
現にdoxygenみたいなのもあるんだし。
templateくらい自分で書き足しなさい。
C++3rdにBNFでの記述無かったか?
905s:02/04/30 21:26
>903
そういえばそうですな・・・
みんなそうしてるんだろうか。
がんばってみるか〜
g++のソースは読めたもんじゃなかったし
>>903=>>905
doxygenってソース公開されてないのか?
doxygenで目的が達成できるなら、そのソースを取ってくればいいと思うんだが。
age
>>903
結局そうやって集めて何に使うのかね。
目的と手間考えたらアホらしくなるんじゃないかと。
特にC++の場合。
909s:02/05/01 16:27
ぬおお sagaってる・・・
>908
結構需要はあるとオモーウヨ
VC++のIDEについてるクラスブラウザの
もっと正確で使いやすいのを作りたい。
結構身の程知らずだけど・
反応が少ないのはやっぱりスタンダードなのが無いからかなぁ
とりあえずdoxygenのコードを漁るか・・・
910s:02/05/01 16:54
http://www.parashift.com/c++-faq-lite/compiler-dependencies.html
FAQだったとは・・・
>[33.10] Is there a yacc-able C++ grammar?
911デフォルトの名無しさん:02/05/01 23:55
BSD Magazine の「マイ・シェルを書こぷ」期待 age
912デフォルトの名無しさん:02/05/02 22:46
誰かC++の現在進行形の仕様を満たしたcfrontのオープンソース版を
作って公開してくれ。
913s:02/05/03 01:08
>912
「cfrontは使い物にならない」との指摘を
外国のどっかの掲示板で受けている人を見かけたヨ
ってかグローバル変数のコンストラクタ関係の所為でC++−>Cの変換が出来ないと
聞いた(確か。
物凄くちっこい86アセンブラ書いたYO!!
命令はmov,add,subだけでAXレジスタonlyで
コメント書けなくてエラーチェックもしてないけど・・・(w
結論=使えない俺
次は jmp $+n jz $+n だ!
>>913
c++のプログラムエントリをcのそれにそのままマップするとそうなるけど、
cのプログラムエントリでコンストラクタを起動するように書けば問題ないだろ?
917s(スレ違いスマソ:02/05/03 02:50
>916う〜確かに
あと例外処理とか・・・が無かった気が?<-cfront
よく覚えてない。
テンプレートとか考えると、そのCコンパイラで
gccをコンパイルしたほうが早い。
実際cfrontが実用化されてる路線で未来が進んでいたら、
どんな環境でもCコンパイラさえあれば済む時代がありえたってのに・・

─────金のせいですべてが捻じ曲げられた未来が、ここにはあった。
>>916
複数のファイルに分かれているものを、どうやって一箇所に集める?
>>920
んー、確かに無理っぽい。

Javaみたいにコードががクラスの中にしかなければ
(使うクラスは全て分かるから)Singletonパターンで
初期化ルーチンを呼べば良いが、クラスと関係ない
初期化コードは呼び出しようがないな。

例えば、
#include <class1.h>
Class1 c(100);
しか書いてないファイルがあったとして、この初期化
コードをmainから呼ぶようにする方法がない。
922_:02/05/03 05:06
>>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使って。
931919:02/05/03 20:37
いや、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 とどう違うの?
939937:02/05/04 01:41
どうやらがいしゅつだったようですね。
>>938
> だから分割コンパイルは無理だよね?という話。
オリジナルの cfront は nm (オブジェクトファイルからシンボル情報を抽出する
コマンド) を使ってシンボル情報を抽出、その情報を使って非ローカルオブジェ
クトのコンストラクタを走らせるコードを生成してたんじゃかった?
えーっと、ファイルごとの初期化ルーチンを
__ファイル名_init()
とかの名前にしておいて、それを呼び出すとか?

Unix依存だがそれなら可能かな。
>>941
それならnmなんていらないじゃん。
標準的なCでできるってことだね。
>>942
いや >>941 の方法だと出来ないでしょ。
944デフォルトの名無しさん:02/05/05 03:56
>>943
なぜ?
ファイルがリネームされたときとかの話?
分割コンパイルだと、どのモジュールを利用するか特定できないから、
スタートアップルーチンを走らせる手段がない。
?リンク時には分かるよね?
その時にスタートアップルーチンを動的に
作れば、っていう話だと思っていたのだが。
>>944
ライブラリも。
>>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()の中で、そういうやつがいなくなるまで繰り返し呼ぶ。
949房々:02/05/05 15:32
デバッグでeaxが使えないのは何故なんでふか?
950デフォルトの名無しさん:02/05/05 16:47
ロボ鉄
951房々:02/05/05 17:01
>>949
お返事ありがとうございます m(..)m
そ、そういうことだったのですか。
ワケワカラン
ワラタ
GW厨万歳
次スレテンプレ用意 >>960
次スレ立てろ >> 961
もう少し・・・・
もう少しなんだ・・・・
2chよ!私は帰ってきた〜!!
957デフォルトの名無しさん:02/05/06 11:27
>>956
ML版がメインでCとJavaは誤植だらけという噂を聞いたので
ML版を読んだよ。ML版については、とってもよかった。Java
版とC版の真実は知らない。
>>957
MLの日本語版ってあるの?
次の人、ヨロシク
960デフォルトの名無しさん:02/05/06 19:43
スタックマシンからレジスタマシンへ命令の変換は簡単に出来るけど、
その逆って出来ないんですか?
>>960 非効率なだけで 出来ない訳じゃないだろ
962デフォルトの名無しさん:02/05/06 20:55
>>960
もちろんできるよ。

たとえば x86 の浮動小数点コプロセッサはスタックマシンだけど、ふつーの C 言語
などで書かれた式(変数を自由に使える高級言語は、いってみればレジスタ数無制
限のレジスタマシン用アセンブラみたいなものだよね)をコンパイルできるでしょ?

ただし、純粋なスタックマシン、即ちスタックトップしか見えずにスタックトップとその
下のものを入れ替えたりできないマシンだと、極めて非効率で実用に耐えない筈。
963914:02/05/09 04:55
どうにかAH-DH,AL-DLまで使えるようにしたでやんすでワショーイ

徹夜明けなんで来てます来てます、ピピピ(´∀`;)
寝るのも仕事のうちだぞ
965914:02/05/09 23:47
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
>そろそろ次のスレ立てるか・・・
言ーだしっぺの法則つーことで、あとよろしく。
969967:02/05/11 23:05
はい。がんばります。
つか、残り31レスどうしようか・・・
ねぇ
アセンブラマクロのdbはどうやって実装しようか?
お好きなように
>>970
そんなところで躓くなよ
973967:02/05/12 02:12
『コンパイラ・スクリプトエンジン』 相談室 2
http://pc.2ch.net/test/read.cgi/tech/1021136715/

立てたよ。疲れた。
以後、上のスレでお願いします。
974KOKUYO: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!
984 :02/07/07 15:08
9851000:02/07/07 15:17
986 :02/07/07 15:44
1000!
あとはすきにして
1
む?
ん?
1000
  1
998 :02/07/07 15:55
  0
10001000:02/07/07 15:57
さあ、はじめりです。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。