「コンパイラ・スクリプトエンジン」相談室16 (649レス)
「コンパイラ・スクリプトエンジン」相談室16 http://mevius.5ch.net/test/read.cgi/tech/1405822579/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
514: デフォルトの名無しさん [] 2016/04/25(月) 10:50:38.19 ID:9hQeUDgV しかし秀丸には、CやWindows APIの命令が、多数というか、 かなり含まれている感じだが。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/514
515: デフォルトの名無しさん [] 2016/04/25(月) 17:05:01.77 ID:lstHaTya だからなんだよって感じだが。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/515
516: デフォルトの名無しさん [sage] 2016/04/25(月) 17:27:42.97 ID:ouB2BnTZ そのまま車輪の再発明をしてしまうと 元の秀丸を使った方が便利だから 自作スクリプトを秀丸と差別化する必要はある http://mevius.5ch.net/test/read.cgi/tech/1405822579/516
517: デフォルトの名無しさん [] 2016/04/26(火) 03:16:17.88 ID:r83feNEN そうか。秀丸に存在しない命令を考えなければならないな。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/517
518: デフォルトの名無しさん [] 2016/04/27(水) 00:31:37.93 ID:Toh8P/+A 相変わらず手書きパーサー書いてるが、できるだけ1発でパースしつつ(LR法?) 外側から順に何度も段階分けながらパースする(LL法?)なコードも混じってる… 意味解析までたどり着くまでで力尽きそうw http://mevius.5ch.net/test/read.cgi/tech/1405822579/518
519: デフォルトの名無しさん [sage] 2016/04/27(水) 06:02:05.40 ID:vmi3tpS2 よほどの理由がないなら手書きなんかやめといた方が Bison GLR 使ってた時は不自由さがなくてよかった semantic predicate 機能は成熟しただろうか http://mevius.5ch.net/test/read.cgi/tech/1405822579/519
520: デフォルトの名無しさん [sage] 2016/04/27(水) 07:02:50.92 ID:h/kgFFlp 趣味でやってるんだろ ほっといてやれや http://mevius.5ch.net/test/read.cgi/tech/1405822579/520
521: デフォルトの名無しさん [] 2016/04/27(水) 23:38:58.25 ID:Toh8P/+A 手書きパーサー製作も残すは四則演算&関数呼び出しとなったが ツリーの形状はこんな感じで良いのだろうか? https://pastebin.mozilla.org/8868990 >>519 本よむところから始めるのはしんどいのでな・・・ http://mevius.5ch.net/test/read.cgi/tech/1405822579/521
522: デフォルトの名無しさん [] 2016/04/28(木) 00:23:38.80 ID:mWNt94gr 関数呼び出しだとこれでいけそう https://pastebin.mozilla.org/8868995 小さな計算でもツリーが深くなってnew()するノードの数がもりもり増えるけど 何かもっと良い方法あったら教えてちょ http://mevius.5ch.net/test/read.cgi/tech/1405822579/522
523: デフォルトの名無しさん [sage] 2016/04/28(木) 12:59:47.77 ID:Jc879At1 手書きパーサなら 木構造にせずに操車場アルゴリズムかその亜種でLL(1)するのも手だぞ。 文法と文をそれぞれ入力したらテーブル作ってLR(1)するクラスを作るって手もあるけど 大真面目に書いてc++で500行〜1000行くらいにはなったと思う。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/523
524: デフォルトの名無しさん [] 2016/04/28(木) 14:16:09.66 ID:7cooGRk/ lexとyaccは、既存のものを使うべきか、自作すべきか、悩ましいね。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/524
525: デフォルトの名無しさん [sage] 2016/04/28(木) 15:44:59.86 ID:Jc879At1 yaccは、やる気と暇があるなら どういう文法なら曖昧性が無いか、とか、shift/reduce conflictとdangling elseとは何か、とか いろんな事についてよく理解できるようになるって点で一度試しに書いてみる事をお勧めしたい 今までに俺が余暇でC実装した名の付いたアルゴリズムの内だとかなり難しい部類に入るけどな。 lexは文法全く固まってないなら使ったらどう?って程度じゃない? 割と簡単に使えるけど、同じくらいとは言わないものの簡単に自作できるし ASCII範囲の文字は簡単に指定できるけどUnicodeなんかに対応する為にカスタムコードを挟むなら普通に全部組んだほうが楽な事もあるし。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/525
526: デフォルトの名無しさん [sage] 2016/04/28(木) 15:46:10.30 ID:Jc879At1 個人的にはPEGが気になるのですよー http://mevius.5ch.net/test/read.cgi/tech/1405822579/526
527: デフォルトの名無しさん [sage] 2016/04/28(木) 18:30:43.97 ID:FI1Tv7gT コンパイラを作るはずがコンパイラジェネレーター作りがメインになってしまう不思議 http://mevius.5ch.net/test/read.cgi/tech/1405822579/527
528: デフォルトの名無しさん [sage] 2016/04/28(木) 18:36:57.28 ID:Jc879At1 そして思うのだ コンパイラジェネレータを書くのに向いてる言語とは・・・・・・ http://mevius.5ch.net/test/read.cgi/tech/1405822579/528
529: デフォルトの名無しさん [sage] 2016/04/28(木) 22:17:59.57 ID:mWNt94gr >>523 そうだな。ここだけツリーにしないで、再帰関数で直接出力すれば良さそうだ http://mevius.5ch.net/test/read.cgi/tech/1405822579/529
530: デフォルトの名無しさん [] 2016/04/29(金) 05:30:33.58 ID:o23yQzXI バイトコードのテキストを読み込んだら バイトコードの1行と対の関係になる命令ノードを 行数だけ配列にして上から順に実行するイメージであってる? なんか構文木のまま実行するのと大して変わらない気がするけど メモリの節約とかどうなんだろう http://mevius.5ch.net/test/read.cgi/tech/1405822579/530
531: デフォルトの名無しさん [sage] 2016/04/29(金) 10:04:10.82 ID:GdtJdaFL バイトコードのテキストってのが若干意味不明だが バイトコードならアセンブル(バイナリ化)しておかないか普通 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のヒープを消費する。 ただ、配列には配列の問題点と言うかでっかい領域を再確保するのが難しい事があるから 文単位ではリストや木を、式単位では配列を使うってのがインタプリタとしては良いんじゃないかなとは思う。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/531
532: デフォルトの名無しさん [] 2016/04/29(金) 13:14:44.61 ID:mG1yRheY コンパイラ作りって、インタプリタよりも、10倍の労力がかかるよな。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/532
533: デフォルトの名無しさん [sage] 2016/04/29(金) 15:48:32.50 ID:qwAEwLKu この辺はlispやschemeで思索しながらやると楽なんだよ http://mevius.5ch.net/test/read.cgi/tech/1405822579/533
534: デフォルトの名無しさん [sage] 2016/04/29(金) 17:57:56.98 ID:ZvoRtCQG コード生成の方は関数型の基礎だけでもやってないとかえって遠回りに http://mevius.5ch.net/test/read.cgi/tech/1405822579/534
535: デフォルトの名無しさん [sage] 2016/04/29(金) 20:10:00.50 ID:YATvpu7C >>533 最終的になんで苦労してまで構文木をSchemeで生成するんだろう?っておもって結局そのままLispのMacroに化けるのである(割とマジで) Lisperが他の言語取得者のタメにDSLを組むことはあってもLisperはLispのママ扱う方がよかったりするのよね。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/535
536: デフォルトの名無しさん [] 2016/04/29(金) 21:15:38.47 ID:o23yQzXI >>531 ありがたい。メモリが4倍くらい節約できるのね もしかしたら構文木のまま動かした方が動的ロードで 面白いことが簡単に実現できるんじゃないかと迷ってたけど(evalとか) パフォーマンスではバイトコードがかなり強力なのね http://mevius.5ch.net/test/read.cgi/tech/1405822579/536
537: デフォルトの名無しさん [] 2016/04/29(金) 23:41:20.66 ID:o23yQzXI >>531 >バイトコードならアセンブル(バイナリ化)しておかないか普通 たしかに普通は読み込み速度的にバイナリデータが望ましいのだけど、 手さぐりで試作するからメモ帳で読み書きできるテキスト形式でやってみるんだ http://mevius.5ch.net/test/read.cgi/tech/1405822579/537
538: デフォルトの名無しさん [sage] 2016/04/30(土) 01:17:44.44 ID:oV2mml7H lispインタプリタって一番簡単な実装(pure lisp?)だと何行くらいで実装できる? http://mevius.5ch.net/test/read.cgi/tech/1405822579/538
539: デフォルトの名無しさん [sage] 2016/04/30(土) 07:15:19.54 ID:wSqWni75 >>538 基本関数だけならものすごい小さいよ Lispが生まれた時代のマシンのメモリ量なんてアドレスのビット数が16以下だし。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/539
540: デフォルトの名無しさん [sage] 2016/04/30(土) 10:02:54.88 ID:oKKjAnDv >>538 何で実装するかにも依る swiftやrubyだと100行オーダーで書けるらしい http://xavier.hateblo.jp/entry/2014/08/19/003609 C実装だと2000行くらいみたい https://github.com/kototama/kml http://mevius.5ch.net/test/read.cgi/tech/1405822579/540
541: デフォルトの名無しさん [sage] 2016/04/30(土) 16:03:06.15 ID:ASEjigO2 行というかWin32で20KByteコアのそこそこ速いScheme処理系はCで作ったな 何行だったかは忘れたが数千行にはなる ライブラリやフレームワークにどこまで対応するかだと毎回思う http://mevius.5ch.net/test/read.cgi/tech/1405822579/541
542: デフォルトの名無しさん [] 2016/04/30(土) 17:51:48.40 ID:iJVuG7iJ 自作コンパイラでソフト作ろうとすると、やたらコアを吐くことに...。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/542
543: デフォルトの名無しさん [sage] 2016/04/30(土) 19:28:20.97 ID:wSqWni75 >>542 selfビルド可能になれば普通じゃ無いの?>>core吐かせてバイナリ生成 http://mevius.5ch.net/test/read.cgi/tech/1405822579/543
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 106 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.012s