「コンパイラ・スクリプトエンジン」相談室16

2014/07/20(日) 11:16:19.37ID:p6eMVAxc
プログラミング言語処理系の開発に興味のある人達のスレッドです。
字句解析・構文解析から,データフロー解析,ループ並列化,データ分散,SSA変換,
CPS変換,レジスタ割付,命令スケジューリング,ソフトウェアパイプライン,
SIMD命令生成,VLIW向けクラスタリング,スクラッチメモリ向け最適化,リンク時最適化,
JIT,動的バイナリ変換等の各種最適化,それにVM,GC,低消費電力化などなど。
意味論に関する話題も歓迎です。

Wikiのまとめページ
http://www6.atwiki.jp/compilerandscriptengine/
201デフォルトの名無しさん
垢版 |
2015/02/24(火) 11:35:18.85ID:wemgVVUb
ドラゴンブックのどの節か書こうとしたけど本が見つからない...
とりあえず、ここのp.10から。
http://dragonbook.stanford.edu/lecture-notes/Stanford-CS143/20-Optimization.pdf
2015/02/24(火) 17:44:49.00ID:H95vOz7j
>>199
そのテーブルに式を入れるときその式が不変かどうかを判断する部分でわからなくなってくる

>>200
ほとんど読んでないドラゴンブック見たら最適化部分についても書いてるな
これ読むの辛いな
頑張って読んで出直すか
203デフォルトの名無しさん
垢版 |
2015/02/24(火) 17:53:23.22ID:avE+zAm1
多分ちゃんと読んだ方がかえって早い。

共通部分式A,Bがあって、例えばBの方の除去をやると、
Bの到達性がAの到達性にも付与される。
このことは他の属性に影響を及ぼしうる。
よってもう一度計算をしないとより正確な属性を求められない。
以下ループ。
よって収束するまで繰り返すことになる。
2015/02/24(火) 18:04:39.54ID:H95vOz7j
変化がなくなるまで最適化処理を繰り返すのはわかった
2015/02/24(火) 19:26:42.04ID:wUDy2moe
>>197
コンパイル時間がか?
2015/02/24(火) 20:45:40.84ID:UGr8Bbp/
__declspecとか__attribute__などをパースできないと正確な構造体型のサイズ
を求めることができない。しかしattribute周りの文法がメチャクチャやなあ。
2015/03/03(火) 01:05:04.60ID:t6l1EelO
次は"typed value"の扱いだな。定数にも型がある。型付きの値を
扱えなければ、正確な定数値を求めることはできない。
2015/03/03(火) 04:49:45.03ID:ZU1MaIS8
最適化なんてイラナイよね、何処まで処理系に依存する気なんだよw
2015/03/08(日) 14:52:45.39ID:u8r5MR2m
初心者だがHSPって凄いね
自分でHSPみたいなの作ろうとすると途端につまづくw
内部でメッセージハンドルに登録していく言語だと思うんだけど
こんなにwinを感じさせない文法でwinと親和性高く作れるとは
2015/03/08(日) 17:15:18.44ID:8c6PRT7L
ランタイムの機能の量で躓くならともかくあの文法でつまづくなら>>1で概要把握して本読めば
211デフォルトの名無しさん
垢版 |
2015/03/09(月) 14:52:03.75ID:MIZIuI1f
文法とOSに何の関係が?
2015/03/09(月) 16:12:25.65ID:J8WIpDef
いただきジャンガリアンに辛酸をなめさせられたのだろうよ
2015/03/09(月) 17:25:40.74ID:VM1FVYaf
うーん初心者だから言い方わかんないんだけど
コマンドプロンプトのスクリプトってコマンドに従って単に実行していくだけだよね
でもwinだと実行されるのは素直に考えるとメッセージが来たとき
cでウインアプリつくるときはメッセージ毎に処理を書くけど上から順に読むスクリプトは
それはできないわけだからどう整合性取るのかなってことで悩んでた

