「コンパイラ・スクリプトエンジン」相談室16 (649レス)
「コンパイラ・スクリプトエンジン」相談室16 http://mevius.5ch.net/test/read.cgi/tech/1405822579/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
265: 261 [sage] 2015/09/18(金) 21:16:12.07 ID:ArWsl8Ey >>262 素直にコンパイル出来ない言語を設計してるので(clispのような)、snippetの表現をx86/amd64表記にする意義が薄いんですよね。 >>263 凝り性なもので。 >>264 一応ciniiは一通り眺めたけど、中間言語の設計に関する論文って無いんですよね。 素直に「中間言語」で調べると自然言語の翻訳に使う方が大量に引っかかってつらい…… http://mevius.5ch.net/test/read.cgi/tech/1405822579/265
266: デフォルトの名無しさん [sage] 2015/09/18(金) 22:17:11.93 ID:i7DEL3du >>265 動的型付け必須系? ならErlangの論文とか資料あさるといいかも http://mevius.5ch.net/test/read.cgi/tech/1405822579/266
267: 261 [sage] 2015/09/19(土) 09:19:04.79 ID:YlOPp2hb >>266 swiftのように演算子をユーザー定義出来て、 c++のように同名異引数の関数を定義出来て、 Lispのように引数間のカンマが要らず、 Rubyのようにカッコを省ける そんな言語を設計中です。 それらの両立のために実行中に文法を書き換えて構文解析器を再構成するという手法を採ってるので、コンパイル出来ないんですよね…… clispのリードマクロを文脈依存に拡張したものだと言えば大体あってるかと。 ちょっとErlang関連の資料を見てみます。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/267
268: デフォルトの名無しさん [sage] 2015/09/19(土) 10:26:16.30 ID:7hgo9IJ4 >>267 列挙してあることはシンタックス上のことで全部コンパイル時に静的に解決出来そうに見えるけど無理なの? http://mevius.5ch.net/test/read.cgi/tech/1405822579/268
269: デフォルトの名無しさん [sage] 2015/09/19(土) 11:29:33.20 ID:I9CWDfzW >>267 コンパイル時の都合だよね? VMの設計とはなんの関係もなさげなんだけど http://mevius.5ch.net/test/read.cgi/tech/1405822579/269
270: 261 [sage] 2015/09/19(土) 12:48:32.00 ID:YlOPp2hb >>268 今考えてる言語では、演算子の扱いが関数を引数の場所に関して一般化した第一級オブジェクトなので 前置引数の個数や後置引数の個数は実行してみるまで分からないので コンパイル時の識別子を用いた構文解析は無理です。 前置演算子と一引数関数が別物って変だと思ったのでそうしました。 c++風に書くと、こんな感じのが通るイメージです。 g = [](a,b){return a - b;}; if (複雑な式) { f = [](a|b,c){return a + b + c;}; // (a|b)で前置引数としてa、後置引数としてbと示すものとする。 } else { f = [](a,b|c){return a + b + c;}; } // gは2引数演算子、fは3引数演算子。 // ここではgの優先順位はfより低いものとする(c++での表現方法が無いので)。 // カッコやカンマを省いてある場合、上の条件のどちらが走っても構文上は受理される。 // 複雑な式の結果によって、これはg(1, f(2, 3, 4))及びg(f(1, 2, 3), 4)のどちらにもなりうる。 cout << (g 1 2 f 3 4) << endl; >>269 そういうわけで一度に全部読み込んでコンパイルしてから実行するという事が出来ないので、 折角だからVMも設計しようと思った次第です。 ASTから中間言語に落とすとcontinuationの実装が楽になるので。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/270
271: デフォルトの名無しさん [] 2015/09/19(土) 13:15:38.32 ID:hJISNbn0 g 1 2 f 3 4は構文解析後にはどういうツリーになっているの? フラットなままで構文解析終えて実行時にまたプチ構文解析をするの? http://mevius.5ch.net/test/read.cgi/tech/1405822579/271
272: 261 [sage] 2015/09/19(土) 13:24:30.87 ID:YlOPp2hb >>271 字句解析でばらばらにしてLL(1)でカッコの対応等について解いた背の低い木にして、その後実行時にLR(1)で式毎に再度解析するので > フラットなままで構文解析終えて実行時にまたプチ構文解析をするの? これであってます。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/272
273: デフォルトの名無しさん [sage] 2015/09/19(土) 14:10:09.60 ID:I9CWDfzW おもしろい事かんがえてるなー ElixirとかBEAM-VMとか参考になるんじゃねぇの? http://mevius.5ch.net/test/read.cgi/tech/1405822579/273
274: 261 [sage] 2015/09/19(土) 15:18:02.65 ID:YlOPp2hb >>273 高信頼・並列分散に特化したVMのようにあちこちで言われてるみたいですね、ErlangのBEAM-VM. そう考えるとLLVMは解析容易性特化、JVMはVM自体の実装容易性特化といった所でしょうか。 VMを作るなら何かに特化させるべきなような気がしてきました。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/274
275: デフォルトの名無しさん [sage] 2015/09/20(日) 00:52:44.57 ID:m4tWKm8w 演算子に限定する意味は何だろう cout << (g 1 2 f 3 4) << endl; こんなの一見して何してるのか判らないしいっそ構文ごと第一級にすればいい そもそも実行時に構文解析機まで走らせる重い処理系って必要なのかなあ クロージャじゃあかんのかね http://mevius.5ch.net/test/read.cgi/tech/1405822579/275
276: デフォルトの名無しさん [sage] 2015/09/20(日) 09:22:45.62 ID:tHziPwGz この程度のアイデアしかないようじゃ才能ないわな http://mevius.5ch.net/test/read.cgi/tech/1405822579/276
277: 261 [sage] 2015/09/20(日) 11:27:11.87 ID:oZCwg6h7 >>275 今作ってる実装だと構文はhead, body, precedence, directionをキーとするオブジェクトの配列になってるので 構文も第一級オブジェクトのインスタンスになっています。 説明不足ですんません。 コードは現在こんな感じ。もし読みたければどうぞ。 https://gist.github.com/pixie-grasper/d07388493204a5e370a2 debug-printが多かったりコメントが少なかったりしますが…… > そもそも実行時に構文解析機まで走らせる重い処理系って必要なのかなあ 必要性については私にはまだ分かりませんが、 私は昔レキシカルスコープもクロージャもポインタも継続もマクロも無い素晴らしく酷い言語(古いBASIC)で全てを考えていたので、 その経験から、どんな機能も使い慣れると必要になってくると思っています。 >>276 私馬鹿なもんで。 いいアイデアがあったら是非とも実現してくだされ。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/277
278: デフォルトの名無しさん [sage] 2015/09/20(日) 11:30:35.69 ID:O6Xw3ijC >>275-276 俺にも意味があるようには見えないけど、俺の知らない用途があるのかもしれない とにかくわからないならスルーしとけよ http://mevius.5ch.net/test/read.cgi/tech/1405822579/278
279: デフォルトの名無しさん [sage] 2015/09/20(日) 18:18:01.68 ID:tHziPwGz >>277 絶対真似しないと約束するなら教えてもいいぞ http://mevius.5ch.net/test/read.cgi/tech/1405822579/279
280: 261 [sage] 2015/09/20(日) 18:52:58.39 ID:oZCwg6h7 >>279 じゃぁ真似せずに似たようなものを考えつくまで考え抜きます。 私馬鹿なので。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/280
281: デフォルトの名無しさん [sage] 2015/09/20(日) 20:15:16.31 ID:9UpT3677 >>274 BEAMは引数のMatchで分ける処理がVMにあるんでそういう意味でオモシロイコト -> BEAM参考になるんじゃねぇのって話です http://mevius.5ch.net/test/read.cgi/tech/1405822579/281
282: 261 [sage] 2015/09/20(日) 21:59:23.12 ID:oZCwg6h7 >>281 調べてみました。 BEAMだと実行時にモジュール名、関数名、及び引数の数を指定して呼び出す関数を同定するんですね。 実引数の数がコンパイル時には分かるから命令語に引数の数を組み込めるのだと思いますが…… 今考えてる言語だと、実引数の数が自明じゃないので使いにくい気がします。 助言、ありがとうございます。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/282
283: デフォルトの名無しさん [] 2015/09/21(月) 19:55:02.85 ID:x6IKJHaI スクリプト型の言語って実行時にコンパイル(構文解析?)が発生するから、コンパイル型の言語より遅いのですよね。 では、アプリケーションの起動時にスクリプトを読み込んだ後のパフォーマンスは、スクリプト型もコンパイル型も大差ないのでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1405822579/283
284: デフォルトの名無しさん [sage] 2015/09/21(月) 20:31:03.01 ID:XzxcjOEi 大差あります http://mevius.5ch.net/test/read.cgi/tech/1405822579/284
285: デフォルトの名無しさん [sage] 2015/09/21(月) 21:42:55.66 ID:LoRahTLC >>283 「スクリプト型の言語」やら「コンパイル」やらが何を意味してるのかにも依りますが、 よくある速度重視の構成だと、読み込み時に構文解析や意味解析、中間コード生成を終わらせて 実行時に中間コードを(1)実行可能バイナリに変換するパターンと、(2)仮想マシン上でエミュレートするパターンとの二通りがあります。 (1)の場合は変換処理そのものがそれなりに重く、 しかも高度な最適化を掛けるとそれ自体に時間が掛かってしまうので 最適化は殆ど掛けられずコンパイラ型言語の2〜3倍は遅くなりますし、 (2)の場合は1命令実行するのに命令を読み込んで比較してジャンプして、 とCPUがアナログ回路上で並列処理してる計算を逐次的に実行するのでかなり重くなります。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/285
286: デフォルトの名無しさん [sage] 2015/09/22(火) 13:12:55.44 ID:f7gaXzgp 比較にならない スクリプトは柔軟性重視なので速度を出すためのチューニングは後回しにされる 起動時にある程度最適化できるものもあるが、 最適化のために数十秒〜数分かけたりもできない また実行直前にならないと決まらない内容も多く無駄になってしまう そもそもコンパイラ型で速度重視のソフトを作る場合は 開発者自身やライブラリがメモリレイアウトなど制御し効率を考慮したコードを書く(書ける) http://mevius.5ch.net/test/read.cgi/tech/1405822579/286
287: デフォルトの名無しさん [sage] 2015/09/25(金) 18:30:15.12 ID:TpmuUHaP 自分でC言語っぽいスクリプト言語とかデータ形式作ってみたけど、どうだろ? ちなみにスクリプト言語はSC3_Compilerってのに入ってるが。 ttps://osdn.jp/users/mitubasa/pf/BuildContainer/files/ http://mevius.5ch.net/test/read.cgi/tech/1405822579/287
288: デフォルトの名無しさん [sage] 2015/09/26(土) 01:18:18.90 ID:4Rxec7m6 >>283 「スクリプト言語」の定義は難しいが、おおむね (1)(ユーザーから見て)明示的なコンパイルというフェーズを経ずに実行される (2)変数に型がない (3)実行時に行える処理の柔軟性が高い(例えば関数定義など) という特徴を持つ言語を指すことが多いだろう。RubyやPythonなど で、それぞれの特徴が、実行速度を遅くすることに貢献する。 (1)→ 最適化に時間を割けない (2)→ 実行時に、変数が指すオブジェクトの種類を調べる処理が毎回入る。 (3)→ これを実現するためにバイトコードインタプリタで実装されることが多く、遅くなる もちろん厳密な定義ではないので、あくまで「おおむね」という話。 Javascriptみたいな変態事例もあるし断定的なことは何も言えない 言葉の定義の論争は不毛 http://mevius.5ch.net/test/read.cgi/tech/1405822579/288
289: デフォルトの名無しさん [sage] 2015/09/26(土) 11:28:42.59 ID:GpPO3Mdd >>287 (一切実行せずに)サラッと眺めた感じだと 字句解析くらい生成系やライブラリ(flex++やboost::spirit等)に頼ってみたらどうかなってのはあるかな。 変数名としてnCount(整数,カウント)の代わりにixArg(添字,引数)を使うとか 細かいところは幾つかあるかも知れんけど、それなりに読みやすいと思うよ。 stdafx.cppって名前で使ってることは察したけど、VS使うんなら プロジェクト開くのに必要なファイル(.sln等)を入れるとか、 或いはMinGW/Cygwin/msys2なんかのUnix系ツールでさくっとビルドできるようにcmakeを書くとかしておくと 評価する人が増えると思うよ。 http://mevius.5ch.net/test/read.cgi/tech/1405822579/289
290: デフォルトの名無しさん [sage] 2015/10/04(日) 21:40:28.41 ID:Qeh3kLaJ おれバカで不勉強だから知らなかったえけど、最近の処理系って状態コードのお持ち帰りをしてくれるんだね 手続きAを呼んだ直後にグローバルな状態変数に何がしかの情報が入ってる(何も起きなかったとか、フックして停止させるの推奨みたいな) 面白いな〜 データを加工して返すー>関数(関数内で処理のフローに関係する記述は禁止) 処理のフローに関係するー>手続き(状態コードを標準で返す) 複数個所使うで同じ様な処理をまとめるー>サブルーチン(スタックフレームの無いローカルな手続き) プログラムを組み上げるときの構造や構成に行儀のよい作法がないと プログラムのどの時点でどのデータがどの構成や状態にあるのか把握ができなくて発狂するww で、なんでも記述できる自由度の高い処理系ほど読解困難な発狂プログラムが出来上がると http://mevius.5ch.net/test/read.cgi/tech/1405822579/290
291: デフォルトの名無しさん [sage] 2015/10/05(月) 23:32:01.45 ID:F9TK8Py4 >>290 状態コードのお持ち帰りって何? http://mevius.5ch.net/test/read.cgi/tech/1405822579/291
292: デフォルトの名無しさん [sage] 2015/10/06(火) 02:07:01.38 ID:mXRqVUnf 何を言ってるのかさっぱりワカラン… http://mevius.5ch.net/test/read.cgi/tech/1405822579/292
293: デフォルトの名無しさん [sage] 2015/10/06(火) 02:50:21.48 ID:rErEEAIK クロージャのことかな・・・ 最初Smalltalkやlispの環境のことかと思ったけど http://mevius.5ch.net/test/read.cgi/tech/1405822579/293
294: デフォルトの名無しさん [sage] 2015/10/06(火) 10:51:51.85 ID:SQrzN3D5 coroutineだったりして? http://mevius.5ch.net/test/read.cgi/tech/1405822579/294
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 355 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.014s