トップページ⇒tech
1001コメント316KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさんNGNG
yaccやlexの使い方やら言語仕様やらの話題。
0002リンクNGNG
http://www.cygwin.com/
http://cygwin.cjb.net/
0003これでどうよNGNG
参考リンク
http://rananim.ie.u-ryukyu.ac.jp/~kono/lecture/2000/compiler/index.html
http://compilers.cs.uec.ac.jp/
http://www.arch.cs.kumamoto-u.ac.jp/project/kite/kiteasm/lex/
http://www.arch.cs.kumamoto-u.ac.jp/project/kite/kiteasm/yacc/
http://www.is.s.u-tokyo.ac.jp/~vu/96/cad/compiler.html
http://www.is.s.u-tokyo.ac.jp/~vu/97/jugyo/processor/soft.html
http://www.ulis.ac.jp/~nakai/rel_web_compilers.shtml
http://member.nifty.ne.jp/nakamula/recurs.htm
http://www.tokumaru.org/
0004デフォルトの名無しさんNGNG
ここも。
http://compilers.iecc.com/

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

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

http://www.iecc.com/gclist/GC-algorithms.html#Jargon
root setとかlive dataとか書いてるし。
0013デフォルトの名無しさんNGNG
>>9
メモリ領域の移動(空き領域を1つにまとめる。デフラグみたい?)
はメモリコンパクションって呼んで
厳密にはGCとは別物
ただ一緒にやってしまうGCの実装も多そうだし
アルゴリズムによっては下記みたいに自動的に
コンパクションもできてしまうものもある
>>11Copyingはたしかヒープを2つに分けて片方がいっぱいになったら
必要なものだけたどってもう一方にコピーするヤツだと思った
メモリの無駄が多いけどコンパクションも一緒にできる
0014デフォルトの名無しさんNGNG
>>10
64とか、プレステなんかの
MIPS系列のCPU積んだマシンは
たいていこの手法ですね。

ただ、もっと動的な再コンパイルですが。
jump/callの部分でコード変換したものを
キャッシングすることで速度を稼いでいるようです。

fpse.emuforce.comがソース公開です。
0015スクリプト系NGNG
参考リンク
http://www.kt.rim.or.jp/~kbk/

参考になるかな?リンク
http://www.din.or.jp/~glit/TheOddStage/
http://www.sun-inet.or.jp/~yaneurao/
0016デフォルトの名無しさんNGNG
LISPやSchemeはスクリプトに入るのかな?実装は一番楽だと思うけど。
0017デフォルトの名無しさんNGNG
あ、CommonLISPやR5RSとかの規格に準拠させるならそれなりに大変なんだけども。
それでも他の言語よりは楽かな?
0018デフォルトの名無しさんNGNG
自作コンパイラage
0019デフォルトの名無しさんNGNG
Schemeが流行るといいなage
0020デフォルトの名無しさんNGNG
CommonLISPはそれなりなんてレベルじゃないよ。
schemeもR5RSにキッチリあわせようとすると一月はかかるね。
0021デフォルトの名無しさんNGNG
>>20
一ヶ月ですむならやってみようかなぁ…
0022デフォルトの名無しさんNGNG
http://www.jah.ne.jp/~naoyuki/index.html
scheme実装とか載ってる。
あとソースも公開されてるし。参考になるかな
0023デフォルトの名無しさんNGNG
俺の上司が昔8KバイトのROMにLISPのインタプリタ
を押し込んでいたな・・。
0024デフォルトの名無しさんNGNG
>21
最新のR5RSじゃなくてもR4RSに準拠すればオンライン上にある大抵のスクリプトは通るよ。
(あんま変わらないかもしれないけど。)
がんばってね。
0025デフォルトの名無しさんNGNG
昔8086のsmallモデルでも動くschemeをCで作ったけど、だいたい2kステップぐらいだった。
0026デフォルトの名無しさんNGNG
期待age
0027デフォルトの名無しさんNGNG
参考書籍
yacc/lex プログラミングジェネレータ on UNIX - 五月女健治 - tp

0028デフォルトの名無しさんNGNG
>>27
その本って絶版じゃなかったっけ。図書館いけばあると思うけど。(啓学出版ってつぶれたんじゃ?)
参考書籍
C stepupシリーズ(3) yaccによるCコンパイラプログラミング
ソフトバンク
ISBN4-89052-136-4
内容:
簡単な8086のASMコードを吐くCコンパイラサブセットの実装が載っている。
niftyにこれの全ソースが落ちているのを昔見ました。
0029デフォルトの名無しさんNGNG
コンパイラを作る方法
翔泳社
ISBN4-88135-072-2
内容:
Pascal-Bという処理系の実装(+仮想マシン)
0030デフォルトの名無しさんNGNG
CプログラムブックI,II,III
アスキー出版局
ISBN失念
内容:
I にForceインタプリタ
II にREDAというコンパイラ、makeの実装、
III にlispの実装
0031デフォルトの名無しさんNGNG
それから、niftyのFPLとかに結構な量の処理系があった。
0032デフォルトの名無しさんNGNG
技評の本で、Cライクなコンパイラ、インタプリタと
アセンブラを作成する本があったな。
会社にあるのでいまは挙げられないけど、あとで調べておくよ。
0033デフォルトの名無しさんNGNG
>>28
その本、今日買ったんですけど・・・
>>32
気が狂うほど期待です
0034デフォルトの名無しさんNGNG
たしか'mc'なんとかでしょ>32
デバッグコンソール環境も付いてた筈。(ただしNEC9801用)
0035デフォルトの名無しさんNGNG
昔、アジソンウェスレイ出版社の本でCのインタプリタが載ってるのがあったなあ。
その本は当時としてはかなり内容が濃かった。(マルチスレッドとかTSRとかエディタ、DBなど)
多分もう売ってない。工業系の図書館いけばあると思うけど。
0036デフォルトの名無しさんNGNG
大学の図書館にコンパイラの本なんて腐るほど置いてあった。
0037デフォルトの名無しさんNGNG
ハードカバーで活版印刷のやつも沢山あった
0038デフォルトの名無しさんNGNG
解析を行うにはyacc/lexを選ぶしか方法は無いんでしょうか?
yacc/lex以外の手段はありませんか?
自分でやるのは大変過ぎるからパスですけど…
0039デフォルトの名無しさんNGNG
bison/flex

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

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

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

0043ISONGNG
Perlに決定しました。
それは置いといて、

>>42
別に色々あってもいいんじゃない?
0044デフォルトの名無しさんNGNG
ALGOL 200x,,,
0045デフォルトの名無しさんNGNG
LL構文解析はスタック作って、ヒープ領域に置いたほうがいい?
それとも、再帰使ってスタック領域を利用した方がいい?
0046sageNGNG
>>45
LL構文解析に限った話題じゃないね sage
エラー処理はOSに任せてスタック使ったら?
004732ではないですがNGNG
>>32,33 技評の本で、Cライクなコンパイラ、インタプリタと
アセンブラを作成する本があったな。

