Pull to refresh

Comments 28

Y = A * X + B

разве это не декларация намерения

Это (в императивном языке) не декларация намерения, а всего лишь алгоритм вычисления. Разница проявляется, когда есть побочные эффекты (а без них императивное программирование невозможно).

UML стал, пожалуй, одной из самых амбициозных попыток подняться не только над кодом, но и над предметной областью

Вы путаетесь в уровнях абстракции, UML — это инстанс MOF. Невозможно разработать «метаязык», потому что он станет еще одним инстансом AST. А вот MetaAST разработать как раз можно, и я мог бы даже подискутировать, если бы вы показали ваш подход к построению AST (и примеры самого дерева).

Но устанавливать ради этого кривое поделие юродивого Пашеньки я не готов, @ammotion:matrix.org

Половина UML гвоздями прибита к ООП: классы, объекты, наследование, пакеты

Разумеется. Потому что UML — это инстанс MOF для этой предметной области. При этом Хаскель волшебно описывается на FMS, который ничто иное, как неуклюжий потомок FML, который тоже инстанс MOF.

Но это все слишком сложно, тут разработка, а не компутер саенс, так что просто захреначим «метаязык» и будет счастье.

Не припомню таких сокращений

Невозможно разработать «метаязык», потому что он станет еще одним инстансом AST

Смотря, что понимать под мета-языком и про какой именно AST вы говорите, если речь про AST целевых языков, то я скорее говорил о модели, которая описывает систему до выбора конкретных языков и технологий, следовательно независящей от их внутренних представлений.

А если вы говорите про AST самого мета-языка, то мета-уровень здесь достигается не за счет синтаксиса, а за счет семантики, язык описывает структуру и поведение системы: сущности, отношения, ограничения, синтаксис тут вторичен.

я скорее говорил о модели, которая описывает систему до выбора конкретных языков и технологий, следовательно независящей от их внутренних представлений

Это метамодель, а для ваших целей нужна мета-мета-модель.

Код, короче, покажите — я объясню, что с ним не так.

О каком коде вы говорите? BNF грамматика, CST или AST? Или семантический анализ или код на самом мета-языке? Я планирую в следующей статье/статьях рассказать подробнее о языке с примерами кода и конкретными техническими решениями.

Невозможно разработать «метаязык», потому что он станет еще одним инстансом AST.

А не поясните, что такое AST? Abstract syntax tree? Что же Вы имеете в виду?

Ну я же дал ссылку на MOF. Реализация — это инстансы, M⁰. Модель — это классы, M¹, UML — это классы классов, мета-модель, M². MOF — это M³, мета-мета-модель.

Любой язык обречен болтаться на уровне реализации M², а для того, чтобы сделать то, что хочет автор — нужна M³. MetaAST, реализацией которого станут AST (M²), со своими языками — M¹.

Абстрактное синтаксическое дерево для выражения синтаксических деревьев низшего порядка. Никакими «семантиками, структурами и поведениями системы» выразить M³ не получится в принципе, поэтому автор либо лукавит, либо у него есть в голове неплохая идея, как выразить которую — он не имеет ни малейшего представления. Ну поглядим, делов-то. Направление очень верное, но непростое.

Любой язык обречен болтаться на уровне реализации M²

Ну это, если мы принимаем продукцию OMG как нечто незыблемое, на деле же, это не совсем так. Думаю MOF - не предел выразимости.

у него есть в голове неплохая идея, как выразить которую — он не имеет ни малейшего представления

Мой подход основывается не на моделях из мира ООП, я идейно отталкиваюсь от логического подхода. Рассуждение простое, любая предметная область или технология - данные, но не простые данные, а вполне структурированные логически
связанные данные, представимые в виде отношений, например:

функция1 вызывает функцию2

у нас есть отношение вызывает(функция1, функция2), как если бы мы писали на языке вроде Datalog, но для подобных языков нет разницы между субъектом, предикатом и объектом, по сути это просто комбинаторика констант, переставляем их местами (SPO, SOP, PSO ...), строим префиксные боры и делаем запросы, но на практике есть некоторые вполне универсальные свойства отношений, такие как включение, направленность, ассоциативность и так далее, которые в классических логических языках отдельно не представлены, также нет отдельного позиционирования сущностей, если хотим выразить декларацию сущности, пишем что-то типа существует(сущность), также нет разделения на миры (онтологии), что крайне важно для разделения на уровни абстракции и оптимизации вычислений, в общем оcнование крайне мощное, но под те требования, что я перечислил оно не адаптировано. Мой язык является попыткой решения этих проблем, более конкретно о том, как именно он это решает я попытаюсь рассказать в следующей статье/статьях, разумеется я не пытаюсь создать Datalog++, но идейно мне это направление кажется верным.

