Pull to refresh

Comments 25

Я тоже интересуюсь прогрессивными парадигмами.


В первой части вы писали:


"Вкратце опишу основную задачу


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


Для того, чтобы приблизить программирование к человеку, надо дать ему возможность неточно программировать. Давайте назовем то, о чем я собираюсь рассказать, парадигмой неточного программирования.
Итак, смотрите, я сейчас объясняю все очень образно, вот так:


  1. Компилятор работает только с точной информацией.
  2. Человек (программист) работает с точной информацией + с неточной информацией.

Предлагаемая парадигма должна поднять работу с неточной информацией на более высокий уровень. Компилятор по-прежнему будет работать только с точной информацией (иначе никак), а язык программирования и IDE должны служить новой парадигме.
На самом деле существующие языки и среды разработки частично, но неосознанно (на мой взгляд) поддерживают парадигму неточного программирования.


Для этого используются:


  1. Комментарии (компилятор игнорирует, программист нет)
  2. Абстракции, имена (компилятору неважно, как именуются константы, переменные, функции, объекты и др., а программисту — важно)
  3. Прочие программные конструкции (компилятор может оптимизировать программные решения под быстродействие и память, а программист оптимизирует для упрощения понимания)

Что значит "полноценная поддержка парадигмы неточного программирования"? А вот интересный вопрос! У меня есть несколько наметок, но мне кажется, что я ухватил взглядом лишь верхушку айсберга. Я проанализировал неточную информацию — в основном это информация от аналитиков, архитекторов ПО и собственные наблюдения и представления программиста. Цель — максимально формализовать и сохранить информацию в проекте, удобно изложить/отобразить и использовать для поддержки разработки. Информация зачастую неформализована, неструктурирована, слабо структурирована. Сейчас для подобной информации используются комментарии как возможность языка для организации "свалки", можно туда еще картинки, звукозаписи и видео сваливать. Надо уйти от свалки, можно же вместо закомменчивания строки кода использовать нормальные инструменты языка программирования??? А список to do в комментах? А обозначить паттерн проектирования (паттерны же у нас хорошо формализованы)?


Точная информация (которая предназначена для компилятора) — тут уже все изъезжено и изжевано.

Да, мне эта тема тоже интересна.
Проблема в том, что языки программирования формальны, они недопускают неоднозначности. Грубо говоря, есть только один жестко заданный путь исполнения программы.
А естественные языки неоднозначны. Ингда одно и то же предложение можно понять разными способами. И опыт и здравый смысл позволяет оценить правильность того или иного варианта.
Было бы интересно найти способ сблизить формальные и неформальные языки. Это открыло бы очень много новых возможностей по автоматизации программирования и тестирования, различным компьютерным помощникам и т.п.

Ну смотрите: неформальная информация имеет частные случаи — полное отсутствие информации, частичная (неполная) информация, вероятностная информация. Дублирование смысла — это синтаксический сахар, наелись уже. :-) А с противоречивой информацией не хотелось бы сталкиваться в программировании.
Ну вот смотрите: предлагаю элементы языка для частичной информации. Допустим мы хотим указать объект или функцию, можем назвать имя и т.п., но не знаем тело объекта или функции.
Мы можем использовать комментарии для того, чтобы в них написать незаконченную функцию или объект. Однако IDE не будет распознавать этот элемент и не может помочь в разработке.
Можно использовать привычные элементы языка для указания незавершенных программных конструкций, но помечать эти конструкции ключевым словом "under_construction". Все просто!


Про вероятностную информацию сложнее, но тоже можно реализовывать: мы можем указывать вероятностные распределения для переменных и выражений. Зачем? Компилятору это не надо, зато программистам важно. Пусть есть выражение в условии if, это выражение может принимать значения false/true. Допустим true вероятность 0.9, false — 0.1. Тогда очень важный момент: становится ясным, что путь выполнения программы then вероятнее (важнее), чем путь else. Это реализация идеи "царская дорога" из отечественной среды разработки ДРАКОН. Среда разработки может вместе с программистом понимать, где более важные элементы кода. Как-то так.

Таким макаром можно наконец-то ввести в языки программирования элементы паттернов проектирования design_pattern, списки todo_list — это элементы, которые говорят, что в коде должно что-то быть, но неконкретизируют.
Хватит закомменчивать строки! Давайте просто ключевое слово использовать типа test_instruction, правда, я думаю, не первый я это придумал, есть же чем-то похожий элемент языка assert() в С++…
Короче, нужно больше идей для метаэлементов языков программирования!
Комментарии, кстати, я предлагаю не просто вставлять посреди кода, а привязывать его к элементам языка, указывать связь. Такое тоже не ново…

