{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"# Введение в программирование"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"В этой вводной лекции даются ответы на основные вопросы, связанные с процессом программирования: что такое программа, как она создается и выполняется, какие языки программмирования существуют и в чем они отличаются. С некоторыми понятиями из данного раздела вы, вероятно, уже знакомы, однако они приводятся здесь для того, чтобы изложение материала было последовательным и полным. Все примеры программного кода в этом курсе лекций приводятся на языке программирования Python, если не указано иное."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Содержание лекции"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* [Что такое программа?](#Что-такое-программа?)\n",
"* [Языки программирования](#Языки-программирования)\n",
"* [Компиляция и интерпретация](#Компиляция-и-интерпретация)\n",
"* [Вопросы для самоконтроля](#Вопросы-для-самоконтроля)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Что такое программа?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Программа** представляет собой последовательность инструкций, которые говорят вычислительной системе, что нужно сделать. Ответственность за выполнение программы лежит на процессоре (CPU), который считывает инструкции одну за другой из оперативной памяти и обрабатывает их. Инструкции, понятные непосредственно процессору, называются **машинными инструкциями** и представляют собой двоичный код строго определенного формата. Вся их совокупность называется **машинным кодом**, при этом, разные модели процессоров могут использовать разные наборы машинных инструкций, т.е. иметь отличающийся машинный код. В качестве примера приведем машинную инструкцию, складывающую два числа для процессора Intel Core i3/i5/i7:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```\n",
"00000001 11000001\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Можно выделить два очевидных недостатка в программировании непосредственно в машинном коде:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* крайне длительный и затрудненный процесс программирования - машинные инструкции очень сложно запомнить, и они представляют собой лишь базовые примитивы (вроде простейших арифметических операций с парой чисел), которых требуется написать огромное количество для сколько-нибудь полезной программы\n",
"* программа, написанная в машинных кодах, может быть выполнена только на той модели процессора, для которой она разрабатывалась"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Именно два этих фактора (в особенности первый) привели к созданию языков программирования."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Языки программирования"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Язык программирования** - это формальный, т.е. описываемый некоторыми правилами, язык, предназначенный для записи компьютерных программ. Все языки программирования можно разделить на **низкоуровневые**, в которых программы мало отличаются от программ в машинных кодах, и **высокоуровневые**, созданные для удобства разработки программ человеком. Несмотря на огромное количество языков программирования высокого уровня, низкоуровневые языки вроде Assembler до сих пор используются в областях, где требуется максимальное быстродействие, так как программы, написанные на них, можно вручную максимально оптимизировать под конкретную модель процессора."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Подобно обычным языкам, все языки программирования формулируют три составляющих, которые в совокупности определяют, *как* выглядит правильно составленная программа и *что* она делает:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* **Лексика** - определяет алфавит, из символов которого составляется программа. Как правило это английские буквы в нижнем и верхнем регистрах, цифры, знаки арифметических операций и препинания.\n",
"* **Синтаксис** - описывает допустимые комбинации символов алфавита, которые могут встречаться в правильно составленной программе. Например, `print(1+2)` является программой на языке Python (выводит сумму 1 и 2 на экран), а `print(1+)` нет, потому что согласно правилам этого языка после знака \"+\" в представленном выражении ожидается еще одно число.\n",
"* **Семантика** - определяет смысл конструкций языка программирования, то есть что они делают. Например, `1+2` в Python означает сумму 1 и 2, однако в другом языке программирования это же выражение может означать что-то другое."
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Как упоминалось выше, основное назначение языков программирования - упростить процесс написания программ. Для этой цели языки программирования максимально приближены к естественным языкам, а это зачастую дает интуитивное понимание смысла программы. В подтверждение этих слов предлагаем вам догадаться самим, что делается в следующей программе (подсказка - после ее выполнения на экран будет выведено некоторое число, но нужно понять, какое именно):"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```python\n",
"some_list = [10, 5, 13]\n",
"max_value = 0\n",
"\n",
"for value in some_list:\n",
" if value > max_value:\n",
" max_value = value\n",
"\n",
"print(max_value)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"Показать ответ\n",
"
\n",
"