Когда С Точки Зрения Дарвина Появится Следующий Большой Язык Программирования?

Хорошие новости всем! Футурама Следующего большого языка программирования не предвидится.

По крайней мере, с точки зрения теории эволюции для этого нет оснований.

«Эволюция работает не только в животном мире, но и в любой подходящей среде.

Эта идея впервые получила широкое распространение после публикации книги Ричарда Докинза.

«Эгоистический ген» в 1976 году.

Там был введен знакомый всем термин "мем" , как пример эволюции в социальной и культурной среде.

Языки программирования также развиваются.

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



Когда с точки зрения Дарвина появится следующий большой язык программирования?

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

Кажется, выполнение этих требований к языкам программирования вполне очевидно.

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



Когда с точки зрения Дарвина появится следующий большой язык программирования?

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

Джеймс Гослинг создал Java, Гвидо Ван Россум создал Python, а Керниган и Ричи создали C. Однако на практике они реализуют механизм вариативности лишь путем сборки чего-то нового из «генов» языков программирования.

Никто не способен заставить весь мир развиваться, например, на ABAP, что, однако, не умаляет заслуг авторов.

Чтобы понять, когда появится следующий большой язык программирования, стоит ознакомиться с принципом острова.

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



Вымирание и гены

По аналогии с устной речью будем считать вымершими те языки, которые в настоящее время никто не развивает. Даже если компиляторы для этих языков существуют, программы, написанные на них, можно запускать, а некоторые «историки программирования» все равно могут писать на них новый код. Всем известно, что предками языков C (1972) и Pascal (1970) были B (1969) и Algol (1958-68), которые смело можно считать вымершими.

Сказать, что язык Б забыт, потому что он «стар», неверно.

Лисп (1958) старше, и его диалекты все еще используются, как и название самого языка.

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

Давайте посмотрим на пример кода в B из оригинала.

руководства по языку.

Согласитесь, это не так уж и далеко от современного C:

   

main() { extrn putchar, n, v; auto i, c, col, a; i = col = 0; while(i<n) v[i++] = 1; while(col<2*n) { a = n+1 ; c = i = 0; while (i<n) { c =+ v[i] *10; v[i++] = c%a; c =/ a--; } putchar(c+'0'); if(!(++col%5)) putchar(col%50?' ': '*n'); } putchar('*n*n'); } v[2000]; n 2000;

Есть причина, по которой B и подобные ему языки забыты: ген структуры данных.

Единственное, что отличает Си и Паскаль от своих предшественников, — это наличие конструкций «struct» и «record».

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

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

О том, как проводились такие расчеты, рассказано в одной из глав книги.

«Конечно, вы шутите, мистер Фейнман!» .

Разумеется, именно Пентагон стал заказчиком нового инструмента для выполнения расчетов – компьютера, первый из которых был выпущен в 1946 году (ENIAC).

Для проведения физических расчетов вам понадобятся скаляры, векторы, матрицы и простая программа.

Долгое время таких инструментов было достаточно для решения всех насущных проблем.

Именно это было реализовано в языке Фортран (1957 г.

), и даже в издании 1977 г.

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

Другие языки того времени были построены на тех же принципах.

Появлению C мы обязаны появлению нового класса задач — системного программирования.

Необходимость создания операционных систем, требующих в своем развитии «нематематических» структур данных, привела к тому, что язык прижился и жив-здоров.

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

Пожалуй, только Фортран сохранил свою актуальность до наших дней, а затем в 1990 году к нему наконец-то добавились структуры данных.



Конвергентная эволюция

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

Например, крылья есть и у птиц, и у летучих мышей.

Более того, птицы – это птицы, а летучие мыши – млекопитающие.

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

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

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

Аналогичную ситуацию можно увидеть между Windows 1.0 (1985 г.

) и node.js (2009 г.

).

В случае с Windows 1.0 была решена проблема обеспечения одновременной асинхронной работы одного пользователя со многими приложениями, в node.js — многих пользователей с одним приложением с помощью асинхронных операций ввода-вывода.

Поскольку обе системы основаны на однопоточной модели выполнения, они пришли к одному и тому же решению — циклу обработки очереди сообщений.

