Языки программирования
Язы́к программи́рования — формальная знаковая система, предназначенная для записи программ. Программа обычно представляет собой некоторый алгоритм в форме, понятной для исполнителя (например, компьютера). Язык программирования определяет набор лексических, синтаксических и семантических правил, используемых при составлении компьютерной программы. Он позволяет программисту точно определить то, на какие события будет реагировать компьютер, как будут храниться и передаваться данные, а также какие именно действия следует выполнять над этими данными при различных обстоятельствах.
Со времени создания первых программируемых машин человечество придумало уже более восьми с половиной тысяч языков программирования. Каждый год их число пополняется новыми. Некоторыми языками умеет пользоваться только небольшое число их собственных разработчиков, другие становятся известны миллионам людей. Профессиональные программисты иногда применяют в своей работе более десятка разнообразных языков программирования.
В настоящее время в мире существует несколько сотен реально используемых языков программирования. Для каждого есть своя область применения.
Любой алгоритм, как мы знаем, есть последовательность предписаний, выполнив которые можно за конечное число шагов перейти от исходных данных к результату. В зависимости от степени детализации предписаний обычно определяется уровень языка программирования — чем меньше детализация, тем выше уровень языка.
По этому критерию можно выделить следующие уровни языков программирования:
Машинные языки и машинно-ориентированные языки — это языки низкого уровня, требующие указания мелких деталей процесса обработки данных.
Каждый компьютер имеет свой машинный язык, то есть свою
совокупность машинных команд, которая отличается количеством адресов в команде,
назначением информации, задаваемой в адресах, набором операций, которые может
выполнить машина и др.
При программировании на машинном языке программист
может держать под своим контролем каждую команду и каждую ячейку памяти,
использовать все возможности имеющихся машинных операций.
Но процесс написания программы на машинном языке очень
трудоемкий и утомительный. Программа получается громоздкой,
труднообозримой, ее трудно отлаживать, изменять и развивать.
Поэтому в случае, когда нужно иметь эффективную
программу, в максимальной степени учитывающую специфику конкретного компьютера,
вместо машинных языков используют близкие к ним машинно-ориентированные языки
(ассемблеры).
Языки же высокого уровня имитируют естественные языки, используя некоторые слова разговорного языка и общепринятые математические символы. Эти языки более удобны для человека.
Языки высокого уровня делятся на:
Преимущества языков высокого уровня:
Таким образом, алгоритмические языки в значительной
мере являются машинно-независимыми. Они облегчают работу программиста
и повышают надежность создаваемых программ.
Компилируемые и интерпретируемые языки
Языки
программирования могут быть разделены на компилируемые и интерпретируемые.
Программа на
компилируемом языке при помощи специальной программы компилятора преобразуется (компилируется) в набор инструкций для данного типа
процессора (машинный код) и далее записывается в исполнимый модуль, который может
быть запущен на выполнение как отдельная программа. Другими словами,
компилятор переводит исходный текст программы с языка
программирования высокого уровня в двоичные коды инструкций процессора.
Если
программа написана на интерпретируемом языке, то интерпретатор непосредственно выполняет (интерпретирует) исходный текст без предварительного
перевода. При этом программа остаётся на исходном языке и не может
быть запущена без интерпретатора. Можно сказать, что процессор
компьютера — это интерпретатор машинного кода.
Кратко
говоря, компилятор переводит исходный текст программы
на машинный язык сразу и целиком, создавая при этом отдельную исполняемую
программу, а интерпретатор выполняет исходный текст прямо во время исполнения
программы.
Разделение
на компилируемые и интерпретируемые языки является несколько условным. Так, для
любого традиционно компилируемого языка, как, например, Паскаль, можно написать
интерпретатор. Кроме того, большинство современных «чистых» интерпретаторов не
исполняют конструкции языка непосредственно, а компилируют их в некоторое
высокоуровневое промежуточное представление (например, с разыменованием
переменных и раскрытием макросов).
Для любого
интерпретируемого языка можно создать компилятор — например, язык Лисп,
изначально интерпретируемый, может компилироваться без каких бы то ни было
ограничений. Создаваемый во время исполнения программы код может так же динамически
компилироваться во время исполнения.
Как правило,
скомпилированные программы выполняются быстрее и не требуют для выполнения
дополнительных программ, так как уже переведены на машинный язык. Вместе с тем,
при каждом изменении текста программы требуется её перекомпиляция, что создаёт
трудности при разработке. Кроме того, скомпилированная программа может
выполняться только на том же типе компьютеров и, как правило, под той же
операционной системой, на которую был рассчитан компилятор. Чтобы создать исполняемый
файл для машины другого типа, требуется новая компиляция.
Интерпретируемые
языки обладают некоторыми специфическими дополнительными возможностями (см. выше), кроме того, программы на них можно запускать
сразу же после изменения, что облегчает разработку. Программа на
интерпретируемом языке может быть зачастую запущена на
разных типах машин и операционных систем без дополнительных усилий.
Однако
интерпретируемые программы выполняются заметно медленнее, чем компилируемые,
кроме того, они не могут выполняться без дополнительной
программы-интерпретатора.
Некоторые
языки, например, Java и C#, находятся между компилируемыми
и интерпретируемыми. А именно, программа компилируется не в
машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Для выполнения байт-кода
обычно используется интерпретация, хотя отдельные его части для ускорения
работы программы могут быть транслированы в машинный код непосредственно во
время выполнения программы по технологии компиляции «на лету» (Just-in-time compilation, JIT). Для Java байт-код исполняется виртуальной машиной Java (Java Virtual
Machine, JVM), для C# — Common Language Runtime.
Подобный
подход в некотором смысле позволяет использовать плюсы
как интерпретаторов, так и компиляторов. Следует упомянуть также оригинальный
язык Форт(Forth)
имеющий и интерпретатор и компилятор.