Чтобы глубже погрузиться в настройку окружения Python, нам нужно вспомнить теоретические основы этого языка. Они помогут глубже разобраться в окружении и работе с ним.
Язык программирования
Что такое язык программирования? За этим понятием скрываются две связанных, но независимых темы.
С одной стороны, языком программирования называют синтаксические и семантические правила, по которым записывается и работает исходный код.
В отличие от естественных языков, эти правила достаточно строги. Любая мельчайшая ошибка приведет к тому, что код либо не запустится, либо будет работать некорректно.
Например, в Python нельзя написать my name = 5
с пробелом в имени переменной. Эти правила существуют не только в книгах, но и в головах конкретных программистов и разработчиков языка.
Часто весь свод правил существует в виде отдельного специального документа и называется спецификацией.
С другой стороны, языком программирования называют программу, которая запускает и компилирует наш код. Обычно ее называют средой выполнения.
Среда выполнения — это конкретное воплощение спецификации, поэтому ее иногда называют реализацией.
У конкретного языка может существовать несколько реализаций, в том числе эталонная реализация, на которую равняются все остальные. Различные реализации могут разрабатываться разными людьми и компаниями.
У Python нет выделенной спецификации, но есть эталонная реализация. Она называется CPython — это интерпретатор Python, реализованный на языке C. Если вы слышите разговоры про Python, то скорее всего имеется в виду именно эталонная реализация CPython.
Прочие варианты обычно имеют свои названия. Например, реализация языка для запуска программ на платформе .NET называется IronPython.
Python
Python — интерпретируемый язык программирования с сильной динамической типизацией. Разберем эти слова по отдельности.
Интерпретируемый язык программирования
Компьютеры не умеют читать программы на языке программирования. Они лишь исполняют машинный код, набор команд для процессора и других микросхем. Чтобы нашу программу смог выполнить компьютер ее нужно перевести на машинный код.
Существует два основных подхода в переводе: компиляция и интерпретация.
При компиляции весь код программы считывается, анализируется и переводится в машинный код. Так как код обрабатывается целиком, то это позволяет избегать многих ошибок в программе - они будут отловлены на стадии анализа. Но как недостаток, компиляция может длиться довольно долго. Пока программа не "соберется", результатов ее мы так и не получим. Языки C, Rust, Go это компилируемые языки.
При интерпретации, специальная программа интерпретатор, считывает и переводит код построчно, а не целиком. Такой подход позволяет сразу запустить программу и получать ее результаты, но об ошибке в коде мы узнаем лишь когда интерпретатор дойдет до строчки с ней. Языки Python, JS, Ruby, PHP это интерпретируемые языки.
В реальности все чуть сложнее. У Python и многих интерпретируемых языков есть частичная компиляция, а у компилируемых языков есть построчная компиляция схожая с интерпретацией. Но основное разделение все еще сохраняется
Процесс исполнения кода на Python выглядит так:
- Вы запускаете программу
- Интерпретатор открывает файлы программы и загружает из них исходный код
- Затем интерпретатор преобразует исходный код в байткод, проверяет ошибки синтаксиса и начинает исполнять по шагам
Сильная типизация
С точки зрения компьютера, программа и ее машинный код, это всего лишь набор команд. Он не делает различия между разными данными как числа и буквы, ведь это в конечном итоге выражается в двоичный код. Но для нас, людей, число и буква разные понятия. И в языке программирования их выражают по-разному. То какие значения данных существуют в языке и как они соотносятся друг с другом называется типизацией или типами данных.
Python — это язык с сильной типизацией. Это значит, что он не преобразовывает, без указания на это, значения одних типов в значения других. Или еще говорят, не приводит типы автоматически.
Другими словами, Python не даст сложить число со строкой. При попытке сделать что-то подобное мы получим ошибку. Python требует, чтобы любые преобразования типов были явными — программист должен явно использовать в каждом конкретном случае соответствующие функции-преобразователи.
Динамическая типизация
Есть языки, в которых интерпретатор производит проверку типов, доступности функций и переменных во время выполнения кода. Такие языки называются динамически типизированными. Если мы случайно ошиблись и вызвали несуществующую функцию, то ошибка всплывет только во время вызова этой функции.
В статически типизированных языках подобные ошибки отслеживаются раньше — на этапе анализа исходного текста без запуска кода на выполнение. Слово «статический» как раз означает, что программа не выполняется.
Обычно статическими проверками занимаются компиляторы, но существуют и специальные инструменты — статические анализаторы кода. Для некоторых языков с динамической типизацией такие анализаторы тоже существуют, но отслеживают значительно меньшее число ошибок.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.