11. Как работают языки программирования?

Мы уже обсудили как выполняются программы. Каждая программа в конечном счёте выполняется как поток байтов, несущих в себе инструкции на машинном языке (machine language) вашего компьютера. Но человеческим существам трудно с ними обращаться; необходимость в этом возникает все реже, это становится мерным искусством среди хакеров.

Едва ли не весь код Unix с небольшими исключениями, поддерживающими прямую работу с аппаратными интерфейсами в самом ядре, в наши дни написан на языке программирования высокого уровня (high-level language). (Термин «высокоуровневый» здесь исторический реликт, предназначенный для отличия от «низкоуровневого» языка ассемблера (assembler language), который по существу является обёрткой для машинного кода.)

Есть несколько разных видов языков высокого уровня. Для того, чтобы мы могли это обсуждать, вам необходимо уяснить следующее исходный код (source code) программы (созданной человеком, редактируемая версия) проходит через некоторый вид преобразований для перевода его на машинный язык, который машина действительно может выполнять.

11.1. Компилируемые языки

Наиболее традиционный вид языков — компилируемые языки (compiled language). Компилируемые языки используют (что логично) компилятор (compiler) для перевода исходного кода программы в запускаемые двоичные файлы, содержащие машинный код. После того как двоичный файл сгенерирован, вы можете запускать его непосредственно без оглядки на исходный код. (Большинство программного обеспечения поставляется в виде скомпилированных двоичных файлов, созданных из исходного кода, который вы не видите).

Программы, создаваемые с помощью компилируемых языков, склонны иметь превосходную скорость выполнения и в большинстве из языков доступен весь набор функций ОС, но вместе с тем компилируемые языки сложны в программировании.

Язык C (Си), это язык, на котором написана сама Unix, один из наиболее важных (равно как и его вариация C++). FORTRAN — ещё один компилируемый язык, все ещё используется инженерами и учёными, но более старый и примитивный. В мире Unix нет других столь широко используемых компилируемых языков. Вне его есть COBOL, очень широко используемый при создании финансовых и деловых программ.

Существовали и другие компилируемые языки, но они либо вышли из употребления, либо используются в качестве исследовательского инструментария. Если вы — начинающий разработчик, создающий программы для Unix с помощью компилируемых языков, в подавляющем большинстве случаев вы будете использовать C или C++.

11.2. Интерпретируемые языки

Интерпретируемые языки (interpreted language) зависят от программы-интерпретатора, которая читает исходный код и на лету переводит его в вычисления и системные вызовы. Исходный код вновь интерпретируется (и интерпретатор используется) каждый раз при выполнении программы.

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

Многие утилиты Unix, включая shell, bc(1), sed(1) и awk(1), являются небольшими и эффективными интерпретируемыми языками. BASIC обычно тоже интерпретируемый, равно как и Tcl. Исторически сложилось, что важнейшим интерпретируемым языком был LISP (и его сильно улучшенные преемники). Сегодня Unix shell и Lisp, который живёт внутри редактора Emacs, вероятно, самые важные чистые интерпретируемые языки.

11.3. P-код языки

Начиная с 1990 все более и более важным становится гибридный вид языков, использующий и компиляцию и интерпретатор. P-код языки, как и компилируемые, переводят исходный код в компактный двоичный, который в последствии выполняется, но этот код не машинный. Это псевдокод (pseudocode или p-code), который обычно гораздо проще, но мощнее, чем настоящий машинный код. Когда вы запускаете программу, то интерпретируется p-code.

P-код может выполняться со скоростью, близкой к скомпилированному в машинный двоичному (интерпретаторы p-кода вполне могут быть простыми, маленькими и проворными). При этом p-код-языки могут сохранять гибкость и мощь хороших интерпретаторов.

К важным языкам, использующим p-код, относятся Python, Perl, и Java.