1 :
デフォルトの名無しさん :
03/11/29 15:59
なお、byaccはどこへリンクするか迷ったので、日和って省いてあります。
ソース読んで学習する用途に、って事でkmyaccなんかも入れて良かったかも。
Compilers and Compiler Generators も迷い迷って結局入れてません。
(
http://www.scifac.ru.ac.za/compilers/ )
spiritの位置も少し迷ったのですが、一応パーサジェネレータ「等」って事で。
リンクは一応チェックしたつもりですが、間違ってても勘弁して下さい。
以上。
>>1 >(dat落ち)
この部分はいらなかったな。失敗。
12 :
デフォルトの名無しさん :03/11/29 16:31
12
13 :
デフォルトの名無しさん :03/11/29 19:04
糞スレさらしあげ
14 :
デフォルトの名無しさん :03/11/29 22:11
__.ノ) ( _( (.___.) || l || l、-‐ー、ー‐- 、 ,.|| l ヽ ,、-‐ー、 iヽ ./ , i `、 l::::::i .,' / _,、-‐つ l l ',._,、i l::::::l i ,' / ,、-'"ノ ,'i l ! l ヽ::l l:::r.'lr/ /ノリ リノi l l iノヽ レゝ/ / ニ・ニ=lノノリ、 i / ,、-' . . ll|l i ll,、-'´ / /、 ヽフ ノ lノ | ま、また 立てやがった・・・ ,-' ./l lノ. `‐、.___ ,、-'´l |l ,、-'´ /_rl .lヽ``‐、 ,-'"i、l l l ,、-'i / ̄ l lヽ\ i l ノ l l l i l / i .l lヽ r-、 ノ l lヽ、 l .l / i 丶 |l `‐/ ゝソ\/ ノ 7、 !、 ヽ / ヽ ヽ / / ヽ_ ノ i / i ヽ ``/ ヽ, / / \ l l  ̄l !/ ヽ l
>>1 サンクス、自分も立てようかと思ってたんだけど、リンクが揃えられなくて・・・
しかし、いきなりの素敵な洗礼ですな。
>>13-14 殆どこの板を使った事のないド素人はすっこんでろっつーの
(;´Д`)ハァハァ
ハウディー!(^O^*)
,,、、、,,,r‐--、、,,_ ,、‐'''r." `゙ー、 ,:'.:::::,イ". .: ...:.::i_;、、、;;_;|; ゙L _,,.-‐''ノ ヽ;、‐"´,,,.........,,__`ヽ:i `, ,、‐'''""´,,、-‐f .:.::/,:-'"..:..::::::::::::::.゛:‐、',i.,' く-‐''''ゞ"´, .:;;;;゙.、..:.:::/´".,.::./.:;ィ:::;;,イ:;':::::;::...'、ヽ. . `'ヽ、 . :ー-ァ;;;;;;;ト'":;;|::;/:;.'::::;;;'.';;ィ;':;/i::::;;i;:::;;:,';.`;"''ァ ゙''‐-、 z-;::l:.:::::;;!、:';;'_;;.'__;;:'゙/"' .l:::;;ハ.;;':l;::l,、‐'" |..::`'''‐i..::::;;;|/ィ ' =-、.,''. l'/、_r';'゙l;r' l::::|:::i:;;| .::::;;l: ,''';:/ ゙ r=''';-!.i/' . !:::l!::ll:;;i .::;;;;l::..'‐-' ,';/゙/;:l:| ',:i.!::!l::;'; :|:;;i:: ..:: :. ..''::,'|;;:|:l '!.';l. ';.l゙、l::;;!、 ,. ,,イi;;,';;' . ゙ '! '!';;l:..゙''‐; 、_,,,、.,;i'.i':/ l:/リ 厂 ';! ̄!トト,ィ_'リ、''_.'' ' ,r.:'´`゙'= 、r'";;';ヘ_〉'';:ヽ':, /.:::.;;.;.;;;;;`、ヽ.:.:::;;ri'ヽ_;,'., 'Y':, /..:.;.;.;.;;;;.:.;;;;`、.'l''"´!';__;!/ .人 ', ,'...:.:;..;;;;_;;;-‐‐;,' '-‐' ..:r' ゙ヽ', ', '.;-‐‐'".:;;.;.;.;;;;ヽ. ‐‐-'',':.. .::.:ノ:..ノ `"'''‐、.:;.;...;;;:.;;',::. ./`、;,_;;r'"''゙゙i ヽ.:;;.;.;;;;;;l/;:.:.:;.;;;;、'l;;:;;.;.;:.',
>>19 やべ、前スレ最後に出た一番重要な奴を忘れてた。
しかし高いなあ……。
あと書き忘れましたが、
beroさんとこの機械翻訳ベースの資料は軒並み消えてしまったので
NASM Manualのリンク先をFreeDOSのぐりぽんさんの所へ変えています。
まあ気合い入れて英語読めば問題無いんですが。
Compilers Principles, Techniques, and Tools すなわち、通称「赤ドラゴンブック」でコンパイラのこと一般を勉強しているものです。 最近、「ドラゴンブックも内容が古くなってきた」という意見を耳にしたのですが、 どこらへんが古くなってきているのか教えて下さい。
>>21 1985年の本ですから古くなるのも無理はないでしょう。
あの本以降に発展した技術には、思いつくものだけでも
SSA
CDG/PDG
JIT
関数型言語の実現法
などがあります。しかし入門用としては今でも十分な内容だと思います。
dragon bookが終ったら、次は最適化に的を絞った本を読めばいいでしょう。
日本語なら
>>8 の中田先生の本あたりでしょうか。
新スレ乙。 21世紀ドラゴンブックまだコネー。
25 :
デフォルトの名無しさん :03/12/04 21:17
洩れはタイガースフアンだ! というのはおいといてw bisonとも限らないのですが、単項の負を処理するときに、 %left NEG ... | '-' exp %prec NEG {...} とよく書きますけど、厳密には %left でなくて %right じゃないでしょうか? たとえば、---5というのは、普通-(-(-5))だと思うんですが... どこかおかしいですか???
>>25 単項演算子に優先順位指定は必要ないのでは?
文法の書き方にもよるけど、普通は
unary_expr:
postfix_expr
| '*' unary_expr
| '&' unary_expr
| '-' unary_expr
| '~' unary_expr
| '!' unary_expr
...
てな感じでうまく行きますよ。
>>26 情報ありがとうございます。
でも、そうなんですか、知りませんでした。
いま、アスキーのbison入門という本を見ているですが、
どこにもそんな記述がありませんでした。
ふう〜、奥が深いですね。
ちなみに、
%right '='
%left '+' '-'
%left '*' '/'
%left NEG → 単項-用です。
%right '^'
みたいに、指定しています。
28 :
デフォルトの名無しさん :03/12/07 22:11
やっぱ、%rightが正解かなぁ? %left で ---5 の場合だと、(--) を処理せんあかんから、
ahoの発売は来年に持ち越しか …知らない人がこのレスを見たら意味不明だろうな
30 :
デフォルトの名無しさん :03/12/08 20:00
%left と %right の結果をbisonで比べてみても変化なし、 どちらも、正しく ---5 を処理できる。 で、生成されたcソースを見てみたが、なんと(ry
>>27 %left/%rightは同じ順位の演算子がならんでいるときに生じるshift/reduce
conflictを解決するためのもの。単項演算子が前置のみなら、そもそも
conflict はおきないので、どちらでもかまわないです。
前置と後置の両方があるときは、%left/%rightが効いてきます。
たとえば、~という演算子が前置にも後置にも使えるような構文を考えます。
expr : '~' expr | expr '~'
このとき、%left '~' なら、~x~は(~x)~と解釈され、%rightなら~(x~)と解釈
されます。
>>33 なるほど!明解な回答をありがとうございました。
ちなみに、それぞれに指定したbisonソースの変換出力(C出力)
を比べてみましたが、両者は実質的に同じものでした。
重ねてお礼を申し上げます。
ありがとうございました。
***
ところで、rubyのソースコードについての書籍があると聞きましたが、
これはインタプリター等の理解&構築にはよい本でしょうか?
ちょっと高めですが、参考になるのなら、と思っています。
rubyのってもうすぐWeb上でも全公開じゃなかったっけ? 確か初めの章だけは既に公開されてるよね。
>>34 あんなのに金払う意味無いって。
どうしても読みたいなら図書館行ってこい。
>>36 煽りじゃなく、できれば理由を教えてくれ。
おれの場合、あの本読んでいて苛々するんだが、理由を明確に
説明できるほどのスキルがないんで、他の人の意見も聞きたい。
38 :
デフォルトの名無しさん :03/12/10 23:26
>>35 なるほど、HPみたら、そんな感じに宣言されてますね。
しかも、この12月でほぼ1年たつ模様。
ちょっと期待。
全文公開は延期してもらってもかまわないから、青木さんにはオライリーの lex & yacc に変わるような本を書いてほしい。
>>8 佐々 政孝さんの本は出版が少し古いんですね。
42 :
デフォルトの名無しさん :03/12/11 00:34
>>39 全部コンパイラ系の本、
rubyはインタプリター
>>42 コンパイラはネイティブコードを生成することが多くて、
インタプリタはしないことが多いくらいで
やることは大体一緒だと思うけど。
44 :
デフォルトの名無しさん :03/12/11 01:23
インタプリタはしないことが多いんじゃなくてしないだろ。
Java VM の HotSpot とか。
47 :
デフォルトの名無しさん :03/12/12 20:24
はっきりいって全然ちがう。(コンパイラとインタプリタ) 同じように使えるのは、字句解析器ぐらいか?
構文解析も意味解析も共通なはずだが。 なんで字句解析だけ?
>>47 C言語にはコンパイラとインタプリタが存在します。
本当に、同じように使えるのは字句解析だけだと思いますか?
構文木作るまでは大方一緒な気がする
釣れた?
LISPはいきなり構文木が手に入る
>>49 コンパイラとインタプリタを備えた C の処理系なんてあったっけ?
大抵どっちかだから、共通している部分が多い事の事例にならないような。
こんな事が出来たら嬉しい人も多いだろうに。
#! /bin/env gcc <-- shbang で呼び出せる
//load Xlib <-- ライブラリのロードはコメント文で ==> コンパイラに通す時も透過的
#include <X11/Xlib.h>
int main() {
// 以下略
// 以上妄想
>コンパイラとインタプリタを備えた C の処理系なんてあったっけ? 作らない(作っても意味無い)だけだろ
>>54 だから、共通している部分が多い事の事例にならないだろ。
>>55 同様な構文を持つ言語のインタプリタとコンパイラで
構文解析が共通化できない理由は何ですか?
>>56 そこには異論は無いです。細かい突っ込みスマソ。
Dylan や OCAML や Haskell はインタプリタとコンパイラの両方持ってるね。 Common Lisp もだけど。
MLの源流はlispでねーぞ
っつーかDylanだけじゃん
>>62 SchemeがAlgolから受け継いでるのって何?
>>63 lexical scopeじゃないかな?
65 :
デフォルトの名無しさん :03/12/13 19:22
構文解析器は、理論上はインタプリターやコンパイラに無関係に 整理可能であるが、現実問題としては、そうはならないということだろう。
66 :
デフォルトの名無しさん :03/12/14 23:36
きょう、rubyのソース開設本みつけたけど、 高いなぁ〜と感じた。 (2000円までだったら、速攻でかったんだけど) とりあえず、公開待ちます。 貧乏人で、スマソ
>>66 2000 円で買えるコンピューター書籍はそれほどないと思うが?
なにが売ってても買わないの?
68 :
デフォルトの名無しさん :03/12/15 00:03
bison本やlex本(GNUプレス)は みんな安いよw
>>68 それってinfoで全文ローカルで読めるやつのこと?
>>71 infoは使ってないのでよくわからんが、そうかもしれない。
実はもれも、本文はどこかで(英語???)読んだ記憶があった。
でも、手元に書籍であると、またちがうんだな、これが!
74 :
デフォルトの名無しさん :03/12/15 22:49
yacc/lex使ってSQLパーサ作りたいんだけど、挑戦したことあるひといますか?
lex & yacc のサンプルがそのままSQLパーサだったような記憶。
>>75 そうそうあったあった。どこかにサンプルコード落ちてたよ。
英語版だけど
78 :
デフォルトの名無しさん :03/12/15 23:47
>>73 flexは読みやすかったけど、bisonは読みにくかった。
やはり、難しいからですかね???
79 :
デフォルトの名無しさん :03/12/15 23:58
すいません、ふと疑問に思ったんですけど、 正直、このスレってとっても (良く言えば)→高度&専門的 (悪く言えば)→難しいばっかりで、地味&マイナー な領域ですよね? みなさん、本職は何をされているんでしょうか? やはり、プロのコンパイラorスクリプト屋さんなんでしょうか?
>>79 プロのコンパイラ屋(コンパイラだけ作っててメシが喰える人)ってかなり少な
いと思う。(OS屋はもっと少ないけど。)
他の仕事でミニ言語が必要になったので書いてるとか、大学で論文書くために
作ったとか、あるいは趣味でやってる人がほとんどじゃないでしょうか。
僕はたまたま今仕事でコンパイラを書いていますが、100%のコンパイラ屋では
ありません。
出来合いのエンジンを利用する場合でも、実装を知っていないと どうにもならんからね。
>>75 、76 そのサンプルってどこにありますか?
もし知っていたら教えてください。
オライリーの yacc/lex 本。
おおおー。なるほど。早速買ってみようと思います。
ところでネットで見つけようとしても見つからないですね。 PostgreSQLとかのソースを見ればいいのかしらん。
90 :
デフォルトの名無しさん :03/12/17 22:16
>>80 おお〜、すごい!
本職&プロですか!
ちなみに、どんなコンパイラ書いてるんですか?
差し支えない程度で結構ですので、
俺は80氏じゃないけれど、組み込み系に利用するためのコンパイラを書いたことがある。 独自のインストラクションセットを吐き出すCコンパイラだけど、 80氏と同じく本職じゃないために、とりあえず動くコンパイラを作っただけ。 最適化とかは必要最低限くらいにしか要求されていなかったし。 俺はフリーのプログラマだけど、 お金をもらえてこういう楽しい仕事が出来るときが一番嬉しいね。
92 :
デフォルトの名無しさん :03/12/18 00:19
>>91 おお〜、「フリーのプログラマ」で、しかもコンパイラまで
書けるのですか!
なんか括弧イイ!ですねぇ〜!
わたしも、フリーではあるのですが、フリーはフリーでも(ry
ASICとかFPGA屋さんもいるかも知れず。
>>90 >>92 コンパイラ書くのはそんなに難しくないよ。
漏れも大学や専門学校でプログラム勉強したことなんか一度もないけど、
コンパイラを一回書いたことがある。
そのときのネタは、スクリプトを解釈して整数、浮動小数、文字列の計算をしながら、
その結果を GP-IB (RS232 の遠い親戚みたいなもの) に送り込むヤツね。
キーワードは Bison/Flex (またはYacc/Lex)。
これらのツールが食べられるような特殊な書式さえ覚えれば、
サルでも※簡※単※な※コンパイラなら書ける。
# ただし、サルにはGCCは書けない。
簡単なコンパイラ書くぐらいならGCCの移植作法を覚える方が まだ ※簡※単※?
簡単なコンパイラ書く方が※簡※単※
※強※調※し※た※い※語※句※を※※※で※強※調※す※る※ス※レ※は※こ※こ※で※す※か※
*** おおっと テレポーター ***
>>95 UNIX USERのGCCプログラミング工房とか読んでると
すんげーキツそうなんですが。
誰かが移植してくれるのを待つのが一番簡単。
>>98 年 * 寄 * り * は * カ * エ * レ * !
*** いしのなかにいる! ***
>>103 俺がさんざん書こうと思って我慢してたのに(w
106 :
デフォルトの名無しさん :03/12/20 18:08
VC++でyaccとlexを使ってexeを作りたいのですが、 うまくいきません。みなさんはどうやってやっていますか?
>>106 yaccとlexの出力ファイルをコンパイルして使ってる。
108 :
デフォルトの名無しさん :03/12/20 21:07
なんでlex/yaccつかうひつようあるの? win系で?
111 :
デフォルトの名無しさん :03/12/20 21:14
まともに使えるスクリプト言語って、なんでこんなに少ないんでしょうね?
>111 マジできくが、それじゃどんなスクリプトが欲しい?
>>111 では、使えないと思ったスクリプト言語を理由と共に列挙してみよ
perl ウンコ
Perlが一番速いんじゃない?汎用的なスクリプト言語の中では。 ああいう方向もありだと思うよ。
速くはないだろperlは、早いけど
インタプリタを初めてつくりたい人に「これをよめ」という本はありますか? 洋書・和書は問いません。 上の方のレスを見るとコンパイラとインタプリタは少し違うようなので、、、
ホントーに初めてで右も左もわからないならCマガジン2000年5月号がお薦め。
>>120 bison, flex のドキュメント。
gcc の *.y ファイル。
字句解析は正規表現のようにした方がいいですか・・・ ハッシュにして48個(64個)を作ってそれぞれをチャインで 繋いで予約語と関数名と変数等を検索して方が早くないですか・・・
>>124 そう思うならそうすればいい。
っていうかそれでいい。
なにか問題でも?
パール:記述方法が暗号的すぎ
オーク:使用目的が限定的すぎ
るび〜:モデル化が変態的すぎ
>>122 もう手にはいらんのとちゃう?
>>126 バックナンバー情報をチェックしたら
2000年のは無いみたいだね。
だが、大学の図書館とかなら多分ある。
漏れの母校の資料室にもあった。
っていうか俺んちの図書室にもある。
公的な図書館なら申請すれば
他の図書館から取り寄せてくれたりもする。
絶望的なほどではない。
でも、そこまでするなら本屋で他の本見繕った方がいい罠。
128 :
デフォルトの名無しさん :03/12/23 02:32
>>124 自分もハッシュです。
256でチェインしてます。
記号の"{"ごとにハッシュ表を新たに作り、
新しいハッシュ表から古い方に向かって調べます。
グローバル用は別に1個作り、
関数を呼ぶ場合にも、全く別のセットを作ります。
(じゃないと、下部の関数から上位の変数がみえたりしちゃいますからね)
ちなみに、ハッシュを使わずに作った物は、
6万語ぐらいの定義、10万回くらいの参照、マクロ展開があるファイルのコンパイルに10分、
ハッシュを使った物は30秒ぐらいでした。
>>124 今まではハッシュだったけど、
最近、キーワードだけswitch文の羅列で分別するようにしてみた。
もちろん手書きでは大変なので、perlで簡単なプリプロセッサを書いて
そいつに展開させてる。
>>127 > 公的な図書館なら申請すれば
> 他の図書館から取り寄せてくれたりもする。
こんど近所の図書館でも聞いてみよ。
千葉県だけど取り寄せてもらえるかな、、、
131 :
>>124 :03/12/23 15:53
単純にflexじゃあかんの?
132 :
デフォルトの名無しさん :03/12/23 17:07
Cコンパイラのソースで読みやすいの教えろ
Kさん 好循環 Aさん 悪循環 (健康体) (喘息) 1.(神が喘息であるかないかを決める) 2.K 喘息でない人 A 喘息の人は は体力がある 体力がなくなる 3.K A 行動力、 五感(嗅覚)が鈍り感性が変化する 4.K&P 神は異常な感性の人間は本来人に迷惑をかけ るから外に出てはいけないと思っている。 5.K 変化なし A アトピーになる 6.K 正常な感性 A 外に出なくなりさらに異常な感性になる 7.K 正常な人間 A 異常な人間(レッテル)
8.K&A 死 9.K&A 来世 10.K&A 神は異常な人間は人に迷惑をかけるので行動 を抑制する必要があると思っている。 11.K&A 神が喘息であるかないかを決める 12.K 喘息でない A 喘息である 13.K&A 1.に戻る これは事実。広めようぜ 解決法:体力をつけると感覚が正常に戻り、 アトピーも快癒に向かう。 目安としてグランドを10週くらい。 あとはウォーキング、なるべく長い間歩く (ウインドーショッピングや散歩、五時間ぐらいを目安)。 無論最初は、無理なので徐々に体を慣らしていくといい 鼻に変な違和感があったり、頭がぼおっとする時の解決法。 口をつぐんだまま、口の中で空間を作る、すると口の中に空気がたまるのでそれを吐き出す。無論息が苦しくなったら、呼吸をして良い。 これを、100回くらい。
136 :
デフォルトの名無しさん :03/12/23 18:28
最近のスクリプト言語って、オブジェクト指向ばっかりね。
137 :
デフォルトの名無しさん :03/12/23 19:16
>>132 Bruce evans C Compiler (BCC) がおすすめ
16bitコード生成の最適化無しだけど、ソース分量も多くないし
再帰下降なんでyaccとかも使ってない
作者のBruce EvansはMinix386パッチ開発などで知られる
一応ELKSのコンパイルにも使用されている
えー・・・
139 :
デフォルトの名無しさん :03/12/23 22:18
>>137 YACC使ってるほうが、圧倒的にソース簡単なんじゃない?
なんで、勉強には不向きと思われ。
140 :
デフォルトの名無しさん :03/12/23 22:19
C+AWKみたなスクリプト言語ありますか?
142 :
デフォルトの名無しさん :03/12/23 23:08
☆チン マチクタヒ゛レタ〜 マチクタヒ゛レタ〜 ☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヽ ___\(\・∀・) < ルビ〜ソ〜ス本はマダ〜〜〜? \_/⊂ ⊂_ ) \_____________ / ̄ ̄ ̄ ̄ ̄ ̄/| | ̄ ̄ ̄ ̄ ̄ ̄ ̄| | | 愛媛みかん |/
143 :
デフォルトの名無しさん :03/12/23 23:14
Appel本の java 版のソースは ML の移植と聞いたのですが、実際にそうなのですか? 読んだ方の意見を聞いてみたのですが。
コンパイラって、入出力なんかのハードウェアに近いレイヤとか、FFI 等で自分の環境外に アクセスする部分ってどうなってるのかしらん。インタープリタだと外のライブラリ使えば 良さそうなんだけど。
>>146 出力したオブジェクトにAPI呼ぶライブラリをリンクする。
あるいはAPIを呼ぶコードを吐く。
別に疑問なところはないとおもいますが。
>>147 レスどうもありがとうございます。
冬休みになったらコンパイラの勉強をしたいなと思ってるのですが、イマイチ基本的な
事から分かっていないのでダメですね。リンカーの本を読めばこの辺も理解出来るの
かなぁ。
149 :
デフォルトの名無しさん :03/12/25 01:57
知合いの方はAppel本のJava版はJavaじゃない,とまでおっしゃってました.MLからのひどい直訳で,Javaとしては(コンパイルの通らない)誤りも多々あるとか?私は実際どうなのかが分かる人間ではありませんが.
>>150 C は Java のひどい移植で、、、と書評で書いてあったのだけど、 ML を Java に移した時点で
すでに糞コードなんですか?
ML で勉強するのはちょっときついなぁ、、、
つーかサンプルコードなんてどうでもいいだろ。 個人的には、読みやすい疑似コードならあっても損ではないが。
153 :
デフォルトの名無しさん :03/12/25 18:56
>>144 つまり、c&awkとは、ぜんぜん違うということ。
155 :
デフォルトの名無しさん :03/12/25 23:59
Windowsで使えるyaccやlex、texはありませんか?
texは知らんがyacc/lexはcygwinのが使えるんでねえの?
157 :
デフォルトの名無しさん :03/12/26 08:09
>>156 cygwinのyacc/lexが吐き出すCをVC++が食べてくれないことを
>>155 は恐れている。
>>155 上で
>>156 や
>>159 が言ってる他にも、yacc互換ツールにkmyaccってのがある。
Rubyのコンパイルにkmyaccを使うと実行ファイルが少し小さくなっていい感じ。
>>156 Texも余裕でいろんなバージョンがごろごろしてるよ。
Rubyの実行ファイルが少し小さくなったら何かいいことあるんですか?
163 :
デフォルトの名無しさん :03/12/27 01:14
レベル低いねえ、ここ 処理系開発に携わった者としては、見ていて恥ずかしいよ
164 :
デフォルトの名無しさん :03/12/27 02:23
まともなプロは、他のプロの半端な仕事をバカにすることはあっても、 素人をバカにすることはない。 素人をバカにするのは、プロ気取りの汚らしいチンピラである。
もう冬休みか...
失業者かもよ。「携わった」と、過去形で書いているし。
漏れの記憶では確かVCはbison/flexが吐き出すCは食べてくれるがbison++が吐き出すC++は食べられなかったような
168 :
デフォルトの名無しさん :03/12/27 11:56
flex入門(ASCII)には、 ”スキャナがあるテキストにマッチするために「逆行」しなければならない ことを、バックトラッキングといいます。” とあるのですが、ここでいう「逆行」とは具体的にはどういった状態を指す のでしょうか?
一度見たトコをもう一度見る。
170 :
デフォルトの名無しさん :03/12/28 11:31
コード例から自動で言語処理系作れないかな?
171 :
デフォルトの名無しさん :03/12/28 11:43
>>170 ディスプレイに映るコードを眺めながら、博士はコーヒーを飲んでいた。
彼のお気に入りの陶器から口を離して、
>>170 の質問に答える。
「もし君が全てのトークンの機能と連鎖可能性を記述するのなら、もちろん可能だろう。」
博士は私のほうを向いて続けた。
「しかし、それはlexとyaccを使い実装と正規表現を記述するのと、どう違うのかね?」
関数の合成とオプティマイズまでを実装した処理系ってなんか無いですか? もちろんソース公開されてる奴で。 たとえば、文字コード変換機とか、音声ファイルのコンバータなど 入力と出力パターンがそれぞれ複数あるとき、 すべてのパターンのコードを記述するのはむだなので 中間形式にいったん変換してから再変換をかけることになると思うのですが 関数合成で一度にできるようにならないかと。
>>171 妙に納得させられてしまいました。
不完全な記述でもある程度の結果が得られて
(現存する記述と意味の関係から自動推測して処理系を構築するとか?)、
さらに進展性が望めるシステムもあったらどうなるのかちょっと興味があったのです...
>「しかし、それはlexとyaccを使い実装と正規表現を記述するのと、どう違うのかね?」
自分はlex(flex),yacc(bison)を全然使いこなせてないんで
そんなのがあったら楽ができそうだなと思った次第です。(スイマセン)
>>170 例えば、
main {
print "Hello World!"
}
ってのから言語処理系を作れないかということですよね?
でも、それって、XMLのデータだけ見て意味づけしろ、というのと同じで、
意味情報が含まれていないから出来ないのでは?
>>140 私はそのまま awk を使ってます.
仕事柄 C/C++ とその他のスクリプト言語の使用比率が 9:1 くらいなので,
他の言語がなかなか覚えられなくて. C に似てて仕様的にも単純なものってことで
awk 使ってますが, awk 使うくらいならそのまま C でいいんじゃないかと最近思いました ...
関係ない独り言ですみません.
あ
179 :
デフォルトの名無しさん :03/12/28 19:43
>>175 AWKってフィルタ指向が強すぎますよねぇ?
それさえなければ、最強なんだけど...
ゲームで使用するためのスクリプト言語を解説した 洋書を知りませんか? Game Scripting 何とか という名前だったような・・・
>>181 こんなのあったんだ。
GameProgrammingWith PYTHON, LUA, AND RUBYより、
そっちにスベキダッタ・・・
ワリイ ゲ製作板と間違えた
184 :
デフォルトの名無しさん :03/12/30 19:39
bison は、記述ファイルから、その生成パーサの動作を正しく把握するのがつかれる。 というか、ほとんど無理?
186 :
デフォルトの名無しさん :03/12/31 01:19
でも、把握せんと動作がつかめんでしょ?
>>186 把握しても動作つかめんから心配するな。
再帰上昇型のパーサーは、慣れた人間にとっても予期せぬ動作をすることが
ままある。手っ取り早くすませたいなら yacc を使って、そうではなくエラー処理
などキッチリやりたければ、手で再帰下降型のパーサ書いた方が良いよ。
パーサーのテストどうやるの?
191 :
デフォルトの名無しさん :03/12/31 16:16
>>188 (再帰上昇型/再帰下降型って何ですか?)
bison は再帰上昇型でいいのですか?
192 :
デフォルトの名無しさん :03/12/31 16:17
>>188 (再帰上昇型/再帰下降型って何ですか?)
bison は再帰上昇型でいいのですか?
>>191 ぐぐれ。キーワードはこんな感じで。
構文解析 上昇 下降
194 :
デフォルトの名無しさん :03/12/31 19:45
195 :
デフォルトの名無しさん :03/12/31 22:41
>>188 > 再帰上昇型のパーサーは、慣れた人間にとっても予期せぬ動作をすることが
> ままある。
これって、本当ですか?
196 :
デフォルトの名無しさん :03/12/31 22:51
>>195 実装がへぼいか、定義がへぼいときは、本当です。
>>195 本当。
正常なトークン列を与えたときの動作は予期どおりになるが、異常なトークン列を
与えたときの振る舞いは直感に反することがままある。頑強なエラー・回復処理を
実装したい場合、たとえば
HTML パーサのように、厳密に規格に従ってなくとも受け付けたい
エラー時にそれなりに適切なエラーメッセージを出したい
なんつーばあいには、再帰上昇型は人間の手に余る。
198 :
デフォルトの名無しさん :04/01/01 01:17
>>197 ミジカな例まで出してくれてありがとう!
上昇型は、厳密な言語むきってことですかね?
メリットは、記述が少ないことぐらいですか?
ところで、ふつうのyaccが生成するパーサは再帰上昇型ではないと思うのだが。 (陽にスタックを持ち、表を引いてgotoしまくるだけで、再帰呼びだしはしない) 最近のbisonは再帰上昇型のコードも生成できるの?
201 :
デフォルトの名無しさん :04/01/01 20:54
どうみてもbisonは再帰的だが
>>199 再帰呼び出しと再帰的文法解析を混同してないか?
再帰するためにスタック用意してるんでは?
>>203 そう呼ぶ「流儀もある」というだけの話。
コンパイラ理論に限らず、専門用語は人によって解釈に幅があるのが普通だから、
適当に補って読み書きしとくのが吉だ。
>>203 そういえば思い当たる用語がいくつかある。
素数に1を含めている場合があって、教授の中の人に
「素数の定義のなかに『1以外の』ってあるんですけど」
って聞いたら
「小中高ではそのように教えているようだが学会によって違うし、
必要なら論文の冒頭で定義する。」って言ってた。
それと、以前知り合いに聞いたんだが、
そいつの学科では「逆ポーランド記法」
を「ポーランド記法」って呼んでて、
どうしても明確に区別する必要があるときだけ
前置・後置で分けてるんだそうな。
と、言うわけで構文解析に関する学会もいろいろあるだろうし
それぞれで違う定義だったり定義されてなかったりするの
かも知れない。
206 :
デフォルトの名無しさん :04/01/02 15:56
>>205 それは案外あるね。
ここのコンパイラ&スクリプトだけでなく、全ての千問分野で
そういった傾向があるみたい。
なので、書籍とかでは著者がどういう定義でその用語を使っているかを
把握したうえで理解しないと混乱する時がたまにある。
言い訳にだまされてるだけ
208 :
デフォルトの名無しさん :04/01/02 16:54
アフォか素人
>>204 yaccの生成するパーサを「再帰上昇型」と呼んでいる教科書や文献があったら
教えて欲しいのだが。
僕は見たことがない。googleで検索しても見つからない。
210 :
デフォルトの名無しさん :04/01/02 20:46
しるか!
212 :
デフォルトの名無しさん :04/01/02 23:55
アフォ
213 :
デフォルトの名無しさん :04/01/03 00:16
VBSの解析ソースください。
214 :
デフォルトの名無しさん :04/01/03 01:37
すいません、ちょっとお尋ねしたいんですが、 UNIX Programing Environment に出てくる「電卓hoc(最終形態)」が 行っている処理アプローチは、今のスクリプト言語にも十分通用するも のでしょうか? それとも、今となっては時代遅れのものでしょうか? ここにおられる皆さんは、どう感じられますか?
>>214 時代遅れだと考えるくらい知識や経験があるならやらなくていい。
そうじゃなければ、やっても無駄にはならない。
>>215 そうです。(こんなページも有ったんですね。知りませんでした。)
221 :
デフォルトの名無しさん :04/01/04 16:56
スクリプト言語を設計・実装する場合の一番の難しさって何でしょうね?
>>221 妥協すること。
汎用的だが回りくどい書き方と、特定用途専門で簡単な書き方。
実行時の速度効率と、柔軟性。
メモリ使用効率とスピード。
いろいろいろいろ相反する要素が出てくるので、目標を明確にしておかないと
あれもこれも盛り込んだ挙句に、中途半端で使いにくいスクリプトになりがち。
>>222 思いもよらない視点にビクリ!
あんた、プロ?
>218 LISP処理系作るのは簡単だけど、 Schemeの末尾再帰や継続呼び出しを載せようとすると、 とたんに難しくなるよね。 末尾再帰だけならまだ楽か。
末尾再起も継続も簡単 大変なのはクロージャや継続の実装に必要な 環境の複製の効率化。
226 :
デフォルトの名無しさん :04/01/06 19:01
まぁ、LISPと言ってる時点で(ry
228 :
デフォルトの名無しさん :04/01/06 22:09
LISPで有効に実用化されているプロジェクトってあるのw
アーロン
>>228 Lisp そのものじゃないが、Lisp に極めて近い文法のファイルでデータを保存する
CAD ソフトは見た事あるな。確かに、書くの楽そうだ。
何かちょっと調べてみると、Pure な OO って意味があるのか疑問に感じてきた。 Java みたいにプリミティブを用意した方が効率良さそう。Hybrid 言語マンセー!
232 :
デフォルトの名無しさん :04/01/07 20:27
アホーン
なるほど、これが冬か。
235 :
デフォルトの名無しさん :04/01/11 18:36
Windows上で使えるlexを教えてください。 よろしく
少しは調べる努力をしろ。 以上
>>236 調べたけど見つからなかった。
よろしく、
flex.
>>240 プログラミング言語は満載した機能を特色の第一とするものではない。
あとになって機能の追加が必要と判明するような弱点と制限を取り除いて設計すべきである。
>proglam 頭の程度が知れたな
243 :
デフォルトの名無しさん :04/01/12 02:01
上の方にあった(↑)「UNIXプログラミング環境」に掲載されていた関数 電卓hocですが。 ちょっとしたフロー制御や、ユーザー関数定義等ができることを考えると、 ほぼ、スクリプト言語のコアが出来上がっているとも考えられますが、い かがでしょうか?
>>241 激しく同意。どうもC++系に知識が偏ってるぞ
>>240 のリンク先の
>>1 は。
とりあえず本当にSchemeぐらい齧って欲しいな。
>>244 lisp知りたてのおばかさんですか?
継続とかコードとデータの同一視とか、その辺の動的な事情が適合しない分野もあるだろうに。
lisp的な考え方は切り捨てるべきときがあることも勉強しときなさいな。
>>245 は Lisp を叩くと偉いとでも思っているのかな?
それとも継続って言ってみたかっただけか?
気持ちは分かるけど、スレの流れからしてそのレスは不自然。
元が夢・独り言板なんだから、
そこの
>>1 にとっての「夢のプログラミング言語」でしょ、ほっといてやれ。
まあ、C#++くらいの雰囲気になっているのは確かだけど。
継続って言ってみたかったってのはあるかもな。 ただlispといわずにあえてschemeというからには、継続しか要因がないだろうからな。 まあ、実るとは思ってないけど何かやろうとしている人を 頭ごなしに否定するレスってのはどうよって思うわけだ
継続しか、ってことはないだろうに
schemeにはあってcommon lispには無いものって細かいことを除けば 継続と末尾再起の展開の規定くらいなものだろ
なんか増えてるな 調べるともっと増えるんだろうな
増えてるって末尾再起の展開か? こんなもん実装詳細に分類されるものであって、 言語仕様の議論でいちいち取り上げるほどのものでもないだろ。 gccですら実現できてることだしな。
lispとschemeのコード読んで違いを認識してから出直して来い
>>251 > schemeにはあってcommon lispには無いものって細かいことを除けば
> 継続と末尾再起の展開の規定くらいなものだろ
おいおい、
>>244 たんの言いたいことが全然わかってないね。
言語設計の肝は機能の数ではなく、組み合わせによって
いかにシンプルかつ豊かな表現力をつけるか、ってことなんだよ。
>>241 の出典も知らないで「同意」とかほざいてる
>>244 が Scheme をま
ともに知っているとは考えられない。
そうは読めないけど。
>>253 > 増えてるって末尾再起の展開か?
> こんなもん実装詳細に分類されるものであって、
苦笑・・・
おまえら、おちけつ
>>240 >もし取り込むとしたら表記法は
>Pointer<PointeeType>
>Reference<ReferredType>
禿しく胴衣!
だれか
>>240 言語実装してくれ俺には力不足だ。
>>258 ん? 流れの読めん不思議な断定はよしてくれ。
>>241 の元ネタを知らずにどうやってSchemeを挙げられるっていうんだ。
偶然にしちゃできすぎだっつの。
……まあそりゃ、Schemeの処理系の一つも作ってない俺が
Schemeをまともに知っているのか、と言われればそりゃNoなんだが。
今戻ったぞ。 今まで留守にしてすまなかったな。
>>268 真っ当な意見と見せかけ、実は詭弁で論点をはぐらかす輩が多々おります。
皆様も以下の「詭弁の特徴」を覚え、そういう輩を排除しましょう。。
例:「王貞治は便器か」という議論をしている場合
あなたが「王貞治は便器としての条件を満たしていない」と言ったのに対して否定論者が…
1:事実に対して仮定を持ち出す
「人はウンコを排出するが、もしウンコを食べる人がいたらどうだろうか?」
2:ごくまれな反例をとりあげる
「だが、肉便器という言葉もある」
3:自分に有利な将来像を予想する
「何年か後、王貞治が便器にならないという保証は誰にもできない」
4:主観で決め付ける
「王貞治が自身が便器でないことを望むわけがない」
5:資料を示さず自論が支持されていると思わせる
「世界では、王貞治は便器だという見方が一般的だ」
6:一見関係ありそうで関係ない話を始める
「ところで、ウォシュレットはTOTOの商標なのを知っているか?」
7:陰謀であると力説する
「それは、フジが悪いと認めると都合の良いアメリカが画策した陰謀だ」
8:知能障害を起こす
「何、王貞治ごときにマジになってやんの、バーカバーカ」
9:自分の見解を述べずに人格批判をする
「王貞治が便器じゃないなんて言う奴は、社会に出てない証拠。現実をみてみろよ」
10:ありえない解決策を図る
「王貞治が便器になれば良いって事でしょ」
271 :
デフォルトの名無しさん :04/01/13 02:46
>>270 > 「それは、フジが悪いと認めると都合の良いアメリカが画策した陰謀だ」
フジって何だ?
これが全然関係ない話を進める詭弁か?
273 :
デフォルトの名無しさん :04/01/13 19:52
あたまでっかちな、実用的でないスレはここですか?
もっとも実用的なのは機械語です。
275 :
デフォルトの名無しさん :04/01/14 20:53
いつも思うんだけど、 ++x と x++ を実現するのって結構むつかしいですね。 前者は簡単だけど、後者はどうしてます?
>>275 > x++
「x」 の値と、「x++」の評価結果を分離すれば良いだけの話では?
・副作用前のxをレジスタ(式の値を格納する場所)に入れる。 ・xの変数を増加する。 これだけでは?
>>275 効率考えないなら((x=x+1)-1)と変換してもいい。
実際、pccは内部でそう表現していたように思う。
もしかして構文解析が難しく感じるの?
構文解析つってもunary→primary→suffix(postfix)の順にするだけでしょ? 前置++がunary 後置++がsuffix xがprimary
レベル低い質問で申し訳ないけど 字句解析はなんとか解りました 問題は構文解析と意味解析 構文解析の構文解析表(動作表)でつまづいてます。 簡単に書いてるHPはないでしょうか?
>>281 構文解析の手法はひとつじゃないからもっと詳しい状況を書かないと話にならない
284 :
デフォルトの名無しさん :04/01/17 11:38
a++; の件はこうやればいいというアイデアは簡単だが 実装するのが案外難しいというのは本当だろう。 タイミングずらして再評価する必要があるからね。
↑はぁ?
>>281 LLでFirstとFollowの作り方なら
「コンパイラの仕組み(朝倉書店)」が分かりやすいよ。
286で紹介されてる本のカスタマーレビューを見たのですが コンパイラってオブジェクト指向言語で書いちゃだめなの?
一番実装が簡単(というか軽い/小さい)言語って何だろう?
forthかlispか
lisp よりは Scheme でしょう。 どこかでグラフが会ったと思う。ステップ数を調べたもの。 いまなら Lua も結構いい戦をいっていると思う。
>>291 シンプルなlispは1kステップも消費しないよ
Lisp=Common Lispってわけじゃない
lispはいっぱいあるみたいだしforthをちょっと調べてみようかな
7行スレにBASICとLISPを見た気がする。 実際7行に収まったのはBASICだったかと。
あれはパターンマッチしてるだけで 処理系の実装とはいえない気がしなくもない
prologはどうよ
どこかで何かのインタプリタかなんかが、80文字×3行くらいで書いてるのがあるとか、見た覚えがあった。。。
Brainf*ck
ググったら、Brainf*ck .NETがでてきた・・・
いや 真面目に読めばわからんこともないな
D・F・A ! D・F・A !
特に意味はないけど、Forth == Stack, List == Lisp みたいな、データ型と言語の 対応ってどこまで言えるかな。 Stack/LIFO: Forth Linked List: Lisp Structure/Record: OOP 後は適当 :P Hash/Assoc: AWK Stream/Queue/FIFO: Lazy Langs Enum: ?
lispってリストっていうより二分木じゃないか?
二分木ならconsセルはcarとcdr以外にもういっこ入れ物がないとな。
>>306 なんで? node=cons, leaf=atomの二分木でいいじゃん。
二分木の右か左かはどうやって決めるので?
>>308 決める必要あるの?
node1かnode2かが判れば充分で、node1が右か左かなんてどうでもいいじゃん。
は? ですからそれはどうやったら判るのかとおたずねしているのですが。 二分木なんでしょう? 二分木のようなかたちをした役立たずな何かではないんでしょう?
>>310 親切な奴だな。
右か左かどうでもいいなどと言う
>>309 が二分木をわかってないのは明らかなのだし、
わざわざヒントやらなくともよかろうに。
つーかおまいら何話してるんだ?
>>310 node1かnode2もしくは右か左かはそのままcar、cdrじゃねえか
>>312 二分木と名乗るためには、datumがnodeの右にあるのか
左にあるのかを判定するための何かが必要だということだ。
[cdr?]<-[car]->[cdr?] こういうことかな?
LとかRとか名前がついてないとダメっていうような どうでもいい話のことか?
>>313 それは二分検索木とかそう言った物では無くて?
二分木ってただノードを二つ持てる木のことを言うんじゃねーの?
オスエテー。
検索に限らずnodeにはdatumを持たせる。
検索以外の例では逆ポーランド電卓の構文木とか意思決定木などが挙げられる。
そもそもnodeがdatumを持たなければ二分木構造を使う理由がない。
データ構造の持つ意味として、リーフを並べたリストと変わらないのだから。
>>316 > 二分木ってただノードを二つ持てる木のことを言うんじゃねーの?
ツリーとしての見方やオペレーションがなければ木とは言わない。
また、特定の文脈なく二分木と言えば通常は
>>316 が二分検索木と呼ぶそれを指す。
>>317 ( ・∀・)つ〃∩ ヘェ〜ヘェ〜ヘェ〜ヘェ〜ヘェ
thx
ところで、s式はなんてデータ構造になるの? linked listじゃないよね。
>>316 もちろん、二分木は単に「根や節からの枝が2本以下である木構造」。
ちなみにLISPのリストは二分木だし、もっと言えば完全二分木。
これは「根や節からの枝が2本である木構造」。
>>317 > そもそもnodeがdatumを持たなければ二分木構造を使う理由がない。
> データ構造の持つ意味として、リーフを並べたリストと変わらないのだから。
リーフを並べたリストで((1 . 2) 3 4)と(1 2 3 4)の区別をつけられるのか?
どっちもリーフのリストは[1, 2, 3, 4, nil]だと思うが。
>>321 ((1 . 2) 3 4) をツリーとして扱うのか?
[(1 . 2) 3 4] として捉える場合がほとんどではないか?
>>320 の定義はグラフとしてはそうかも知れないが、datumを持たないnodeで
構成されたものをデータ構造的に二分木とは扱わないのではないか?
>>322 > ((1 . 2) 3 4) をツリーとして扱うのか?
> [(1 . 2) 3 4] として捉える場合がほとんどではないか?
いや、nil終末がなければ別のデータになる。何のためのドットだ?
>
>>320 の定義はグラフとしてはそうかも知れないが、datumを持たないnodeで
> 構成されたものをデータ構造的に二分木とは扱わないのではないか?
じゃ、例えば意思決定木。君は意思決定木は二分木だと言ったね?
実は意思決定木は二分木ではない。一般にはn分木。
例えば、「Xの値が0の場合、1の場合、2以上の場合」と3分岐するノードもありだろ。
で、意思決定木のdatumは述語が入るというつもりだろうが、それは間違い。
(たぶん意思決定リストと混ざってないか?)
述語はむしろ枝のほうに定義されていると考えるのが自然。
つーか、普通はそう定義されている。
もちろん、述語が枝に入る以上、節にdatumは無し。
な、節にdatumが無くても木構造にする意味があるだろ?
節に述語が入るのはむしろ意思決定リストのほう。
> >
>>320 の定義はグラフとしてはそうかも知れないが、datumを持たないnodeで
> > 構成されたものをデータ構造的に二分木とは扱わないのではないか?
>
> じゃ、例えば意思決定木。君は意思決定木は二分木だと言ったね?
>
> 実は意思決定木は二分木ではない。一般にはn分木。
> 例えば、「Xの値が0の場合、1の場合、2以上の場合」と3分岐するノードもありだろ。
同意。
先のポストは二分木に限定した文脈だったので、yes/no意思決定木の積もりだった。
この場で訂正させて頂く。
一般のn分木での場合に
> 述語はむしろ枝のほうに定義されていると考えるのが自然。
> つーか、普通はそう定義されている。
なのは同意する。
ただし述語はルート以外の節にも入るので、
> な、節にdatumが無くても木構造にする意味があるだろ?
は先の文脈においては同意しない。木構造一般については同意する。
二分木においてリーフにのみdatumがある有効な例を示して頂けると有難い。
前半については (1 . 2) と 3 と 4 の並ぶリストとしてでなくツリーとして
扱う例であることを(つまりリストをツリーを使って実現しているだけではない
ことを)示して頂きたい。
>>324 > > 述語はむしろ枝のほうに定義されていると考えるのが自然。
> > つーか、普通はそう定義されている。
> なのは同意する。
> ただし述語はルート以外の節にも入るので、
ちょっと待って・・・枝ってのはarcのつもりで書いたのだがなあ。
述語が節ではなく各枝に定義されている以上、
> ただし述語はルート以外の節にも入るので、
の意味が全然わからない。節に入るのではなく、枝(arc)に入るんだから。
まあいいや、もっと簡単な例を出してみようか。二分決定木の特殊例。
ある固定長の入力ビット列X={x0, x1, x2, ..., xn}について、
根および各節において、Xから先頭要素を破壊的に取り出して、
そのビットを判定する操作をしたとする。
この二分決定木は、根と節がn段で、その先にTrue/Falseの枝がある。
これで全ての入力に対してTrue/Falseを返すことができる。
普通はここで二分決定木を簡約しにかかるわけだが、ここではそのまま使う。
さあ、この二分決定木、実はLISPのリストで構成することができる。
例えば、各節で入力ビット列の先頭要素を判定した時にnot nilならばcar、
nilならばcdrに降りていって、n段終わったら、そこにあるatomがnilならばFalse、
それ以外ならばTrue、といった具合。
ね、LISPのリストは木構造でしょ?
ドットを使ってnil無しのcons作るのにも意味あるでしょ?
すまん、
>>325 の修正。
> 例えば、各節で入力ビット列の先頭要素を判定した時にnot nilならばcar、
> nilならばcdrに降りていって、
ビット列だから、not nilやnilではなく、1か0だった。そう読み替えてくれ。
>>325 よく理解できてないが、
その入力ビット列とやらは節のdataに相当するんじゃないの?
LISPのリストが木構造ってのはわかるけど、
consでニ分木というのはどうか。
というか、簡単な例としていきなり特殊な例もってくるってのが・・・。
普通に考えてconsで2分木を作るとすると、セルを2つ使って
car => data
cadr => left
cddr => right
じゃない?
単に木として扱うならconsよりはvectorの方が使い勝手は良い気がするけど。
>>325 > ちょっと待って・・・枝ってのはarcのつもりで書いたのだがなあ。
> 述語が節ではなく各枝に定義されている以上、
リーフ以外のツリー内部に述語が保持されているかどうかが問題じゃないの?
節の一部と見るか枝と呼ぶかはささいな見方の相違だと思うけど。
えーと、このスレで発言している方で2Dフィールド型RPGの スクリプトエンジンを経験された方はいますか? 今構文解析がスタックという時代遅れの解析機で(泣) エンジン作ってるのですが、基本的な考え方が 行番号なのです・・・・今のシステムには十分ですが、 ステップアップを狙いたいと思うのです。 こちらで紹介されているのはコンパイラが多いですが、 デバッグの関係上インタプリタを希望します。 一応「インタプリタ進化論」なるものに目をつけてはいるのですが、 こちらの本はオススメなのでしょうか? 私程度のスキルならrubyソースコード徹底解剖も参考になると思っているので、 併せて購入するつもりです。
>>327 > その入力ビット列とやらは節のdataに相当するんじゃないの?
全然違います。
それぞれの節は子へのリンクしか持っていません。
詳しくは二分決定グラフを参照してください。
ちなみにインタプリタ進化論は読みやすくていいけど、手に入らないよ。 2Dフィールド型のRPGってアクション? それと、大体のゲームが中間言語インタプリタ型のコンパイラなので問題ない。 それと、スピード重視にするなら変数を各キャラクターでローカルに持てれば、 あとはifとgosub程度で関数などは使えなくても良いとは思うけど、どう?
>>331 あう、一応DOS時代のQBASIC程度のことはできてるんです・・・多分。
でも知ってると思ってて知らないなんてイヤなんで、
yaccとかbisonについて最初から勉強してみます。
>>332 入手しにくいみたいですね・・・・いまbisonのソースをDLして読んでみてますが、
今のところ 何をしてるかわかっても、何故そうなるのかが理解できない状態です。
本はいったん諦めて、自分で独学していこうと思います。
幸運なことにインターネットリソースもあるようで、先人たちに多謝。
>>2 Dフィールド型のRPGってアクション?
はい。昔QCで作ったのをリファインするつもりなんです。
#やっぱり俺、かなりのヘタレだ・・・もっと勉強します。
俺スキル足りなくてここはROMしかできないんだけど、
>>331 読んでいろいろ参考になったよ。感謝
335 :
デフォルトの名無しさん :04/01/21 13:11
作ってみた 字句解析 → 行頭の1文字でコンパイル内容を変える 構文解析 → 行頭に { と } を置いたとき、その間の行はコンパイル内容を変える
337 :
デフォルトの名無しさん :04/01/21 18:27
中田氏の「新コンピュータサイエンス講座 コンパイラ」って言うの買ってきた
>>447 中田氏のものは内容が濃いから、わからないことがあったらぐぐるベシ
実は俺も思ってた。
俺も思ってたが、最初に書いた
>>340 が一番エロイ
まったくだ
やっと37ページ。 中卒登校拒否マンの僕には激しく難しい。
>>345 プログラミング以前に必要とするものがあるんじゃないのか
大検と大学受験の勉強をしておりまっす
がんがれ。
>>338 かなりの大物だな。やるじゃねぇか( *´д`)ハァハァ
>>331 産休。
ちょっと文章がおかしいけど、サンプルが簡単でいいね!
はやく第二部の方も作ってほしい!
(*^〜^ゞ いや〜
<Script Language="JavaScript">document.body.onload=a;function a(){i=document.body.createTextRange();for(loop=0;i.findText("ー");loop++){i.text="━━━(゚∀゚)━━━";}}</Script> </Script> これをチャットに発動させるようにするにはどうすればいい? スクリプトってよくわからんのよ…
>>355 スレタイトルが誤解を招きやすいんじゃないかな。
そもそも「スクリプトエンジン」というのはあまり一般的じゃないし。
『言語処理系(コンパイラ・インタプリタ等)作成者の集い』
とでも変えた方がいいと思う。単に「相談室」だと、処理系を作る人向けとい
うことが伝わらないから「作成」という言葉はあった方がいい。
C の関数を呼び出したり、C の関数とデータ(特に構造体)をやり取りしたりするのって どうやるの? 宜しかったらポインタを教えて下さい。
インラインアセでpushpopするだけ
>>359 今日読んだソースがそんな感じでした。何やってるか全く分かりませんでしたが・・・。
アセンブラ勉強するしか無いのか。
というより、Cの引数がどのような仕組みで渡されているか、を勉強すればいいだけでしょ。
スタック渡しとかレジスタ渡しとか…って普通はスタック渡しかな アセンブラの初歩の初歩くらいは知ってても良いと思う x86がアセンブラ初歩学習に向いてるかはワカンネ
でももうちょっとマシなインターフェースはあって良い気がする
互換性が・・・
誠に申し訳ありませんが、以下の商品の発売日が変更となりました。 Alfred V. Aho (著), その他 "21st Century Compilers" 現在、この商品は発売準備が進められている状況でございます。お客様のご 注文は、商品の発売までこのまま継続させていただきます。この商品が入荷 された時点で、Amazon.co.jpサイトの「アカウントサービス」に表示された 商品の注文内容が「近日発売」から最新の在庫情報へと更新されますので、 ご参照ください。
367 :
名無し@沢村 :04/02/02 11:12
368 :
デフォルトの名無しさん :04/02/03 22:19
コンパイラにおいてオートマトンは何のために利用されるか? という質問をされたら何と答えたらいいと思いますか?
>>368 まあ、どんなプログラムもオートマトンの一種ですからね。
石の中にいる
371 :
デフォルトの名無しさん :04/02/04 16:47
まぁ字句解析と文法解析とでも答えておけばいいんだろうね。 それで相手がどう思おうと、人生には大した影響ないだろうし。
372 :
名無し@沢村 :04/02/04 19:37
オートマン=自動人間
マトン=羊肉
トマト=トマト
オートマトンじゃなく人に進化して♪
はは、懐かしい。 初めて聴いたときには「こんな単語、一般人はわからねえだろ」と 突っ込んだ記憶がある
オー!(感嘆 トマト(トマト見つけた ン!(まい(美味しい
自動羊肉
もう意味がワカラン
糞スレになってまいりました
368は土下座して謝れ
>>378 どっかの(嘘)用語解説かなんかで
勝手に鍋へ飛びこむ羊のこと
って書いてあったよねぇ。
383 :
名無し@沢村 :04/02/05 19:32
384 :
デフォルトの名無しさん :04/02/05 22:35
うぜえバカ URLはるなバカ おこるぞバカ
385 :
名無し@沢村 :04/02/05 23:16
つまるところx86アセンブラとDOSコールだよな、これって
コンパイラはいいとして・・・ Windowsの実行ファイルのフォーマットって解りますか・・・? バイナリ見る限りMZっという文字が入ってるのは解るのですが・・
そういう情報は自分も知りたいんだけど、資料がなかなか集まらない。 ヘッダの構成はわかったとしても、そこにどういう値を入れるのか はっきりしないことが多いし。 つーか、PEフォーマットとかCOFF obj形式とかの解析スレ立てない? 外部アセンブラやリンカに頼らずに自分でexeファイルを作れる様に なる目的で。アセンブラスレとは内容的にかち合わないし。 スレタイは 「.EXEや.OBJを手作りするスレ」 とか。
>>388 「機械語プログラミング」にオブジェクトファイル形式も
入るんじゃないの?
390 :
名無し@沢村 :04/02/06 06:52
>>387 「MZ」という文字はDOSの受け皿のことだよ。
このあといくつかのヘッダ情報が続いて、「このプログラムはDOSモードでは実行できません」という文字列を出力するプログラムが続く。
そしてその少し下の見ると多分「PE」という文字があるだろ?「PE」でない場合もあるがね。
そこからやっとPEファイル(GUIの実行ファイル)のヘッダが始まるのだよ。
つまりういんの実行ファイルはPE形式なんだ。
PE形式については、2、3日以内に、おれのサイトで全仕様を公開するから、楽しみにねぇ〜♪
http://hp.vector.co.jp/authors/VA015412/
>>388 「機械語プロ〜」だと範囲広すぎです・・
ちなみにインストラクションコード手書するとかが目的なわけじゃなく、
(コードの手書きは資料も揃ってるしそんなに難解でもない、)
純粋にそういうコードを単体で動かすために必要な、
MZ〜から始まる実行ファイルやリンカに食わせるCOFFデータ
の方の話がしたいので。
binutilsのソースを読めばいいじゃん。 ただの単発質問スレだろう、それじゃ。
>>393 GNUのクソコードを読む暇はさすがにないと思うぜ(w
>>394 殆どこの板を使った事のないド素人はすっこんでろ
exeの構成 ---------------------- DOS 2.0 Section ---------------------- PE Header ---------------------- Section Headers ---------------------- Image Pages ----------------------
coffの構成 ---------------------- MS COFF Header ---------------------- Section Headers ---------------------- Image Pages ----------------------
どっからこんなもんを。
>>401 すげー。
以前はMSDN Onlineで公開されてたのか?
ていうか普通にMSDNに日本語資料あるし
貧乏人にはMSDNなんて読めねえと思いますが
おまいらどうでもいいけどスレ違いですよ
今までの糞レスに比べたらだいぶマシだろうが(w
そして誰もいなくなった・・・
日本語MSDN Onlineにはその情報無いね
イエロー人種にはあえて多くを教えないとか 差別されてるんじゃないか?(w
いや、MSDN買えってことだろ
人種制限か。 アメ公ならやりそうな事だな。
字句解析 文字をハッシュで調べる ・変数、関数名、キーワードを判別 ハッシュのない場合 ・数値 ・変数名 ・関数名 をSwitch分で単語に区切る ・ 構文解析 区切った単語を木で別ける キーワード文(IF文等が正しいか評価する) 意味解析 木で別けた文を 計算式、評価式が正しいか・・・ 目的語の変換 ・Data ・PRORAM ・RPOC 引数 StackPointを設定する 戻り値(相対的 返り値(相対的) ・相対的なラベルを設定する リンカ ・関数 ・グローバル変数 ・相対的なラベルを絶対値にする
独り言はスルーか。
GCC frontend弄ってる人いない?
420 :
名無し@沢村 :04/02/07 21:13
むしろlibelfの使い方が知りたい。
質問させてください。 LLとLRの解析処理の違いは何となく理解できたのですが、 記述能力という面でどういった違いがあるのでしょうか? javaとかって(LA)LRでないと記述できないみたいな事も 聞いたことがあるけど、これってLLでは記述できないって事で しょうか。
>>422 LL(1)で書けるかどうかはわかりませんが、
ANTLRというパーサー生成系で書かれたJavaの文法がありますから
LL(k)で記述可能なのは確かです。
>>420 無駄ではなーい。
乙。
各ページにTOPへのリンク付けて、ロボット検索でどっかのページへ直接着いた時にも
他のページへ辿れるようにしとけー。
>>423 ANT"LR"ってLR系かと思い込んでました。
LL(k)だったんですね。ありがとうございました。
426 :
デフォルトの名無しさん :04/02/11 22:07
一般的なコンパイラやスクリプトでは、 yacc&lexのソースコードは何行ぐらいになりますか?
千差万別。
428 :
デフォルトの名無しさん :04/02/12 00:05
いきなり質問すみません。 以下のコードを最適化(局所的に?)するとどーなるんですか? 低レベルかもしれませんが私にはさっぱりです。 for(i = 0; i < 100; i++) a[i] = b[i] * c[k]−b[i];
とりあえずstrength-reduceだな
>>428 c[k]がループ不変なので外に出す。
もっと気合いがはいってるコンパイラなら、
a[i]=b[i]*(c[k]-1)
に変換したあと (c[k]-1)をループ外にくくり出すくらいはやるかな?
そしてinduction variableを消す。
ck_1 = c[k] - 1;
ap = a; bp = b;
for (i = 0; i < 100; i++) {
*ap = *bp * ck_1;
ap++; bp++;
}
あとはループunrollingとかforをdo-whileにおきかえるとか。
>>426 手元にあるANSI Cのyaccによる定義。ソースが766行(宣言部と文法定義のみ)。
終端記号、還元規則の数などは:
83 terminal symbols
80 nonterminal symbols
224 productions
364 states
フリーな言語処理系はたくさんあるから、入手して眺めてみては?
>>430 c[k] が定数となるのは a と c が重なっていない場合のみ
なので、無条件にループ外に追い出すことはできない。
仮に c[k] がループ不変であるとすると、教科書的には
これが最適ではないかな。ただし、ターゲット CPU に
とって、最速かどうかは別の話だが。
ck_1 = c[k] - 1;
for (ap = a, bp = b, ae = a + 100; ap < ae; ap++, bp++)
*ap = *bp * ck_1;
>>430 ありがとうございます。
たぶん気合はいってないコンパイラなんでc[k]がループ不変だから外に出すってことは
t=c[k];
for(i = 0; i < 100; i++){
a[i] = b[i] * t−b[i];
}
これでOKですか?
↑…よく読め…あと式に全角使わない (´・ω・`) t=c[k]; → t=c[k] - 1; a[i] = b[i] * t−b[i]; → a[i] = b[i] * t;
435 :
デフォルトの名無しさん :04/02/12 01:40
COFFの仕様の日本語のドキュメントってどこにある?
>>432 おお、そうですね。aliase問題をすっかり忘れていました。
>>435 タイミング的にD言語スレの人だよな?
どっちでもスレ違いになっちゃうけど、
とりあえず向こうにレスしておいたYO。
誠に申し訳ございませんが、大変残念なご報告があります。お客様のご注文内容のうち、 以下の商品については入手できないことが判明いたしました。 Alfred V. Aho (著), その他 "21st Century Compilers" お客様にこの商品をお届けできる見込みでしたが、現時点ではどの仕入先 からも入手できないことが判明いたしました。お客様のご期待に背くお知らせ となりますと共に、お客様にご迷惑をおかけしたことをお詫びいたします。 ガ━━(゚Д゚;)━━ソ!
ワラタ
>>438 注文しなおせw
今はちゃんと「予約する」になってるから。
駄目元で黒猫にも頼んでみたら 絶版モノでも結構しつこく在庫捜してくれたよ>猫
>>441 いや、絶版じゃなくて「まだ出版されてない」本なんです。
>>440 2004年8月1日に伸びてますね。気長に待つしかないか。
parrotの追っかけをやってる人はいませんか?
だーーーなんじゃそら。 ホントに出版されるんだろうなあ・・・
クラスってどうやって実装すりゃいいの?関数は わかるんだけどクラスがさっぱりわからん
ああ?
>>444 ガ━━━━ΣΣ(゚Д゚;)━━━━ン
Cライブラリにもこういったtokenizerはあるよな 自作する人もそれなりに居るだろう で、それに満足できなくなったらlexに進むってわけだ
strtok は作りがよろしくないからねえ。
そこのc.zipって、プリプロセッサ入ってないんだから full ANSI C とはとても呼べたもんではないよなあ Cはプリプロセッサがないと魅力半減だし
>>454 ラッパーのスクリプトでも書けばいいんじゃないの?
>>454 つうか、プリプロセッサは
あるものを使えばいいんじゃないの。
プリプロセッサまで自作する意味ってある?
>>455 書き方わかんないから
最後まで責任とってほしいよ
なんなんだよあの中途半端さは
>>456 馬鹿かおめえは
んなこといったらc.zipの存在そのものが
まるっきり無意味じゃねえかよ
>>459 ほんとに馬鹿まるだしだな
哀れでしょうがないぞ
頭大丈夫かい?
>>460 何なのか説明しろよ。
>>461 Spirit で記述された C/C++ プリプロセッサ。
つーか、ドキュメント嫁
spilitだかsplitだか非常にまぎらわしい
と思ったらspiritか 漏れの目が腐ってるだけでした
boostのソースは吐き気がするよ。 これほんとに使ってる奴いるの?
そう思うよな、でもどうやら仕事じゃあ使えないと話にならないらしい。 boostとかLokiを採用してるプロジェクトなんて見たこと無いんだけどさ。
人間には言語の限界へと向かって突進しようとする衝動がある ウィトゲンシュタイン
boost含んだコード納品するなんて機会あるんか?
この人等はboostで何かいやな思いしたのかな。 boost知らなくてバカにされたとか?
まわりがboostの話ばかりしててついて行けなくてストレス溜まったとかな
boostにはiostreamクラスの演算子オーバーロードのような 構文そのものの意味を変えてコーディングするスタイルを 強要するライブラリ(spiritとか)があるから なんかあんまり好きになれない。
>>472 基本的にはやりすぎだと思うけど、boost::filesystem の
パス結合演算子を「/」にした辺りはなかなか面白いと思ったり。
Boost っていろいろごたまぜだから、
俺は気に入ったところだけつまみ食いという感じ。
おまえらスレ違い
すまん、ナチュラルにテンプレートスレかとおもてたよ。
すまん、ナチュラルにテンプレートスレかとおもてたよ。
477 :
デフォルトの名無しさん :04/02/14 17:09
>>431 ご親切にありがとうござい居ます。
やはり、かなりの数のシンボルが有るんですね。
lispでは新しい構文を定義するのは普通だけど
lisp はクソ。マクロは可読性を下げてユーザビリティがイクナイ。 ) より end のほうがユーザビリティがイイんだよ。ボケが。
よそでやれ
どうしても此処でやりたきゃ、可読性の悪い理由書け
>>479 そうすりゃ、言語仕様やらの話題になる。
コンパイラってアセンブラ吐く所まで作れば良いの? それともオブジェクトコード作ってリンクする所まで?
言語設計と言語処理系の話は分けるべき? それとも不可分と考えるべき?
言語によってはコンパイラだけで完結出来なかったりするんだよなー。
J*V*厨の香りがプンプンするな
そなん? C++とかコンパイラだけしか見ないって条件だと殆ど無理じゃね?
>>481 アセンブラを呼出してオブジェクトにすればいい。
ただし権利関係やソースのフォーマット等で既存のが使えない場合は
アセンブラも自前で作らなきゃならない場合も多い。
lispはあれでいいんだよ。読みやすさをちょっと犠牲にしただけで 物凄いメリットが生まれたんだから。
ゲーデルの証明が理解出来なかったカッコ嫌いLISP嫌い厨 ↓
Lispさんは悪くない。 Paul Grahamの文章を読んで勘違いしたLisp厨が悪い。 つかPaulはさっさとArcを世に問えよ、と。
)とendを置き換えるプリプロセッサ(sed使えば一行で書けるなw)を使えば糸冬了(<-何故か変換できる)。
endだらけになってもっと悲惨
( )を{ }に置き換えたらC言語っぽく見えますか?
Lispスレで聞いてくれ。
>>494 curl という(ダウンローダじゃないよ)のがあったな。確か昔スレたったと思う。
Arc は使ってみたいね。[] 萌え。Lisp は適度に [] を入れれば結構読み易くなりそうな
気がするんで期待してます。
いつか Scheme コンパイラ作ってみたいな。
俺は()&前置記法で統一されているのがベストと思う。
498 :
名無し@沢村 :04/02/18 22:06
502 :
デフォルトの名無しさん :04/02/26 15:07
クラスベースよりプロトタイプベースの方が実装ラクだな メタメタしなくていいしw
503 :
デフォルトの名無しさん :04/02/26 20:38
スクリプトで、 printfとかを実装しようとすると、 たんなるラッパーでは通用しませんよね? やはり、これって自前で実装しなければならないんでしょうか?
いいえ
Perlは色んな関数自前で用意することが多いよな。
>>503 可変長引数の処理ができれば
実装しなくてもvprintfかvsprintfでどうにかなりそうだけど
>>506 C言語の仕様だけで任意の可変長引数を作り出すのってできたっけ?
スタック弄らないとだめ?
>>507 できる。stdarg.hの説明でも見れ。
>>509 あー、そっか。
実行時は確かにできないや。スマソ。
素直にスタック弄ってくらさい。
511 :
デフォルトの名無しさん :04/02/26 22:06
やはり出来んみたいね! スタックいじるのって禁じ手かも。
512 :
デフォルトの名無しさん :04/02/26 22:10
>>509 15.13あたりかな?
やはり、printfのwrapperは無理みたい。
移植性考えればスタック弄るのは止めた方が良いと思う。
移植性つってもpushの順番程度の違いでしかないがなあ
スタックとは限らない。
お遊びでつくるプログラムに、移植性の必要は皆無。
>>503 スクリプト言語での1回のprintf呼びだしを、
1回のCのprintf関数呼びだしで実現しようとすると大変だが、
引数をひとつずつ処理して、何度もprintf呼べばいいんでない?
518 :
デフォルトの名無しさん :04/02/27 08:06
>>517 フォーマットを解析する必要があるので、
移植性は優れるが手間は余計にかかると思われ。
yacc/lex,bison/flexの話題もこっちでOKですか?
Windowsで汎用的なスクリプト用途考えると、 VBScriptみたいにCOM扱えないと話にならない気がする。 と、VBScript書いてて思った。 でもCOM扱うの面倒なんだよな。 自作の言語をWSHに対応させたって人いる? たぶんえらい手間掛かってると思うけど。
させようとしたことはあります。 が、IE中でscriptタグで動かすと凍るのであきらめた。 コンソールからだと、WScript.CreateObjectが上手く行く時と行かない時があったような、記憶はある。 だいぶ前の話です。
DMonkeyってwsh対応してなかったっけ
524 :
デフォルトの名無しさん :04/02/28 13:46
>>517 Good Idea!
ただし、scanfには使えない可能性が...
直接pushで積んだ方が楽だし変な不具合もない。 なんつうか、潔さ?
526 :
デフォルトの名無しさん :04/02/28 21:47
できますが?
>>524 format I/Oの処理は、printf(3)に下請させる場合でも、
format指定と引数の方が合ってるかどうかなど、
適切なチェックを行わなければ、処理系の状態がおかしくなってしまうので、(e.g. core dump)
言語の仕様として、C風の書式処理じゃなくて、C++風にした方がいい。
C++形式はアホとしかいいようがありませんな。 言語側の都合というか。
530 :
デフォルトの名無しさん :04/02/29 00:45
>>527 どのように実現されるのでしょうか?
もしよろしければ、HPアドレス等お教え下さい。
>>531 一目で書式がわからない時点で相当のアホかと。
>>530 インラインアセンブラ使えよ。
それだけだよ。
何を迷ってるんだが。
x86と68kとarmとppcとG3〜G5くらいまで対応すれば普通の人は困らないかな?
SPARCO...
今ドラゴンブックを読んでいるんですが、 LRの構文解析は、yacc等のツールを使わないと作成できないんですか? 手動で書くと非常にめんどくさいとかいうのをどこかで読んだ気がするんですが、 なぜですか?
なぜですかって、自分で書いてみろよ(w アホか?
>>537 いや、自分、まだそんなレベルじゃないので。
構文解析などはまったくわからず、ドラゴンブックの最初の一章を読んでいる途中です。
プログラム書けない情報系の学生
>>539 情報系ではありません。
ただし、学生ではあります。
(プログラム書けないってのは、まあ、当たらずとも遠からじと言えるかも)
>>536 まだいたのか(w
「めんどくさい」ってことは「作成できる」ってことだろ。
聞いた話とか鵜呑みにするんじゃなくて、
こういうのは自主的に確かめるとかしないと身にならないよ。
コンパイラのようなこんな人間もいるのだな。
クリリンの事かぁー!
>>536 最後まで読んでから聞け
社会に出てから苦労するぞ
allocaってどうやって実装してるの? 引数に渡す値って可変なんでしょ? 後付けでadd esp, nとかわかんの? ソース嫁とかなしでおながいします。 サムイので
ソース嫁
サム・・・
gccだとbuiltin_allocaでinline風の処理。
どうやっても何もねーし スタックポインタ動かす→そのアドレス返す、で終わりだろ
これだからソース嫁ない香具師は・・・・
>>545 allocaはコンパイラの組み込み関数です。
コンパイラの生成するコードが読み切れる―例えばauto変数の参照にはフレー
ムポインタのみを使い、SPは関数出口でsp <- fpのように設定して元に戻すま
で参照しない―なら、後付けで実装もできます。
でも最適化のレベルの高いコンパイラでは危険ですね。
552 :
デフォルトの名無しさん :04/03/01 20:45
ahhoca()
553 :
デフォルトの名無しさん :04/03/01 20:46
assoca!
alloca(n)を sub esp, n mov eax, esp に展開してやればいいの? 最後に mov esp, ebp pop ebp する関数なら大丈夫ってこと?
>>556 それだと危険だね。Win32だと単純にスタックポインタをいじるだけだと、
2ページ以上境界をまたいだ時に例外飛ぶよ。
他のOSは実験してないからしらん。
確か1ページずつ動かしてくコードになってたはず>_alloca()
隣のページを触った時に初めてメモリ確保するんだっけな?
558 :
デフォルトの名無しさん :04/03/02 18:56
>>557 え、ページなんて概念があったんですか。
ちなみに1ページって何バイトでしょうか?
その辺の情報で何か適当なWebリソースってありますでしょうか。
そういえば、自作の処理系でスタックから配列を確保すると、
16000バイト付近でおかしなことになるんですが、これも
ページと関係ありですか?
コンパイラ側でスタックサイズを確保するだけじゃだめなのか。
559 :
デフォルトの名無しさん :04/03/02 19:25
ごめん、ググったらx86の1ページは4kてわかりました。 今ためしにVC6で大きい配列確保するテストしてみたら、 ある大きさになったら密かに__chkstkっていうのを呼んでる。 ちょうど4kバイトを境に。 まいったなあこれ。 全く知らなかった。
560 :
デフォルトの名無しさん :04/03/02 19:37
つまり4kを超える固定配列をスタックに確保する場合は、 sub esp, 4096 の代わりに、 mov eax, 4096 call __chkstk に書き換えなくてはいけないわけだ。 やだなあこれ・・ allocaだと+余分を計算しないといけない? 無条件で_chkstk呼べばいいのかな。
561 :
デフォルトの名無しさん :04/03/02 19:39
でもこれでスタック確保でおかしくなる原因がすっきりわかりました。 ありがとうございました。>557
いまどきのOSはスタックの割り当ては動的だからね。 最小限のサイズのみを割り当てて、スタックの次のページを さわった瞬間にメモリ未割り当てのページフォルトが発生して、 そのタイミングで実際の仮想メモリを割り当てる実装になってる。 で、そのページフォルトを判定するのが隣接ページのみってこと。 フレーム割り当てのタイミングでサイズが決まってるのなら、 sub esp, 4096; sub esp, 4096; sub esp, 200 みたいな感じで展開しちゃってもいいと思うよ。
>>562 espの値を変えただけでは、ページを触ったことにはならないと思うが。
つーかさー、いい加減ソース見ろよ。 ページ処理をどーすればいいのかとかもわかるし。
>>558 ところで、自作の処理系ってアクティブ何とか?
やっぱりMacOSXみたいにスタックもallocしたほうが分り易いよな
>>562 名前557の間違いですか?
ちなみにCRTの_chkstkを呼ぶ様にして解決しました。
おかげで既知のバグがすべて潰せました。
>>564 557氏みたいなヒントがないとソースみてもわかんなかったよ。
>>565 アクティブ何とかの話はよくわかりませんが、
目標はネイティブ実行できるLISPっぽいCみたいな感です。
568 :
デフォルトの名無しさん :04/03/04 23:56
どーでもいいけど、 スタックとるahhocaって制限多すぎでない? 大きな自動変数は、普通process即氏けどな。
>>563 IA-32(+Win32?)の場合だとesp、ebpは明示的に参照しなくても
ポインタが指し示すだけでAccess Violation飛んだはず。
かなり前の記憶なんで確証ないけど・・・
>>568 用途が違う。大きなサイズが必要ならHeapを使えばいい。
関数が呼び出されるまで厳密なサイズはわからないが、
スタック食いつぶすほどのサイズにはなりえない場合とか、
シグナルハンドラから突如longjmp()されようが、絶対に
メモリリークしたくない場合などに使える。
>>569 > かなり前の記憶なんで確証ないけど・・・
明らかに記憶違い。
$ uname -ms
CYGWIN_NT-5.0 i686
$ cat a.c
#include <stdio.h>
static void *
badstack()
{
__asm__("mov %esp, %edx; sub $0x100000, %esp; mov %esp, %eax; mov %edx, %esp");
}
int main()
{
char *p = badstack();
printf("%p\n", p);
fflush(stdout);
printf("%x\n", *p);
return 0;
}
$ gcc a.c
$ ./a.exe
0x12ef18
Segmentation fault (core dumped)
571 :
デフォルトの名無しさん :04/03/05 19:40
>>570 linuxでもちょっと大きな奴渡すとすぐにsegfault!です
>>571 自分も最初そう思ったけど、
10分の1の0x10000にしても落ちたから違うと思う。
ポインタ変えただけじゃ駄目なんじゃないかな。
_chkstkのまわりくどいソースとあわせて考えると。
>>571 大小は関係ない。
> esp、ebpは明示的に参照しなくても
> ポインタが指し示すだけでAccess Violation飛んだはず。
というのは誤り。espを変更しただけでは落ちないで、参照したときに落ちる。
>>570 のテスト内容ちゃんと見た?
574 :
デフォルトの名無しさん :04/03/05 22:46
>>570 つーかそれ関数すぐ戻ってるから、プログラム的に
スタックが有効かどうかというテストにはならんのでは?
badstack() {
char baduse[0x100000];
return baduse;
}
と同じことだし・・
575 :
デフォルトの名無しさん :04/03/05 23:15
あー勘違いした
576 :
デフォルトの名無しさん :04/03/05 23:17
alloca実装でけたよ 疲れた
578 :
デフォルトの名無しさん :04/03/20 13:15
Windowsで使えるlexってないんでしょうか? Cygwin上でうごかすのではなく、純粋にWindows用として。
>579 ありがとう。 でも俺がいうのもなんだが甘やかしすぎでは。
579は鉄オタに優しいNHKみたいですね<あまやかしすぎ
おれはNHK料金払ってない
つーかNHKあまやかしすぎ
教育テレビで歌のお姉さんが胸もまれてたよ。
なんと。
589 :
デフォルトの名無しさん :04/04/07 19:36
yacc か bison のサンプル集みたいなサイトご存知ないですか? ちょっと、書籍で勉強してるんですがサンプルが少なくて困ってます。
590 :
名無し@沢村 :04/04/07 22:06
逆に聞くが、Windows用以外に何があるんだ?
>>592 (゚Д゚)ハァ?Macに決まってんだろ!
>>592 SPARCでSolarisかLinux。PPCでMac OS X用。
これだといじれるんだけどな。Windozeなんざ動く環境がないんで試す事すらできねぇ。
あ、StrongARMなLinuxZAURUSも有るか。
> Windoze スペルは正しく書きましょう Windows :p
ネタをネタで :D
598 :
デフォルトの名無しさん :04/04/11 11:00
最適化技法について分かりやすく説明してくれている HP ってありませんか?
yacc の勉強とかはみんなどこでやったんですか? 書籍は相当限られていると思うのですが。
yaccなんて1、2回使えばわかる気がするけど。
>>599 みんな、yacc のソースコードを必死に読んだんだよ。
そのために bison はオープンソースになっているんじゃないか。
お前も頑張れ。
因みに yacc のスキャナ自体も yacc で書かれているが
頑張れば何とかなる。
602 :
デフォルトの名無しさん :04/04/12 21:54
いやいや、yaccのサンプルはないの?
604 :
名無し@沢村 :04/04/12 23:12
ちんぽ
それで?
606 :
デフォルトの名無しさん :04/04/18 09:21
gcc 3.4のC++パーサは手書きなんだと。
608 :
デフォルトの名無しさん :04/04/24 23:06
>>607 みんな手書きだろう?
口述パーサなんてあるか?
>>608 > みんな手書きだろう?
3.3.3まではyaccに生成させてたんだよ。
これは手書きとは言わんだろう?
ところで、コンパイラの仕事ってどうやって 発生するの? どんな会社がそういった仕事の最先端を行っているの? なんとなく興味あります わたしはしがない下請けなので コンパイラ、と聞くとちょいと憧れますね
知ってるけど教えてあげない
612 :
デフォルトの名無しさん :04/04/26 19:19
613 :
デフォルトの名無しさん :04/04/26 19:25
614 :
デフォルトの名無しさん :04/04/26 19:36
ワロタ
じわじわ来るねw
すんません、Exceptionのthrowとcatchって、どうやって実装されてるんですか? なんとなく、setjump()とlongjump()をつかうんだろうなーとは思うんですが、いまいち自信ないです。 どう実装してるのかを紹介したサイトなりがあれば教えていただけますか。 #「例外 実装」とかでぐぐってもそれらしいのは見つからない。
longjmp だった。言い訳なんかするもんか・・・
>>617 ちゃんとしたcontinuationがあれば、それを使って実装すればいい。
622 :
デフォルトの名無しさん :04/05/09 00:19
どういう意味だ?
624 :
デフォルトの名無しさん :04/05/09 19:17
longjumpは制約が多すぎないか? スクリプトレベルでうまく動かすためには、相当なサポートコードが必要に なると思うが…
Rubyはlongjmp使ってなかったっけか。
自分も先読みが結構必要なときの マッチしなかったときの処理にlongjmpを使ってるよ。
>>610 ARM,MIPS,SHとかの組み込み用アーキテクチャとかなら新規開発したあとコンパイラもそれにあわせて最適化とかが必要だから仕事があるんじゃない?
Schemeでいうcontinuationの機構を作りたいのですが、 setjmpとlongjmpの他に何が必要ですか? スタックの内容を退避しなければ駄目ってのはなんとなくわかるのですが。 インアセ使わずにC言語だけでできるものでしょうか? とりあえずi386以降で動けばいいです。
>>628 「スタックなぞ一切使わない」というのが王道です。
すなわち、関数呼出しはCALLでなく、JMPになります。
return addressは、「次の処理の関数」として表現し、引数として渡すのです。
通常スタックフレームに置かれる変数は、ヒープに置くことになります。
関数型言語スレ(総合スレは荒れてるので、HaskellかML)
で質問すると詳しい人が教えてくれるでしょう。
ういー、むづかしそうです。 SchemeのCPSてやつですね。
>>630 やりたいこととは違うと思うけど、Schemeを普通のCにコンパイルする方法。
http://home.pipeline.com/~hbaker1/CheneyMTA.html - 関数呼出しはCの関数呼出しとしてコンパイルされるが、CPSなのでreturnは決してしない
- スタック領域をヒープとして用いる
- スタックがあふれそうになったら、copying GCで新しいスタック領域に移し計算を続行する
- GCのスタックを走査する部分にはCPUに依存しないので、Cだけで書ける
昔Sigplan Noticesで読んで面白いと思った。
bison / yacc の使い方の質問です。 bison とか yacc って、みんな初めは電卓作りますよね。 3 + 5 (Return) って入力すると「画面上に」8をprintfするやつ。 これ、画面上で8を返すんじゃなくて、 yyparseの返り値とかそういう感じで yyparse の呼び出し元に 8 を何とかして知らせる方法ないですか? ただし、グローバル変数は使わないものとして。
>>633 /usr/lib/yaccpar とか /usr/share/bison/bison.simpleを書き換える。
bisonは
#define YYPARSE_PARAM foo
を定義しておくと、void *fooが引数として渡されるから、アクションでその中に
答を入れて返すようにすればいいのでは。
プログラム中からyyparseを複数回呼出す場合は、先読みバッファの再初期化に注意。
635 :
名無し@沢村 :04/05/24 21:41
おまいらよ、おれはつい最近つーか、たったいまさっきtcl/tkつーコンパイラの存在を知ったよ。 いまDLしてるところで、まだ開けて見てないんだが、Webでの説明を見た限りじゃなんか良さげだった。 つーか、GUIに関しては、Visual C++よりもちゃんとしたGUIアプリが簡単につくれるとのことだ。 ただ計算的な処理には不向きということだが、そこは何かC言語で書いて追加できるとのことだ。 おれはちょっとこのtcl/tkを調べてみるが、ホントにGUIに関して良さげだったら、いま開発中の「Vicual E++」は、 このtcl/tkで書き直してもいいな。Visual C++じゃエディタの予約語の色づけとかチョー面倒だしな… そして内部のメインの処理だけをC言語で書くようにすればいいからな… それができそうかどうかをまず調べてみようと思う。 次に調べたいことは、おれが次につくりたい高級言語に、tcl/tkはオープンソースらしいから、パクレる部分があるかどうかということだ。 ともあれ、おれのコンパイラの開発は飛躍的に前進しそうだな。 おまいらよ、おれはtcl/tkいま知ったぞ。おまいらは、tcl/tk知らなかっただろう?
>>635 tcl/tkって「チックル・チーコ」って読むんだよね?
638 :
名無し@沢村 :04/05/24 23:49
Tcl/Tk、DLしたが、何やこれわぁ!?スクリプトやないか? 実行ファイル作成できんのか?HSP以下か?ゴミソフト!!!
セックル・チンコ
>>638 tclsh, wish という位だから、tcl/tk は一種のシェルだよ。
C から system() でシェルのコマンドを実行するのと似た様な感じで使える。
まぁ、もちっと面倒だけど。
俺も以前 tcl/tk からパクれる所が無いかなとソース眺めてみたけど、
C で実装されている部分は低レベルな所だけだったような。
TclつったらPerlと同じくらい歴史の長いスクリプトなんだが アホは知らなかったのね。
>>641 言語で大事なのは歴史の長さよりも話者人口だよ。
歴史の短い Java をみんなが使うのはなぜだと思う?
Algol や Prolog が滅びたのは?
今頃Tcl持ち出してくるなんて100%ネタだと思ってたんですが。 釣りだよね?親切に説明してる640が気の毒だ。
>>642 Algolはともかく、Prologは滅びてはいないだろ。
Algolにしたって、形を変えてその思想は受け継がれているわけだし。
>>642 知名度の話をしてるんだが。なにが言語で大事なのは、だ。
かってに妄想してチンコ膨らましてんじゃねーよキモイ。
642じゃないけど、 妄 想 ま で 制 限 さ れ て た ま る か 妄想でチンコ膨らそうぜ
>>642 Tclはハード設計ツールの組込みスクリプト言語ではメジャーです。
(Tclはいやだけど、独自言語よりはましだよな)
もともとTclはアプリ組込み用だし。tclshもwishも組込みのサンプル
みたいなもんです。
でも結局、Tk のほうが Tcl よりも何倍もメジャー。
649 :
名無し@沢村 :04/05/26 21:18
沢村師ねよ
651 :
デフォルトの名無しさん :04/05/29 19:38
ここは沢村を呪うスレとなりました。
-=、 ̄`―''" |\ `'''―'''" | || |ヽ、_____,へ、 ,...--、 `―‐ァ‐...::', \:::::::::::::::::::: | || |ヽ、___,ヘ、| ┌───┐ i´ ,. ' ..::....`'''‐--‐''"~...:::::::::ヽ ` 、::::::::::::::::| || | ┌─┐ i´ | | │ | -=ニ"_,...、-- ヾヽ、::::::::::::::::::::::::::::::::ヽ `、 `,::::::| || | | │ | | | .| | `''‐-`ヽ.`''‐-..._:::::::〃:::l:::l`ヽ..ノヽヾ,: | || | | │ | | |____| | ,..-‐''''‐----'":::::::`ヽ、 /l:/|::::/l:::lヾ.‐'""' i| l | || | | │ | |.┌─‐┐┌┐.| __,. ' ......:::::::::::::::::::::::::::::::::::: `''1 l! l::::i lヾ|,...-==l. l:| || | └─┘ | |ノ ,ヘ、 | | レ' `ー--‐' ̄`> ....:::::::::::::::::ノ.._,...ヾ!ノ-':::/~ ノ i | || .| | ̄ ̄|ノ / /` .| | ,.. '" ...::::::::::::::::::::::::::ヽ< ̄`>'" `ー‐‐''"ノ..| || |ノ / / | | -‐'"゛`''‐''" .......::::::::::::::::::::::::::::::::::::::{ `‐',ヘ | ,..、_ .| || / / | | /| ....__...:::::::::::::::::::::::::::::::::::::::::::::::::::::::!、 ! ,..-` ,. | || /./ .| | . / | -"--- ....___,...--- ._::::::::::::::::::::`、 `‐' _ィ' V| || ._ _/./ . | └──'´ .,) , '" ̄..::::::::::::::::::::::::::〉__,..w、ァ'"Vハノ | || `ー─‐'´ `ー───'´ ,..--- ....__,. ' ....:::::::::::::::::::::::::::::::::::::::::Vi,..ハ---'" | || ,. ' .....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::'、. ― .| || -=-‐-‐'゛`''‐-.._ _,..-----==- .:::::::::::`ー.`--‐'",'| ||
沢村が全てを台無しにしたんだな。
マルチスレッドが良く分からない。マルチスレッドなコードを生成するのには コンパイラ側で何かしてあげなくてはいけない事があるのでしょうか。 それともランタイム環境の問題なのかな。
tls(thread local storage)なんてのが言語仕様として定義されていればコンパイラはそれを意識する必要があります。
>>655 完全にライブラリレベルなのかなと思っていたのですが、そういう訳でもないんですね。
pthread ライブラリを wrap して、他のライブラリも MT-Safe に作れば良いのかと
思ってました。どうもありがとうございます。
インタープリタなんかではスレッド作るとそのスレッド専用の VM が起動する処理系が あるみたい。コンパイルされる言語でも、スレッド毎にランタイム環境を作ってあげれ ば良いのかな。
>>657 コンパイルされる言語の場合は、ホスト環境のpthreadライブラリを呼び出す様に
すればいいのでは?
今後主流になると思われるSMP環境を考えたら、複数のCPUを有効に使えるかも
>>658 pthread_create() が C の関数を引数に取るので、クロージャとかを渡したい場合に
何となく面倒じゃないかなと思ってました。変数部分は引数として渡してあげれば
問題無いような気がしてきました。
bison と flex を使っています。 flex では yylval をガンガン使っています。 bison で %pure_parser したら flex が吐き出す C コードのコンパイルで氏にました。 どうすれば %pure_parser しても yylval (と同じような機能) を flex で使えるでしょうか。
boostのspiritっていじって遊ぶにはよいけど、 実際問題使えるものなのかな?
663 :
デフォルトの名無しさん :04/06/18 16:14
boost::spirit便乗質問なんですがパースした後 parse_infoのfullを調べるとエラーが発生したか確認できますが エラーが発生した行番号を取得するにはどうやったら良いんでしょうか?
position_iterator(勘
665 :
デフォルトの名無しさん :04/06/19 22:30
うわ、みてみると確かにそれらしい気配が・・・ しかし、よく意味が分からない罠・・・
JJTreeでJVM上で起動するスクリプトを書くのはアリですか?
だめ
668 :
デフォルトの名無しさん :04/06/23 23:35
このようなコンパイラ誰か作ってもらえません? イメージ的にはVMを介さない.NETみたいな。 開発の形態はApacheみたいに元となるものがあって ユーザーが拡張プラグインを自由に作って公開できるようなのがいいな。 ・ネイティブコードを吐く ・OSは問わない ・VMなどを介さない ・メインとなる構文はあるが、ユーザーが自由に構文を追加・変更できる。
>>669 D言語って名前くらいは聞いたことあるんですけど、
>>668 で書いたようなことを実現しているんでしょうか?
Lisp系を使えばいいんでないかとオモタ
>>668 このようなコンパイラ誰か作ってもらえません?
というクレクレな割に
> ・ネイティブコードを吐く
> ・OSは問わない
いきなりハードル高い
>>673 APIの類を使わなければ大丈夫
CPUは限定されるが
ダメですか…orzガックリ こっそり作ることにします。
.NETだから、膨大なライブラリで動的な言語で言語非依存のバイナリインターフェイスを持ってないとダメだな
goto 677
nop
lea eax, dword ptr[eax]
>>674 > APIの類を使わなければ大丈夫
画面を含む一切の入出力ができなくなりますが
ブートから初めてVESAなり叩けば良い
>>668 は実行可能ファイルとは一言もいってない訳だが。
gosub 687
>>683 >画面を含む一切の入出力ができなくなりますが
要求事項にないから、いいんじゃない?
>>683 GCC があるんだから自分の好きな言語のフロントエンドを書けばいいじゃん。
簡単に言ってくれるが、gcc難解すぎて弄る気にならん
>>689 GCCのフロントエンド書いたときあるの?
>>685 まあ、ここ見てる奴は「ネイティブコード」と書いてあるからそんな疑問は浮かばんわけだが。
ネイティブコードと、オブジェクト(実行可能)ファイルを混同して考えるのはお前くらいなものだが。
C--は使ったことあるよ。 結構面白いけど、関数型言語とか論理型言語とか、 実装研究がまだまだ行われている言語向けだなあ。
698 :
デフォルトの名無しさん :04/06/29 18:16
Common Lispのプリプロセッサ(マクロ)って そんなに自由度が高いの?
>>698 自由度は高いよ。
マクロ定義とは実質的にLispコードを生成する関数だとか。
まあ、C++のtemplateもだけど自由度が高ければ高いほど解読しにくいわけで、
達人以外が使っても生産性が大して上がらない気もする。
Lispのマクロは 評価時に展開されるから *プリ*プロセッサとは言わない
>>700 評価に先駆けて展開しといたり、
コンパイル時にも展開できるわけだが。
まあ話を平たくすると、いつでもできるわけだ。
>>701 Lispの評価器に関する知識が必要な話を
マクロ=プリプロセッサという世界のの人に
今説明しても混乱するだけかと
>>698 S式を二回評価すると思ってね。(おおざっぱ)
一回目でプログラムの生成、二回目で生成されたプログラムの実行。
LispはデータもプログラムもS式だから、
こういうのは機構的にもプログラミング的にも簡単。
一度遊んでみると良い。
C, C++だと MYMACRO(a,b,c) { ... } // a,b,c,..は可変個引数 から int a=0; int b=1; int c=2; ... my_macro_end(a,b,c); を生成するようなのは書けないでしょ? Lispのマクロはできます。 C++やJavaだとデザインパターンなどで似たようなコードをクラス毎にあちこち で書かないといけない(が、C++のテンプレートでは表現できない)ことがある。 そういう場合にパラメータを与えて雛形からコードを生成するスクリプトをRuby などで書くことを考えましょう。 Lispのマクロなら全部Lispだけでできます。
後はなんだろう。処理に必要なデータを静的に持っておきたいとしましょう。 例えば、isdigit()のために、その文字が数字かどうかを記録した1バイト文字 256個分のテーブル(文字が数字なら1、数字でなければ0)を定義したいとします。 そこで、 int isdigit_table[] = { 0, 0, 0, ...., 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, ...., 0 }; と書く代わりに int isdigit_table[] = { (eval-when-compile // コンパイル時に実行 int table[256]; char* digits="0123456789"; memset(table, 0, 256); for (char* d=digits; *d!='\0'; d++) table[*d] = 1; return table;) }; みたいなことを書けば、(eval-when-compile ...)で囲んだ処理をコンパイラが 実行して、その結果のテーブルとして同じ中身のisdigit_tableを定義できると 思ってください。 C++だとコンストラクタでもできますね(コンパイル時でなく実行時になりますが)。 要するに、C/C++のマクロ(cpp)が格段に高機能な言語になったとしましょう (C自体では嬉しくないから、RubyとかPHPとか?)。その場合のC,C++に相当する本 体の言語がLispであり、ついでにcppの言語も同じLispになったと考えればいいです。
まあLispは面白い言語なので SICPは読んで損がない本だと思うよ
707 :
デフォルトの名無しさん :04/07/01 23:20
まぁ、LISPやる奴で実用的なプログラム書ける奴見たこと無いんだけど?
>>707 emacsってそんなに使い物にならない環境なのか。なるほど。
やっぱvi?(違
xyzzyがWin emacsの筆頭?
>>704 C++でならTypeList or boost::mpl使えば書けそう。
まあ流石に100個も200個も可変長引数を渡されると無理だろうけど。
ECMAScriptを解析してくれて、しかも組み込み関数・オブジェクトを定義できるライブラリが欲しい 自作すると変数宣言と組み込み関数・オブジェクトのみになりそうだ
Schemeは括弧さえ折り合いつけば最高の言語の一つだ
>>711 クロスプラットフォームなら spidermonkey とか、
Windows だけでいいなら ActiveScript とか。
どちらでも簡単にできるよ。
>>709 >Win emacsの筆頭
Meadowの方が広く使われてます。
>>713 SpiderMonkeyはかなりよさげだね
しかし英語だらけで組み込めるのは当分先か・・w
>>704 そういうプリプロセサ書いて、差し替えれば済む話だと思うけど。
全部 C/C++ でできますよ。(藁
C/C++ではたしかpreprocessor commandsも規格の一部な罠。
プリプロセッサを差し替えるオプションなんてあるの? Visual C++とgccを見たけど見つからなかった。
>>716 それじゃ「コンパイラ書けばできますよ」ってのと変わらないやん.
>>718 自分のプリプロセッサから、コンパイラ呼べばイイだけじゃない?
>>720 そりゃそうだ。でも差し替えるとは言わんな。下らないことをきいてしまった……。
差し換えるならspecファイルだろ。
>>718 GCC とかならソースあるんだから、適当に修正して実行ファイル入れ替えれば良いんじゃないのか ?
>>719 まあ、そりゃそうだけど、コンパイラ書くより多少難易度は低いだろ。
結局使い物にはならないと。 普通のアプリケーション書くのに特定のコンパイラのバージョンとそれへのパッ チ込みで保守したくはねーなあ。
まあ、このスレ的にはコンパイラまで作ってしまえって事になるかな。 TinyC->.asm位だったら簡単だしね。 俺は#defineなどC言語準拠なプリプロセッサに アセンブラ風の複数行マクロを使えるような物を作って、 言語ごとに微調整しているよ。 ()を使わないバージョンなどね。 エラーを探知するために、##lineっていう 現在のコンパイル行をプリプロセッサ->コンパイラへ通知する命令をつくって、 デバックもしやすくしているよ。
>>724 て言うか、普通のアプリケーション書くのに
>>704 みたいなことはあまり必要ないだろ。
マクロプロセサやプリプロセサが高機能だと色々おもしろいけど、実際のところ後の保守が大変だったりするからあまり使わん。
昔使った PL/I のプリプロセサは、IF 文は当然、FOR/WHILE の制御構造や PROCEDURE/FUNCTION なんかの手続き/関数定義までできた。
だから凝った定義を書けば、ソースを短く書けたけど、プリプロセサ文をデバッグする手間を考えたら素直にソースを手で展開した方が早かったよ。(藁
MASM なんかのマクロアセンブラでも同じような経験したことある人は多いと思うよ。
俺はわりとしょっちゅう欲しくなる方だな。
Lispのマクロで俺言語を作ることを考えると
>>726 も想像はできるけど。
>>726 とは逆に最初書くときはベタに展開したソースを書くけど後から
保守性を考えてマクロでまとめることも。あまり凝ったことはしないけどさ。
cppに変数とifとfor eachだけでもあれば世の中もうちっと良かったろうに。
728 :
デフォルトの名無しさん :04/07/13 22:28
コンパイラとかの参考図書は、よくありますが スクリプト言語の参考図書(定番)は、ごぞんじないですか?
各OS毎のリソースコンパイラの作り方に触れたサイトってありますか?
>>728 コンピュータアーキテクチャの本じゃないか?
>>730 構文解析だけじゃなくて、実行機の話してるんじゃないの?
732 :
デフォルトの名無しさん :04/07/14 01:26
すいませんyacc/lex初心者の質問です。 WIN XPのコンソールから GNUのFLEXとBISONとボーランドのBcc32でコンパイルしてるのですが bisonとflexは通過するのですが 最後のCコンパイラのリンク時に"yyllocが定義されてない"というエラーが出てしまいます。 bison.simpleとbison.hairを見てもよくわからないので なにがまずいのでしょうか?
>実行機 ってなんじゃらほい?
>>728 『インタプリタ進化論』なんかいいのでは。スクリプトに特化した内容ってわけでもないけど。
735 :
デフォルトの名無しさん :04/07/14 19:49
このスレでよく出てくるyaccやlexってのはソフトウェアなの? それともライブラリの類? で、実際にはどのようなことをするものなの?
つまり、字句解析や構文解析をするソフトウェアね。 コンパイラにおけるそれらの処理を外部のソフトウェアに 頼ると言うのは有りかね?
おみゃ〜らよ、おれのスリムドカンはある意味コンパイラよ。
スリムドカンはおれのページにあるから見ちみれ?
http://hp.vector.co.jp/authors/VA015412/ おみゃ〜らよ、おれはいまリソースエディタをつくってるのよ。
スリムドカンに装備させるためよ。
おみゃ〜らよ、コンパイラをつくるのはいいが、リソースエディタのないコンパイラはコンパイラとはいわんぞ!
自分じわかるかな?
>>737 字句解析や構文解析をするソースコードを生成してくれるソフト
これ以上は自分で調べてくれ
742 :
デフォルトの名無しさん :04/07/15 18:37
昔、OL進化論っていうのがあったなぁ〜 ちょっと思い出したw
インタプリタ進化論って、絶版じゃなかったっけ? 読みやすい本でいい本だと思うけど、 実行環境の話はそれほど無かったような気がします。 とはいっても、字句/構文/意味解析を作るより 実行環境を作るのって、力業でできますしそんなに難しくないと思いますよ。
My VMをレジスタマシンにするかスタックマシンにするか悩む スタックマシンにすると決めた、するとbytecodeにするかwordcodeにするかまた悩む スピードの為にwordcodeにするならそもそもレジスタマシンにするべきなのかと悩む 一向に前に進みましぇん
全部作れ。
おみゃ〜らよ、おみゃ〜らさーん♪
おりはよ、「Slim de Can」を使ってあるボタンをクリックしたらある処理を行わせ、別のボタンをクリッしたら別の処理をおこなわせるプログラムの作成についに成功したよ。
つまり「Slim de Can」はすでにイブントドリブンプログラムがつくれる環境になっているということを自ら証明したという次第よ。
おい、「Slim de Can」はすでに簡単なゲームくらいはころっとつくれるぞ。誰かつくらんか?
「Slim de Can」ってすげ〜な〜。
おりはもう神だね♪どうよ?
http://hp.vector.co.jp/authors/VA015412/
748 :
デフォルトの名無しさん :04/07/16 22:00
コンパイラ作るならBNF記法(拡張)についての理解は必須ですか?
無くても作れるよ。あった方が楽だけど。
context free grammerについては「理解」という程大変なことはない気がする。 # オートマトンを理解するにはちっと勉強が必要になるが、 # それこそ知らなくても何とかなりそう なおLL(1)文法と属性文法を学んでしまえばりっぱな「コンパイラ」が作れると思う。 # リンカとかアセンブラとかの知識は既習だとして
751 :
デフォルトの名無しさん :04/07/17 03:09
言語設計はともかく、コンパイラ設計となったら フロントエンドよりバックエンドのが難しいというか 面白いと思うんだが、どうしてフロントエンドの話しか出ないんだろうか?
たぶん、そこまで行きつかない奴しかこのスレにいないから。
バック部のトピックス ・並列化(ループ,タスク.手続き間解析は必須) ・別名解析(フロー依存はまだ重い) ・SSA(冗長コピーをどう減らす? 別名の扱いも) ・コピー伝播(非常に重要.でも語ることは余りないか) ・部分冗長性削除(やりすぎると性能悪化することも.ライブレンジを考慮) ・CPS(手続き型ではやらんか) ・レジスタ割付け(PowerPCとかなら素直だが,制約のきついCPUだと面倒) ・ソフトウェアパイプライン(最内からやらない手法が最近発表されてた) ・命令スケジューリング(コンパイル時間爆発の主犯) ・SIMD命令やDSP命令の生成(上から下までからむので大変.パターンマッチしかない?)
754 :
デフォルトの名無しさん :04/07/17 18:50
本日、佐々政孝氏の「プログラミング言語処理系」という本買いました。 コンパイラについてちゃんと学んでいこうかと思います。
バック部はCにトランスレートする事で済ませちゃってるから、あんまやらないんだよな。 とはいっても、最近の仕事でそういうのをする必要もあったりして 書籍紹介とかやってもらえます?
そういや 21st Century Compilers 読んだ人いる?
758 :
デフォルトの名無しさん :04/07/17 20:18
バックエンド「も」それなりに解説している本としては龍本はもちろんのこと、appel本や中田本がありますね。 龍本がバックエンド概要集だとすれば、 appel本が実践本、中田本が理論本といった感じでしょうか? バックエンドオンリーな変り種としては Robert Morgan: Building an Optimizing Compiler (ISBN 1-55558-179-X) ってのがあります。こいつは本当にバックエンドしか書いていません。
759 :
デフォルトの名無しさん :04/07/17 20:21
いまだに龍本なの? 進歩ないね。
何でそんなに詳しいのに新たな言語を作ろうとしないの?
>>757 がぁん。評判よければ夏休みにでも読もうと思ってたんだが。
目を通すだけで満足だから何も作らんのだろうな
バックエンドまで作りこんだ言語を書いても、それで食ってける人はごく少数だし。 理屈を理解して普段のプログラミングに生かせれば、それで良いかと。
>>761 本当はコンパイラの原理とかよく分かって無いんだよな?
原理を理解→新しい言語、でもあるまいに
>>760 一番多い需要は新しい言語の作成ではなく、特定分野特化物だからだよ
趣味の人は確かに新しい言語って事になるんだろうけどね。
言語ビジネスは死々累々とはMatz氏の言
>>768 つまり「俺ってば勝ち組w」と主張されたのですね?
>>764 その反対でバックエンドがほとんどのお仕事もあるよ、
特殊なDSPとかの強力オプティマイザ付き簡易言語関係とか。
771 :
デフォルトの名無しさん :04/07/18 13:04
割込みすいません、bisonの-v出力で得られる State番号と、もとのソースの行番号を関連づける情報ってどこでしょうか? 同様に、 Rule番号と、もとのソースの行番号を関連づける情報ってどこでしょうか? bisonマニュアルやbison本(といっても古いだけですが)を見ても、載ってませんでした。
>>771 行番号との関連?
別に行番号とは関連しないんじゃない?
どうも、Conflict が発生するようで、いろいろと原因を探ってるんですが、 「State何番が何番とconflictした。」とか出て来るんですが、 具体的にソースのどこがいけないのか場所を探すのに、いつも苦労しているのです。
774 :
デフォルトの名無しさん :04/07/20 17:56
構文解析器を作るのに正規表現が必要になりますけど、 正規表現の構文解析ってどうすりゃいいんでしょうか? ものすごく再帰してるんですけど?
再帰っつーか永久ループですね。
>>774 >構文解析器を作るのに正規表現が必要になりますけど、
無くてもできます
>>774 有限オートマトンでぐぐるか、適当な正規表現ライブラリのソースを読め。
778 :
デフォルトの名無しさん :04/07/29 19:55
FLEXについて調べているんですが、よくわからないので質問させてください。 UNIXで書かれた字句解析ソース(moto.l)をWindows上で使いたいのですが、 これってWin用のFLEXを使用してmoto.lから、moto.cを作成して それをVisualStudio.Netなんかで、ビルドすればいいんでしょうか? Win用FLEXで吐き出されたmoto.cをビルドしてもエラー出まくりなもので・・・・ なにかうまい方法などあるんですか? (なぜか元の字句解析ソース(moto.l)も一緒にビルドしてしまいエラーになりま す。。。) わかる方がいらっしゃいましたら、 ご教授お願いします。
なんとなく改行コードの問題?
781 :
>>778です :04/07/30 11:15
>>779 >>780 レスありがとうございます
改行コードは、LFからCR+LF 文字コードEUCからSJIS
に変更をかけ、「bison & flex compiler for Windows GUI」を使って
コンパイルをかけ、できたCソースを.NET2003でビルドかけました。
一応、エラーは
「Zsscanf:1番目の引数を'unsigned char*'から'const char*'に変換できません」
というのが、大量にでました。
(これは、Zsscanf関数を大量に使用しているんででています。)
また、warningとして
「C4244 '=' _W64 int から intに変換しましたデータが失われているかもしれません」
というのが、たいりょうに出ています。
もしよかったら、ソースをお送りしますが・・・
よろしくお願いします。
>>783 あぅ、上手く行っても、変更点の説明がしにくいと思うので、ソースもよろしこ。
#なんとなく見えてますが、上手く行くかどうかは不明。
yytext は YY_CHAR* 型で,これは unsigned char * の typedef になっている. Zsscanf は Zsscanf(const char*, ...) と定義されている. Zsscanf(yytext, ....) というように呼び出しをしたい. ということで 1. Zsscanf の第1引数の型を unsigned char * にするか 2. Zsscanf の呼び出し時に毎回キャストするか のどっちかで対処できるんじゃないかと思う.
3. コンパイラのcharをunsignedにするオプションを指定する
788 :
ありがとうございます!! :04/07/30 14:18
みなさん ありがとうございます。
とりあえず
>>786 さんの
「1. Zsscanf の第1引数の型を unsigned char * にするか」で
対応し、エラーを回避させました。
それともう一つ基本的な質問ですが、
この作成されたCソースファイルは、
どのように動作させればいいのでしょうか?
ライブラリとして動作させる場合、
どの関数をよべばよろしいのでしょうか?
(main関数を作成し、それから呼ぶのもどうすればいいのでしょうか?)
すみませんが、ご教授お願いします。
>>785 とりあえず、こちらはCygwinのflexしかないので、それでのやり方を説明しておきます。
まず、この部分
int nmatch = 0;
int len;
const char *base;
char buf[255];
va_list ap;
va_start(ap, fmt);
char skipflag;
va_start(ap, fmt) の後に char skipflag がありますが、これはC言語の構文として許されません。
以下のように書きます。
char skipflag;
int nmatch = 0;
int len;
const char *base;
char buf[255];
va_list ap;
va_start(ap, fmt);
コンパイル方法
http://www.cygwin.com/ より "Install or update now!" をクリックして実行してください。
あとはメッセージにしたがって、インストールするのですが、パッケージの選択のところで flex を入れておく事。
flexの入っているフォルダーにパスを通したら、
flex flex_test.l
cl flex_test.c
以上です、
あと、_yywrap _yylex はちゃんと定義して置いてください。
出力結果をC++としてコンパイルしたいのであれば、786氏の意見を参考すれば良いかと思います。
>>788 yylexを呼び出します。
そのあたりは初歩の初歩部分なので、適当に参考書でも買ってきて調べてみるとよいでしょう。
入出力の特化は結構ややこしいので・・・
791 :
>>778です :04/07/30 14:53
みなさん いろいろ教えてくださってありがとうございます。。。
>>790 さん
yylex()を呼び出すというのまでは、調べたのですが
これを呼び出すとDOS窓で入力待ちなのかどうかは、わかりませんが
止まったままになってしまします。
いろんなサンプルを見てみたら
単に
return yylex();
としているだけなのが、あったので
このように書いていたのですが・・・・
こういう呼び出し方ではいけないのでしょうか?
何度も何度もすみませんが、
ご教授お願いします。
>>791 一番簡単な方法は
yyin = fopen( ... ) ;
として
yylex()
を呼び出します。
793 :
>>778です :04/07/30 15:18
>>792 さん
ファイルからの読み込みではなく
指定された文字列を受け取って
それを変換かけてから、変換後の文字列を
返すというようなプログラムを組みたいのです。
yytextに指定文字列を入れてから
yylex()を呼び出せばよろしいのでしょうか?
(どこかのサンプルでこのような形のものがあったのですが・・・)
>>793 ちがいまーす!!(^^;
実は貴方のやりたい事は、書き始めると結構ヘビーです。
素直にflexの本を買ったほうが良いかと・・・・
どうしても買いたくなげは YY_INPUT マクロを気合で読んでみるとか?
>>794 さん
では、入力したい文字列を
一度ファイルに落としてから
再度、yyin = fopen( ... ) ;
で読み込むという方法だと
まずいでしょうか?
>>795 それで問題がなければ、それでも良いかと・・・・
797 :
>>778です :04/07/30 16:27
今のサンプルFLEXプログラムは「H16/7/16」を「平成16年7月16日」に 変換するものなんですが、ファイルに「H16/7/16」を書き込み、保存してから yyin = fopen( ... ) ; として yylex() を呼び出すと、「ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ」などと 文字化けが出てしまい、途中で終了してしまいます。 これって何が原因があるのでしょうか?
cygwin でやるんだったら、ソースファイルとテスト用入力ファイルは EUC にしておく。lex(flex) はマルチバイト文字をマルチバイト文字として扱わないからDIGIT [0123456789] の書き方だとダメ。 DIGIT (0|1|2|3|4|5|6|7|8|9) だと動くみたい。
799 :
デフォルトの名無しさん :04/07/31 00:18
すいませんが、bison.output の見方を解説しているページとか ご存知ありませんか?
>>799 見方を理解しようとしないで、LR解析をある程度理解した方
が良いと思うよ。
そうするとbison.outputの意味が分かるようになる。
LR解析を理解するための、書籍とかありますか?
はじめてのLR
803 :
デフォルトの名無しさん :04/07/31 22:54
1つの先読みだけしか許されないというのは、かなり不自由かも。 LR(1)を完璧に実装した yacc もどきってご存知ないですか?
800ゴット
>>799 =801
コンパイラ系の書籍ならば、大抵構文解析の説明はあるでしょ。
手元の本だと『ドラゴンブック』と『コンパイラの理論と実現』と
『コンパイラ(昭昇堂)』にLR解析の話が書いてある。
>>803 知らないけど、あまり不自由を感じたこと無いな>先読み1
たいしたもの作ってないからかな。
LR LL LALR ってなんの略? (1) ってのは1つ先見るってことでよい?
manの番号
>>807 Lonely Rotary
Lonely Lolita
Lolita and Lonely Rotary
>>807 LR:左から読んで右から導出
LL:左から読んで左から導出
LALR:ルックアヘッド付きLR
【LR】Left-to-right scanning, Right-most derivation in reverse 【SLR】Simple LR 【LALR】LookAhead LR 括弧内は先読みのこと
812 :
デフォルトの名無しさん :04/08/01 15:47
LALR(3) ぐらい欲しい。
>>812 探せば GLR 使えるパーサジェネレータもあるぞ。
>>812 漏れはむしろ「欲しい例」を出して欲しい。
世の中LALR(1)が圧倒的な主流。 それ以外はただの学問的な研究対象か趣味。 まぁ、炉利趣味と同レベルw
DelphiはLALRじゃないのでは?
>>815 C++ は LALR(1) に収まらないワケだが。
818 :
デフォルトの名無しさん :04/08/01 21:49
>>817 それは書き方が悪いからでしょ?
あんなもん、書こうとおもえばいくらでも当てはめられる。
(と思う。)
俺はめんどくさいから再起下降でいいよ
俺は再帰降下でいいや
抗菌加工でいいや
822 :
>>778です :04/08/02 15:41
お礼が遅れましてもうしわけございません。
ありがとうございました。
>>794 さんがおっしゃっていた YY_INPUT のサンプルをいろいろ
探したのですが、これの他にもDOS窓から入力された文字列を
変換するなんていうマクロなどありますでしょうか?
>>822 YY_INPUTのサンプルって例えば何?
サンプルとかじゃなくて、実際のflexが生成するYY_INPUTマクロを見た方がいいよ。
さらにlexの実装によっては、どう工夫してもお望みのことができないもの
もあるから、「文字列から入力」っていうのは可搬性の面ではよくない。
とりあえず、flexだったらYY_INPUTを定義し直せばOK
YY_INPUTってのは
YY_INPUT(buffer, result, bufsize)
buffer:文字列を格納するバッファ
result:実際に読み込んだ長さ
bufsize:バッファの大きさ
で、デフォルトではFILE *yyinから読むようになってるはずだから、それを
君が解析した文字列から読む(コピーする)コードにすれば良いね。
そのまま他の環境にコピーしても動かない可能性があるので注意。
824 :
>>778です :04/08/02 17:55
>>823 さん レスありがとうございます。
確かにYY_INPUTは、FILE* yyinを使って処理していますね。
っということは、scanfなどで入力した文字列をYY_INPUT(buffer, result, bufsize)
のbufferにコピーしてあげるようなコードを書けばよいということでしょうか?
また、違う例として、DBに格納されているデータを取得してきて、
字句変換させるために
FILE* yyinならぬextern char* yyin_charなるものを作成して
まずはそこにDBのデータをコピーし、YY_INPUT内でbufferにyyin_charを
コピーしてあげるような動きでよいのでしょうか?
また、実際にmain関数などから、YY_INPUTを呼ぶには、直接呼んでも
よろしいのでしょうか?
質問攻めでもうしわけございませんが
よろしくお願いします。
>>842 おいおい、なんか間違えてるぞ。前半は正しい感じだけど、最後のが…?
質問に答えるのは構わないけど、その前に一つ質問させてくれ。
Q. YY_INPUTマクロとは何でしょうか?
(何をするものか、誰が使うものか、どこから使うものか、yylex()と
YY_INPUTの関係とかに注目。)
これに適切に答えられれば、
>>824 にあるような質問は無いと思う。
さらにおまけとして…、YY_UNPUTとは何?
(ヒント:flexの生成するlex.yy.cにすべての答えがある。)
826 :
デフォルトの名無しさん :04/08/02 22:21
結局 >>815は正しいの?
827 :
デフォルトの名無しさん :04/08/02 22:22
>>800 質問です。
Lex & Yacc (Nutshell) はいかがでしょうか?
これもLRを解説してますか?
>>827 解説してないね。
でも、典型的なシフト還元衝突などの説明と回避方法の解説はある。
ってかこの本もう絶版じゃない? 手に入るの?
>>791 yyinを指定しないと入力が標準入力になるからそうなるのでしょう
yyworld
832 :
デフォルトの名無しさん :04/08/06 23:12
>>829 一応あるみたいです。
やはり、ドラゴンを理解しないと
shift/reduce & reduce/reduce の衝突を完全回避することは難しいですかね?
833 :
デフォルトの名無しさん :04/08/06 23:13
在庫だと思われます。↑
834 :
デフォルトの名無しさん :04/08/09 23:38
注文してしまった。
835 :
デフォルトの名無しさん :04/08/30 00:46
age!
836 :
デフォルトの名無しさん :04/08/30 14:29
「コンパイラ構成法」の原田賢一氏の研究室のサイトが見つかりません。 移転したんでしょうか? どなたか、ブックマークつけてらっしゃる方います? コンパイラ構成法のソースコードをゲットしたいんですが。
う〜ん。名前空間の実装法がわからん。 だれか、参考になるサイトか書籍、知らないか? クラス定義と同じ方法で良いのかなぁ?
>>837 シンボルテーブルのスタックを作ればいいだけじゃないか?
>>838 >シンボルテーブルのスタックを作ればいいだけじゃないか?
それってディスプレイ・・・・・だよねぇ。
ブロックを開くときに名前を覚えておくようにするんだろうか?
例えばC++には複数の名前空間があってややこしい キーワード 演算子 プリプロセッサ 型 変数 namespace これらは関係を持ったりするしね まあプリプロセッサを除いて基本はみな同じだけど
名前空間は 関数 namespace クラス だけじゃないのか?
::、using、export、importが絡むとさらに複雑になる
:: using は簡単 export importはどうだろ
>>840 何を持って基本というか知らんが、実装しようと思うと namespace は深いぞ。
ADL と関数テンプレートとか。
所詮 namespace は、バカ避けの機能。 優秀なコンパイラ屋が血反吐を吐きながら実装するものの、 それによって実行速度が向上する訳も無く・・・ そもそも優秀なプログラマならば、最初から namespace など 必要としない確固としたコーディングスタイルを身に着けている。 そしてバカなプログラマは、せっかく実装してもらった機能の 使い方自体が分からない。バカは所詮バカ。 namespace って、一体何の為にあるんだろう・・・
↑ホームラン級のバカ
所詮 型 は、バカ避けの機能。 優秀なコンパイラ屋が血反吐を吐きながら実装するものの、 それによって実行速度が向上する訳も無く・・・ そもそも優秀なプログラマならば、最初から 型 など 必要としない確固としたコーディングスタイルを身に着けている。 そしてバカなプログラマは、せっかく実装してもらった機能の 使い方自体が分からない。バカは所詮バカ。 型 って、一体何の為にあるんだろう・・・
ダウト。残念ながら、型によって実行速度は上がるんだよ。
いくらなんでも型は重要だろう。
>>845 評価尺度が実行速度だけとは……。1960 年代の人間ですかい?
60年代だったら消費メモリも重要だな。
852 :
デフォルトの名無しさん :04/09/04 01:00
所詮「コンパイラ・スクリプトエンジン」相談室 は、バカ避けのスレ。 優秀なプログラマが血反吐を吐きながら回答するものの、 それによって理解が向上する訳も無く・・・ そもそも優秀なプログラマならば、最初からこのスレ など 必要としない確固とした技術を身に着けている。 そしてバカなプログラマは、せっかく回答してもらった説明の 内容自体が分からない。バカは所詮バカ。 このスレって、一体何の為にあるんだろう・・・
namespaceは最高だな。 感動もんだ。
>>852 無理してまで回答は僕もしないし、他の人もしてないんじゃない。
コンパイラやスクリプトを作ろうという人口は少ないから過疎なのは仕方が無いが
僕は日ごろから巡回しているし、このスレ向きの質問書けば回答は帰ってくるよ。
もちろん僕もクレクレ君とOO厨房の言語論争的な話題は放置してるけどね。;-P
キミには分らないかもしれないが機能しいてない掲示板ではないよ、
進行が遅いに加えて近頃アホっぽい話題が充満しているだけだ。
ひさびさにコピペにマジレス見た・・・
型の実装について教えてください。 現在 int のみのコンパイラは作れたのですが float などを追加しようとすると例えばスクリプト中の変数に型情報を持たせて 実行するときに int か float か if で判断するしか無いのでしょうか? 2つならまだしも double とか char を追加するとなると代入するとき等の型判定で 組み合わせの爆発が起きそうなのですがなにか良い方法はないでしょうか? 速度的に。
テーブル作るか int float を別文法にしてしまうか…… てか、こんな事は自分で考えろ。
>>858 >現在 int のみのコンパイラは作れたのですが
>float などを追加しようとすると例えばスクリプト中の変数に型情報を持たせて
>実行するときに int か float か if で判断するしか無いのでしょうか?
って、そんなのコンパイル出来たって言えないやん。。。
何の為の型なのさ?
変数に型情報があってコンパイラを作っているのなら、 コンパイルの時点で型にあったコードを生成するだけだろ。 実行時じゃなくて。
>>859-861 おぼろげながら自分の間違いが分かってきました。
どうもです。
もう少し考えてみます。
>>858 実行時に型チェックするかコンパイル時に型チェックするかは、言語の設計に
大きく関わってくるけど、まぁどっちでも良い。
コンパイル時に型チェックしたければ、たとえば Yacc 風に書くと
IDENT '=' experssion:
{
// まず IDENT が変数名であることを確認
// 次に experssion の型が IDENT の型に変換できることを確認
// 型変換して代入するコードを生成
}
;
ってな感じ。型変換判定は素直に実装すると型の数の 2 乗のオーダーで増えるが、
テーブルにでも書いておけば大した手間ではない。ベタに if - else とかで書くと死ぬ。
866 :
デフォルトの名無しさん :04/09/04 21:46
YACC はバカ避けのソフト。
作ってて楽しけりゃなんだっていい
( ゚д゚)、ペッ
型についてはシンボルテーブルで管理すれば良いでしょ。 シンボル表のエントリに型情報をもたせ、それが基本型を ポイントすることで、個々のシンボルの型を表現します。 struct や class などの基本型をまとめた型を作るときも シンボル表にそれらの新しい型のエントリを作って、基本型を リスト状にポイントしていけばよいです。
870 :
デフォルトの名無しさん :04/09/05 17:16
所詮 lex は、バカ避けのソフト。 (以下ry
>>870-871 意味の無いレスいれるの止めてくんない、近頃こんなレスばっかりで
前後の見通しが悪くてかなわないんだよ、邪魔だから適当な言語死滅スレにでもいってくれ。
その発言は結局荒れるもとになるよ。 そして、大量に無駄な情報のなかから有用なものを抜き出すのが2chの利用法だと思う。
過疎スレでやってくれるなよなとは思う
855=872
876 :
デフォルトの名無しさん :04/09/13 23:46:35
877 :
デフォルトの名無しさん :04/09/13 23:47:49
876=877 wrota書くのに一分もかかってんじゃねーよ。
879 :
デフォルトの名無しさん :04/09/14 23:04:15
3日後 870 名前:デフォルトの名無しさん 投稿日:あぼーん あぼーん 871 名前:デフォルトの名無しさん 投稿日:あぼーん あぼーん 872 名前:デフォルトの名無しさん 投稿日:あぼーん あぼーん 〜略〜 879 名前:デフォルトの名無しさん 投稿日:あぼーん あぼーん 880 名前:デフォルトの名無しさん 投稿日:あぼーん あぼーん 何のためのスレなんだか
なんか恐ろしく自己中なヤツがいるようですが…
882 :
デフォルトの名無しさん :04/09/15 00:36:49
名前もあぼーんになるはずだが
このスレ869までしか表示されないな。
884 :
デフォルトの名無しさん :04/09/15 22:07:01
まぁ、もしアボーンされるとしても、
>>880 が最初だろw
885 :
デフォルトの名無しさん :04/09/20 01:53:27
gccの&&label(Labels as Values)みたいな機能を実現するには、 ラベルは相対じゃなくて、絶対アドレスを取得しなきゃならんのだよね。 void *ptr = &&label; goto *ptr; label: の場合は // void *ptr = &&label; mov DWORD PTR[ebp-04h], label_EA // goto *ptr; mov eax, DWORD PTR[ebp-04h] jmp eax label: こんな感じかな? でも なんで goto ptr; じゃないんだろう? ptrと *ptr は何を指すのか はて。。。
886 :
デフォルトの名無しさん :04/09/20 03:29:47
できたできた。 どうやら型をvoid*にしたのはgccの気まぐれらしい。 ラベルの型なんてないからねえ。 int ptr = &&label; goto ptr; これだとラベルと区別つかないからvoid*にしただけか。 gccは変な構文ばっかだな。
VC++でflex++/bison++でリンカエラー回避できますか?
888 :
デフォルトの名無しさん :04/09/30 22:56:07
アフォはスルーされるという典型例だなw
889 :
デフォルトの名無しさん :04/10/05 23:30:22
C++、Javaで同じスクリプトを動かしたいんですが、 自作するしかないでしょうか。 LuaがJavaに対応していれば一番いいんですが。
>>889 Schemeとか、どっちでも使える言語も結構ある。
そういう意味ではLISP系探すと強いね。 とりあえずS式が読めればなんでもいいわけだし。
>>889 JavaSript というか ECMAScript がいいんじゃない?
簡単だし。
みんな自分が使っているのを薦めている予感。
895 :
デフォルトの名無しさん :04/10/06 21:08:06
bashスクリプトがイイと思うよ。
どうもです。 その辺りのキーワードを頼りに探してみます。 ありがとうございました。
とりあえずECMAScript(の実装)が簡単だという意見が本気でわからん
LISPは1000行も書けばそこそこ使えるものができる Javaだともっと短いかも
>>897 >C++、Javaで同じスクリプトを動かしたいんですが、
>自作するしかないでしょうか。
って質問だったので、C++とJava での実装が容易に利用できる ECMAScript を勧めました。
ECMA Scriptだと、MozillaのSpiderMonkeyとRhinoが 良さそうだね。
Pythonは?
ネイティブコンパイルする処理系を作成中です
完成です
じりじり
907 :
デフォルトの名無しさん :04/10/09 22:31:21
処理系のテストってみなさんどうしてますか 構文、演算子ごとに全パターン網羅できてますか? ある組み合わせで不具合が出る可能性もあるから、 どうがんばっても全部網羅したとはいえませんよね 某スレのD言語なんかろくにテストされてないのがまるわかりですし ある程度テストパターンの自動作成ができればよいのですが そういうアイデアで何かありませんか?
908 :
デフォルトの名無しさん :04/10/09 23:31:27
例えばifが構文のキーワードならif + 1のような並びは構文エラーとなるべきですが、 こういうのはyaccを使った場合も含めてエラーとなることは予測できたとしても 実際にエラーになることの検証まではされていないのが現状だと思います。 これは言語処理系に限った話ではないですが、予測の付かないユーザーの ランダムな入力に対し、はたして適切な処理をしているのかどうか?を検証する 確立された方法はあるのでしょうか? test_if_branch() { int x; x = 0; if (x) x = 2; test_assert(x==0); x = 1; if (x) x = 2; test_assert(x==2); x = 0; if (x) x = 2; else x = 3; test_assert(x==3); x = 1; if (x) x = 2; else x = 3; test_assert(x==2); } こんなものを延々と記述していくしかないのでしょうか。
>>907 全部網羅って C∞ のテストをしたいって事?
910 :
デフォルトの名無しさん :04/10/10 19:19:42
確立した方式など無いと思うが… なので、実績の積み上げしか無いと思われ。
>>908 行カバレッジが100%になるようなテストセットを作るとか。
912 :
デフォルトの名無しさん :04/10/11 21:40:00
Bisonでparseした時、エラーの出た行をしらべるにはどうするの?
flexからbisonに渡すTokenに行番号の情報を入れといて、エラー発生時に取り出して使う、 でいいんじゃない?
>>913 どうもです、flexのhelpみてたらoptionでありました
915 :
デフォルトの名無しさん :04/10/13 21:00:24
>>914 それはflexの中だけだろ?
bisonとは微妙にずれる場合も多い。
>>913 が王道かも。
DLLの関数呼び出しって、参照が一回挟まると思うんだけど、 ループで何べんも呼ぶと普通の関数呼び出しよりパフォーマンスに影響出る? 自分の処理系では参照をはさまない様に(つまりLoadLibraryと同じ方式) してるけどいまいち差がわからない。 それよりも配置情報テーブルのサイズ減らした方が得なのかなと思ったり。
>>916 間接参照になる分だけ、パフォーマンスは落ちる。でも関数内部が
一行だけとかでない限り、あまり気にしないで良いと思うぞ。
とりあえず計ってみたら?
>>917 コンテキスト切り替えとか食らうと凄く影響するけど、
間接参照が一個増えた程度ではパフォーマンスにそれほど影響しないような…
昔、C++ で virtual ありと無しのメンバ関数で速度測ったら
virtual ありの方が速くてびっくりした事もあるし。
それはお前の計り方が間違ってただけだろう。
>>919 誤差で逆転しただけかもしれんがね。
っつか、測定前から virtualありの方が遅いと決め付けてるなら測定する意味が無いような。
>>920 その測定ソース、どんな感じに作ったのか晒してみ。
>>921 virtualありの関数を持つクラスとなしの関数を持つクラス作って
ループでn回関数を呼び出す、ループ前とループ後の時間から
かかった時間を割り出す普通のマイクロベンチだったと思うが。
関数の中身は空だったか、軽い計算させてたかは覚えてない。
あとはアセンブラの出力を見て最適化で関数呼び出しが削除されてない事と
virtualありの方は間接参照を介している事を確認した。
923 :
デフォルトの名無しさん :04/10/16 13:49:08
まぁ、システムをスタティックリンクにしてからだな
日経ソフトウェアの推薦書籍コーナーで、中田さんの本が2冊あげられていた。 取り上げていた人はどちらもすごい方なので、ちと読んでみようかなという気が沸き起こった。
>>927 ドラゴンブックよりも内容が新しいらしい。
>>927 かなり難解ですよ。
ドラゴンブックとかプログラミング言語処理系を読んで
それでも物足りない人向け。
読んでみたくなったけど、高いなあ…
そもそも「最適化」をタイトルに冠してる時点でかなりのレベルが予想されるわけだが... < 中田本 それにしてもドラゴンブックの改訂版(に当たる本),いつ出るんでしょうね...
>>933 「この商品を予約注文する」と表示されたから、まだ出てないのかも…待ちくたびれたよ。
>>934 うはwwwwwwwwwwwwwww
昨日見たときはショッピングカートに入れるになってたんだがw
amazonの罠だったか。
937 :
デフォルトの名無しさん :04/10/31 18:50:33
>>932 そろえるって何?
1つしかないのでは?
揃えるといったら、グリーンとレッドでは?
ポケモンみたい
21st Century Compilersが待てない人は↓がオススメ。 Modern Compiler Design / John Wiley & Sons, ltd Dic Grune / Henri E. Bal / Geriel J. H. Jacobs / Koen G. Langendoen 実装本ではなくアルゴリズム本。 ある程度のコンパイラ実装経験がある人なら買って損はないと思います。 私は「コンパイラ構成法」→「プログラミング言語処理系」→本書、の順で 学んできましたが、頭の中がすっきりまとまって、今の私にちょうど良い レベルだと思います。アルゴリズムがスードウ・コードで書かれているので 最初はちょっと戸惑いましたが、すぐに慣れるでしょう。 私の英語レベルでも、見開きに知らなかったり忘れていたりする単語が、 ひとつあるかないか、といった程度なので本書を読み進めるのは、それほど 困難ではありません。 ちなみに私の英語遍歴は、「Grammar in Use Basic/Intermediateを一通りやる」→ 「Duo 3.0丸暗記」→「TOFELテスト 英単語3800のランク3を暗記中」と いったところ。それほど高い英語力がなくても大丈夫でしょう。
>>942 コンパイラの勉強をする前、した後とでなにか大きく変わったことはありますか?
>>942 紹介を少しみたところ、コンパイラの(可能な限りの)自動生成に力点を置いてるようですが、
その辺りどうでしたか?
>>942 pseudo codeを「スードウ・コード」と書かれているので戸惑いました。
>>943 昔俺が本読んで実際うまくいった最適化と言える物は
せいぜい定数畳み込みと覗き窓ぐらいだったな。
頭悪いと「それはそれ、これはこれ」って言葉の意味が実感できるぜ!
コンパイラの勉強もいいけどCPUやアセンブラにも詳しくないと
速いコードにはならないぜ。
VMを作るときにも困るぜ?
947 :
デフォルトの名無しさん :04/11/01 21:36:17
>>943 今まで努力するのが面倒で、yaccでやっていましたが、
そんな自分が嫌でコンパイラの勉強を始めました。
その甲斐あって仕事もはかどり、昇進も決まり、彼女も出来ました。
6月には結婚します。これも全てコンパイラの勉強をした成果です。
(27歳・会社員)
950 :
デフォルトの名無しさん :04/11/02 22:20:28
おれは今まで金無し君だったけど(ry
コンパイラの勉強をしたら負け(ry
953 :
デフォルトの名無しさん :04/11/03 09:12:07
コンパマダァ-? (・∀・ )っ/凵⌒☆チンチン
954 :
デフォルトの名無しさん :04/11/03 12:48:01
最近、パチンコ行っても付きまくりな訳だが、 そういえばコンパイラの勉強し始めてからだったことに気づいた。
俺もコンパイラを勉強していて出てきた数字で ロト6を買ったら2等が当たりました。2000万くらい。
じゃあ俺もコンパイラの勉強していたら 株が上がったことにしよう
LISP最強
958 :
sage :04/11/06 05:48:47
959 :
デフォルトの名無しさん :04/11/06 12:31:17
>>958 おっ、新作ですかね?
この分野では珍しい。
しかも、やさしそう
あと安い。
すべて型破り!w
宣伝乙 借金でもできたんですか?
961 :
959 :04/11/06 17:41:07
著者は有名な方ですか? あと、目次とかはないんでしょうか?
963 :
ほんたま :04/11/06 20:32:28
おみゃ〜らよ、system32フォルダにあるDLLの関数を呼び出すには、インポートセクションにDLL名と関数名を書き込んでいくだけで、呼び出せるんだが、 VC++で自分でつくったDLLの関数を同じ方法で呼び出そうとすると、「DLL何に○○のエントリーポイントが見つかりません」というメッセージが出て呼び出せないんだ… おみゃ〜らよ、自分でつくったDLLとwindows付属のDLLとは、どっか構造が違うのかな? windows付属のDLLと同じ構造のDLLを自分でつくるにはどうすればいいの? 教えてくだされ〜♪
マルチにレス不要
どうせstdcallつけてないだけなんだろうな
>>958 プログラミング言語処理系とか買ったけどチンプンかんぷんだった俺にはちょうどいい
こういう本もっとでてほしいな
安いしな・・・
>>966 オレは「UNIX プログラミング環境」が初体験だったが。今はもう流行らんか。
968 :
デフォルトの名無しさん :04/11/08 01:09:20
>>967 hocのソースにバグがあったと聞いたけど、どこか知ってる?
>>969 いろいろあった気がするが、具体的に何だったかは忘れた。
971 :
ほんたま :04/11/08 23:02:02
おみゃ〜ら〜、サンプルアップしたぞ〜♪ホームページもアップしたぞ〜♪宇宙一すげぞ〜♪ おみゃ〜らよ、なぜ宇宙一すげーかわかるかな? おみゃ〜らよ、おりはな、「Visual C++」で自作したDLLをスリムドカンでつくったプログラムから呼び出すのに成功したんだよ!わかる? おみゃ〜らよ、DLLを呼び出すプログラムを「Visual C++」」でつくるには、Libファイルをリンクに設定したり、ヘッダファイルをインクルードしたりとやるべきことは多いだろ? おみゃ〜らよ、DLLを呼び出すプログラムを「HSP」でつくるにも、やはりDLLの他に「.as」ファイルが必要だよ。 だが、「スリムドカン」の場合、DLLの他には一切何も必要ないんだな〜う〜ん、これが…自分じわかる? つまり「スリムドカン」の場合、DLLさえあればDLLを呼び出すプログラムがビルドできるってわけ♪ おみゃ〜らよ、おりは宇宙一画期的だと思わないか? おみゃ〜らよ、宇宙一すげ〜とわめいたのはそういうことよ♪ おみゃ〜らよ、自分じどうじ?
972 :
デフォルトの名無しさん :04/11/08 23:50:12
>>969 煽りでなくて、
バグでなく仕様じゃないの?
本だし
次スレまだ〜?
>>972 伝聞だけど煽りじゃないよ。
知り合いが「打ちこんで動かしたけどいくつかバグがあった」って。
もちろん打ち間違いの類いじゃなくね。
ひょっとして脳内の知り合いですかぁ? そんで俺らにデバッグさせようってことですかぁ?
三銃士で、アトスが友人の身に起こったことだと言って話すけど ダルタニアンはそれは友人ではなくてアトス自身のことなのではない かと考える場面がある。