Но соглашусь с вами, задача действительно сложная, я тут не пытаюсь выдать мнимое за действительное, я сам хочу разобраться в том, как вообще можно реализовать такой язык.

если мы принимаем продукцию OMG как нечто незыблемое, на деле же, это не совсем так. Думаю MOF — не предел выразимости.

[…] на моделях из мира ООП

Боюсь, вы недооценили консорциум. MOF не имеет никакого отношения к миру ООП, ровно наоборот, смысл мета-мета-модели как раз в том, что в проекциях этого измерения одинаково легко выражать ООП, ФП и любое другое П. UML — это просто одна из проекций (инстансов), для ООП (потому что ООП тогда было на коне, она и проработана лучше всего, но это не значит, что FML — и её неуклюжий потомок FMS — как-то вдруг сложно реализуемы).

  1. Принципиальная абстракция: язык должен быть независим от конкретных предметных областей, языков и технологий, но при этом позволять описывать их внутри себя.

Это как? Давайте рассмотрим какие-нибудь примеры. Есть люди, у каждого человека есть фамилия, имя и отчество. (Бывают и особенности — национальные или исторические.) Каждый человек участвует в различных отношениях: здесь он — конечный пользователь системы, вот здесь — контрагент, там — директор фирмы или разработчик, а ещё — пользователь (читатель) библиотеки, и т.д. и т.п. У человека/организации есть адрес, может быть счёт в банке, ИНН, БИК, СНИЛС. И... куча всего!

Где, куда и как абстрагировать?

Это для нас некий набор цифр — это номер телефона. Мы это знаем. Для себя. А для системы — это просто набор цифр и набор действий, которые нужно с этими цифрами делать. Семантика всегда оказывается за пределами рассмотрения, а метаданные — это, как раз, немного другой (более высокий) уровень абстракции. Семантика, всё-равно, от нас так или иначе ускользает.

А что предписывает наука?

Наука предписывает, что у каждой предметной области должен быть свой язык. У такой области, как программные системы то же имеется свой язык — язык представления программных систем. А ещё должен быть и третий язык — язык для перевода (трансляции) первого языка на второй. Вот эта конструкция из трёх языков и есть решение задачи.

Продолжение следует... (с)

Вопрос концептуальный и он очень правильный.

Где, куда и как абстрагировать?

Вы сами отчасти ответили на свой вопрос. Вы начинаете с человека как универсальной абстракции, а потом иерархически спускаетесь по своим уровням абстракции и приходите к константным сущностям, вроде ИНН или СНИЛС.

Наука предписывает, что у каждой предметной области должен быть свой язык. У такой области, как программные системы то же имеется свой язык — язык представления программных систем. А ещё должен быть и третий язык — язык для перевода (трансляции) первого языка на второй. Вот эта конструкция из трёх языков и есть решение задачи.

В целом как будто да, но этот третий язык должен одинаково хорошо переводить языки друг в друга, отсюда как раз возникает проблема его универсальности, если из одного в другой мы как-то можем перевести, то как быть с их декартовым произведением, каким будет третий язык в этом случае?

И, ни слова про Форт (Forth) язык или другой конкатенативный! Обидно прям. :)

P.S. А, ведь были же умельцы, статья: Цифровая капсула времени: как я в 2026 запустил свой IDE, написанный в 1998 году на FORTH, что общего между Фортом и 1С, и что скажет о проекте современный ИИ https://infostart.ru/1c/articles/2634967/

На самом деле тут можно представить немного иначе 1 уровень: Абстракция над железом (языки программирования) 2 уровень: Абстрация над над реализацией(протоколы JSON, SQL, XML…) но не столько как сами эти технологии, сколько апи построенное на их базе 3 уровень: по идее это должна быть абстракция над интерфейсом, я не считаю что ИИ как то решает эту проблему, я скорее воспринимаю ИИ как инструмент, например как IDE. А вот тот же neuralink и вполне возможно

Не с того начинаете. Начинать нужно с природы самого мышления. Многие считают, что мышление неотделимого от разговорного языка. Мол, мы думаем словами и мыслить без этого невозможно. Но это не совсем так, доказано пару веков назад Иваном Сечиным.

В работе «Рефлексы головного мозга» он прямо указывает, что мышление имеет физиологическую основу и не сводится к речи. В другой своей работе, «Элементы мысли» он развивает эту идею.

Если упростить: у нас уже есть «механизм мышления», встроенный на уровне физиологии. Язык не создаёт мысль — он лишь оформляет её и делает доступной для передачи.

