Python. Введение
Время чтения: 6 минут
В этой статье я расскажу что такое языки программирования и в частности про Python.
Сразу скажу, я сторонник обучения сверху-вниз – сначала объясняю глобально, а потом перехожу к частностям. Это помогает построить в голове карту предметной области, при помощи которой тебе будет проще в будущем систематизировать свои знания.
Что такое язык программирования
Язык программирования – это язык на котором можно описать последовательность инструкций в том виде, в котором его сможет прочитать компьютер. В каждом языке программирования есть чёткий набор правил, которые необходимо соблюдать:
- Синтаксические правила
- Семантические правила
- Лексические правила
Синтаксические правила
Определяют какие последовательности символов можно считать правильными.
Например, в русском языке, такое предложение нарушает синтаксические правила:
Закат был прекрасен и таинственный.
Вместо “таинственный” должно быть “таинственен”.
Мы с тобой всё равно понимаем смысл предложения, даже учитывая что оно с ошибкой – компьютер так не сможет, он умеет читать только то, что соответствует прописаным правилам. Если бы ты решил сказать это компьютеру, то он бы тебе сообщил:
[ОШИБКА] Не получается понять смысл предложения: "таинственный" не соотносится с "прекрасен".
Семантические правила
Определяют какое значение несут слова языка.
И снова пример из русского языка:
Закат был кровавого цвета.
Ты понял что кровавый цвет это красный, но компьютер не сможет этого понять, если ему заранее не прописать правило “кровавый = красный”. Без такого правила, он сообщит что-то вроде:
[ОШИБКА] Неизвестный цвет: "кровавый".
Лексические правила
Определяют как слова используются в предложении.
Можно сказать:
Глубокая ночь.
Но нельзя сказать:
Глубокий вечер.
Опять же, хоть это и звучит забавно, ты примерно понял смысл. Компьютер бы тебе сообщил:
[ОШИБКА] Неизвестное свойство объекта "вечер": "глубокий".
Давай представим, что ты знаешь все описанные правила, и можешь без ошибок писать на языке программирования Python. Что такого ты ещё можешь узнать о языке, что позволит тебе лучше понимать написанное?
Особенности реализации языка программирования
Так как языки программирования созданы для того, чтобы описывать последовательность инструкций, которые должен выполнить компьютер, важно понимать как именно компьютер будет их исполнять.
На самом деле, ты можешь писать на Python код и без этих знаний, но это база – такое надо знать как минимум для собеседований.
Существует множество классификаций языков программирования, давай рассмотрим самые важные:
- Декларативный или императивный язык программирования
- Динамическая или статическая типизация
- Интерпретируемый или компилируемый язык программирования
- Язык программирования со сборщиком мусора и без него
Декларативный или императивный язык программирования
Декларативный язык программирования описывает результат, а императивный описывает последовательность инструкций, выполнение которых приведёт к какому-то результату.
И снова наш любимый и понятный русский – допустим мы хотим свежего хлеба. Вот так бы выглядели программы на декларативном и императивном языках:
Императивный намного сложнее, да? Однако, вместе со сложностью, мы можем очень точно определить всю последовательность действий, которые приведут к результату. На декларативном языке тоже можно определять некоторые аспекты выполнения, однако такой же точности достигнуть нельзя.
Примеры декларативных языков: 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 это интерпретируемый императивный язык программирования с динамической типизацией и сборщиком мусора
Ну что, начнём?