-
Notifications
You must be signed in to change notification settings - Fork 7
Compile Option
#Compile Option
PSLには(ライブラリ自体の)のコンパイル時にオプションを選択する事で挙動を変えることが可能な部分があります
PSLはヘッダオンリーのライブラリですから、コンパイル時というのは即ちあなたのプログラムのコンパイル時です
設定はPSL.hの頭にあります
最近あんまり確認してないので組み合わせによってはコンパイル通らないかもしれません
報告してくれれば不可能な組み合わせでない場合は対応します
##STL関連
###PSL_USE_STL_VECTOR
vectorにSTLのものを使います
私の仕事に不安がある場合はどうぞ
自作スタックはvectorを利用している為、PSL_USE_STL_STACKも同時にONにする必要があります(確か勝手にする)
std::vectorは複数の要素を同時に初期化する場合にコピーコンストラクタを使う為に、
PSL_NULL_RSVもONにしないと幾つかの条件下で恐らく意図しない挙動を示します
###PSL_USE_STL_STACK スタックにstd::stackを使います
###PSL_USE_STL_MAP 連想配列にstd::mapを使います
##最適化関係(Optimize)
###PSL_OPTIMIZE_TAILCALL
末尾呼び出し最適化
###PSL_OPTIMIZE_IN_COMPILE
コンパイル時最適化(これ以下)を有効にする
###PSL_OPTIMIZE_IMMEDIATELY_POP
定数または変数をPUSHしてPOPするだけのコードを削除
###PSL_OPTIMIZE_CONSTANT_CALCULATION
定数畳み込み
###PSL_OPTIMIZE_SUFFIX_INCREMENT
後置インクリメント、デクリメント
###PSL_OPTIMIZE_BOOL_AND
短絡評価
###PSL_OPTIMIZE_PARENTHESES
()
##変数関係
###PSL_NULL_RSV
rsv型(変数実体用のスマートポインタ)がNULLを許容します
std::vectorを使う場合は必須
空変数が一々newしなくなるので軽くなる場合もある
が、チェックが入る為遅くなる場合もある
インライン展開の力でコードの肥大化著しい
###PSL_POPSTACK_NULL
POPされたスタックをその場で空にする
OFFにすると速いが、変数がスタックに残ってスコープを抜けても生き延びる場合がある
(そのスタック位置に新たな値が積まれれば解放されるのでリークではない)
###PSL_CHECKSTACK_POP
POP時にスタックに値が積まれているかどうかをチェックする
(スタックが空の場合に空変数を作って返す様になる)
当然した方が安全だが、普通に使っていてこのチェックに引っかかることはない
そして当然使わない方が速い
###PSL_CHECKSTACK_PUSH
PUSH時にスタックをチェックする
というよりも、スタックサイズを固定にするか可変にするかという話である
しない方が速いが、再帰の仕方によっては死ぬし、長い式を書いても死ぬ
std::stackだと関係ない
###PSL_CLOSURE_REFERENCE
クロージャをコピーではなく参照にする
参照というのはPSL内の参照(ポインタ)とは別物で、完全にそのものとして振る舞う
###PSL_USE_DESTRUCTOR
スクリプト内のクラスのデストラクタを使う
必要ない場合は切ると速い
###PSL_MEMBER_REGISTER
メンバアクセスした際に親をレジスタに保存する
一時変数を使ったメソッドチェーン、file.open("test").read(100);とか出来る様になる
変数の寿命が読みにくくなる場合があるので注意
あと当然実行コストが増える
###PSL_IF_STATEMENT_NOT_SCOPE
if文がスコープを作らない
普通のif文は一々スコープを作るのでelse ifを重ねた場合に(ブロック(波括弧)がなくても)スコープがネストする
PSLは関数呼び出しどころか何でもないスコープであってもある程度のコストが掛かるので
else ifが大量に連なる場合には注意が必要だが
このオプションをONにすればあまり気にする必要は無くなる
が当然、変数の扱いが変わることがあるので注意
##警告関係
###PSL_WARNING_POP_EMPTY_STACK
空スタックからPOPした場合に警告を出す
PSL_CHECKSTACK_POPがONでない場合は機能しない
###PSL_WARNING_STACK_REMAINED
Environmentを削除した際に、スタックに値が残っている場合は警告を出す
コルーチンの使い方によっては、問題がなくても警告が出るのでうるさい
###PSL_WARNING_UNDECLARED_IDENTIFIER
未宣言の変数を使用した場合に警告する
注意が必要なのは、PSLでは関数の仮引数も普通の式と同じ扱いなので
function(local x,local y)return x+y;
の様に書かなくてはならなくなる
###PSL_WARNING_DECLARED_IDENTIFIER_ALREADY_EXIST
宣言済みの名前を再宣言した場合に警告する
当然、スコープが同じ場合だけであるが
for (int i;i<10;i++){int x=i*2;print(x);}
みたいな場合にxが警告されるのでうるさい
これを回避するにはparse.hを改造する必要がある
##メモリ関係
###PSL_USE_VARIABLE_MEMORY_MANAGER
メモリマネージャを使う
マーク・アンド・スウィープGCが呼べる
下の二つのオプションが利用可能になる
大体速い、多分安全、無駄に断片化させない
尚、これがONの場合にSTLのコンテナを使うと変数のサイズが変わるのでコンパイル出来なくなります
64bitでコンパイル出来ないのも同じ理由ですがmemory.hを触るかこのオプションの使用を我慢して下さい
###PSL_SHARED_GLOBAL
グローバル変数を全ての環境で共通にする
C++からPSL関数を呼び出す時に環境を渡す必要がなくなる
###PSL_CHECK_SCOPE_NEST
実行スコープのネストの深さをチェックする
上限を超えた場合には例外を送出する
厳密にいえば、ネストの深さではなく、総スコープ数なのでコルーチンを酷使しても引っかかる
(もっと言えばifやforやただの無名ブロック{}でも)
数を変更したい場合はmemory.hを触ること(default:256)
###PSL_THREAD_SAFE
上のオプションを無効にし、ローカルstatic変数を使わなくなる
##他
###PSL_USE_TOKENIZER_DEFINE
tokenizer指令#defineを有効にする
###PSL_USE_CONSOLE
OFFにするとprintfが中身ごと消えるのでサイズがスリムになる
標準ライブラリのstrlib.getsとstrlib.getcharも登録しなくなる
###PSL_DEBUG
ステップ実行、変数のダンプが可能になる
##printfの差し替え
PSL_PRINTFのところを触れば任意の関数で文字表示が可能になる
ウインドウに表示したい場合等はそうすること
ただしprintfと同じ型の関数でないとまずい可能性が高い
気合いでオーバーロードしてもいいけど