結局メッセージ毎にリストがあってコマンドを読んだらそのリストに関数ポインタ名で追加、
メッセージ毎に呼ばれる関数はその種別のリストを上から順に実行していく
こんな感じで作ったけどこれでいいのかな
214デフォルトの名無しさん
垢版 |
2015/03/12(木) 21:28:48.21ID:BlO2EFmA
そりゃ文法じゃなくて実行モデルだな。
イベント駆動ってことでしょ。
215デフォルトの名無しさん
垢版 |
2015/04/13(月) 21:09:38.60ID:qtTodoaL
「Cのコンパイラなら何日かかけて作っても良いが、C++は、一人で
作るのは嫌だ。文法をきちんとカバーするのに日数がかかりすぎるから」
と言われたよ。
2015/04/22(水) 02:22:50.19ID:eOWj6Ffd
javaに近い構文の言語をつくろうとしてるんだけど、
ようやくchar配列に変換したソースから関数の外側を構文解析できた。

山括弧<>、文字列リテラル、コメントに気をつけつつ、
なんとか関数の中を無視してクラス・変数・関数の名前や型名を取得して
関数の中身にとりかかるところ。

関数の中身は丸括弧()が難関になりそう。
AAAA bbbb = ((HHHH)cccc.dddd.eeee(ffff.gggg(), jjjj)).iiii();
bbbb.kkkk = -10/(8-3)-9/-3
217デフォルトの名無しさん
垢版 |
2015/04/22(水) 20:33:48.48ID:rBARkljm
>>216
まるで違う言語に見えてしまうのだが。
2015/04/22(水) 21:30:55.14ID:eOWj6Ffd
>>217
最初はクラス名、メンバ変数、メンバ関数を全部調べてからじゃないと
関数の中身に取り掛かれないと思ってた。

でもクラス名・変数名・関数名に区別は不要で、記号をヒントに階層を分解して、
それから型名の存在の有無・整合性を調べるという風にフェーズを分けれそう。

でも()が演算の優先順位、型キャスト、メソッド...どれに使われているのか
区別できるかは不安。for文とかは最初に予約語が入るからやりやすそうだけど。

Person person = ((Factory)group.cache.getFactory(provider.getResource(), url)).create();
person.id = -10/(8-3)-9/-3;
2015/04/22(水) 22:59:19.66ID:LKLiXgla
いまいち分からないけど、識別子の次にあったら関数呼び出しで
それ以外は式とかでいけないの
2015/04/22(水) 23:28:51.38ID:eOWj6Ffd
いけるか分からない。とりあえずやってみるってところ
2015/04/23(木) 08:14:58.39ID:+O6VWDUu
>>219
構文次第
てか、普通識別子に続くカッコを見て初めて関数/メソッドってわかるわけだし
2015/04/27(月) 01:02:40.49ID:RiYFohCl
メソッドの中が上手くいかんというか何から始めたら良いのか分からん
コンパイル速度が遅くなるけど、分解フェーズを何層にも分けて
何度もループで調べていけば良いのかな
2015/04/27(月) 06:59:39.15ID:EFAP6joI
コンパイラの教科書の一冊でも読んで構文解析を勉強してみ
2015/04/27(月) 09:38:16.26ID:ZDDsb7dY
C系のクソみたいな構文ルールをそのまま真似てどうすんの
自作なら作りやすいようにキーワード追加すればいいのよ

キャスト式にキーワード付けなかったのは最大の誤りの一つ
225デフォルトの名無しさん
垢版 |
2015/04/27(月) 09:56:10.90ID:qDIHhHi0
SSA形式からスタックマシンのコード生成の最適化みたいなのに参考になる文献ってないかな?
2015/04/27(月) 14:22:00.53ID:RiYFohCl
>>224
そうだね。HaxeとかFlashからぱくって、C形式のキャストは無くしてみるわ
int i = cast Integer ( 0.005f );
int i = 0.005f as Integer;
227デフォルトの名無しさん
垢版 |
2015/04/28(火) 18:20:14.24ID:PlNb5vya
最終的に何を目指そうかしら

1)LLVMで動かす 
→ 超難しそう

