Почему Python - не язык программирования будущего

Даже если он будет пользоваться большим спросом еще несколько лет...

АналитикаКодPython

Перевод "Why Python is not the programming language of the future".

IT-сообществу потребовалось несколько десятилетий, чтобы оценить Python. Но с начала 2010х годов он процветал. И в конечном счёте превзошел по популярности C, C#, Java и JavaScript.

Но до каких пор эта тенденция будет продолжаться? Когда же в конечном итоге Python будет заменен другими языками и почему?

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

Что делает Python популярным сейчас?

Успех Python виден в трендах StackOverflow, которые измеряют количество тегов в сообщениях на платформе. Учитывая охват StackOverflow, это довольно хороший показатель популярности языка.

статистика по языкам на StackOverflow

В то время как R стагнирует в течение последних нескольких лет, и многие другие языки находятся в постоянном упадке, рост Python кажется неудержимым. Почти 14% всех вопросов StackOverflow помечены тегом "python", и тренд идет вверх. И тому есть несколько причин.

Python - старый язык

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

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

В общем случае возраст языка не является его преимуществом. Достаточно вспомнить Algol и прочих дедушек. Также занятен пример таких языков как Perl, Delfi, Pascal - довольно популярные языки своего времени, с огромными сообществами и пакетными архивами. Тем не менее, ныне являются скорее экзотикой, чем мейнстримом.

Низкий порог вхождения

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

Python не заставляет указывать тип данных. Вы просто объявляете переменную; Python поймет из контекста: является ли она целым числом, числом с плавающей точкой, логическим значением или чем-то еще. Это огромное преимущество для начинающих. Если вам когда-либо приходилось программировать на C++, вы знаете, как это расстраивает, когда ваша программа не компилируется, потому что вы поменяли float на int.

И если вам когда-нибудь приходилось читать код на Python и C++, вы понимаете, насколько понятен Python. Несмотря на то, что C++ был разработан с учетом английского языка, это довольно сложное чтиво в сравнении с кодом на Python.

Он универсален

Поскольку Python существует уже долго, программисты уже написали пакет почти под каждую задачу. Сейчас вы можете найти пакет почти для всего.

  • Хотите работать с числами, векторами и матрицами? NumPy - ваш выбор.
  • Хотите сделать инжинерные или технические расчеты? Используйте SciPy.
  • Хотите стать большим специалистом в области обработки и анализа данных? Попробуйте Pandas.
  • Хотите начать с искусственного интеллекта? Почему бы не использовать Scikit-Learn.

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

Минусы Python — и будут ли они фатальными

Основываясь на истории IT, вы можете представить, как Python будет сидеть на троне из г-на многие века. Но, как и у любой технологии, у Python есть свои слабые стороны. Я пройдусь по самым важным недостаткам, один за другим, и оценю, являются ли они фатальными или нет.

Скорость работы

Python медлителен. Очень. В среднем для выполнения задачи на Python вам потребуется примерно в 2-10 раз больше времени, чем на любом другом языке.

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

Сомнительное утверждение. Оценка скорости выполнения задачи должна быть привязана к типу задачи. Как минимум, стоит помнить о разделении задач ввода-вывода и арифметико-логических.

Аналогично динамическая типизация как таковая не является причиной замедления работы.

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

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

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

Как следствие - структуры данных внутри Python и функции для работы с ними не были написаны безопасно для параллельных вычислений. Подробнее об этом - гуглите "GIL".

Ну и, само собой, никто не запрещает мультипроцессинг и асинхронное программирование...

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

Но в конце концов, ни один из вопросов скорости не имеет значения. Компьютеры и серверы стали настолько мощными и дешевыми, что мы говорим о долях секунды. Конечному пользователю на самом деле все равно, загружается ли его приложение за 0,001 или 0,01 секунды.

Область видимости переменных (scope)

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

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

Python попытался перейти к статической области видимости, но все испортил. Обычно внутренние области — например, функции внутри функций — могут видеть и изменять внешние области. В Python внутренние области могут видеть только внешние области, но не изменять их. Это приводит к большой путанице.

Господи, да за что? Разделять области видимости между несколькими функциями - в целом плохая идея: это усложняет код, путает! Если тебе внезапно приспичило таки изменить переменную из внешней области видимости - объяви её nonlocal и спокойно стреляй себе в ногу.

Лямбда-функции

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

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

Это различие между выражением и оператором является довольно произвольным и не встречается в других языках.

На самом деле, ограничений у лямбда-функций в Python куда больше.

Пробелы

В Python для обозначения различных уровней кода используются пробелы. Это делает его оптически привлекательным и интуитивно понятным.

Другие языки, например C++, больше полагаются на фигурные скобки и точки с запятой. Хотя это и не так привлекательно и удобно для начинающих, это делает код намного более доступным для обслуживания. Для больших проектов это гораздо более полезно.

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

Вот мы и добрались до фундаментального недостатка Python... пробелы... Почему они делают код менее поддерживаемым? Чем два синтаксиса для одного и того же лучше одного? К сожалению, автор не раскрывает этим тезисы.

Мобильная разработка

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

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

Но Python не был создан с учетом мобильных устройств. Таким образом, даже если это может дать приемлемые результаты для основных задач, лучше всего использовать язык, который был создан для разработки мобильных приложений. Примеры широко используемых фреймворков для мобильной разработки на других языках: React Native, Flutter, Iconic и Cordova.

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

Ошибки во время исполнения

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

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

Какие языки программирования могут заменить Python и когда

На рынке языков программирования появилось несколько новых конкурентов:

  • Rust предлагает тот же вид безопасности, что и Python — никакая переменная не может быть случайно перезаписана. Но она решает проблему производительности с помощью концепции собственности и заимствования. Это также самый любимый язык программирования за последние несколько лет, согласно Stackoverflow Insights.
  • Go отлично подходит для начинающих, как и Python. И это настолько просто, что даже проще поддерживать код. Забавный факт: Go разработчики - одни из самых высокооплачиваемых программистов на рынке.
  • Julia - это очень новый язык, который конкурирует с Python. Он заполняет пробел в крупномасштабных технических вычислениях: обычно используется Python или Matlab, и все это ускоряется с помощью библиотек C++, которые необходимы в больших масштабах. Теперь можно использовать Julia вместо того, чтобы жонглировать двумя языками.

Хотя на рынке есть и другие языки, Rust, Go и Julia - это те, что исправляют слабые места Python. Все эти языки преуспевают в технологиях будущего, особенно в области искусственного интеллекта. Хотя их рыночная доля все еще невелика, что отражается в количестве тегов StackOverflow, тенденция для всех них очевидна: вверх. Диаграмма популярности Go, Rust и Julia с 2009 по 2020 год:

статистика по языкам на StackOverflow

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

Какой из языков это будет - Go, Rust, Julia или новый язык будущего - пока сказать трудно. Но учитывая проблемы производительности, которые являются фундаментальными в архитектуре Python, один из них неизбежно займет свое место.

Фото Асинхронность и очереди в распределённых системах
Асинхронность и очереди в распределённых системах

Немного примеров работы с асинхронностью в распределённых системах

Фото История typeof null в JavaScript – ошибка, необходимая для обратной совместимости
История typeof null в JavaScript – ошибка, необходимая для обратной совместимости

В JavaScript есть множество исключений и просто забавных подходов к преобразованию типов. Про "один из них" и хочется рассказать.