# Диалектика развития языка В духе диалектического материализма, прототип предложенного решения оснастим ещё большей выразительностью. А именно: рассмотрим вариант синтаксиса, где базовая часть ядра языка заметно (но ненавязчиво) отличается от той части, что предлагает программист в виде своего кода. Чтобы снять противоречие старого и нового, неподвижного (и малоподвижного) от движущегося. Необходимо выполнить не просто синтез противоположностей, а разделение старого и нового на уровне внутренней семантики формы, чтобы сама структура языка отражала закон отрицания отрицания. ## Единообразие внешней формы и разделение по внутренней форме Если язык претендует на диалектичность, он не может быть полностью единообразным в любой форме. Он должен материально выражать противоречие между устоявшимся и возникающим, между ядром-основой и творческим дополнением, между материей прошлого и сознанием будущего. ### Диалектический принцип - Ядро языка — неподвижно (в пределах версии), но совместимо (в пределах всех версий) - Расширение — подвижно, - Но движущееся порождается из неподвижного, отрицает его, - И в своём развитии — отрицает отрицание, поднимая язык на новый уровень. Это — не просто метапрограммирование, это — организация языка как классовой борьбы между консервацией прошлого и революцией настоящего в сфере сознания. ## Новый проект: prolet с разделённой формой существующего и нового Два слоя синтаксиса: ### Ядро (Базис) - Устойчивая основа: типы, управление, память, вызовы - Последовательная разработка ядра на основе реальных потребностей - Объективный подход ко всем аспектам языка ### Расширение (Творчество) - Развитие: новые парадигмы, DSL, оптимизации, замена частей ядра - Частные расширения синтаксиса но основе текущих потребностей - Субъективная инициатива Это — единство и борьба форм, где форма выражает содержание диалектики. ## Ядро: стабильное, проверенное, материалистическое Основано на S-выражениях, как в Лиспе, но семантически строго: ```prolet (// Если не указан атрибут изменяемости -- по умолчанию @фикс) (фн Cложить (a Час b Час) (СложитьЧас a b)) (структ Пользователь @имя ЧеловекИмя @возраст ЧеловекВозраст) (если (Сравнить x > 0) тогда (Напечатать "Положительно") иначе (Напечатать "Ноль или отрицательно")) ``` Особенности ядра: - Неизменно в рамках версии 1.x. - Компилируется во внутреннее представление напрямую. - Не может быть переопределено, но может быть перекрыто частным определением. - Создаётся централизованно на основе теории и практики. Это — материальная база, как производительные силы в экономике — нельзя менять каждый день, но можно развивать в следующей версии, с развитием производственных отношений. ## Расширение: творческое, подвижное, диалектическое Работает в таких же круглых скобках, где сопровождающий атрибут `@макро` означает расширение, развитие, отрицание старого на уровне пользователя. Расширение способно заменить в текущей программе более высокоуровневые реализации. Внутри — новые формы, DSL, макросы, оптимизации. Снаружи -- прежний синтаксис. ```prolet (макро параллельно (ЗагрузитьДанные) (ОбновитьИнтерфейс) ) (макро SQL "SELECT * FROM пользователи WHERE возраст > ?" возраст } ``` Как это работает: `параллельно` — не ключевое слово, а расширение, определённое в пользовательской библиотеке, на том же уровне. Это — народное творчество, как массовое движение, которое не ломает основу, но вносит новое содержание. ## Разделение форм: философская и практическая необходимость ### Формы ядра - Форма: `(операция аргументы)` - Изменяемость: Запрещена в версии - Компиляция: На этапе 1 - Авторство: разработчики ядра - Ответственность: Гарантирована - Жизненный цикл: Долгий (версии 1.0, 2.0) ### Формы пользователя - Форма: `(макро содержание)` - Изменяемость: Разрешена, по согласованию - Компиляция: На этапе 2 (после ядра) - Авторство: Сообщество, отдельные разработчики - Ответственность: На авторе расширения - Жизненный цикл: Краткий (пробный, экспериментальный)) Это — диалектическое разделение труда в языке: - Ядро — закон, - Расширение — инициатива, - Их единство — развитие. ## Переход от старого к новому: процесс отрицания Пример: появление нового цикла в потоках (старое ядро): ```prolet (для задача в списокЗадач (СоздатьПоток задача)) ``` После проверки практикой — включение в ядро новой версии (расширение): Новое (расширение): ```prolet (параллельно (Выполнить списокЗадач)) ``` Это — отрицание отрицания: - Старое `(для ... СоздатьПоток)` — отрицается, - Новое `(параллельно ...)` — отрицает старое, Но затем `(параллельно ...)` само отрицается — становится частью ядра, и появляется новое расширение для асинхронных потоков. ## Психологическая и педагогическая выгода Для новичка: - Видит только `(...)` — простота, порядок, безопасность. - Расширения скрыты или отключены. Для мастера: - Может писать `(макро ...)`, на пользовательском уровне, но осознаёт, что это — эксперимент, что он выходит за рамки устоявшегося, что за это несёт ответственность. При компиляции получает уведомление (если не подавлено атрибутом) Расширения разработчиками ядра могут быть: - Одобрены, - Отклонены, - Включены в следующую версию ядра. Это — демократический централизм в действии. ## Реализация на уровне компилятора Этап 1: Парсинг ядра - Обрабатывает только системные библиотеки, строит **AST**. - выполняет предварительную компиляцию ядра (однократно) Этап 2: Макро-раскрытие расширений на уровне пользователя - Находит `(макро ...)`, подставляет определение из зарегистрированных расширений. Этап 3: Трансляция в ядро - Все пользовательские макросы интегрируются в ядро. Этап 4: Компиляция - только изменившийся код. - сборка готовых модулей. Таким образом, вся сложность остаётся контролируемой, сборка занимает незначительное время, а инновации не разрушают стабильность. ## Пример полного кода ```prolet (// === ЯДРО === ) (фн ОбработатьПакет (пакет СписокДок) (если (ПроверитьЦелостность пакет) тогда (Расшифровать пакет) иначе (Остановить "битый пакет"))) (// === РАСШИРЕНИЕ === ) (структ ВебСервер @маршрут ВебОбработчик @порт СетьПорт ) (Печатать "Запуск сервера...") ``` Здесь: - (фн ...) — ядро, стабильно, - (ВебСервер ...) — использование результатов творчества, может измениться, - (Печатать ...) — может быть переопределён под нужды среды, вместо реализации ядра ## Заключение: язык как диалектическая система - Форма ядра `(...)` — отражает устоявшееся, необходимое, объективное. - Форма расширения — `(макро ...)` — отражает возникающее, творческое, субъективное. Их борьба и единство — двигатель развития. Переход расширения в ядро — качественный скачок. Разделение форм — материальное выражение закона отрицания отрицания. Это — не просто язык программирования, это — модель социалистического информационного общества: - стабильный базис, - свободное изменение по необходимости, - и путь от частного к общему через практику.