「コンパイラ・スクリプトエンジン」相談室16 (649レス)
1-

521: 2016/04/27(水)23:38 ID:Toh8P/+A(2/2) AAS
手書きパーサー製作も残すは四則演算&関数呼び出しとなったが
ツリーの形状はこんな感じで良いのだろうか?
外部リンク:pastebin.mozilla.org

>>519
本よむところから始めるのはしんどいのでな・・・
522: 2016/04/28(木)00:23 ID:mWNt94gr(1/2) AAS
関数呼び出しだとこれでいけそう
外部リンク:pastebin.mozilla.org

小さな計算でもツリーが深くなってnew()するノードの数がもりもり増えるけど
何かもっと良い方法あったら教えてちょ
523
(1): 2016/04/28(木)12:59 ID:Jc879At1(1/4) AAS
手書きパーサなら
木構造にせずに操車場アルゴリズムかその亜種でLL(1)するのも手だぞ。

文法と文をそれぞれ入力したらテーブル作ってLR(1)するクラスを作るって手もあるけど
大真面目に書いてc++で500行〜1000行くらいにはなったと思う。
524: 2016/04/28(木)14:16 ID:7cooGRk/(1) AAS
lexとyaccは、既存のものを使うべきか、自作すべきか、悩ましいね。
525: 2016/04/28(木)15:44 ID:Jc879At1(2/4) AAS
yaccは、やる気と暇があるなら
どういう文法なら曖昧性が無いか、とか、shift/reduce conflictとdangling elseとは何か、とか
いろんな事についてよく理解できるようになるって点で一度試しに書いてみる事をお勧めしたい
今までに俺が余暇でC実装した名の付いたアルゴリズムの内だとかなり難しい部類に入るけどな。

lexは文法全く固まってないなら使ったらどう?って程度じゃない?
割と簡単に使えるけど、同じくらいとは言わないものの簡単に自作できるし
ASCII範囲の文字は簡単に指定できるけどUnicodeなんかに対応する為にカスタムコードを挟むなら普通に全部組んだほうが楽な事もあるし。
526: 2016/04/28(木)15:46 ID:Jc879At1(3/4) AAS
個人的にはPEGが気になるのですよー
527: 2016/04/28(木)18:30 ID:FI1Tv7gT(1) AAS
コンパイラを作るはずがコンパイラジェネレーター作りがメインになってしまう不思議
528: 2016/04/28(木)18:36 ID:Jc879At1(4/4) AAS
そして思うのだ

コンパイラジェネレータを書くのに向いてる言語とは・・・・・・
529: 2016/04/28(木)22:17 ID:mWNt94gr(2/2) AAS
>>523
そうだな。ここだけツリーにしないで、再帰関数で直接出力すれば良さそうだ
530: 2016/04/29(金)05:30 ID:o23yQzXI(1/3) AAS
バイトコードのテキストを読み込んだら
バイトコードの1行と対の関係になる命令ノードを
行数だけ配列にして上から順に実行するイメージであってる?

なんか構文木のまま実行するのと大して変わらない気がするけど
メモリの節約とかどうなんだろう
531
(2): 2016/04/29(金)10:04 ID:GdtJdaFL(1) AAS
バイトコードのテキストってのが若干意味不明だが
バイトコードならアセンブル(バイナリ化)しておかないか普通

a = b + c * d
を二分木のASTで
(st (ldptr local[0]) (add (ld local[1]) (mul (ld local[2]) (ld local[3]))))
みたいに格納して、ポインタ1つあたり64 bits、ノード構造体のサイズが24 bytesと仮定して
glibc mallocを使うことを仮定して全部で32 bytes * 7 = 224 bytesのヒープを消費する。

一方でレジスタ型VMを仮定して、簡単の為に1命令32 bits固定長とすると、例えば
ldptr r0, local[0] / ld r1, local[1] / ld r2, local[2] / ld r3, local[3] /
mul r4, r2, r3 / add r5, r1, r4 / st r0, r5
の7命令で与式が表現できるから、
配列の中身の長さが2^nに拡大されて予約される事を仮定すると4 bytes * 8 = 32 bytes
これに配列の管理領域が2ワード16 bytes、
glibc mallocを使うことを仮定すると2箇所の領域の管理で2ワード16 bytes必要で
合計で64 bytesのヒープを消費する。

