На прошлой неделе интегрировал наши замечательные автотесты не только нам, но и команде тестирования и задумался. А правильно ли я изначально сделал выбрав Python в качестве языка для реализации системы? Мне видится ряд плюсов и минусов, ну и некоторые дополнительные мысли созрели.
Плюсы
В качестве главного плюса этого выбора выступает простота самого языка и, как следствие, требованию к уровню разработчика необходимого для вхождения в проект очень низкие.
Динамическая природа языка способствует экспериментам в REPL и облегчает поиск оптимального решения.
Язык очень емкий, что сильно сокращает объем код и позволяет в пару строк написать очень не тривиальные для многих других языков вещи.
Огромное количество библиотек на все случаи жизни позволяет сосредоточиться на задаче, а не инструменте.
Ряд отличных IDE, например PyCharm, сильно облегчают разработку.
Минусы
Надо признать, хотя минусов в Python практически нет, те что есть сильно осложняют жизнь.
Первая и наверное основная проблема – это многострадальный GIL и растущие из него сложности. Асинхронное однопоточное приложение хоть и решает все поставленные задачи, но никак не попадает в разряд легких в поддержке решений. В следствии чего, найти кого можно привлечь к развитию ядра приложения довольно сложно.
Вторая, но очевидная с самого начала багофича – динамическая типизация. Как и следовало ожидать, за возможность экспериментов на лету приходится платить. Каждая функция начинается с развесистого описания типов параметров и возвращаемых значений. Позволяет ли какой-либо динамически типизируемый язык этого избежать? ХЗ.
Итого
Все это, заставило меня задуматься на тему того, что же я хочу получить. Во-первых, мне нужен простой в изучении, динамически типизированный язык программирования с низким порогом вхождения. Во-вторых, к нему должны быть легко доступны библиотеки на все случаи жизни либо бесшовная интеграция с какими-либо другими языками, уже это имеющими. В-третьих, у него должна быть мощная IDE (тут я не о себе пекусь, просто необходимо обеспечивать легкую поддержку решений). В-четвёртых, он должен уметь работать с сетью и поддерживать как параллельную так и асинхронную модели приложений. В-пятых, у языка должен быть продвинутый REPL.
Что подходит под описание симптомов пациента? Из того что мне приходит на ум (Clojure, Erlang) – все не проходит пятипунктовый фильтр.
По многим пунктам не пройдет, но может быть Go?
Я подумывал о нем, но, честно говоря, я в нем не вижу ничего такого, чего бы не мог предложить C++14 в связке с BOOST.
По моему мнению, для “быстрых” проектов с нечеткими ожиданиями наличие у языка REPL является критичным требованием.
К сожалению нет замены Python
Я бы тоже хотел иметь легкий язык , обширный набор библиотек и при этом статическую типизацию.
Между прочим Swift от Apple вполне себе тянет на такой язык, был бы он только кросс-платформенным и открытым
Нельзя все и сразу ,увы.
Вообще для Python не все так плохо.
Можно налепить декораторов для проверок типов: https://code.activestate.com/recipes/572161/
Есть http://www.mypy-lang.org/ для статической проверки типов.
Да я вроде уже разобрался с тем, как жить с динамической типизацией. Она, безусловно, привносит проблем, но не очень много и в ней есть куча плюсов. А вот GIL – совсем другое дело; и обойти его никак и исчезновение его из языка обозримом будущем не предвидится.
Я на самом деле не помню что серьезно сталкивался с проблемами GIL.
Если это простые скрипты для сценариев то как бы GIL не должен быть проблемой.
Есть sub-interpreter который может решить ряд проблем.
А если это система требующая параллельной обработки событий? Вот тут и стучится серея полярная лисичка. В принципе, Twisted более-менее помогает решить проблему, только вот решение получается не очень тривиальным. А не тривиальное решение губит главный плюс Python – необычайную простоту и легкость вхождения.
То что вы описали похоже на Groovy. Если пункт про динамическую типизацию не супер критичен, то я бы посмотрел лучше на Scala. Сам создатель Groovy когда-то сказал, что если бы ему показали Scala, он не стал бы изобретать свой язык.
Писать на Scala не сложнее, чем на Groovy, за счет автоматического вывода типов, зато код из коробки получается быстрым + компилятор поможет найти некоторые ошибки еще во время компиляции. Несмотря на то, что Scala компилируемый язык, на нем можно писать и скрипты ( #!/usr/bin/env scala …). Из недостатков Scala наиболее существенным является тот, что для программирования на нем нужен нормальный современный проц и памяти побольше (если есть MacBook Pro, пойдет), иначе компилируется долго.
Сам сейчас активно раскуриваю скальный Play Framework и считаю что это лучший из всех известных мне веб-фреймоворков, а известно мне их немало. В DevZen Podcast 0007 можно послушать поподробнее как я его расхваливаю.
Ты знаешь, я уже смотрел на Scala и остался очень не доволен. Кроме того, что уровень вхождения в язык высок, код получается в стиле “написал и забыл”, а если требуется какая-то поддержка, то все, приехали.
Поэтому, если брать экзотику, то я бы остановился на Clojure, который в разы роще и при этом имеет отличный REPL с компиляцией на лету.
А вот Groovy, наверное, действительно стоит глянуть, спасибо!
А в питоне есть нормальные корутины или до сих пор нет?
Если таки появились, то ничего сложного для использования Twisted быть не должно.
Извини, что с запозданием заметил эту тему. Имхо, требованием по поводу поддержки IDE ты вырубаешь практически весь не мейнстрим
И, если честно, я не понял, почему Erlang не подходит (нет IDE?).
Если не лень смотреть на экзотику, то есть еще такие вещи, как Ch (https://www.softintegration.com/) — это, практически, интерпритатор подмножества C/C++, Pike (http://pike.lysator.liu.se/) — вроде как начал свою жизнь как скрипт для игр, но вырос до более серьезных вещей, Falcon (http://www.falconpl.org/) — вроде как создавался для управления оборудованием, но тоже затем вырос во что-то большее.
Javascript?
for me it’s – Java (Domain & JavaFX for UI) + JavaScript (Nashorn, jjs for REPL and scripts)
Слишком тяжелое решение. Java – это второй уровень, если Python по каким-то причинам не подошел. Как-то так: https://sysdev.me/how-to-select-programming-language/
А как насчёт DLang?
Хороший (внешне) но мертворожденный язык.