Также можно вставлять ссылки на документацию, wiki, задачи в тасктрекере, результаты код ревью, комментарии разработчиков…
Можно в стиле аннотаций это сделать.
Но реализовать это лучше на уровне IDE. Во-первых, не будет привязки к конкретному языку, а во-вторых, все эти дополнительные конструкции потребуют удобных GUI элементов.
Я вообще скептически отношусь к разделению ЯП и IDE. Все говорят, вот сейчас бы язык… Языки вообще для чего придуманы? Чтобы программист мог объяснить компилятору, что делать? С хрена два! Язык нужен, чтобы то, что сформулировал программист, можно было скормить нескольким компиляторам (возможность выбора). А так, в принципе, IDE может без языка и компилятора сгенерировать машинный код напрямую (в теории).
Человек же видит то, что отображает IDE, а не текст на некотором языке (хотя многие IDE настолько тупы).
Не знаю, «неточное программирование» наверное немного некорректная формулировка. Если проанализировать «неточную» информацию в программировании, то я выделил бы две группы информации:
1. Обосновывающая информация (информация о системе заказчика)
1а. Таргет-информация (требования заказчика, обоснование программных решений). Примеры: «Было три варианта, этот лучший, потому что ...», «Наши аналитики провели исследование и выяснили, что оптимальное значение колеблется от 0.1 до 0.3, поэтому я выбрал 0.2».
1б. Факт-информация (фактические процессы у заказчика). Пример: «Кнопку 1 в лифте нажимают чаще других, поэтому обработчик событий ...».
2. Проективная информация. Примеры: «Вот код накидал, но не доделал», «Это я тут закомментил, когда выйдет новая фича, то надо будет раскомментировать».

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

Отдельно хотелось бы выделить проективное программирование. Это то, что реализуется todo_list, under_construction и т.п.
Поиграем?
under_construction Feature class() {} //объявили пустой класс в разработке
Feature Somefeature1 new Feature(); // ошибка компиляции
under_construction Feature Somefeature1 new Feature(); // а так можно
under_construction Somefeature1.func1(); // а так можно? или нет?


Наверное надо кроме ошибок компиляции рассматривать ошибки проектирования (= предупреждение компиляции). То есть для последней строчки ошибки компиляции нет, а ошибка проектирования есть.
Обосновывающая информация обычно хранится в confluence, jira, wiki. Проблема в том, что программисты обычно ленятся что-то писать без крайней необходимости. Их сложно будет убедить продублировать документацию в коде. Но вот связать код с документацией и таск трекерами могло бы иметь смысл. Иногда найти нужную страницу в wiki — довольно нетривиальная задача.

Проективная информация имеет довольно короткое время жизни — пока идет работа над задачей. Думаю, что в большинства случаев будет достаточно простых комментариев. Хотя, возможно, какие-то специальные комментарии-пометки IDE могла бы распознавать и обрабатывать.
Их сложно будет убедить продублировать документацию в коде.

Я бы не исключал того, что будущее программирования не просто в переносе инфы из одной системы в другую или в создании линков между системами а-ля гипертекстовых ссылок, а в полной интеграции систем, когда конструкции в одной системе порождают конструкции в другой системе. Это может сокращать срок разработки, принесет профит.
Тот же under_construction может генерироваться из бэклога таск-трекера. В бэклоге создали новую задачу по запиливанию новой фичи поддержки многоязычного интерфейса (выше мой пример с InternationalSupport) — вот тебе пожалуйста, тимлид обозначил участки кода, подлежащие реконструкции.
Довольно смелые предложения?

Проективная информация имеет довольно короткое время жизни — пока идет работа над задачей.

Работа с кодом — дорогостоящий процесс и в то же время доходный, вспомните, кто самый богатый в мире. Так что про короткое время жизни — это может и верно, но не в этом суть.

P.S. Ещё в список видов неточной информации я отнес бы пояснительную информацию. Обосновывающая информация — это информация о внешних системах (системах пользователей, заказчиков), с которыми взаимодействует программа, а пояснительная информация, наоборот, это информация о коде, о внутренней системе. Просто иногда у программиста не хватает «оперативной памяти», чтобы разобраться в коде. Пояснительную информацию стараются минимизировать по правилу «не комментируй работу кода». Однако там, где оперативки много требуется, то можно разместить поясняющую диаграмму или какой-нибудь граф.
Ещё в пару с under_construction {} нужно сделать возможность удаления некоторого валидного кода. Это такой код, который рабочий, но должен быть помечен как to_delete {} или to_exchange {} by {}. И добавить идентификатор изменения, который сгруппировал бы все планируемые изменения.

