「コンパイラ・スクリ ..
118:デフォルトの名無しさん
09/06/10 11:16:43
実務指向でコンパイラを今時つくりたい、なんて人はいないと思う
スクリプトでDSLをさっくり組むならともかく
119:デフォルトの名無しさん
09/06/13 19:19:12
>>90
URLリンク(www.amazon.co.jp)コンパイラとバーチャルマシン-Text-今城-哲二/dp/4274133087
↑この本に、オブジェクト指向も例外処理も分かりやすく載ってるよ。
薄くてすぐに読めるし、お薦め。
ただ、日本語で概要が載っているだけなので、
実装するには自分で知恵を絞らないとだけど。
現代的なコンパイラは、内部で何度も変換を繰り返して、
最終的に実行可能なコードをはく。
オブジェクト指向の場合は、最初の方で非オブジェクト指向の
Cみたいなコード (AST) に変換してしまうと、
後はよく書籍に載っているような方法が使えていいと思う。
コンパイラを全部 (シンタックスシュガーの除去から
アセンブラの出力まで) 自作するのは、大規模過ぎて現実的じゃない。
だから、自分が関心を持っている部分以外は
なるべく既存のものを利用するといいと思う。
例えばCのコードを書きだすコンパイラを書けば、
アセンブラごとにジェネレータを自分で書かなくても
多くの環境で動くし、最適化もCコンパイラに頼める。
例外処理などはCでは実装しにくいので、
必要ならLLVM IRを出力するという方法もあるよ。
120:デフォルトの名無しさん
09/06/13 19:25:19
>>118
「実務」の中身によるんじゃないかな?
121:119
09/06/13 19:32:59
以前、Javaバイトコードに変換するコンパイラも書いたことがあるけど、
Javaだと「.class」ファイルはクラス単位でオブジェクト指向になっていて、
オブジェクト指向「からの」変換はJVMが担当している。
だから、バイトコードの仕様を読んでも、あまり参考にはならないと思う。
同じ理由で、JVMをターゲットにした (「.class」ファイルを生成する)
コンパイラも皆、参考にならないと思う。
122:デフォルトの名無しさん
09/06/13 20:10:29
リンゴの本見ればコンパイラなんて3日で書けるだろ
123:デフォルトの名無しさん
09/06/15 10:39:22
>>121
最近はclassファイルを扱うためのライブラリがたくさんあるよ。
124:デフォルトの名無しさん
09/06/15 11:15:34
>>121 が言ってるのは、Java のオブジェクト指向的な面
(動的バインディングとか)が実現されてるのは、Java VM自体
なので(invokevirtual命令とか)、オブジェクト指向言語を
ふつうのCPU上で実現するコンパイラの参考にはならん、と
いうこと。
125:デフォルトの名無しさん
09/06/16 21:52:36
ドラゴンブック超える神本の出版が確定!
プログラミング言語を作る
プログラミング言語を作るなんて究極の楽しみだ!
126:デフォルトの名無しさん
09/06/17 09:50:36
>>125
著者の「プログラミング言語を作る」のサイトはぐだぐだ進行な上に
今ブログをチェックしてみたら最新エントリがエロゲの話で
しかもトンデモ理論だったので失笑せざるを得なかった
立ち読みはしてみるつもりだけど、はずれじゃないかなぁ
127:デフォルトの名無しさん
09/06/17 10:18:52
前橋さんが言語本出すのか。
まあ、変なものにはならないでしょ。
128:デフォルトの名無しさん
09/06/17 18:57:40
>>125
作者乙
129:デフォルトの名無しさん
09/06/17 20:24:01
>>128
あの人の作る言語は神レベルの美しさだぞ
お前こそ何言ってるんだw?
130:デフォルトの名無しさん
09/06/17 20:26:33
>>129
どの人??
131:デフォルトの名無しさん
09/06/18 08:43:47
>>125 >>129 は信者だろうな。
ポインタ本とか、Java謎本とか、結構悪くなかったと思うけど、今回もそういう
他に類例のないところを押さえる趣向かねぇ。
ドラゴンブックに代わる、なんてことはないないw
132:デフォルトの名無しさん
09/06/18 09:01:10
>ドラゴンブックに代わる、なんてことはないないw
学術書と実用系趣味本を一緒にすること自体おかしいよね
133:デフォルトの名無しさん
09/06/18 09:59:07
ドラゴンブック買ったけど、全然役に立たなかった。オナニー書籍
りんご本のほうがよほど役に立ったわ
というくらい
134:デフォルトの名無しさん
09/06/18 10:21:41
>>133
具体的に書かれてないと、単に難しいことが理解できなかった可哀想な趣味グラマにしか見えないな
135:デフォルトの名無しさん
09/06/18 10:50:14
ドラゴンブック喧嘩せず
136:デフォルトの名無しさん
09/06/18 12:07:40
ドラゴンブックは、
字句解析、構文解析はツールを使うから詳しくなる気はないし、
構文解析向けの言語理論にも興味ないって人にはまったく不向き。
構文解析ツール作ってみたいなって人、
計算機科学科の学生には今でもいい本の一つ。
137:デフォルトの名無しさん
09/06/18 14:08:10
そこから先のバックエンドについても、高度な話の基本になるところを
押さえてあるからね。
138:デフォルトの名無しさん
09/06/18 16:24:11
>>136
「内容に興味のない人には不向き」っていうことですねわかります
139:デフォルトの名無しさん
09/06/18 16:44:12
>>138
当たり前の事ではないか
140:デフォルトの名無しさん
09/06/18 17:41:11
特定書籍の信者って面白いね。
反撃が全部「ぼくは君をこういうキャラに設定したぞ。どうだ悔しいだろう」だし。
141:デフォルトの名無しさん
09/06/18 17:45:52
>>140
具体的に書かれてないと、単に難しいことが理解できなかった可哀想な趣味グラマにしか見えないな
142:デフォルトの名無しさん
09/06/18 20:23:54
>>140
構文が曖昧です。君からキャラへの変換は明示的なキャストが必要です。
143:デフォルトの名無しさん
09/06/18 22:43:48
coinsの利用についてはどうよ?
COINSコンパイラ・インフラストラクチャ
URLリンク(www.coins-project.org)
144:デフォルトの名無しさん
09/06/18 22:52:47
coinsは最凶最悪
145:デフォルトの名無しさん
09/06/19 00:01:52
>>139
いやだから、内容に興味があるのは”前提”として、
その人たちにとって良い本かを議論しないと意味ないじゃんという話
まぁ全体的にいい本っていう論調だし俺も同意するが
146:デフォルトの名無しさん
09/06/19 00:06:19
まずドラゴンブック読めない奴はゴミ
これ世界の常識あるね
147:デフォルトの名無しさん
09/06/19 06:51:19
このスレで勧められ板から、ドラゴンブックせっかく奮発して買ったのに、
いきなりしょっぱなからはじめから変な数式ばっかでいやになった…。
論文とかたまに見るけど、どうして人にわかるように書かないんだろうか?
大学行ってたら、小学生でもわかるように、って習わなかったんだろうか?
148:デフォルトの名無しさん
09/06/19 07:24:21
小学生でもわかるように書くと厚さと著作にかかる時間とが値段が10倍になりますがよろしいか。
149:デフォルトの名無しさん
09/06/19 07:26:33
>>147
え?あの程度の数式読めないの?
何それこわい
150:デフォルトの名無しさん
09/06/19 07:28:12
10倍じゃ全然きかないか
151:デフォルトの名無しさん
09/06/19 07:36:55
>>147
貴様は人間の屑だ
152:デフォルトの名無しさん
09/06/19 08:23:43
>>147
ただ単に読むのが早すぎただけでしょ。積読して、適正になったらまた読む
153:デフォルトの名無しさん
09/06/19 10:09:04
小学生でもわかるように、ってのは 無 理 。
大学の教科書で、小学生でもわかるように書いてあるものなど皆無です。
高校生で奮発して読もうと思っているなら、学校の先生にでも相談しなさい。
多分集合の記号とか論理式とかでつまづいてるんじゃないかと思うんだけど。
154:デフォルトの名無しさん
09/06/19 23:36:05
先に簡単なの何冊か読めばいいのに
155:デフォルトの名無しさん
09/06/20 00:00:30
ドラゴンブックが一番簡単
これも読めないゆとりは来るな
156:デフォルトの名無しさん
09/06/20 00:07:00
ドラゴンブック読まなくてもコンパイラ作れるけどね
157:デフォルトの名無しさん
09/06/20 00:13:25
読まないと読めないは違う
158:デフォルトの名無しさん
09/06/23 16:33:02
数年前、文系の見方で書いたとかいうコンパイラの本ってあったよね
日本のコンパイラの第一人者が監修になってたから、わりと買った人多い?
たとえ話がぜんぜん例えになってなくて大混乱
巻末のJavaで書いたコンパイラのプログラムはほとんどCからの丸写しみたいなつくりだった。
159:デフォルトの名無しさん
09/06/23 16:38:45
上のほうですでに出てたかw
160:デフォルトの名無しさん
09/06/23 17:15:05
むしろ、ドラゴンブックは、それさえ読めれば、相当なコンパイラが書ける本だろ。
確かLSI-Cの作者がそう言ってたと中村正三郎か誰かが書いていた記憶がある。
161:デフォルトの名無しさん
09/06/23 17:27:01
コンパイラを書けるくらいの人なら読める
162:デフォルトの名無しさん
09/06/23 17:45:10
>>160
「ドラゴンブックを読めば誰でもLSI-Cぐらいのコンパイラは書ける」だなw
163:デフォルトの名無しさん
09/06/23 19:39:56
LSI-Cのひとはyacc互換のコンパイラコンパイラも作っていましたよね。
「ドラゴンブック読めば誰でもコンパイラコンパイラは書ける」なの?
164:デフォルトの名無しさん
09/06/23 19:57:12
スクリプトエンジンプログラミング 買ってきた。半分くらい読んだとこ。
なんか書いてみたいなレベルの自分にとっては、ぴったりのイメージ
なんだが、この本あんまり話題に上らないね・・・
C++出来ない自分にゃ読み替えるのが大変w
javaVM向けの中間言語を吐くやつのサンプルとかがあると、最高
だったんだけど。
165:デフォルトの名無しさん
09/06/23 20:40:34
>>162
LSI-Cは1980年代始めから中頃までが全盛期だと思うが、
当時最高の最適化を行なう最強コンパイラですよ。
作者はデータフロー解析、レジスタカラーリングは、
原論文をバリバリ読んでいた人だと思う。
かなりの腕前の人。
166:デフォルトの名無しさん
09/06/23 21:33:02
>>165
いやいや、>>162は作者がそう言ったので
中村正三郎か誰かがしょんぼり、という話w
167:デフォルトの名無しさん
09/06/23 22:14:46
>>164
ちょっと薄い本だけど、日立の人が書いた、Javaのバイトコード
を吐くコンパイラがサンプルで載ってる本あったね。
って調べたらあった↓
URLリンク(www.amazon.co.jp)
168:デフォルトの名無しさん
09/06/23 23:13:16
>>167
著者の最初に名前上がってる人、コボラーだね。
169:デフォルトの名無しさん
09/06/23 23:15:27
まじかよw
興味あったけど買うのよしたw
170:デフォルトの名無しさん
09/06/23 23:19:24
作者じゃないが。最近発売された「プログラミング言語を作る 」がインタープリタ
もバイトコードコンパイラのソースも載ってるぞ。買って読んでないから内容は
知らんが。
171:デフォルトの名無しさん
09/06/23 23:20:09
MiniCamlで良いじゃん。
172:デフォルトの名無しさん
09/06/24 00:34:54
スレ住人に聞くけどJIT関係の最適化に関するプロファイリングネタはここでいいのかな?
173:デフォルトの名無しさん
09/06/24 04:30:55
さっきJavaで書かれた独自形式の中間言語を出力する
コンパイラが欲しいと書いてる人がいたが、
よくよく考えてみると、.NETやJavaなどのそれ自体が
中間言語でかかれててJITコンパイラまで付いてる環境では、
下手に独自で作るよりもその環境の中間言語を出力してしまう、
要するにコンパイラそのものを作ってしまったほうが簡単なんだよな。
中間言語の書式や(基本的に)仮想マシンの仕様を考えなくて済む。
だからJavaにおけるGroovy、.NETにおけるIronPythonなど、
中身はインタプリタというよりもコンパイラそのものだ。
174:デフォルトの名無しさん
09/06/24 05:51:31
そこでLLVMやCOINSが出てくるわけだ。
175:デフォルトの名無しさん
09/06/24 07:32:42
プログラミング言語を作るは神本
ドラゴンブック不要といわれる理由がよくわかる
読んでみろ
176:デフォルトの名無しさん
09/06/24 07:41:40
はい。
177:デフォルトの名無しさん
09/06/24 08:03:25
はいじゃないが。
178:デフォルトの名無しさん
09/06/24 10:29:52
>>170,175
信者か作者かしらんがいい加減うざい
179:デフォルトの名無しさん
09/06/24 11:43:34
そう思わせるのが目的のアンチかもよ
180:デフォルトの名無しさん
09/06/24 22:29:32
プログラミング言語を作る
買って読んでみたぞ
普通の本だろこれ
金返せよ
181:デフォルトの名無しさん
09/06/24 22:40:43
え?俺の本からは神様が出てきたぞ?正に神本だと思ったw
182:デフォルトの名無しさん
09/06/24 23:16:58
>>181
作者乙
183:デフォルトの名無しさん
09/06/24 23:20:30
間違えた、紙だったw
>>182
偽エスパー乙
184:デフォルトの名無しさん
09/06/24 23:25:07
無理に面白いこと言おうとしなくてもいいよ
185:デフォルトの名無しさん
09/06/25 07:31:29
ドラゴンブック持ってないのに
コンパイラの本書いてるやついるけど
あいつは何なの?
186:デフォルトの名無しさん
09/06/25 07:35:37
分かりません。
187:デフォルトの名無しさん
09/06/25 14:13:43
>>169
いや、コボラーはコボラーでもIBMの奴隷って意味のコボラーじゃないからw
188:デフォルトの名無しさん
09/06/27 23:40:48
>>160
確か、LSI-Cの作者がそれしか読んでないとかいってただけだと思う。
万人に当てはまるわけではない と
189:デフォルトの名無しさん
09/06/28 00:30:24
大昔の話じゃいろいろ説明をつけないと通じないんだなあ……
というかその大昔の時点で意味わかってなかったのか?
LSI-Cの最適化は凄いとよく言われたが
詰めが甘くて実際には骨折り損だという話もあったよ
コンパイル時間はMS-Cの倍だったしね
190:デフォルトの名無しさん
09/06/28 01:40:22
>>189
8080版の最適化の話だろすごかったの
191:デフォルトの名無しさん
09/06/28 07:18:31
LSI-C(笑)
192:デフォルトの名無しさん
09/06/28 07:19:14
4004(笑)
193:デフォルトの名無しさん
09/06/28 09:20:58
>>189
知りもしないことをよくもまあ
194:デフォルトの名無しさん
09/06/28 11:56:45
知ってる人だけ。。。
MSX-Cは変数が自動でレジスタに割り当てられるんだけど、
そうなるとポインタを介したアクセスと一貫性がなくなる。
195:デフォルトの名無しさん
09/06/28 12:01:02
MSX-C = LSI-C
196:デフォルトの名無しさん
09/06/28 21:23:22
>>194
変数のポインタを取り出せばメモリ上に確保しなおしてたよ
それともループ内に持ち込んだ変数を割り込み処理で外部から変更した時に関与が出ないって意味で言ってる?
197:デフォルトの名無しさん
09/06/28 21:59:34
#include <stdio.h>
#pragma nonrec
main()
{
int n;
int *p;
p = &n;
n = 10;
*p = 100;
printf("n = %d\n", n);
}
MSX-C のマニュアルに載ってたサンプル。
これで「n = 10」と表示されるそうな。
198:デフォルトの名無しさん
09/06/28 23:10:50
なんじゃこりゃ。
これが仕様なの?
199:デフォルトの名無しさん
09/06/28 23:30:24
往年の8ビットマイコン用Cコンパイラの#pragmaか
コード書く人もコンパイラの振る舞いにあわせて組んでたんだね
200:デフォルトの名無しさん
09/06/28 23:40:43
逆だろ。
pragmaはコンパイルの動作を指定するためにある。
201:デフォルトの名無しさん
09/06/29 00:14:16
MSX-CでC言語を勉強したんだけど、これによくはまった。
レジスタに割り当てないこともできるけど。
#pragma nonrecはローカル変数をstaticがついているかのようにする。
non-recursiveの略。CPUの制限でスタック上の変数にアクセスするのが
遅いからです。コードの再利用のことを考えてのことだと思う。
あとMSX-Cはlongと浮動小数点数がないんです。
#ifもない。if文で代用とマニュアルにありました。実行されないコードは
生成されない。
なにかの役に立つかな?
202:デフォルトの名無しさん
09/06/29 00:17:14
#pragma有効で組むか
さもなくば死か
この時代にCを開発用途に使えたという時点である意味幸運だったとも言える
203:デフォルトの名無しさん
09/06/29 12:13:13
8080でのスタックフレームってめんどくさいよな
204:デフォルトの名無しさん
09/06/29 23:59:31
高級言語を意識して設計されてないから仕方ない
Z80だとIX/IYで強引にやるのか?汎用/裏レジスタで最適化とかしてたら凄いが
205:デフォルトの名無しさん
09/06/30 00:51:28
IX/IYは人間向きのレジスタで、
便利ではあるけど遅いからコンパイラは使わない。
(HD64180あたりになると結構速かったが)
LSI-C(MSX-C)はもちろん裏レジスタ使いまくり。
206:デフォルトの名無しさん
09/06/30 22:30:31
むかし見たLSI-C80の広告ではIXかIYをフレームポインタに使っていた
コードが掲載されていた。
MSX-Cは裏レジスタ,IX,IYを使うコードは生成しなかったと思う。
付属のライブラリでは使っているかもしれませんが。
スタック上のローカル変数アクセスの方法はどうだったか記憶にありません。
MSX-Cのアセンブリ言語出力をZ80に最適化するプログラムを書いた人もいるようです。
僕も出力を見ていたときすこし考えたことありました。
アセンブリ言語レベルで8080から8086に変換するプログラムの存在を古い本で読んだのも思い出しました。
207:デフォルトの名無しさん
09/06/30 23:41:00
コンパイラが将来性のない
回顧主義者おっさんのたまり場であることがよくわかる
だから日本は研究でも実業でもこの分野でチョン以下になる。
208:デフォルトの名無しさん
09/06/30 23:51:29
>>207
そんな愚にも付かないことを言ってるヒマがあったら、
LLVM向けに何かメジャーな言語を移植するのだ。
209:デフォルトの名無しさん
09/07/01 00:01:25
LLVMは糞だろ
210:デフォルトの名無しさん
09/07/01 00:22:10
>>209
どこがどう糞なの?
211:デフォルトの名無しさん
09/07/01 23:55:53
>>210
Milepost GCCがあるから不要
自分でコードをチューニングするという古臭い時代は終わったの
自動的に学習して最適なコードを出力してくれるからLLVM自体不要なの
212:デフォルトの名無しさん
09/07/02 00:01:16
幼稚園児かw
213:デフォルトの名無しさん
09/07/02 00:15:27
>>211
というか、同じようなアイデアのllvm-gccのほうが有名なわけだが?
214:デフォルトの名無しさん
09/07/02 00:20:21
>>211
完全自動化だし、今年後半のコンパイラ関係の
賞総なめにするって言われてるけどねぇ
EUレベルの国家プロジェクトと田舎大学の糞プロジェクト
比較されてもねぇ
215:デフォルトの名無しさん
09/07/02 00:23:40
幼稚園児だな
216:デフォルトの名無しさん
09/07/03 07:15:50
ヒント:実績
217:デフォルトの名無しさん
09/07/03 17:26:47
Milepost GCCのICIな人たちが次はLLVMでやってみるって言ってんですがねえ…
218:デフォルトの名無しさん
09/07/03 18:29:02
基地外は相手にするなよ
219:デフォルトの名無しさん
09/07/03 21:43:00
>>217
妄想乙
220:デフォルトの名無しさん
09/07/04 00:33:17
>>219
君がろくに論文も読んでないのが良く分かりました。
221:デフォルトの名無しさん
09/07/05 14:42:00
このスレふつうのコンパイラをつくろうを
宣伝したやつフルボッコにするからな
222:デフォルトの名無しさん
09/07/05 15:27:47
まず>>221が・・・
223:デフォルトの名無しさん
09/07/05 15:45:49
>>221
>>221
>>221
224:デフォルトの名無しさん
09/07/05 15:59:24
>>221
>>221
>>221
>>221
>>221
>>221
225:デフォルトの名無しさん
09/07/05 19:14:05
著者の関係者なのか?
226:デフォルトの名無しさん
09/07/05 22:26:25
8080でLLVM実装まだ?
227:デフォルトの名無しさん
09/07/06 17:28:44
ゼッパチでよければ
228:デフォルトの名無しさん
09/07/07 16:05:46
x86用のコードを吐くCコンパイラの、64bit整数(long long)まわりを読んでいます。
addl $1,%eax
adcl $0,%eax
みたいな簡単なものは理解できたのですが、シフト演算や乗算・除算になると
追い方が悪いのか理解力が弱いのかさえ分からなくなってきました。
この手のことを解説したサイトって無いのでしょうか。
229:デフォルトの名無しさん
09/07/07 17:55:56
>>228
たぶん自分で調べたほうが早い。
最適化をかけないデバッグビルドで、
演算させるたびに何か関数(printf)でも呼び出す形にするといいよ。
230:デフォルトの名無しさん
09/07/07 18:16:51
デバッガ知らないの?gdb?
231:デフォルトの名無しさん
09/07/07 18:21:05
前提知識であるx86のアセンブリの知識はあるの?
232:デフォルトの名無しさん
09/07/08 01:09:36
$(GCC)/gcc/longlong.h
まじお勧め
233:デフォルトの名無しさん
09/07/08 06:52:57
>>229
そうですか。急がば回れってことなんでしょうか。
おれ、このリーディングが終わったらまとめ書くんだ。
>>230
acid
使い方が分からないので、スタックトレースにしか使ってません。
>>231
数年前に、はじめて読む8086を流し読みした程度の知識です。
分からない命令はインテルのpdf引きながら読んでいます。
>>232
URLリンク(www.opensource.apple.com)
mullを1回で、(long)*(long)はできるのですね。おもしろい。
234:デフォルトの名無しさん
09/07/08 09:10:38
>>230
gcc使う人はたいていデバッガ使わないでしょ。
デバッガに頼り切ってるのはVS厨が多い。
235:デフォルトの名無しさん
09/07/08 09:36:37
> gcc使う人はたいていデバッガ使わないでしょ。
そういう人って
デバッグがデバッガに頼り切りではないという面もあるにしろ
デバッガを使いこなせてないという面もあるんじゃないかな。
236:デフォルトの名無しさん
09/07/08 09:59:40
>>234
それは偏見。
組み込みLinux開発ではgdbくらい使いこなせないとお話になりません。
237:デフォルトの名無しさん
09/07/08 17:28:59
>>236
それは偏見。
組み込みLinux開発ではgdb使ってるようではお話になりません。
238:デフォルトの名無しさん
09/07/08 17:31:41
gdbは使いこなせるけど使ってないケースもあるわけで
239:デフォルトの名無しさん
09/07/08 17:35:33
printfの方が高機能なわけで
240:デフォルトの名無しさん
09/07/08 17:56:46
Caper良さそうなのですが字句解析(Lexar)には
何を使うのがいいでしょうか?
おすすめを教えてください。
241:デフォルトの名無しさん
09/07/08 18:34:20
Caper良さそうなのですが字句解析(Lexar)には
何を使うのがいいでしょうか?
おすすめを教えてください。
242:デフォルトの名無しさん
09/07/08 18:53:24
手書きでOK
243:デフォルトの名無しさん
09/07/08 19:48:27
手書きでいいと思う
文字列→数値のパースみたいなランタイムの処理に流用しやすいし
244:デフォルトの名無しさん
09/07/08 23:21:38
本気で速度気にするならflex出力を手修正とかがいいんじゃないか
245:デフォルトの名無しさん
09/07/09 01:22:53
アセンブリから機械語にどうやって変換しているんですか?
246:デフォルトの名無しさん
09/07/09 01:54:23
まずOPコードを暗記するんだ
相対アドレスも数をこなせば暗算できるようになる
247:デフォルトの名無しさん
09/07/09 09:40:02
>>245
アセンブラを使う。
gccに-vオプションつけてみな。
248:デフォルトの名無しさん
09/07/09 09:50:38
>>241
Caperはgcc+Perlで開発されているので字句解析にはPerlを使うと馴染みやすい。
Linuxには必要なものがすべて揃っている。
249:デフォルトの名無しさん
09/07/09 10:10:50
>>247
あなたの作っているコンパイラに対してアセンブラは自前ですか?
250:デフォルトの名無しさん
09/07/09 10:16:58
母国語でおk
251:デフォルトの名無しさん
09/07/09 16:11:15
アセンブラどころかリンカもローダも自作したが
最初は使えるものを使って、徐々に置き換えていけばいいんじゃない
252:デフォルトの名無しさん
09/07/21 23:01:50
Richard Bornatのコンパイラの本でお勧めですか?
253:デフォルトの名無しさん
09/07/21 23:26:02
日本語でおk
254:デフォルトの名無しさん
09/07/24 21:58:11
やさしいコンパイラ(デコイ本)はやめたほうがいい
ふつうの方は神本確定の出来だった
255:デフォルトの名無しさん
09/07/25 00:56:59
やさしいコンパイラ貶して
ふつうの方宣伝してる人は
まったく具体的な指摘がないんだよな
256:デフォルトの名無しさん
09/07/25 01:09:34
と、ここぞとばかりに架空の傾向を持ち出すわけですね。
257:デフォルトの名無しさん
09/07/25 09:32:51
ふつうのコンパイラ良書なんでしょうか
学生なのでちょっと資金余裕がなくて
258:デフォルトの名無しさん
09/07/25 09:38:48
研究室で買ってもらえばいい。あるいは図書館。
259:デフォルトの名無しさん
09/07/26 02:01:07
mingw-jpの使い方まったくわからないので
どなたか教えてもらいたいのですが
260:デフォルトの名無しさん
09/07/26 17:17:33
言語ワークベンチは究極的には完全にプログラミング方法を変えるかもしれない
URLリンク(www.infoq.com)
261:デフォルトの名無しさん
09/07/26 17:40:02
>>260 なんかスタイルシートが効いてなくて生々しいレイアウトになってない?
262:デフォルトの名無しさん
09/07/26 17:57:19
>>261
今見たが、特に問題ないぞ。
263:デフォルトの名無しさん
09/07/27 11:25:26
>>261
うちの環境だとこうなってる
IE6 ちゃんと出る
FireFox スタイルシートが効かない
Google Chrome スタイルシートが効かない上に画像も表示されない
264:263
09/07/27 11:30:13
今見たら直ってました。
265:261
09/07/27 12:19:46
うーん。うちのFirefoxだと変わらずだな。
エラーコンソールになんか出てるけど、それが原因を示してるのかわからん...
266:デフォルトの名無しさん
09/07/27 13:05:55
>>265
リロードしたらOKになったよ、うちのFX
267:デフォルトの名無しさん
09/07/27 14:00:29
うちもFirefoxだと一度目はスタイルシート読み込まれないな
まぁスレには関係ない話題だが
268:デフォルトの名無しさん
09/07/28 14:39:17
>>260
どっちかというと設計よりの話だね。
269:デフォルトの名無しさん
09/08/01 04:41:50
.NET周りで使えるもの、という条件だが。
・Lexical analyzer and parser generator
単純だがよくできている。構文木を食わせてソースコードを吐かせるBison式。
最初これで作りかけていたが、パーサーを構築できてもそのパーサーが予定の挙動をしない場合、デバッグの方法が困難。
(テーブルに分解されてしまうため、ソースが追いかけられない)
パーサーの動作は高速と思われる。
・Irony
パース、構文木構築までをやってくれるコンパイラを動的に構築してくれる。
簡単なGUIのパーサーチェッカーが付いていて、開発がかなり楽
(すごい楽かはもっと楽なものがあるのかどうか知らないので……)
動的に構築する分lapgより遅いかもしれないが、とりあえず自分の目的にはこれで十分なので。
ただ、コンパイル済みコードを吐かすために自分用の構文木を
もう一度作り直す羽目になるのは激しくビミョー……。
(別にそのまま構文木を消化していったっていいわけだが。
まあ少なくともテキスト形式で出力するにはあの構文木のオブジェクト構造は向いてないな)
270:デフォルトの名無しさん
09/08/01 04:55:36
修正と補足。
「構文木を食わせて〜」は、「BNF定義を食わせて〜」が正しい。
lapgもIronyもどちらもEBNFではなくBNF式。(Wikipediaで調べた限りでは)
ただしどちらもパースに正規表現が使える。
lapgは非Ascii文字の正規表現パースがどうも挙動が怪しい……。
Ironyはホワイトスペースの除去以外にも非構文要素を取り除けるチャンスがあるので小回りが効くようだ。
(といったところも気に入っている)
271:デフォルトの名無しさん
09/08/01 13:51:44
JetBrains Meta Programming System
これが最強他は全て旧世代の糞技術
272:デフォルトの名無しさん
09/08/01 14:25:38
>>271
どんなものか説明してみれ
273:デフォルトの名無しさん
09/08/01 14:32:14
.NET向けの旧来のスタイルのものとしてはGPPG/GPLEXが定番
GPPGはIronRubyにも使われてる
274:デフォルトの名無しさん
09/08/01 15:05:06
ドラゴンブック買ってきたぞ!さあ読むぞ!
275:デフォルトの名無しさん
09/08/01 16:48:45
>>273
なるほど……。
現在はMPPG/MPLEXと名前が変わってるようだけどね。
どうせいずれVisual Studioの胸を借りる(SDKを使ってオレ様IDEを作る)予定なので、
はじめからこちらで構文解析を実装しておいた方が
構文の強調、InteliSenceなどで使い回しが利くかもしれない。
結構進んでてあとはエラー周りくらいだったんだが、破棄してしまうかなぁ……。
276:デフォルトの名無しさん
09/08/01 16:55:06
MPPG/MPLEXはまた別物だよ(MSがVisual Studio SDK用にカスタマイズしたもの?)
本家はURLリンク(plas.fit.qut.edu.au)で開発継続中でドキュメントも充実してる
277:デフォルトの名無しさん
09/08/01 17:30:29
>>276
HPみてみたら、GPPG is closely related to the “Managed Package Parser Generator” application
って書いてるね。
今仕様を決めているスクリプトは文法がPythonに似ているので
IronPythonがどうなってるか調べてみたら、こっちはパーサーを自前で書いてる……?
(ソースコード中に直接コメントでBNFが書いてある)
278:デフォルトの名無しさん
09/08/01 17:42:08
ともあれ、BNF定義の中に直接コード片が埋め込めるGPPG/MPPGの仕様は興味深いね。
ただそれだけに、PDFドキュメントだけじゃなくて実際に動くサンプルプロジェクトが欲しいところだなぁ。
どっかにお手ごろなのが落ちてないかな。
279:デフォルトの名無しさん
09/08/01 18:06:36
>>276のサイトにあるパッケージには電卓のサンプルが付いてる。
言語なら
URLリンク(www.iunknown.com)
これなんか手ごろで面白い。あとは大規模だけどIronSchemeやIronRubyくらいかな。
280:デフォルトの名無しさん
09/08/01 18:20:30
>>278
> ともあれ、BNF定義の中に直接コード片が埋め込めるGPPG/MPPGの仕様は興味深いね。
>>276のサイトも見ないで聞くがyaccなんかのアクションとは違うもの?
281:デフォルトの名無しさん
09/08/01 18:41:28
同じです
言語定義が処理系を実装する言語に依存しないというのは,むしろ流行りの売り文句です
282:デフォルトの名無しさん
09/08/01 18:47:36
>>281
> 同じです
じゃあ>>278は何が興味深いんだろうか?
> 言語定義が処理系を実装する言語に依存しないというのは,むしろ流行りの売り文句です
JavaでいうとSableCC的なやつかな
JavaCC+JJTree、ANTLRでもできるが
283:デフォルトの名無しさん
09/08/01 19:06:25
> GPGP is a generator for LALR(1) parsers. It accepts a
> “YACC/BISON-like” input specification and produces a C# output
> file. The parsers that it produces are thread-safe, with all parser
> state held within the parser instance.
プログラミング言語非依存でもないよ。
284:デフォルトの名無しさん
09/08/01 19:09:44
>>280,281
278だが、その点で言えば、269で挙げたLexical analyzer and parser generatorはC++/Java/C#形式で吐き出せるよ。
だがこちらとしては、実装言語の非依存性などどうでもよい。
パーサーを実装しやすい仕様になっていればそれでいいわけ。
実装しやすさという観点で言えば、BNF式ごとにコードが埋め込めるGPPGは小回りが利きそうだし、
コンパイラやエラー処理があらかじめ一通り実装された状態で使えるIronyよさげ、というわけで。
285:デフォルトの名無しさん
09/08/01 19:14:10
>>284
話の流れが見えてなくてすまないが、要は昔ながらのコンパイラ・コンパイラが
欲しくてGPPGがそうだってだけ?
仕様が興味深いというから何か目新しいネタがあるのかと期待しちゃったんだが
286:デフォルトの名無しさん
09/08/01 19:16:39
ANTLRみたいなのって,C#にも対応してるよと謳ってるのが多いけど
ランタイムの実装が糞すぎて使い物にならないのが多いんだよね
287:デフォルトの名無しさん
09/08/01 19:28:14
>>286
学者風情が作った糞ライブラリに
期待するなよw自作しろ
288:デフォルトの名無しさん
09/08/01 19:37:36
>>284>>286>>287
ノイズレスはやめてくれ
289:デフォルトの名無しさん
09/08/01 19:47:26
>>285
他のやつらとこのスレの趣旨的にはどうか分からないが、
オレとしては自分で仕様を決めたスクリプトを他の形式にコンパイルするのに
必要十分な環境をそろえられればいい。
GPPG(MPPG)はスレの流れからするとyaccに仕様が近いようだが、(いわゆる昔ながらのコンパイラ・コンパイラ)
別にそれにこだわりはない。
むしろIronyによる作りやすさを評価してるくらいだ。
ともあれ、構文木を作った後が大変なんだがな……。
290:デフォルトの名無しさん
09/08/01 21:50:56
確かに、はじめてyaccを知ったときは大変興味深かった。
>289はGPPG?で今その感動を味わっているわけだ。
291:デフォルトの名無しさん
09/08/01 21:55:08
>>289
あんなバグフィックスも含めて、
ちゃんとメインテナンスされてるどうかわからんツールよく使えるな。
近況はブログにでも書いてて欲しい。
292:デフォルトの名無しさん
09/08/01 22:02:23
>>291
リリース版しか見てないだろ。
Subversionのリポジトリみたら今月に至るまでコミットされつづけてるぞ。
というか、作者に連絡して修正パッチを投げてさっき返事が来たところだ。
codeplexにおけるプロジェクトratingsも★5つだし、どこが気に入らないのか知らないが、
まあオレが使いこなせれば済むことだからいいや。
293:デフォルトの名無しさん
09/08/01 22:27:30
yaccを知らずに僕らは生まれた〜
lexを知らずに僕らは育った〜
294:デフォルトの名無しさん
09/08/02 10:06:57
PEG世代の歌か?
295:デフォルトの名無しさん
09/08/03 00:01:46
夏休みなんで
C++でPEGかpackratのパーサ作ってみたいのですが
何を参考に作るのが面白いでしょうか?
296:デフォルトの名無しさん
09/08/03 00:13:52
ポリエチレングリコール?
いやいや・・
297:デフォルトの名無しさん
09/08/03 00:23:12
>>295
PEGは新しい概念で古い言語向けにはあまり実装されて無いんじゃね?
Haskell、Pythonあたりを使うことをお勧めする。
298:デフォルトの名無しさん
09/08/03 11:42:07
URLリンク(pdos.csail.mit.edu)
Packrat の総本山に、C++ 実装へのリンクがいくつかあるよね。
299:デフォルトの名無しさん
09/08/03 12:00:32
PEGって使いやすいの?
CFGに比べた利点・欠点とか
こういうのが書きやすいとか書きづらいとかありますか。
300:デフォルトの名無しさん
09/08/03 12:29:13
原理的には、バックトラックのあるトップダウンパーザの受け入れる文法そのもの
なので、CFGに比べて、原理を理解してしまえば直感的。
利点とも欠点ともとれるけど、レキシカルアナライザと統合される。
ナイーブな(メモ化なし)実装だと、指数的に時間がかかり、かつ無駄が多い。
301:デフォルトの名無しさん
09/08/03 12:41:16
C#の処理系ってことでIronMetaを眺めてみたが、こりゃあ異次元行ってるな。
ぱっと見ただけじゃさっぱりわからんぞ……。
302:デフォルトの名無しさん
09/08/03 12:56:06
? これ別にC#をパースしてるわけじゃないと思うよ
yaccみたいにテキスト的に処理してるだけだろ
303:デフォルトの名無しさん
09/08/03 12:58:29
>>302
まあそうなんだけど、C#自体の文法と似通っていて、
どこまでがC#の文法なのかが非常にわかりにくい。
どう見ても構文の宣言とラムダ式の定義が混じって見える。
304:デフォルトの名無しさん
09/08/04 01:55:34
>>303
そもそもそういう人が処理系なんて書けるの?
305:デフォルトの名無しさん
09/08/04 07:32:04
>>304
んんー、昨日いっぱいまでで、Irony使って大体書き上げてしまったぞ。
単独ファイルのコンパイルは文法の厳密化とか以外は大体こんなもの。
あとはエラー出力を整理してGUIくっつけて複数ファイルのコンパイルに対応したらおしまい。
ソースコード吐き出し式よりライブラリ式の方がオレには使いやすいようだ。
306:デフォルトの名無しさん
09/08/04 10:55:30
C#って文法は単純でも中身は超複雑だぞw
307:デフォルトの名無しさん
09/08/04 12:43:57
中身w
308:デフォルトの名無しさん
09/08/04 16:08:03
PEGのパーザジェネレータ作るのはかなり簡単だよ。LL(1)やLALR(1)のパーザジェネレータ
作るのと比べてもかなり簡単。LLやLR系だと文法に対するグローバルな解析が必要になるけど
PEGはそういうのしなくていいし。パーザジェネレータじゃなくてパーザコンビネータならもっと簡単に書ける
無名関数に相当する機能がある言語だったら、大体100行程度で基本的な機能を持ったものを作れる
309:デフォルトの名無しさん
09/08/04 16:14:10
PEGの利点:
・原理的にyaccとかのLALR(1)より強力なので、yaccでハンドリングするのが難しい文法も簡単に扱える(ことがある)
・レクサとパーザが統合されてるので、Rubyの"#{exp}"みたいな式埋め込み文字列みたいな文法も簡単に扱える
・Rubyとかではトリッキーな事をしてこの問題を回避している
・アルゴリズムが簡単なので挙動を理解しやすい=文法をデバッグしやすい(かも)
PEGの欠点:
・ナイーブな実装では最悪の場合指数関数時間(だけど、実用上最悪ケースはそんなに起きないと思う)
・メモ化(Packrat)しても、定数係数でLLやLRとかの非バックトラック型のパーザよりは遅い
・Packratだと、状態付きパーザを扱うのが難しい(シンボル表を参照しながらパーズする場合など)
・レクサとパーザが統合されてるので、空白とかの処理がやや面倒
310:デフォルトの名無しさん
09/08/04 16:14:12
それはPackratパーザ?
それともバックトラック?
311:デフォルトの名無しさん
09/08/04 16:15:27
>>310
Packratも基本的には、単にナイーブなPEGパーザをメモ化するだけなので、多少手間が増えるくらいで、実装は難しくは無い
312:デフォルトの名無しさん
09/08/04 16:28:07
とりあえずLISP系でスマートに実装してみて!
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
313:デフォルトの名無しさん
09/08/04 16:43:41
>>312
OK. 1時間くらい待っててくれ
314:デフォルトの名無しさん
09/08/04 16:50:54
なんかPEG/Packrat詳しい人がいるみたいなので質問させてくれ。
手元のPEGのサンプルは四則計算を解釈していて、いきなりインタプリタとして動くようになっている。
いきなり動かすんじゃなくて構文木構築の段階で動作をとめることはできるんだろうか?
それから途中まで解析した文脈を情報として続く解釈で再利用できるだろうか?
例えばPythonの文法を考えてもらうとして、
# ***ここから***
if [Expr]:
[Sentence]
[Sentence]
[Sentence]
# ***ここまで***
Pythonでは構文の範囲は字下げで表現しているので、
if文の範囲を調べるのに字下げの数を数えないといけない。
どうやって解釈させたらいいのかわからなくて戸惑っているところなんだが。
315:デフォルトの名無しさん
09/08/04 17:21:20
そのサンプルは、構文木を作ってから四則演算を実行してるんじゃなくて、
いきなり構文を解析しながら四則演算をしてるんじゃなかろうかという気がするが。
オフサイドルールとかはPEGの鬼門だということかと。
確か原論文では、それを理由にHaskellはムズいとして、Javaのパーザを
実装していた。
多分さがせば解決方法が出てる論文もあるだろうと思うのだけど。
パーザを状態付きにする方法は原論文にある。
316:デフォルトの名無しさん
09/08/04 17:56:21
>>309
> 定数係数で
この言葉遣いはちょっと変なのでは?
>>314
字下げ処理はレキサの仕事と割りきってしまえばそれほど難しくはないでしょ。
先読みして{と}に相当するものに変換できるから。
317:313
09/08/04 18:20:40
(use srfi-9)
(define-record-type result
(make-result x y) result? (x value) (y next))
(define (app parser f)
(lambda(in)
(define r (parser in))
(if r (make-result (f (value r)) (next r)) #f)))
(define (term str)
(lambda(in)
(if (equal? (string-scan in str ' index) 0)
(make-result str (substring in (string-length str) (string-length in))) #f)))
(define (/: x y) (lambda(in) (or (x in) (y in))))
(define (^: x y)
(lambda(in)
(define r1 (x in))
(if r1
(let ((r2 (y (next r1))))
(if r2 (make-result (cons (value r1) (value r2)) (next r2)) #f))
#f)))
(define (seq p . parsers) (fold (lambda(x y) (^: y x)) p parsers))
(define (rep0 parser)
(lambda(in)
(let loop ((rest in) (rs '()))
(define r (parser rest))
(if r (loop (next r) (cons (value r) rs)) (make-result (reverse rs) rest)))))
(define (rep1 parser) (^: parser (rep0 parser)))
(define (? parser) (/: parser (app (term "") (lambda(v) '()))))
(define (& parser) (! (! parser)))
(define (! parser) (lambda(in) (if (parser in) #f (make-result '() in))))
(define-syntax rule
(syntax-rules() ((_ name body) (define name (lambda(in) (body in))))))
318:313
09/08/04 18:25:10
なんとか1レスの範囲に収めたが、そのせいもあって、読みづらくなってる。その辺は読む側
の環境で適当になんとかしてくれ。あと、Gaucheのライブラリ関数string-scan使ったので、Gauche
でしか動かんと思う。string-indexとかに置き換えれば、他のSchemeでもたぶん動くと思われ。
Schemeは普段使わないんで、Scheme使いの人からするとアレなコードかもしれんが、そのへんは勘弁。
使い方は以下のような感じ。文脈自由文法では表現できない、A^n B^n C^nの文法。
(rule S (seq (& (^: A (! (term "b")))) (rep1 (term "a")) B (! (term "c"))))
(rule A (seq (term "a") (? A) (term "b")))
(rule B (seq (term "b") (? B) (term "c")))
(display (S "aaabbbccc"))
319:313
09/08/04 18:28:52
Pythonのインデントルールみたいなのは、レキサがインデント処理する事が前提だから、PEG/Packrat
で処理する場合でも、レキサを別に用意した方が書きやすいと思う。レキサがあったらPEGじゃないというわけ
じゃないので別に構わないはず(基本単位が文字の代わりにトークンになるだけ)。
320:デフォルトの名無しさん
09/08/04 19:26:20
>313
うお、本当にできてる!
たしかにこれはクロージャ使えない言語では無理だ
こういう風になったけど合ってますか?
gosh> (display (S "aaabbbccc"))
#<result 0pbb1788>#<undef>
gosh> (define res (S "aaabbbccc"))
res
gosh> (result? res)
#t
gosh> (value res)
(((() #0="a" #0# #0#) (#1="b" (#1# (#1#) . #2="c") . #2#) . #2#))
gosh> (next res)
""
321:313
09/08/04 19:34:21
>>320
たぶんそれであってる。まあ、これだけだと構文エラー時のエラーメッセージ
表示とかどうしようも無いし、実用的にしようと思うと、色々付け足す必要があるけど、
コアの部分はこれくらい簡単だということで。
322:デフォルトの名無しさん
09/08/04 23:05:50
みんな論文みながら作ってるの?
どうやってpackrat実装すればいいかよくわからん
323:デフォルトの名無しさん
09/08/04 23:21:12
21世紀…人類はいまだに左再帰問題を克服できずにいた
324:313
09/08/05 00:55:09
>>322
一応、自分が作ったときは論文参考にしたけど、基本的にナイーブなPEGパーザ+メモ化に過ぎ無いから
それさえわかっていれば、自力で実装することもできると想う。ヒントとして、上で書いたSchemeによる
パーザコンビネータで、各非終端記号の解析結果をメモ化するにはどうすればいいか考えてみて。
Rats!とか高度な最適化してる奴はまあソース読むしかないと思うけど。
325:デフォルトの名無しさん
09/08/05 01:16:54
左再帰の論文もあったような。
326:デフォルトの名無しさん
09/08/05 02:07:47
これのことかな。
Packrat Parsers Can Support Left Recursion (PEPM 2008)
Alessandro Warth, James R. Douglass, and Todd Millstein
URLリンク(www.tinlizzie.org)
327:デフォルトの名無しさん
09/08/08 18:40:53
COBOLインタープリタを作ろうと思ったが挫折。
制定されているキーワードの数が尋常じゃない。
商用COBOLコンパイラを作っているメーカーの人はマジ天才。
328:デフォルトの名無しさん
09/08/08 19:51:58
何でそんなものを作ろうと思ったんだw
329:デフォルトの名無しさん
09/08/09 03:42:55
COBOLかっこいいじゃん。大文字で。
Cを使える人はいっぱいいるけど、COBOLはそうはいない。
だからこっそり開発して職場のヒーローになろうと思ってね。
でも道は遠かった・・・使うのと作るのとは別物なのだ。
330:デフォルトの名無しさん
09/08/09 09:26:31
>>327
> 制定されているキーワードの数が尋常じゃない。
何のためにパーサジェネレータがあるんだか
まあ、BNF 打ち込むだけで疲労困憊ってのはあるかもしれんが…
331:デフォルトの名無しさん
09/08/09 09:32:18
大文字使いたいだけならマクロでも使えばいいじゃん
332:デフォルトの名無しさん
09/08/09 10:31:58
>>330
やっぱ疲労困憊ら?(静岡弁で)
333:デフォルトの名無しさん
09/08/09 11:53:19
>COBOL
ほとんどは命令の名前なんだから、Identificationのレベルで区切って、
命令の判別はあとの段階にまわした方が簡単になるんじゃない?
あとはまあ、フリーソフトのCOBOLの処理系なんて昔ならともかく今ならいくつもあるんだし、作らないという手も。
334:デフォルトの名無しさん
09/08/12 15:03:20
ゲームのNPCとかにスクリプトを使いたいんだけど
参考になるサイト教えて、lexとかyaccとか難しいのはいらない
335:デフォルトの名無しさん
09/08/12 15:32:59
>>334
とっつきは悪いかもしれないけど、yacc&lexを使った方が
結局は落だと思うよ。
336:デフォルトの名無しさん
09/08/12 16:35:21
>>334
オープンソースのスクリプトの処理系を組み込んだ方が普通は楽。
オレはそれにシナリオ記述用の独自形式のスクリプトと2種類用意しているが。
337:デフォルトの名無しさん
09/08/12 17:11:04
>>334
ゲームの性質(リアルタイムとかアドベンチャーとか)にもよるけど
ゼロから勉強しなきゃいけないならYaccとかbisonとかの支援受けるのは悪くないと思うよ
組み込みでスクリプトをその場解析する必要があるならLRのパーサを裸で実装したマイクロPlan(1970年代のbitの記事)とかもあるからそういうレガシーなものもいいかもしれない(これは中間コードVMとしても結構興味深い)
っというわけで334がどういうものを欲しているかによって回答が異なるのだな
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4801日前に更新/260 KB
担当:undef