「コンパイラ・スクリプトエンジン」相談室4
at TECH
1:デフォルトの名無しさん
04/11/10 23:30:50
言語仕様や処理系の話題に関するスレッドです。
字句解析・構文解析から,データフロー解析,ループ並列化,タスク並列化,SSA変換,CPS変換,
レジスタ割付,命令スケジューリング,ソフトウェアパイプライン等各種最適化,それに
VM,GC,JIT,リンク時最適化,動的バイナリ変換などなど。
前スレ
1 URLリンク(pc.2ch.net)
2 スレリンク(tech板) (dat落ち)
3 スレリンク(tech板) (前スレ)
関連リンクは多分 >>2-10 あたり
2:デフォルトの名無しさん
04/11/10 23:30:59
いらん。
3:デフォルトの名無しさん
04/11/10 23:31:40
くそスレ立てる子もいらん。
4:デフォルトの名無しさん
04/11/10 23:32:27
コンパイラ等を扱ったドキュメント
色々なツールの紹介
URLリンク(catalog.compilertools.net)
コンパイラ関連のリンク集
URLリンク(www.ulis.ac.jp)
スクリプティング言語資料室(仮) (リンク)
URLリンク(www.kt.rim.or.jp)
Compiler Construction
URLリンク(rananim.ie.u-ryukyu.ac.jp)
Compiler Construction (1997)
URLリンク(rananim.ie.u-ryukyu.ac.jp)
情報システム工学実験 III コンパイラ・コンパイラ
URLリンク(math.cs.kitami-it.ac.jp)
OS/Programming 簡単な C コンパイラ
URLリンク(www.csg.is.titech.ac.jp)
正規表現
URLリンク(hp.vector.co.jp)
コンパイラ研究・開発情報の一集積所
URLリンク(compilers.cs.uec.ac.jp)
Links and Selected Readings
URLリンク(www.gnu.org)
5:デフォルトの名無しさん
04/11/10 23:33:05
Lex(Flex) Yacc(Bison) 構文解析
UNIX板
yacc & lex
スレリンク(unix板)
Lex and YACC primer/HOWTO (邦訳)
URLリンク(www.linux.or.jp)
Turbo Pascal Lex/Yacc
URLリンク(www.musikwissenschaft.uni-mainz.de)
Jim Roskind's LALR(1) C++ Grammar
URLリンク(www.empathy.com)
Flexと Bisonを同時に使う
URLリンク(guppy.eng.kagawa-u.ac.jp)
KITE_ASM (yacc,lex)
URLリンク(www.arch.cs.kumamoto-u.ac.jp)
URLリンク(www.arch.cs.kumamoto-u.ac.jp)
Cygwin
URLリンク(www.cygwin.com)
GNU utilities for Win32
URLリンク(unxutils.sourceforge.net)
6:デフォルトの名無しさん
04/11/10 23:33:32
その他のパーサジェネレータ等
ANTLR(非yaccのパーサジェネレータ)
URLリンク(www.antlr.org)
JavaCC(Java Compiler Compiler)
URLリンク(javacc.dev.java.net)
URLリンク(village.infoweb.ne.jp)
URLリンク(www.asahi-net.or.jp)
CUP & JLEX or CUP & JFlex
CUP URLリンク(www.cs.princeton.edu)
JLEX URLリンク(www.cs.princeton.edu)
JFlex URLリンク(www.jflex.de)
SableCC
URLリンク(www.sablecc.org)
¬<><∪∪ (notavacc)LALR(1)
URLリンク(ne.cs.uec.ac.jp)
JavaCCはLL(k)だけど、上のはANTLR以外はLALR(1)
でもANTLRはC++なんかにも対応。
boost::spirit(C++のテンプレートでEBNFの構文を模倣)
URLリンク(spirit.sourceforge.net)
URLリンク(boost.cppll.jp)(マニュアル日本語化プロジェクト)
URLリンク(www.fides.dti.ne.jp)
7:デフォルトの名無しさん
04/11/10 23:33:52
ガベコレ
GC FAQ -- draft
URLリンク(www.iecc.com)
A garbage collector for C and C++
URLリンク(www.hpl.hp.com)
一般教養としての Garbage Collection
URLリンク(www.is.s.u-tokyo.ac.jp)
Garbage Collection : Algorithms for Automatic Dynamic Memory Management
URLリンク(www.amazon.com)
8:デフォルトの名無しさん
04/11/10 23:34:15
参考書籍
●コンパイラ 原理・技法・ツール 1&2
URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.co.jp)
通称ドラゴンブック。バイブル。
●コンパイラ構成法 原田 賢一
URLリンク(www.amazon.co.jp)
URLリンク(www.hara.cs.keio.ac.jp) (ソース、正誤表のダウンロード)
●プログラミング言語処理系 岩波講座 ソフトウェア科学〈5〉 佐々 政孝
URLリンク(www.amazon.co.jp)
一冊で済ませたい人へ。
●コンパイラの構成と最適化 中田 育男
URLリンク(www.amazon.co.jp)
最適化がメイン。
●コンパイラの仕組み 渡邊 坦
URLリンク(www.amazon.co.jp)
薄い奴(185p)を読みたい人に。
●21st Century Compilers (Alfred V. Aho, Sethi, Ravi Sethi, Jeffrey D. Ullman, Monica Lam)
ペーパーバック版: URLリンク(www.amazon.co.jp)
ハードカバー版: URLリンク(www.amazon.co.jp)
●スモールコンパイラの制作で学ぶプログラムのしくみ
URLリンク(www.cbook24.com)
9:デフォルトの名無しさん
04/11/10 23:41:19
処理系,スクリプト
kikyou.info (吉里吉里というゲームのスクリプト)
URLリンク(kikyou.info)
tiny C コンパイラ (C)
URLリンク(www.watalab.cs.uec.ac.jp)
6809用 Micro C コンパイラ
URLリンク(www.axe-inc.co.jp)
Portable Object Compiler (Obj-C >> C のトランスレータ?)
URLリンク(users.pandora.be)
自作コンパイラの部屋(PL/1, Pascal等)
URLリンク(www.tokumaru.org)
『Rubyソースコード完全解説』サポートページ
URLリンク(i.loveruby.net)
『やさしい Lisp の作り方』と『やさしい Java インタプリタ の作り方』見つけた。
Java と C# で実装。
URLリンク(www.okisoft.co.jp)
URLリンク(www.okisoft.co.jp)
URLリンク(www.okisoft.co.jp)
URLリンク(www.okisoft.co.jp)
MSによるPEフォーマット仕様書(日本語)
URLリンク(www.interq.or.jp)
10:デフォルトの名無しさん
04/11/10 23:49:54
LISP?はぁ?
負け組言語は不要w
11:M.B.
04/11/11 00:01:58
>>10
馬鹿め、Lisp と Forth はどこにでもいるのだぞ。
侮ってはイカン。
12:デフォルトの名無しさん
04/11/11 01:54:49
LISPはCと同じ速度、Javaよりも省メモリ、AI関係に使用しやすい
とかの理由でボーイング777の製造とかYahooStoreのシステムに
フレームワークとして利用されてるよね。。
LISPがコンパイルして実行できて、同じAI向けのPrologができへんのなんで?
(LISPはS式で、Prologの方は実行時に述語を受理したりすんのと関係ある?)
Prologもコンパイルできる…とか、法律家気取りの言語マニアな
意見は抜きにして簡単に教えて。
13:sage
04/11/11 02:00:12
コンパイラとバーチャルマシン
URLリンク(ssl.ohmsha.co.jp)
14:デフォルトの名無しさん
04/11/11 02:04:25
漏れはいつも構文解析まではフンフンって読めるけど、
意味解析やコード生成以降はホント、チンプンカンプン。
CPUとかアセンブラとかの勉強、やっぱ必要か(笑)?
15:デフォルトの名無しさん
04/11/11 02:33:02
>>12
LispとPrologを同列視してる時点で何もわかっちゃいないのが丸わかりだが、ま、
WAMをキーワードにぐぐってみれ。
16:デフォルトの名無しさん
04/11/11 07:00:09
リスパーとか来ると嫌だなあ。
17:デフォルトの名無しさん
04/11/11 09:13:53
LisperでもSmalltelkerでもコアな言語をゴリゴリ使ってて自分コンパイラをその上で作っちゃう人もかなり
居るらしいからいいんでね?
でもLispとかSmalltalkの話を聞くとかなり初期段階で他の言語の処理系を作ってるね。
あれはなんでだ?(w
18:デフォルトの名無しさん
04/11/11 09:29:14
>>15
うほっ
19:デフォルトの名無しさん
04/11/11 10:04:06
後半何がいいたいのかよくわからん……
20:デフォルトの名無しさん
04/11/11 10:18:52
>>17
Java で Lisp のインタプリタ書くのは簡単。
けどハマりそうでイヤ。
21:デフォルトの名無しさん
04/11/11 12:05:25
>>9 にも『やさしい Lisp の作り方』とかあるけど、それとは別に
「JAVAでLISPを作るのはCなどで作るよりも3倍は楽でないかと思われます。」
とか言いながらJavaLispをつくるサイトがここにもあたよ。
URLリンク(www.cobalt.co.jp)
書かれてある理由のとおりJavaでのLispは卑怯なぐらい簡単。
22:デフォルトの名無しさん
04/11/11 14:23:12
いつもはじめからS式で書けば字句解析も構文解析も
いらないじゃんと思う。面白いのはそっから先だよな。
23:デフォルトの名無しさん
04/11/11 15:00:24
全く同感。>>14みたいのを見るたびそう思う。
Cみたいな言語の構文解析をやって、そっから先に進みがたかったら
Lispのコンパイルを理解すればいい。
後からその両者を真中でつなげれば楽ちん。
24:デフォルトの名無しさん
04/11/11 15:44:21
> Lispのコンパイルを理解すればいい。
わかった。Lispのコンパイルを自作を目指して勉強する。
お勧めの情報源があれば教えてチン子。
25:デフォルトの名無しさん
04/11/11 17:48:57
コンパイラ研究・開発情報の一集積所
URLリンク(compilers.cs.uec.ac.jp)
26:デフォルトの名無しさん
04/11/11 18:17:03
URLリンク(v.isp.2ch.net)
27:デフォルトの名無しさん
04/11/11 20:02:33
なんか>>1のスレッド紹介がバージョンアップしてるな。
羊頭狗肉になりそうな気もするが…
28:M.B.
04/11/11 22:39:12
M.B.==20
いきなりコアな話だが、変数スコープの扱いにだけは気をつけれ。
「funarg問題」でググると出てくる。
29:デフォルトの名無しさん
04/11/11 23:58:08
LISPってかなり、マニアックな言語だと思うんだけど(学術的に)
LISPを勉強するメリットって何かありますか?
30:デフォルトの名無しさん
04/11/11 23:59:31
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Lisp
31:デフォルトの名無しさん
04/11/11 23:59:49
実装が楽なので最初はいいかもね>LISP
32:デフォルトの名無しさん
04/11/12 00:22:34
インタプリタのLISPはイー−ッパイあるけど
LSIPコンパイラについてはソースやら情報やらは見つけきらなかったですよ。
LISPじゃないけどSchemeのシステムで前に面白そうなのあったよ
URLリンク(tanaka-www.cs.titech.ac.jp)
URLリンク(www.google.co.jp)
Rubyとくらべてどうするんべさぁ(笑
33:デフォルトの名無しさん
04/11/12 00:35:22
25歳、LISPを勉強するまでは金無し君だったけど(ry
34:デフォルトの名無しさん
04/11/12 00:42:41
素人丸出しで悪いが
インタプリンタとかって結局
int * code_ptr
Func_CPU{
swithc{
// add byte
case 0x0000:
*code_ptr+1 += *codo_ptr +2;
codde_ptr+=2;
break;
// sub byte
case 0x0001
*code_ptr)+1 -= *codo_ptr +2;
codde_ptr+=2;
break;
・・・
}
とかして命令とその後ろデータを置いといて
CPUが実際に演算するような関数を作ればと
思ったんですが実装では遅くなりそうですが
もっと良い実装方法はありませんか?
35:M.B.
04/11/12 00:43:04
>>29
LOGO と同じくらい簡単。本当に、小学生でも大丈夫。
いろんなオマジナイを書かなくても、
電卓なみに簡単に使える。こういう言語でメジャーな言語は
Lisp と FORTH くらい。
OR や AND が制御文っつーのも目からウロコ。
教育用には Pascal と Lisp と FORTH はかなり向いているので、
Java でインタプリタ書いておくといいかも。
ちなみに FORTH インタプリタは、正味一日あれば書ける。
36:デフォルトの名無しさん
04/11/12 00:46:03
>>32
lisp ていうか scheme のコンパイラネタはここから辿ってみるのはどうでしょ。
知ってたらごめんね。
URLリンク(library.readscheme.org)
37:デフォルトの名無しさん
04/11/12 00:48:57
連投すまないけどコードが間違ってたので
int * code_ptr
Func_CPU{
swithc(*code_ptr){
// add byte
case 0x0000:
*code_ptr+1 += *code_ptr +2;
code_ptr+=2;
break;
// sub byte
case 0x0001
*code_ptr+1 -= *code_ptr +2;
code_ptr+=2;
break;
・・・
}
です。
こうやって命令とデータを配置してCPUの演算のような
関数を作って、そこで計算さえる方法だと実際に
他の関数内で演算をさせるより実装が遅くなりそうなんですが
もっと速い実装方法がありますか?
38:M.B.
04/11/12 00:49:42
>>34
Java の「中間コード+仮想マシン」方式が、
なんだかんだいっても一番実際的。
USCD の p-System とか、BCPL の IntCode とか。
とりあえずこの方式で動かしてみて、
「遅い」と思ったら javaCC なり BISON なりに
乗り換えるのが実際的。
何より移植が楽だしな。
39:デフォルトの名無しさん
04/11/12 00:53:00
byte * code_ptr
Func_CPU(){
swithc(*code_ptr){
// add byte
case 0x0000:
*code_ptr+1 += *code_ptr +2;
code_ptr+=3; // 3byteだけポインターを動かす
break;
// sub byte
case 0x0001
*code_ptr+1 -= *code_ptr +2;
code_ptr+=3;
break;
・・・
}
>>USCD の p-System とか、BCPL の IntCode とか。
これは知らないので調べてみます
JAVAの実装方法が載ってる本でもあるのでしょうか?
自分もそういった本が欲しかったので探したのですが
見つからなかったので・・・
40:デフォルトの名無しさん
04/11/12 00:53:25
LISPのlambda知っとくだけでかなり変わるよなあ
Cでコールバック関数別途用意するとかがアホらしくなる
JavaScriptはその辺のLISPの良い所をうまく抽出した言語
41:デフォルトの名無しさん
04/11/12 00:59:56
忘れてるよ
以下未整理とネタ
shuJIT (JITについて)
URLリンク(www.shudo.net)
ギコBASIC
C言語版
URLリンク(page.freett.com)
C++版
URLリンク(page.freett.com)
計算機能論ホームページ
(消えているので、どうしても見たければarchive.org等を利用する事)
URLリンク(buri.sfc.keio.ac.jp)
YACC link
URLリンク(www2.dewa.or.jp)
42:デフォルトの名無しさん
04/11/12 01:00:51
>>39
switch使うと1命令毎のジャンプが2回発生するし、
関数テーブルにすると関数呼び出しで時間が掛かる。
C言語で書こうとすると効率はあまり良くならない。
こういった技術にdirect threaded codeというのがあって、
gnu forthの実装などで使われているらしい。
gccにはこのために用意したとしか思えないラベルを変数に格納できる
という拡張機能があって、うまく使うとswitchや関数より効率が良いVMが作れる。
VM() {
static void *op[] = {&&op1, &&op2, &&op3} ;
goto *op[pc++];
op1:
//・・・
goto *op[pc++];
op2:
//・・・
goto *op[pc++];
op3:
//・・・
goto *op[pc++];
}
これでswitchの倍程度は速くなる。
43:デフォルトの名無しさん
04/11/12 01:04:23
あ、上はindirectだった
directの場合は↓
VM() {
static void *op[] = {&&op1, &&op2, &&op3} ;
void *pc = op;
goto *pc++;
op1:
//・・・
goto *pc++;
op2:
//・・・
goto *pc++;
op3:
//・・・
goto *pc++;
}
これでindirectよりも数割ぐらい効率がよくなる。
実際使う時はopの中身を実行する順に並べればいい。
44:デフォルトの名無しさん
04/11/12 01:08:41
>>42
なるほど、VM(CPU部分)を呼び出さずに、
命令コード毎、関数内でGotoを使って飛ばしていけばいいのですね
確かにこっちの方が速いですね。
45:デフォルトの名無しさん
04/11/12 01:08:52
>>36
彡´⌒ヽミ
(´・ω・`) 知らなかったでし。
(つ甘と) 親切にどうも。
`u―u´
46:デフォルトの名無しさん
04/11/12 01:13:17
>>41
ギゴBASICみる限り、自分が考えた設計と同じですね
来週から1週間掛けて、スクリプトを作るつもりです。
47:デフォルトの名無しさん
04/11/12 01:16:16
>>42
これ他の言語にも欲しいよね、インタプリタ作るにはもってこいの機能で、
アセンブラで書けば一発なのに、高級言語では全く書けない。
48:デフォルトの名無しさん
04/11/12 03:58:44
>>42
gccにテーブルジャンプ書く機能あるなんてしらんかった。
自分のVMを書き換えてみるよ、ありがとん。
49:M.B.
04/11/12 08:40:20
>>39
×USCD
○UCSD (カリフォルニア州立大学サンディエゴ校)
BCPL については
リチャーズ&スティーヴンズ
『BCPL 言語とそのコンパイラ』共立出版
50:デフォルトの名無しさん
04/11/12 21:50:40
>>42のようなのはVCではできんのかぇ?
51:M.B.
04/11/12 22:25:59
>>50
VCでできるかどうかはワカランけど、
BASIC では定跡とのこと。
52:デフォルトの名無しさん
04/11/12 22:52:52
はぁ?
53:デフォルトの名無しさん
04/11/12 23:06:16
26歳、VMを覚えるまでは金無し君だったけど(ry
54:デフォルトの名無しさん
04/11/12 23:36:08
マジお勧め。
55:デフォルトの名無しさん
04/11/12 23:42:35
bignumのライブラリでよさげなのないですか?
ライセンスとか面倒なのは避けたいので
DLL形式で使えるとうれしい。
56:デフォルトの名無しさん
04/11/13 00:23:10
アフォ?
ライブラリでもライセンスは関係する罠w
57:デフォルトの名無しさん
04/11/13 00:35:36
M.B. age sugi
58:M.B.
04/11/13 00:39:06
>>57
sage ?
59:M.B.
04/11/13 09:37:42
いま Java で Lisp を書こうとして、禿死苦悩んでいる。
atom や car や cdr は List クラスのメソッドにするとして、
read/write や eval って何のメソッドにするんだ?
入出力ストリームを extend して List を扱えるようにするのか?
ListProcceser とかいうクラスを定義して eval メソッドを実装するのか?
なんやらオブジェクト同士のつかみ合いみたいになって、
設計が綺麗くなんないんだが。
60:デフォルトの名無しさん
04/11/13 10:28:53
つまんないことで悩んでるな。
Lispとしての関数と、それを実装するJavaでの話は全く関係ないよ。
簡単なLisp処理系のソースを読んでみることを勧める。
そうすればシンボルテーブルの概念も掴めるだろう。
61:60
04/11/13 10:47:54
殴り書き。
class LispObject { ...}
class LispCons extends LispObject {...}
class LispSymbol extends LispObject {...}
class LispNumber extends LispObject {...}
class LispString extends LispObject {...}
class LispFunction extends LispObject {...}
class LispInterpreter {
Hashtable obarray;
public LispObject eval(LispObject form) throws LispError {
if (form.isAtom()) {
return (form.isSymbol() ? ((Symbol)form).getValue() : form);
} else if (isList(form)) {
func = ((LispCons)form).getCar();
if (func.isSymbol()) {
func = func.getFunction();
if (function == null || !function.isFunction()) {
throw LispError(略);
}
} else {
func = createLambdaFunction(func);
}
return callFunction((LispFunction)func, form.getCdr());
} else {
throw LispError("form is not a list.", form);
}
}
62:60
04/11/13 10:50:11
殴り書きその2。
LispObject callFunction(LispFunction func, LispObject args) throws LispError {
int len = getListLength(args);
if (len < func.getMinArgs() || (func.getMaxArgs() != null && len > func.getMaxArgs())) {
throw LispError(略);
}
argsarray = new LispObject[len];
// コード略。引数をargsarrayにコピー。maxargsに足りなきゃnullで埋める。
func.call(argsarray);
}
void initialize () {
defineFunction("car", new LispFunction_car());
defineFunction("eval", new LispFunction(1,1) {
LispObject call(args) { return eval(args[0]); }
});
// ...
}
void defineFunction(String name, LispFunction func) {
LispSymbol sym = intern(name);
sym.setFunction(func);
}
63:60
04/11/13 10:51:23
その2訂正: s/nullで埋める/nilで埋める/
その3。
LispSymbol intern(String name) {
Obj s = obarray.get(name);
if (s == null) {
LispSymbol sym = new LispSymbol(name); obarray.put(name, sym); return sym;
} else {
return (LispSymbol)sym;
}
}
class LispFunction_car extends LispFunction {
LispFunction_car() { super(1,1); } // minargs, maxargs
LispObject call(LispObject[] args) throws LispError {
if (args[0].isCons()) { return ((LispCons)args[0]).getCar(); }
else { throw LispError(略); }
}
}
64:60
04/11/13 10:55:09
しまった、関数かマクロかで判別して、関数のときは先に引数を評価するんだった。
直すのマンドクセ。
65:デフォルトの名無しさん
04/11/13 12:08:03
ここはお前の日記帳じゃねえんだ(ry
66:60
04/11/13 14:32:11
いやなに、59の参考にでもなればと思って。
67:デフォルトの名無しさん
04/11/13 19:14:06
SICPの「メタサーキュラ・インタプリタ」の章を嫁.
あそこのコードは素のSchemeでなくOOPLだったらもっと簡潔に書ける.
68:デフォルトの名無しさん
04/11/13 19:44:06
> メタサーキュラ・インタプリタ
関係ないが、この言葉を見るとprologスレの論争を思い出す。
結局誰が正しかったのかな。
69:デフォルトの名無しさん
04/11/13 19:56:15
>>68
論争って何?
70:デフォルトの名無しさん
04/11/13 20:54:20
記録自体はもぅ何年も前のものなのに
そのまま生々しく残ってて痛々しいよね。
71:デフォルトの名無しさん
04/11/13 21:07:36
まぁ、プロログ、リスプと言ってる時点で
実用的なプログラムを書いていない証拠だなw
72:デフォルトの名無しさん
04/11/13 21:11:15
>>71
煽りならよそへ池
73:M.B.
04/11/13 21:32:01
設計で悩んでたら、eval 以外の関数だけで半日潰れちまった
甘かった _| ̄|○
74:デフォルトの名無しさん
04/11/13 21:44:00
今週は>>21の
URLリンク(www.laplata.ne.jp)
でも読んで、雰囲気つかんだ後、
来週の週末あたりに携帯Lispでも開発したら・・?
75:M.B.
04/11/13 22:21:45
あれは邪道。LinkedList なんぞ使っちゃイカン。
結局 eq と equal の区別ができなくなって詰まってる。
現在、
中西正和『Lisp入門 システムとプログラミング』近代科学社
黒川利明『LISP入門』培風館
竹内郁雄『初めての人のためのLISP』サイエンス社
を読みながら悪戦苦闘中。
76:M.B.
04/11/13 22:28:36
>>71
> まぁ、プロログ、リスプと言ってる時点で
> 実用的なプログラムを書いていない証拠だなw
まぁ、tsv や XML で間に合う仕事をしてる香具師には
無縁な話なのだがね。それが悪い訳ではまったくないが。
77:デフォルトの名無しさん
04/11/13 22:29:07
なんかキチッとしたもの作り込んでるみたいなんで
完成したらサイトも作ってアップして下さい。
78:デフォルトの名無しさん
04/11/13 22:30:53
>>75
まあ本人の自由だろうけど、そういうレベルの人が言語処理系について
知ったような口をきくのはどうかと思う(>>35とかね)。
79:デフォルトの名無しさん
04/11/13 22:37:23
>>78
象牙の塔の中で言語論争してるわけじゃないからイイでし。
ここは78さんのために用意された花園でも、まして法廷でもないし。
そういうことをPrologスレを眺めてオモタ。
80:デフォルトの名無しさん
04/11/13 22:38:32
>>78
お前何様だよ(^^;
81:M.B.
04/11/13 22:53:41
>>78
前回 Lisp を書いたときは、
言語が FORTRAN (「大文字のフォートラン」、つまり60)で、
しかも再帰呼び出しが使えないので
(なにせ関数呼び出し用のスタックがなく、レジスタに直接
割り当てていたので、7層までしか使えない)、
プリプロセッサの皮を被せて「再帰呼び出し可能なFORTRAN」を
実現し(RATFOR みたいなもんだ)、その上で LISP を書いて、
その上に機械翻訳システムを実現したもんだ。
とはいえ N88 BASIC 上に LISP も PROLOG も実装したことがあるのだが
内部構成が全然思い出せない _| ̄|○
82:M.B.
04/11/13 23:00:18
なんか思い出してきたぞ。
あのころはメモリが少なくて実用的なプログラムが書けるような環境が
立てられなかったのと、LISP はあくまで数式処理なんかに使う
ツールでしかなかったので、動いたところで「こんなん使えねーや」
っつーんで捨てちゃったんだ。
今なら Java で Lisp インタプリタ書いて、その上で Prolog の処理系
(Lisp で六百行くらい)を動かしても十分実用になる。
いい時代になったもんだ。
83:デフォルトの名無しさん
04/11/13 23:11:49
だからさあ
ここはお前の日記帳じゃねえんだ>MB
つーかRATFOR出てくるなんていつの時代の人間だよ
>>75の文献も古すぎだぞ
古い本見ながら中途半端なLISP作るより
R5RSでも読んでScheme覚えたほうがいい
84:デフォルトの名無しさん
04/11/13 23:22:57
>>83
別にいいじゃん、興味ないから読んでないけど(汗
まあ内容はここに一応ふさわしい。
極めてスレ違いな言語論争で埋め尽くされるよりマシ。
85:デフォルトの名無しさん
04/11/13 23:24:27
スモールコムパイラを作ろうのねーちゃんは何歳だ?
86:デフォルトの名無しさん
04/11/13 23:26:11
10さい
87:M.B.
04/11/13 23:27:01
>>83
> つーかRATFOR出てくるなんていつの時代の人間だよ
知ってんじゃねーか。
88:デフォルトの名無しさん
04/11/13 23:33:31
>>57 プンスカプー。
89:デフォルトの名無しさん
04/11/13 23:35:10
コンパイラ
と
コンバイナ
と
コンバンワ
の区別が出来ない人がいるのですが、どうしたらいいですか。
90:デフォルトの名無しさん
04/11/13 23:35:25
そういえば某スレにこんなのがあったなぁ
#include <stdio.h>
#include <stdlib.h>
int b[2<<16],f,g,i,n;char*p,l[103][80],c[80],*q,*r,x;S(){for(;*p==32;++p);}T(){
for(r="GET \0OTO \0PUT \0RUN\0 QUIT\0IF"+5*n++;*r&&*r==*p;++r)++p;return!*r&&(S
()|1);}I(){g=atoi(p);return*p-48?g?g:b[*(short*)p]:g;}main(){for(;;){gets(p=l[i
=100]);while(i<101){n=0;S();g=atoi(p);if(*(q=p)==48||g)for(p=l[g],q+=3;*p++=*q
++;)i=101;else p=!*q?l[++i]:T()?printf("?"),gets(c),b[*(short*)p]=atoi(c),l[++i
]:T()?l[i=I()]:T()?printf("%d\n",I()),l[++i]:T()?l[i=l[100][0]=0]:T()?exit(0),0
:T()?I()?p+3:l[++i]:(61-q[2]?puts("ERR"):(p=q+3,f=I(),x=p[2]-43,p+=3,g=I(),b[*(
short*)q]=x?x-2?x+1?x-4?x-17?x-19?x+10?x-18?x+6?f:f%g:f==g:f!=g:f>g:f<g:f/g:f*g
:f-g:f+g),l[++i]);}puts("OK");}}
91:デフォルトの名無しさん
04/11/13 23:36:51
ネタはマ板でやると喜ばれます
92:デフォルトの名無しさん
04/11/13 23:49:01
まぁ、LISPなんぞ哲学みたいなものだ。
つまり、概念なりを学には大変よい言語だが、
実用的な価値は、ほぼゼロに近いw
93:デフォルトの名無しさん
04/11/13 23:52:10
>>92
言語論争は死滅スレでやると喜ばれます、死ね
94:デフォルトの名無しさん
04/11/13 23:52:49
hai hai
95:M.B.
04/11/14 00:21:32
>>88
正直スマンカッタ orz
96:デフォルトの名無しさん
04/11/14 00:33:20
>>94 > >>92 でしョ。
>>95
あんた熱くなると八兵衛(ry
MBのFortran話で
URLリンク(www.google.co.jp)
を思い出した。 哲学とも高尚な抽象概念とも関係ない使い道の例だお。
97:M.B.
04/11/14 00:46:20
>>96
「親分! てぇへんだ!」
「おいおい、どうしたんだ八」
「まぁまぁ八兵衛さん、朝御飯はお済みになったの?」
「すんませんお内儀さん、ってそれどころじゃ無ぇんで。
大川にお六字が……」
98:M.B.
04/11/14 00:48:35
>>97
……ってこんだけネタ振っといて八兵衛じゃなくて八五郎だ
またやっちまった _| ̄|○
99:デフォルトの名無しさん
04/11/14 01:11:08
コテハンってどうしてこんな(ry
100:デフォルトの名無しさん
04/11/14 01:12:52
100get!!!!!
101:デフォルトの名無しさん
04/11/14 11:45:12
煽り以外で >>92 に反論できる LISPer は居ない?
102:デフォルトの名無しさん
04/11/14 11:52:29
誰かあの文章を紹介してやれよ。「普通のやつらを作り出せ」とかいうやつ。
103:デフォルトの名無しさん
04/11/14 12:02:47
と、LISPのことが気になって仕方の無い>>101が語られました。
104:M.B.
04/11/14 12:06:43
>>101
数式処理は Lisp 以外の言語で書く気がせん。
これで十分。
……つーか Mule があるじゃん。あれって Lisp だろがよ。
105:デフォルトの名無しさん
04/11/14 12:12:10
竹内郁雄さんが
新しいマシンを開発するときは
その上に Lisp を実装すると非常に楽だと
bit の連載(TAO かなんかの開発の話)に書いてたな。
106:デフォルトの名無しさん
04/11/14 12:26:25
その辺にしておくべし。 LISPのことばっか喋ると
怠け者の>>101がまた荒らしで知識を得ようと熱くなる。
結局スレに迷惑かかる。多様な話題のほうが楽しいし。
107:デフォルトの名無しさん
04/11/14 12:38:50
>101
これ以上LISPerを呼ぶなよ
108:デフォルトの名無しさん
04/11/14 13:59:01
LISPer は独自スレを立てれ。
109:デフォルトの名無しさん
04/11/14 14:01:04
つーかLISPスレ立ってるだろ
110:デフォルトの名無しさん
04/11/14 14:04:02
処理系依存でない LISP スレが・・・ナイ!
111:デフォルトの名無しさん
04/11/14 14:06:15
LISPerは自体は構わんよ、下らん言語論争やフレームの元になるような事を書く奴さえこなければ。
このスレは実装技術のスレだ、個々の言語の良し悪しや独善的思想はフレームの元、
>>104
そういう奴にレスを付けると百害あって一利ないから一切書くな。
どうしてもレスを付けたければ死滅スレを立ててそこでやれ
112:デフォルトの名無しさん
04/11/14 14:16:05
連想配列って意外に不便。
キーワードのスペル間違えてデバッグに半日。
型なし言語も意外に不便。
評価しそこなってデバッグに半日。
PerlとPHPのソースコードレベルの検証ツールをキボンヌ
113:デフォルトの名無しさん
04/11/14 14:22:25
LISPのエンジン設計の話しはスレ的に歓迎なんだが・・・
LISPが気になるくせに「コンパイラ・スクリプトエンジン」の相談ができないのが頑張ると
言語論争の話題しか提供できなくてフレームの種を蒔くことになる。
114:デフォルトの名無しさん
04/11/14 14:25:46
>相談ができないのが頑張ると
個人のレベルにイチャモンつけるようなのは良くないよ
最初はみんな初心者
115:デフォルトの名無しさん
04/11/14 14:35:06
>>101 >>92
↑わざわざこのスレにきて学ぶ姿を見せつける美しい初心者の例
116:デフォルトの名無しさん
04/11/14 14:39:18
友達いないだろう?
死ねば〜
117:デフォルトの名無しさん
04/11/14 14:44:17
LISPは変換が面白いと思うよ
(define (f proc) (proc #t))
(f (lambda(x)(if x 0 1)))
↓
((lambda(proc)(proc #t))(lambda(x)(if x 0 1)))
↓
((lambda(x)(if x 0 1)) #t)
↓
(if #t 0 1)
↓
0
コンパイラに渡すまでもなくこれぐらいの変換はユーザー関数レベルで可能なとことか
まあコンパイラ自体もユーザー関数レベルで書けるけど
118:デフォルトの名無しさん
04/11/14 14:47:02
>>112
インタープリタ系言語はインタラクティブな環境があると開発しやすい。
自分で作った言語処理系もってるけど、そういう環境ができるまでは至極面倒だった(某ゲームの移植性をあげるために中間コード使っただけなのであんまり良いものじゃないけど)
perlはデバッグモードがあるが、phpはお手軽な環境が無いから面倒になったんだろう。
だいたい連想配列のキー間違いなんざインスペクタ使えば一発で解りそうなもんだよ。
119:デフォルトの名無しさん
04/11/14 15:04:04
>>118
いや、漏れはPerlからJavaに乗り換えたのでモウマンタイなのだが、
「CGIはPerlかPHP」って頭っから信じてる香具師がいて
そいつが管理してるプロジェクトからブツが上がってこないんで
迷惑してるんだが、下っ端のプログラマーに聞いてみると、
どうやらソースが荒れてて手がつけらんなくなってるらしいのだ。
かといって開発ツールを導入するのにも消極的なのだ。
だから、なんかしらソースコードレベルで適用できるツールはないもんかと。
120:デフォルトの名無しさん
04/11/14 15:14:36
PerlUnit
121:デフォルトの名無しさん
04/11/14 15:19:17
ここで聞く内容じゃないね
122:デフォルトの名無しさん
04/11/14 16:37:38
Ruby以外の言語は糞・
123:デフォルトの名無しさん
04/11/14 16:53:22
eval.c を読んでから言え。
124:デフォルトの名無しさん
04/11/14 20:25:46
LISPer ですが、何か?
125:デフォルトの名無しさん
04/11/14 20:30:01
RubyはRecursive Decentでつか?
126:デフォルトの名無しさん
04/11/14 20:32:33
Ruby >>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Lisp
127:デフォルトの名無しさん
04/11/14 20:32:51
>>125
ソース読んでないけどLALR(1)じゃなかったっけ?
128:デフォルトの名無しさん
04/11/14 22:05:42
emacs の弱点の1つがlispだったり擦るわけだがw
129:デフォルトの名無しさん
04/11/14 22:16:27
>>128↓
スレリンク(unix板)
(戻ってこない方向で)
130:デフォルトの名無しさん
04/11/14 23:44:57
Emacsは元々LISP用のエディタだったんだろ?
逆にLISPだからこそここまで生き残ったとも言える。
S式嫌いならフロントエンド作ればいいだけの話な気がするけど、
>>129のスレはそういうことじゃないみたいだな。
emacsとviがUNIXのイメージを悪くしたのは確かな様だ。
131:M.B.
04/11/14 23:53:31
>>130
> emacsとviがUNIXのイメージを悪くしたのは確かな様だ。
現在でも UNIX 上で動くエディタの標準は emacs 互換の Mule。
「テトリス」と並ぶ有名なゲーム「rogue」の操作は vi 互換。
それを言うなら「emacs派とvi派の対立が」だろうと思うが、
実際には棲み分けができていたように思われ。
132:デフォルトの名無しさん
04/11/15 00:33:50
>>8
>●スモールコンパイラの制作で学ぶプログラムのしくみ
>URLリンク(www.cbook24.com)
目次とサンプルコード来てた。
URLリンク(www.gihyo.co.jp)
tiny scheme 読もうと思ってから早1年、何にもてに付けてねーや・・・。
133:デフォルトの名無しさん
04/11/15 00:45:58
いろいろ勉強してたけど、そろそろネイティブバイナリも吐ける
コンパイラを作ろうかなって気になったよ。
なんつーか、コンパイラ作成って楽しいな。
134:デフォルトの名無しさん
04/11/15 01:03:12
石田綾ってなにもの?
過去の実績を知りたい。
135:M.B.
04/11/15 01:03:51
>>133
つーか言語処理系の開発って、
(゚∀゚)イイ!
136:デフォルトの名無しさん
04/11/15 02:11:54
>>134
URLリンク(www.pureadult.co.jp)
137:デフォルトの名無しさん
04/11/15 19:01:23
再帰下降は仕組みが簡単だし最強っぽいのですがなんで
LALRやらLLやらを使うコンパイラが多いのですか?
138:デフォルトの名無しさん
04/11/15 19:03:31
>>132
何その痛いサンプルコード
139:ほんたま
04/11/15 20:16:29
おみゃ〜らよ、HSPはメニューつくれるのか?
おみゃ〜らよ、HSPのヘルプに目を通したが、命令語の一覧眺めたが、メニューつくる命令はないっぽかったが、どうか?
おみゃ〜らよ、Windowsソフトってメニューはつきものだろう?
そのWindowsソフトをつくるHSPにメニューをつける命令がないのはどういうこっちゃ?
おみゃ〜らよ、しゃくせんのあるけん、どうじ?
140:デフォルトの名無しさん
04/11/15 20:27:52
↑
誤爆??
141:デフォルトの名無しさん
04/11/15 20:28:17
>>132
何かが間違っている気がする
142:デフォルトの名無しさん
04/11/15 20:28:18
HSPスレに逝け
143:デフォルトの名無しさん
04/11/15 21:10:34
>>137
再起下降では解析できない文法があるから。自分でLALRとか書いてるじゃん。
144:デフォルトの名無しさん
04/11/15 21:12:05
>>137
LL の文法を解析するパーサが再帰下降型パーサだが……
上昇型パーサを使うのは LL よりも広い範囲の文法を効率よく扱えるから。
LL だと、たとえば四則演算を次のように書くと左再帰を含むためアウト。
E -> E '+' T
T -> T '*' F
F -> '(' E ')'
ちょっと頑張れば LL に書き直せるけど、よけいな非終端記号が増えて
面倒な上、文法が直感的でなくなる。そんな機械的な作業はプログラムに
任せたいっしょ?
145:デフォルトの名無しさん
04/11/15 21:37:52
>>132
目次を見たときは結構いい構成になってると思ったけど,
ソースコードはかなり苦しいな
本の限られたスペースに載せるにはああしなきゃ
いけないとか決まりでもあるんだろうか?
146:デフォルトの名無しさん
04/11/15 22:18:11
>>144
再帰下降型というのは、LLじゃなくてrecursive decentの事です。
LLは下降型ですが再帰下降とは別物じゃないですか?
147:デフォルトの名無しさん
04/11/15 22:20:29
でも結局左再帰の問題はつきまといそうですね。
だから難しい上昇型使うのですね。
148:デフォルトの名無しさん
04/11/15 22:21:03
再起加工って文法の名前なのか?
149:デフォルトの名無しさん
04/11/15 22:22:40
>>132のコードも別に普通の手書き再帰下降パーサですよね。
なんか問題有るんですか?
150:デフォルトの名無しさん
04/11/15 22:28:44
LL(k)の事を再帰下降って言ってるだけ?
151:デフォルトの名無しさん
04/11/15 22:35:55
再帰下降は下降型解析法(LL)のやりかたの一つ
一度コンパイラの本でも読め
152:デフォルトの名無しさん
04/11/15 23:22:31
LL(k), LR(k), LALR(k) etc. は *文法の* 種類分け.
Recursive Decent, Top-down, Bottom-up etc. は *解析方法の* 種類分け.
LLはTop-down(特にRecursive Decent)と,LR(LALR含む)はBottom-upと相性がよい.
このPDFでも嫁 っ[ URLリンク(www.cs.vu.nl) ]
153:デフォルトの名無しさん
04/11/15 23:37:06
ありがとう。読んでみる。
154:デフォルトの名無しさん
04/11/15 23:41:07
まぁ、口ばかり達者な奴がいるみたいだが(例 >>138 >>145)
それほどの実力の持ち主なら、
そちら様の完成コードでも拝見さしてもらいましょうかな?
155:デフォルトの名無しさん
04/11/15 23:47:01
>そちら様の完成コードでも拝見さしてもらいましょうかな?
>そちら様の完成コードでも拝見さしてもらいましょうかな?
>そちら様の完成コードでも拝見さしてもらいましょうかな?
156:デフォルトの名無しさん
04/11/16 00:27:32
>>154
pやらGやらVやら何って感じだが、
それよりなにより是非って( ゚д゚)ポカーン
基本的な日本語が使えてない。
コード以前に中学の国語あたりをやり直せ。
157:デフォルトの名無しさん
04/11/16 10:08:07
>>152
LL(k)構文解析で解析できる文法をLL(k)文法っていうんじゃないの?
158:デフォルトの名無しさん
04/11/16 11:36:13
>URLリンク(www.cbook24.com)
監:中田育男
法政の学生?
本人が見ることもあるかもしれないから書くけど、
体を表す名前を付けることを身につけてほしい。
CellG=lexer
CellK=parser
CellV=仮想マシン
らしいけど、もしそうなら、
Lexer, Parser, VirtualMachine といった名前を付けるべき。
記号表のエントリにはTableEntryといった名前をつけるべきで、
Tableという名前を付けてはいけない。
読んで分かりやすいプログラムを書くのは
ある程度プログラムを読んだり書いたりの
経験がないと難しいだろうけど、ガンガレ。
あと、配列じゃなくてListを使うとか、
文字リテラルはinternしなくていいとか
もうちょっとJavaを勉強しよう。
159:デフォルトの名無しさん
04/11/16 12:27:09
URLリンク(www.amazon.co.jp)
中田育男はこれ書いた日本のコンパイラ最適化の第一人者ですな
160:158
04/11/16 12:54:42
著者が中田先生の下の学生かと思ったです。
161:デフォルトの名無しさん
04/11/16 12:58:37
G…Gikukaiseki
K…Koubunkaiseki
V…VM
これくらい想像できないようでは現場のコードは読めないぞ
162:デフォルトの名無しさん
04/11/16 12:58:50
”コンパイラの最適化”と”アーキテクチャごとのコードの最適化”は、
考え方のレイヤが違いますよね?
やはりコンパイラを作成する場合、ターゲットとなるアーキテクチャに対しても
詳しくないと本当の意味での最適化コードは作成できない??
163:デフォルトの名無しさん
04/11/16 13:00:35
>>161
マジですか?!
164:デフォルトの名無しさん
04/11/16 13:05:21
>>162
だいたい同じPentiumでも種類ごとに適した最適化手法が違うし
165:デフォルトの名無しさん
04/11/16 13:07:11
定数値の最適化やら誘導変数の最適化やらはCPUが何だろうができると思うが。
166:デフォルトの名無しさん
04/11/16 13:37:15
>>165
???
167:デフォルトの名無しさん
04/11/16 14:01:27
>>165
君は>>162を100回読み直したまえ。
168:デフォルトの名無しさん
04/11/16 15:59:29
>>158
そういう小姑みたいな性格は何処に行っても嫌われますよ〜
169:デフォルトの名無しさん
04/11/16 16:20:39
Gokiburi
Kokkurochi
Varusan
170:デフォルトの名無しさん
04/11/16 19:23:36
>>168
嫌ってくれて構わんよ
171:折れ目も
04/11/17 21:26:53
なぜ Threading Code なのか?
URLリンク(www.kt.rim.or.jp)
マイクロベンチ.興味深い.
URLリンク(www.complang.tuwien.ac.at)
Pentiumならsubroutineが速い
172:デフォルトの名無しさん
04/11/17 22:01:45
>Pentiumならsubroutineが速い
そりゃそうだろ(w
173:デフォルトの名無しさん
04/11/19 04:25:54
著作権は大丈夫なのでしょうか, 2004/11/02
レビュアー: カスタマー 帯広市 Japan
JavaのVM向けのコードを生成する簡単なコンパイラが乗っているというので買いました。
非常に参考になると思います。
ただ、よけいなことかも知れませんが、この本の構文解析の部分は、中田育男著の「コンパイラ」の本と、
例題や説明までほとんど同じなので驚きました。
著作権の方は大丈夫なのでしょうか。
174:デフォルトの名無しさん
04/11/19 11:56:19
ガクガクブルブル
175:デフォルトの名無しさん
04/11/19 18:58:26
中田先生監修だからなあ。
176:デフォルトの名無しさん
04/11/20 02:21:01
>>175
それどころか前書き見たいのも中田先生が書いてた
177:デフォルトの名無しさん
04/11/20 08:03:00
弟子が中田先生の本の改訂を引き受けた、ってことでFA? 印税山分けだったりして
178:デフォルトの名無しさん
04/11/20 08:10:05
石田綾なんて人間ははじめから居なかったっつうことだろ
179:デフォルトの名無しさん
04/11/20 09:24:53
>>178
するどいな
180:デフォルトの名無しさん
04/11/20 18:03:52
始めて読むコンパイラ本としてはいかがですか?
181:デフォルトの名無しさん
04/11/20 18:54:34
ところで、最適化の話なんだけど、
ドラゴンブックにある「基本ブロック」
っていう考え方って、何かセンス悪い気がしない?
基本ブロックだろうが、大域的構造だろうが
同じ「グラフ」なんだから、それらを区別せず
統一的に扱って最適化を施すのが、
筋の通った考え方だと思うんだけど。
ま、確かに「基本ブロック」内だけで考えれば
殆どの問題は簡単になるのは分かるけどさ。
現実のコンパイラでも「基本ブロック」って
いう戦略は、よく使われているんだろうか?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5048日前に更新/228 KB
担当:undef