Никита Прокопов (tonsky) wrote,
Никита Прокопов
tonsky

Categories:

Первобытное общество

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

Мол, прогресс в языках вещь достаточно условная, и если взять ассемблер и много времени, можно сделать все то же самое, но прямо в машинных кодах. Это верно, что программа в конечном счете будет в него транслироваться через много промежуточных слоев, и в конечном счете до ассемблера любая сколь угодно высокоуровневая программа прослеживается. Кажется, что если достаточно долго посидеть (полжизни, допустим), можно что угодно из сегодня существующего софта воспроизвести на asm-е. Я даже с этим, допустим, с этим соглашусь. Что неверно, так это делать вывод, что все современные языки функционально эквивалентны ассемблеру. Это упускает саму суть абстракций.

Человек существо весьма ограниченное в возможностях. Языки программирования — инструмент написания программ ровно в том же смысле, что и отвертка, и стремянка — инструменты. Рукоятка отвертки сделана таким образом, чтобы именно человеку, с его строением кисти и пятью пальцами, было удобно ее держать. Для осьминога отвертка выглядела бы по-другому. Роботы на заводе закручивают болты тоже не отверткой из строймагазина.

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

И это все приводит нас к идее о наращивании уровней абстракции. Чтобы количество деталей в каждый момент времени помещалось человеку в голову, вводится новый уровень, на котором целые кластеры деталей собираются и прячутся «под капот». Классно. Работает. Это и есть прогресс. Каждый следующий уровень позволяет строить качественно новые и/или бо́льшие системы. Структурное программирование, управление памятью, реляционная модель, символьные вычисления, модель акторов, иммутабельность и так далее.

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

Вернемся к исходному постулату. Человеку дали ассемблер, у него куча времени, здоровья и нет проболем с мотивацией. Если он будет писать просто на ассемблере, он очень быстро упрется в предел своих способностей. Напомню, у нас в гостях не абстрактный всемогущий мозг в банке, а обычный программист (или сколь угодно большая группа программистов), у которых есть биологические пределы. Как бы им ни хотелось, но предел сложности реален и хорошо ощущается, и он не сдвигается лозунгами вроде «будем сильнее стараться» или «просто подольше посидим». Если им захочется пойти дальше, им придется повысить уровень абстракции.

Теперь внимание: они могут либо воспользоваться одним из уже известных способов, которые они наблюдали в существующих языках, либо придумать что-то качественно новое. Поскольку мы говорим об обычных людях и вообще об эксперименте на применимость ассемблера, а не о передовых исследованиях в Computer Science, считать, что они изобретут качественно новый способ повышения абстракции повода нет. Значит, чтобы повторить существующий софт на ассемблере, нашим героям придется сделать себе инструменты по образу и подобию того, что мы уже знаем, и писать уже на них. Что и требовалось доказать. (Замечу, что речь не идет о создать в точности условный Хаскель, а скорее о том, чтобы повторить идею Хаскеля. Хаскель как реализация в этом контексте не несет ценности, а как идея — несет. Если она там, конечно, есть — ну или подставьте вместо него любой другой язык с идеей).

Sanity check. Эксперимент кажется абстрактным, но в реальности он ставится каждый день. Софт, написанный на языках с маленьким набором абстракций, существует, его полно, есть очень большой, есть даже ультрасложный, и даже его можно сказать что много. Язык не ассемблер конечно, но близко — C и C++, на которых тебе и браузеры, и ОС, и игры, и БД. Все это миллионы строк. И это как раз тот случай, когда недостатки языка разработчики вынуждены компенсировать прямо в проекте, чтобы хоть куда-то продвинуться. В каждом из таких проектов есть все давно знакомые нам способы борьбы со сложностью, только свои, кривые, наколенные, родные.

Tags: девелопмент, инструментарий, метафоры ради, популярные заблуждения, разрешите доложить, ходил в народ, чисто гипотетически
Subscribe
  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 30 comments