[Перевод] Design-Oriented Programming (DOP) от автора инновационно-революционного языка AsmX

55d736bc76867c592e731e9d383302f8.jpg

Комментарий публикующего

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

Ссылка на оригинал: https://github.com/langprogramming-AsmX/Specification-DOP.

Design-Oriented Programming (DOP)

Design-Oriented Programming (DOP) introduces a new paradigm that prioritizes the design and construction of programs using building blocks called blocks or bricks. In this article, we will delve into the specifics of Design-Oriented Programming and distinguish it from other programming paradigms.

Understanding Programming Paradigms Before exploring Design-Oriented Programming, it is essential to grasp the concept of programming paradigms. A programming paradigm comprises a set of ideas and concepts that define the style of writing computer programs. It establishes an approach to programming that governs the organization and structure of a program.

Programming paradigms include Imperative programming, Declarative programming, and Object-Oriented programming.

Дизайно-ориентированное программирование

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

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

Парадигмы программирования включают Императивное программирование, Декларативное программирование и Объектно-ориентированное программирование.

Imperative Programming

Imperative programming involves writing instructions (commands) directly into a program’s source code. These instructions must be followed sequentially, and subsequent instructions can access data from previous instructions stored in memory. It adopts a step-by-step, sequential approach to programming.

Императивное программирование

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

Declarative Programming

In contrast to imperative programming, declarative programming focuses on specifying the problem’s solution rather than the step-by-step process to obtain it. Declarative languages such as HTML and SQL enable programmers to describe the desired result without providing detailed steps.

Декларативное программирование

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

Object-Oriented Programming (OOP)

Object-Oriented Programming is a widely adopted programming paradigm that revolves around objects encapsulating both data (fields) and code (procedures). Objects can be organized into classes, serving as blueprints for creating object instances. OOP facilitates encapsulation, inheritance, and polymorphism, promoting modular and reusable code.

Объектно-ориентированное программирование (ООП)

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

Design-Oriented Programming (DOP)

Introducing Design-Oriented Programming (DOP) Design-Oriented Programming approaches programming differently compared to the mentioned paradigms. DOP focuses on constructing programs using building blocks or blocks. These blocks serve as program constructors and can be directly written into the source code. The key aspects of Design-Oriented Programming are:

  • Blocks are implemented in the program’s source code.

  • Blocks can be utilized to construct classes, functions, or entire programs.

  • Blocks can contain other blocks, establishing a hierarchical structure.

  • Blocks can be components of various structures like methods and loops.

In Design-Oriented Programming (DOP), a block is a building block or brick that serves as a program constructor. Blocks are implemented directly in the program’s source code and can be utilized to construct classes, functions, or even entire programs. They can contain other blocks, establishing a hierarchical structure. Blocks can be components of various structures like methods and loops.

The roots of DOP can be traced back to the AsmX programming language. Let’s explore an AsmX example to grasp the working of DOP:

@using method setType;
@using method getType;
@constructor create(self):
@call print('Created animal');
@class Animal:
@bind constructor  create;
@bind method setType;
@method setType(type):
    self.type type;

@class Dog extends Animal:
@bind constructor  create;
@bind method getType;
@method getType():
    @call print(self.type)

@create class Dog dog; # Created Animal
@call class::dog();
@create class Dog siba; # Created Animal
@call class::siba();
@call dog->setType('Dog');
@call dog->getType(); # Dog
@call siba->setType('Siba Inu');
@call siba->getType(); # Siba Inu

In this example, methods are treated as blocks or bricks that can be bound within a class. Constructors, destructors, blocks, and classes themselves are all employed in DOP.

The Fundamental Principle of DOP At the heart of Design-Oriented Programming lies the idea of constructing programs using building blocks. These blocks serve as the fundamental units of the program and can be combined and interconnected to create complex computational structures.

The specificity of DOP lies in its emphasis on program design and construction. Instead of solely focusing on the sequence of steps or the desired result, DOP encourages programmers to think in terms of building blocks and their connections. This approach promotes modularity, reusability, and a clear design hierarchy.

Specializing with DOP Design-Oriented Programming enables specialization in various domains and problem spaces. Programmers can tailor the construction of programs to specific requirements and constraints by utilizing different blocks and organizing them differently.

Whether it involves building a todo list application or implementing a loop, DOP offers the flexibility and modularity necessary for creating specialized solutions. Let’s see an example of a todo list and a loop in DOP:

# Define the first task
@task first:
    @call print('task 1');
Define the second task
@task second:
@call print('task 2');
@set three i8 255;
Define the third task
@task three:
@call print('task 3');
@call print(set::three);
Define the First todolist
@todolist First:
@bind task first;
@bind task second;
@bind task first;
Define the Second todolist
@todolist Second:
@bind task second;
@bind task first;
@bind task second;
@bind task first;
@bind task three;
Create an instance of the First todolist with the first task
@create todolist First first;
Run the first task in the First todolist
@call todolist::first::run(); # task 1
@call todolist::first::run(); # task 2
View the contents of the First todolist
@call todolist::first::view();
Create an instance of the Second todolist with the second task
@create todolist Second second;
View the contents of the Second todolist
@call todolist::second::view();
Run the tasks in the Second todolist in serial order
@call todolist::second::runSerial();
View the contents of the Second todolist
@call todolist::second::view();