Неудивительно, что обе реализации имеют тенденцию зависать и требовать перезагрузки.

В node.js концепция сторожевого таймера обычно считается нормой и само собой разумеющейся.

В то же время решение той же проблемы, основанное на вытесняющей многозадачности, лишенное детских проблем «зависания» всей системы, было реализовано как в операционных системах UNIX (1969 г.

), так и в программировании — Erlang (1986 г.

).

Причинами, по которым авторы node.js решили изобрести велосипед, были, вероятно, те же причины, по которым после Паскаля появился C — несовместимость американской и европейской школ программирования.

Кстати, в том же 2009 году появился язык программирования Go, решающий проблему массовой многозадачности гораздо более надежным способом — "идти по рутине" .

Фактически, он реализует тот же принцип облегченной многозадачности, что и Erlang.

Слепая эволюция

«эволюция слепа, и процесс эволюционного развития не предполагает построения «идеальной архитектуры» или «полного рефакторинга».

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

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

Однако эволюция так не работает — она никогда не переделывает существующие решения с нуля, а лишь улучшает то, что есть.

Более подробно о процессе эволюции зрения описано, например, в книге «Что, как и почему мы видим на самом деле» .

Как и язык Си.

С момента своего создания он менялся и расширялся, но никогда не подвергался полной переработке.

Теперь мы имеем дело с монстром C/C++.

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

При этом он полон сил, активно развивается и вообще кипит здоровьем.

Другой пример — Java. Начиная с первой версии, в язык были включены примитивы многопоточного программирования.

«Синхронизированный» дизайн, поддержка блокировки на уровне любого объекта и, простите, «Хеш-таблица».

И это преподносилось как решение проблем многопоточного программирования, объявили, что Java «параллельная», и выпустили ее.

Сейчас очевидно, что разработка многопоточного кода должна основываться на принципах «stateless» и «неизменяемости», что для «параллелизма» необходимыми специализированными структурами данных являются «ConcurrentHashMap», а блокировки следует использовать только в крайних случаях.

или конкретные ситуации.

Увы, фарш не вернуть обратно.

«Hashtable» останется в Java навсегда, и необходимость объяснять каждому новому разработчику, почему им следует использовать «StringBuilder», а не «StringBuffer», — это крест, который несет все сообщество Java. В примере с Java важно, что такие «атавизмы» на самом деле никак не влияют на «живучесть» языка программирования.

Все вышеперечисленные проблемы были исправлены в .

Net с самого начала, и кого это волнует.

Островной принцип

Новые виды наиболее активно появляются в новых изолированных средах.

Такой средой может быть как остров в прямом смысле слова – Ява и ее маленькие олени или Мадагаскар с лемурами, так и озеро – например, Байкал и его прозрачная голомянка.

Континент Австралия с его сумчатыми животными также является островом в эволюционном смысле.

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

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

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

Никаких разумных предпосылок для этого не было.

Разработка Java началась в 1991 году (тогда язык назывался Oak).

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

В общем, это неудивительно, поскольку Java разрабатывалась в недрах «железной» компании Sun Microsystems, поэтому разработка языка для встраиваемых систем там была вполне логичной.

Но в 1993 году появился первый браузер Мозаика , и это все изменило.

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

Никто не знал, что и как это сделать.

И здесь в 1995 Технология Java была представлена миру.

Правда, по сегодняшним меркам технология была так себе.

Ирония в том, что Java изначально позиционировался как язык программирования на стороне клиента, поэтому Апплет - технология встраивания в браузеры, окончательно уничтоженная только в 2015 году и браузер обреченный с рождения ГорячаяJava .

Java стала одним из основных серверных языков программирования, вопреки замыслу авторов.

Справедливости ради надо сказать, что для этого были веские причины.

В 1990-е годы, когда решали, разрабатывать ли серверную логику на C++ или Perl, любая альтернатива этим двум казалась лучшим выбором.

И как технология Java-серверов оказалась настолько хороша, что уже в 2002 он был скопирован Microsoft. Между тем, в том же 1995 JavaScript появился в том же году.

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

Справедливости ради следует добавить, что в то же время в 1995 году PHP появился и занял экологическую нишу бурного развития.

