Язык(и) программирования будущего
У меня есть личный профиль на Quora, и мне нравится читать вопросы и ответы, связанные с программированием. Советую вам делать то же самое, потому что из опыта других программистов можно извлечь пользу для себя. Как бы то ни было, в последнее время я встречаю примерно следующие вопросы:
- Какая технология придет на смену JavaScript?
- Есть ли у Kotlin шанс заменить Java?
- Заменит ли Rust язык C++?
- У какого языка на замену C, если выбирать между D, Go и Rust, самые большие перспективы?
Особенно мне нравится последний вопрос, потому что человек, задавший его, настолько убежден в бесславном конце C, что привел готовые альтернативы. Мне кажется, что подобные вопросы стали возникать чаще, чем раньше, с момента публикации академического документа Energy Efficiency across Programming Languages: Как соотносятся энергия, время и память». (При желании можно ознакомиться с текстом здесь). Полагаю, все эти вопросы по факту сводятся к одному: каким будет язык (или языки) программирования будущего? Сегодня, опираясь на результаты из упомянутого выше документа и анализируя иную статистическую информацию, мы попытаемся разобраться в этом вопросе. Но прежде, чем начать, я хочу уверить вас, что буду максимально объективен, поскольку не хочу выдавать желаемое за действительное. Давайте начнем с самого главного: того самого документа.
Документ
Если вы все-таки дочитали до этого места, я почти уверен, что вы видели таблицу, приведенную ниже:
Я видел ее слишком много раз. Куча людей делились ею в различных социальных сетях, и не осталось ни одного человека, который бы не знал эту таблицу. Однако перед тем, как мы углубимся непосредственно в результаты, я хочу кое-что рассказать.
Прежде всего, следует задуматься о том, как измерялись перечисленные в таблице показатели. Как правило, для измерения производительности процессоров применяются бенчмарки. Для оценки языков программирования авторы написали свои бенчмарки из 10 разных задач, при этом для их решения был использован один и тот же алгоритм, приведенный в Computer Language Benchmark Game.
Кроме того, языки программирования были распределены по категориям на основании их парадигмы:
Тем не менее, для тестов производительности парадигма не имеет принципиального значения. Важен тип языка программирования: компилируемый, интерпретируемый или работающий в виртуальной машине. Между ними существует четкая разница в производительности и энергопотреблении. Поэтому каждый язык оценивался в своём классе — это правильное решение.
Следующий шаг — проведение тестов CLBG. Авторы поделились результатами нескольких испытаний. Давайте посмотрим на них.
Энергия измеряется в джоулях, время — в секундах. Коэффициент — это пропорция между энергией и временем, она позволяет вычислить приблизительную энергоемкость языка. Помимо этого, возле каждого языка изображены стрелки вверх и вниз. Стрелка с одинарной линией показывает, на сколько ступеней вверх/вниз продвигается данный язык программирования, если упорядочить таблицу по времени выполнения. Стрелка с двойной линией — то же самое, но упорядочить таблицу предлагается по пиковому объему потребляемой памяти.
Когда я впервые увидел таблицу, представленную выше, в социальных сетях, я подумал, что сортировкой по времени выполнения почему-то пренебрегли. Оказывается, авторы ее указали только для ряда репрезентативных тестов. К примеру, в тесте с бинарным деревом C, C++ и Rust дали наилучшие результаты, но с точки зрения памяти Rust показал несколько худшую производительность. С другой стороны, то же самое относится к C в бенчмарке fannkuch-redux. Так что не всё так однозначно.
В свою очередь, бенчмарк fasta демонстрирует уже совсем другие цифры. Показатели производительности становятся размытыми и нечеткими. Для получения более-менее полной картины стоит рассматривать результаты всех тестов вкупе.
Единственное, что мне понравилось в этой работе, так это то, что авторы сравнивали языки, принимая во внимание класс, к которому они относятся, так что можно сопоставить компилируемые и интерпретируемые языки внутри их собственных классов. Результаты этих 3 тестов приведены ниже.
Мне не хотелось бы перечислять здесь все подробности и частности, рассмотренные в этом документе. Если вы захотите ознакомиться с ней, у вас есть ссылка, и вы сможет сами его прочесть. Как бы то ни было, перед нами итоговая таблице результатов:
Язык C в итоге кажется наилучшим с точки зрения энергопотребления и производительности, но проигрывает по использованию памяти. Впрочем, даже в отношении памяти он совсем не плох. Далее следуют Rust и C++. Можно сказать, что C и Rust являются лучшими языками программирования в ми. Минуточку! Они же не поддерживают объектно-ориентированное программирование. (Вы могли бы подумать, что Rust поддерживает ООП, но фактически в нем есть только интерфейсы (вернее, трейты), но не вся ООП-структура). Тем не менее, в организациях, как правило, активно используется ООП, не говоря уже о важности удобства использования языка. C, C++ и Rust не так уж просты, они заставляют думать о времени жизни объектов, динамическом распределении и т.д.
Итак, что мы узнали? Нам удалось сравнить языки с точки зрения их энергопотребления, требований к памяти и времени, необходимого для завершения процесса. Тем не менее, нельзя на основе только этих данных решить, какой язык лучше. Если же добавить еще больше метрик, результаты станут слишком сложными для понимания.
В связи с этим я хочу внести изменение в эту концепцию: предположим, что люди очень логичны. В экономических исследованиях принято исходить из этого предположения, несмотря на то, что люди не так уж и логичны. Но допустим, что мы очень последовательны и разборчивы. В таком случае, как выбрать самый лучший язык? Путем анализа тенденции использования тех или иных языков программирования. Как можно ее измерить? В виртуальном пространстве пишется огромное количество кода, и большая его часть хранится в приватных репозиториях. Может быть, стоит проверить статистику поисковых систем, поскольку известно, что все разработчики пользуются поиском, когда сталкиваются с проблемами в своем софте? Давайте попробуем.
Статистика Google
Статистические инструменты Google открыты для всех желающих. Я использовал их, чтобы узнать статистику поиска Google по языкам программирования, но столкнулся с ограничениями: можно получить данные только по 5 ключевым словам. Итак, давайте начнем с 3 лучших языков по результатам приведенных выше тестов, а заодно прибавим к ним Java.
Похоже, Java по-прежнему используется чаще, чем другие компилируемые языки, хотя показатели значительно снизились. C и C++ идут вплотную друг к другу. А вот Rust оказался на самом дне. Возможно, это связано с тем, что это новый язык, но справедливости ради следует отметить, что Rust нов лишь на фоне C и C++. Он вышел в июле 2010 года. Прошло почти 12 лет, и с тех пор не произошло никаких заметных изменений. Результаты этой статистики сильно отличаются от тех, что мы видели ранее. Давайте теперь возьмем Java и еще 4 языка: Kotlin, Javascript, Python и Go.
В очередной раз ситуация меняется, мы видим совсем другую картину. Python начал с низов, но сейчас это самый востребованный язык. Java и JavaScript занимают почетное второе место. Теперь Python — безусловный чемпион, но мне хочется провести еще один раунд.
Кажется, у нас есть победитель: это Python! Несмотря на это, необходимо соблюдать максимальную объективность, а мы проанализировали статистику лишь одной поисковой системы. Конечно, это одна из самых распространенных поисковых систем в мире, но результаты в других поисковиках могут существенно отличаться. Впрочем, проводить один анализ за другим и объединять результаты мы не будем, это займет слишком много времени. Благо, что есть компания, которая сделала это за нас.
Индекс TIOBE
TIOBE — это компания, специализирующаяся на оценке и отслеживании качества программного обеспечения. Чтобы узнать о ней больше, посетите их сайт. Их главная услуга — проверка качества кодовой базы программного обеспечения. Они создали показатель под названием TQI (TIOBE Quality Indicator), и ниже приведен пример его использования.
Компания создала индекс языков программирования под названием TIOBE index. С его помощью можно оценить успешность языков программирования на основе трендов поисковых систем, при этом учитываются практически все релевантные поисковые системы. Более подробно о том, как рассчитывается индекс TIOBE, можно прочитать здесь.
На основании этого индекса ниже я приведу актуальные результаты:
Это очень похоже на то, что мы видели в трендах Google. Правда, здесь язык C занимает второе место по распространенности, что оказалось весьма неожиданно. Кроме того, здесь есть исторический график успешности разных языков программирования:
Ясно, что Java долгое время доминировал в этой среде наряду с С. Однако Python набирает все большую популярность и выходит в лидеры. Здесь следует обратить внимание на один важный момент: Тенденции постоянно меняются. Java был первым, но теперь его место занял Python, хотя до 2010 года о нем мало кто слышал. В этой связи возникает вопрос, как можно оценить будущий потенциал языков программирования?
Оценка потенциальных возможностей
В последние 10 лет машинное обучение и искусственный интеллект стали очень популярны. Язык Python оказался наиболее оптимальным для подобных операций, поскольку в нем есть хороший API для языка C, а если вам нужна производительность, можно комбинировать его с C и C++. В этом направлении Python стал самым используемым языком в мире согласно поисковым трендам и индексам.
Однако это не означает, что Python сохранит свое место. Некоторые другие языки могут показать лучшую производительность, чем Python, и вытеснить его. Например, возьмем язык Rust. Amazon и Facebook заявили, что они начали использовать Rust для разработки своих внутренних инструментов CLI (интерфейс командной строки). Кроме того, ядро Linux, начиная с версии 6.1, включает Rust. Это очень значительный объем поддержки для языка программирования, и, мы видим, всего за год он поднялся с 26-го места на 20-е.
Но главный вопрос все еще остается без ответа. Как же нам предсказать будущее?
Ответ
Прошу прощения, что заставляю вас читать эти строки, но данный вопрос не имеет смысла. Мы не политики, никто не платит нам деньги, чтобы мы поддерживали технологические тренды.
Зачем же мы это делаем? Фанатично поддерживаем язык или какую-то технологию? Универсальный ответ: потому что мы ленивы. Мы изучаем язык программирования или технологию, затем формируем зону комфорта в рамках этих инструментов. А потом не хотим менять их, чтобы не выходить за пределы зоны комфорта. Люди, которые слишком фанатично поддерживают C и C++, делают это потому, что они не хотят учить новый язык, например, Rust, с нуля. Люди, которые чересчур рьяно выступают за Rust, делают это потому, что не хотят учить C и C++, так как они сложноваты и в них есть много вещей, с которыми нужно быть осторожным. Я думаю, что оба эти подхода ошибочны и неправильны, и мы не должны совершать эту ошибку.
Языки программирования — это всего лишь инструменты, вроде отверток. Если вам потребуется отвертка с шестигранной головкой, вы не станете заставлять себя работать отверткой с крестовым наконечником. Вы примете решение в соответствии с ситуацией. Если у вас есть возможность выбрать тип самореза, то вы будете учитывать структуру стены. Возможно, в зависимости от ситуации вам понадобится изолента или что-то еще. Инженер должен продумывать оптимальное решение в соответствии с поставленными требованиями.
Если говорить кратко, не существует какого-то универсального языка программирования, который заменил бы все остальные. Есть только требования обстоятельств, и вы должны использовать правильный инструмент, исходя из этих требований. Вот и все.
В силу своей специализации, я обычно использую C, C++, Rust и Python. У меня нет достаточного опыта, чтобы говорить о других языках, но я могу дать вам примерный анализ плюсов и минусов языков, которые я использую. Об этом я написал еще одну статью.