Восстанавливая события прошлого, приходим к тому, зачем понадобилось обращаться к WebAssembly.
История через призму GUI
Райские кущи Win32
В качестве точки отсчёта берём платформу Win32. Да, перед ней был DOS и ещё длинная цепочка платформ, но в DOS, например, не было динамически подключаемых библиотек. Вместо них, разве что, можно было написать TSR.
Win32 примечательна тем, что очень долго господствовала. От Windows 95 и где-то до Windows Seven (2009). Всё это время существовала массовая гомогенная среда исполнения. Один программист написал, у другого человека запустилось. У кого ни возьми, у всех запустилось. В Интернет выложил, из Интернета скачали, и запустилось. Были сайты freesoft и softportal, файлообменники. И казалось, это будет длиться вечность.
В этих райских кущах пышно расцвели самые разные языки программирования. Вообще, казалось, что Microsoft, ты давай там операционку делай, а в инструменты разработки не суйся, ты там ничего не понимаешь, только и можешь, что бейсиками своими дурацкими закармливать на все лады, то бейсик с пи-кодом, то с машинной трансляцией, то VB.NET со сборкой мусора, тьфу, нет, давайте лучше на красивом Delphi запрограммируем по заветам Вирта. О, а вот, смотрите, Ада ещё круче Delphi, а давайте с Delphi на Аду перейдём, а вместо VCL у нас будет GNAVI. Или ObjectAda+CLAW.
Первые звоночки
Нельзя сказать, что громкие звоночки, но тут в блоге всё субъективно, и первым звоночком хочется назначить переход макос 10.4 на Интел (2004). Если до этого макос был для элиты, то к хакинтошу прикоснулось немало смертных, и в их числе оказался и автор. На территории СНГ многие в те же года прикасались к Linux, и это можно ещё связать с проникновением Интернета в дома.
И тут неожиданно оказывается, что на макос и Linux нет многих полных аналогов того, что в Windows. Начинают лететь первые шахматы с доски. Жёстко привязанный к WinAPI Delphi VCL летит с доски. Delphi, портированный на Linux (Kylix), но не на макос, надолго слетел с доски, и очень нескоро вернулся.
Кроссплатформенность desktop-only
Укрепляют свои позиции так называемые кроссплатформенные графические движки. С точки зрения маковода красивее всего был XUL в основе Firefox. В современном Firefox, кажется, уже ничего не осталось от того прошлого XUL, а тогда это было перспективно. Делали кроссплатформенный плеер Songbird.
Следующей по уровню комфорта была библиотека wxWidgets. На одну ступень с wxWidgets можно поставить Java-библиотеку SWT.
Иерархия комфортности выстроена с точки зрения ощущения маковода. В Windows каждая программа норовила свои нестандартные меню отрисовать, чтобы выделиться, и это задавало тон. В Linux была солянка из Motif и других сейчас уже ничего не говорящих имён, и на фоне этой солянки ещё что-то торчащее незаметно. А в макос это было сильно не так. В макос была удобная продвинутая родная графическая библиотека Cocoa, и под неё багаж родных программ, унаследованный с PowerPC. И в макосе, если что-то топорщится, работает не как в системных программах, это ощущалось сильно заметно, и как правило, не в пользу программы. Вот XUL и wxWidgets автор ещё отнёс бы в положительную полуось комфортности.
Отрицательную полуось открывает Qt. Программ на Qt довелось использовать достаточно. Позже, когда Стив Джобс обосновывал, почему для iPhone такие жёсткие ограничения, он приводил в пример поганые кроссплатформенные программы на Qt, и что он не хотел превращать iPhone в гадюшник, и про Qt он макос он был прав, автор подтверждает это из первых рук. Там собственно отрисованное контекстное меню. Там не запускается жест переноса текста между программами, а вместо этого выделение сбрасывается и начинается с середины. И куча таких неудобств.
Про это писал Джоэл Спольски в статье «Лорд Пальмерстон в программировании»:
Я размышлял о том, как выпускать приложения для Linux, Macintosh и Windows, чтобы версии для Linux и Macintosh не оказывались неоправданно дорогими. Для этого нужна некая кроссплатформенная библиотека.
Такая попытка была сделана в Java, но Sun не удалось создать такие GUI, чтобы получаемые приложения выглядели достаточно натурально на каждой платформе. Примерно так же в «Звёздном походе» пришелец, разглядывавший землю в телескоп, точно знал, как должна выглядеть человеческая пища, но не знал, что у неё ещё должен быть какой-то вкус. У приложений Java меню находятся в правильном месте, но на клавиши они реагируют не так, как все другие приложения Windows, а диалоговые окна с закладками выглядят жутковато. И как бы вы ни старались, панели меню не будут выглядеть в точности, как панели меню Excel. Почему? Потому что Java не одобряет использование собственных средств платформы, если абстракции оказывается недостаточно. Если вы программируете в AWT, то не сможете узнать HWND окна, не сможете обращаться к Microsoft API и уж точно не сможете перехватить WM_PAINT и сделать все по-своему. И Sun достаточно хорошо разъяснила, что если вы попытаетесь это сделать, то лишитесь Чистоты. Вы Испорчены и пропадайте пропадом.
Swing и Qt работали на Windows ещё куда ни шло, но вот на макос это было постоянное расстройство.
Наконец, цепочку антилидеров замыкает Gtk+. И это ещё повезло антилидировать. Потому что VCL в это новое соревнование не попал.
Мобильные платформы
Отсчёт нового неприветливого мира можно брать примерно с iPhone (2007). Он качественно отличался от топовых моделей, например, Nokia N95 на Symbian. iPhone был уже ПК в миниатюре, а Nokia N95 ещё нет. iPhone уже отчасти был вместо ПК, а Nokia N95 ещё нет. Как уже было указано, Стив Джобс волевым решением ограничил Flash и всякие кроссплатформенные библиотеки, чтобы они не портили впечатление. Поэтому сложно сказать, так всё же с какого года следует вести эпоху нового неприветливого мира. Мира, уже ощутимо отдаляющегося от райских кущ Win32-only. По-настоящему мир стал неприветливым, когда сняли ограничение на библиотеки и языки программирования под iPhone OS, тогда она ещё так называлась. Стало можно писать не только лишь на Cocoa Touch, и не просто можно, а уже и нужно.
Как если прошлых неприятностей с кроссплатформенностью было мало, теперь ещё это. Теперь ещё так называемые мобильные платформы надо поддерживать. Сплошь и рядом в соцсетях вылезали хвастуны, которые «избавились от пылесборника». Теперь у них вместо компьютера какие-то недоразумения, на которых не работают ни Windows-программы, ни Linux-программы, ни макос-программы. Ничего не поделать. Придётся подстраиваться.
И снова полетели шахматы с доски. XUL решили похоронить и на desktop, и тем более не потащили в мобилы. Gtk+ не пережил пришествие мобил. С другой стороны, появились новые имена, такие как FireMonkey. Охватывает и desktop-, и мобильные платформы.
HTML5-апокалипсис
И снова у автора трудности с датировкой. В качестве опорной точки можно взять Gmail. Для желающих он был открыт с 2007го года, и тогда было это нечто из другого мира. Тогда ещё не было HTML5. Тогда был HTML4. Тогда не было WebSocket. Вместо них приходилось использовать кометные соединения или сокеты Flash. Тогда ещё была жива Opera 9 с собственным движком Presto. И были сильны позиции Internet Explorer. И Gmail работал ещё тогда, поверх всех этих старых технологий, кроме Internet Explorer. Для Internet Explorer был ActiveX-компонент Google Chrome Frame, а Opera какое-то время поддерживалась Gmail. Но потом поддержка Opera была прекращена.
Пока Gmail был вещью в себе, это был только зародыш грядущих изменений. Всё начало меняться, когда такие приложения нового поколения начали делать все. Трудно точно установить дату, когда стали пропадать вакансии Windows и Linux разработчиков. Кажется, в 2012 такая разработка была ещё очень даже востребована, а в 2020 уже всё заполонила вебня. В качестве точки отсчёта можно выбрать рождение HTML5, которое было в 2013-2014. Поверх старых технологий делать веб-приложения как Gmail, было утомительно, нужен был HTML5, WebSocket, CORS.
Проклятье Electron
И снова полетели шахматы с доски. Люди понапокупали себе всяких умных телевизоров, для которых вроде бы и есть SDK, но мало, кто его возьмёт. Кроме того, по принципу маркетинга каждый лишний клик уменьшает конверсию, так что даже на Windows, если надо скачать и установить программу, то это совсем не то же самое, как в браузере открыть ссылку, и уже вот оно появилось. Как если было мало проблем с кроссплатформенностью desktop+mobile, теперь стала актуальна кроссплатформенность desktop+mobile+web.
И web оказался таким тонким игольным ушком, через которое чуть менее, чем все, старые технологии, не пролезли. Новый стандарт кроссплатформенности практически всегда значит, что нужно сделать web-приложение, а потом это web-приложение заворачивается в браузер Electron, и вот это типа родное приложение теперь считается. А на так называемых мобильных платформах это был PhoneGap (Cordova). Ну, в общем, везде всё свелось к браузеру, обычному или завуалированному.
Так смешно сейчас вспоминать сравнение wxWidgets и Gtk+ на макосе. Так смешно вспоминать неудовольствие от нашествия мобильных платформ. Когда казалось, что достигли дна, снизу постучали. Вам Qt казался марсианской едой, нос воротили, не хочу, не буду, вам mobile казался новым неприветливым миром, а нате-ка попробуйте теперь draw.io на HTML5. Устанавливаем типа-родное приложение из Microsoft Store, а там опять двадцать пять приложение-в-браузере. Какую программу ни возьми, в ней нельзя открыть много окон. В Windows 10 старались, разделение экрана программировали, а в приложении-в-браузере ничего невозможно разделить, потому что тупо чаты нельзя открыть в разных окнах.
Выводы
Выражать неудовольствие неконструктивно. Ничего не поделать, надо подстраиваться. Надо философски прокачать эту тему.
Сейчас, если начинать какой-то проект, он с первого дня должен как-то поддерживать web. Можно говорить про прошлые технологии, что они оказались не готовы к таким драматичным изменениям, но, глядя на произошедшее, уж в новой-то технологии надо с первого дня закладывать поддержку web. Но, чтобы не хотелось плеваться от получающихся программ, можно заложить правильную кроссплатформенность.
Кроссплатформенность курильщика, — это сделать всё на технологиях web, а потом для desktop и mobile упаковать web в браузеры.
Кроссплатформенность здорового человека, — это сделать, чтобы в web можно было раздельно компилировать, но чтобы это не происходило в ущерб родным раздельно скомпилированными версиям программ. Через web должно быть можно подразнить и заманить в родную нормальную программу. А если не получилось заманить, то хотя бы как-то там, в web, отработать, в рамках тех ограничений, в которых существуют web-приложения.
Проект транслятора WebAssembly начался как spin-off другого проекта, Objective PE. Не вдаваясь в подробности, Objective PE про динамически загружаемые библиотеки и про переносимое GUI. Так вот, чтобы не оказаться шахматой, выброшенной с доски, потребовалось выработать какое-то решение по web, и это решение, — кроссплатформенность здорового человека. Это транслятор WebAssembly, конгруэнтный обычным платформам. |