「コンパイラ・スクリ ..
[2ch|▼Menu]
175:デフォルトの名無しさん
05/05/13 19:15:15
>>174
2ちゃんねらって、誇れるものをあまり持たない人が多いような気がします。
だから、そうなるのでしょうね。

176:デフォルトの名無しさん
05/05/13 19:36:23
結果として複雑になったのならともかく自らわざわざ複雑にしてしかもそれに見合うメリットが見当たらないのはどうかと

177:42
05/05/13 20:46:09
>>162
>Perlのlexer/parserってあんな言語でも実は綺麗なの?

最初にRubyを出したのは俺だけど、Perlを出さなかったのは、Perlは
あまりにソースが読みにくくて読むのを断念したからだ w
だから、parserがlexerにどれくらいちょっかい出してるのかも知らない。
「Rubyソースコード完全解説」に相当する日本語解説もないしね。

別にアンチRubyってわけじゃないよ。>>150だって、推測だけどたぶん
ふだんはCとかJavaとかC++とかC#とか使ってて、たまたま>>126のリンク見て
びっくり仰天なんじゃこりゃ、と思っただけだと思うよ。
なんでもかんでもアンチだの信者だのにしたがる方こそ病んでないか。

ところで、メソッド呼び出しの括弧が省略できるのは、
「引数がひとつもないとき」は明らかなメリットがあるよな。
ひとつでも引数があるのなら、括弧ぐらいつけりゃいいじゃん、と
俺は思うけど。文末のセミコロンもね。

>>174
というわけで俺はアホだから、>>47
>むしろ変数で情報を渡すよりカプセル化に有益なんでは。
>それ以後%startと整合性をとる必要を生じる

という発言の趣旨を>>52以来ずーっと教えて欲しいと思ってるんだが。

178:デフォルトの名無しさん
05/05/13 21:11:42
俺も括弧くらい付けりゃ良いじゃんと思う

文法は厳格かつ単純な方が好きだな
if-then-else の else が省略出来ないとか、四則演算に優先順位が無いとかでも問題無し

179:デフォルトの名無しさん
05/05/13 21:54:46
LISPがオススメ
究極の汎用プログラミング言語

180:デフォルトの名無しさん
05/05/13 22:00:28
もうお前ら、forth でも使ってりゃいいよw

181:デフォルトの名無しさん
05/05/13 23:32:47
括弧を省略できるってのは結構大きいよ。

>>178
単純で、四則演算に優先順位が無くてもOK

あなたにオススメの言語はHSPです。よかったね。

182:デフォルトの名無しさん
05/05/13 23:33:32
HSPは言語ではありません。
以後、HSPの話題はゲ製板で行ってください。

183:デフォルトの名無しさん
05/05/13 23:36:34
HSPに対する反応はぇぇぇぇぇぇぇぇぇ!

>>182

そんなあなたにオススメの言語はHSP3です。

コレは優先順位つくらしいよ。よかったね。

184:デフォルトの名無しさん
05/05/13 23:36:55
言語といえば、LISPりんごですよ!


185:デフォルトの名無しさん
05/05/13 23:41:33
LISP も HSP も大して変わらないよ。

ものは試しに、
LISP
↑この横棒を少し上に持ち上げてご覧

直ぐに HSP に変わるから。


186:デフォルトの名無しさん
05/05/13 23:45:57
文法の話とかしだすと宗教戦争になるから駄目だな(わら


187:デフォルトの名無しさん
05/05/14 00:16:37
評価するならヒューマンインターフェース的な評価手法を採るべきだ

188:デフォルトの名無しさん
05/05/14 06:23:37
日本語で懇切丁寧に解説してあるのを読んで「ソースコードを読んだ」と威張り、
ソースコードを読めないとコーディングの汚さのせいにし、
Rubyを読んだ程度でさも様々な言語のソースコードを読んだように振舞う42の
いるスレはここですか?


189:デフォルトの名無しさん
05/05/14 06:57:53
Rubyのソースが糞なのは、言語仕様側も少なからず影響してるからなあ・・

190:デフォルトの名無しさん
05/05/14 06:58:42
あ、すまん。
糞なのは、は言い過ぎた。
汚く見えるのは、に読み替えてね。
つい本音が出てしまった。

191:デフォルトの名無しさん
05/05/14 07:06:35
Rubyは入門者用のソースの解説本があるから、ソースを覗いた人は一番多いんじゃないかい。
悪口いいっぱはともかく、言語の規模考えても、準拠ポイントとしてはちょうどいいんじゃないか。

192:デフォルトの名無しさん
05/05/14 07:19:18
なんでわざわざ入門者用に糞ソース読む本が出たんだろうね。
本という形態だとすでにバージョン的に無意味になってる部分も多いだろうし。
Rubyの動作原理ならともかく、糞ソース読む練習に良いとか?

193:デフォルトの名無しさん
05/05/14 07:23:59
>括弧を省略できるってのは結構大きいよ。

なんつーか、ad hoc 感ブリバリで好きになれないな

194:デフォルトの名無しさん
05/05/14 07:53:49
現実問題、実用レベルに達した処理系で
「ソースが糞」じゃないプロジェクトなんてあるの?

195:デフォルトの名無しさん
05/05/14 07:55:25
>>192
> Rubyの動作原理ならともかく、糞ソース読む練習に良いとか?

あの本、能書きにはそれっぽく書いてある。だけど実際の本文は
「わかった奴が教えを垂れる」スタイルなんで、あんまり
ソースの読み方の参考というのにはならない。

前提となる知識が先に書いてあるのは別にいいんだが、何をとばして何を読む
ってのが説明の都合で決まりすぎで、ソースの読み手から見た判断という視点
じゃない。



196:デフォルトの名無しさん
05/05/14 10:40:28
>>185
ホントダw
I-I S P

197:デフォルトの名無しさん
05/05/14 10:41:29
偶然の一致がこれほど恐ろしいとは

198:42
05/05/14 12:19:46
念のため書いとくけど、Rubyのソースが全編糞とは俺は思ってないからね。
eval.cのsetjmp/longjmpの乱用と、parserとlexerがグローバル変数で
状態を共有してるのがひどいと言ってるだけ。他はまあ、普通のCソースだと思う。

>>188
>ソースコードを読めないとコーディングの汚さのせいにし、

Perlのソース読んだことあるかい?

199:42
05/05/14 12:39:23
補遺:
setjmp/longjmpの乱用についても、実行形態を考えるとやむを得ないところは
あるんだよな。
いっそバイトコードインタプリタにでもした方がよかったんじゃないかとも
思う。そうするとGCも今のコンサバGCじゃなくなって、もはや原型をとどめなく
なりそうだが。


200:デフォルトの名無しさん
05/05/14 15:42:13
プププププ このスレおもしれー。
Perlのソースコードが汚いって?
少なくともRubyが***自力で***読めてPerlが読めない理由はねえよ。
てめえのおつむが足りないってことを精一杯開陳しつつしかも自分では
認めないって、最悪じゃね?

しかもいっちょまえに批評家気取って、はーゲラゲラゲラ
しかもえらそうなくせに何言ってるかわかってなさげなトンチンカンぶりがラブリー


201:デフォルトの名無しさん
05/05/14 15:44:11
>>200
ソースは汚いと思わないが、build課程はかなりひどい物の一つだと思うぞ。


202:デフォルトの名無しさん
05/05/14 17:01:52
Perlのは暗号だからな、読む気にもならん

203:42
05/05/14 19:50:57
そもそも俺は自分はアホだと再三言ってるんだがねえ。
何がそんなに気に入らないんだか。

>少なくともRubyが***自力で***読めてPerlが読めない理由はねえよ。

へえ。

Rubyのソースが間違いなく***自力で***読める人のご意見。

URLリンク(jp.rubyist.net)
| Perl のソースコードは印象的だよね。すごい。読めない。
| マクロの嵐で、よくわからない識別子が山のように出てきて、
| いったい何? みたいな、すごい略語でさぁ。ほんとに、名前重要。]
| この識別子は、何を表しているのか、何をしようとしているのか、
| わかんないんだよ。