2)Luaのように組み込みスクリプトとして動かす 
→ 重そう。メモリ管理は全部ウィークポインタで良いのかな
(C/C++組み込みならnew&deleteするようなスクリプトでも良さそう)

3)JavaScriptなどに変換 
→ たぶん例外のバックトレースとかを変換するデバッグ環境が必須
228片山博文MZ ◆T6xkBnTXz7B0
垢版 |
2015/05/05(火) 23:02:55.34ID:p1RbtT4Y
コンパイラーの品質保証は、数学で証明する時代だ!!!
Coqと数学でコンパイラーが作れる!!!
http://compcert.inria.fr/compcert-C.html
2015/05/09(土) 18:57:31.49ID:SYpntI8c
バイトコードインタプリタつくっているんだけど
スタックマシンのコンパイラについて
パラメータスタック(データスタック)はヒープ上におくべき?
それともネイティブの領域におくべき?
2015/05/09(土) 19:41:52.28ID:SYpntI8c
>>229
訂正
コンパイラー>仮想機械
2015/05/09(土) 20:41:51.08ID:DhZyBtDK
>>230
ネイティブスタックにデータも置くって事だよね?
データスタックは分けておいた方がイロイロ楽だったので列挙
たしかこんなの

GC使う様な実装の時の仕分け
実行パスがJITでコンパイルコードと非コンパイルVMコードの行ったり来たりするとき
例外のスタックトレース(これもJIT時のアレコレあり)
チープマシンにVM仕込むときアセンブラで書くのが楽しい

最後はちげぇけど
2015/05/09(土) 21:02:43.06ID:SYpntI8c
>>231
自分のVMは典型的なスタックマシンで
パラメータスタック(データスタック)とコールスタックは別です。
そのうちデータスタックをヒープ内におくか
アセンブリでかかれたほうのネイティブの領域におくかってことです。
ネイティブ領域においたほうが実際のアドレスとVM上でのアドレスの変換がないので
速度としては速いのですが
欠点としてバイトコードからスタックを参照することができません
焦点とてしてはそもそもバイトコードからスタックを参照することがあるのかということで、
基本的になければネイティブ領域におこうかとおもっています
これまでつくった経験がないので設計としてどちらがよいかわからずお聞きしました
2015/05/10(日) 09:31:50.02ID:ZQGgJB6p
>>232
> 焦点とてしてはそもそもバイトコードからスタックを参照することがあるのかということで、
バイトコードの設計は終わってるんじゃないのか?
バイトコードの設計終わってりゃ参照の必要があるかどうかはわかってるだろうし、バイトコードの設計終わってないのに VM の構成考えてるならお前が終わってる
2015/05/10(日) 09:50:11.77ID:YKkUWNQO
>>233
その通りわ
出直して来ます
235デフォルトの名無しさん
垢版 |
2015/05/19(火) 18:50:21.34ID:a+aajTcz
番兵の文字は
utf-8でも16でも32でも-1でいいんですか?
2015/06/24(水) 17:14:03.39ID:ZsIPeucp
動的型付けってLLVMだとどうやって実装するんだろ
2015/07/10(金) 19:59:28.32ID:h+kJ9m+3
構文解析+Cに変換して内部でgcc呼んでコンパイルするプログラムはコンパイラって呼んでいいの?
2015/07/10(金) 20:11:15.28ID:tLjH7MQJ
トランスレータじゃねえの
2015/07/11(土) 08:23:11.34ID:SvdcMd32
>>238
変換したCコードを出すならトランスレーターだけどバイナリまで出すならコンパイラーでいいだろ
2015/07/28(火) 03:30:13.81ID:92wk7rzR
果たして文法を仮想化できるか
2015/08/19(水) 08:24:37.58ID:zh/OeKTd
凄いこと発見したんだけれどもΛの記号は上の尖がったところがルートで
下の二つの棒が辺を表しているんだな
242デフォルトの名無しさん
垢版 |
2015/08/19(水) 22:05:03.04ID:caRlC37E
言語非依存の仮想マシンっていうアイデアがいまいち大成功していないように見えるのって
なんか理由があるのかな。
2015/08/19(水) 22:59:51.18ID:7Z0FzJPx
落ちてたllvmスレを立て直した

