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

265
(1): 261 2015/09/18(金)21:16 ID:ArWsl8Ey(1) AAS
>>262
素直にコンパイル出来ない言語を設計してるので(clispのような)、snippetの表現をx86/amd64表記にする意義が薄いんですよね。

>>263
凝り性なもので。

>>264
一応ciniiは一通り眺めたけど、中間言語の設計に関する論文って無いんですよね。
素直に「中間言語」で調べると自然言語の翻訳に使う方が大量に引っかかってつらい……
266
(1): 2015/09/18(金)22:17 ID:i7DEL3du(1) AAS
>>265
動的型付け必須系?
ならErlangの論文とか資料あさるといいかも
267
(2): 261 2015/09/19(土)09:19 ID:YlOPp2hb(1/4) AAS
>>266
swiftのように演算子をユーザー定義出来て、
c++のように同名異引数の関数を定義出来て、
Lispのように引数間のカンマが要らず、
Rubyのようにカッコを省ける
そんな言語を設計中です。

それらの両立のために実行中に文法を書き換えて構文解析器を再構成するという手法を採ってるので、コンパイル出来ないんですよね……
clispのリードマクロを文脈依存に拡張したものだと言えば大体あってるかと。

ちょっとErlang関連の資料を見てみます。
268
(1): 2015/09/19(土)10:26 ID:7hgo9IJ4(1) AAS
>>267
列挙してあることはシンタックス上のことで全部コンパイル時に静的に解決出来そうに見えるけど無理なの?
269
(1): 2015/09/19(土)11:29 ID:I9CWDfzW(1/2) AAS
>>267
コンパイル時の都合だよね?
VMの設計とはなんの関係もなさげなんだけど
270: 261 2015/09/19(土)12:48 ID:YlOPp2hb(2/4) AAS
>>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の実装が楽になるので。
271
(1): 2015/09/19(土)13:15 ID:hJISNbn0(1) AAS
g 1 2 f 3 4は構文解析後にはどういうツリーになっているの?
フラットなままで構文解析終えて実行時にまたプチ構文解析をするの?
272: 261 2015/09/19(土)13:24 ID:YlOPp2hb(3/4) AAS
>>271
字句解析でばらばらにしてLL(1)でカッコの対応等について解いた背の低い木にして、その後実行時にLR(1)で式毎に再度解析するので
> フラットなままで構文解析終えて実行時にまたプチ構文解析をするの?
これであってます。
273
(1): 2015/09/19(土)14:10 ID:I9CWDfzW(2/2) AAS
おもしろい事かんがえてるなー
ElixirとかBEAM-VMとか参考になるんじゃねぇの?
274
(1): 261 2015/09/19(土)15:18 ID:YlOPp2hb(4/4) AAS
>>273
高信頼・並列分散に特化したVMのようにあちこちで言われてるみたいですね、ErlangのBEAM-VM.
そう考えるとLLVMは解析容易性特化、JVMはVM自体の実装容易性特化といった所でしょうか。

VMを作るなら何かに特化させるべきなような気がしてきました。
275
(2): 2015/09/20(日)00:52 ID:m4tWKm8w(1) AAS
演算子に限定する意味は何だろう
cout << (g 1 2 f 3 4) << endl;
こんなの一見して何してるのか判らないしいっそ構文ごと第一級にすればいい
そもそも実行時に構文解析機まで走らせる重い処理系って必要なのかなあ
クロージャじゃあかんのかね
276
(2): 2015/09/20(日)09:22 ID:tHziPwGz(1/2) AAS
この程度のアイデアしかないようじゃ才能ないわな
277
(1): 261 2015/09/20(日)11:27 ID:oZCwg6h7(1/3) AAS
>>275
今作ってる実装だと構文はhead, body, precedence, directionをキーとするオブジェクトの配列になってるので
構文も第一級オブジェクトのインスタンスになっています。
説明不足ですんません。
コードは現在こんな感じ。もし読みたければどうぞ。
外部リンク:gist.github.com
debug-printが多かったりコメントが少なかったりしますが……

> そもそも実行時に構文解析機まで走らせる重い処理系って必要なのかなあ
必要性については私にはまだ分かりませんが、
私は昔レキシカルスコープもクロージャもポインタも継続もマクロも無い素晴らしく酷い言語(古いBASIC)で全てを考えていたので、
その経験から、どんな機能も使い慣れると必要になってくると思っています。

>>276
私馬鹿なもんで。
いいアイデアがあったら是非とも実現してくだされ。
278: 2015/09/20(日)11:30 ID:O6Xw3ijC(1) AAS
>>275-276
俺にも意味があるようには見えないけど、俺の知らない用途があるのかもしれない
とにかくわからないならスルーしとけよ
279
(1): 2015/09/20(日)18:18 ID:tHziPwGz(2/2) AAS
>>277
絶対真似しないと約束するなら教えてもいいぞ
280: 261 2015/09/20(日)18:52 ID:oZCwg6h7(2/3) AAS
>>279
じゃぁ真似せずに似たようなものを考えつくまで考え抜きます。
私馬鹿なので。
281
(1): 2015/09/20(日)20:15 ID:9UpT3677(1) AAS
>>274
BEAMは引数のMatchで分ける処理がVMにあるんでそういう意味でオモシロイコト -> BEAM参考になるんじゃねぇのって話です
282: 261 2015/09/20(日)21:59 ID:oZCwg6h7(3/3) AAS
>>281
調べてみました。