204:デフォルトの名無しさん
05/05/14 20:02:36
そりゃ自分で書いたコードなんだから読めるだろ。
それが論拠になると本気で思ってる? 痛い奴。


205:デフォルトの名無しさん
05/05/14 20:20:43
>>203
>>53


206:デフォルトの名無しさん
05/05/14 22:53:41
>>194
その通り!
めずらしく、いい書き込みだなw



207:デフォルトの名無しさん
05/05/14 23:33:01
だから、Perlが汚いからといってRubyが汚くないという話にはならないの
ことあるごとにPerlをもちだしてくる信者はいい加減にしろ

208:デフォルトの名無しさん
05/05/14 23:44:40
Ocamlのソースは綺麗だったよ
実用レベルなのか知らないけど

209:デフォルトの名無しさん
05/05/15 00:04:59
>>208
高速な事は事実。

210:デフォルトの名無しさん
05/05/15 01:17:27
OCamlのソースはコアのインタプリタ以外OCamlで書かれてるからね。
Cで処理系書いてる限りソースが糞になるのはやっぱり避けられないのかも?

211:デフォルトの名無しさん
05/05/15 01:22:45
LISPも、というか関数型言語は綺麗なソースが多い気がする。
それぞれの言語自身で記述する風習みたいなのがあるからかね。

212:デフォルトの名無しさん
05/05/15 02:02:08
関数型言語に限らずbootstrapしてない言語処理系なんて
表現能力のなさを露呈してるようなもんじゃないかな。
WindowsをUnixで作ってるみたいな。
SubversionのソースをCVSで管理してるみたいな。
もちろんスクリプト言語のように目指すところが違えば話は別だけど。

213:デフォルトの名無しさん
05/05/15 03:37:32
>>211
SBCL は C の部分が汚くて悶絶した

214:デフォルトの名無しさん
05/05/15 03:45:28
そうか? 普通に読めたけどなあ。SBCL。



215:デフォルトの名無しさん
05/05/15 03:59:02
読めるけど、エラー処理省いてたり、マジック文字列埋め込んでたり、バータリ的な所が
けっこうあったよ。-Wall 付けてビルドするとやたら Warning が出るし。
たまにクリーンアップのパッチが提出されてるけど、マージされてるのか疑問。

216:デフォルトの名無しさん
05/05/15 07:41:04
すれ違いですまんが、「バータリ的」って何?


217:デフォルトの名無しさん
05/05/15 07:44:34
場当たり的

218:デフォルトの名無しさん
05/05/15 08:24:59
>>217
サンクス。

人の名前かと思ったんでワケワカラン様になってた。


219:デフォルトの名無しさん
05/05/15 11:39:02
>>212
ブートストラップの意味おしえて


220:デフォルトの名無しさん
05/05/15 11:40:28
>>219
ストローストラップの弟

