Как я дошел до жизни такой и до архитектурного программирования
Архитектурное программирование для меня является естественным развитием моего профессионального пути и естественным продолжение проектов, которые я делал на этом пути. Логичность этого пути и логику перехода к архитектурному программированию я хочу показать в этой статье.
1984-1989 Проект Кронос
Про проект Кронос можно прочитать здесь: kronos.ru, статья Руслана Богатырева. Я отмечу только главное.
В проекте было разработано железо (процессоры и рабочие станции Кронос) и полный набор программного обеспечения, включая операционную систему, компиляторы, редакторы, IDE, графические системы, система разработки печатных плат и т.д.
Характерные особенности проекта:
- Одна архитектура железа
- Все ПО написано на одном языке Модула-2
- Все ПО написано с нуля, никаких зависимостей от другого (внешнего) софта
Особенности проекта, обеспечивающие высокую скорость разработки: моносистема, нет зависимостей.
1989-1991 Сохранение и развитие
Проект Кронос завершился в конце 1980-х, и, во многом, завершился вынуждено. Перестройка шла полным ходом, экономика СССР рассыпалась. Надежды на большое внедрение таяли.
Участники группы Кронос видели свою дальнейшую судьбу по-разному, но было общее желание использовать то, что было сделано на Кроносе, но уже на других компьютерах и платформах.
Я продолжал работать над компиляторами и основная задача этого этапа была обеспечение переноса ПО. Для этого были эксперименты над генерацией на другие процессоры, например, на один из первых 32-х разрядных процессоров NS 32032 от National Semiconductor и трансляция на язык Си. Именно трансляция Модула-2 в Си стала существенным итогом этапа, принесла деньги и дала возможность идти дальше.
На первый план в моих работах вышла переносимость ПО.
1991-1994 Оберон и расширяемость
В 1991 году была поездка в ETH Zurich к Никлаусу Вирту, знакомство с компьютером Ceres, языком Оберон, Оберон системой и компилятором OP2.
Вернувшись из Цюриха я начал работать над компилятором Оберона, и вместе с коллегами над компиляторами Модула-2/Оберон в x86 и трансляторам в Си, которые продавались под названием X2C, где X - это Модула-2 и Оберон-2.
Несколько позже я начал работать с коллегами над расширяемой системой Mithril. Этап был завершен защитой кандидатской диссертации, посвященной двойному компилятору и ООП системой Mithril.
Именно тогда, я получил прививку от объектно-ориентированного подхода, убедившись в том, что ООП - это не так хорошо, как выглядит. Уже гораздо позже, я сформулировал для себя, что свойства расширяемости недостаточно. Важными свойствами развиваемой и долгоживущей системы должна быть возможность не только добавлять (расширять), но и заменять и удалять части. А это уже не совсем или совсем не ООП.
Принципиальные особенности этапа: би-языковость, расширяемость и переносимость.
1994-1998 XDS и заказы
Начиная с 1994 года мы начали работать по заказам от западных компаний, и большинство заказов были на разработку компиляторов. Они делались на основе XDS (eXtensible Development System) - переработанного би-языкового компилятора. Изначально XDS поддерживал 2 языка (Модула-2, Оберон-2) и два генерации кода (x86, Си). По ходу выполнения заказов добавлялись как языки (SL1, диалект Паскаля), так и генераторы (68k, Sparc, …).
В кандидатской диссертации, я писал о схеме компиляции 1+e => M, когда два похожих языка, отличающиеся небольшой добавкой e (М2, О2) компилируются в M архитектур. Очевидно, такая схема семантически существенно проще, чем схема без ограничений N => M. Впрочем, добавление "заказных" языков, а потом и языка Java разрушило это схему.
От схемы 1+e => M, было недалеко до мысли о том, что надо делать компилятор для "семейства" близких языков, а чтобы обеспечить "близость" надо это семейство разрабатывать целиком.
Как и на предыдущем этапе, основная решаемая задача была обеспечение переносимости ПО. Впрочем, добавилось понимание того, что от разработки отдельных программ надо двигаться к технологии программирования.
2002-2005 Эксперименты в области сборочного программирования
Мысль о том, что надо делать технологию программирования, а не отдельные программы, такие как Оберон система, привела к экспериментам в области сборочного программирования. А.П. Ершов писал в статье "Предварительные соображения о лексиконе программирования" (1983 г.) про три формы программирования: синтезирующее, сборочное и конкретизирующее. Я не помню, что было раньше, моя тоска о потерянной со времени Кроноса интенсивности разработки или перечитывание статьи Ершова, но так или иначе, я несколько лет, одновременно с разработкой коммерческих проектов экспериментировал с компонентами и сборкой на основе Дельфи и DLL.
Принципиальные особенности: тоска по простой и эффективной разработке (по тому, что я гораздо позже назвал интенсивным программированием) и поиски технологии программирования.
Эксперименты были не простыми, под капотом программы на Дельфи происходили "чудеса", которые заставили перейти на следующий этап.
2006-2012 Сборочное программирование, среда разработки "Вир"
Устав от бессмысленной борьбы с Дельфи, я смастерил очень простой (и странный) язык программирования, написал для него очень простой (и странный) табличный компилятор для x86 и это привело к прорыву в сборочном программировании. Достаточно быстро я научился собирать программы из компонент, написанных на этом языке, и одной из первых программ была среда разработки "Вир", которую я делал одновременно с другими программами.
Как и во времена Кроноса, между теми программами, которые я собирал и процессором не было ничего "чужого", за исключением остатков на Дельфи, которые я постепенно выкидывал.
Снова отсутствие зависимостей!
И это привело к гигантскому скачку в скорости разработки, причем, главное было не в скорости написания кода, а в предсказуемости поведения, а значит, минимизации отладки, и в уровне переиспользования. Все программы, включая Вир, собирались из одних и тех же компонент. Компоненты были как крошечные, так и большие. Например, одним движением мыши, я мог добавить в программу инструмент обновления по сети, инструмент логирования и инструмент отладки.
Вместе со сборкой, я получил явную схему программы, а это собственно, зачаток архитектурного программирования, который тогда был побочным эффектом сборки.
Принципиальные особенности: технология программирования, интенсивность, сборочное программирование, отсутствие зависимостей.
2014-2019 Системный архитектор
Жизнь менялась, и я несколько лет работал системным архитектором в нескольких компаниях. Причем работал в очень разных областях, включая разработку встроенных систем, высоконагруженных систем потоковой обработки и систем обслуживания. Надо сказать, что я был системным архитектором еще в те времена, когда названия у этой профессии еще не было, начиная с Кроноса, но погружение в конкретную область дало важный опыт.
Принципиально: понимание того, что понятие "архитектуры ПО" находится в зачаточном состоянии.
2014-2018 Эксперименты с языком сборочного программирования
Одновременно с работой системным архитектором, я экспериментировал с разработкой нового языка для Вира. Исходный язык, был, как я уже писал, очень странным. Я написал на нем огромное количество кода, но понимал, что его нельзя "выводить в люди".
В ходе экспериментов я пытался использовать существующие языки, например, Go и Rust, и пришел к выводу, что другая технология программирования заставляет разрабатывать другие языки.
Я потихоньку начал осваивать новую профессию - разработку языков программирования и писал статьи, см. например, "Компонентный ассемблер. Часть 1", "Часть 2". Тогда же у меня оформилась мысль, что надо разрабатывать "семейство языков".
Принципиально: другая технология программирования заставляет разрабатывать язык, точнее семейство языков.
2019-2021 Экспериментальный язык разработки приложений
В 2019 году я сменил профессию, и официально стал заниматься разработкой языка программирования. Одним из фокусов в работе над этим языком было построение системы типов см. "Разработка типовой системы языка программирования приложений". Работа была доведена до прототипа языка, компилятора с генерациями кода 1) нативной через LLVM IR и 2) в байт-код проприетарной VM, набора стандартных библиотек и поддержки исполнения. После этого, разработка этого языка была заморожена и начался следующий этап.
Принципиально: семейство языков, обобщенная система типов для семейства.
2022-2023 Семейство языков, Тривиль
В 2022 произошло несколько важных событий. Во-первых, на работе мы начали делать производственный язык, который достаточно скоро должен выйти в свет. Во-вторых, я смог найти правильные слова, написал статью "Интенсивное программирование", определился с первым языком семейства и начал делать Тривиль.
В сентябре 2023 рабочая версия языка и его компилятор, написанный на самом Тривиле, были сделаны.
Разработка языка Тривиль и компилятора описана в серии статей, см. .
Принципиально: семейство языков, переносимость, минимизация зависимостей.
2023-н/в Архитектурное программирование
См. статью "Третья структурная эволюция. Введение в архитектурное программирование".
Архитектурное программирование объединяет все, что я считаю принципиально важным: это технология интенсивного программирования, поддерживающая явную архитектуру ПО и сборочное программирование, основанная на семействе языков, обеспечивающая переносимость и минимизирующая зависимости.