【最速へ】LowLevelVirtualMachine 2【LLVM】
http://peace.2ch.net/test/read.cgi/tech/1439992758/
2015/08/19(水) 23:17:16.98ID:ynuNSl9L
>>242
めちゃくちゃ成功してまんがな。LLVM,clang知らないの?
2015/08/20(木) 00:06:05.42ID:BI1Ot8hx
>>244
実際に成功していても成功していないよ・う・に・見・え・るって話じゃないの?
XCodeのコンパイラがllvm,clangだってのは開発者にしか見えないしclangの話だけ聞いているとgccが組み込み機のCPUに対応してたころみたいに派手に活躍してるとは感じられないって事じゃ無いの?
2015/08/20(木) 04:55:31.33ID:uOqBPetd
たぶん外国には、CASL2のような仮想アセンブラを使う、
情報処理試験が無いのだろう

2人の大学生が作ったLLVMに、Appleが飛びついた。
それで、Lattner はAppleに就職した
2015/08/20(木) 11:06:47.70ID:XXXu8/KU
良く言えば新世代の輝き
悪く言えば発展途上の不安定さ
さらに組み込みで言えばカバー範囲の幅広さは犠牲にされがち

将来性でメシが食えるのはごく一部
2015/08/20(木) 11:31:12.43ID:WmW0wMbd
痛い文章だ
2015/08/24(月) 00:47:20.35ID:OjRQ25eS
マルチメソッドを効率よく実装するにはどのようにすればよいですか?
2015/08/24(月) 01:10:40.39ID:YG1kZeuQ
マルチメソッドって何?
2015/08/24(月) 01:36:14.61ID:OjRQ25eS
OOPの最も基本的な機能です
引数によって、メソッドが切り替わります
多態といいます
2015/08/24(月) 02:01:55.26ID:YG1kZeuQ
オーバーロードのことですか?
ではマングリング
2015/08/24(月) 02:21:03.16ID:OjRQ25eS
マルチメソッドはオーバーロードでは無いです
一般にオーバーロードは静的ですが、
マルチメソッドは動的です
2015/08/24(月) 08:00:36.10ID:WVPITNbu
>>251
> 引数によって、メソッドが切り替わります
はい?
2015/08/24(月) 08:19:25.57ID:jJXNOMmM
clojureのdefmultiみたいな奴じゃないの?
2015/08/24(月) 11:49:46.23ID:BYoao/vR
多重ディスパッチのニッチな要求に応えるものか
それとも単純な動的バインディングだけの問題なのか
2015/08/26(水) 18:36:02.43ID:XR0u/yGZ
マルチメソッドはC++相談室を検索すればなんなのかがわかる
2015/08/30(日) 17:45:45.69ID:bYlp1Mb/
>>249
パターンマッチを効率よく行う
259デフォルトの名無しさん
垢版 |
2015/08/30(日) 19:15:42.50ID:nhXJHOe7
型を連想配列やトライ木で管理すればO(1)
2015/08/30(日) 20:08:17.93ID:brcjELIg
>>259
clojureはソレだね
261デフォルトの名無しさん
垢版 |
2015/09/17(木) 12:38:19.48ID:mHCGeegj
中間言語の設計に関するノウハウとかアンチパターンとかが書かれた本誰か知ってる?
LLVMとかP-codeとかJava VMとか、あるいはKnuthのMIX/MMIXみたいな機械語に近いレベルの言語を
ソフトウェア実装すること前提に設計する場合について知りたい。

今言語設計してて、そろそろ構文解析できそうだから学んでおきたいんだけど。
2015/09/17(木) 19:56:34.99ID:7ftMaB4B
最初はネイティブに落とした方がいいぞ
中間言語とか遠回りしてたらアホみたいだぞ
2015/09/18(金) 15:07:01.58ID:QAQ6VXx0
そんな物他人に教わるくらいならおとなしく既存のを使っとけ
2015/09/18(金) 20:35:24.73ID:F4ynHS7Z
本として出して需要あるか?もしかしたらサーベイ論文なら探せばあるかも
265261
垢版 |
2015/09/18(金) 21:16:12.07ID:ArWsl8Ey
>>262
素直にコンパイル出来ない言語を設計してるので(clispのような)、snippetの表現をx86/amd64表記にする意義が薄いんですよね。