Loop example:

# Block for loop
@for name:
    @call print('text');
@execute for name 0x03;  # Execute the for loop 3 times

These examples illustrate how blocks can be employed in DOP to create specialized functionality and construct programs to meet specific requirements.

Дизайно-ориентированное программирование (ДОП)

Представляем Дизайно-ориентированное программирование (ДОП) Дизайно-ориентированное программирование предлагает подход к программированию, отличный от упомянутых парадигм. ДОП фокусируется на создании программ, используя строительные блоки или блоки. Эти блоки служат конструкторами программы и могут быть прописаны напрямую в исходный код программы. Ключевые аспекты дизайно-ориентированного программирования:

  • Блоки создаются в исходном коде программы.

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

  • Блоки могут содержать другие блоки, устанавливая иерархическую структуру.

  • Блоки могут быть компонентами различных структур, таких как методы и циклы.

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

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

@using method setType;
@using method getType;
@constructor create(self):
@call print('Created animal');
@class Animal:
@bind constructor  create;
@bind method setType;
@method setType(type):
    self.type type;

@class Dog extends Animal:
@bind constructor  create;
@bind method getType;
@method getType():
    @call print(self.type)

@create class Dog dog; # Created Animal
@call class::dog();
@create class Dog siba; # Created Animal
@call class::siba();
@call dog->setType('Dog');
@call dog->getType(); # Dog
@call siba->setType('Siba Inu');
@call siba->getType(); # Siba Inu

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

Фундаментальный принцип ДОП В основе дизайно-ориентированного программирования лежит идея конструирования программ с использованием троительных блоков. Эти блоки служат фундаментальными еденицами программы и могут быть скомбинированы и соединены для создания комплексных вычислительных структур.

Специфика ДОП — её акцентирование на дизайне и конструкции программы. Вместо того, чтобы фокусироваться только на последовательности шагов или желаемом результате, ДОП поощряет программистов за мышление c точки зрения блоков и их соединений. Такой подход предоставляет модульность, переиспользуемость и ясную иерархию дизайна.

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

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

# Define the first task
@task first:
    @call print('task 1');
Define the second task
@task second:
@call print('task 2');
@set three i8 255;
Define the third task
@task three:
@call print('task 3');
@call print(set::three);
Define the First todolist
@todolist First:
@bind task first;
@bind task second;
@bind task first;
Define the Second todolist
@todolist Second:
@bind task second;
@bind task first;
@bind task second;
@bind task first;
@bind task three;
Create an instance of the First todolist with the first task
@create todolist First first;
Run the first task in the First todolist
@call todolist::first::run(); # task 1
@call todolist::first::run(); # task 2
View the contents of the First todolist
@call todolist::first::view();
Create an instance of the Second todolist with the second task
@create todolist Second second;
View the contents of the Second todolist
@call todolist::second::view();
Run the tasks in the Second todolist in serial order
@call todolist::second::runSerial();
View the contents of the Second todolist
@call todolist::second::view();

Пример цикла:

# Block for loop
@for name:
    @call print('text');
@execute for name 0x03;  # Execute the for loop 3 times

Эти примеры иллюстрирует применение блоков в ДОП для создания специализированного функционала и сконструировать программы, соответствующие специфичным требованиям.

Design-Oriented Programming (DOP) VS Object-Oriented Programming (OOP)

Design-Oriented Programming (DOP) is a programming paradigm that focuses on the design and construction of programs using building blocks called blocks or bricks. These blocks are implemented directly in the source code and can be used to construct classes, functions, or even entire programs. Blocks can also contain other blocks, establishing a hierarchical structure. DOP encourages programmers to think in terms of building blocks and their connections, promoting modularity, reusability, and a clear design hierarchy.

On the other hand, Object-Oriented Programming (OOP) is another widely adopted programming paradigm that revolves around objects encapsulating both data and code. Objects are organized into classes, serving as blueprints for creating object instances. OOP facilitates encapsulation, inheritance, and polymorphism, promoting modular and reusable code.

The main difference between DOP and OOP lies in their approach to programming. DOP prioritizes the design and construction of programs using building blocks, while OOP focuses on objects and their interaction. DOP views a program as a collection of interconnected blocks, creating complex computational structures. In contrast, OOP views a program as a collection of objects, with each object having its own data and behavior.

DOP is not OOP because it does not involve the use of objects and their interaction. Instead, DOP uses blocks as the fundamental units of a program, which can be combined and interconnected to create complex structures. While OOP promotes modularity and reusability through encapsulation and inheritance, DOP achieves these goals through the design and construction of programs using building blocks.

In conclusion, DOP and OOP are two distinct programming paradigms. DOP prioritizes the design and construction of programs using building blocks, while OOP revolves around objects encapsulating both data and code. Understanding the differences between these paradigms is essential for programmers to choose the most appropriate approach for their specific programming requirements.

Отличия дизайно-ориентированного программирования от объектно-ориентированного программирования

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

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

