## Уровни абстракции Электронно-вычислительные системы очень часто делят на уровни абстракции. Основных причин для такого разделения две: каждый уровень скрывает детали нижележащего, а также навязывает свои ограничения вышележащему. Один из таких примеров (от низкого к высокому): - Физика (Электроны) - Устройства (Транзисторы, диоды) - Аналоговые схемы (Усилители, фильтры) - Цифровые схемы (AND вентили, NOT вентили) - Логика (Сумматоры, память) - Микро-архитектура (Контроллеры, каналы передачи данных) - Архитектура (Регистры, инструкции) - Операционные системы (Драйверы устройств) - Application Software (Программы) Любую систему можно разбить на уровни абстракции. Выражаться они будут разным образом: какие-то будут видны только в документации, какие-то будут реализованы в виде программ. Тем не менее, они всегда существуют и связаны друг с другом (настолько, что при необходимости мы всегда можем перемещаться между ними). Иногда различные уровни могут формировать вокруг себя виды индустрии, об этом можно подробнее почитать в небольшой [статье](https://swyx.io/osi-layers-coding-careers), в которой такое разделение происходит по аналогии с сетевой моделью [OSI](https://en.wikipedia.org/wiki/OSI_model). При этом сами уровни абстракции формируются вычислительными платформами. Платформы состоят из трёх основополагающих компонентов: языка, типа и экземпляра. Язык (Language) - собственно, язык, на котором мы пишем или описываем. Тип (Type) - предопределенные платформой абстракции и структуры данных. Экземпляр (Instance) - готовые, предопределённые платформой объекты и компоненты. С использованием трёх этих компонентов чаще всего появляется и еще один - шаблон. Шаблон (Pattern) задает повторяемые решения. Одни и те же шаблоны могут повторяться на разных уровнях абстракции. К примеру: сторожевые таймеры появляются в микроконтроллерах, ОС/гипервизорах и оркестраторах; кеши и когерентность актуальны для CPU, ОС (page cache), дисков, CDN и браузеров; прерывания и события используются в аппаратных IRQ, сигналах ОС, event loop и message queue; системы команд часто встречаются в ISA процессора, байткодах виртуальных машин (JVM, CLR), API/протоколах (у которых свой Language на каждом уровне), а также в DSL. ## Тенденции Внутри компьютера: - смена процессорной архитектуры (уход от x86 в пользу ARM и RISC-V) - появление разнообразия (или гетерогенности) вычислений (GPU, NPU, TPU) - чиплеты и продвинутая упаковка кристаллов вместо монолитных SoC (нужно учитывать, под какое железо делается программа) - реконфигурируемые вычислители (FPGA, CGRA). За пределами компьютера: - облачные вычисления (server-less) - распределённые системы, системы систем, IoT, edge/fog computing - вычисление вне доверенного окружения (confidential computing (TEE), Blockchain, Smart Contract) В разработке: - AI-ассистированная разработка - копайлоты, агенты, генерация и ревью кода (к слову, уровни абстракции - слабое место ИИ) - Low-code или no-code решения - смещение программирования к верхним уровням индустрии - Platform Engineering, IaC, GitOps (как сконфигурировать систему) - Микросервисы <-> модульные монолиты (маятник архитектурных стилей)