221:デフォルトの名無しさん
05/05/15 13:08:41
コンパイラ業界でのbootstrapは、
コンパイラが自分自身のソースをコンパイルすること。
(だよね?

222:デフォルトの名無しさん
05/05/15 13:38:45
話の流れを折ってすいませんが、
Engineering a Compiler
URLリンク(www.amazon.com)
ってどんなもんでしょうね?


223:デフォルトの名無しさん
05/05/15 14:56:04
>>222
☆☆☆☆★
初学者はドラゴンブック嫁って事になってるの?メリケンでもいまだに。ちょっと安心していい?

224:219
05/05/15 17:24:53
>>221
TNX!


225:デフォルトの名無しさん
05/05/15 17:38:46
ネタにマジレスかもしれないが、ストローストラップって誰?
ひょっとしてストラウストラップのこと?
ストローストラップって発音することがあるの?

226:デフォルトの名無しさん
05/05/15 17:44:52
アメリカ<=>イギリス

227:デフォルトの名無しさん
05/05/15 17:45:00
URLリンク(www.research.att.com)

228:デフォルトの名無しさん
05/05/15 18:05:33
ステューステュオップ

229:デフォルトの名無しさん
05/05/15 18:08:30
いい声してるなあ

230:デフォルトの名無しさん
05/05/15 18:11:32
>>228
耳腐ってんのか?



ステゥーステュオァプ

231:デフォルトの名無しさん
05/05/15 18:21:41
「C++でお勧めの本ありますか?」
「ステゥーステュオァプでも読んどけ」
「……宇宙人?」

232:デフォルトの名無しさん
05/05/19 14:36:35
練習で、生成系を使わずにCのプリコンパイラを作ろうと思っているのですが、
ソースコードの意味解析をやる必要があるかどうかが直感的にわからなくなってしまいました。
#define文は型検査をする必要はないので、いわゆる意味解析の必要ってない気もするのですが、
プリコンパイルはそれはそれで一つの言語であるので、どこかで意味解析が必要になりそうな気もします。

実際に必要なのかどうなのか、簡単な理由と共に教えてもらえないでしょうか?
どうぞよろしくお願いします。

233:232
05/05/19 15:30:19
プリコンパイラってなんだ…プリプロセッサですね…

234:デフォルトの名無しさん
05/05/19 16:26:45
なんで既存のプリプロセッサを読まないんだろう……


235:デフォルトの名無しさん
05/05/19 16:30:36
俺様と同じように言葉だけ覚えてほとんど理解できてない感じのレスだな。
そんな俺様が勘で答えてやろう。

C言語本体としての意味解析はいらない(と思う、というか構文解析もできないだろう)。
マクロ言語としての意味解析はいるかもしれない。
ただ、Cのマクロ言語は本当に簡単な言語なので、
構文解析まで通れば意味解析はほとんど何もすることが
ないかもしれない。ひょっとしたらあるかもしれない。

236:235
05/05/19 16:32:40
あ、あれ?既存のプリプロセッサを読めとか
そういうレベルの話なの?
やっぱり全然見当違いのレスしちゃったかも。
ごめん、なかったことにしてくれ。

237:232
05/05/19 17:22:08
>>234
直感ですが、cppやgccのpre-processorのコードは高速化のために最適化されていて、
私みたいな知識のない人間が追うには辛いのではないかと思っていました。
反省して読んでみることにします。

>>235
まさにそういう感じです<言葉だけ覚えてほとんど理解できてない。
理解するために簡単そうに見えるプリプロセッサを作ろうと思ったのですが、
作る前に色々と考えていたら意味解析のセクションが必要なのかどうかがわからなくなって…
とりあえず、プリプロセッサの意味規則がどんなものかを考えることが重要なのですね。

まだ紙の上で考えている状態なので、具体的にどのような構文木を出せばよいのか、
そこのところで悩んでいる途中で出た疑問でした。
わかっていない私にわかりやすく説明してくれてありがとうございました。

238:デフォルトの名無しさん
05/05/19 21:07:54
情処かどっかで
世の中のCのプリプロセッサはバグだらけ
みたいな論文を見たような気がする。

239:232
05/05/19 21:50:18
仕様はかなり細かいみたいですね<プリプロセッサ
(あくまで参考として:URLリンク(www.sra.co.jp)

240:デフォルトの名無しさん
05/05/19 22:15:21
>>232
小さいCPP(1ファイルに収まるくらいのやつ)が入ってるよ
URLリンク(www.lsi-j.co.jp)


241:デフォルトの名無しさん
05/05/20 02:20:54
このスレにはソースを読めばなんでもわかると思ってるやつしかおらんのか。

242:デフォルトの名無しさん
05/05/20 03:23:19
ソース読まない奴は無能

243:デフォルトの名無しさん
05/05/20 05:55:55
仕様書にはいつもソース読めと書いてます。
結局ソース見るのが一番早い。

244:デフォルトの名無しさん
05/05/20 09:44:15
>>243
10行くらいならね。

245:デフォルトの名無しさん
05/05/20 17:22:18
JavaやVBAのパーサを書いて見たいんですが、どっかにgrammarでも落ちていないですか?

246:デフォルトの名無しさん
05/05/20 17:44:30
Javaならあるよ。VBAは知らない。
URLリンク(java.sun.com)

247:デフォルトの名無しさん
05/05/20 18:57:23
レスサンクスです。
早速構文チェッカーでも書いてみます。
やはりC++より構文規則は見た目きれいですね。
C++の構文はどこもかしこもオプションだらけでよくJavaプログラマが汚いという意味がよくわかりました。
私もC++パーサを書いたあと、しばらくはC++でプログラムしなくなりました。

248:デフォルトの名無しさん
05/05/20 21:23:32
>>238
たぶんこれだろ。
URLリンク(lc.linux.or.jp)
URLリンク(www.ipa.go.jp)

249:デフォルトの名無しさん
05/05/20 22:49:23
>>247
その意見には激しく同意した上で、なおかつC++が最高の言語だと思う自分がいる

250:デフォルトの名無しさん
05/05/20 23:17:35
なんか、俺はプログラミングするたびに違う言語使ってる気がする。
統一したほうがいいのだろうか。

251:デフォルトの名無しさん
05/05/20 23:24:33
またScheme処理系作っちまった
やめられない

252:デフォルトの名無しさん
05/05/20 23:27:55
同じ物ばかりつくって飽きないの?

253:デフォルトの名無しさん
05/05/20 23:35:07
もうとまらねーよ

254:デフォルトの名無しさん
05/05/20 23:39:04
>>252
Scheme処理系は何個あっても困らないからねえ

255:デフォルトの名無しさん
05/05/21 00:54:16
JVMで動くCOBOLを作ってみてくれ。

256:デフォルトの名無しさん
05/05/21 00:55:17
お前ら、もっと斬新なことしてくれよ
実装なんか興味ないからさ。

257:デフォルトの名無しさん
05/05/21 01:18:36
タガログ語プログラミング言語とか。

258:デフォルトの名無しさん
05/05/21 01:33:11
>>251
公開キボンヌ

259:デフォルトの名無しさん
05/05/21 01:33:48
面白いこと=トロイ
な頭の俺をどうにかしてください


260:デフォルトの名無しさん
05/05/21 01:35:50
>>256
そんなあなたに「りんg(ry」


261:デフォルトの名無しさん
05/05/21 01:50:59
プログラムを2つ与えると、その実行結果が等価になるか判断する処理系作って。
用途は、たとえば自分でソートのプログラムを作ったけど正しいか自信が無いときに、
単純で遅いが明らかに正しいソートプログラムと比較させる。
全自動は無理だと思うから、人間が色々手伝ってもかまわない。
「入力の長さnの帰納法」とかヒントをあげると、少なくてもn=1のときは
単純にn=1が保証されるものとして最適化するだけで判定できそうな気がする。

262:デフォルトの名無しさん
05/05/21 01:54:55
>>261
どうやらスレ違いぽいな

完璧なプログラム
スレリンク(tech板)


263:デフォルトの名無しさん
05/05/21 09:35:34
>>251さん、リクエストします。
JavaScriptでScheme処理系を書いてください


264:デフォルトの名無しさん
05/05/21 10:38:57
>>261
しかも、内容が馬鹿っぽいw


265:デフォルトの名無しさん
05/05/21 10:59:05
一般的にはムリって
計算論で結論出てなかったっけ?

266:デフォルトの名無しさん
05/05/21 11:05:29
>>261
少なくとも、理論上無理。そんなことができるなら、世の中もっと幸せになってる。

267:デフォルトの名無しさん
05/05/21 11:51:13
>>251
>>263をR5RS準拠でヨロスク

268:デフォルトの名無しさん
05/05/21 14:49:33
プログラムが停止するかどうかすら判定できない、じゃなかったかなあ。

269:デフォルトの名無しさん
05/05/21 15:08:56
>>268
「有限時間内で」が大事。

270:デフォルトの名無しさん
05/05/21 15:25:18
>>261は最初から「全自動では無理」と言ってるんだが…
理論上無理とか言ってるやつは
proof assistantというものが存在することすら知らんのだろうな。
いずれにせよ>>262の言うとおりスレ違いだろう。

271:デフォルトの名無しさん
05/05/21 16:19:22
>>251
後学の為に是非公開してくださいませんか。宜しくお願いします。

272:デフォルトの名無しさん
05/05/22 00:51:20
schemeの処理系なんて、重厚長大で完璧めざしてるR5RS準拠から
読みやすさ重視orお遊びのトイプロジェクトまで、山ほどあるぞ。

273:デフォルトの名無しさん
05/05/22 07:48:12
>>271
R5RS規格書は50ページ程度と言われてるけど内容濃いしね
省かれた暗黙仕様もあるから準拠しようとすればそれなりに工数掛かる

>>267
おれが今回作ったのは継続もなくスタックベースでそもそもRxRS前提に書いてない
throwみたいに親側へ飛ぶだけだし、スタックオーバーフローもする
ちゃんとしたのは別にあるんだけど、デカくなりすぎた
そこそこの速度で動く&俺言語やアプリへの組み込みが目的だった
俺言語2k行ぐらいで最低限の最適化だけやったいい加減なやつ
速度はguile1.7.2と同じぐらい。。。guileは速度捨ててるね

274:デフォルトの名無しさん
05/05/22 08:52:51
>>273
おー、俺言語大好き人間って結構いるんだな
俺はSelf系つかprototype系好きなんで何個も作ったけど、Schemeは一度も作ったコトないや



275:デフォルトの名無しさん
05/05/22 16:33:47
俺言語への組み込みScheme?
どんなものか想像できない。

276:デフォルトの名無しさん
05/05/22 16:49:51
よくあるパターンは、scheme式をbuiltin型として使えるというものかな。
prologを組み込むと時々便利。

277:デフォルトの名無しさん
05/05/23 16:39:26
Scheme in javascriptやin rubyを作ってるんだけど、
何かの仕様に準拠しないと達成感がない。

でもRxRSの複素数とかくだらないの実装するのは面倒くさい上に、
母言語(javascriptとか)の数値表現がそのまま使えなくなって
滅多に使わないのに全体的に遅くなりそうなあげく、利便性まで下がる。

同じことで悩んだor悩んでるやついる?

278:デフォルトの名無しさん
05/05/23 18:49:26
>>277
つcoercion semantics

279:デフォルトの名無しさん
05/05/23 19:22:56
Coercin semantics?ってsubtypeに基づく変換とかのアレですよね。
Schemeに型はないんですが、soft-typingしろってことでしょうか。

誤解があったかもしれないので捕捉。
Scheme in javascriptってjavascriptで書かれたScheme実行エンジンを意図してました。
i = scheme_eval("(+ 1 2)");
みたいに実行できるようなの。これでiには普通の3が代入されるか、
自分で定義したclass SchemeNumberのインスタンスが入るか、が問題です。
前者が嬉しいけど、複素数とかの対応はどうするべきかな、と。

280:デフォルトの名無しさん
05/05/23 22:06:51
>>275
俺言語との通信やプリプロセッサの拡張とか
funclist.scm:((f 1) (g 2) (h 3))
俺言語:
#s (define func-list (with-input-from-file "funclist.scm" read))
#s(for-each (lambda(x) (puts x "() { printf(\"myname:" (car x)
"\\n\"); return " (cadr x) "; }")) func-list)
register_func() {
#s(for-each (lambda(x) (puts "scm_add_proc(\""(car x)"\", (scm_proc_t)"(car x)", 0);"
" printf(\"defined:"(car x)"\\n\");")) func-list)}
main() {
register_func();scm_write(scm_eval_string(#ss`(+ ,@(map(lambda(x)(list(car x))) func-list))));;scm_newline();}

f() { printf("myname: f \n"); return 1; }
g() { printf("myname: g \n"); return 2; }
h() { printf("myname: h \n"); return 3; }
register_func() {
scm_add_proc("f", (scm_proc_t)f, 0); printf("function defined:f\n");
scm_add_proc("g", (scm_proc_t)g, 0); printf("function defined:g\n");
scm_add_proc("h", (scm_proc_t)h, 0); printf("function defined:h\n");
}
main() {
register_func();scm_write(scm_eval_string("(+ (f) (g) (h))"));scm_newline();}

function defined:f
function defined:g
function defined:h
myname: h
myname: g
myname: f
6


281:デフォルトの名無しさん
05/05/23 22:09:36
>>279
おれだったらevalの結果をそのままwriteできるようにする。
結果が数値だけとは限らないので。
scheme_write(scheme_eval(scheme_read()));
もしくは
scheme_write(scheme_eval_string("(+ 1 2)"));
経験的に特に明示しない限りschemeならschemeの型で持ちまわる方が都合良い。


282:デフォルトの名無しさん
05/05/23 23:45:06
>>280
イラネw


283:デフォルトの名無しさん
05/05/23 23:50:14
綾本って思いっきり中田さんの授業配布プリントに
説明を加えただけにしか見えないのだが。

284:デフォルトの名無しさん
05/05/23 23:55:31
そう言われても俺には確かめようが無い

でも中田先生の教科書は(・∀・)イイ!!

285:デフォルトの名無しさん
05/05/24 00:41:48
>>281
>schemeならschemeの型で持ちまわる方が都合良い。
処理系の作成者としては当然その通りで、気持ちもわかるんだけど、
処理系のユーザとしては不便だと思うんだよね。
いちいちscheme_number_from_javascript_number(1)とかしなきゃならんのは。
どうにかならんかな、みんなどうしてるかな、って疑問でした。

286:デフォルトの名無しさん
05/05/24 02:28:26
三日ほどかけて、生まれてはじめてコンパイラを作った
900行ほどのTinyBASIC以下のダメ言語だけど
とりあえず、エラトステネスの篩が動いてる

しかし、明らかにヘボい機械語を吐いているのに
エラトステネスでVC++とほとんど実行速度に差が無い
うちのマシンがefficeonだからかなあ?
やっぱコンパイラは速いね

287:デフォルトの名無しさん
05/05/24 02:36:05
私も、インタプリタをつくり、コンパイラに拡張したことがあります。
言語つくりを学ぶとかなりプログラミングの理解度が高まることが実感できました。
少し高度だけど、プログラミングを生業にするなら、1度はチャレンジすることをお勧めします。
決して損とは思いません。

288:デフォルトの名無しさん
05/05/24 02:49:35
勉強といっても三日だし
しかも半分は、STLとVC++の使い方の勉強だった気がするw
残りはVC++のデバッガーに機械語を教えてもらってたかんじ

しかし、カウンタのインクリメントでさえpushとpopを二回ずつりながら
へぼへぼと計算するうちのヘボコンパイラと
inc eacだけで済ませそうなVC++が
ほとんど実行速度に差が無いのは解せないなあ

289:デフォルトの名無しさん
05/05/24 07:35:11
測定の仕方が悪いか、コンパイラにバグがあるか。

290:デフォルトの名無しさん
05/05/24 17:27:21
計測は、無負荷状態で、

clock_t c = clock();
Sieve();
cout << double( clock() - c ) / CLK_TCK << end;

こんなかんじ

一億までの素数を全部求めた場合の所要時間は、
efficeon 1.6GHzで、VC++が30.5秒程、へぼ言語が31.5秒程

計算結果は、VC++とへぼ言語で一緒にしかならないから
コンパイラのバグで不当に速い可能性はうすい


ちなみにへぼのカウンタ変数のインクリメントのコードは↓、我ながらひどいもんだw
mov eax, i
push eax
mov eax, i
mov eax, [eax]
push eax
mov eax,1
pop ebx
add eax,ebx
pop ebx
mov [ebx],eax

VC++は↓、まとも
mov edx, [i]
add edx, 1
mov [i], edx


291:デフォルトの名無しさん
05/05/24 19:23:34
エラトステネスのふるいだと
メモリアクセスがネックになるんじゃないかな。
伝統にのっとってfactやfibで。

292:デフォルトの名無しさん
05/05/24 19:35:32
同感.後taraiを回すとか.

どうでもいいが,>290のVCのコードでループカウンタにレジスタが割りついてないのが気になる.

293:デフォルトの名無しさん
05/05/24 19:42:20
スタックマシン向けのコード生成法っぽいな?

294:デフォルトの名無しさん
05/05/24 20:43:05
>>293
つかスタックマシンのコードをx86へ分解してるだけだと思うよ。
コードジェネレータで頭ひねらずに済むから処理系を作ってる途中では有用だろうし。



295:デフォルトの名無しさん
05/05/24 21:49:05
>>290
とりあえず mov eax, i は lea eax, i だとして、
それぞれのコードを1億回ループするのを適当に計ると

へぼ: 1613771636
VC++: 1119915436

クロック掛かる。1.6GHz に換算すると

へぼ: 1.0秒
VC++: 0.7秒

程度の違いだな。

296:デフォルトの名無しさん
05/05/24 21:50:51
>>295
失礼。 mov eax, i でよかった。

297:デフォルトの名無しさん
05/05/24 22:08:35
>>295
クロック数って そんなに正確に測れるんですか?

シミュレーション?
CPU のマニュアルから計算したやつ?

298:デフォルトの名無しさん
05/05/24 22:17:21
sieveではスカラ最適化はほとんど利かないと思う。
しかし1億で30秒は遅い気もするが…>290でループ変数が
レジスタに載ってないあたりを見ると、元ソースの問題かな。

299:デフォルトの名無しさん
05/05/24 22:29:07
>>297
発想が逆だ


300:デフォルトの名無しさん
05/05/24 22:29:21
ヘボ言語のソースがみたい。

(ふるいのソース、処理系そのもののソースじゃなくて)


301:デフォルトの名無しさん
05/05/24 22:48:54
>>300
array sieve[1000000]

i = 0
init:
sieve[i] = 1
i = i + 1
if i <= 1000000 then jump init

i = 2
loop1:
if sieve[i] = 0 then jump skip
j = i + i
loop2:
sieve[j] = 0
j = j + i
if j <= 1000000 then jump loop2
skip:
i = i + 1
if i <= 1000 then jump loop1

i = 2
fin:
primes = primes + sieve[i]
i = i + 1
if i <= 1000000 then jump fin


1000*1000; "未満の素数が"; primes; "個あります\n"


302:デフォルトの名無しさん
05/05/24 22:50:36
うわインデントが

array sieve[1000000]

i = 0
init:
 sieve[i] = 1
 i = i + 1
if i <= 1000000 then jump init

i = 2
loop1:
 if sieve[i] = 0 then jump skip
  j = i + i
  loop2:
   sieve[j] = 0
   j = j + i
  if j <= 1000000 then jump loop2
 skip:
 i = i + 1
if i <= 1000 then jump loop1

i = 2
fin:
 primes = primes + sieve[i]
 i = i + 1
if i <= 1000000 then jump fin


1000*1000; "未満の素数が"; primes; "個あります\n"


303:デフォルトの名無しさん
05/05/24 22:58:42
どうでもいいが、primesが初期化されてないような希ガス。
初出の変数は0?

304:デフォルトの名無しさん
05/05/24 23:01:49
うす

labelに使われてない変数は初出時に0

305:デフォルトの名無しさん
05/05/25 01:00:41
あれかね、今時のCPUはx86のコードを内部的にRISCな命令に変換したりするから
(efficeonならなおさらだ)、その段階でスタック操作がレジスタに割り当てられて、
内部的には似たようなコードで実行されてたりするのかね。

だとしたらすげー。

306:デフォルトの名無しさん
05/05/25 01:39:20
いま、Athlon XPで試したら
速度全くといっていいほど変わらない
信じられない
Pen4ではどうなるのか知りたいなあ

307:デフォルトの名無しさん
05/05/25 12:07:51
factやfibでも同じような速度なの?
だとしたらマイクロオペコードすげー。

308:デフォルトの名無しさん
05/05/25 15:48:09
いや、関数呼び出しは実装してないんで
ローカル変数実装するのが、(ちょっとだけ)面倒だから
まじめに比較したい人がいるなら、ソース出すけど

309:デフォルトの名無しさん
05/05/25 18:38:40
普通に1から1億までを足すプログラムとかで十分差がでると思うが。

310:デフォルトの名無しさん
05/05/25 18:40:29
最適化しないと変わらないんじゃない?

311:300
05/05/26 00:06:05
>>302
ソースTNX!
へぼ言語どころか、めっちゃ気に入りそう(ハート)

あんた、センスあるねぇ。。。


312:デフォルトの名無しさん
05/05/26 02:47:24
i = 1
r = 1
fact:
 r = r * i
 i = i + 1
if i <= 1000000 then jump fact
"1000000! = "; r; "\n"

多倍長じゃないとか気にするな。
ただのベンチマークだから。

313:デフォルトの名無しさん
05/05/26 03:31:29
めんどくさいから、誰かやって
もう飽きたし・・・
URLリンク(rerere.sytes.net)

314:デフォルトの名無しさん
05/05/26 19:17:26
>>305
んなわけない
sieveみたいな2重ループ程度じゃ適当に作っても差はあんま出ない
>>313見た限りでは関数作れないっぽいけど
同じやり方でループのネスト深くしたり、fiboとかアッカーマン関数で
比較したりすると倍以上差が出てくるよ
VMとかインタプリタに比べれば問題ない差だろうけどね


315:デフォルトの名無しさん
05/05/26 22:17:47
>>314
ヤッターマン関数って何?
ぐぐっても出てこんかったorz


316:デフォルトの名無しさん
05/05/26 22:32:08
>>315
アッカーマン関数でもヤッターマン関数でも出てくるけど?

317:デフォルトの名無しさん
05/05/26 22:54:33
ポチっとな

318:デフォルトの名無しさん
05/05/27 00:20:48
Fibonacciの関数呼び出し程度では大した差はでない
Ackermannはコンパイラが末尾再帰を認識するかどうかでかなり差が出るはず
普通の処理でも変数の数や間接参照とかが増えてくれば違ってくる

319:デフォルトの名無しさん
05/05/27 01:08:54
Borland C++ Conpilerについての質問です

c:\bcc32\Bin の中に

bcc32.cfgを作って
-I"c:\Bcc32\include"
-L"c:\Bcc32\lib"
と書きます

ILINK32.cfgを作って
-I"c:\Bcc32\include"
-L"c:\bcc32\lib"
と書きます

URLリンク(www.kumei.ne.jp)
ここのソースをコピペしてコンパイルします
bcc32 -W menu01.cpp のほうはうまく行きました
brc32 menu01.rc menu01.exe って入力しても、windous.hが見つからないとエラーでます
brc32 -i c:\bcc32\include menu01.rc menu01.exe とディレクトリを指定してやったらコンパイルできました

このようにディレクトリを指定せずにコンパイルさせる設定ってどこでするのでしょうか?

320:デフォルトの名無しさん
05/05/27 02:13:26
【初心者歓迎】C/C++室 Ver.17【環境依存OK】
スレリンク(tech板)

321:デフォルトの名無しさん
05/05/27 02:39:07
>Fibonacciの関数呼び出し程度では大した差はでない
これどういう意味?

322:デフォルトの名無しさん
05/05/27 05:46:16
fibでも関数値のメモ化のあるなしで大きく違ってきそうだが。

323:remi@id5214.bbs.盗撮倶楽部
05/05/27 14:32:00
はじめまして れみです。

向こうのbbsで質問したところ、こちらで聞いたほうがより高度な技法を
教えていただけると紹介いただき、まかりこしました。

のぞき穴最適化技法についてお知恵をお借りできませんか。
尚、使用レンズ口径は3.00mmです
よろしくお願いします


324:デフォルトの名無しさん
05/05/27 15:09:36
そのレンズを通して見える範囲でソースコードを手でチューニングすればいいです。
見える範囲が終わったら視野を移動するかスクロールします。
ファイルの最後までいったらおしまいです。お疲れ様でした。



325:デフォルトの名無しさん
05/05/27 18:52:21
どういう誤爆だ?
業者にしてはまったく意味が無い。
誰かAIのテストでもしてるのか?

326:デフォルトの名無しさん
05/05/27 18:54:35
スコープについて聞いてるんじゃないか?

327:デフォルトの名無しさん
05/05/27 18:57:13
うまい

328:デフォルトの名無しさん
05/05/27 19:04:44
>>322
すまんが、そういう話じゃない
関数呼び出しのテストにしても変数が1個や2個の値参照程度では
違いは出にくいということ

メモ化すれば当然速くなる

329:デフォルトの名無しさん
05/05/27 20:24:00
ackermann関数は変数が何個の値参照なん?

330:デフォルトの名無しさん
05/05/27 20:50:02
mann個

331:デフォルトの名無しさん
05/05/27 20:52:11
>>329
lispの例題とかで見たこと無い?
ものすげーえげつない再帰呼び出しのテストだと思ってくれ。

332:デフォルトの名無しさん
05/05/27 21:35:57
>>331
すまんが、そういう話じゃない
関数呼び出しのテストにしても変数が1個や2個の値参照程度では
違いは出にくいということ

333:デフォルトの名無しさん
05/05/27 21:41:48
こんな感じ?

extern yattarman(){
printf("アフォ\n");
}


334:デフォルトの名無しさん
05/05/27 21:50:56
ack(m,n) = n+1            if m = 0
       ack(m-1, 1)       if n = 0
       ack(m-1, ack(m,n-1))  otherwise

335:デフォルトの名無しさん
05/05/27 21:53:10
>>334
すまんが、そういう話じゃない
関数呼び出しのテストにしても変数が1個や2個の値参照程度では
違いは出にくいということ

336:デフォルトの名無しさん
05/05/27 22:06:19
ここはお前の話をみんなで静聴するスレじゃないぞ。
各人がしたいように話を転がしていくだけだ。

337:デフォルトの名無しさん
05/05/27 22:08:15
仕切り厨の自己否定乙ww


338:デフォルトの名無しさん
05/05/28 00:28:16
>>337
すまんが、そういう話じゃない
関数呼び出しのテストにしても変数が1個や2個の値参照程度では
違いは出にくいということ

339:デフォルトの名無しさん
05/05/28 03:12:13
>>333
そう、それだ!


340:デフォルトの名無しさん
05/05/28 04:15:37
>>333
extern coffee(){ 
printf("ボケ\n"); 
} 

extern lighter(){ 
printf("ゴルァ\n"); 
} 


341:デフォルトの名無しさん
05/05/28 23:34:48
アメ、コーヒー、ライター?


342:デフォルトの名無しさん
05/05/29 01:10:17
ヤッターマン

343:デフォルトの名無しさん
05/06/04 04:52:17
そろそろN88BASIC作ろうと思うんだけど、どう?

344:デフォルトの名無しさん
05/06/04 12:18:56
N05BASICの誤りでは?
どんな畑になることやらw


345:デフォルトの名無しさん
05/06/04 21:04:29
>>344
???

346:デフォルトの名無しさん
05/06/04 21:16:13
>>345
しぃーっ!見ちゃだめ!

347:デフォルトの名無しさん
05/06/04 22:01:33
bison -v で出力される *.output と言うファイルの書式の解説って
マニュアルには含まれてないと思うのですが、ありますか?


348:デフォルトの名無しさん
05/06/04 22:05:10
>>347
人が見て理解できれば十分だと思うけど……


*.output ファイル自体をいじるとか、そういうことを考えているの?

349:デフォルトの名無しさん
05/06/04 22:34:23
>>348

state 100
nls -> '\n' . (rule 200)

とかあった場合、この点(.)は何を意味するものなの?


350:デフォルトの名無しさん
05/06/05 00:02:52
オライリーの本読め。解説してあったと思うが。

なくてもそれくらい見当つかないんじゃ困るとは思う。


351:デフォルトの名無しさん
05/06/05 00:12:32
lex&yacc でイイデツカ?


352:デフォルトの名無しさん
05/06/05 00:22:29
うん。


353:デフォルトの名無しさん
05/06/05 03:26:05
>>344
それ以前に2000年問題に対応してください

354:デフォルトの名無しさん
05/06/05 03:35:03
>>344==353

355:デフォルトの名無しさん
05/06/05 11:17:47
>>349
LALR(1)

356:351
05/06/05 18:39:22
>>352
ありがとう。

>>355
LALR(1) の標準記法とかあるのですか?


357:デフォルトの名無しさん
05/06/05 18:47:49
>>356
標準かどうかしらんが
LALR(1)を勉強した人なら一瞬で分かる。

358:デフォルトの名無しさん
05/06/05 19:46:23
>>353
畑は1年単位のサイクルの筈。


359:デフォルトの名無しさん
05/06/05 23:06:16
>>344==353==358

360:デフォルトの名無しさん
05/06/06 08:56:20
並列化コンパイラを作ることになったんですが、
なにをどうすればいいかわかりません
良い本、サイトなどあれば教えてください

361:デフォルトの名無しさん
05/06/06 09:14:01
TAに泣きつけ。

362:デフォルトの名無しさん
05/06/06 10:51:43
並列化のための補助文法を言語的に持っているという意味?
それとも複数の演算素子にコードを割り振る方?


363:360
05/06/06 17:05:12
そもそもコンパイラそのものがわかっていないので
1から勉強できるようなものがあると助かるとです

364:デフォルトの名無しさん
05/06/06 18:37:44
360は早稲田の学生

365:デフォルトの名無しさん
05/06/06 19:54:03
>>363
まずは、りんご畑系の本を勧める。


366:360
05/06/07 02:28:10
>>364
駅弁です

>>365
リンゴ畑とは?

367:デフォルトの名無しさん
05/06/07 23:42:17
予約語と識別子との区別を、字句解析時に行ってしまうのがいいのか、構文解析時になってから行うのがいいのか悩んでいます。
字句解析時に行ったほうがわかりやすいような気もするけど、構文解析時に行ったほうが柔軟になるし(予約語と同じ名前のメソッド名を定義できるとか)。
みなさんはどうしてますか。

368:デフォルトの名無しさん
05/06/07 23:52:07
作ろうとしている言語の文法を合うように
決めればいいんじゃない?

つまんない意見でごめんな

369:デフォルトの名無しさん
05/06/07 23:59:39
ほぼ同意。

ps.りんご畑だとパーサだったかな?


370:デフォルトの名無しさん
05/06/08 00:12:20
typo
×文法を合うように
○文法に合うように


371:デフォルトの名無しさん
05/06/08 01:10:48
>>367
>予約語と同じ名前のメソッド名を定義できるとか

そもそもこんなことができると紛らわしいからよした方が…
ワインバーグが「プログラミングの心理学」のどっかにそんなことを書いていたはず。


372:デフォルトの名無しさん
05/06/08 01:17:01
>>371
古い概念にとらわれるな


373:デフォルトの名無しさん
05/06/08 10:02:30
>>372
歴史に学べ

374:デフォルトの名無しさん
05/06/08 10:04:01
>>367
ifという名前のローカル変数を作ってしまってif文が使えない
とかいうことになるので、字句解析でやっといた方がいいんじゃないかな。

375:デフォルトの名無しさん
05/06/08 10:41:04
素人な質問だけど、構文解析どう書くの?
IDENT expr IDENT block IDENT block
で$1と$3と$5がそれぞれ"if" "then" "else"であることを
アクションでチェック?現実に実現可能なもの?

376:デフォルトの名無しさん
05/06/08 12:25:52
構文木を識別子以外のものに基づいて組み立てれば無問題。括弧とか。



377:デフォルトの名無しさん
05/06/08 12:26:47
>>360
育男ちゃんに代打ちしてもらえばいいじゃん

378:デフォルトの名無しさん
05/06/08 13:08:32
文法の、どこに error を噛ませれば良いのか分からんですたい

379:デフォルトの名無しさん
05/06/08 13:39:49
エラーが発生したらなかったことにしたい単位のところ。
全てが式の言語なら式。Cみたいのなら文か関数。
例外処理のcatchのようなもんだ。


380:デフォルトの名無しさん
05/06/08 20:52:34
それよりも的確な場所でエラーを検出することができるかどうかだよ

極端な言語で言えば、LISP系はソースコードの何行目でエラーが出た、
とかの検出が困難。
S式として妥当ならreadが通ってしまう。
readに通した時点で行の情報は失われる。

よく知らないけどLISPのエラー検出の最小単位って関数かな?
エラー検出とかのためにリストがどの行のものか保存するLISP処理系ってある?


381:デフォルトの名無しさん
05/06/08 20:56:29
VCのコンパイラって/Pオプションでプリプロセッサを通した結果がとりだせるじゃないですか
bccではそのようなコンパイルオプションってないですか?

382:367
05/06/08 21:04:00
ご回答いただいた皆様、どうもありがとうございます。
そもそもの動機は、事前にすべての予約語を予測することができない(あとで必ず新しい予約語を追加したくなる)ので、
せめて識別子がくることが明確にわかっている場所でなら、予約語でも識別子として使えるようにしておけば、
新しい予約語を追加したときに、多少なりとも影響を小さくできるかなと思ったからです。
また個人的には「switch」や「end」をメソッド名として使えたらなーと思うことがあったので、メソッド名であることが明らかなら
予約語でもメソッド名にできるようにしたかったのです。(Rubyだとそれができるみたい)

しかーし、発想をかえまして、予約語になんらかのプレフィックスをつけることにしました。
PHPやPerlでは、変数名と予約語がかぶらないように変数名のほうにプレフィックスをつけますが、
それとは逆に予約語にプレフィックスをつければ、変数名やメソッド名とかぶらなくてすむんじゃないかと。
ifやwhileにプレフィックスをつける言語なんてきわものっぽいですが、なんか気に入ったのでこれでいくことにします。

スレ汚しすみませんでした。

383:デフォルトの名無しさん
05/06/08 21:06:52
>>379
いや、俺が気になるのは、それが全てのエラーを正しく捕まえてくれるのかと、無限ループが起きないかどうかです
……多分、yyerrok の挙動の理解が甘いような気がするんだけど

根元に error を仕込みたいですけど、エラーリカバリ後のゴミが結構引っかかります orz

384:デフォルトの名無しさん
05/06/08 21:54:44
もれが気になるのは、ねーちゃんのケータイかどうかってことだ。


385:デフォルトの名無しさん
05/06/08 21:59:44
>>384
どっからそういう話になるんだ?
誤爆?


386:デフォルトの名無しさん
05/06/08 22:12:00
URLリンク(www.sidhe.org)
Parrotの実装について

387:デフォルトの名無しさん
05/06/08 23:24:31
予約語と識別子の区別はなんとでもなると思うが、
後から追加した予約語の文法定義はどうやって追加するの?
ってあたりが気になった。

388:デフォルトの名無しさん
05/06/09 20:22:41
>>380
gaucheとか、エラー時に行番号を表示してくれるから何かやってるんじゃない?


389:デフォルトの名無しさん
05/06/09 23:54:13
>>380
>>388
構文木のノード毎に、行数を覚えておけば済むでしょ


390:デフォルトの名無しさん
05/06/10 00:05:29
>>389
(´,_ゝ`)プッ

391:デフォルトの名無しさん
05/06/10 00:49:48
gaucheってランタイムエラーのときも行数表示するん?

392:デフォルトの名無しさん
05/06/10 00:50:19
  「人権擁護法案」を知って下さい。どう考えるかは 貴方次第です。

法務省 第154回国会(常会)提出主要法律案 人権擁護法(案)
URLリンク(www.moj.go.jp)

ズームイン朝でおなじみ、 辛坊治郎さんのコラムです。
URLリンク(shinsho.shueisha.co.jp)

こちらは櫻井よしこさんのコラムです。
URLリンク(blog.yoshiko-sakurai.jp)

櫻井よしこ 人権擁護法案緊急リポ(SAPIO 6月22日号6月8日発売)
URLリンク(www.uplo.net)
URLリンク(www.uplo.net)
URLリンク(www.uplo.net)
URLリンク(www.uplo.net)

他にもこのような方々が危険性を危惧しています。
西尾幹二
URLリンク(nitiroku-nishio.jp)
西村幸祐
URLリンク(nishimura-voice.seesaa.net)

タックルと報道2001とチャンネル桜の動画。
URLリンク(nur.ath.cx)


参考資料 国連の勧告といわれる物

国内機構の地位に関する原則(パリ原則)
URLリンク(www.moj.go.jp)



次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5114日前に更新/221 KB
担当:undef