В целом эпоха Интернета крайне благотворно повлияла на развитие языков, начинающихся на букву «П».



Острова предназначены не только для языков программирования

Конечно, Интернет — не единственный оставшийся остров.

Окружающая среда меняется, и регулярно появляются новые доминирующие виды.

Просто это не языки программирования, а что-то другое.

Хорошим шансом для появления нового массового языка программирования стало появление смартфонов.

Но этого не произошло.

Apple по инерции применила его в iPhone( 2007 ) Цель-C ( 1984 ), а Google — Java в Android ( 2008 ).

Появление нового рынка было слишком горячим фронтом противостояния, чтобы отвлекаться на эксперименты (см.

«Как Apple и Google поссорились» ).

Да, конечно есть Swift, но о нем мы вспомним чуть позже.

Где-то в этом районе появился еще один остров 2009 лет, когда все начали добавлять в веб-приложения поддержку WebSocket для обновления данных на странице в режиме реального времени.

Так появились Node.js и Go, а Erlang снова появился на радаре.

Но несмотря на технологическое превосходство Go над Node.js и привычную семантику по сравнению с претенциозным Erlang, Go так и не стал лидером, как и никто из его «коллег».

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

А совсем недавно туда добавился еще один конкурирующий обитатель — Эликсир ( 2012 ), адекватный синтаксис и исполнение в среде Erlang. Остров Интернета вещей — компьютер размером с кнопку, работающий на солнечной энергии и способный работать Рок , это правда.

Сейчас умные часы в тренде, и это дает шанс новым операционным системам, таким как Tizen, завоевать популярность.

Остров машинного обучения в основном населён C++ и Python, немного Java и иногда Lua ( 1993 ) и, конечно же, R ( 1993 ).

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



Генная инженерия языков программирования

Мейнстримные языки программирования за время своего развития накопили багаж негативных моментов, которые хотят исправить.

Периодически предпринимаются попытки искусственно переломить ситуацию и создать «в пробирке» замену языкам, «выращенным в дикой природе».

Однако никаких нарушений законов эволюции пока не наблюдалось.

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

Apple выпустила Swift, чтобы заменить Objective-C в 2014 .

Похоже, дела в этом направлении идут хорошо, но ожидать чего-то большего нет оснований.

JetBrains устроила локальную революцию с Kotlin в 2011 , решив переписать под него IDEA и заодно избавить весь мир от NullPointerException. Это пока не помогло.

Google громко объявил Dart как «Убийца JavaScript» в том же 2011 году.

Криминала, правда, не произошло, как и нативной поддержки Dart в браузерах.

Dart и TypeScript в целом ( 2012 ) прекрасно живут и компилируются в JavaScript, но свергнуть короля веба им не удалось, хотя и существенно потеснили его в разработке крупных проектов.

Mozilla решила переписать Firefox на Rust ( 2010 ).

Расширение системы типов для многопоточности интересно, а все остальное в Rust выглядит солидно.

Есть одна загвоздка — на Go худо-бедно уже можно найти живые приложения, а вот для Rust решения пока нет. Основное обновление Python 3, нарушающее обратную совместимость, было создано в 2006 и называется Python 3000. Первый выпуск был выпущен в 2008 .

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

Если с Python дела обстоят более-менее серьезно, то инициативу Perl 6 уже можно считать шуткой.

Начав разработку в 2000 , с целью заменить Perl 5 ( 1994 ), Perl 6, кажется, вышел в 2015 году.



Следующего большого языка программирования не предвидится.

Похоже, что это так.

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

Возможно, это не так уж и плохо.

Отсутствие новостей - хорошая новость.

Если вы планируете начать изучать JavaScript, Java, C#, Python или PHP, это того стоит. Мейнстримовые языки с нами всерьез и надолго, и их знание всегда пригодится.

В то же время новые языки вроде Rust или Go тоже имеют перспективы, возможно, не как замена всему, а как инструмент для решения интересных задач.

Дмитрий Мамонов Департамент развития, Слияние подразделений, чтобы освоить, Гит-отдел, Оператор консоли Bash с пробегом Теги: #wrike #программирование #история ИТ #языки программирования #языки #JavaScript #программирование #java #C++

Вместе с данным постом часто просматривают: