+--------------------------+
|.------------------------.|
|| kee_reel@blog:~$ cd    ||
|| си python терминал     ||
|| opengl sql             ||
||                        ||
||                обо_мне ||
|.------------------------.|
+-::--------------------::-+
.--------------------------.
 // /ooooooooooooooooooooo\\ \\ 
 // /ooooooooooooooooooooooo\\ \\ 
//------------------------------\\
\\------------------------------//

Python. Введение

В этой статье я расскажу что такое языки программирования и в частности про Python.

Сразу скажу, я сторонник обучения сверху-вниз – сначала объясняю глобально, а потом перехожу к частностям. Это помогает построить в голове карту предметной области, при помощи которой тебе будет проще в будущем систематизировать свои знания.

Карта IT

Что такое язык программирования

Язык программирования – это язык на котором можно описать последовательность инструкций в том виде, в котором его сможет прочитать компьютер. В каждом языке программирования есть чёткий набор правил, которые необходимо соблюдать:

  • Синтаксические правила
  • Семантические правила
  • Лексические правила

Звучит очень скучно, но я написал всё очень интересно, не теряй боевого духа!

Синтаксические правила

Определяют какие последовательности символов можно считать правильными.

Например, в русском языке, такое предложение нарушает синтаксические правила:

Закат был прекрасен и таинственный.

Вместо “таинственный” должно быть “таинственен”.

Мы с тобой всё равно понимаем смысл предложения, даже учитывая что оно с ошибкой – компьютер так не сможет, он умеет читать только то, что соответствует прописаным правилам. Если бы ты решил сказать это компьютеру, то он бы тебе сообщил:

[ОШИБКА] Не получается понять смысл предложения: "таинственный" не соотносится с "прекрасен".

Компьтер в этом плане похож на очень занудного друга, который постоянно тебя поправляет в разговоре.

Семантические правила

Определяют какое значение несут слова языка.

И снова пример из русского языка:

Закат был кровавого цвета.

Ты понял что кровавый цвет это красный, но компьютер не сможет этого понять, если ему заранее не прописать правило “кровавый = красный”. Без такого правила, он сообщит что-то вроде:

[ОШИБКА] Неизвестный цвет: "кровавый".

Лексические правила

Определяют как слова используются в предложении.

Можно сказать:

Глубокая ночь.

Но нельзя сказать:

Глубокий вечер.

Опять же, хоть это и звучит забавно, ты примерно понял смысл. Компьютер бы тебе сообщил:

[ОШИБКА] Неизвестное свойство объекта "вечер": "глубокий".

Давай представим, что ты знаешь все описанные правила, и можешь без ошибок писать на языке программирования Python. Что такого ты ещё можешь узнать о языке, что позволит тебе лучше понимать написанное?

Особенности реализации языка программирования

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

На самом деле, ты можешь писать программный код и без этих знаний, но тогда ты с большей вероятностью напишешь то, что будет работать ненадёжно или неэффективно. Эти качества являются очень важными в разработке, и если они будут сильно хромать, то ты не поднимешься выше позиции Junior.

Существует множество классификаций языков программирования, давай рассмотрим самые важные:

  • Декларативный или императивный язык программирования
  • Динамическая или статическая типизация
  • Интерпретируемый или компилируемый язык программирования
  • Язык программирования со сборщиком мусора и без него

Декларативный или императивный язык программирования

Декларативный или императивный язык программирования

Декларативный язык программирования описывает результат, а императивный описывает последовательность инструкций, выполнение которых приведёт к какому-то результату.

И снова наш любимый и понятный русский – допустим мы хотим свежего хлеба. Так бы выглядела программа на декларативном языке:

Хочу: свежий хлеб
Откуда: из магазина
Если нет: купить вчерашний

Так бы выглядела программа на императивном языке:

если(сейчас зима) то
	надеть верхнюю одежду
открыть дверь
выйти
закрыть дверь
спуститься
<место> = магазин "Булочная" по адресу ул. Ленина 1
до тех пор, пока не (прибыл на <место>) делать
	идти к <место>

достать кошелёк
<свежий хлеб есть> = спросить "Есть свежий хлеб?"
если (<свежий хлеб есть>) то
	<выбранный хлеб> = свежий хлеб
иначе
	<выбранный хлеб> = вчерашний хлеб

попросить <выбранный хлеб>
передать кассиру стоимость за <выбранный хлеб>
забрать <выбранный хлеб>
вернуться домой
подняться
открыть дверь
зайти
закрыть дверь
если(сейчас зима) то
	снять верхнюю одежду

