Я тут опять
записался в подкасте и затеял спор о популярном заблуждении.
Мол, прогресс в языках вещь достаточно условная, и если взять ассемблер и много времени, можно сделать все то же самое, но прямо в машинных кодах. Это верно, что программа в конечном счете будет в него транслироваться через много промежуточных слоев, и в конечном счете до ассемблера любая сколь угодно высокоуровневая программа прослеживается. Кажется, что если достаточно долго посидеть (полжизни, допустим), можно что угодно из сегодня существующего софта воспроизвести на asm-е. Я даже с этим, допустим, с этим соглашусь. Что неверно, так это делать вывод, что все современные языки функционально эквивалентны ассемблеру. Это упускает саму суть абстракций.
Человек существо весьма ограниченное в возможностях. Языки программирования - инструмент написания программ ровно в том же смысле, что и отвертка, и стремянка - инструменты. Рукоятка отвертки сделана таким образом, чтобы именно человеку, с его строением кисти и пятью пальцами, было удобно ее держать. Для осьминога отвертка выглядела бы по-другому. Роботы на заводе закручивают болты тоже не отверткой из строймагазина.
Так вот, языки программирования, как инструмент, сделаны таким образом, чтобы человеку, конкретному биологическому виду с вполне конкретным строением мозга, было удобно возможно с ним работать. И тут выясняется, что это конкретное биологическое существо медленное и невнимательное до невозможности. Соответственно, размер программы ограничен не временем, которое существо просидит за клавиатурой, а ее сложностью. Для компьютера нет никакой проблемы жонглировать шестьюстами мутабельными переменными в произвольном порядке. Для человека - есть. Человек запутается и ошибется, и это не ограничение компьютера, языки вообще не ограничены возможностями со стороны компьютера. Это ограничение человека. Он не смог отдать правильную команду, причем даже не в реальном времени, а в спокойной обстановке, заранее, с произвольно большим временем на подумать.
И это все приводит нас к идее о наращивании уровней абстракции. Чтобы количество деталей в каждый момент времени помещалось человеку в голову, вводится новый уровень, на котором целые кластеры деталей собираются и прячутся «под капот». Классно. Работает. Это и есть прогресс. Каждый следующий уровень позволяет строить качественно новые и/или бо́льшие системы. Структурное программирование, управление памятью, реляционная модель, символьные вычисления, модель акторов, иммутабельность и так далее.
Засада в том, что каждый следующий уровень абстракции должен быть качественно новым, универсальной формулы свертывания нет и два раза она не работает. Поэтому появляются уровни редко. Плюс тратится куча времени и сил на то, чтобы осознать их важность.
Вернемся к исходному постулату. Человеку дали ассемблер, у него куча времени, здоровья и нет проболем с мотивацией. Если он будет писать просто на ассемблере, он очень быстро упрется в предел своих способностей. Напомню, у нас в гостях не абстрактный всемогущий мозг в банке, а обычный программист (или сколь угодно большая группа программистов), у которых есть биологические пределы. Как бы им ни хотелось, но предел сложности реален и хорошо ощущается, и он не сдвигается лозунгами вроде «будем сильнее стараться» или «просто подольше посидим». Если им захочется пойти дальше, им придется повысить уровень абстракции.
Теперь внимание: они могут либо воспользоваться одним из уже известных способов, которые они наблюдали в существующих языках, либо придумать что-то качественно новое. Поскольку мы говорим об обычных людях и вообще об эксперименте на применимость ассемблера, а не о передовых исследованиях в Computer Science, считать, что они изобретут качественно новый способ повышения абстракции повода нет. Значит, чтобы повторить существующий софт на ассемблере, нашим героям придется сделать себе инструменты по образу и подобию того, что мы уже знаем, и писать уже на них. Что и требовалось доказать. (Замечу, что речь не идет о создать в точности условный Хаскель, а скорее о том, чтобы повторить идею Хаскеля. Хаскель как реализация в этом контексте не несет ценности, а как идея - несет. Если она там, конечно, есть - ну или подставьте вместо него любой другой язык с идеей).
Sanity check. Эксперимент кажется абстрактным, но в реальности он ставится каждый день. Софт, написанный на языках с маленьким набором абстракций, существует, его полно, есть очень большой, есть даже ультрасложный, и даже его можно сказать что много. Язык не ассемблер конечно, но близко - C и C++, на которых тебе и браузеры, и ОС, и игры, и БД. Все это миллионы строк. И это как раз тот случай, когда недостатки языка разработчики вынуждены компенсировать прямо в проекте, чтобы хоть куда-то продвинуться. В каждом из таких проектов есть все давно знакомые нам способы борьбы со сложностью, только свои, кривые, наколенные, родные.