>>263
凝り性なもので。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

で、なんでも記述できる自由度の高い処理系ほど読解困難な発狂プログラムが出来上がると
2015/10/05(月) 23:32:01.45ID:F9TK8Py4
>>290
状態コードのお持ち帰りって何?
2015/10/06(火) 02:07:01.38ID:mXRqVUnf
何を言ってるのかさっぱりワカラン…
2015/10/06(火) 02:50:21.48ID:rErEEAIK
クロージャのことかな・・・
最初Smalltalkやlispの環境のことかと思ったけど
2015/10/06(火) 10:51:51.85ID:SQrzN3D5
coroutineだったりして?
2015/10/06(火) 13:56:11.40ID:6X8NqiS5
継続じゃないの
俺は気持ち悪いとしか思わんけど
2015/10/06(火) 14:17:39.64ID:ztjfyQaD
なんでも記述できる自由度の高い言語ほど……
2015/10/06(火) 22:40:32.31ID:KmJ2byjS
(PEEK/POKEで)なんでも記述できる自由度の高いBASIC言語はいかがですかー
2015/10/07(水) 11:46:38.15ID:YlJ45J+b
文字通りステートコードの事じゃね?
Unixが何十年も前に確立してるけど

# make && make install
2015/10/11(日) 09:14:44.03ID:yW9ExgL4
なんか意味不明なこと書いてすいません

ステートコードで正しいと思います。
バカ正直に戻り値だけと思い込んでいたので

さっき、vs2013のc++起動して、構成プロパティでx64とアセンブラコードの出力に設定して
c++の入門書を買うか悩むこと5分
lispの実装でググって15分
考えるのやめて現実逃避中orz

一番自由度の高いのはアセンブラ(当たり前だけど)
ただし、全て自己責任(自由度が高い=自己責任ですよ〜)

なんか、適当なスクリプト言語が作れないかなと
2015/10/11(日) 16:02:56.87ID:e7nwHPrn
>>299
「自由度」の定義は何?確かに「そのマシンで出来ることがなんでも記述できる」ならアセンブリほぼ一択だけど、
例えば「その言語のプリミティブと同等な機能を作れる」ならCommon Lispは自由度が高いし(マクロ最高!)、
或いは「その言語のプリミティブの機能を別な機能に変更出来る」ならTeXは自由度が高いよね(TeXの\endプリミティブが、なんとLaTeXでは違う機能に置き換わってる)。
例えば「その言語の文法を変えられる」って意味ならswiftやprologなんかは自由度が高い例になるだろうし、
仮にそれらの意味であればアセンブリ言語なんて自由度の欠片もない言語の一つになるよ。


適当なスクリプト言語が作りたいならHQ9+かbrainfuckか何かを作ればいいと思うよ
という冗談はさておき、そのスクリプト言語で何をやりたいかによって色々変わってくるよね。

テキスト処理ならgrepやsed、awkやperlなんかは参考になるだろうし、
統計処理や数式処理なんかはRやmathematicaが有名所かな。
読みやすさ重視ならある意味ではCOBOLやBASICが、別な意味ではpythonやrubyが「読みやすさ」を重視した言語として有名だし
とにかく簡単な文法にしたいならlispやpostscriptなんかが興味深い例ではある。

特殊用途向けの言語が作りたいか、汎用的な言語が作りたいか
汎用的な言語であれば手続き型か関数型か論理型か、関数や型はファーストクラスオブジェクトか、どんな文法か。
特殊用途向けの言語であればどんな用途で使うのか。
ノベルゲーム制作の補助向け(NScripter/吉里吉里等)なのか、文法記述用(regex/LR/PEG等)なのか、画像や構造を記述するもの(svg/postscript等)なのか。
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況