Намного сложнее, да? Однако, вместе со сложностью, мы можем очень точно определить всю последовательность действий, которые приведут к результату. На декларативном языке тоже можно определять некоторые аспекты выполнения, однако такой же точности достигнуть нельзя.

Примеры декларативных языков: HTML, CSS, SQL, Haskell

Примеры императивных языков: Python, C++, Java, Java Script

Динамическая или статическая типизация

Динамическая или статическая типизация

Эту классификацию сложнее объяснить тем, у кого нет существующего опыта программирования, но я постараюсь. Представь, что ты убираешься в комнате, и у тебя есть много коробок, в которые ты будешь складывать вещи.

Динамическая типизация – это когда ты можшь положить в любую коробку всё что угодно.

Статическая типизация – это когда ты можешь складывать в одну коробку только определённый тип предметов.

У обоих подходов есть свои плюсы и минусы:

Динамическая типизация

+ Можно быстро всё раскидать по коробкам

- Если типов вещей очень много, то рано или поздно ты начнёшь путаться в какой коробке что лежит

Статическая типизация

+ Благодаря систематизации того, в каких коробках что лежит, запутаться сложнее

- Необходимо подписывать тип каждой коробки, и систематизировать уже не сами вещи, а типы коробок

Возможно сейчас тебе сложно представить как это относится к программированию, но ты можешь в дальнейшем вернуться к этому описанию, и всё сразу станет ясно.

Примеры языков с динамической типизацией: Python, Java Script, PHP, Ruby

Примеры языков со статической типизацией: C++, Java, C#, Rust

Интерпретируемый или компилируемый язык программирования

Интерпретируемый или компилируемый язык программирования

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

И опять же, у каждого подхода есть свои плюсы и минусы:

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

+ Можно исполнять (интерпретировать) написанный код программы сразу

- Есть небольшая задержка перед исполнением кода, что снижает скорость выполнения

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

+ Весь код программы исполняется сразу, без задержек

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

Примеры интерпретируемых языков: Python, Java Script, PHP, Ruby

Примеры компилируемых языков: C++, Java, C#, Rust

Язык программирования со сборщиком мусора и без него

Язык программирования со сборщиком мусора и без него

Сборщик мусора (GC, Garbage Collector) – механизм, который автоматически освобождает неиспользуемую память.

Вернёмся к примеру с коробками из “Динамическая или статическая типизация” – представь что ты убрался в комнате, и всё у тебя лежит по коробкам. Спустя какое-то время тебе надо что-то оттуда доставать, использовать или перекладывать в новые коробки. В то время, как ты вытаскиваешь предметы из коробок, какие-то из них пустеют, и тебе нужно что-то с ними делать.

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

Сборщик мусора позволяет тебе не думать про (выбрасывание коробок)/(освобождение памяти), и сам следит какие (коробки)/(участки памяти) больше не используются.

Ты возможно спросишь:

А почему бы тогда не использовать сборщик мусора во всех языках программирования?

Вопрос этот справедливый, и вот ответ – потому что сборщик мусора не бесплатный, и тебе нужно выделять какую-то часть ресурсов на его работу. Если ты сам за собой (выбрасываешь коробки)/(освобождаешь память), то это будет более эффективным решением.

ОДНАКО, если ты не будешь пользоваться сборщиком мусора, то тебе нужно о-о-о-о-о-очень внимательно следить за тем, что ты действительно (выбрасываешь коробки)/(освобождаешь память) за собой, а то твоя программа может просто упасть из-за недостатка (места в доме)/(свободной оперативной памяти компьютера).

Ситуация, когда разработчик не уследил за освобождением памяти называется “утечка памяти”.

Примеры языков со сборщиком мусора: Python, Java Script, Java, C#

Примеры языков без сборщика мусора: C, C++, Rust

Заключение

  • Ты узнал что язык программирования это язык, в котором есть строгие синтаксические, семантические и лексические правила
  • Если все эти правила удовлетворяются, то язык программирования может быть прочитан компьютером, и исполнен
  • Кроме правил у языка программирования есть особенности его реализации
  • Есть декларативные (простые и общие) и императивные (сложные и детальные) языки
  • Есть динамическая (всё в одну коробку) и статическая (много разных коробок по типам) типизация
  • Есть интерпертируемые (моментально по чуть-чуть) и компилируемые (после компиляции всё сразу) языки
  • Есть языки со сборщиком мусора (сам забирает коробки) и без него (надо самим заботиться о выбрасывании коробок)

Теперь ты настолько крут, что можешь понять это предложение:

Python это интерпретируемый императивный язык программирования с динамической типизацией и сборщиком мусора

Дальше мы с тобой будем изучать правила языка Python, чтобы учиться на нём писать программы, которые сможет прочитать и исполнить компьютер, а начнём с переменных.