2016-11-10 2 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 заявление не является обязательным в зависимости от того, как именно вы хотите сделать что-то.

+0

Я думаю, что я изучил концепцию предварительной обработки, которая может быть общей для всех языков программирования. Благодарю. – mattsun

+0

Проект Yelp! Undebt (https://github.com/Yelp/undebt) может быть полезен в этих усилиях. – PaulMcG

1

Ну, это зависит от используемого вами компилятора. Например, в GCC для языка программирования C у вас есть целый набор инструкций препроцессора, которые могут быть использованы для этого.

Например:

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

И, когда вы компилируете версию отладки, вы просто должны включать в себя дополнительный заголовок, который определяет DEBUG макрос. Нет необходимости устанавливать какую-либо ценность, просто определите ее.

#define DEBUG 

И все.

+0

Если я компилирую не-отладочную версию, будет ли эта часть кода вообще скомпилирована? Я не только запрашиваю код внутри 'ifdef', но и сам' ifdef'. – mattsun

+0

Проверка ifdef не является частью программы. Компилятор C работает два раза. Первый, выполняет инструкции препроцессора. В этом запуске он решит, должен ли он скомпилировать код внутри проверки #ifdef. Второй раз выполняется по результату первого. Поэтому, если первый исключает код, он не будет в конечном двоичном файле. –

+1

Лучшая формулировка, Хавьер: Компилятор работает один раз, но он имеет несколько этапов. – user4581301

1

Есть языки (включая C, C++ и C#), который может сделать это с помощью директивы препроцессора, как #if или #ifdef:

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

При компиляции кода, если DEBUG символ не установлен, то код между двумя директивами вообще не компилируется (и даже не должен быть действительным кодом).

Но что еще более важно, почему вы спрашиваете? Если вас беспокоит производительность, то такие проверки очень дешевы (поскольку их легко предсказать). И если проверки написаны правильно (например, если isDebug является глобальной константой) и скомпилированы с использованием хорошего компилятора they can even be eliminated as dead code, что делает их полностью бесплатными.

+0

Вы правы, производительность - моя забота. Но я также понимаю, что делать это очень дешево. – mattsun