under_construction InternationalizationSupport {Feature class() {} }
// некий код
under_construction InternationalizationSupport {Feature Somefeature1 new Feature();}
// некий код
to_exchange InternationalizationSupport {// некий компилируемый код}
by {Somefeature1.func1();}


Как-то так.
Чтобы пользоваться X языком для описания знаний в идеале нужен прямой конвертер ЕЯ -> язык X. Зачем делать то, что можно не делать? Не вижу высокого уровня абстракции, который мог бы это позволить.
При ней
concept unpaidBill is bill where amountToPay > amountPaid;
превратился бы в
concept unpaid is not paid;
property paid of bill, agent

В идеале хотелось бы так. Но на практике создать язык, который был бы одновременно универсальным, абстрактным, гибким, удобным и быстрым, пока никому не удалось. В каждой нише свой язык описания знаний.
Ваш пример похож на OWL, который применяется для создания больших онтологий. В нем есть и свойства, и инверсия свойств, и классы, и пересечения и объединения класов.
Ну а я нацелен на интеграцию данных, работу со слабоструктурированными данными, моделирование в ООП стиле, где будет удобным явное описание структур.
Что не удалось это да, но серьезные попытки сделать язык знаний, близкий к ЕЯ и строго формальный были. Один из них описан в этом документе, может пригодиться как пища для размышлений docs.google.com/document/d/1lkqVj4YhzJAwpkphKXymOYb5KpQfoYI5-95DueRKTp0/edit?usp=sharing
был сделан неутешительный вывод об отсутствии в открытом доступе работоспособной теории, объединяющей все аспекты естественного языка (ЕЯ) в единую систему и позволяющей производить строгие вычисления, необходимые для определения совпадения или различия смысла текста

Строгих вычислений быть не может)
Может. Если система может сторого посчитать-доказать, что факт X достоверен с точностью Y, то это строгое вычисление.
Когда-то в русском языке ударение в слове «звонит» признают правильным на обе гласные буквы. Попробуй тут подсказывать с высокой точностью что-то...)
А так да, в аксиоматических системах можно доказывать строго. В естественном языке изначальная аксиома — кто как понял, тот так и крутится. То есть все субъективно. Даже если вы изобретете машину, доказывающую что-то в ЕЯ, вы должны быть готовы, что найдется субъект, который не согласится, только потому что религия не позволяет или звёзды в небе не сошлись, и в его голове это будет правильно. А представьте себе 90% населения будут несогласны? Запросто! Так что требуется не доказательство, а имитация.
Система оперирует предоставленными фактами и выводит на них. даете другие факты, получаете другой результат. вообще не проблема, кто там согласен или нет — вот доказательсво на этих фактах. имитация, как по мне, — тема, перпендикулярная логике.
Очень интересный проект! Когда я начинал свой проект, мои цели были похожими. Меня интересовало создание агента, который смог бы выполнить инструкции, записанные на естественном языке. Я начал с вопроса, как объединить декларативные определения с императивными командами. Но постепенно в процессе экспериментов сместился в область мульти-парадигменного программирования.
Соберусь как-нить написать о его последыше для медицины. Гибрид с нейросетью и формализм там проще и понятней. Этот, который в ссылке, устарел на 10 лет. Все рабочее).

Возможно вас заинтересует проект, которым я занимаюсь. Суть его как раз в том, чтобы дать обычному пользователю интерфейс позволяющий управлять его семантической сетью из фреймов. На главной странице можно глянуть видео, как за 15 минут с нуля собрать свой менеджер задач. А тут можно глянуть презумпцию в формате json.tree, по которой строится интерфейс редактирования концептов. Он позволяет описывать свойства более наглядно. В перспективе я думаю добавить вычисляемые свойства, значения которых реактивно зависит от формулы и свойств других фреймов.


Оригинален ещё и подход к наследованию — вместо хардкода свойства "родитель-потомок" используется флаг у связи. Если он взведён, то фрейм будет брать описание свойств из фрейма, на который указывает свойство. Полезно это для кейсов вида: если для товара выбран тип "автомобиль", то у него появляются свойства автомобиля такие как "скорость", "мощность мотора", "тип двигателя". И если выбран электрический тип двигателя, то добавляется свойство "ёмкость батарей" и так далее.

Спасибо! Посмотрю. Графический интерфейс был бы полезен во многих сферах применения семантических сетей. Я тоже планировал создать в будущем графический интерфейс для своего проекта, но пока еще не добрался до этого.

Ещё я пробовал сделать rdf браузер, но всё упирается в то, что далеко не все неймспейсы выдают по своим ссылкам что-то машиночитаемое. Да и CORS многие не поддерживают. В общем, пишите, если что, сколаборируемся.

Обязательно! Дам знать, когда буду готов.
Sign up to leave a comment.

Articles