У человека есть потребность делиться мыслями, он удовлетворяет её с помощью речи. Если речь недоступна, вход идёт жестовый язык, как, например, у глухих.

Язык — это инструмент коммуникации, а не сама мысль. Как любой инструмент, он вносит искажения. В языке неизбежно появляется абстракция. Когда мы формулируем мысль словами, мы её упрощаем, отбрасываем детали, подгоняем под существующие конструкции.

То есть теряем точность.

У Никонова есть прекрасный текст:

Образовательный, нравственный, интеллектуальный уровень попов разный, и на один и тот же вопрос они зачастую дают разные ответы.

В итоге Бог в нашем мире ведет себя так, будто его нет.

Но даже если бы Он начал по пятницам выступать по телевизору со своими проповедями и инструкциями по правильному поведению в разных ситуациях, уже через пару недель несчастный Господь увяз бы в поправках, разъяснениях и подпунктах: «Те слова, которые, применительно к ситуации, что я описывал как пример в позапрошлую пятницу, и которые, как выяснилось, не все правильно поняли, в иных ситуациях, о которых я доложу ниже, необходимо понимать с учетом тех поправок, которые будут ясны из следующих примеров…».

А уж если учесть, что люди постоянно умирают и рождаются, несчастный Господь совсем измучился бы в повторах, разъяснениях и примерах конкретных ситуаций. Потому что в разных ситуациях участвуют разные люди, и на всех единых инструкций не напасешься

И вот тут мы возвращаемся к программированию.

Когда кто-то говорит: «Давайте создадим язык, на котором можно программировать почти как думаешь» — в этом заложена ошибка. Думаем мы не на языке. Мысль — это более глубокий процесс, который существовал ещё до появления языка.

Любой язык — будь то Python, SQL или «супер-человеко-понятный DSL» — будет вводить структуру, навязывать свою модель, отбрасывать нюансы.

То есть неизбежно искажать исходную мысль.

Поэтому не будет волшебного языка, который уберёт разрыв между мыслью и кодом.

Поэтому не будет волшебного языка, который уберёт разрыв между мыслью и кодом.

Подождите! У нас же есть свой собственный язык. На котором мы говорим и пишем, и, надеюсь, и думаем. Почему нельзя использовать естественный язык? Разве LLM не есть реализация такого подхода? Разве это не то самое литературное программирование, о котором говорил в своё время Дональд Кнут?

У нас же есть свой собственный язык

У нас есть свой язык. У глухих свой. Да тоже не один. У французов есть слово, обозначающее дерево без листьев, у нас нет. Зато у нас есть слово «спешиться», а у них нет, и они используют: ноги на землю. Серьёзно. У них даже дорожный знак такой есть для велосипедистов, с этими самыми словами.

Это уже показывает, что язык — это не отражение мышления, а система соглашений, которая по-разному кодирует один и тот же опыт.

и, надеюсь, и думаем

Мыслить можно и без разговорного языка. Иначе пришлось бы признать, что глухонемые не думают (что очевидно не так), животные не думают (что тоже противоречит наблюдениям), ребёнок до освоения речи не обладает мышлением.

Теперь к идее «почему бы не программировать на естественном языке».

Проблема в том, что естественный язык зависит от контекста. Многие смыслы слов достраиваются из контекста. Естественный язык многозначен и допускает интерпретации.

То есть он не точен в принципе.

Именно поэтому в программировании появились формальные языки — не потому что люди «не додумались» до естественного, а потому что он плохо подходит для точного описания.

Что касается LLM.

Большие языковые модели — это не исполнение естественного языка, а скорее статистическое угадывание наиболее вероятной интерпретации текста. Исполнение алгоритма: найди мне текст, максимально похожий на ответ вот на этот вопрос (промт).

Они создают иллюзию понимания, но под капотом всё равно требуется формализация, уточнение и снятие неоднозначностей.

Именно поэтому с ними приходится переписывать промпты, уточнять формулировки и бороться с галлюцинациями.

Если бы естественный язык был точным — этого бы не было.

Теперь про Дональда Кнута и про его Литературное программирование.

Там идея немного другая.

Кнут не предлагал заменить код естественным языком. Он предлагал писать программу как текст для человека, где код встроен в объяснение.

То есть язык остаётся формальным, а естественный язык используется для пояснения.

Спасибо за глубокий комментарий. Вы абсолютно правы в том, что естественный язык (и любой линейный синтаксис) вносит искажения при фиксации мысли — это классическая проблема, которую ещё Платон описывал в «Федре».

Но позвольте задать вопрос в развитие вашей мысли: а что, если проблема не в «языке вообще», а в том, что мы до сих пор используем для программирования знаковые системы, оптимизированные под коммуникацию, а не под фиксацию инвариантов деятельности?