たぶんこれじゃないですか?
「ハイクラスC言語 コンパイラ&インタプリタ」舟本奨 監修 末石吾朗+小林優 著
8080CPUもどきアセンブリコードを生成するコンパイラと、
そのアセンブリコードを実行するインタプリタのソースが載っています。
0048しつもんNGNG
ソースが見やすいけど複雑な言語、(私が思うにC/C++みたいな)
ソースはみずらいけど簡単な言語、(私が思うにRubyみたいな)
どちらの方が一般に好まれますかね?
0049デフォルトの名無しさんNGNG
ドラゴンブックを読んでるんですが、数学的な証明の部分とかも
ちゃんと理解しないとコンパイラは書けませんか?
0050デフォルトの名無しさんNGNG
>>49
いらないと思う。
コンパイラ技術の論理的なこと(???)を理解するには
ドラゴンブックはいい本かもしれないけどあんまり実践的じゃない。と思う。:-)
0051デフォルトの名無しさんNGNG
BNFで表したCやC++やJavaやJavaScriptの文法って
どっかにないでしょーか?
0052デフォルトの名無しさんNGNG
>>51CならK&Rの付録についていたような、、、
0053デフォルトの名無しさんNGNG
>43
ソフトごとにマクロ言語を覚えるのが面倒です(^^;

誰かが優秀な言語のスクリプトエンジンを公開すれば
多分それがデファクトになるのかなぁとも思うんですけどね。
0054デフォルトの名無しさんNGNG
>>51 これじゃ駄目?
Javaの文法
http://java.sun.com/docs/books/jls/html/19.doc.html#52996
0055デフォルトの名無しさんNGNG
>>53
うーむ。
優秀ってのはよくわからないけど、
o GNU Makefile,VC++,BCBなどのプロジェクトファイルが付属している。
-> .libや.aなどのバイナリも付属させる?

o なるべく小さく。
-> 考え方にもよると思うけどソースファイルで50KBぐらいが限度?

o Lisp系の文法でも良いかもしれないけど、普及するとは考えにくい
(「わ、括弧だ」で敬遠する人がいるかもしれない)。
-> なのでC言語ライクにする。

o ライブラリに依存しない。
-> 構築するのが面倒になるから。
こんなの?

それと聞きたいんだけど、例外処理っていると思う?
型なし言語だとして
try
{
throw "例外";
}
catch e
{
print e, "\n";
}
0056デフォルトの名無しさんNGNG
おお、おもしろそう
0057デフォルトの名無しさんNGNG
compiler.age();
0058デフォルトの名無しさんNGNG
>>55
ソースでの配布キボンヌ。
005955NGNG
>>58
>>55 は「こんなのだったらーいいなー」ってのを書いただけです。。。^^;
作ってるのは作ってるんですけどForthっぽい+自前のGCを装備というやつです。

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

0062デフォルトの名無しさんNGNG
>>61
これは日本語に由来してますか?
10 a =
# 10をaに代入する
0063デフォルトの名無しさんNGNG
>>61
こんなスレにも煽りがいるのか。
そんなあなたはMINDを使っててください。

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

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

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


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

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

そりゃ、知らないものは教えようがないよね。
0073デフォルトの名無しさんNGNG
>>68
そうだね、プログラム言語に過去とか現在なんて概念はないし。
>>66が言ってることは、ちんぷん漢文だよ(藁
0074デフォルトの名無しさんNGNG
>>66
君が>>64よりも英語ができると思った根拠を示せ。
0075デフォルトの名無しさんNGNG
話題を変えようぜ。
関数型言語ってどんなのなんですか?
全部が関数で作られてるとか???
0076デフォルトの名無しさんNGNG
>>66
今何時ですか?
0077デフォルトの名無しさんNGNG
>>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/
ドラゴンブックよりも実践指向で、オブジェクト指向言語とか最近の
トピックも押さえているので、ぜひ日本語版が出てほしい本です。
0078デフォルトの名無しさんNGNG
>>75
ループが無いとか、
変数に代入ができない(するべきではない)とか、
わたしも最初、「こんなのでプログラム書けるの?」と不思議でした。
でも、慣れるとCやJavaよりすっきりとしたコードで
プログラムできるんですよ。

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

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

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

パーサや正規表現の解説も「yaccとlexに頼れ」で飛ばすんじゃなく、
ある程度わかりやすく説明して本がいいのですが。
0084デフォルトの名無しさんNGNG
C++はテンプレートがかなりいい。
でも、規則の組み合わさり方が複雑すぎる。
0085デフォルトの名無しさんNGNG
>>80
>よーん
馬鹿?(ワラ
0086デフォルトの名無しさんNGNG
>>85
まあまあ、別に「よーん」って言おうが言うまいが、コンピュータ言語
について話す上では関係ないことだし。
つーか、そんなとこにいちいち突っ込む君の方が馬鹿じゃん。
0087デフォルトの名無しさんNGNG
ていうか意味わかんねーなと思ったけど、80。
0088デフォルトの名無しさんNGNG
よーん、、87がいじめるモナー
         ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄
           ∩_∩
          ( ´Д⊂ヽ
         ⊂    ノ
           人  Y
          し (_)
0089デフォルトの名無しさんNGNG
赤塚ファンが苛められてるな。
いや、とりみきファンの可能性も、、
009083NGNG
だれか洩れの質問>>83に答えてください。
0091not 83, not 90NGNG
>>83
ageなきゃ意味ないだろー。
0092部外者ANGNG
ドラゴンブックは翻訳されてるけど。>83
他に何か?
0093ミトコンドリ子NGNG
>>83
プログラミング言語処理系 岩波講座ソフトウェア科学5
ISBN4-00-010345-8
なんてどうかしら? 適当に端折られてるから、ドラゴンブックよりは
読みやすいかもしれないわ。

ついでに、タイガーブックってしらないんだけど、正式名称教えていただけ
ないかしら。
0094部外者ANGNG
それ持ってるけど、内用はまんまドラゴンブックの縮小版って感じだね。>93
(それでも辞典並みに分厚いけど)
0095デフォルトの名無しさんNGNG
>>93
あー思い出した。俺もそう思うよ。
>>94
読み比べるとやっぱり読みやすいと思うよ。
ただそれを元に実装しようと思うと足りない情報があって、
結局ドラゴンブック読むことになるって感じかな……
どうよ。
0096部外者ANGNG
>94
x内用
o内容

薄っぺらいのが良いなら、
計算機科学/ソフトウェア技術講座7「コンパイラの理論と実現」
ISBN4-320-02382-X
共立出版 2700円
てのもある。
最後にC--というコンパイラの実装が乗っている。
これのパーサはyaccを使った物と、再帰下降の2種類が掲載されている。
0097ミトコンドリ子NGNG
>>95
そうそう、そのとおり。
理屈だけ知るなら93
実装までするならドラゴンブックって感じかしらね。
0098デフォルトの名無しさんNGNG
実装だけならドラゴンブックいらん・・・。
009983NGNG
>>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

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

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

理論よりも自分で実装することに興味があるので、ドラゴンブック
は読んでてつらいのです…
010083NGNG
>>99
一行目の「ドラゴンブックとは、 」は「タイガーブックとは、 」の間違いです。
0101デフォルトの名無しさんNGNG
>>99
実装より理論のが簡単なんだって。
0102デフォルトの名無しさんNGNG
>>101
え?理論なんて全然知らなくても、yaccなどの助けで
実装できるよ。
一方、構文解析等の理論は本格的な学問で奥が
かなり深い。
0103デフォルトの名無しさんNGNG
>>102
yacc/lexに頼らないってのがそもそもの前提じゃん。
>>83
を参照。
010483NGNG
>>103
えと、yacc/lexを使いたくないというんではなく、ブラックボックスなのが
気持ち悪いので、いちおう基本理論の理解だけしておきたいという程度
です。「ドラゴンブック読め!」と言われるのはわかっているんですが、
難解で…
010583NGNG
age忘れ。
0106103NGNG
だからね、まとめると、
ドラゴンブック = 理論+実装
>>93 = 理論
なので、>>93 読め。
0107コンパイラ屋(休日出勤)NGNG
最近は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.
010883NGNG
>>107
ありがとうございます。
コンパイラ初心者におすすめというか、あまりアカデミックでない実践
指向な本はこの中にあるでしょうか?

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

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

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

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

et al.って、「ほか何人か」って意味じゃなかったかしら。
辞書に載ってるわよ。
011183NGNG
>>106
>>93読んでみます。
ただ、海外在住なもので入手がちょっと大変です。
0112コンパイラ屋(休日出勤)NGNG
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円.
0113コンパイラ屋(休日出勤)NGNG
実際に動く処理系をインプリメントするには,コンパイラ本だけで
なくこんな本も結構役に立ちます.もっともインタプリタを作るに
はここまでいろいろ知らなくても十分なんとかなりますが.

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.
0114コンパイラ屋(休日出勤)NGNG
そうそう,スクリプト言語ならこんな本もいいかもしれません.

Randy M. Kaplan,
Constructing Language Processors for Little Languages,
Wiley, 1994, ISBN 0-471-59754-6.
0115コンパイラ厨房(83)NGNG
>>コンパイラ屋(休日出勤)さん
趣味でやる練習としては、既にある言語のサブセットを作ってみるのが
一番いいんでしょうか?

たとえば、どうせ実用にはしないからということで最適化は後回しにして、
SchemeやCのサブセットとか。
0116コンパイラ屋(にせもの)NGNG
大事な本をわすれてはおらぬか?

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

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

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

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

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

0122Yet another コンパイラ屋NGNG
Grail+プロジェクトって何ですか?
0123デフォルトの名無しさんNGNG
本ばっか読んでてもしょうがない。
実践しろ。>コンパイラ厨房
スキルは後から付いてくるから。
0124デフォルトの名無しさんNGNG
本読むのはスキルのためではないと思うが。
0125デフォルトの名無しさんNGNG
コンパイラ厨房へ:
とりあえずそこらへんの小さなインタプリタのソースを読め
自分でも何か作れ
本もきっちり読め
以上.下がってよし.
0126デフォルトの名無しさんNGNG
スクリプトエンジンってやっぱり最適化なんてサ行はしてないですよね?
ソース書く人が自分で最適化するんですよね?
0127言い訳パターン1NGNG
>>126
そこまで速度が要求される場面には使わないでください。
もしくはC言語で拡張してください。
とか。。。
0128デフォルトの名無しさんNGNG
言い訳というよりは、それをやったら「スクリプト」でなくなるという
感じではないかね。
0129126NGNG
>>127
CGIとして使う場面でも速度を求められる場合があると思いますが…
どちらにせよ遅いより速い方がいいですし、
それに最適化って速さだけじゃないでしょ?
CGIって最適化してコンパイルされたものをどっかに保存してそれを実行みたいなふうにはできないのでしょうか?
CGIファイルが更新されたらまた再コンパイルして。
0130デフォルトの名無しさんNGNG
>>129
CGI自体のオーバーヘッドがそれなりにあるので、Java Servletを使う
方が得策です。
0131デフォルトの名無しさんNGNG
130につっこみいれてぇ…
0132デフォルトの名無しさんNGNG
挿れちゃってくださいな。>131
そして逝かせちゃってください。
0133デフォルトの名無しさんNGNG
さすがにネタだと思われ。
0134デフォルトの名無しさんNGNG
>>129 mod_perlは最適化はどうかは知らないが
メモリ上にperlスクリプトをコンパイルした状態で保持します。
0135デフォルトの名無しさんNGNG
アセンブラからCソースを吐くようなコンパイラ(逆コンパイラ?)ありませんか?
結構おもしろいとおもうんだけど、やっぱ難しいのかな?
0136デフォルトの名無しさんNGNG
でこんぱいら
0137デフォルトの名無しさんNGNG
でじこんぱいら
0138コンパイラ厨房NGNG
>>123
>>125
じゃあ、とりあえずインタプリタを作るとして…
やっぱ、お約束通りSchemeからでしょうか?
0139デフォルトの名無しさんNGNG
>>138
実装は大丈夫なのか?

これくらい楽勝だろうな
問題:Cソースからコメントを抜き出し表示する関数を100行以内でつくれ
補足:ANSI-Cにのっとった全てのパターンで動作すること
(注:コピペ)
0140デフォルトの名無しさんNGNG
>>139
138->139の話の流れ方がよくがわからんのだが・・・
ANSI-Cにのっとった全てのパターンとは何?
コメントって/*...*/は良しとして、//は含めるの?
だったらネストとか行末の0x5cも頭にいれなきゃだめだねぇ...
0141コンパイラ厨房NGNG
目的としては、あとで適当に使いまわして、自作ソフト用の組み込み
スクリプト言語として使えるような言語の骨組みを作るということで。

Scemeって実装は楽そうだけど、自分で使いたいかって考えると…
あんなカッコだらけのソースコード見たくないですよ、カテジナさん!

ついでに愛用エディタの秀丸だと、対応カッコのハイライト機能も
ないですよ、マーベットさん!
0142デフォルトの名無しさんNGNG
>>141
秀丸に対応括弧のハイライト機能はあるよん
0143コンパイラ厨房NGNG
>>142
ホントだ。
最近Visual Studioばっか使ってたから、鬱だ、氏のう。
0144デフォルトの名無しさんNGNG
とりあえずschemeのインタプリタ書いて
あとでパーサだけ取り替えれば?
0145デフォルトの名無しさんNGNG
そういやLips/Schemeって、数式は逆ポーランド表記で括弧が必要ない
のに、それ以外の部分で括弧だらけだよね。どういうポリシーだ?
0146145NGNG
○ Lips
× Lisp
0147デフォルトの名無しさんNGNG
>>145
?言いたいことがよくわからない。
LispもSchemeも1+2や10-5は
(+ 1 2)
(- 10 5)
こう書くよ。
0148146NGNG
逆だ…鬱。
0149145NGNG
>>147
加減乗除の演算子優先順位と括弧のハ・ナ・シ。
中置法だと括弧を使うでしょ。
0150デフォルトの名無しさんNGNG
>>145=149
それ以外ってどこよ?
元々括弧だらけですが、何か?
0151デフォルトの名無しさんNGNG
>>149
lispの括弧は優先順位と何の関係もないからなあ。
言ってることがわからない。
なぜ同列の問題として扱ってるのか。
0152デフォルトの名無しさんNGNG
Lisp/Schemeの構文の
(+ 1 (- 2 1) 3 4 5)
こういうのを中置記法で書くと、
1 + (2 - 1) + 3 + 4 + 5
になるけど、これとごっちゃにしてるんだろうね145は。
0153コンパイラ厨房NGNG
皆さんがちょこっと使ってみるかと思うようなスクリプト言語って、どんな
のでしょうか?

Perlみたいに色んなところで使い回せる汎用言語じゃなく、秀丸マクロ
みたいにソフト依存のad-hocな組み込み言語で、あまり覚えるのに労力
払いたくねぇ!って場合、

CやPascalっぽい言語(Algol系)
Lisp/Schemeっぽい言語
BASICっぽい言語
上記が適当に混ざった言語(構文に一貫性なし)

の中だと、個人的な好みではAlgol系なんですが…
ちなみに構文の話です。
0154デフォルトの名無しさんNGNG
使ってるうちに覚えるとか
使ってるうちに慣れるとかってのはヤダな…
スクリプトって手軽なのが瓜なわけだから
使いたいって時にパッとはじめられる感じのがいい。
個人的にはPascalが好きだけど。
0155デフォルトの名無しさんNGNG
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)を送金する。

ただ利用条件ちょっと厳しいんで、私のような低級プログラマでは
使いたくても使えませんけど(泣
0156デフォルトの名無しさんNGNG
PPAかー。俺も見つけて、利用条件で引いたよ。
0157デフォルトの名無しさんNGNG
初歩的な話ですみません。
flex bison 使い始めたばかりなのですが、
正規表現考えるのめんどくさぁ、
浮動小数点の表現みたいな、複雑怪奇なのとか
文字列みたいに複数行にまたがるとかそういったパターンは
いやになりそう。

どこか正規表現集ってないかなぁ?
0158デフォルトの名無しさんNGNG
http://cmaga.zdnet.co.jp/bookreview/19990701.html
0159デフォルトの名無しさんNGNG
abcdefg.y contains 1 shift/reduce conflict
うう
0160デフォルトの名無しさんNGNG
作(使)ってるうちに嫌でも慣れるぞ>155
その中だとLISP/Schemeはちょこっとしたプログラムなら完成するのが比較的早いと思う。
0161デフォルトの名無しさんNGNG
私も、アプリケーションのカスタマイズ用の言語が欲しくて
探したりしたりしてるのですが
PPAに毛が生えかけたぐらいのが言語仕様的にも
手のひらにすっぽり収まる感じでちょうどいいと思うんですよ
それか、UWSCのスクリプトかなぁ
www07.u-page.so-net.ne.jp/ca2/umiumi
0162デフォルトの名無しさんNGNG
私は配布条件がゆるいので Python を使ってますけど、
付属スクリプトを梱包する必要があるのと、
実行速度が遅めなのがちょっと。
0163デフォルトの名無しさんNGNG
>>162
附属スクリプト?
なんで?そんなことライセンスに一言も書いてないよ。
0164age!NGNG
>>155
なんだか凄い利用条件だ。
いろんな世界があるもんですね。
0165デフォルトの名無しさんNGNG
>>163

付属スクリプトで実装されている機能を使っているんだろう。
0166デフォルトの名無しさんNGNG
>163 165
C で言うところの標準ライブラリ的な機能が
付属のスクリプトで実装されているんで。
0167デフォルトの名無しさんNGNG
メモリー管理で、もっと賢い方法あったら教えてください。
文字列演算なんかで、たとえば
%union {
  char * str ;
}
%token STRING  <- flex の方は \"[^\"]*\" とかといった感じ
%type <s>  str
exp:
   str ';'
  |
  ;

str:
   STRING '+' STRING  { $$ = str2( $1 , $2 ) ; }
  | STRING        { $$ = str1() ; }
  ;

%%

0168デフォルトの名無しさんNGNG
続き
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 ;
}

0169デフォルトの名無しさんNGNG
続き
とまあ、現在このようにしているわけですが、
見るからに、見てのとおりで、
メモリーの解放忘れの嵐を食らうはめになります。
皆さんはどのようにされてますか?

0170デフォルトの名無しさんNGNG
>>169
http://www.hpl.hp.com/personal/Hans_Boehm/gc/
これ使うとか。
0171デフォルトの名無しさんNGNG
169 です。
>>170
すばやいレスどうもありがとう誤差います。
実は英語があんまり得意ではないのですが、内容はガベージコレクション
関連の内容なのでしょうか。
僕の例の場合、メモリを開放する必要のある瞬間は、より上位の文法の
ツリーが解決した瞬間なんですね、ですから何とかガベージコレクション
のような大規模なものを用いなくてもなんとか、いい方法が存在しそうな
気がします。

という訳で・・・
だれかそういった場合の良い方法、こんなのあるよとかないでしょうか?
0172デフォルトの名無しさんNGNG
std::stringつかえよ。
0173デフォルトの名無しさんNGNG
>>172
いきなりトンチンカンな事書くな、解決ぜんぜんせんやんけボケ
0174デフォルトの名無しさんNGNG
C++おぼえたてを自慢したい年頃なんでしょ(^^;
ちなみに私はコンテナに登録する方式ですが、美しくない・・・ぅぅ
0175デフォルトの名無しさんNGNG
union にデストラクタと代入演算子がつけられたらと思う今日この頃。
0176170NGNG
>>171
じゃこういうのはどう?
http://www.fsinet.or.jp/~nito/CocoaClub/article03.html
0177デフォルトの名無しさんNGNG
おぶじぇくてぃぶぅシーだああぁぁああ。たすけてー。
0178174NGNG
>>171
おれと同じじゃん。
しかし、なぜに Objective C な訳?
0179174NGNG
間違えた
>>171 は >>176 ね
0180170NGNG
>>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
が個人的には好き。
0181かいNGNG
アプリのマクロ言語としてRubyを使うって手はないの?
実装が大変?
0182デフォルトの名無しさんNGNG
つーか、でかすぎ>181
0183デフォルトの名無しさんNGNG
>175
Unionのメンバを含むクラスじゃダメなの?
0184デフォルトの名無しさんNGNG
169 です。

>>174
コンテナクラス作って全部ほうりこむという方法ですか、
確かに手間は少しは省けそうですが、決定的な解決策には
なりにくそうですね。
昨日スタックのクラスを作って中身の取り出し用メンバ
を工夫してやってみました、これでかなりいけるような感じ
ですが、やっぱり決定打にはなってないです。

プロのコンパイラ屋さんのコード見てみたい今日この頃。

>>176 181
見てるこちらは、ちょっと困ったかも(笑)

0185169NGNG
>>175
コントラクタとデストラクタがあればフック関数つくれるということでしょうか。
たしかにあったら使えるかも知れませんね。

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

uecの学生より
0189デフォルトの名無しさんNGNG
>>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

0190デフォルトの名無しさんNGNG
>>187

こんなのもあるよ。

Micro-C
http://rananim.ie.u-ryukyu.ac.jp/~kono/lecture/2000/compiler/index.html
0191デフォルトの名無しさんNGNG
Cマガの99/10に昔のコンパイラに関する記事がCDに収録されています。
印刷しても字が読み取りにくかったから、
ディスプレイで読んでるけど、つかれるなぁ。
まだ読み始めですが、既に読み終えた方、どうでしたか?
0192名無しさん@こんせぷつNGNG
>>188
この書籍のサンプルコードですね。

情報科学こんせぷつ8
コンパイラの仕組み
電通大 渡邊 坦著
SBN4-254-12708-1
A5判 196頁 定価(3,500円+税)

「問題解決に必要な技術を具体的に解説した実践書。(朝倉書店のページより)」
〔内容〕概要/字句解析/演算子順位/再帰的下向き構文解析/
記号表と中間語/誤り処理/実行環境とレジスタ割付/コード生成
/Tiny C/他

UNIXUSERの書評見て買ったら、いい本だった。巻末のコードは読みにくい
ので、>>188のサイトからゲットすべし。
0193デフォルトの名無しさんNGNG
>>192
初耳なんだけど、どこの出版社から何時出た本なの?
0194デフォルトの名無しさんNGNG
情報科学こんせぷつ〈8〉
コンパイラの仕組み
ISBN:4254127081
185p 21cm(A5)
朝倉書店 (1998-04-01出版)
・野崎 昭弘・黒川 利明・疋田 輝雄・竹内 郁雄・岩野 和生【編】・渡辺 坦【著】
NDC分類:007.64 販売価:\3,500(税別)
0195デフォルトの名無しさんNGNG
tinyCはmips用のコードを吐き出すようですが、
これをpentium用に変えるにはどうしたらいいのでしょう?
だれか講義してみない?
0196デフォルトの名無しさんNGNG
>>192
この本はなかなかわかりやすかったよ。
コンパイラの本を2冊読んだけど、断然そっちがわかりやすかった。
でも、あんまり深いことは書いてないんだよなぁ。
0197デフォルトの名無しさんNGNG
>>195
i386用のならあるっぽい
http://rananim.ie.u-ryukyu.ac.jp/~kono/lecture/2000/compiler/index.html
0198デフォルトの名無しさんNGNG
>>197
TinyCとMicroCって全然別物なんじゃ…
0199デフォルトの名無しさんNGNG
>>191
スキャン画像を無理やりpdfにしてるから
スクロールが重くてしかたない
なめてんのか、と思った
内容も浅いんで専門書読んだほうがいいでしょう
0200デフォルトの名無しさんNGNG
Zendはどう?

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

だれか、FirstとFollowの説明だれかお願いします。
金がないので買えませんでした。
0203デフォルトの名無しさんNGNG
>>202
YaccとLex使ってください。
0204デフォルトの名無しさんNGNG
Firstが、その非終端記号の一番初めに来る可能性のある終端記号の一覧。
Followが、その非終端記号の直後に来る可能性のある終端記号の一覧。
0205デフォルトの名無しさんNGNG
yaccの解説本だと、電卓とかCライクな言語が解説されている本が多いけど、
N88-BASICみたいな昔ながらのステートメントを並べるタイプの言語を
yaccで解説している書籍orURLご存知ありませんか?
0206デフォルトの名無しさんNGNG
>>205
Cライクな言語でも、N88-BASICでも、必要な考え方は
同じだと思うけど。
0207デフォルトの名無しさんNGNG
>>206
Cライクだと、関数の引数とか省略できないのですが、N88-BASICだと途中の引数を
省略できたりします。その辺が一番の悩みどころなんです…。頭悪くてすみません。
0208デフォルトの名無しさんNGNG
>>207
そうですねぇ、こんな感じでどうでしょ。
Statement:
Statement arg_list {}
;

arg_list:
arg_list arg
;
arg:
ほげほげ {}
| {}
;

うまくでるかな、ちなみに私の黄金パターンです。
ちなみに書籍は見たこと無い(^^;

0209デフォルトの名無しさんNGNG
ぎゃぁ!!やっぱりつぶれた!
適当にスペースあると思ってみてね。
0210デフォルトの名無しさんNGNG
yacc&lexで
FORI=0TO10STEP100のFORI=0をFOR I = 0と解釈して
FORI=0をFORI = 0と解釈できるの?
0211デフォルトの名無しさんNGNG
もういっぺん、なんか間違ってるし・・・
Stat:
  Stat arg_list {}
  ;

arg_list:
  arg_list ',' arg { 引数取り込み処理}
  | arg_list ',' ',' { 引数スキップ処理 }
  | arg_list
  ;

さっきのより、こっちの方が簡単?
0212デフォルトの名無しさんNGNG
>>210
すみません、意味良くわかんないです。
詳しく説明してもらえれば答えられるかも?
0213デフォルトの名無しさんNGNG
>>210
なんとな〜く意味判ってきた、
要するに、先に FOR がくっつくのかという問題ですね。
それは lex に仕事させればいいです。
正規表現に後ろが hoge の時マッチするというやつあります(たしかあんまり使わないから忘れた)
それで {変数}={式}TOが登場するときに決定すればいいです。

0214デフォルトの名無しさんNGNG
まだ間違ってる(^^;
arg_list:
  arg_list ',' arg { 引数取り込み処理}
  | arg_list ',' ',' { 引数スキップ処理 }
  | arg <- ここね
  ;

0215デフォルトの名無しさんNGNG
>>214
何度もありがとうです。アホなんで直ぐには理解できませんが、
レスを参考にして頑張ってみます!
0216デフォルトの名無しさんNGNG
yacc lex は、頭つかうより体つかってやってみてね。
どっかのクソ教授の書いた本なんか使えるようになってからでなきゃ理解できんものばっかりです。
まあ、コンピュータ関連のツールは総じて頭より体なんですが・・・
0217いつでもどこでも名無しさんNGNG
体育会系アホプログラマ発見
0218216NGNG
すまんねぇアホで。
でも実際頭で憶えられんもんって一体いくつあるんでしょ。
頭使えると云うのでしたら理屈書いてみたら?
論破してやろうか?
0219デフォルトの名無しさんNGNG
yaccあげ
ついでに >>216 激しく同意
0220デフォルトの名無しさんNGNG
つーか、むしろ理屈わかっても使えなかったりするからな。
0221デフォルトの名無しさんNGNG
lexでレキシカルアナライザ生成すると遅いという話を聞きますが、
パーサはyaccで作るのと、LRとかで手書きするのとで速度にそれほど差が出る
ものなのでしょうか。
手書きコードは極端に酷くなく、作るのはコンパイラでなくインタプリタを想定。
保守性は無視で…。
0222デフォルトの名無しさんNGNG
LRって手書きするものなの?
LLとかならわかるけれど。
0223>221NGNG
lexと手書きでは確かに速度に差がでまくるね。
まあトークン切り出しは比較的簡単だから手作業でも良い。メンテも可能。
yaccと手書きについては、複雑な文法をメンテする手間を考えたら
yaccの方がよい。
再帰下降とかLL(1)のみで完結する文法なら手作業でもいいけど。
速度は手作業が有利なのには変わりなし。
0224デフォルトの名無しさんNGNG
Cライクなスクリプトエンジン考えてたんだけど、はたと気がつけば普通のC言語のプログラムと何ら代わらないと言うことに気がついた(鬱だ‥‥‥

ということで、スクリプトエンジンの利点って?
0225デフォルトの名無しさんNGNG
>>224
コンパイルしなくて済む。
0226>224NGNG
自分のソフトに組み込める
0227>224NGNG
他人に技術力を誇示できる
0228デフォルトの名無しさんNGNG
ソフトを拡張してくれる人が出てくる
0229デフォルトの名無しさんNGNG
>>224
WZ editorのマクロがCライクだったような気が。
0230デフォルトの名無しさんNGNG
>>224
実行速度が遅い言い訳になる。
「いや、何せスクリプトで動作しているものですので・・・」
0231デフォルトの名無しさんNGNG
>>224
多くても安心。
0232デフォルトの名無しさんNGNG
>>224
パクりパクられの関係なのに平和
0233デフォルトの名無しさんNGNG
>>224
突然のお客様にも安心
0234デフォルトの名無しさんNGNG
>>223
よほど特異でなければ、flex 程度でいいと思うよ。
文脈依存型の文法で語彙の意味がコロコロ変わるのは手書きにすると
てき面に効くような気がする。
あと、流し込み型ではなくて、う〜ん例えばタブの位置で文法が
決まるようなミョウチクリンな言語を作る場合とか、
例の上の方で発言されていた fori=0to の問題見たいなのとかは、変わると思うよ。
ちなみにタコが strcmp とか使って作った奴使うくらいなら間違いなく flex の方が
いや・・・lex でもその方が速い。
はっきりいって素人じゃ flex には勝てんです。
素直に flex で書いて、チューニングした方がいい。

0235デフォルトの名無しさんNGNG
レス先間違い >>223 -> >>221
0236デフォルトの名無しさんNGNG
>>224
萌えられる。
0237デフォルトの名無しさんNGNG
bison/flexが出力するソースはなんであんなに汚いんだ。
C++/Java用のパーサクラスを出力するようなツールってないんかな。
0238デフォルトの名無しさんNGNG
>237
検索せよ。
JavaCC
http://www.metameta.com/
とか。
0239名無しさんNGNG
逆にどうすれば美しいスケルトンになると思う?
漏れもジェネレーターやるから意見聞きたい。
lexでC++をサポートするのは文字コードの実装の
抽象化って意味で効果的だけど。
0240厨房NGNG
その前に、きれい、汚いってどういうこと?
0241>240NGNG
んこまみれかどうか
0242>240NGNG
例:C++はんこまみれ
0243デフォルトの名無しさんNGNG
C++は んこ まみれ ?
C++ はんこ まみれ ?
0244名無しさんNGNG
「んこ」って何よ。
うんこ?まんこ?ちんこ?どれ?
0245USO800委員会NGNG
そんなの「げんご」に決まってるだろ。
嘘です。今日は4月1日です。
0246>244NGNG
んこ:うんこまんこちんこの抽象クラス
0247デフォルトの名無しさんNGNG
んこあげ
0248デフォルトの名無しさんNGNG
他の派生クラス例
あんこ、インコ、援交〜、温厚〜、金庫〜、健康〜、参考〜、センコ〜
炭坑〜、天候〜、敦煌〜、軟膏〜、判子、メンコ、四個、ワンコ
0249デフォルトの名無しさんNGNG
んこ
{
public:
&nbsp;&nbsp;static におい
}

んこ::におい = くさい;
0250デフォルトの名無しさんNGNG
んこ &大便(食い物) {
 if(食い物.量 > 腹八分) {
  if (rand()&1)
   throw 便秘;
  return げり;
 }
 return うんこ;
}
0251デフォルトの名無しさんNGNG
>>234
だいぶ前の話なんですが…どうしても気になったもので
strcmpよりも高速な文字列比較の方法ってどのような物なのでしょうか?
自前でstrcmp相当の関数をinlineするとか、その程度しか思いつかないのですが
0252デフォルトの名無しさんNGNG
>>251
strcmpが遅いんじゃなくて、strcmpを正面から使うような
単純なアルゴリズムが遅いってことじゃない?
0253デフォルトの名無しさんNGNG
>>251
strcmpでバカ正直に比較していたら、
最悪用意されているシンボルの回数だけ比較することになるだろ?
だったら素直に決定性有限オートマン使っとけって事
0254>251NGNG
hashがお手軽。
最適なのはトライ木かな。(文字単位で区切られた木を作る)
0255254>251NGNG
あとスライド辞書圧縮(LZ系)とかのソース見るのもいいかと。
0256デフォルトの名無しさんNGNG
>>253
オートマトンの間違いだろ。
しかも251は構文解析ではなく字句解析の話をしているのでないのか?
0257>256NGNG
lex を使えば字句解析もオートマトンになるにょ
0258251NGNG
なるほど
そういう意味の文章だったんですね
文意を誤解していました
さすがに厨房な私でもstrcmpで逐次比較するような事はしないでハッシュ使ってます
0259デフォルトの名無しさんNGNG
>>256
http://hp.vector.co.jp/authors/VA007799/viviProg/doc_regexp.htm
0260デフォルトの名無しさんNGNG
ハッシュはお手軽だけど、すべての数値文字列とかといった
抽象的な対象に使えないので、字句解析にはちょいと向かないと思う。
やっぱオートマトンじゃないかな。
0261252NGNG
ずっとオートマンだと思ってたよ、、、
人前で発言しなくてよかったぞ。
アリガト>256
0262256NGNG
正規表現で字句解析か。
正規表現で字句解析するよりstrcmp使ったほうが速くないかな?
正規表現ってコンパイルしてバックトラックしながら文字列のマッチングしてたら結構遅くなるように思う。
NFAからDFA作って最短一致のみの正規表現にすれば高速になるのかな。

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

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

0265デフォルトの名無しさんNGNG
>>264
厨房ですみません。「2チャンオリジナル正規表現ライブラリ」ってなんでしょう?
0266名無しさんNGNG
http://www.fuel.co.jp/~bull/monner/doc/
0267>>264NGNG
http://piza.2ch.net/test/read.cgi?bbs=tech&key=978997438&ls=50
叩かれまくってるじゃん
0268デフォルトの名無しさんNGNG
最近Cの標準ライブラリに正規表現使えるようにするライブラリが
追加されたと聞いたんですけど、本当ですか?
本当なら、どういう使い方をするんですか?
0269名無しさんNGNG
regcmpとかはかなり前からPOSIXの標準だろ。
man -k regcmp
ただ、漢字対応しっかりやってるシステムは
意外と少ない。
0270デフォルトの名無しさんNGNG
>264
超高速字句解析の話

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

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

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

ソースが付属しているので、参考までに。
0272デフォルトの名無しさんNGNG
へ...へぼすぎる >>271
だれか構文解析という言葉を教えてやれ
0273デフォルトの名無しさんNGNG
>>271
落せない。なんでtext/htmlなんだ。
つーか、なんだPLATHOMEって。
0274デフォルトの名無しさんNGNG
>>271,272
人が一生懸命つくってるのをそういうふうにするのは嫌いだな。
0275デフォルトの名無しさんNGNG
>>274

作者か?(藁
0276271NGNG
>>274
私は紹介しただけなんですけど・・・
Webで公開されているものを紹介しちゃダメなの???
0277デフォルトの名無しさんNGNG
>>276
そうだ
0278デフォルトの名無しさんNGNG
ていうか、2chで紹介するってのは、ある意味そのサイトに対する
攻撃だよな?
0279271NGNG
そーですか・・・じゃあ削除願を出してきますよ。
すいませんでした。
0280デフォルトの名無しさんNGNG
>>278
それはそうだが、
>>279
何も削除依頼せんでも。
0281デフォルトの名無しさんNGNG
攻撃になるかどうかはサイトの内容と、紹介された時の
2ch側の状況によるけどな。
0282デフォルトの名無しさんNGNG
>>271
なるほど、こういう計算をやっているから皆が口をそろえて
「Lispは遅い、メモリを食う」って言うのか!(w

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

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

>>275 ハズレ〜

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

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

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

このスクリプト言語はどうですか?
ウィンドウが扱える簡単なプログラムが作れそう
でも説明書がわけわからなくて作れない....
0295デフォルトの名無しさんNGNG
>294
じゃ、やめとけよ
0296294NGNG
言語的にイケてますか?
もし学ぶ価値のあるものなら頑張ろうと思うのですが....
0297>296NGNG
知るか
0298デフォルトの名無しさんNGNG
>>295, >>297

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

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

大きな本屋さんなら置いてあるとおもいます。
0305300NGNG
切り番get!
0306>304NGNG
アレ内容に割に高い。1500円だけど
あれの元文書オンラインでどっかにあった様な・・
0307306NGNG
内容の
0308デフォルトの名無しさんNGNG
http://math.cs.kitami-it.ac.jp/~fuchino/proin/experimentIII-2000/jikken.html
ここ、
>アレ内容に割に高い。1500円だけど
しょうがないよ、だって読む人限られてるもん。
0309304=308NGNG
おお、bison は日本語化されてない(笑)
0310デフォルトの名無しさんNGNG
>>308
GNUへの寄付金も入ってるしね。
0311301NGNG
失礼しました。

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

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

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

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

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

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

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

JavaScriptのサブセットだそうです。ソース付き。
0324デフォルトの名無しさんNGNG
墜落ピンチ!!サルベージあげ
0325デフォルトの名無しさんNGNG
>>314
構文解析器は兎も角、字句解析器は自力で作っても大して
時間変わらないんじゃない?極端に複雑なのは別にして。
C言語くらいのなら数時間あれば一通り作れるでしょ?
0326デフォルトの名無しさんNGNG
少なくとも325には無理だ。(藁
0327デフォルトの名無しさんNGNG
>数時間
すごい、私もできないことないと思うけど、数時間で作れとか言われたら
血尿でるかも。
0328デフォルトの名無しさんNGNG
>>327
字句解析器ならすぐ作れないか?
仕様はK&Rでも見ればいいし、lexerは決まりきった書き方があるし。
とはいえ、設計から完成までで数時間で作れといわれたら丁重にお断りするけど(笑
実コーディング時間が数時間なら同意。
0329デフォルトの名無しさんNGNG
>>327
lexがやってるのと同じように1文字読むごとに状態遷移して、ってのは無理だけどね。
一度数字がきたら、A〜F以外の非数字が来るまで数字として読む、シンボルの先頭に
許される文字がきたら空白や記号を読むまで、シンボルとして読む、って感じで。
漏れも字句解析は手書きだよ。日本語を扱えるようにするにはこれが一番。
0330デフォルトの名無しさんNGNG
K&RのBNFみたって数時間で作れるのかねぇ。甘いよ。
全然C言語がわかってない。
0331デフォルトの名無しさんNGNG
数時間で作れない330はタコプログラマー
0332デフォルトの名無しさんNGNG
今から作って明日までにアプせよ>>331
0333デフォルトの名無しさんNGNG
>>330
字句解析器と構文解析器の違い知ってる?
0334デフォルトの名無しさんNGNG
自分は優良プログラマだと言いたいなら、数時間で作れる
などと言わない方が賢明です。(藁
0335デフォルトの名無しさんNGNG
>>334
同意。
0336デフォルトの名無しさんNGNG
<数> ::= <数字>*
<数字> ::= 0|1|2|3|4|5|6|7|8|9
0337デフォルトの名無しさんNGNG
+
鬱駄根用
0338デフォルトの名無しさんNGNG
僕もコンパイラに興味があるんですけど、本などを読むと

<数> ::= <数字>*

336さんが書かれたような表記をよくみます。これって
どのように読むのでしょうか?
0339デフォルトの名無しさんNGNG
BNF 表記
EBNF 表記
結合規則
優先順位
lex yacc bison
などで検索>>338
現行の言語の仕様書や本とかには必ず付いてると思いますが。
0340デフォルトの名無しさんNGNG
<数> ::= <数字>*
<数>は<数字>の後に*がついたもの????
頭痛い
0341デフォルトの名無しさんNGNG
>>340
繰り返しだよバカ
0342デフォルトの名無しさんNGNG
「どのように読むのか」って、どのように発音するのか?って意味かと
おもたよ。
「山カッコ 数字 山カッコ閉じ スター」ってかんじでしょうか
0343デフォルトの名無しさんNGNG
<数> ::= <数字>*
<数> ::= <数字>{<数字>}
<数> ::= <数字>|<数> <数字>
どれがいいのですか
0344デフォルトの名無しさんNGNG
>340
*は0回以上、+は1回以上の繰り返しじゃなかった?
0345デフォルトの名無しさんNGNG
>343
3つ目はそのままでは実装しにくい。
0346345NGNG
間違えた、スマソ
0347デフォルトの名無しさんNGNG
あげておく
0348デフォルトの名無しさんNGNG
じゃあ俺も
0349困憊羅NGNG
Cでpascalコンパイラをつくったソースがのってる本とかないですかねー
0350デフォルトの名無しさんNGNG
>>349
あるよ。
このスレの過去ログ参照
0351困憊羅 NGNG
>>350
29 desuka?
0352デフォルトの名無しさんNGNG
コンパイラを作る方法 生越
って本がまさにそれ>351
0353ageNGNG
ねぇ、話題つきた?
0354デフォルトの名無しさんNGNG
今ないだけ、そのうちでてくる。
0355おしらせNGNG
http://www.fuel.co.jp/~bull/monner/doc/
このサーバーから降ろしてくれと言われたので近々公開停止になります。
利用禁止ではありません。
ミラーしてくれる人がいたら[email protected]まで。
0356デフォルトの名無しさんNGNG
もっとマシなものなら考えるけどなー
こんな誰でも作れる程度のものを公開するなよ
0357デフォルトの名無しさんNGNG
構文解析ってあるじゃないですか?
具体的にどんなコードをはけばいいんですか?
0358名無しさんNGNG
基本は構造をトレースすること。
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という結果になる.
続きがいるならまた後で。
0359デフォルトの名無しさんNGNG
つまり、仮想機械の設計次第でコードが変わるということですか?
0360デフォルトの名無しさんNGNG
構文解析は関係ないんじゃない?
構文解析は構文木作って終わりだよね?
0361デフォルトの名無しさんNGNG
蛇足だが、
構文解析の結果が木になるとは限らないぞ。
たまたま木になる文法の言語かどうか?ということだ。

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

木になる文法のほうが人間様にとってはふつー快適だとは思われるが。
0362デフォルトの名無しさんNGNG
アセンブラもフラットだ。
木になる文法、言い換えれば構造化された文法かね。
0363デフォルトの名無しさんNGNG
アセンブラはフラットじゃないだろ。
ニモニックとオペランドという構造もってるから。
0364デフォルトの名無しさんNGNG
確かにそういわれればFORTHの方が単純だな、、
0365デフォルトの名無しさんNGNG
>>363
汗は、1行の範囲内では構造を持った文法だ、とでも
呼ぶべきなのかも。

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

>>364
言語処理系作るの、マヂ、楽よ。
厨房の夏休みの自由研究の題材でもいいくらいに、楽。
他にも楽な言語は多いだろうけど、
構文というものを"いっさい"処理しなくていい言語なんてのは
Forth系くらいしかないんじゃないかな。
0366デフォルトの名無しさんNGNG
>>365
Forthってどういうコードになるんですか?
後置記法って事しか知らないから、簡単に解析きぼん
0367デフォルトの名無しさんNGNG
解析じゃなくて解説
0368デフォルトの名無しさんNGNG
>>365は一度も作った事の無いドキュン
0369デフォルトの名無しさんNGNG
>>368
実用レベルの汎用言語を作るのは難しいが、
機能を絞った処理系なら本当に楽だぞ。
lex+yacc使ってインタプリタで最適化なしとか。
0370デフォルトの名無しさんNGNG
>>365
Forthってどういうシンタックスになるんですか?
後置記法って事しか知らないから、簡単に解説きぼん
0371デフォルトの名無しさんNGNG
ForthとFortranを読み間違えたよ・・・。鬱だ。
0372デフォルトの名無しさんNGNG
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もあるが本質じゃないんで割愛。
0373デフォルトの名無しさんNGNG
>つまりプログラムも所詮はOperatorの配列に過ぎぬ。

結局、コンパイル(?)されると、
プログラム全体がソース見たマンマの順序の
巨大な実行可能配列になる、と考えるとすっきるする。
バイトコードならぬオペレーターコードとでも言うのかな。
ん?おぺこーど?

まぁただ、{}ぐらいは実行時じゃなくコンパイル時に解釈する
ようにしたほうが、実装は楽かな。
そうすると結局コンパイル結果は、ひたすらまっすぐなコード配列、
ではなくて、時折サブルーチン呼び出しの枝が伸びた
木のような形のコードツリーが、内部的に出来あがる。

木といっても構文木の木とは全然違う形&意味だ。
構文木は実行順序に対して垂直に刺さった木(の根?)みたいな感じ
だが、上記コードツリーは実行順序に沿わせる向きに寝かせた木
という感じだ。

それと今更だが、というか見れば判るが、
実行可能配列つまりルーチンもまた
FirstClassObjectになっているわけだ。
実行の区切りが見えない(あくまでOPの処理内容に依存)ので
やりたくはないが、死ぬ気でやろうと思えば恐らく
Lispと同じ位(ってLispは知らぬのだが)の
記述能力はあると思われ。
0374デフォルトの名無しさんNGNG
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に次いで簡単に書ける。
0375デフォルトの名無しさんNGNG
>lispぐらい知っっててほしいけど

まぁそう言うな。PSだって知らぬ人多いだろう。
Lispほど知る必要無いというのもある意味真実だが(藁

前置か後置かの違い、
前置を実現するためのカッコが有るかないかの違い、
その2つ程度なんだろうな、LispとPSの差は。

両者の中間みたいな感じの言語を
作ることは{できる,試みる意味(藁)は有る}か?ってのが
今ちょっと感じている疑問というか興味。
どうなんだろう?ていうかナニをもって中間なのかも
よく判らないのだが…

>無名関数

{add print} 1 2
1 1 rot ####Stack上の積み順を「回転」させるOP。これで無名手続きがTOPになるよね?
execute ####StackTopのポインタ(?)を「実行」するOP。

こんな感じか。Stack処理手順を手作業しないとならんのは
ちとダサイところ。
0376デフォルトの名無しさんNGNG
>>374
lispは他にリスト操作もあるからね。quoteの概念を理解できるか
どうかってのがある。(使い続けていれば自然に身につくけど)

>>375
繰返しは
{test-expr} {body-expr} while
ですか?
「{test-expr} が真の間 {body-expr} を繰り返す」
と書けますね。(これがMIND?)

>両者の中間みたいな感じの言語を
間をとると中置記法?
lispは式をリストと見なす事ができるので、中置記法は後づけで作れます。
forth系でのやり方は知りませんが、多分同様な事が可能でしょう。
所でforth系はスタックを直接操作するからgcみたいな機構は必要無い?
作りたくなってきた。
0377デフォルトの名無しさんNGNG
もうあんまり覚えてないんだが…。

たしかforthだとimmediate wordってのがあって、
これはcompilation mode(だと思った)でも動作する。
それ以外のwordは、compilation modeだとそのword自体が走るんじゃなくて
そいつへの呼出にcompileされる。
: func (: はcompilation modeに入るword)
1 2 +
; (; でcompilation modeを抜ける)
0378デフォルトの名無しさんNGNG
Forthはなかなか日本語の資料(文法とか)が検索でみつからない。
見つかった処理系は
Portable Forth
GNU ANSI Forth
SCMForth (Schemeで書かれたサブセットらしい)
あとはPostScriptで検索した方が早いかな?
0379デフォルトの名無しさんNGNG
ANSI FORTH 規格書 (英語)
http://www.taygeta.com/forth/
0380デフォルトの名無しさんNGNG
電通大のForthの解説 (日本語)
http://www-lab.ee.uec.ac.jp/text/forth/
0381デフォルトの名無しさんNGNG
>>376
PSでリストの代用になりそうなものを探すとすると
配列と辞書くらいかな。サイズ2の配列か辞書を作ればいい。
まぁ言語が直接支援してくれないんで辛いけど。

同様に、Objectの代用になりそうなものも
配列か辞書だな。勿論これも直接は使い勝手悪いが。

>{test-expr} {body-expr} while

んな感じ。whileそのものは無いけど
似たようなのは有るし当然自作も可能。

>間をとると中置記法?
なんか違うような気がする(^^;

>所でforth系はスタックを直接操作するからgcみたいな機構は必要無い?

Stackゆーても(PSは)Stackに記録される値はあくまでPointerなので
あるObject(文字列にせよ辞書にせよ配列にせよ)が
複数箇所(StackやArrayやDict)から同時に参照されることは有るし、
そういう意味ではリファレンスカウントだけじゃ循環参照が云々…
とかいうアッチ方面の問題は、同じように全部抱えてると言えます。

面倒ならboehmGCだな(藁
0382デフォルトの名無しさんNGNG
>>377
それって、インタラクティブに(BASICみたいに)ソースを
1行づつ入力&実行するモードと、そうでないモードとを
うまく使い分けるための機能、でもあるわけですよね?きっと。

直接関係ないがPSにはbindというOPが有るらし。

/aaa { 1 2 add foo } bind def

と書くと、1つ前の実行可能配列の中の
アドビ(藁)定義済みOPを、その名前への参照じゃなくて
実行実体(?)への参照に置換してくれるそうだ。
ここではaddがソレだな。
これで実行が少し速く効率的になる、らし。

定義済みOPをどっか別のReadOnly辞書で一元管理してる模様。
まぁ類似実装系を自作するときには、面倒なら省ける機能の
筆頭でもあろうけど(藁
0383デフォルトの名無しさんNGNG
急にアツイ議論がage
0384デフォルトの名無しさんNGNG
トランスレータも面白いよ
0385377NGNG
>>382
> それって、インタラクティブに(BASICみたいに)ソースを
> 1行づつ入力&実行するモードと、そうでないモードとを
> うまく使い分けるための機能、でもあるわけですよね?きっと。

いや、Forthにはインタラクティブかどうかって区別はほとんどなかっ
たような。
immediate wordっていうのは何をするためのものかというと、例えば
ifならまず条件ブランチ命令をおいて、そのアドレスを記憶しておく。
そのあとthenで条件ブロックが終ったところでブランチ命令のところ
に終端までのオフセットを書き込む。
つまりほんとにコンパイラのコードジェネレータと同じようなことを
したりするためのもの。

> アドビ(藁)定義済みOPを、その名前への参照じゃなくて
> 実行実体(?)への参照に置換してくれるそうだ。

つまりデフォルトでlate bindingなのをその時点でbindしちゃうわけ
ね。Forthはlate bindingじゃないし、前方参照も許してないからそう
いうのはないけど。

Forthの実装もいろいろで、小さいwordはその場にインライン展開して
しまうのとかもあったはず。
おもしろいのは、m68000用でipにA7レジスタを使うやつ。各wordの終
りにはrts命令がおかれてる。
0386デフォルトの名無しさんNGNG
forthの条件式if then else
これの文法がよくわかりませんでした。

そこで、問題

(a) if (b) else (c) then (d)

(a)〜(d)は式とします。
例えば、(a)〜(d)にそれぞれ何が入るんでしょう?
また、条件式と関係の無い式を(a)〜(d)の中から選びなさい。(15点)
0387デフォルトの名無しさんNGNG
(a) 条件式
(b) (a)が真のときに実行される式
(c) (a)が偽のときに実行される式
(d) 条件式と関係の無い式
0388デフォルトの名無しさんNGNG
ありがとうございました。>>387
やっぱり条件式はifの前に書くんですね。
thenの位置が謎ですが。
0389デフォルトの名無しさんNGNG
あげ
0390デフォルトの名無しさんNGNG
Forthって、データもアドレスも16bitだったときはエレガントな設計だと思ったけど
やれ倍精度整数だ実数だとかいいだしてから、ちょっとうざくなってきた
インタプリタもワードを並べて置いただけの頃は数バイトで済んでたのにね
何やかんや言っていても、私は今でもあこがれてるな
http://www.forth.org/
FIGなんてまだあったんだなぁ
0391デフォルトの名無しさんNGNG
lispはC言語の関数呼出しだけで構成されてると思えば、
ほぼ同じ見方ができるけど、
C言語 a(b(c())); lisp (a(b(c)))
forthはスタックが丸見えだからc b aという感じに記述するから違和感あり?
0392デフォルトの名無しさんNGNG
>>391
forthは境目がないのが痛い。
どっからどこまでをどう括って解釈すべきか?は、
あくまでコンテクストと意味に依存するから、
コードを理解できるかどうかは
ほぼ語彙の知識の有無に依存しちまう。
人間様には痛い。
0393デフォルトの名無しさんNGNG
age
0394デフォルトの名無しさんNGNG
WindowsのGUIインタフェース持たせてる処理系って、
コールバック関数の辺りとかはどうやってるの?
例えばWNDCLASSに登録するコールバック関数とか。
やっぱり内部で専用に作ったCのコールバック関数を用意してるのかな?
0395デフォルトの名無しさんNGNG
>>394
どの処理系?
まあ、処理系がサポートしてその部分を隠してるなら、何だかの方法で
フックしておく必要はあると思うけど・・・
内容としては若干スレ違い気味?
0396デフォルトの名無しさんNGNG
>>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の決定をどうやって
動的にやるのかがわかれば良いんですが。
0397デフォルトの名無しさんNGNG
>>394 >>396
何をやりたいのかサパーリ分からん
0398デフォルトの名無しさんNGNG
>>394
多分、GUIの作成をサポートした処理系のことを言ってるんだと思うけど、

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

こんな感じでどうでしょうか
0399398NGNG
訂正

スクリプトで動的に生成されるプロシージャーは
↓
スクリプトで動的に生成される"ウインドウの"プロシージャーは
0400デフォルトの名無しさんNGNG
>>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
0401デフォルトの名無しさんNGNG
>>396
混乱してませんか?
とりあえず簡単なインタプリタ(コンソールベースがいいと思う)を作ってみてはどうでしょう。
コンパイラであれば、その部分はテンプレート的に生成しておいて、あとで命令スケジューリングして
依存関係を考慮しつつ並べ替えます。
スクリプトの場合は考える必要はないです、やり方は 398 さんのやり方が妥当だと思います。

>>400
あなたも混乱してません?発言がdel厨房っぽいぞ(藁
0402401NGNG
アゲときます。
0403401NGNG
私も混乱気味、スクリプト−>インタプリタ(自爆
0404代打名無しNGNG
>>400
もしかして、サンク方式なんかやばいですかね。
0405デフォルトの名無しさんNGNG
>>404
ATLで似たようなことやってるよ
0406デフォルトの名無しさんNGNG
>>401
てゆーかまんまdel亡です。
delにおいてくだんの問題はこう解決されてる、っていう頁ね。

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

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

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

>>401
コンソールベースのインタプリタはもう存在します。
DLLを動的にロードしてAPIを直接扱ってGUI対応するのが目標です。
0408398NGNG
>>407
どう汎用性がなくなるのかよくわからんが、コールバックだけを動的に変えたいだけなら
SetWindowLong()でできるぞ。詳しくはMSDNあたりを参照してくれ。
0409デフォルトの名無しさんNGNG
>>408
そんなんじゃ出来ないから質問してるんじゃないの?
0410401NGNG
要するに DLL から関数の型情報が動的に取り出せるか
という事と
型からどのようにスタックフレームが決定されるのか
という問題ですね。
この辺になってくると、Windows の知識がかなりいりそうですね。
自分はこのへんになってくるとゲーム屋のMIPS屋なので
ウインドウズは Windows は GDI かじった程度なので知識量不足です。

このへんはウインドウズの低レベルインターフェイスの
詳しい人が出てくるのを待ちますか・・・(^^;
お役に立てなくてすみません。

>>アセンブラコードを動的に生成
ちなみにコードの自動生成はあんまりお勧めできないです、
近年のCPUの状況を考えると・・・
テーブルジャンプしたほうがいいとかいう事になるかもしれません。
なぜかといいますと、インストラクションキャッシュとデータキャッシュは、
まず間違いなく分かれていますから、生成したコードを実行するには
キャッシュを一旦全部メインメモリーにフラッシュして再度読み込みしないと
いけません、8K〜16Kbyteをメインメモリに書き込むとなると
これはかなりタスクスイッチ並に嫌なものがありますので、
できれば最終手段にしたほうがいいのでは、と感じています。
もしも、どうしてもやりたいならば、次の様にしてみることをお勧めします。

ret_2: ret 2
ret_6: ret 4
ret_8: ret 6
...

とコードどを全部あらかじめスタテックに生成しておいて、これにテーブル
式でジャンプしてみてください、このほうがはるかに効率が良いはずです。(多分)
0411396NGNG
>>408
伝わりませんでしたか?
例えばRegisterClassに登録するコールバックと、
EnumWindows、EnumChildWindowsに設定するコールバックの関数の型は、
それぞれ違いますよね?(EnumWindowsとEnumChildWindowsは同じですが。)
また、将来新たに作られたり、ユーザー側が作ったDLLのコールバック関数も、
型が同じとは到底思えません。
その全てのコールバック関数の動的対応をどうするか、について質問しているのですが。
0412401NGNG
>>410
ん、esx 操作すりゃいいか(藁)
0413401NGNG
>>412
esx -> esp
鬱だし脳
0414396NGNG
>>410
その方法は衛生的で良いですね。
まだ引数をどうするかの問題が残ってますが。
それと、書き換えは遅くなる可能性があるんですね。勉強になりました。
でも一度作って、それを使いまわす状況ならいいでは?
とも思ったんですが違いますか?
0415401NGNG
>>410
多分OKだと思います。
スクリプト中のどこかにまとめて宣言しておいて、
起動前に全部作ってしまうのがいいかも知れませんね。
0416396NGNG
>>415
そうですか。
とりあえず作ってみます。
みなさんありがとうございました。
0417デフォルトの名無しさんNGNG
int *fun1(...)、long *int(...)の二つの関数ポインタを作って、
無理矢理キャストするというのは駄目かな?
0418401NGNG
>>417
パスカル式には、それは使えません。
スタックフレームを呼び出し側で処理しているC型の呼び出しのみ有効です。
0419396NGNG
なんとか動く物が作れました。__cdecl/__stdcall
(まだEnumWindowsでしかテストしてないですけど。)
これの実装、コード量の割にかなり辛かったです。
(アセンブラをあんまり触わってないのが原因ですが。)
とにかく、DLL-APIの直呼出しと、コールバックが使える様になった事で、
かなり表現の幅が広がった様な気がします。
0420396NGNG
無事、ウィンドウのメッセージループまで行き着くことができました。
それにしても、winapiインクルードファイルの変換は大変ですね。
今の所メッセージは全部DefWindowProcに渡してるからいいけど、
インタプリタ側で処理を追加していくと、かなり遅くなりそうです・・。
というわけで、お答え下さった方々、ありがとうございました。
0421デフォルトの名無しさんNGNG
Rubyに入ってるwin32api呼び出しモジュールのソースや、
HSP用のloadlib.dllのソースが任意のdllの関数を呼び
出すためにマシン語使ってたな。
0422VB厨房NGNG
誰かソースからドキュソメント作成するのに便利なawkのスクリプトがあったらおせーて!
hellプ(for ActiveServerPages)
0423VB厨房NGNG
ちなみに関数一覧と変数一覧をコメントつきで生成するやつは自力で作った。
それっぽいやつヨロピク
0424デフォルトの名無しさんNGNG
age
0425デフォルトの名無しさんNGNG
sage
0426デフォルトの名無しさんNGNG
>>422-423
思いっきりスレ違い、スクリプトすれかVBスレに逝きなはれ。
0427デフォルトの名無しさんNGNG
スクリプト言語で二重ロード防止策ってどんな方法が良いんでしょう?
C/C++は#ifndef#define#endif、マクロ定義
Pascal/perl/lispなどはuseとかrequireとか。
やっぱ後者の様にロードされてなかったらロードするって処理を
言語側でやった方がわかりやすいのかな。
こう考えるとC/C++のマクロって汚いですね。
0428デフォルトの名無しさんNGNG
perlは一度読んだファイル名を%INCにつっこんでるだけなので汚いかと。
0429デフォルトの名無しさんNGNG
>>427-428
管理に、違う名前空間を使うか、グローバル変数として持つのか。
ぐらいの違い?
ふつーの変数にしとけば、プログラム側で覗けるから
便利なんじゃない?(前例が無ければ後者がお勧め)
どちらにしろ特別な処理はあんま増やさない方が良いよ。
0430デフォルトの名無しさんNGNG
>>427
二重ロードされても問題ないような文法にしてしまうとか・・・(藁)
それは、ともかくとして

インクルード宣言作りは「ファイル分離の目的」というのを明確にするべきではないだろうかと最近考えてたりします。
C++ のテンプレートなどは、綺麗に分離されない文法なので、ソースがあるべきところと宣言のあるべきところがゴチャゴチャになってしまいます。
#まあ、自己責任で出来ないことはないんですが・・・

作る言語の構造を考えて、これはどのようにコードが分類されれば、綺麗に整頓できるかが分かれば、インクルードの形式もそれに伴って綺麗な形の物を考える事ができると思います。
先に構造ありき、次に分類方法を考えて、それができたらインクルード方法と思います。
0431デフォルトの名無しさんNGNG
Cのマクロって大した事できないくせに実装が大変。
CINTの作者とか苦労してそうだね。ハゲてるし。
0432デフォルトの名無しさんNGNG
>>431
(hageはともかく)同意。
NULLとかの誤解も多いし。
あのプリプロセス処理は早めにつぶすべきだったと思う。
確かに便利だけど、代替手段は他にもあったと思う。
0433デフォルトの名無しさんNGNG
>>431
マクロの実装は大変か?
たいしたことないと思うが。手を抜きすぎて不便なのはわかるが。
0434デフォルトの名無しさんNGNG
lispのマクロは単純な割に使い勝手が良い。
これはマクロが完全に言語の一部だから。
0435427NGNG
ありがとうございました。
後者で作ってみます。名前空間の独立は考えていないので、
グローバル変数か何かに、load情報を記録していくことになりそうです。
0436デフォルトの名無しさんNGNG
スクリプト言語の作者はハゲますか?
0437デフォルトの名無しさんNGNG
>>436
オレはハゲてないよ。
0438デフォルトの名無しさんNGNG
>>436
すまん、はげそうです
0439デフォルトの名無しさんNGNG
CINTの本(何かの雑誌の別冊っぽい作り)のCDROMに、
作者を写したmovieが入っているのだが、ハゲていたな。確かに。
0440デフォルトの名無しさんNGNG
>>439
そういうこと言わない、気にしたらストレス溜まってハゲが加速する。
0441デフォルトの名無しさんNGNG
ハゲ板逝け
0442デフォルトの名無しさんNGNG
初心者な質問ですみません。
yacc/lexでファイル終端の構文エラーを検出する方法を教えて下さい。

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

こう書くと semicolon が無いとうまくエラーになってくれないので
終端の semicolon の無い行のエラーが検出できなくて困っています。
0443デフォルトの名無しさんNGNG
h-age
0444デフォルトの名無しさんNGNG
EOFを終端記号としてエラー認識すれば良いと思われ。>>442
0445442NGNG
>>444
ありがとうございます。
お教えのとおりやってみたらできました。
0446デフォルトの名無しさんNGNG
gerogero
0447デフォルトの名無しさんNGNG
ソース読みこむ
↓
トークンに分割
↓
中間コード生成
↓
実行
↓
(゚д゚)ウマー
0448デフォルトの名無しさんNGNG
僕はスクリプト言語の作者ですけど、今の所ハゲてません。>>436
でも無関係な友人がハゲていってる様です。
どうすればいいでしょう?
0449デフォルトの名無しさんNGNG
わたしゃ、使い捨てCトランスレータ屋です。
スクリプト屋同様ヤバイです。
以前使ってたハツモールヘアグロアーSは効きましたよ。
今なんとか大丈夫、でもまたデコあたりが・・・

もうハゲ・ズラ板プログラム技術出張所ですな(藁
0450デフォルトの名無しさんNGNG
ANTLRを使いたいんだけど、日本語の資料どっかにありません?
0451デフォルトの名無しさんNGNG
ageとく

ここのリンク良かった
http://rananim.ie.u-ryukyu.ac.jp/~kono/lecture/1997/compiler/compiler.html
0452デフォルトの名無しさんNGNG
>>450
(参考になるかはともかく)けっこう日本語のページあるみたいだけど
http://www.google.co.jp/search?hl=ja&safe=off&q=ANTLR&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
0453デフォルトの名無しさんNGNG
age
0454デフォルトの名無しさんNGNG
>>452
すまぬ、そのへんは見ました。
0455デフォルトの名無しさんNGNG
>454
なにがわからないんだ
0456デフォルトの名無しさんNGNG
age
0457デフォルトの名無しさんNGNG
age
0458デフォルトの名無しさんNGNG
誰か・・・・
0459デフォルトの名無しさんNGNG
なんだ?ハゲてきたか?>458
0460デフォルトの名無しさんNGNG
書き込みないねえ

http://www.southern-storm.com.au/treecc.html
暇つぶしにこれをつかってみます。
0461デフォルトの名無しさんNGNG
コンパイラつくりてえage
0462デフォルトの名無しさんNGNG
なんか作れ
0463デフォルトの名無しさんNGNG
age
0464デフォルトの名無しさんNGNG
>462
おまえが作れ
0465デフォルトの名無しさんNGNG
>>464
オマエモナー
0466デフォルトの名無しさんNGNG
定期age
0467ひlrm;ろゆき@菅lrm;直人NGNG
testes
0468デフォルトの名無しさんNGNG
定期age
0469デフォルトの名無しさんNGNG
トランスレーターってどれぐらいの種類があるんですか?
0470デフォルトの名無しさんNGNG
ageたい・・・
0471名無しNGNG
Cのコンパイラをつくりたいのですが
そのへんのことについてくわしくのってる書籍はありますか?
0472デフォルトの名無しさんNGNG
>>471
とりあえず、K&R持ってなかったら買う。
仕様載ってるから。
その後、自分の気に入ったのを買う。
人からすすめられたやつもいいかもしれないけど、
なるべく、自分に合うやつがいいとおもう。

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

でも、コンパイラ本って少ないんだよな・・・
0473デフォルトの名無しさんNGNG
コンパイラ構成法 - 原田
を始めに読むのがいいかも?。

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

コンパイラの構成と最適化、は最適化が気になり始めてからのほうが
いいと思う。
0474471NGNG
ありがとうございます。
0475デフォルトの名無しさんNGNG
>>472
>とりあえず、K&R持ってなかったら買う。
>仕様載ってるから。

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

だめだね。
0483デフォルトの名無しさんNGNG
>>480
ドラゴンブック読んでる人間はこういう発言はしないと思われ。
0484デフォルトの名無しさん NGNG
アセンブラしらなくてもCのコンパイラつくれますか?
0485名無しさんNGNG
できる。ネイティブコード吐かない奴。
0486デフォルトの名無しさんNGNG
CでCのコンパイラとか?
0487名無しさんNGNG
ペンバートン&ダニエルズは
PascalでPascal書いてる。
「P4-Pascalの言語処理系」(共立)
0488デフォルトの名無しさんNGNG
BASICでBASICインタプリタ作れるし、
アセンブラでアセンブラを作れる。
0489デフォルトの名無しさんNGNG
>>487
今更Pascal「ごとき」低レベルな言語を書いてもレベルが低いと
言っているようなものだね。
JavaならOS非依存だからコンパイラなど作る必要なし。
もっとレベルの高い会話をしろよ。
0490あNGNG
>>489
>JavaならOS非依存だからコンパイラなど作る必要なし。

おまえ、 自分の言ってることを分かってるか?
0491デフォルトの名無しさんNGNG
>>490
ネタでしょう・・・
もし、ネタじゃないなら、この板も落ちたもんです・・・
0492デフォルトの名無しさんNGNG
>>489
あからさまにdel厨を煽っています。無視しましょう。
0493デフォルトの名無しさんNGNG
ageぇ
0494デフォルトの名無しさんNGNG
まあjavacというものの存在についての知識はデフォということで、

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

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

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

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

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

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

改訂らしい。
ソース
http://www.ulis.ac.jp/library/Kanpo/Vol14No3/nakai.html
0519デフォルトの名無しさんNGNG
LispToCのトランスレーターって、
制御構造あたりは簡単に作れそう。
Schemeは継続と末尾再帰があるから、大変かな。
0520デフォルトの名無しさんNGNG
恩返しage
0521デフォルトの名無しさんNGNG
啓学出版って、*潰れた*んじゃ?
0522♯6411NGNG
>>521 そう。潰れたかどうかは覚えてないけど、
絶版になってしまったので、yaccスキー連中が
右往左往するハメに陥ってたわけだな(w

ところで、漏れが最初手にした書籍は、
啓学出版なんだけど、五月女さんじゃなかったん
だよなー。誰だっけ? 誰かフォローきぼんぬ。
0523デフォルトの名無しさんNGNG
これか?
http://sysneitf.hoops.ne.jp/books2/QueryAll35.html

Introduction to Compiler Construction With Unix
http://www.amazon.com/exec/obidos/ASIN/0134743962/103-5033895-5249448
Out of print!
0524♯6411NGNG
>>523 それだーさんくすー
0525pfNGNG
貴重な良スレage
0526デフォルトの名無しさんNGNG
>yacc/lex, 五月女健治著, 啓学出版
今日池袋のジュンク堂にあった
0527デフォルトの名無しさんNGNG
全ページすわり読みするしかない。
0528デフォルトの名無しさんNGNG
age
0529デフォルトの名無しさんNGNG
テクノプレスで注文したけど、なんの連絡もこない。
0530デフォルトの名無しさん01/08/28 21:47ID:o3vII6Bs
Pentium用のコード生成を解説した本って無いですか?
アセンブラまでじゃなくて、ちゃんと機械語までの変換
を解説した本が欲しいのですが・・・
0531デフォルトの名無しさん01/08/28 21:58ID:aZXv.NLA
>>530
意味不明。
Intel行け。
0532デフォルトの名無しさん01/08/29 00:02ID:SXxGnN5k
>>531
なるほど。
0533デフォルトの名無しさん01/08/29 01:31ID:GIhJkjc.
>>530
VisualC++とかならasm/codファイルの出力とか参考になると思うよ。
0534デフォルトの名無しさん01/08/29 02:31ID:M4BjMY5w
コンパイラ
湯淺 太一 著
http://www.yuasa.kuis.kyoto-u.ac.jp/~yuasa/shokodo/index.html
http://www.shoko-do.co.jp/infobooks/ISBN4-7856-2050-1.html
http://www.yfcbookshelf.com/compiler's%20books4.htm
0535デフォルトの名無しさん01/08/29 07:07ID:JQLDr6so
>534
ありきたりな内容だな
053653401/08/29 12:35ID:LA57eUsQ
言うの忘れたけど、
>>534
は、
>>530
へ。
機械語まで・・・ってのがよくわからんけど。


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

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

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

のChapter17に非常に詳しい解説がありました。
0541デフォルトの名無しさんNGNG
http://buri.sfc.keio.ac.jp/~yosuke/keisan-kino-ron/index.html

既出っぽいけど、KEIO SFC の計算機口論の授業のページ。
コンパイラの基礎だな。
0542デフォルトの名無しさんNGNG
ドラゴンブックにガベージコレクションとか載ってるか?
0543デフォルトの名無しさんNGNG
>>542

13. Garbage collection
http://www.cs.princeton.edu/~appel/modern/toc.html
0544デフォルトの名無しさんNGNG
>>543
それはタイガーブックだ。ついでに、タイガーブックは米国のamazonで評判悪いぞ。
0545デフォルトの名無しさんNGNG
>>542
http://cseng.aw.com/book/toc/0,3830,0201100886,00.html
0546デフォルトの名無しさんNGNG
http://www.yfcbookshelf.com/compiler's%20books2.htm#Information&Computing別巻5コンパイラ�T
0547デフォルトの名無しさんNGNG
中間コード(バイトコード)設計の上で参考になる資料ってありますか?
なるべくシンプルなのが良いんですが
0548♯6411NGNG
>>547
中間コードが処理系内部で閉じてるんだったら
なんでもいいんでは? あえてバイトコードに
こだわる必要なし。

ちなみにgccは木を作ってるね。
0549デフォルトの名無しさんNGNG
>>548
なんでもいいって、なんかあるでしょう?
木とか、そんな解答じゃなくて、
もっと具体的なやつ教えてください。
0550rrNGNG
>>549
スタックとオペラントとジャンプの羅列
0551デフォルトの名無しさんNGNG
>>549
JavaVMの仕様書
0552デフォルトの名無しさんNGNG
>>549
ターゲットとなる全てのプロセッサのマニュアル。
プロセッサが1種類だけなら中間コードなんていらん。
0553デフォルトの名無しさんNGNG
>>551-552
シンプルなの、つってんじゃん。
バカ?
0554デフォルトの名無しさんNGNG
>>553
あまりいきがるなよ。
0555デフォルトの名無しさんNGNG
どこか忘れたけど、mov命令だけの CPUの話があった。
シンプルだろ。
0556デフォルトの名無しさんNGNG
http://www.sex-jp.net/dh/01/
http://www.sex-jp.net/dh/02/
http://www.sex-jp.net/dh/03/
http://www.sex-jp.net/dh/04/
0557デフォルトの名無しさんNGNG
>>547
金持ち(ビルゲイツ並み)になるための良い方法はないでしょうか?
なるべく楽なのが良いんですが
0558デフォルトの名無しさんNGNG
>>547=549=553

人間失格

そして・・・


age
0559デフォルトの名無しさんNGNG
コンパイラのバグを発見するために、わざときわどいソースコードを
読ませたりしてバグを探したりすると思うんですが、
そういうテスト用コードは、どこに行けば手に入れられるでしょうか?
言語はCです。
0560デフォルトの名無しさんNGNG
>>555
 なんか出来の悪いDSPなんかだと 特殊な処理は特定のメモリ番地に書き込む事で発動される
 なんてのが大量にあるよね
 割算用のアドレスがあってそこに書き込んでから何ステップ後に読むと割算結果が得られるとかね

 これ、使う方はなんかキツイんだよね。
 を加算とか論理演算でもやられると読む方は嫌になるかもね

;1+2
mov (AddSrc),#1
mov (AddDst),#2
NOP
mov reg,(AddDst)
0561デフォルトの名無しさんNGNG
age
0562デフォルトの名無しさんNGNG
>>559
gcc の test suite でも使ったら?
0563デフォルトの名無しさんNGNG
Flex + BISONでCもどきのインタープリタを作成しています。
なんとか動いてはいるのですが、食わせるスクリプトによって

fatal flex scanner internal error--end of buffer missed

といったエラーがでます。
Flexの吐いたコードから発生しているエラーと思われるのですが、
このエラーはいったい何なのか教えていただけないでしょうか。
使用しているFLEXはversion 2.5.4です。
0564デフォルトの名無しさんNGNG
保守sage
0565559NGNG
>>562 ありがとう、そういうのを探してたです、多謝!
0566デフォルトの名無しさんNGNG
grep "end of buffer missed" *.c *.h
0567デフォルトの名無しさんNGNG
EOL(End Of Line)
ってマイナーでしょうか?
よく"\r\n"や"\n"直接書くかわりに定数にしてるんですが。
0568デフォルトの名無しさんNGNG
おれは使ってるが
0569デフォルトの名無しさんNGNG
std::endlなら使う
0570エロゲープログラマーNGNG
ADVゲームのスクリプト言語のためになるツールってあります?
0571デフォルトの名無しさんNGNG
とりあえずDNMLで検索>570
ほかにも沢山あるけどな。
0572デフォルトの名無しさんNGNG
スクリプトからスタックマシンへの展開って、
式とかはなんとなく判るんですけど、繰返しや条件文って
どうなるんでしょう?
ラベルとか飛び先を用意しないと駄目ですか?
>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
0573デフォルトの名無しさんNGNG
>>572

蛇足の助言。ifみたいな制御機能は、マシン自体に実装せずに
それ自体をライブラリにしてしまう、という手もある。
SmalltalkやPostScriptがやっている。

「関数ポインタ」みたいなものをFirstClassObjectとして扱えるような
言語仕様であるということにしとくと、結構幸せになる。
0574572NGNG
>>573

なるほど。
ちょっと見えてきました。
0575デフォルトの名無しさんNGNG
>>570
たぶん、ゲームエンジンに食わせるバイナリーを
作成するためのコンパイラがだとおもいますが、
lex yacc が一般的だと思いますよ。
少し難しいですが、がんばってくださいね。
0576デフォルトの名無しさんNGNG
lex yacc のソースってフリーなのですか?
0577デフォルトの名無しさんNGNG
>>576
フリーつーかライセンスはあるよ?
それと、片手間でlex/yaccのソース見てもわかんないと思うよ。
この場合は、既存のツクール使うのが正解と思うけどなあ。
0578576NGNG
pascal( or Object Pascal)に移植されたソースなんて無いですかね?
Cよりpascalの方が得意なので。
0579専門学生学校NGNG
おお、同士よ>>570
学校の課題でADVを作っていますが、バイナリーを直接いじっています。
ソースコードからバイナリーを制作するツールはいつか作りたいと思っていますが、
むずかしくって、作れません。
だれかイイ知恵を下さい。プリーズ。
0580デフォルトの名無しさんNGNG
>>579
インタプリタから作るといいよ
1行入力して文を解釈するってやつ。
最初は条件文とgotoだけ。
0581Hの専門家NGNG
命令を1文字にするといいよ。
m文字列
s選択肢1,選択肢2,選択肢3
とかみたいに。
アリスのシステムも2文字だったけど、
あれってこれと同じ方法だと思います。
0582いま言語つくってる人NGNG
初歩から始めるなら

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
0583いま言語つくってる人NGNG
>>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
0584デフォルトの名無しさんNGNG
>>582
コマンドIDの列って、、
変数とユーザー関数定義を実装するにはそれなりのセンスが
必要だと思うけど。
0585いま言語つくってる人NGNG
>>584
そうかい?
パフォーマンスを度外視すれば
コマンドID列を保持する vector をラベルでキー付けして
STL の map に突っ込むだけで御仕舞い。
STL の使い方が分からなくても
自作の可変長配列に線形探索程度で挿入・検索をやっても
それなりに使えると思うよ。
念のために言っとくと、
スクリプトの各行の先頭単語はコマンドIDのラベルを表し、
以後行末までの空白で区切られたトークンはパラメータを表してる。
この程度ならセンスと言うほどのものは必要ないと思うがなぁ。
0586デフォルトの名無しさんNGNG
レベルが低いな。
本気で言語を作る気があるなら、まず最初にLispを作れ。
初心者でも、やる気があるやつがかかれば、5日で作れる。
0587デフォルトの名無しさんNGNG
>>586
それはLISPをある程度知ってる人が前提。
初心者に5日は無理。
でも今時の若い人は気力と強引さでカバーするかも?
0588いま言語つくってる人NGNG
Lispは出発点じゃなくて終着点、に一票。
素晴らしいものだとは思うけど
それだけに最初に知ってしまうと
他の言語と疎遠になってしまいがちじゃないかな。
漏れはLisperじゃないけどそういう言語に思える。<Lisp
0589デフォルトの名無しさんNGNG
よし、じゃあ俺が今日から作ってみるよ。眠いので寝てからだが。
SchemeはSICP読んでる、レベル。
Schemeもどきの末尾再帰の最適化とかは無し、継続もなし、
マクロは未定、って感じでいいか?
0590デフォルトの名無しさんNGNG
がんばってね。>589
0591589NGNG
Lisp系ははじめてな上に、GCはリファレンスカウントしか知らないので、
そのうちマーク&スイープとかについてヘルプ出すかも。
その時はよろしく。
0592デフォルトの名無しさんNGNG
>>587
Lispの概略は3時間もあればつかめるだろ。

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

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

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

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

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

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

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

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

もう少し真面目に作っても、確かに5日あれば終わりそうです。
0606589NGNG
>>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;

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

作りかけをアップしておきます。
内容は見るに値しませんが。
http://www.geocities.co.jp/SiliconValley-SanJose/8306/lisp.tgz
defineとlambdaと+だけ出来ます。
Lisp系を初めて作る奴が、一日かけて適当に組むとこういうのが出来る、
という事で。
0608デフォルトの名無しさんNGNG
単純なリストじゃ無理だろ。
使用リストと、変数格納イメージがないと。
0609589NGNG
とりあえずマーク&スイープ、プリミティブな型の扱いを
除けば理解したが、Cのスタックの下限を得る方法を知ら
ないので挫折。
上限は最後に定義したローカル変数、とかでいいのかな。

という訳でScheme厨房の私には、5日で実装、は無理そうです。

適当な処理系を覗くと、mainの(void *)&argvをbottomに使ったり
してるようですが、そういう物なんですか?
確かに割合い最初の方にスタックに積まれる物な気はしますが...

それとコピーイングとマーク&スイープ、どっちがScheme向きですか?
0610デフォルトの名無しさんNGNG
>>609
Cのスタックをスキャンしてるのか?
どこが変数で、どこがPCとか正確には見てないだろ?
だったらconservativeにやるしかないから、
コピーGCは無理と思われ。

ところで、lambdaさえあればリストも整数演算も作れるぞ。
defineなしで再帰もできるよ。
0611デフォルトの名無しさんNGNG
>>609
Scheme向きってのは特に無いと思うけど。
小さく作るならマーク&スイープで十分。
コピーはフラグメントが発生しない利点があるが、
普通に作ると遅い。これは実験済。
でも配列を大量に使う場合はコピーの方が良いかもね。
2つを組み合わせるって手もある。
インクリメンタルやジェネレーションなどは慣れてから。
0612デフォルトの名無しさんNGNG
>>610
lambdaだけで再帰は無理でしょ。一応set!も無いと。
(でもSICPにはlambdaだけで済ます方法が載ってたりする。)
0613デフォルトの名無しさんNGNG
>>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
0614デフォルトの名無しさんNGNG
>>613
そうそうこういうやつ(w
よくやるよね。
0615デフォルトの名無しさんNGNG
>>611
むー、漏れの経験ではコピーの方が何倍も速いがなー。
ヒープがいっぱいだと別だが。

いずれにせよジェネレーションGCの方が桁違いに速い
と思われ。
0616デフォルトの名無しさんNGNG
>>613
internal-define or letrecをこう言う風に変換する
マクロがあると面白いかもしれない。(変換結果が)
0617609NGNG
うおっ、諦めた瞬間に反応が(藁

>>610

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

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

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

GCのデバッグはね〜。難しい。
0620617NGNG
>>619

あ、なるほど。
intの値とか書きかえちゃまずいか。
0621デフォルトの名無しさんNGNG
んじゃ、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))))
0622620NGNG
c-ifが未定義っぽいですが。
core吐いて落ちた(<ーへぼい処理系だ...)
0623デフォルトの名無しさんNGNG
どうでもいいけど、何でCのスタックまでスキャンするの?
GCをマルチスレッドで走らせたりしてるわけ?
0624デフォルトの名無しさんNGNG
>>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)))))
0625620NGNG
>>623

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

>>624

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

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

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

外部にgcマーク用のビットマップを持つ、というのが、
どういう感じになるかはわかりませんが、やってみます。
0634デフォルトの名無しさんNGNG
>>633
例えば1024個のセルが収まるメモリブロックに対して、
128byte(1024bit)のビットマップを用意するという事だと思う。
各ビットは1つのセルに対応する。
でもなあ・・各メモリブロックに対応するビットマップを
探索する処理って効率よく書ける?
0635633NGNG
>>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の添字は取れるかなぁ、とか思ってますが。
甘いか?
0636635NGNG
>char bitmap[][1024]って感じにしちゃってますが。

char bitmap[1024]の間違い。
実際は、
char bitmap[slots][SLOT_SIZE];
という感じ。
0637デフォルトの名無しさんNGNG
>>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自体を入れるのはやめた方がよい。
(ダイレクトマップトキャッシュだとひどいことになる。)
0638637NGNG
Aは「セルのアラインメント」じゃなくて「log2(CHAR_BIT)」だな。
それに、offset計算の時にoのタグを剥がしてない。

欝だ氏の雨
0639635NGNG
ふぅ、やっとローカル変数で保持しておけば、GCで解放されなくなった。

マーク&スイープ、通常の使用の分には結構早いですね。
文字列は、セルに入れるのは通常のmallocで確保してるので、
あまり文字列がたくさんすぎて、しかもセルがたくさん余っていると
malloc失敗するけどGC起動されない、とかもあるかも。
うーむ。やっぱり文字列の領域もgcで管理するべきか?

まあ素人でも5日で終わる、ってのは本当かも。
今日で2日目だか3日目だかだし。
Scheme実装って面白いですね。
consセルをどこまで切り詰めるか、とか工夫のしがいがあるし。

>>637

やっぱりconsセルの領域はわけた方がいいですか...
一緒にしてしまった。
0640デフォルトの名無しさんNGNG
>>637
sweepは速いよね >ビットマップ

>>639
やっぱりconsセルの領域はわけた方がいいですか...
一緒にしてしまった。

大きさが同じオブジェクトなら混ぜても別に不都合はないと思われ。
フリーリストも一緒にしちゃえば問題なし。
0641デフォルトの名無しさんNGNG
>>639
Scheme実装はココからが面白いところ。
継続を作らずしてSchemeに非ず。
0642デフォルトの名無しさんNGNG
どこかにLALR(1)の実装の仕方を解説してるページってないですか?
0643デフォルトの名無しさんNGNG
>>642
yaccの使い方って事なら
本が山ほどある。
bisonのオンラインドキュメント
でも可。

それともパーザジェネレータ自体を
作りたいの?
0644635NGNG
とりあえず、当初の予定の5日が経過した現在。

結局define回りのシンタックスシュガーとか、
+-*/とか、比較演算とか、それっぽいのを一通り実装
した辺りで終了。継続までは手が出ず。
set!も実装してない。

http://www.geocities.co.jp/SiliconValley-SanJose/8306/lisp2.tgz

においとく。
まあSICP厨房な俺だと5日で完成は無理だった、という事で。
tagged pointerに初めて手を出したのと、GCもリファレンスカウンタ
じゃない奴は始めて組んだので、そこらへんで予想よりも手間取った。
GCのデバッグはもうやりたくない(T_T)
R5RSとか探したりとかもしてたので、実際はもうちょっと進むと思われ。
やっぱりForth系の方が楽ですねぇ。

これからジェネレーショナルなGCにでも手を出すか、中間
コード生成して末尾再帰の最適化やるか、って方向だとは
思うけど、、、
まずは継続でも実装してみるかもしれんけど、そろそろ飽
きるかも。とりあえず勉強にはなりました。
いろいろ教えてくれたこのスレの人々に感謝。
0645デフォルトの名無しさんNGNG
age
0646デフォルトの名無しさんNGNG
以下 解答してください

問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のソースコードを考えて、それをコンパイラに通し、実際に命令が生成されることを確認せよ。(ただし、データのアドレスは、変わっても良いとする)
0647デフォルトの名無しさんNGNG
>>646

宿題スレでやれよ。
答えてやるから。
0648デフォルトの名無しさんNGNG
>>647
http://rananim.ie.u-ryukyu.ac.jp/~kono/lecture/2000/compiler/00-10-30/lecture.html

ここからのコピペと思われ。
0649647NGNG
>>648

ああ、なるほど。
という事は646は自分で勉強でやってるのかな?
話題提供なら、
movl b %ebx
addl $7 %ebx
add $6 %ebx
add $5 %ebx
movl %ebx a
って感じか?
0650デフォルトの名無しさんNGNG
以下 解答してください

問

HSPで

a = 2 + 7 * 2

をコンパイルした結果はどうなるかを、自分の頭で考えて示せ。

HSPが、どのように考えて、その結果を出したのか、そして、それをアルゴリズムにするにはどうすれば良いのかを考えよう。
0651デフォルトの名無しさんNGNG
定数の畳み込みの話?
0652デフォルトの名無しさんNGNG
>>649
足し算の優先順位って、知ってる?
コンパイラなら、定数の畳み込みぐらいして欲しいのだが。
0653デフォルトの名無しさんNGNG
HSPなんて使った事ねー
0654デフォルトの名無しさんNGNG
yaccやlexってなに?
0655デフォルトの名無しさんNGNG
>>654
検索しろ厨房&もう寝ろ。
0656デフォルトの名無しさんNGNG
仮想マシンの種類ってスタックマシンとレジスタマシンだけですか?
0657デフォルトの名無しさんNGNG
>>656
他にもいっぱいあるよ。
memory to memoryもあるし、
SICD machineとか、
chemical abstract machineとか、
categorical abstract machineとか、
while-if machineとか、
・・・
0658デフォルトの名無しさんNGNG
×SICD
○SECD
0659あNGNG
命令スケジューリングについて教えて下さい

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

最適化を考えなきゃ、スケジューリングなんて楽勝だぞ(w
0661659NGNG
660

できればスケジューリングについてわかりやすく書いてある書籍
またはあなたのバイブル教えて!
0662デフォルトの名無しさんNGNG
>>661

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

http://wwwsoc.nacsis.ac.jp/ssj2/
0664あNGNG
>662
Oreily の本は薄く、読みやすそうで気になってました。
スケジューリングについて調べるために、購入して読んでみます。
0665 ◆vf4n5adY NGNG
 
0666デフォルトの名無しさんNGNG
vectorでダウンロードしたあとにガッカリする度
HSP製だった>VB製だった
0667デフォルトの名無しさんNGNG
誤送信スマソ。(鬱)
0668デフォルトの名無しさんNGNG
>662
MINIX本とは?
0669デフォルトの名無しさんNGNG
662 はOSのプロセススケジューリングと勘違いしてない?
0670デフォルトの名無しさんNGNG
>>669 sageだし、ネタだろ?
0671659NGNG
プロセサ内部での
主記憶から 演算器までの過程での内部命令のスケジューリングの
ことです
具体的にどういう処理をやっているのかよくわかりません
0672669NGNG
ごめん、本当に勘違いしてた。
逝ってくる。
0673デフォルトの名無しさんNGNG
>>671
ちょっとここじゃ解説しきれない。
アーキテクチャの本読め。
「スコアボーディング」「トマスロのアルゴリズム」
「アウトオブオーダ実行」「リザーベーションステーション」
「リオーダーバッファ」とか載ってるヤツを。

日本語だと「スーパースカラプロセッサ」M.Johnson(日経BP社)

あとはインテルのマニュアル読め。
0674デフォルトの名無しさんNGNG
>>673
>ちょっとここじゃ解説しきれない

さわりで良いから解説きぼん。
0675デフォルトの名無しさんNGNG
<AGE> アゲ―――(゜∀゜)――― </AGE>
0676デフォルトの名無しさんNGNG
671の指すマニュアルは無料の上、日本語版だよ。
www.intel.comの下アサリまくれ!オモシロイから。
0677デフォルトの名無しさんNGNG
Windows用のネイティブコンパイラを作成するためには、
どのような情報が必要ですか?
0678デフォルトの名無しさんNGNG
>>677
ネイティブってことは、86系に限ればPentiumの命令セットとか、
そういう資料なんじゃないの?
あとAPIの呼出し規約とか。
EXE/DLLのフォーマットとか。
0679デフォルトの名無しさんNGNG
binutilsやnasmなんかのソースを読んでみるとか
0680デフォルトの名無しさんNGNG
>>677
とりあえず、COMモデルのコンパイラを作ってから
Windowsへ移行した方がいいぞ。
もうやってるんだったら、余計なこと言ってごめんね。
0681デフォルトの名無しさんNGNG
COMモデルって何だ?
CP/M形式のものか?
それとも、Component Object Modelベースのコンパイラ?
わけわかんねー。
0682デフォルトの名無しさんNGNG
ちなみに 681 != 677 です
0683SsNGNG
lexやyaccをつかうのに、Cygnus gnu-win32というのが
が必要らしいのでダウンロードしたいのですが、
>2のHPにいってもどれなのかわかりません。
どれをダウンロードすればいいんですか?
初心者ですみません。
0684デフォルトの名無しさんNGNG
677でも680でもないけど文脈からCP/M形式のことではないかと。
0685デフォルトの名無しさんNGNG
>>683
Cygwin 版ではない Win32 native の lex, yacc もありますよ。

http://unxutils.sourceforge.net/

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

>>689
OK

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

CINTをユーザープログラムに組み込む方法を探してます。
書籍では1冊あったんですが、HPでは英文しか見当たらないようですね・・・(T^T)
ぼちぼち読んでみますが、何かご存知でしたら情報共有しましょう!
過去ログにもCINTはあんまりないようですし。(←需要が無い?)
sage
0697デフォルトの名無しさんNGNG
さがってないし。鬱。
0698デフォルトの名無しさん NGNG
言語の意味論を勉強するのによい本はありませんか?
0699696NGNG
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文、配列変数なども実装したいけど、
どこかにソースないですかねぇ?
0700700NGNG
ソース?
0701デフォルトの名無しさんNGNG
>>696
サンクス。
0702デフォルトの名無しさんNGNG
ageたい
0703デフォルトの名無しさんNGNG
以前Perlのソースを読もうとして挫折した者です。
PerlにもRubyのHacking Guideのような、ソース読解の
手引きのようなものがあるとうれしいのですが、、、。
どなたか、ご存知の方いらっしゃいますか?
(スレ違いかもしれませんが)
0704kumikoNGNG
ランタイムエラーで、「”)”がありません」と出てくるのですが、
エラーのラインを見ても、何もありません。
どんな事が考えられるのでしょうか?
教えてください。
0705デフォルトの名無しさんNGNG
>>704
???スレ違いか?
↓こっちの方がよくない?

***すれ立てるまでもない質問はここで 第6刷***
http://pc.2ch.net/test/read.cgi/tech/1004183881/
0706デフォルトの名無しさんNGNG
gawk '$1=="TEST" {print}' SAMPLE
ってすると
gawk: cmd. line:1 '$1==TEST
gawk: cmd. line:1 ^ Invalid char ''' in expression
とエラーが返ってきます。
なぜでしょうか?教えて下さい。
0707デフォルトの名無しさんNGNG
Perl? >>703
0708デフォルトの名無しさん ? ◆LpRapTLM NGNG
Bison に hogehoge.c みたいなもんを吐かせたら、
↓
static void
__yy_memcpy (to, from, count)
  char *to;
  char *from;
  unsigned int count;
{
(snip ;-)
}

こんな関数があって、インタフェースがキモイです。(涙)
なにかパラメタとか弄らなきゃいけないでしょうか?
0709デフォルトの名無しさんNGNG
古いK&Rのころの書式?
昔のコンパイラを通すためなのかな?
0710デフォルトの名無しさんNGNG
>>708はK&Rに触れた事無いかし?
(イヤミとかじゃ無くてホントに知りたいだけ。最近の人は知らなくて当然だと思うし)

俺は全部ANSIにして、そのあとC++に書き換えたよ。
GNUって、どれもソース汚いよねぇ。(暴言?)
ていうかコーディングはともかく、IFDEFの嵐がかなわん。
0711_NGNG
age
0712デフォルトの名無しさんNGNG
コンパイルとおって正常に使えればいいんだよ・・・
本格的にbisonの出力を読んでみたいひとは別として
普通はそのままか、簡単なフィルタを通すだけでに
つかうだろうね。
>>710 みたいに書き換えることも考えられるけど
そうすると文法ファイルを書き換えるたびに出力ファイルを
書き直さないといけない。
0713710NGNG
>>712
違う違う、それじゃyacc使う意味無いって。
書き換えたのはtemplateファイルの方だよ。

こだわらないのは勝手だけどさ。
俺は必要が有ってそうしたの。
0714デフォルトの名無しさん ? ◆LpRapTLM NGNG
みなさん禿しく thanx!

>>709
>古いK&Rのころの書式?
>昔のコンパイラを通すためなのかな?

吐かれたソースのコメントにも「互換性のため」
みたいなことが書いてありました。
K&R なのかぁ…。

K&R の C は忘れちゃっていました。
Panafacom A-30 を使わなくなって以来、触ってないので。ゴメソ

>>710
>ていうかコーディングはともかく、IFDEFの嵐がかなわん。

あー、漏れ的には IFDEF のほうに共感。ていうか
クロス開発なので、自分で IFDEF 増やしてます。(激鬱

さらに IFDEF 増やす方向で (劇毒
bison.simple あたりを弄ってみることにします。
0715デフォルトの名無しさんNGNG
俺は自分で作った言語に機能追加する時は#ifdefで全部切り分けしてるから
もう何がなんだかわからん状態ですが何か?
0716デフォルトの名無しさんNGNG
>>715
CVS いれてブランチ切れば?
0717_NGNG
ageさせて
0718デフォルトの名無しさんNGNG
あげ
0719デフォルトの名無しさんNGNG
ふっ、言語処理系に興味を持つ厨房がこんなに少ないようじゃ、
日本の情報産業の未来は暗いな。

つーわけで、さらにage。
0720デフォルトの名無しさんNGNG
パラメータLシステム言語ってどうよ?
あれって新しいパラダイム変化を起こせるんだろか。
0721デフォルトの名無しさんNGNG
>>719
だったらスレをモリアゲテ・・・
0722デフォルトの名無しさんNGNG
言語処理系に興味を持つリアル厨房ですが、何か?
0723デフォルトの名無しさんNGNG
とりあえずlispかforth処理系つくってその上で
プリプロセッサ書けば早いと思う。
0724デフォルトの名無しさんNGNG
思いつきで恐縮ですが、オブジェクト指向lispってないんですか?
0725デフォルトの名無しさんNGNG
>>724
http://www.google.com/search?num=100&hl=ja&ie=utf8&oe=utf8&q=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91lisp&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
0726デフォルトの名無しさんNGNG
CommonLISPのCLOSってのはすごいぞ。>724
0727デフォルトの名無しさんNGNG
何年前の話だ
0728デフォルトの名無しさんNGNG
>>727
現役で使われている Fortran や C だって何年前の話だか。
0729デフォルトの名無しさんNGNG
最近注目されてる技術ってほとんどLISPからきてると思うけど
0730デフォルトの名無しさんNGNG
正規表現 -> NFA -> DFA
と手作業でやって正規表現を認識するプログラムを作りました。
(flexだとまさに一瞬・・・)

プログラムのテストをしっかりやりたいのですが、
正規表現から生成される文字列を自動作成するには?
0731デフォルトの名無しさんNGNG
入門書を逆読みして、ヌルエブルな部分式を消去して、
leftpos/followposを追えばなんとかなりそ。
できたらダウンロードしに行くわ。
0732デフォルトの名無しさんNGNG
shell の自作とかもこのスレで良いのかな?
良い教材があったら教えてください。
0733デフォルトの名無しさんNGNG
>>720
Lシステムの記号置換規則で実行可能なコード列を作るということですか?
まさかLシステムで生成可能な記号列を再帰関数とかで作るという話ではないですよね。
前者なら興味アル!
0734デフォルトの名無しさんNGNG
こんなヤツ。
ttp://www.comp.pu-toyama.ac.jp/~nishida/Pubresult/pllangj.html
ttp://www.comp.pu-toyama.ac.jp/~nishida/Sotuken/plsystem.html

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


yyerror(char *s)
{
 printf("%s\n", s);
}
0744735NGNG
-Lyにしたら
こんどはundefined reference to 'WinMain@16'
が!
もうわからん。
0745デフォルトの名無しさんNGNG
おちつけ。
まずは標準出力だけのプログラムでやっとけ。
0746_NGNG
", s);
0747デフォルトの名無しさんNGNG
/lib/
0748デフォルトの名無しさんNGNG
>>744
まだキミにはプログラムを作る以前の知識が足りない模様。
たとえば、「WinMain」で検索するとか、やってみたかい?
それがどういう物かを調べてみなよ。
0749735NGNG
あ、空のmain関数
かいたら
解決しました。
おさわがせしました。
0750デフォルトの名無しさんNGNG
>>563

fatal flex scanner internal error--end of buffer missed

lex&yaccプログラミング a nutshell

にflex2.3.7のエラーメッセージというのが
載っていて、

flex自身が使っているflex字句解析ルーチンで、致命的な内部エラーが発生した。
解決方法: システムのソフトウェア管理者に報告する。


だそうです。
0751厨房です。NGNG
先輩社員が「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が比較的コンパクトでした。)
0752デフォルトの名無しさんNGNG
>先輩社員が「Cコンパイラぐらい誰でも作れる」
ほんとかよ・・・
いまCもどきのコンパイラつくってるけど、すっげーむずかしい。
現役プログラマーの人たちって
みんな簡単につくれるものですか?
0753デフォルトの名無しさんNGNG
誰でも作れるけど、簡単にはいかないと思われ。
0754デフォルトの名無しさんNGNG
ドラゴンブックを順に読みながら作ればある程度のものは作れるよ、Cのサブセットのインタプリタなら作ったことある。
でも、自分の書いたコードが、なんでちゃんと動くのか(特に構文解析)は、よくわからなかった(うはは
コード出力のところは、.objのファイルフォーマット読んで、面度くさくなってやめたよ。

>>751は、コードの動きが読めないと納得しないタイプなんじゃないかな?
>char *(*(*array[10][5])())(); などネストした構造を解析
これを意識してるくらいだからね。
たとえば ( ) は、優先順位を変えるだけ(関数の()は別ね)だから、ツリーにしたときにいなくなっちゃうもんだし、
ネストがいくら深くなっても、基本的にやることは優先順位と方向の表にしたがってツリーを作るだけ。

>"abc"[5] という表現はOKだとか
これも、ポインタ式と整数式の組み合わせなんだから、当然おっけ、っていうかこれを気にする必要は無いんだよね。
で、インデクシングはポインタ式と整数式の組み合わせだってわかってれば、5["abc"]も(文法的には)おっけってのも、
知らずに実装できるわけだ。

なんか、考えすぎで行き詰まったようなかんじがするなぁ。

(あ、俺用語がおおくてゴメソ)
0755デフォルトの名無しさんNGNG
>>754
ああ俺も似たようなこと思った、
単にまだ抽象的な構造を脳内に描く能力が
足りないだけじゃないかなあと。
やってればそのうちできるようになるよ。
0756デフォルトの名無しさんNGNG
おいおいおい勘弁してくれよ、ここ集まってるオタクどものレベルの低さ。
今更Cコンパイラのサブセット?(爆笑
おいおいおい、せめて並列コンパイラの大域最適化ぐらいに話題のレベル上げろよ。
ホントだせーな。恥ずかしいよ、コンパイラの開発にやってたもんとしては。

>>751
お前は処理系の開発うんぬんよりも、先にK&Rのカス本でも読んで逝ってしまえ。
全くどこの会社だよお前。C言語もろくにできないカス。
今更Cのサブセット?ゴミ増やしてどーすんだよ。ばーか(w

>>752
コンパイラ開発はカスとプログラマを峻別する試金石なんだよ〜。
お前もカスレベル?(w

>>754
今更ドラゴンブックかよ。それ読んでお前もサブセット?しかもインタプリタ?
おいおいゴミを増やすなっつーの。お前だけで十分よ。
Cコンパイラやるなら最低でもデータフロー解析ぐらいやれって(w

この季節、女もいねーオタカスどもはヒサンだな(ワラ
0757デフォルトの名無しさんNGNG
>>756
以上、ホームグラウンドの話題になって急にいきがる自己陶酔型冬厨の見本です。
又は、ネタの見本としてもお使いください。
0758デフォルトの名無しさんNGNG
>>756 コンパイラ作る人ってたぶんマイコン用だろ。

まぁ、簡単というのはそれまでの知識や経験によりけりだと思うんだけれども
たとえば折りはC->アセンブラ変換とかPASCALアセンブラ変換なら
やれないことはないと思う
がobjファイル(Win)への変換とか具体的なEXEへのリンクは
ちょっと調べないとわからん...というか今はしらん。

で実際コンバータレベルでも作ったとして
結構文法処理は厳密にできるかわからん。ようは規格をチェックするのが大変だから
結局独自仕様になっちゃう

でも例えばこれがボードPCだったとしたら基本的なマシン語構造がわかっているから
できるかもしれないなと思う。
でもだれかがもう作っているなら金を出してそれを買うな。

NASMは確かソースがあるから
C->アセンブラ
アセンブラ->バイナリ
というのが0からコンパイラ作る場合作業分担しやすい方法だと思うけれど
OSがほとんどAPIもってるから効率よく実行できるサブセット型は意外と速いかも

つーかプログラムはやればできっかも知れないけれど
仕事だったら仕様書とかドキュメントとか著作権や特許の調査とか
検査成績書とか
そっちのほうが疲れるんじゃないのか?
0759デフォルトの名無しさんNGNG
>>756
>恥ずかしいよ、コンパイラの開発にやってたもんとしては。

おまえは日本語を勉強しろ。
0760デフォルトの名無しさんNGNG
スレたってから
もうすぐ1年か
0761デフォルトの名無しさんNGNG
>759
なんでオマエがはずかしがるのか
0762デフォルトの名無しさんNGNG
あ、
>759 → >756
0763厨房2NGNG
再帰下降でCの文法って扱えるの?
0764冬房=1NGNG
LALRだ。
0765764NGNG
(怒らないで、名前間違えた. 764!=1)
0766デフォルトの名無しさんNGNG
といいますかコンパイラの基礎理論的なところはすでに太古の昔に
完成されております故、いまさらコンパイラの開発程度で粋がっているのは
程度が知れるデございます。
0767デフォルトの名無しさんNGNG
たぶん>756もそれが言いたかったんだろうけれど、
ちょっと興奮しただけだと思う。大目に見よう。
0768正月房NGNG
ってーか、例えば再起下降パーサ(LLだよね?)わかるんだったら、
Pascal,Modula,Eiffel系の言語処理系作ってみる、っつう学習方法がある.

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

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

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

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

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

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

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

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

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

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

ObjectPascalの文字列や動的配列とかはリファレンスカウントで自動的に
メモリ管理されているけど、不完全ということ?
誰か解説してください。
0791デフォルトの名無しさんNGNG
age
0792デフォルトの名無しさんNGNG
循環参照だけだろ。リファレンスで不都合が生じるのは。
つまりA->B->C->Aで参照関係の在る場合。
文字列だけなら真のGC不要。
あと、ObjectPascalどころか、STL/MFCもリファレンスだと思った。
0793ほえNGNG
>792
> 循環参照だけだろ。リファレンスで不都合が生じるのは。
なるほど、リファレンスカウントでは問題が生じますね。
それが生じるプログラム書いたこと無かったから、問題として認識してませんでした。
0794デフォルトの名無しさんNGNG
>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

不都合って何?
0795デフォルトの名無しさんNGNG
>>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されない、ってかんじで、どでしょ?
0796ほえNGNG
>795
mark and sweep だと最初の3つのオブジェクトはみなしごになるので
GC の mark から外れて sweep されてなくなる、ってことですね。
0797デフォルトの名無しさんNGNG
マークスイープだと、3つのオブジェクトはマークされないから
GCされるけど、参照カウントだと、カウントが0になってない
からGCされない、ってことです。
0798デフォルトの名無しさんNGNG
あと、メモリ管理を自前できっちりやるつもりで、
廃棄予定のデータを、メモリ管理機構がきっちりつかんでいて、
仮想記憶がふくれあがる&GCがやけに遅い、っていうことも、
一般にはありがちだわな。
0799デフォルトの名無しさんNGNG
Ruby に関しては、次期バージョンで、
データ・オブジェクトの寿命特性を考慮した、
Generation GCつうやつに切り替えたつう話だそうです。
0800デフォルトの名無しさんNGNG
incr-gcやgene-gcとかって何年も昔からある技術だけど
最近出た新しいのってないの?
0801デフォルトの名無しさんNGNG
RubyもGC無しでやって欲しい。
0802ほえNGNG
>801
なしってことは、明示的に消滅させるってことですか??
0803デフォルトの名無しさんNGNG
>>802
そう。
0804デフォルトの名無しさんNGNG
>>800
松下のGCとか?
0805デフォルトの名無しさんNGNG
>>803
明示的に消滅させそこねた場合はどうするの?
0806デフォルトの名無しさんNGNG
>>801
もう見てらんない。
Delphiでも使ってなさいってこった。
0807ほえNGNG
>804
松下のって…何?
0808ほえNGNG
>805
多分、メモリリーク発生。
C で malloc したけど free しなかったのと同じ。
C++ で new したけど delete しなかったのと同じ。
0809デフォルトの名無しさんNGNG
>>805
そんなこと行ってたらCも使えなくなるでしょ。
GCってそんなに便利か?
むしろ失うものが大きすぎる。
0810デフォルトの名無しさんNGNG
>809
厨房はすっこんでろ
0811デフォルトの名無しさんNGNG
Ruby の言語仕様で GC なしは無理だろ。
0812デフォルトの名無しさんNGNG
>807
PanasonicのGC
0813デフォルトの名無しさんNGNG
>>809
Ruby に関していえば、保守的 GC のおかげで
C で拡張ライブラリ書くのがかなり楽。
0814ほえNGNG
>812
ゲームキューブ…………か……
0815デフォルトの名無しさんNGNG
オブジェクトが自身の寿命を管理するオブジェクト指向GCってないの?
0816デフォルトの名無しさんNGNG
>>815
それリファレンスカウンタだろ
0817デフォルトの名無しさんNGNG
>>800 Steeleは何をやっているのだろう?
0818デフォルトの名無しさんNGNG
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; }

%%
0819デフォルトの名無しさんNGNG
ident { letter } [ { letter } | { digit } ] *
じゃないの?
0820デフォルトの名無しさんNGNG
>>819さん
ご指摘のとおりでした。どうもありがとうございます。
0821デフォルトの名無しさんNGNG
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
というエラーがでてきて困っています。
意味がわからないのですが、対処法はないでしょうか?
0822デフォルトの名無しさんNGNG
>>821
default action ってことは、暗黙のアクション

 $$ = $1

を使っていて、$$ と $1 の型が違うんじゃない。明示的に空のアクション {} を書いてみたら。
0823デフォルトの名無しさんNGNG
アクションが何も書かれてないと思っていたのですが、
暗黙のアクションがあったわけですね。なるほど。
明示的に空のアクションを作ってとりあえずエラーを回避できました。
たすかりました。

それにしてもCのパーサーややこしいです。初心者にはつらめ・・・
0824821NGNG
>>821
で得たyaccソースのアクション部にコードを生成するコードを埋め込んでコンパイラ作りたいと思っているのですが、
これは通常の方法なんですか?

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

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

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

日本語のページから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

スレ違いなので終了
0829デフォルトの名無しさんNGNG
本読みながら
簡単Cもどきコンパイラつくってるけど、
すっげえムズイ・・・・
こんなの最初につくった人はすげえ
0830デフォルトの名無しさんNGNG
>>825
すれ違い氏ね
0831デフォルトの名無しさんNGNG
>>829
公開されているコンパイラのソースを実際に読んでみることを勧める。
(gccなど大きくて複雑なものは勧めない。が、自信があるなら別)
ドラゴンブック等などの参考書を読んだだけではわからない所は多いと思う。

>>824
学習用であれば、コードジェネレーターはレジスタ割り当てを考慮しないスタック使用のテンプレート変換でもいいと思う。
0832デフォルトの名無しさんNGNG
やっと本みながら
int型の計算と条件分岐やらループができた。
ムズかしー
0833デフォルトの名無しさんNGNG
yaccのプログラムの中でCStringとかCMapなどを使いたいのですが、
#include <afxcoll.h>
を入れただけで、エラーがいっぱいでてきます。いったい何なんでしょ?
0834デフォルトの名無しさんNGNG
GUIも作れるスクリプト言語作成中なんだけど、
コールバックで詰まってしまった・・・
0835デフォルトの名無しさんNGNG
こういうのはあれかな。
アセンブラ使うしかないか。
0836デフォルトの名無しさんNGNG
834=835?
つか、コールバックをスクリプト側にディスパッチする方法なのか、
スクリプトの文法構成をどうしようか、という話なのか、どっちよ?
0837デフォルトの名無しさんNGNG
834でも835でもないが、もしかしたら同じネタの話が過去にあったかも。
どのスレか忘れたけど。そのときは
@r:ret
@r4:ret 4
@r8:ret 8
って感じのリターン分岐を作ってやった方がJITでやるよりも
効率がいい、見たいな話だった。そういうこと?>834
0838yacc聞いてもいいですかNGNG
昨日C言語の質問スレに書いてしまって2重投稿になることをお許しください
yaccで、
expr : expr1 expr2
と書いて、expr2の処理を先に実行させる方法があるでしょうか。
その結果をexpr1の処理の中で使いたいんです。
0839デフォルトの名無しさんNGNG
>>834
もしコールバックをスクリプト側にディスパッチする話なら
GNU ffcall
が役に立つのでは?
ffcall,alloc_callback
とかで検索してみてちょ。
0840デフォルトの名無しさんNGNG
>>838
expr2 : hogehoge ...
の{}の中でフラグでも立てて、どっかに結果をしまっとけば?
0841デフォルトの名無しさんNGNG
>>839
GPLに汚染されるよ
0842yacc聞いてもいいですかNGNG
>>840
レスありがとうございます。そのようにしたいのですが、
expr1のアクションの方が、expr2のアクションより先に実行されてしまい
ますよね。
0843デフォルトの名無しさんNGNG
>>842
スキャナがトークンを返したところから expr : expr1 expr2 までのとこ、
具体的におしえて欲しいなり
0844yacc聞いてもいいですかNGNG
>>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; };
0845デフォルトの名無しさんNGNG
オプションが省略されてるかどうか、次の構文にマッチするまで判定できないのって
やった事ないわ、ごめん。

len_setがemptyにマッチしないようにして、
onpu : tone_or_waon {音符の保存}
   | tone_or_waon len_set {音符+len_setを保存}
ここではwriteOnpuを呼ばない
で、次の構文にマッチしたら、取っておいた音符情報を保存、くらいしか思いつかないや。

0846デフォルトの名無しさんNGNG
コンパイラを作るにはlexとかyaccとかをやるといいらしい。
lex&yaccプログラミングとかいう本が図書館にあったので読もうとしてみた…
が、1ページでやる気をなくす。
0847yacc聞いてもいいですかNGNG
>>845
考えていただいてありがとうございます。
結局、lexで語順を入れ替えて渡すように改造中です。
0848デフォルトの名無しさんNGNG
もういいかげん構文解析に力を注ぐのはやめようよ。不毛だよ。
S式で書けばいいじゃん。括弧だらけになるのは慣れれば問題ないよ。
エディタも助けてくれるし。

まあ、XMLでもいいけどさ…
0849デフォルトの名無しさんNGNG
記号表をどうゆうふうに作ればいいのかわからんので、導いてくれ。

「記号」と一口に言っても、各種リテラル、クラス名、変数名、メソッド名と
いろいろ種類があるわけで、これを名前空間毎に分けて管理して、さらに
生存期間とスコープについても考慮しなきゃいけない。
つーわけで頭ん中がオーバーフローっす。
概要でもいいし、この辺について詳しい記述がある解説書でもいいんで、
何かポインタちょうだい。
0850デフォルトの名無しさんNGNG
記号表とかから一旦離れて、
LISP作ってみれば一発でわかるよ>849
0851デフォルトの名無しさんNGNG
>>850
早速のレスありがと。
でも、オレ頭堅い人なんでlisp/schemeはちょっと苦手なんだよね
(継続とか、概念がわからん)。lispのインタープリタ作ればわかる
という、その所以についてもうちっと教えてくれない?
0852デフォルトの名無しさんNGNG
>851
何をしたいのかわからないけど、頭硬い人にLISPは無理。
まあ、LISPのシンボルとスコープの概念を理解できれば
名前空間その他なんて屁の河童です。
0853デフォルトの名無しさんNGNG
>849
黒豹本にその辺のPerlでの実装方法が載っていたような。
0854デフォルトの名無しさんNGNG
>>853
どうも、今度本屋行ったら探してみるよ
やっぱ本一冊でコンパイラ作るのは難しいのかなー
0855853NGNG
黒豹本、読み返してみたらあくまでもPerl処理系そのものでの実装方法なので
(Perlで記号表を書いている訳ではない)あまり参考にならないかも。
Perlってこの辺グチャグチャだし。
0856デフォルトの名無しさんNGNG
>継続とか、概念がわからん
ここではそんなの覚える必要無いじゃん。
0857デフォルトの名無しさんNGNG
>>855
いまいち文意が読みとれんのだけど、Perlのための記号表を
他の言語(Cなど)で書いてるってこと?もしそうだったら
読む価値あるのではないかと思うけど。

>>856
確かに。schemeなら多少わかるんでソース付きのインタープリタ
探してみようかしら。
0858デフォルトの名無しさんNGNG
yacc おしえてくださいな。

a.y b.y common.l という感じで作ってます。
字句解析は共通の common.l でやりたいのですが、
例えば a.y, b.y でそれぞれ %token STRING とやっても、
STRING が a と b で同じ値になるとは限りませんよね。

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

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

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

何故「誰かいませんか?」とき(略)
0872デフォルトの名無しさんNGNG
>>869
SECDR Schemeというのがあって、
これは末尾再帰を付加したSECDマシンの拡張を使ったScheme処理系らしいです。
これを作ったのは日本人です。
マシン自体の日本語での説明はあまりなかった気がするけど
ソースがわかりやすかったんで参考になるかと。
昔、niftyで落とせました。
0873デフォルトの名無しさんNGNG
良スレなんでageとくわ。
0874_NGNG
javaのクラスファイルを吐く簡単なスクリプトを作ってます。
a = 1 + 2とか整数だけの式は思ったより簡単に処理できましたが
.演算子とかクラスが入ってくるとどう処理していいのか分からなくなります。
objはObj型のインスタンスで
Obj型のインスタンスを返すFunc()メソッドを持っているとして
a = (obj.Func()).Func();
これってどう処理したらいいのでしょうか。
ノードひとつひとつに型を保持したらいいの?
うーん、こういうのもlispで作ったほうが分かりやすいのなら
作り直おそうかな。。。
0875874NGNG
.演算子→.(ドット)演算子
0876デフォルトの名無しさんNGNG
なにがしたいんだい?
0877874NGNG
ドット演算子のノードをコンパイルできないんです。
. --- instance
|
. --- instance
|
var
こんな木構造のノードが・・・って分からないですね。。。
すみません、やっぱlispにしてみます。
0878デフォルトの名無しさんNGNG
つーか874だけでは助言しようもないよ
>a = 1 + 2とか整数だけの式は思ったより簡単に処理できましたが
簡単に処理できた、とは?
a = 1 + 2
の式ではどんな出力になったの?
0879874NGNG
>>878
えっと
const 1
const 2
iadd
istore 0
です。
0880874NGNG
>>878
今CLOSの本読んでたんですが、find-classとslot-valueを同時にやろうとして混乱してたみたいです。
lispの表記って気持ち悪いですけど、この表記で考えるとすっきりしますね。
0881デフォルトの名無しさんNGNG
メンテ
0882デフォルトの名無しさんNGNG
良スレあげ
0883デフォルトの名無しさんNGNG
おいおい
独りでインタプリタ作りますた
とか
一週間でコンパイラ作り上げますた
とか強者はいないのか?え?
0884デフォルトの名無しさんNGNG
>>883
俺は違うけど、そういう人はごろごろいると思われ。
でもあまり書き込まない。
0885デフォルトの名無しさんNGNG
>>883
そうそう、自慢するような事でもないし。キミも作ってみ。
0886デフォルトの名無しさんNGNG
>880
気持ち悪いのは最初だけだよ(ケケケ
0887デフォルトの名無しさんNGNG
>>883
Lisp/Scheme スレの過去ログでそんな話題がちらほらあったよ。
C で 2000 行くらいのインタプリタのサンプルもあるから試してみれば?
0888>>883NGNG
インタプリタのようなものなら作った。中途半端だけど。
糞コードになって飽きてやめた。
ifとgotoとgosubとforとかしかないN88似のBASIC
そのときはネット環境になかったし、資料も手元になかった。
変数の名前はどうしたらいいのか1週間悩みつづけた(藁
自慢するほどのものではないのでクレと言われてもageません。
0889デフォルトの名無しさんNGNG
7行スレにBASICがあるよ。
0890デフォルトの名無しさんNGNG
>889
アレ、意外に速いよ
オレのクソインタプリタよりも(w
0891デフォルトの名無しさんNGNG
島唄
0892デフォルトの名無しさんNGNG
ウィン32でのAPPの作り方を教えてくださいお願いします!
0893デフォルトの名無しさんNGNG
なんじゃ?APPって
0894デフォルトの名無しさんNGNG
あっぷっぷ
0895デフォルトの名無しさんNGNG
コンパイラ・インタプリタ方式の処理系を作成しているのですが
VMの命令実行部はswitch-caseかthreaded-codeのどちらで
処理した方が速いのでしょうか?
それとも差は余りないのですか?
0896デフォルトの名無しさんNGNG
実験してみた?
0897デフォルトの名無しさんNGNG
実験結果あるよ。
http://www.complang.tuwien.ac.at/forth/threading/
0898デフォルトの名無しさんNGNG
>>895
threaded-code
って何?
0899デフォルトの名無しさんNGNG
関数ポインタジャンプじゃないの?
0900デフォルトの名無しさんNGNG
例えば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の処理がいらない。
0901デフォルトの名無しさんNGNG
>>900
>gotoのラベルをvoid *型変数に入れて
もうこの時点で理解不能。
いや、理解はできるけどラベルを変数に〜って、できたっけ?
0902デフォルトの名無しさんNGNG
あ、gcc*だと*できるのか・・便利だね。
これの利点は関数呼び出し程のコストが掛からない、ってか?
0903sNGNG
突然ですが。
http://www.empathy.com/pccts/roskind.html
に、Jim Roskindというヒトが書いたC++のソースのyaccによるパーサ(でいいよね?)が
あるようです。
templateには対応してない(らしい)ですが。
言語・環境は問わないんで他にC++を解析するようなモノを
どなたかご存知ありませんか?
C++のソースのparsingについては
かなり難しいらしいが
現にdoxygenみたいなのもあるんだし。
0904デフォルトの名無しさんNGNG
templateくらい自分で書き足しなさい。
C++3rdにBNFでの記述無かったか?
0905sNGNG
>903
そういえばそうですな・・・
みんなそうしてるんだろうか。
がんばってみるか〜
g++のソースは読めたもんじゃなかったし
0906デフォルトの名無しさんNGNG
>>903=>>905
doxygenってソース公開されてないのか?
doxygenで目的が達成できるなら、そのソースを取ってくればいいと思うんだが。
0907デフォルトの名無しさんNGNG
age
0908デフォルトの名無しさんNGNG
>>903
結局そうやって集めて何に使うのかね。
目的と手間考えたらアホらしくなるんじゃないかと。
特にC++の場合。
0909sNGNG
ぬおお sagaってる・・・
>908
結構需要はあるとオモーウヨ
VC++のIDEについてるクラスブラウザの
もっと正確で使いやすいのを作りたい。
結構身の程知らずだけど・
反応が少ないのはやっぱりスタンダードなのが無いからかなぁ
とりあえずdoxygenのコードを漁るか・・・
0910sNGNG
http://www.parashift.com/c++-faq-lite/compiler-dependencies.html
FAQだったとは・・・
>[33.10] Is there a yacc-able C++ grammar?
0911デフォルトの名無しさんNGNG
BSD Magazine の「マイ・シェルを書こぷ」期待 age
0912デフォルトの名無しさんNGNG
誰かC++の現在進行形の仕様を満たしたcfrontのオープンソース版を
作って公開してくれ。
0913sNGNG
>912
「cfrontは使い物にならない」との指摘を
外国のどっかの掲示板で受けている人を見かけたヨ
ってかグローバル変数のコンストラクタ関係の所為でC++−>Cの変換が出来ないと
聞いた(確か。
0914デフォルトの名無しさんNGNG
物凄くちっこい86アセンブラ書いたYO!!
命令はmov,add,subだけでAXレジスタonlyで
コメント書けなくてエラーチェックもしてないけど・・・(w
結論=使えない俺
0915デフォルトの名無しさんNGNG
次は jmp $+n jz $+n だ!
0916デフォルトの名無しさんNGNG
>>913
c++のプログラムエントリをcのそれにそのままマップするとそうなるけど、
cのプログラムエントリでコンストラクタを起動するように書けば問題ないだろ?
0917s(スレ違いスマソNGNG
>916う〜確かに
あと例外処理とか・・・が無かった気が?<-cfront
よく覚えてない。
0918デフォルトの名無しさんNGNG
テンプレートとか考えると、そのCコンパイラで
gccをコンパイルしたほうが早い。
0919デフォルトの名無しさんNGNG
実際cfrontが実用化されてる路線で未来が進んでいたら、
どんな環境でもCコンパイラさえあれば済む時代がありえたってのに・・

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

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

例えば、
#include <class1.h>
Class1 c(100);
しか書いてないファイルがあったとして、この初期化
コードをmainから呼ぶようにする方法がない。
0922_NGNG
>>919
cfrontって速度的にどうだったの?
なんかc++→c→asm→elfってコンパイルするのが遅そうな気がするんだけど。
0923デフォルトの名無しさんNGNG
>実際cfrontが実用化されてる路線で未来が進んでいたら、
>どんな環境でもCコンパイラさえあれば済む時代がありえたってのに・・

なぜgccをつかわないのですか?
0924デフォルトの名無しさんNGNG
>>921
c++って中間ファイル(*.o)を吐き出すのも仕様に含まれていたっけ?
そうでないなら、その機能を省略して、実行ファイルかライブラリ
を直接吐く(1つのcソースにまとめちゃう)仕様にしても問題ないと思うんだけど。
0925デフォルトの名無しさんNGNG
>>924
ライブラリを使うには、いちいちソースからコンパイルし直すわけ?
開発中に1行なおしたら全部ビルドし直す?
そんな不便なもの誰が使う?
0926デフォルトの名無しさんNGNG
>>922
その意味でも遅いし native コンパイラでないと使えない最適化手法がある
から、オブジェクトコードの質も悪い。
0927デフォルトの名無しさんNGNG
>>925
そら、そうだが。
cfrontで完全なc++は一応実現できるんじゃないかってことだ
0928デフォルトの名無しさんNGNG
可能だろうな。
もしそうなってたらC++の普及には逆効果だったろうけど。
0929デフォルトの名無しさんNGNG
例外は無理だろ
0930デフォルトの名無しさんNGNG
例外もできるんじゃないか?
longjmp使って。
0931919NGNG
いや、cfrontの方向で進んでいたら、テンプレートやらとはまた違った
発想とかも出てきてたんじゃないかって事なんだけど。
今のC++と同じものをめざすって意味じゃないよ。
速度にしたってインクリメンタルコンパイルとかあるじゃないか。
おまえら、もっと想像力を働かせろ!
0932デフォルトの名無しさんNGNG
>>930
スタック巻き戻し(ローカル変数のデストラクタ呼び出し)はどうするんだ?

PC (プログラムカウンタ) とデストラクタを呼び出す変数の対応表を記録しておく
のが一般的だが、その手法って C コンパイラを介すと使えんよな。
0933デフォルトの名無しさんNGNG
>>932
スタックをスキャンしてヒープにコピー。
0934デフォルトの名無しさんNGNG
>>932
ローカルなデストラクタ呼び出しが必要なところで必ず
setjmpしておき、throw時にはそのチェーンを1つずつたどって
デストラクタを呼び出していけば良いんでは。

あるいは、PCのかわりに「位置ID」整数をコンパイラが割り当てて
(文字列でも良いけど)、それと変数の対応表を作っておく。
実行時には位置IDを自分で作ったスタックに積むか、チェーンにする。
0935デフォルトの名無しさんNGNG
>>934
> 実行時には位置IDを自分で作ったスタックに積むか、チェーンにする。
それは、さすがにパフォーマンスに与える影響がクリティカルな気が。
0936デフォルトの名無しさんNGNG
>>935
「遅くても良いからとにかく実現できるか」という文脈だから…
0937デフォルトの名無しさんNGNG
>>921
>Class1 c(100);
>しか書いてないファイルがあったとして、この初期化
うーん、そんなのプリプロセス段階で
mainに写し書いちゃえばいいんでは?
デバッガで挙動が違うって文句は来そうだけど。
そういう仕様です、でいいじゃん。

>>932
オブジェクトかブロック毎に隠しリンクでも持たせておいて、
スタック巻き戻しをする前に例外をキャッチするところまで
デストラクタ関数を起動する。だめ?
0938デフォルトの名無しさんNGNG
(うお、ageやがった。)

>>937

>うーん、そんなのプリプロセス段階で
>mainに写し書いちゃえばいいんでは?

だから分割コンパイルは無理だよね?という話。
それをあきらめればできるってのは分かった。

>オブジェクトかブロック毎に隠しリンクでも持たせておいて、
>スタック巻き戻しをする前に例外をキャッチするところまで
>デストラクタ関数を起動する。だめ?

>>934 とどう違うの?
0939937NGNG
どうやらがいしゅつだったようですね。
0940デフォルトの名無しさんNGNG
>>938
> だから分割コンパイルは無理だよね?という話。
オリジナルの cfront は nm (オブジェクトファイルからシンボル情報を抽出する
コマンド) を使ってシンボル情報を抽出、その情報を使って非ローカルオブジェ
クトのコンストラクタを走らせるコードを生成してたんじゃかった?
0941デフォルトの名無しさんNGNG
えーっと、ファイルごとの初期化ルーチンを
__ファイル名_init()
とかの名前にしておいて、それを呼び出すとか?

Unix依存だがそれなら可能かな。
0942デフォルトの名無しさんNGNG
>>941
それならnmなんていらないじゃん。
標準的なCでできるってことだね。
0943デフォルトの名無しさんNGNG
>>942
いや >>941 の方法だと出来ないでしょ。
0944デフォルトの名無しさんNGNG
>>943
なぜ?
ファイルがリネームされたときとかの話?
0945デフォルトの名無しさんNGNG
分割コンパイルだと、どのモジュールを利用するか特定できないから、
スタートアップルーチンを走らせる手段がない。
0946デフォルトの名無しさんNGNG
?リンク時には分かるよね?
その時にスタートアップルーチンを動的に
作れば、っていう話だと思っていたのだが。
0947デフォルトの名無しさんNGNG
>>944
ライブラリも。
0948デフォルトの名無しさんNGNG
>>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()の中で、そういうやつがいなくなるまで繰り返し呼ぶ。
0949房々NGNG
デバッグでeaxが使えないのは何故なんでふか?
0950デフォルトの名無しさんNGNG
ロボ鉄
0951房々NGNG
>>949
お返事ありがとうございます m(..)m
そ、そういうことだったのですか。
0952デフォルトの名無しさんNGNG
ワケワカラン
0953デフォルトの名無しさんNGNG
ワラタ
GW厨万歳
0954デフォルトの名無しさんNGNG
次スレテンプレ用意 >>960
次スレ立てろ >> 961
0955デフォルトの名無しさんNGNG
もう少し・・・・
もう少しなんだ・・・・
2chよ!私は帰ってきた〜!!
0956デフォルトの名無しさんNGNG
お前らこの本よみましたか?
http://www.cs.princeton.edu/~appel/modern/java/
http://www.cs.princeton.edu/~appel/modern/ml/

http://www.cs.princeton.edu/~appel/modern/c/
0957デフォルトの名無しさんNGNG
>>956
ML版がメインでCとJavaは誤植だらけという噂を聞いたので
ML版を読んだよ。ML版については、とってもよかった。Java
版とC版の真実は知らない。
0958デフォルトの名無しさんNGNG
>>957
MLの日本語版ってあるの?
0959デフォルトの名無しさんNGNG
次の人、ヨロシク
0960デフォルトの名無しさんNGNG
スタックマシンからレジスタマシンへ命令の変換は簡単に出来るけど、
その逆って出来ないんですか?
0961デフォルトの名無しさんNGNG
>>960 非効率なだけで 出来ない訳じゃないだろ
0962デフォルトの名無しさんNGNG
>>960
もちろんできるよ。

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

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

徹夜明けなんで来てます来てます、ピピピ(´∀`;)
0964デフォルトの名無しさんNGNG
寝るのも仕事のうちだぞ
0965914NGNG
1000に成るまで密かに頑張りまっす。
今日はmovのword ptr とbyte ptr修飾子?もサポーテッド、OK!
0966デフォルトの名無しさんNGNG
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というグラマーを作らないといけないのですが、どのようにして
つくったらいいでしょうか?ヒントだけでもいいので教えてください。
お願いします。
0967デフォルトの名無しさんNGNG
そろそろ次のスレ立てるか・・・

てことで、>>968 よろしく
0968デフォルトの名無しさんNGNG
>>967
>そろそろ次のスレ立てるか・・・
言ーだしっぺの法則つーことで、あとよろしく。
0969967NGNG
はい。がんばります。
つか、残り31レスどうしようか・・・
0970デフォルトの名無しさんNGNG
ねぇ
アセンブラマクロのdbはどうやって実装しようか?
0971デフォルトの名無しさんNGNG
お好きなように
0972デフォルトの名無しさんNGNG
>>970
そんなところで躓くなよ
0973967NGNG
『コンパイラ・スクリプトエンジン』 相談室 2
http://pc.2ch.net/test/read.cgi/tech/1021136715/

立てたよ。疲れた。
以後、上のスレでお願いします。
0974KOKUYONGNG
質問!!member関数を、第2引数のリストの深いレベルまで
第1引数を探索して取り除くように拡張した関数はどうやって
作ればいいんですか?
あと、二重以上のリストを第一引数として受け取り、
深さ1のリストとして返す関数はどうすればいいんですか?
動作例)(makeflat '(a(b c)((d(e)f)g)h))  
    →(a b c d e f g)
0975デフォルトの名無しさんNGNG
マルチはともかくなぜこのスレに書いたのか分からん・・・
0976デフォルトの名無しさんNGNG
コソーリ 1000 でも狙うか。
途中で DAT オチするのがオチかもしれんが。
0977デフォルトの名無しさんNGNG
LALR(1)
0978デフォルトの名無しさんNGNG
文脈自由文法
0979デフォルトの名無しさんNGNG
979
0980デフォルトの名無しさんNGNG
980
0981デフォルトの名無しさんNGNG
ふうむ
0982デフォルトの名無しさんNGNG
982?
0983デフォルトの名無しさんNGNG
1000!
0984 NGNG
09851000NGNG
0986 NGNG
0987デフォルトの名無しさんNGNG
0988デフォルトの名無しさんNGNG
1000!
0989デフォルトの名無しさんNGNG
0990デフォルトの名無しさんNGNG
あとはすきにして
0991デフォルトの名無しさんNGNG
1
0992デフォルトの名無しさんNGNG
む?
0993デフォルトの名無しさんNGNG
ん?
0994デフォルトの名無しさんNGNG
1000
0995デフォルトの名無しさんNGNG
0996デフォルトの名無しさんNGNG
0997デフォルトの名無しさんNGNG
  1
0998 NGNG
  0
0999デフォルトの名無しさんNGNG
10001000NGNG
さあ、はじめりです。
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。