В этой вводной лекции даются ответы на основные вопросы, связанные с процессом программирования: что такое программа, как она создается и выполняется, какие языки программмирования существуют и в чем они отличаются. С некоторыми понятиями из данного раздела вы, вероятно, уже знакомы, однако они приводятся здесь для того, чтобы изложение материала было последовательным и полным. Все примеры программного кода в этом курсе лекций приводятся на языке программирования Python, если не указано иное.
Программа представляет собой последовательность инструкций, которые говорят вычислительной системе, что нужно сделать. Ответственность за выполнение программы лежит на процессоре (CPU), который считывает инструкции одну за другой из оперативной памяти и обрабатывает их. Инструкции, понятные непосредственно процессору, называются машинными инструкциями и представляют собой двоичный код строго определенного формата. Вся их совокупность называется машинным кодом, при этом, разные модели процессоров могут использовать разные наборы машинных инструкций, т.е. иметь отличающийся машинный код. В качестве примера приведем машинную инструкцию, складывающую два числа для процессора Intel Core i3/i5/i7:
00000001 11000001
Можно выделить два очевидных недостатка в программировании непосредственно в машинном коде:
Именно два этих фактора (в особенности первый) привели к созданию языков программирования.
Язык программирования - это формальный, т.е. описываемый некоторыми правилами, язык, предназначенный для записи компьютерных программ. Все языки программирования можно разделить на низкоуровневые, в которых программы мало отличаются от программ в машинных кодах, и высокоуровневые, созданные для удобства разработки программ человеком. Несмотря на огромное количество языков программирования высокого уровня, низкоуровневые языки вроде Assembler до сих пор используются в областях, где требуется максимальное быстродействие, так как программы, написанные на них, можно вручную максимально оптимизировать под конкретную модель процессора.
Подобно обычным языкам, все языки программирования формулируют три составляющих, которые в совокупности определяют, как выглядит правильно составленная программа и что она делает:
print(1+2)
является программой на языке Python (выводит сумму 1 и 2 на экран), а print(1+)
нет, потому что согласно правилам этого языка после знака "+" в представленном выражении ожидается еще одно число.1+2
в Python означает сумму 1 и 2, однако в другом языке программирования это же выражение может означать что-то другое.Как упоминалось выше, основное назначение языков программирования - упростить процесс написания программ. Для этой цели языки программирования максимально приближены к естественным языкам, а это зачастую дает интуитивное понимание смысла программы. В подтверждение этих слов предлагаем вам догадаться самим, что делается в следующей программе (подсказка - после ее выполнения на экран будет выведено некоторое число, но нужно понять, какое именно):
some_list = [10, 5, 13]
max_value = 0
for value in some_list:
if value > max_value:
max_value = value
print(max_value)
%%HTML
<script>
function show_solution() {
$('#solutionText').show()
}
$(document).ready(function() {
$('div.input').hide()
$('#solutionText').hide()
});
</script>
<a onClick="show_solution()" style="cursor:pointer;text-decoration: none;border-bottom: 1px dashed">Показать ответ</a>
<br/>
<div id="solutionText">Программа ищет в списке из трех элементов 10, 5 и 13 наибольший и выводит его на экран. Если вам не удалось ответить правильно, ничего страшного - через несколько лекций этот код покажется вам элементарным.</div>
Бывают и такие языки программирования, в которых наоборот сделано все возможное, чтобы программа была нечитабельна, но создаются они исключительно ради эксперимента или шутки. Хорошим примером является язык программирования COW. Вот так выглядит программа, генерирующая последовательность Фибоначчи, на этом языке:
MoO moO MoO mOo MOO OOM MMM moO moO
MMM mOo mOo moO MMM mOo MMM moO moO
MOO MOo mOo MoO moO moo mOo mOo moo
Итак, мы получили представление о том, как выглядит программа, написанная на некотором языке программирования. Несмотря на большое различие между языками, у них есть одна общая черта: программа на любом из них представляет собой текст, следующий четко определенным правилам языка. Этот текст принято называть исходным кодом (или просто кодом) программы.
Как упоминалось ранее, процессор может выполнить только программу, написанную в машинных кодах, поэтому возникает закономерный вопрос: как выполнить программу, написанную на некотором языке программирования, отличном от машинного кода. Ответ на него дается в следующем разделе.
Существует два основных подхода к выполнению программ:
Как можно заметить, в обоих этих подходах существует этап преобразования программы с языка программирования в программу на некотором другом языке: в случае компиляции другим языком является машинный код, а в случае интерпретации байт-код. Процесс перевода программы, написаннной на одном языке, в программу на другом языке называется трансляцией. Специальная программа, выполняющая трансляцию называется транслятором.
Каждый из двух представленных подходов к выполнению программ имеет свои преимущества и недостатки. Главный плюс компиляции в том, что ее можно выполнить один раз, получить исполняемый файл, который можно бесконечное количество раз запускать на процессоре без дополнительной обработки. При интерпретации на каждом запуске программы выполняется ее разбор интерпретатором и трансляция в байт-код, что приводит в общем случае к более медленной работе по сравнению с аналогичной, но скомпилированной программой. С другой стороны, процесс компиляции может занимать очень много времени (исчисляется часами) и должен выполняться при малейшем изменении в исходном коде программы, а интерпретируемая программа запускается мгновенно. Кроме того, интерпретатор может обеспечивать дополнительный уровень безопасности для системы в целом: отслеживать некорректные операции программы, следить за тем, чтобы она не расходовала излишне оперативную память и другое. Обобщенно можно сказать так: компиляция создает более быстрые программы, но требует больше усилий от разработчика, в отличие от интерпретации.
В соответствии с подходом, используемым для выполнения программ, различают компилируемые и интерпретируемые языки программирования. К числу наиболее известных компилируемых языков относятся C, C++, Objective-C, Go и другие. Python, а также Java, PHP, Perl и другие относятся к интерпретируемым языкам.