ただ、配列には配列の問題点と言うかでっかい領域を再確保するのが難しい事があるから
文単位ではリストや木を、式単位では配列を使うってのがインタプリタとしては良いんじゃないかなとは思う。
532: 2016/04/29(金)13:14 ID:mG1yRheY(1) AAS
コンパイラ作りって、インタプリタよりも、10倍の労力がかかるよな。
533
(1): 2016/04/29(金)15:48 ID:qwAEwLKu(1) AAS
この辺はlispやschemeで思索しながらやると楽なんだよ
534: 2016/04/29(金)17:57 ID:ZvoRtCQG(1) AAS
コード生成の方は関数型の基礎だけでもやってないとかえって遠回りに
535: 2016/04/29(金)20:10 ID:YATvpu7C(1) AAS
>>533
最終的になんで苦労してまで構文木をSchemeで生成するんだろう?っておもって結局そのままLispのMacroに化けるのである(割とマジで)
Lisperが他の言語取得者のタメにDSLを組むことはあってもLisperはLispのママ扱う方がよかったりするのよね。
536: 2016/04/29(金)21:15 ID:o23yQzXI(2/3) AAS
>>531
ありがたい。メモリが4倍くらい節約できるのね
もしかしたら構文木のまま動かした方が動的ロードで
面白いことが簡単に実現できるんじゃないかと迷ってたけど(evalとか)
パフォーマンスではバイトコードがかなり強力なのね
537: 2016/04/29(金)23:41 ID:o23yQzXI(3/3) AAS
>>531
>バイトコードならアセンブル(バイナリ化)しておかないか普通
たしかに普通は読み込み速度的にバイナリデータが望ましいのだけど、
手さぐりで試作するからメモ帳で読み書きできるテキスト形式でやってみるんだ
538
(2): 2016/04/30(土)01:17 ID:oV2mml7H(1) AAS
lispインタプリタって一番簡単な実装(pure lisp?)だと何行くらいで実装できる?
539: 2016/04/30(土)07:15 ID:wSqWni75(1/2) AAS
>>538
基本関数だけならものすごい小さいよ
Lispが生まれた時代のマシンのメモリ量なんてアドレスのビット数が16以下だし。
540: 2016/04/30(土)10:02 ID:oKKjAnDv(1) AAS
>>538
何で実装するかにも依る

swiftやrubyだと100行オーダーで書けるらしい
外部リンク:xavier.hateblo.jp

C実装だと2000行くらいみたい
外部リンク:github.com
541: 2016/04/30(土)16:03 ID:ASEjigO2(1) AAS
行というかWin32で20KByteコアのそこそこ速いScheme処理系はCで作ったな
何行だったかは忘れたが数千行にはなる
ライブラリやフレームワークにどこまで対応するかだと毎回思う
542
(1): 2016/04/30(土)17:51 ID:iJVuG7iJ(1) AAS
自作コンパイラでソフト作ろうとすると、やたらコアを吐くことに...。
543: 2016/04/30(土)19:28 ID:wSqWni75(2/2) AAS
>>542
selfビルド可能になれば普通じゃ無いの?>>core吐かせてバイナリ生成
544: 2016/05/01(日)13:17 ID:tKi6j9CT(1) AAS
匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています

言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?

Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
Twitterリンク:Lyrise_al

ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw

The Covenant Project
概要

Covenantは、純粋P2Pのファイル共有ソフトです

目的

インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します

特徴

Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)

接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません

545: 2016/05/01(日)17:25 ID:EieRhQfe(1/2) AAS
スレ違いだから他所でやって
546: 2016/05/01(日)21:43 ID:EieRhQfe(2/2) AAS
バイトコードのはずだったのに気づいたら
関数オブジェクトのツリーを作ってた
なにやってんだ俺・・・
547: 2016/05/03(火)02:36 ID:sSslXsw5(1) AAS
自作ソフトの暴走はたまにあるが、自作コンパイラの暴走はヤバイよな。
それで別のソフトを作成した日には、最悪の結果が待つことに...。
548: 2016/05/04(水)02:55 ID:ug5Kipfy(1/2) AAS
function(機能)はrole(役割)にしよう
flowとかprocと悩んだがroleが一番良いと思う
549: 2016/05/04(水)03:53 ID:INW31x/s(1) AAS
昔のC言語みたいに、floatとdoubleに分けるメリットは、
今の時代にはないよな?
550: 2016/05/04(水)03:59 ID:NIqCX6OH(1) AAS
むしろ half の出番さえ出てきてる時代。
1-
あと 99 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.022s