BEAMだと実行時にモジュール名、関数名、及び引数の数を指定して呼び出す関数を同定するんですね。
実引数の数がコンパイル時には分かるから命令語に引数の数を組み込めるのだと思いますが……
今考えてる言語だと、実引数の数が自明じゃないので使いにくい気がします。

助言、ありがとうございます。
283
(2): 2015/09/21(月)19:55 ID:x6IKJHaI(1) AAS
スクリプト型の言語って実行時にコンパイル(構文解析?)が発生するから、コンパイル型の言語より遅いのですよね。

では、アプリケーションの起動時にスクリプトを読み込んだ後のパフォーマンスは、スクリプト型もコンパイル型も大差ないのでしょうか?
284: 2015/09/21(月)20:31 ID:XzxcjOEi(1) AAS
大差あります
285: 2015/09/21(月)21:42 ID:LoRahTLC(1) AAS
>>283
「スクリプト型の言語」やら「コンパイル」やらが何を意味してるのかにも依りますが、
よくある速度重視の構成だと、読み込み時に構文解析や意味解析、中間コード生成を終わらせて
実行時に中間コードを(1)実行可能バイナリに変換するパターンと、(2)仮想マシン上でエミュレートするパターンとの二通りがあります。

(1)の場合は変換処理そのものがそれなりに重く、
しかも高度な最適化を掛けるとそれ自体に時間が掛かってしまうので
最適化は殆ど掛けられずコンパイラ型言語の2〜3倍は遅くなりますし、
(2)の場合は1命令実行するのに命令を読み込んで比較してジャンプして、
とCPUがアナログ回路上で並列処理してる計算を逐次的に実行するのでかなり重くなります。
286: 2015/09/22(火)13:12 ID:f7gaXzgp(1) AAS
比較にならない

スクリプトは柔軟性重視なので速度を出すためのチューニングは後回しにされる

起動時にある程度最適化できるものもあるが、
最適化のために数十秒〜数分かけたりもできない
また実行直前にならないと決まらない内容も多く無駄になってしまう

そもそもコンパイラ型で速度重視のソフトを作る場合は
開発者自身やライブラリがメモリレイアウトなど制御し効率を考慮したコードを書く(書ける)
287
(1): 2015/09/25(金)18:30 ID:TpmuUHaP(1) AAS
自分でC言語っぽいスクリプト言語とかデータ形式作ってみたけど、どうだろ?
ちなみにスクリプト言語はSC3_Compilerってのに入ってるが。
外部リンク:osdn.jp
288: 2015/09/26(土)01:18 ID:4Rxec7m6(1) AAS
>>283
「スクリプト言語」の定義は難しいが、おおむね
(1)(ユーザーから見て)明示的なコンパイルというフェーズを経ずに実行される
(2)変数に型がない
(3)実行時に行える処理の柔軟性が高い(例えば関数定義など)
という特徴を持つ言語を指すことが多いだろう。RubyやPythonなど

で、それぞれの特徴が、実行速度を遅くすることに貢献する。
(1)→ 最適化に時間を割けない
(2)→ 実行時に、変数が指すオブジェクトの種類を調べる処理が毎回入る。
(3)→ これを実現するためにバイトコードインタプリタで実装されることが多く、遅くなる

もちろん厳密な定義ではないので、あくまで「おおむね」という話。
Javascriptみたいな変態事例もあるし断定的なことは何も言えない
言葉の定義の論争は不毛
289: 2015/09/26(土)11:28 ID:GpPO3Mdd(1) AAS
>>287
(一切実行せずに)サラッと眺めた感じだと
字句解析くらい生成系やライブラリ(flex++やboost::spirit等)に頼ってみたらどうかなってのはあるかな。

変数名としてnCount(整数,カウント)の代わりにixArg(添字,引数)を使うとか
細かいところは幾つかあるかも知れんけど、それなりに読みやすいと思うよ。

stdafx.cppって名前で使ってることは察したけど、VS使うんなら
プロジェクト開くのに必要なファイル(.sln等)を入れるとか、
或いはMinGW/Cygwin/msys2なんかのUnix系ツールでさくっとビルドできるようにcmakeを書くとかしておくと
評価する人が増えると思うよ。
290
(1): 2015/10/04(日)21:40 ID:Qeh3kLaJ(1) AAS
おれバカで不勉強だから知らなかったえけど、最近の処理系って状態コードのお持ち帰りをしてくれるんだね
手続きAを呼んだ直後にグローバルな状態変数に何がしかの情報が入ってる(何も起きなかったとか、フックして停止させるの推奨みたいな)

面白いな〜
データを加工して返すー>関数(関数内で処理のフローに関係する記述は禁止)
処理のフローに関係するー>手続き(状態コードを標準で返す)
複数個所使うで同じ様な処理をまとめるー>サブルーチン(スタックフレームの無いローカルな手続き)

プログラムを組み上げるときの構造や構成に行儀のよい作法がないと
プログラムのどの時点でどのデータがどの構成や状態にあるのか把握ができなくて発狂するww

で、なんでも記述できる自由度の高い処理系ほど読解困難な発狂プログラムが出来上がると
291: 2015/10/05(月)23:32 ID:F9TK8Py4(1) AAS
>>290
状態コードのお持ち帰りって何?
292: 2015/10/06(火)02:07 ID:mXRqVUnf(1) AAS
何を言ってるのかさっぱりワカラン…
293: 2015/10/06(火)02:50 ID:rErEEAIK(1) AAS
クロージャのことかな・・・
最初Smalltalkやlispの環境のことかと思ったけど
294: 2015/10/06(火)10:51 ID:SQrzN3D5(1) AAS
coroutineだったりして?
1-
あと 355 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.036s