Концептуальное программирование

в 16:01, , рубрики: Программирование

Всем привет.

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

Во-первых, сделал я это для того, чтобы привлечь внимание к довольно таки интересному проекту. Этот проект посвящен разработке универсального и расширяемого ЯП.
Во-вторых, я сам уже много лет пытаюсь разработать свой ЯП нового поколения. И наработки автора во многом пересекаются с моими (свои я выложу на хабрахабре несколько позже), а мне было бы интересно отношение аудитории к данной тематике.

Дальше перевод


Концептуальное программирование

Концептуальное программирование — это, изначально, очень простая идея: ваш код должен отражать концепции в вашем приложении.

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

Что же такое концепция?

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

Давайте рассмотрим концепцию, например, сложения. Во многих языках сложение А и B может быть не только написано по-разному(разный синтаксис), но и вести себя по-разному (различная семантика).

Ассемблер
ADD A, B A — мнемоника операции для процессора

С
A+B — встроенный оператор для встроенных типов, который в основном имплементирован используя одну из операций процессора

Java
A+B — встроенный оператор для встроенных типов, который возвращает идентичные результаты, независимо от операций процессора.

C, Java
Add(A, B) — многие языки требуют вызова функции для определенных пользователем типов (или методов в случае Java (прим. переводчика)).

C++
A+B; A.operator+(B) — операторы C++ схожи с С-шными встроенными типами, но могут быть расширены для пользовательских типов.

SmallTalk
A+B — отправляет объекту А сообщение "+" с объектом В в качестве аргумента.

XL
A+B*C MulAdd(A,B,C) — XL операторы редуцируются к вызовам функции используя паттерн сравнения (matching). Стандартная библиотека включает функции или типы чтобы репрезентировать родные операции и типы процессора.

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

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

Что не является коцепцией?

Очевидно, что определение концепции, данное выше — имеет достаточно широкий смысл. Следовательно, возникает вопрос: что не является концепцией? По определению — это или что-то из окружения (environment) программы, что не влияет на вашу программу или что-то, что влияет на вашу программу, но не находится в окружении (environment).

Что не имеет занчения — это большое множество из предметного домена(области), но это урок, который тяжело дается программистам. Например, спортивный эмулятор гонок — это программа, которой не нужно иметь много кода, описывающего поведение зажигалки. Зажигалка — это не концепция для этой программы. Этот пример тривиальный. Но насколько упрощенным может быть ядро игры? Должна резина стираться? Может ли ветровое стекло быть поврежденным? Все это не тривиальные вопросы.

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

Абстрагирование

Концепции должны быть транслированы из предметном домене(области) в программный домен. Этот процесс называется абстрагированием. Важным моментом является то, что абстрагирование может быть разрушающим. То, что возникает в вашем коде — выглядит как оригинальная концепция, но на самом деле не является таковым. Этот момент требует повторения, поскольку мы, программисты, склонны забывать его. Код — это только репрезентация. Концепции живут в предметном домене. Они являются не концепциями в виде кода, а являются только репрезентацией их. Или, как мог бы сказать Магритт: «Это не трубка».

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

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

ЧАВО: Вы скажете, что утверждение о том, что абстрагирование хорошо — это вряд ли новость!

На самом деле, концептуальное программирование подчеркивает, что абстрагирование всегда разрушающее. Всегда есть что-то из концепции, что не возникает в репрезентирующем ее коде. Понимать это и пытаться минимизировать разницу — это ключ к написанию хорошего кода.

В чем же разница или новшество подхода?

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

Хотелось бы добавить, что концептуальное программирование направляло дизайн языка XL. Одним из результатов является то, что XL — это очень расширяемый язык, который позволяет приспосабливать множество различных концепций. Эта расширяемость — это последствие применения концептуального программирования, а не цель сама по себе(эта точка зрения была к сожалению очень размытой в предидущих итерациях веб сайта).
Давайте сравним с функциональными языками более подробно.

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

ЧАВО: Разве это не еще одна из этих столь презренных методологий — серебряных пуль? Концептуальное программирование не привязано к конкретным инструментам или методам. В этом смысле, можно его назвать «универсальным» или «серебряной пулей», если вам так угодно. Концептуальное программирование может помочь вам написать лучший С, С++, List и т.д. код. Я даже применял идеи концептуального программирования к ассемблеру. Концептуальное программирование может наставлять вас в объекто-ориентированных дизайнах или когда вы применяете паттерны или когда используете любую другую методологию.

С другой стороны, концептуальное программирование никогда не будет исправлять код за вас. Так как оно относится к идеям — оно не может быть измерено или посчитано точно. Концептуальное программирование — это больше искусство или квалификация, чем наука.

Christophe de Dinechin


Ознакомиться с оригинальной сттатьей, а также получить дополнительную информацию по языку программирования XL вы можете здесь mozart-dev.sourceforge.net/cp.html

Автор: JinnZest

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js