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 (и его сильно улучшенные преемники). Сегодня, shell Unix и Lisp, который живет внутри редактора Emacs, вероятно самые важные чистые интерпретируемые языки.

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

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

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

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