2016-11-10 4 views
0

私はコードの特定の部分だけをコンパイルすることができるように、どのプログラミング言語でも機能があるのだろうかと思います。以下の例を参照してください。選択的コンパイル

これは、擬似コードのブロックです:

function foo() { 

    if (isDebug) { 
     checkSomethingForDebugging(); 
     print(some debug info); 
    } 

    toSomeFooThings(); 
} 

このブロックは、目的をデバッグするためですが、私は生産に(たとえステートメントを)それらを無視します。

if (isDebug) { 
    checkSomethingForDebugging(); 
    print(some debug info); 
} 

私にできることの一つは、これらの行をコメントアウトすることで、

function foo() { 

    //if (isDebug) { 
    // checkSomethingForDebugging(); 
    // print(some debug info); 
    //} 

    toSomeFooThings(); 
} 

しかし、どのような場合、私はこのような場所で何千ものがありますか?私がコードの特定の部分をコンパイルするかどうかを選択できる方法(フラグ)があれば良いでしょう。それはdebugging buildのようなものです。これにはどんなプログラミング言語でも何かありますか?私はオンラインで検索したが運がなかった。

+0

BASICのような解釈言語を見てください。各行は別々に解釈(翻訳され、実行)されます。 –

+0

@ThomasMatthews Pythonと同じですか?これをpyファイルでどうやって実現できますか? – mattsun

+0

Pythonは解釈されません。バイトコードにコンパイルされ、次に仮想マシンによって実行されます。 – chepner

答えて

1

ほとんどの言語にはこれがありませんが、ビルド/デプロイメントパイプラインのどこかでソースコードを処理し、デバッグ専用の部分を削除したスクリプトを作成することはできます。高度な方法は、適切にソースコードを解析し、適切なifブロックを削除することです。 Pythonの場合、これはastモジュールを使うか、if is_debug:という行を探してインデントレベルを調べるだけで簡単に行えます。他の言語については、もっと難しいかもしれません。前処理スクリプトの面で簡単な方法は、コメントを区切る使用することです:

// DEBUGONLY 
checkSomethingForDebugging(); 
print(some debug info); 
// ENDDEBUGONLY 

この場合if文はあなたが物事をやりたいかを正確に依存するオプションです。

#if DEBUG 
checkSomethingForDebugging(); 
print(some debug info); 
#endif 

コードがコンパイルされ、DEBUGシンボルが設定されていない場合、コード:

+0

私はすべてのプログラミング言語に一般的なことができる前処理の概念を学んだと思います。ありがとう。 – mattsun

+0

この努力の中でYelp!のUndebtプロジェクト(https://github.com/Yelp/undebt)が役に立つかもしれません。 – PaulMcG

1

これは、使用しているコンパイラによって異なります。たとえば、Cプログラミング言語のGCCでは、プリプロセッサ命令のセット全体を使用することができます。例えば

#ifdef DEBUG 
// Your code here... 
#endif /* DEBUG */ 

そして、あなたはデバッグバージョンをコンパイルしているとき、あなただけのDEBUGマクロを定義して、余分なヘッダーを含める必要があります。値を設定する必要はなく、定義するだけです。

#define DEBUG 

これだけです。

+0

非デバッグバージョンをコンパイルしている場合、これらのコード部分はまったくコンパイルされますか?私は 'ifdef'の中のコードブロックを尋ねるだけでなく、' ifdef'自身をチェックしています。 – mattsun

+0

ifdefチェックはプログラムの一部ではありません。 Cコンパイラは2回実行されます。最初のものは、プリプロセッサ命令を実行します。その実行では、#ifdefチェック内でコードをコンパイルする必要があるかどうかを判断します。 2回目は、1回目の結果に対して実行されます。したがって、最初にコードを除外した場合、最終バイナリファイルには含まれません。 –

+1

Javier:コンパイラは一度実行されますが、複数の段階があります。 – user4581301

1

#if#ifdefのように、この使用してプリプロセッサディレクティブを行うことができます(C、C++やC#を含む)の言語があります2つのディレクティブの間にはまったくコンパイルされていません(有効なコードである必要はありません)。

さらに重要なことに、なぜあなたは尋ねていますか?あなたがパフォーマンスを心配しているなら、そのようなチェックは非常に安いです(簡単に予測できるので)。また、小切手が正しく書かれた場合(例えば、isDebugがグローバル定数である場合)、良いコンパイラthey can even be eliminated as dead codeを使用してコンパイルすると完全に無料になります。

+0

あなたは正しいです、パフォーマンスは私の心配です。しかし、私はまた、それをチェックすることは非常に安いことを理解しています。 – mattsun