Главное различие между ДОП и ООП состоит в их подходе к программированию. ДОП фокусируется на конструировании программ при помощи блоков, в то время как ООП фокусируется на объектах и их взаимодействии. ДОП представляет программу, как коллекцию соединённых блоков, создающих сложные вычислительные структуры. В отличии от ДОП, ООП представляет программу, как коллекцию объектов, каждый из которых имеет свои данные и поведеие.

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

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

The difference between DOP and OOP

Unlike traditional class-based object-oriented programming, blocks in DOP do not encapsulate both data and code like objects do. Instead, blocks focus on the construction of programs and their design. They serve as fundamental units of the program and can be combined and interconnected to create complex computational structures. Blocks in DOP promote modularity, reusability, and a clear design hierarchy.

In summary, blocks in DOP are program constructors that can be implemented directly in the program’s source code. They serve as fundamental units and can be combined and interconnected to create complex structures. Unlike objects in object-oriented programming, blocks in DOP do not encapsulate both data and code. Instead, they focus on the design and construction of programs.

Отличия ДОП и ООП

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

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

Conclusion

Design-Oriented Programming represents a unique paradigm that emphasizes the design and construction of programs using building blocks. By utilizing blocks as program constructors, DOP promotes modularity, reusability, and clear design hierarchies.

Originating from the AsmX programming language, DOP offers a flexible and specialized approach to programming. Whether constructing todo lists, implementing loops, or solving complex problems, DOP presents a fresh perspective on program development.

Incorporating Design-Oriented Programming principles into your development toolkit can expand your programming abilities and empower you to create well-designed, modular, and adaptable programs. Embrace the power of DOP and unlock new possibilities on your programming journey.

Заключение

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

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

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

Вопросы к автору оригинального текста

За время написания статьи на гитхабе Илона Маска появилась секция с часто задаваемыми вопросами, в которой приведены ответы на очевидные вопросы. 90 процентов этих ответов — копипаст пердложений из статьи, которые дают очень размытый ответ, недостаточный для понимая, а тем более использования или имплементации этой парадигмы в самописных языках программирования. Так же не указаны проблемы, которые эта парадигма решает лучше, чем ООП или любая надстройка над ним (Дата-ориентированный дизайн, например).

Вместо практически бесполезного перевода этой секции вставлю несколько вопросов от себя. Начнём с вопросов по основным принципам ДОП и определению блока:

  • Blocks are implemented in the program’s source code. Блоки создаются/реализуются в исходном коде программы. А что и в какой парадигме вообще происходит вне кода программы? Какую информацию несёт этот принцип?

  • Blocks can be utilized to construct classes, functions, or entire programs. Блоки могут быть использованы для создания/конструирования классов, функций или даже целых программ. Какой механизм это позволяет? Как создать класс из блока/с помощью блока? А функцию? А программу? Какую информацию несёт в себе блок, чтобы предоставлять такие возможности? Может ли блок конструировать функции так, как не способны, например, функции высшего порядка из любого уважающего себя функционального языка программирования? Зачем создавать класс из блока, когда можно написать его вручную? Это ускоряет разработку? Или даёт новые возможности?

  • Blocks can contain other blocks, establishing a hierarchical structure. Блоки могут содержать другие блоки, устанавливая иерархическую структуру. Что значит «содержать»? Это владение, как ресурсом? Или может имеется ввиду вложенность, как у классов? Или как у пространств имён? Какую информацию от блока родителя в таком случае может получить вложенный блок? Как это влияет на выделение памяти? Блоки вообще появляются в бинарях? Или они как классы, которые существуют только в исходном коде?

  • Blocks can be components of various structures like methods and loops. Блоки могут быть компонентами различных структур, таких как методы и циклы. Что такое вообще компонент метода/цикла? «Различные структуры» — это какие? Есть список? Или определение, которому должна соответствовать структура? Или это только методы и циклы?

Теперь к общим вопросам к статье:

  • Почему так много самоповтора? Последние абзацы буквально собраны из предложений, взятых из первых.Где потерялась полезная информация о парадигме, примеры, вставки кода? Почему СПЕЦИФИКАЦИЯ парадигмы такая размытая? Почему вместо этого объём набивается практически идентичными абзацами?

  • Как со всем этим цирком связан AsmX? Почему ДОП произростает из него? Какие особенности языка это позволяют? Не конфликтует ли это с обещанной низкоуровневостью?(Ясен красен, что конфликтует, тут парадигам — надстройка над ООП, хотя скорее это и есть ООП.) Как выглядит блок/кирпич в AsmX? О какой вложенности блоков идёт речь в языке, который не позволяет написать функцию внутри пространства имён, выдавая ошибку в духе «Вы не имеете права объявлять функцию в пространстве имён».

  • Самое главное, а для решения каких проблем создана эта парадигма? Какие задачи ООП/ФП/Мультипарадигменные языки программирвоания не могут решить, но способна ДОП? Или какие задачи она решает лучше?

И финальный вопрос, почему в статье о парадигме всего вышеперечисленного нет? Почему есть место для принятия мощи парадигмы в заключении, но нету места для ещё пары примеров?

© Habrahabr.ru