Программист должен понимать, что язык программирования определяет характер программы, а не способ ее выполнения компьютером. Есть два способа выполнения программы компьютером: она может быть подвергнута компиляции или интерпретации. Программа, написанная на любом языке программирования, может как компилироваться, так и интерпретироваться, однако многие языки изначально созданы для выполнения преимущественно одним из этих способов. Например, Java рассчитан в основном на интерпретацию программы, а язык С — на компиляцию. Необходимо помнить, что при разработке языка С его конструкции оптимизировались специально для компиляции. И хотя интерпретаторы С существуют и доступны для программистов (особенно как средства отладки или объект для экспериментов — в качестве такого объекта можно использовать, например, интерпретатор, рассмотренный в части VI этой книги), С разрабатывался преимущественно для компиляции. Поэтому при разработке программ на С большинство программистов используют именно компилятор, а не интерпретатор. Поскольку не все читатели этой книги достаточно хорошо понимают отличие компилятора от интерпретатора, ниже дается краткое разъяснение по этому поводу.
В простейшем случае интерпретатор читает исходный текст программы по одной строке за раз, выполняет эту строку и только после этого переходит к следующей. Так работали ранние версии языка Basic. В языках типа Java исходный текст программы сначала конвертируется в промежуточную форму, а затем интерпретируется. В этом случае программа также интерпретируется в процессе выполнения.
Компилятор читает сразу всю программу и конвертирует ее в объектный код, то есть транслирует исходный текст программы в форму, более пригодную для непосредственного выполнения компьютером. Объектный код также называют двоичным или машинным кодом. Когда программа скомпилирована, в ее коде уже нет отдельных строк исходного кода.
В общем случае интерпретируемая программа выполняется медленнее, чем скомпилированная. Необходимо помнить, что компилятор преобразует исходный текст программы в объектный код, который выполняется компьютером непосредственно. Значит, потеря времени на компиляцию происходит лишь единожды, а в случае интерпретации — каждый раз при очередной компиляции фрагмента программы в процессе ее выполнения.