Есть направление — СМД-методология (Г.П. Щедровицкий, Анисимов), — которое как раз исходит из того, что:

  1. Мышление — это деятельность, а не просто «процесс в голове»

  2. Знак может быть не только словом, но и схемой, где элементы фиксируют онтологические категории, а не грамматические конструкции

  3. Искажение минимизируется не за счёт «приближения к мысли», а за счёт рефлексивного проектирования самой знаковой системы

В этой рамке «мета-язык третьего перехода» — это не «волшебный язык, на котором думаешь», а искусственная знаковая система, где схема деятельности может быть верифицирована, исполнена и перепроектирована без потери инвариантов.

Если вам интересно копнуть в эту сторону — рекомендую начать с работ О.С. Анисимова по «схематизации» или лекций П.Г. Щедровицкого о промышленных революциях и мета-навыках.

Как вы смотрите на то, что проблема «разрыва мысли и кода» может решаться не через «более человеческий синтаксис», а через иную онтологию знака?

Мне кажется, что философы ещё где-то в первой половине 20-го века заметили, что языки делятся на аналитические, позволяющие хорошо описывать структуры, вложенность одних объектов в другие, то есть — наличное бытие, а есть — синтетические, позволяющие описывать динамическое поведение и создание нового. Всё, с чем мы имеем дело, это суть аналитические языки. Включая и UML. А нужны какие-то новые языки.Ориентированные на процессы. В этом смысле, функциональное программирование предлагает некий подход к решению этой проблемы. Действительно, что такое 1 + 10? Это процесс последовательного увеличения числа не единицу! И так 10 раз!!

Даже научные формулировки — это уже сжатие смысла в термины. Например, «филогенез повторяет онтогенез» — это не сырая мысль, а упаковка сложных теорий в знаковую конструкцию, где каждый термин уже несёт выбор границ и интерпретаций.

Поэтому мы никогда не оперируем мыслью напрямую — только знаками, в которые она заранее сжата.

Тут проще всего заметить, что применение компьютеров не ограничивается мыследеятельностью и даже не очень с ней связано. Поэтому ключ Щедровицкого не от того замка.

Сам он на своих семинарах мгновенно пресекал неправильно, по его мнению, поставленные вопросы.

Любая программа, включая искусственный интеллект – это, в некотором смысле, противоположная мыследеятельности вещь, так как представляет собой целесообразную деятельность, обособленную от мышления.

Уровни абстракции: развивая первый пункт, язык должен позволять описывать произвольные уровни абстракции, не смешивая их между собой.

Может быть, для каждого уровня абстракции иметь свой язык?

Например, есть номер телефона. На уровне базы данных, номер телефона — это набор цифр определённого формата. А на уровне пользовательского интерфейса? По идее, мы должны полностью описать табличное поле на стороне базы данных, но, в действительности, мы воспроизводим в пользовательском интерфейсе тот же самый тип данных, что и в БД. А можно не делать этого? На самом деле, в пользовательском интерфейсе есть просто какое-то поле для ввода, но его функционирование должно брать весь код из БД.

Выразительность: язык должен обладать достаточной выразительной силой, чтобы описывать широкий спектр предметных областей, от инфраструктуры до бизнес-логики.

А чем плохо, если у нас будет два языка для двух различных предметных областей и ещё один язык для написания трансляторов с языка одной предметной области на язык на другой?

Если у нас есть уровни, то связь уровней осуществляется через интерфейс, то есть — через посредство отображение сущностей одного уровня на сущности другого.

Если будет создан универсальный язык для программистов, то его будут также лениться учить и всё равно пользоваться моделями, которые с высокой вероятностью угадывают в пользовательском бормотании релевантные паттерны и накидывают варианты. Мечта о халяве и одной кнопке, которая "делает волшебство" неискоренима)

Абстрогируй, абстрогируй но не доабстрагируйся... Какой инженер? Первую абстракцию сделала Ада Лавлейс за 100 лет да него, увидев в аналитической машине Бэббиджа нечто большее чем просто посчитать логарифм

На самом деле останутся только те кто создает смыслы и те кто делает что то руками(пока).

Если 30 лет назад надо было сидеть и программировать месяцами для простого, то сейчас вот вот наступит эра когда можно будет не управлять десятками и сотнями разработчиков и других, а просто ии сказать делай то и то и самому управлять созданием приложения, а не ждать пока руки свои или других разработчиков это сделают. Сейчас пока ещё нужна мощная структура, архитекторы, разработчиков, qa, devops и прочих, а скоро это не надо будет. Хватит одного.

Sign up to leave a comment.

Articles