НовостиОбзорыСобытияIT@WorkРеклама
Идеи и практики автоматизации:

Блог

Тысячекратная компактность кода

Современные системы в десяток миллионов строк кода -- это 500 книг по 400 страниц, где каждая строчка увязана с логикой работы всей системы, а неверно поставленный знак препинания может привести к сбоям любой степени серьезности. Немудрено что в любой более-менее крупной мэйнстримовской программной системе находятся тучи ошибок, а ее развитие, совершенствование, стыковка ее с другими системами -- дело весьма и весьма сложное и затратное. Однако появляются подходы, позволяющие реализовать нужную функциональность в тысячу раз компактнее.

[spoiler]Корень этой проблемы кроется в классическом подходе к созданию систем, зародившемся более полувека тому назад. Он основан на императивном программировании -- переменные и объекты хранят данные, а последовательности операторов изменяют их состояния. Но когда объектов становится очень много, все взаимосвязи между ними отследить трудно, в результате возникают хорошо известные сторонние эффекты: если один объект изменяется, то все прямо или косвенно связанные с ним объекты могут тоже измениться, подчас непредсказуемо.

Выработаны различные способы "снижения размерности" сторонних эффектов. Например, разработчики из упомянутого в прошлом посте Viewpoints Research Institute вводят понятие "мир" (world), когда неявные взаимосвязи между объектами программисту как минимум удается контролировать. "Миры" реализованы в Squeak и JavaScript с помощью паттернов проектирования и своеобразной транзакционной семантики.

Однако это в некотором смысле косметические мероприятия, немного уменьшающие сложность работы, но и не более. Принципиально новые подходы к созданию крупных программных систем создаются VRI под руководством Алана Кея в рамках проекта STEPS Toward Expressive Programming Systems. Они позволяют создавать системы с аналогичным функционалом, на порядки - в тысячу раз и более -- компактнее, нежели нынешние.

О системе Tamacola рассказывалось ранее, а сегодня Алан Кей сотоварищи трудится над проектом Frank, где на 20 тысячах строк кода будет реализовано все, что надо типичному пользователю современного ПК, включая, конечно, и операционное окружение. В крохотном объеме Frank уместятся и низкоуровневые-кроссплатформные интерфейсы с железом, и прикладные пакеты уровня MS Office. Хотя главной задачей коллектива Кея назван поиск подходов, с помощью которых можно реализовать такую анти-масштабную задачу, но и сам Frank, конечно, станет ценной вещью -- свободной и открытой, не требующей инсталляции ОС, содержащей в себе все и работающей на множестве платформ. Создается он под девизом "математика рулит!" (Math Wins!).

Компактность будет достигнута способом, упомянутым в проекте Tamacola -- под конкретные задачи-подсистемы создаются собственные языки, компактно кодирующие нужную функциональность. Например, вся современная настольная компьютерная графика на языке Nile умещается в 300 строках кода.

Nile написан на мета-языке OMeta -- его реализация занимает 100 строк (правда, еще 700 строк потребовалось для оптимизации работы). Хотя полностью оптимизированный OMeta, написанный сам на себе, занимает 100 строк.
Соответственно, по оценкам группы Кея, большинство ключевых программных модулей Frank уместится в объеме 100-1000 строк кода.

Во Frank входят:
- универсальная медиа/UI-система, пользовательский интерфейс представляет синтез UI Etoys и MS Office. Вот пример работающего пакета этого модуля:


- ядро поддержки работы прикладных систем -- обработчики событий, просмотрщики, планировщики, графические модули и т. д.;
- универсальная система параллельной потоковой обработки изображений и звука;
- объектная система для создания пользовательских приложений (расширение Smalltalk);
- OMeta;
- Nothing -- высокоуровневый язык с простейшей низкоуровневой семантикой для поддержки кросс-плаформности. Весь машинный код Frank будет генерироваться на нем (как выражаются создатели, from Nothing, "из ничего") . Прикладные языки, определенные на OMeta, также будут транслироваться с помощь Nothing в двоичный код (на самом деле трансляция будет выполняться, скорее всего в Си или Smalltalk; непосредственно же программировать на Nothing обычному разработчику будет совершенно не под силу -- точнее, как заявляют авторы, программировать на Nothing смогут только сверхчеловеки).

На прикладном UI-уровне Frank также появится немало концептуальных вещей -- универсальные undo, повсеместные микровидео, панели меню, редактирование на любом шаге процесса (нет разницы между презентацией и ее конструированием), отсутствие разницы между типами документов (э-письмо, презентация, отчет, веб-страничка, скрипт -- это все единый документ) и так далее.

Реализация средств разработки для Frank тоже весьма уникальна. Например, OMeta можно пользоваться прямо из браузера -- реализация выполнена на JavaScript. Есть и иные реализации, например, на C#.