「コンパイラ・スクリプトエンジン」相談室16 (649レス)
「コンパイラ・スクリプトエンジン」相談室16 http://mevius.5ch.net/test/read.cgi/tech/1405822579/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
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
544: デフォルトの名無しさん [] 2016/05/01(日) 13:17:14.33 ID:tKi6j9CT 匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、 BitTorrentがオープンソースで開発されています 言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか? Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします https://twitter.com/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的に分散され、特定のサーバーに依存しません 8 http://mevius.5ch.net/test/read.cgi/tech/1405822579/544
545: デフォルトの名無しさん [sage] 2016/05/01(日) 17:25:31.50 ID:EieRhQfe スレ違いだから他所でやって http://mevius.5ch.net/test/read.cgi/tech/1405822579/545
546: デフォルトの名無しさん [sage] 2016/05/01(日) 21:43:24.13 ID:EieRhQfe バイトコードのはずだったのに気づいたら 関数オブジェクトのツリーを作ってた なにやってんだ俺・・・ http://mevius.5ch.net/test/read.cgi/tech/1405822579/546
547: デフォルトの名無しさん [] 2016/05/03(火) 02:36:10.72 ID:sSslXsw5 自作ソフトの暴走はたまにあるが、自作コンパイラの暴走はヤバイよな。 それで別のソフトを作成した日には、最悪の結果が待つことに...。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/547
548: デフォルトの名無しさん [sage] 2016/05/04(水) 02:55:51.64 ID:ug5Kipfy function(機能)はrole(役割)にしよう flowとかprocと悩んだがroleが一番良いと思う http://mevius.5ch.net/test/read.cgi/tech/1405822579/548
549: デフォルトの名無しさん [] 2016/05/04(水) 03:53:55.73 ID:INW31x/s 昔のC言語みたいに、floatとdoubleに分けるメリットは、 今の時代にはないよな? http://mevius.5ch.net/test/read.cgi/tech/1405822579/549
550: デフォルトの名無しさん [sage] 2016/05/04(水) 03:59:22.27 ID:NIqCX6OH むしろ half の出番さえ出てきてる時代。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/550
551: デフォルトの名無しさん [sage] 2016/05/04(水) 10:09:50.25 ID:wjUC1pj0 役割っていうのは受動的な考え方であり縦割り行政的でありfunctionの適切な代替表現ではない roleは与えられた仕事をただこなすだけというイメージ このとき、与えられる対象、つまりデータやオブジェクトがあり 担当個所をroleするという感じ role ≒ class であり、role ≠ function 何にも縛られず自由なfunctionとroleでは思想が違う functionは立場や部署間を飛び越えて連携して機能するイメージ 胸熱であり、自分の仕事をこなすだけのroleなどと一緒にされては困る function( a, b, c, d ); a.role( b, c, d ); http://mevius.5ch.net/test/read.cgi/tech/1405822579/551
552: デフォルトの名無しさん [sage] 2016/05/04(水) 10:16:54.82 ID:wjUC1pj0 例えば、日本は縦割り行政的であり、役人的であると言われ(role) 一方で、アメリカは横のつながりが強く、機能的だと言われる(function) このように、機能と役割は対立する概念として扱われている言葉であり、思想が違う 日本の映画やドラマなんかでよく 「それは自分の仕事じゃないのでやりません」とか 逆に「自分たちの管轄だから余所者は入ってくるな」とか 役割的発想は悪いことのように扱われるのが常 逆に主人公たちは部署間を飛び越えて機能的に行動すると決まっている http://mevius.5ch.net/test/read.cgi/tech/1405822579/552
553: デフォルトの名無しさん [sage] 2016/05/04(水) 12:07:39.94 ID:p+LvbHBp もうちょっとプログラマ的喩えにしようぜ。 procedure=大域環境に対して参照と破壊をするもの function=環境を参照せず、戻り値は引数にのみ依存するもの closure=固有の環境を持ち、その環境に対して参照と破壊をするもの どれも意味が違う。 functionとroleはクラスとインスタンスくらい意味が違うと思う。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/553
554: デフォルトの名無しさん [sage] 2016/05/04(水) 23:28:44.89 ID:wjUC1pj0 歯車でいえば 複数の歯車が上手く連携して動いている様を機能していると言うし 個々の歯車に着目してそれぞれが自分の仕事をしている様を役割をこなしているという 手続き的に時系列に沿って考えると 個々が役割を果たした結果、全体として機能がもたらされて、また別の大きな役割を担う・・・という風に 卵が先か鶏が先か、みたいなところがあって、双方の視点はどちらも重要で 同時に扱ていかなければならないわけだけど 区別して扱われる別の視点であり、function = roleとしてしまうのは単純にセンスないというか早合点 functionとroleの考え方の微妙な違いは非常に重要で 最初の出発点が違うことで資本主義と社会主義など、時としては戦争が起こる場合もある (つまりは、資本主義と社会主義は鶏が先か卵が先か、functionが先かroleがという思想の違い functionはまさに空気のようなもので、人と人をつないで機能させるお金を重視している roleはまさに人そのもの、その役割に主体を置いている) functionをroleと言ってしまうのは教養がないと言われても仕方がない 自分の思考が今何に着目していて何を考えているか把握しておかないと大変なことになる 頭がよくなりたければ囲碁が良い 囲碁は碁石そのものにも着目しなければならないし、碁石と碁石の境界にも着目しなければならない それぞれで見え方が全く変わってくるし、同時に考えなければならない 頭の体操に良い 「物」と「事」は別のものだけど、「物事」という言葉があるように同時に考えなければならないこともしばしば http://mevius.5ch.net/test/read.cgi/tech/1405822579/554
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 95 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.007s