Программирование с помощью таблиц

velkin velkin

Мышление


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

1) восприятие
2) воображение
3) словесное
4) отвлечённое

Бизнес


Возьмём для примера бизнес, подавляющее большинство использует таблицы. Раньше это был Microsoft Office Excel, в наше время многие переходят на LibreOffice Calc, что в принципе почти одно и тоже с точки зрения базового функционала. И не только для документации, для интернет магазинов тоже преимущественно предпочитают набирать данные в таблицах, а потом импортировать в CMS.

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


Следующим пунктом вспоминаются системы метапрограммирования, такие как JetBrains MPS. Лично я без понятия как там всё работает, но могу провести точно такую же аналогию, где CMS соответствует системам метапрограммирования. И то и другое решение специализировано, но вот таблицы нет.

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

Привет мир


Приступим к тестированию идеи. Лично я буду использовать Geany в качестве IDE.

print ("Привет мир!!!")

Вспомним расширенную форму Бэкуса-Наура

1) Терминальные символы — это минимальные элементы грамматики, не имеющие собственной грамматической структуры.
2) Нетерминальные символы — это элементы грамматики, имеющие собственные имена и структуру.


Вид формул

  снимок экрана 01
http://files.rsdn.org/99832/metatable_helloworld_01.png

категории    отступы    нетерминал            
глобально/функция/приветмир        =CONCAT(B3:D10)            
            =B13        
    =B17        =CONCAT(B5:E10)        
                =B14    
                =CONCAT(B7:F9)    
                    =B16
                    =B12
                    =B16
                =B15    
категории    терминал                
литерал/строковый/приветмир    Привет мир!!!                
функция/название    print                
функция/параметры/начало    (                
функция/параметры/конец    )                
литерал/строковый/ограничение    "                
отступ/пробел


Вид текста

  снимок экрана 02
http://files.rsdn.org/99832/metatable_helloworld_02.png

категории    отступы    нетерминал            
глобально/функция/приветмир        print ("Привет мир!!!")            
            print        
             ("Привет мир!!!")        
                (    
                "Привет мир!!!"    
                    "
                    Привет мир!!!
                    "
                )    
категории    терминал                
литерал/строковый/приветмир    Привет мир!!!                
функция/название    print                
функция/параметры/начало    (                
функция/параметры/конец    )                
литерал/строковый/ограничение    "                
отступ/пробел


Запуск


Копирую строчку C2 в Geany в файл source.lua и запускаю.
  снимок экрана 03
http://files.rsdn.org/99832/metatable_helloworld_03.png

Вывод в консоль:
Привет мир!!!

Предназначение


Для чего нужна подобная система:
1) микроконтроль
2) метаданные

Смотри также:
1) Модифицируемость кода (Changeability QA)
2) Отсечение целей (сложность разработки)

продолжение следует...
velkin
velkin
09.02.2021 07:19

Вложения и отступы


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

Для этого можно использовать универсальную формулу:
=CONCAT($B##;..)
=CONCAT($B##;..:..)

Где ## это номер текущей строки в которой находится формула, а .. ячейка терминала или диапазон нетерминалов.

Так же сделан стандартный отступ от левого края уровня 1:
=CONCAT(CHAR(10);"    ")

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

Вид формул

  снимок экрана 01
http://files.rsdn.org/99832/metatable_goodbyeworld_01.png

категории    отступы    нетерминал                
глобально/функция/        =CONCAT($B2;D3:D20)                
глобально/функция/мир/привет            =CONCAT($B3;E4:E11)            
/./././.                =CONCAT($B4;B24)        
/./././.    =B28            =CONCAT($B5;F6:F11)        
/./././.                    =CONCAT($B6;B25)    
/./././.                    =CONCAT($B7;G8:G10)    
/./././.                        =CONCAT($B8;B27)
/./././.                        =CONCAT($B9;B22)
/./././.                        =CONCAT($B10;B27)
/./././.                    =CONCAT($B11;B26)    
глобально/функция/мир/пока    =B29        =CONCAT($B12;E13:E20)            
/./././.                =CONCAT($B13;B24)        
/./././.    =B28            =CONCAT($B14;F15:F20)        
/./././.                    =CONCAT($B15;B25)    
/./././.                    =CONCAT($B16;G17:G19)    
/./././.                        =CONCAT($B17;B27)
/./././.                        =CONCAT($B18;B23)
/./././.                        =CONCAT($B19;B27)
/./././.                    =CONCAT($B20;B26)    
категории    терминал                    
литерал/строковый/мир/привет    Привет мир!!!                    
литерал/строковый/мир/пока    Пока мир!!!                    
функция/название    print                    
функция/параметры/начало    (                    
функция/параметры/конец    )                    
литерал/строковый/ограничение    "                    
отступ/функция                         
отступ/уровень/1    =CONCAT(CHAR(10);"    ")


Вид текста

  снимок экрана 02
http://files.rsdn.org/99832/metatable_goodbyeworld_02.png

категории    отступы    нетерминал                
глобально/функция/        print ("Привет мир!!!")
    print ("Пока мир!!!")                
глобально/функция/мир/привет            print ("Привет мир!!!")            
/./././.                print        
/./././.                  ("Привет мир!!!")        
/./././.                    (    
/./././.                    "Привет мир!!!"    
/./././.                        "
/./././.                        Привет мир!!!
/./././.                        "
/./././.                    )    
глобально/функция/мир/пока    
            
    print ("Пока мир!!!")            
/./././.                print        
/./././.                  ("Пока мир!!!")        
/./././.                    (    
/./././.                    "Пока мир!!!"    
/./././.                        "
/./././.                        Пока мир!!!
/./././.                        "
/./././.                    )    
категории    терминал                    
литерал/строковый/мир/привет    Привет мир!!!                    
литерал/строковый/мир/пока    Пока мир!!!                    
функция/название    print                    
функция/параметры/начало    (                    
функция/параметры/конец    )                    
литерал/строковый/ограничение    "                    
отступ/функция                         
отступ/уровень/1


Запуск


Копирую строчку C2 в Geany в файл source.lua и запускаю программу:
print ("Привет мир!!!")
    print ("Пока мир!!!")

Вывод в консоль:
Привет мир!!!
Пока мир!!!

  снимок экрана 03
http://files.rsdn.org/99832/metatable_goodbyeworld_03.png

продолжение следует...
velkin
velkin
09.02.2021 12:07

Прототипирование интерфейсов


1) Создаю новый лист, для примера назову его lua.сетка.

2) Выставляю ширину и высоту всех ячеек в 0,45 см.
  снимок экрана 01
http://files.rsdn.org/99832/metatable_uiprototype_01.png

  снимок экрана 02
http://files.rsdn.org/99832/metatable_uiprototype_02.png

3) Набираю литералы на старом листе lua.
  снимок экрана 03
http://files.rsdn.org/99832/metatable_uiprototype_03.png

категории    отступы    терминал
окно/главное/меню/файл/ru        Файл
окно/главное/меню/правка/ru         Правка
окно/главное/меню/вид/ru         Вид
окно/главное/меню/инструменты/ru         Инструменты
окно/главное/меню/окно/ru         Окно
окно/главное/меню/справка/ru         Справка
окно/главное/заголовок/название/ru        Прототип
окно/главное/меню/файл/en        File
окно/главное/меню/правка/en         Edit
окно/главное/меню/вид/en         View
окно/главное/меню/инструменты/en         Tools
окно/главное/меню/окно/en         Window
окно/главное/меню/справка/en         Help
окно/главное/заголовок/название/en        Prototype
окно/главное/заголовок/иконка        📦
окно/главное/заголовок/свернуть        _
окно/главное/заголовок/развернуть        [ ]
окно/главное/заголовок/закрыть        x

4) Создаю линейку 24x18 на листе lua.сетка.

5) Объединяю ячейки (у меня ручная настройка сочетаний клавиш)
ctrl+shift+a объединить ячейки
ctrl+shift+s разъединить ячейки

6) Добавляю формулы русской версии и дублирую таблицу для английской версии.
  снимок экрана 04
http://files.rsdn.org/99832/metatable_uiprototype_04.png

=''.$C46    =''.$C38                                                                                =''.$C47    =''.$C48    =''.$C49
=CONCAT(''.$B32:$C37)

=''.$C46    =''.$C45                                                                                =''.$C47    =''.$C48    =''.$C49
=CONCAT(''.$B39:$C44)

7) И наконец текстовый вид
  снимок экрана 05
http://files.rsdn.org/99832/metatable_uiprototype_05.png

📦    Прототип                                                                                _    [ ]    x
Файл Правка Вид Инструменты Окно Справка

📦    Prototype                                                                                _    [ ]    x
File Edit View Tools Window Help

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

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

продолжение следует...
Dym On
Dym On
09.02.2021 08:24
Здравствуйте, velkin, Вы писали:

Коллега, а можно, в общих чертах, так сказать, крупными мазками намекнуть: а какую проблему ты решаешь?
Muxa
Muxa
09.02.2021 09:02
DO>Коллега, а можно, в общих чертах, так сказать, крупными мазками намекнуть: а какую проблему ты решаешь?

Мне показалось он её пока что создаёт. Решать будет позже, надо ждать следующего топика.
velkin
velkin
10.02.2021 04:12
Здравствуйте, Dym On, Вы писали:

DO>Коллега, а можно, в общих чертах, так сказать, крупными мазками намекнуть: а какую проблему ты решаешь?


V>Предназначение
V>Для чего нужна подобная система:
V>1) микроконтроль
V>2) метаданные


С помощью метаданных можно управлять изменениями в коде. Например, есть функционал (features) A, B, C, но он раскидан по строкам и файлам. Чтобы добавить конкретный функционал C, нужно внедрить его внутрь строк или вставить несколько строчек в разные файлы, и так же обратная операция удалить функционал. Тоже самое касается, если нужно посмотреть или изменить код. По сути это классический CRUD. Но я же не зря начал с темы про мышление, ведь изначально никак не задокументировано где конкретно находится функционал A, B, C, эта информация существует лишь в голове написавшего программиста, если уже не забылась.

Или микроконтроль:

V>отступ/функция
V>отступ/уровень/1

Для примера отступ между названием функцией и параметрами это не тот же самый отступ, как в других местах. Всё это определяет стиль форматирования кода. Но гораздо важнее управление самим кодом, возможность ставить ссылки. Это позволяет проводить множество операций из науки логики. К примеру, const в C++ это ключевое слово, но используется в разных конструкциях по-разному, просто авторы языка решили назвать это одинаково. Причём они назвали всё по-английски.

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

В конечном итоге код это не просто какой-то текст, он парсится и преобразуется в абстрактное синтаксическое дерево. Из конструкций языка можно создать собственные конструкции, но в тексте всё это никак особо не обозначено. У меня уже давно много вопросов. Например, является ли сплошной текст идеальной формой записи кода, и ответ явно нет, нежели да. Целесообразность хранения мелких деталей производства программ в голове, а не на внешнем носителе. Как работать с сильно возросшими объёмами данных, где данные это так же программы и библиотеки алгоритмов.

И я уже написал в самом начале, что бизнес при работе с данными использует таблицы, а могли бы писать сплошной текст как программисты. Может бизнесмены поголовно идиоты, они не знают, что есть редактор простого текста — являющийся высшей формой эволюции для работы с данными? Потому проверить идею таблиц совсем не повредит.
velkin
velkin
10.02.2021 06:01

Данные


Да́нные — зарегистрированная информация; представление фактов, понятий или инструкций в форме, приемлемой для общения, интерпретации, или обработки человеком или с помощью автоматических средств (ISO/IEC/IEEE 24765-2010).

Данные (вычислительная техника) — поддающееся многократной интерпретации представление информации в формализованном виде, пригодном для передачи, связи, или обработки (ISO/IEC 2382-1:1993).

Метаданные (от лат. meta — цель, конечный пункт, предел, край и данные) — информация о другой информации, или данные, относящиеся к дополнительной информации о содержимом или объекте.


Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике.

Тип данных (тип) — множество значений и операций над этими значениями (IEEE Std 1320.2-1998).

Объе́кт (в программировании) — некоторая сущность в цифровом пространстве, обладающая определённым состоянием и поведением, имеющая определённые свойства (атрибуты) и операции над ними (методы).

Состояние (информатика) цифровой логической схемы или компьютерной программы является техническим термином для всей хранимой информации, к которой схема или программа в данный момент времени имеет доступ.


Формат данных — спецификация структуры данных.

Двоичные данные — последовательность произвольных байтов.

Те́кстовые да́нные (также те́кстовый форма́т) — представление информации строкового типа (то есть, последовательности печатных символов) в вычислительной системе.


Ба́за да́нных — представленная в объективной форме совокупность самостоятельных материалов.

Модель данных — формальная теория представления и обработки данных в системе управления базами данных (СУБД).

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


Структуры и типы данных


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

Опять же если взять C/C++ и некоторые другие языки, то встроенные типы это по сути машинные команды, а вот структуры это типы определяемые пользователем. Иначе говоря в высокоуровневых языках программирования и то и другое является определёнными конструкциями.

Объекты и состояния данных


При формализации некой системы гораздо удобнее пользоваться конкретными, а не абстрактными понятиями. Это значит вместо структур и типов проще ориентироваться на объекты и их состояния. Для примера, понять как работать с неким общим списком имён сложнее, чем если представить списки имён в разных состояниях, таких как пустой список имён "", или список имён с несколькими именами "Вася; Коля; Миша;".
  снимок экрана 01
http://files.rsdn.org/99832/metatable_datastate_01.png

категории    типы    состояние
математика/арифметика/число/пи    вещественное одинарное    3,14159265
литерал/строковый/мир/привет    строка unicode    Привет мир!!!
литерал/строковый/мир/пока    строка unicode    Пока мир!!!

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

продолжение следует...
velkin
velkin
12.02.2021 10:01

Управление изменениями


Переходим к более сложному примеру взятому из статьи Модифицируемость кода (Changeability QA).

Простой исходный код в котором изменениями никак не управляют.
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    return EXIT_SUCCESS;
}

Далее вводится понятие функционала.
Предположим есть некий функционал:
1. ...
2. …
3. поздороваться с миром
n. …

И наконец одно из решений, заключающееся в установке маркеров изменений.
#include <stdlib.h>
#include <stdio.h> // 3.c

int main(int argc, char* argv[])
{
    printf("Hello World!\n"); // 3.c
    return EXIT_SUCCESS;
}

Сразу вылезают два очевидных недостатка:
1) Код содержит лишние данные, такие как маркеры изменений, и чем они больше, тем больше засорения.
2) Управлять изменениями нужно не только на уровне строк, но и на уровне подстрок, чего не наблюдается.

Упрощение таблицы


Произведены следующие улучшения структуры таблицы.

1) Зелёный цвет обозначает заголовки столбцов


Пример:
функционал
функционал    нетерминал    отступ    1    2    3    4
функционал    нетерминал
функционал    терминал

2) Синий цвет это строки терминальных данных


Просто данные без всяких ссылок.

3) Жёлтый цвет это строки ссылочных нетерминальных данных


Пример:
строка 6
=$B$39    =$C$39

В строке располагаются ссылки на литералы. Номер строки, в данном случае 39, должен совпадать в обоих столбцах, так как есть две ссылки, на описание и на сам терминал. Комментарий должен быть всегда в одном и том же столбце, таком как B. Сама же ссылка на терминал может смещаться для удобства чтения по уровням:
столбец D уровень 1
столбец E уровень 2
столбец F уровень 3
столбец G уровень 4

Знаки доллара в номерах ячеек поставлены для того, чтобы правильно срабатывали операции с блоками ячеек:
1) Вырезать, копировать.
2) Вставить.

4) Оранжевый цвет это строки объединённых нетерминальных данных


ячейка B5
=CONCAT(C6:G37)
ячейка C39
=CONCAT(D40:D41)

Пока ещё думаю в каком столбце их лучше помещать: B, С и так далее.

Разобранный пример


  Вид формул
функционал                        
печатать/приветмир                        
приложение/точкавхода                        
функционал    нетерминал    отступ    1    2    3    4
    =CONCAT(C6:G37)                    
=$A$3    =$B$39        =$C$39            
=$A$3    =$B$44    =$C$47    =$C$44            
=$A$3    =$B$52            =$C$52        
=$A$3    =$B$45        =$C$45            
=$A$2    =$B$39    =$C$49    =$C$39            
=$A$2    =$B$44    =$C$47    =$C$44            
=$A$2    =$B$53            =$C$53        
=$A$2    =$B$45        =$C$45            
=$A$3    =$B$57    =$C$50    =$C$57            
=$A$3    =$B$59    =$C$47    =$C$59            
=$A$3    =$B$62        =$C$62            
=$A$3    =$B$57            =$C$57        
=$A$3    =$B$69    =$C$47            =$C$69    
=$A$3    =$B$58    =$C$48        =$C$58        
=$A$3    =$B$73                =$C$73    
=$A$3    =$B$70    =$C$47            =$C$70    
=$A$3    =$B$71                =$C$71    
=$A$3    =$B$72                =$C$72    
=$A$3    =$B$63        =$C$63            
=$A$3    =$B$54    =$C$49    =$C$54            
=$A$2    =$B$60    =$C$51        =$C$60        
=$A$2    =$B$62            =$C$62        
=$A$2    =$B$65                =$C$65    
=$A$2    =$B$67                    =$C$67
=$A$2    =$B$68                    =$C$68
=$A$2    =$B$66                =$C$66    
=$A$2    =$B$63            =$C$63        
=$A$2    =$B$61            =$C$61        
=$A$3    =$B$64    =$C$51        =$C$64        
=$A$3    =$B$56    =$C$47            =$C$56    
=$A$3    =$B$61            =$C$61        
=$A$3    =$B$55    =$C$49    =$C$55            
функционал    нетерминал                    
    препроцессор/директива/включить    =CONCAT(D40:D41)                
    =$B$43        =$C$43            
    =$B$46        =$C$46            
функционал    терминал                    
    препроцессор/директива/начало    #                
    препроцессор/директива/стандарт/начало    <                
    препроцессор/директива/стандарт/конец    >                
    препроцессор/директива/включить/название    include                
    отступ/обычный                     
    отступ/параметры    ,                 
    отступ/перенос/1    =CHAR(10)                
    отступ/перенос/2    =CONCAT(CHAR(10);CHAR(10))                
    отступ/перенос/уровень/1    =CONCAT(CHAR(10);"    ")                
    библиотека/стандартная/программа    stdlib.h                
    библиотека/стандартная/вводвывод    stdio.h                
    инструкция/блок/начало    {                
    инструкция/блок/конец    }                
    программа/завершение/успех    EXIT_SUCCESS                
    тип/встроенный/целый    int                
    тип/встроенный/символ    char                
    функция/главная/название    main                
    функция/печатать/название    printf                
    инструкция/конец    ;                
    функция/параметры/начало    (                
    функция/параметры/конец    )                
    функция/возврат    return                
    литарал/строка/начало    "                
    литарал/строка/конец    "                
    литерал/строка/приветмир    Hello World!                
    литерал/строка/перенос    \n                
    функция/главная/параметр/1/название    argc                
    функция/главная/параметр/2/название    argv                
    тип/встроенный/массив/начало    [                
    тип/встроенный/массив/конец    ]                
    тип/встроенный/указатель    *

  Вид текста
функционал                        
печатать/приветмир                        
приложение/точкавхода                        
функционал    нетерминал    отступ    1    2    3    4
    #include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    return EXIT_SUCCESS;
}                    
приложение/точкавхода    препроцессор/директива/включить        #include            
приложение/точкавхода    препроцессор/директива/стандарт/начало         <            
приложение/точкавхода    библиотека/стандартная/программа            stdlib.h        
приложение/точкавхода    препроцессор/директива/стандарт/конец        >            
печатать/приветмир    препроцессор/директива/включить    
    #include            
печатать/приветмир    препроцессор/директива/стандарт/начало         <            
печатать/приветмир    библиотека/стандартная/вводвывод            stdio.h        
печатать/приветмир    препроцессор/директива/стандарт/конец        >            
приложение/точкавхода    тип/встроенный/целый    

    int            
приложение/точкавхода    функция/главная/название         main            
приложение/точкавхода    функция/параметры/начало        (            
приложение/точкавхода    тип/встроенный/целый            int        
приложение/точкавхода    функция/главная/параметр/1/название                 argc    
приложение/точкавхода    тип/встроенный/символ    ,         char        
приложение/точкавхода    тип/встроенный/указатель                *    
приложение/точкавхода    функция/главная/параметр/2/название                 argv    
приложение/точкавхода    тип/встроенный/массив/начало                [    
приложение/точкавхода    тип/встроенный/массив/конец                ]    
приложение/точкавхода    функция/параметры/конец        )            
приложение/точкавхода    инструкция/блок/начало    
    {            
печатать/приветмир    функция/печатать/название    
            printf        
печатать/приветмир    функция/параметры/начало            (        
печатать/приветмир    литарал/строка/начало                "    
печатать/приветмир    литерал/строка/приветмир                    Hello World!
печатать/приветмир    литерал/строка/перенос                    \n
печатать/приветмир    литарал/строка/конец                "    
печатать/приветмир    функция/параметры/конец            )        
печатать/приветмир    инструкция/конец            ;        
приложение/точкавхода    функция/возврат    
            return        
приложение/точкавхода    программа/завершение/успех                 EXIT_SUCCESS    
приложение/точкавхода    инструкция/конец            ;        
приложение/точкавхода    инструкция/блок/конец    
    }            
функционал    нетерминал                    
    препроцессор/директива/включить    #include                
    препроцессор/директива/начало        #            
    препроцессор/директива/включить/название        include            
функционал    терминал                    
    препроцессор/директива/начало    #                
    препроцессор/директива/стандарт/начало    <                
    препроцессор/директива/стандарт/конец    >                
    препроцессор/директива/включить/название    include                
    отступ/обычный                     
    отступ/параметры    ,                 
    отступ/перенос/1    
                
    отступ/перенос/2    

                
    отступ/перенос/уровень/1    
                    
    библиотека/стандартная/программа    stdlib.h                
    библиотека/стандартная/вводвывод    stdio.h                
    инструкция/блок/начало    {                
    инструкция/блок/конец    }                
    программа/завершение/успех    EXIT_SUCCESS                
    тип/встроенный/целый    int                
    тип/встроенный/символ    char                
    функция/главная/название    main                
    функция/печатать/название    printf                
    инструкция/конец    ;                
    функция/параметры/начало    (                
    функция/параметры/конец    )                
    функция/возврат    return                
    литарал/строка/начало    "                
    литарал/строка/конец    "                
    литерал/строка/приветмир    Hello World!                
    литерал/строка/перенос    \n                
    функция/главная/параметр/1/название    argc                
    функция/главная/параметр/2/название    argv                
    тип/встроенный/массив/начало    [                
    тип/встроенный/массив/конец    ]                
    тип/встроенный/указатель    *

Скачать helloworld.ods


Операции CRUD над фунционалом


CRUD — акроним, обозначающий четыре базовые функции, используемые при работе с базами данных:
1) создание (англ. create, примечание: база данных insert),
2) чтение (read, примечание: база данных select),
3) модификация (update),
3) удаление (delete).


Предположим у нас есть две разновидности функционала:
функционал                        
печатать/приветмир                        
приложение/точкавхода

и ссылки на него.

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

Благодаря микроконтролю можно осуществлять массовые операции в том числе и внутри строк кода.

Управление тегами


Древовидные теги навроде
печатать/приветмир

или
препроцессор/директива/начало

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

Но что, если в код будет включён заголовочный файл для того, чтобы создать функционал, но благодаря нему будет создано несколько видов функционала. В этом случае можно применять точку с запятой для добавления нескольких тегов.
печатать/приветмир;печатать/покамир #include "функционал.hpp"

печатать/приветмир ...
печатать/приветмир использование функционал.hpp
печатать/приветмир ...

печатать/покамир ...
печатать/покамир использование функционал.hpp
печатать/покамир ...

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

продолжение следует...
velkin
velkin
12.02.2021 12:04

Архитектура программ


Все о ней слышали, но никто её не видел. Настало время вывести архитектуру на чистую воду.

Общепринятого определения архитектуры программного обеспечения не существует. Так, сайт Software Engineering Institute приводит более 150 определений этого понятия.

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

Следующий вопрос, каждая ли программа имеет архитектуру? Здесь и далее я буду считать, даже если это не чистая архитектура, а смешанная. Отсюда вытекает простой вывод, приведённая выше программа "привет мир" для языка C++ так же имеет архитектуру или может опознаваться как программа на некой архитектуре или архитектурах.

Лично я буду считать, что архитектура это конструкция проходящая через всю программу. Но при этом не нужно думать, что её можно описать с помощью функционала.

Таким образом:

1) Функционал
2) Нетерминал


Превращаются в:

1) Функционал
2) Архитектура
3) Нетерминал


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

  Вид формул
функционал                            
печатать/приветмир                            
приложение/точкавхода                            
    архитектура                        
    процедура/нисходящая                        
    процедура/нисходящая/точкавхода                        
    процедура/нисходящая/включения                        
функционал    архитектура    нетерминал    отступ    1    2    3    4
        =CONCAT(D10:H41)                    
=$A$3    =$B$7    =$C$43        =$D$43            
=$A$3    =$B$7    =$C$48    =$D$51    =$D$48            
=$A$3    =$B$7    =$C$56            =$D$56        
=$A$3    =$B$7    =$C$49        =$D$49            
=$A$2    =$B$7    =$C$43    =$D$53    =$D$43            
=$A$2    =$B$7    =$C$48    =$D$51    =$D$48            
=$A$2    =$B$7    =$C$57            =$D$57        
=$A$2    =$B$7    =$C$49        =$D$49            
=$A$3    =$B$6    =$C$61    =$D$54    =$D$61            
=$A$3    =$B$6    =$C$63    =$D$51    =$D$63            
=$A$3    =$B$6    =$C$66        =$D$66            
=$A$3    =$B$6    =$C$61            =$D$61        
=$A$3    =$B$6    =$C$73    =$D$51            =$D$73    
=$A$3    =$B$6    =$C$62    =$D$52        =$D$62        
=$A$3    =$B$6    =$C$77                =$D$77    
=$A$3    =$B$6    =$C$74    =$D$51            =$D$74    
=$A$3    =$B$6    =$C$75                =$D$75    
=$A$3    =$B$6    =$C$76                =$D$76    
=$A$3    =$B$6    =$C$67        =$D$67            
=$A$3    =$B$6    =$C$58    =$D$53    =$D$58            
=$A$2    =$B$6    =$C$64    =$D$55        =$D$64        
=$A$2    =$B$6    =$C$66            =$D$66        
=$A$2    =$B$6    =$C$69                =$D$69    
=$A$2    =$B$6    =$C$71                    =$D$71
=$A$2    =$B$6    =$C$72                    =$D$72
=$A$2    =$B$6    =$C$70                =$D$70    
=$A$2    =$B$6    =$C$67            =$D$67        
=$A$2    =$B$6    =$C$65            =$D$65        
=$A$3    =$B$6    =$C$68    =$D$55        =$D$68        
=$A$3    =$B$6    =$C$60    =$D$51            =$D$60    
=$A$3    =$B$6    =$C$65            =$D$65        
=$A$3    =$B$6    =$C$59    =$D$53    =$D$59            
функционал        нетерминал                    
        препроцессор/директива/включить    =CONCAT(E44:E45)                
        =$C$47        =$D$47            
        =$C$50        =$D$50            
функционал        терминал                    
        препроцессор/директива/начало    #                
        препроцессор/директива/стандарт/начало    <                
        препроцессор/директива/стандарт/конец    >                
        препроцессор/директива/включить/название    include                
        отступ/обычный                     
        отступ/параметры    ,                 
        отступ/перенос/1    =CHAR(10)                
        отступ/перенос/2    =CONCAT(CHAR(10);CHAR(10))                
        отступ/перенос/уровень/1    =CONCAT(CHAR(10);"    ")                
        библиотека/стандартная/программа    stdlib.h                
        библиотека/стандартная/вводвывод    stdio.h                
        инструкция/блок/начало    {                
        инструкция/блок/конец    }                
        программа/завершение/успех    EXIT_SUCCESS                
        тип/встроенный/целый    int                
        тип/встроенный/символ    char                
        функция/главная/название    main                
        функция/печатать/название    printf                
        инструкция/конец    ;                
        функция/параметры/начало    (                
        функция/параметры/конец    )                
        функция/возврат    return                
        литарал/строка/начало    "                
        литарал/строка/конец    "                
        литерал/строка/приветмир    Hello World!                
        литерал/строка/перенос    \n                
        функция/главная/параметр/1/название    argc                
        функция/главная/параметр/2/название    argv                
        тип/встроенный/массив/начало    [                
        тип/встроенный/массив/конец    ]                
        тип/встроенный/указатель    *

  Вид текста
функционал                            
печатать/приветмир                            
приложение/точкавхода                            
    архитектура                        
    процедура/нисходящая                        
    процедура/нисходящая/точкавхода                        
    процедура/нисходящая/включения                        
функционал    архитектура    нетерминал    отступ    1    2    3    4
        #include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    printf("Hello World!\n");
    return EXIT_SUCCESS;
}                    
приложение/точкавхода    процедура/нисходящая/включения    препроцессор/директива/включить        #include            
приложение/точкавхода    процедура/нисходящая/включения    препроцессор/директива/стандарт/начало         <            
приложение/точкавхода    процедура/нисходящая/включения    библиотека/стандартная/программа            stdlib.h        
приложение/точкавхода    процедура/нисходящая/включения    препроцессор/директива/стандарт/конец        >            
печатать/приветмир    процедура/нисходящая/включения    препроцессор/директива/включить    
    #include            
печатать/приветмир    процедура/нисходящая/включения    препроцессор/директива/стандарт/начало         <            
печатать/приветмир    процедура/нисходящая/включения    библиотека/стандартная/вводвывод            stdio.h        
печатать/приветмир    процедура/нисходящая/включения    препроцессор/директива/стандарт/конец        >            
приложение/точкавхода    процедура/нисходящая/точкавхода    тип/встроенный/целый    

    int            
приложение/точкавхода    процедура/нисходящая/точкавхода    функция/главная/название         main            
приложение/точкавхода    процедура/нисходящая/точкавхода    функция/параметры/начало        (            
приложение/точкавхода    процедура/нисходящая/точкавхода    тип/встроенный/целый            int        
приложение/точкавхода    процедура/нисходящая/точкавхода    функция/главная/параметр/1/название                 argc    
приложение/точкавхода    процедура/нисходящая/точкавхода    тип/встроенный/символ    ,         char        
приложение/точкавхода    процедура/нисходящая/точкавхода    тип/встроенный/указатель                *    
приложение/точкавхода    процедура/нисходящая/точкавхода    функция/главная/параметр/2/название                 argv    
приложение/точкавхода    процедура/нисходящая/точкавхода    тип/встроенный/массив/начало                [    
приложение/точкавхода    процедура/нисходящая/точкавхода    тип/встроенный/массив/конец                ]    
приложение/точкавхода    процедура/нисходящая/точкавхода    функция/параметры/конец        )            
приложение/точкавхода    процедура/нисходящая/точкавхода    инструкция/блок/начало    
    {            
печатать/приветмир    процедура/нисходящая/точкавхода    функция/печатать/название    
            printf        
печатать/приветмир    процедура/нисходящая/точкавхода    функция/параметры/начало            (        
печатать/приветмир    процедура/нисходящая/точкавхода    литарал/строка/начало                "    
печатать/приветмир    процедура/нисходящая/точкавхода    литерал/строка/приветмир                    Hello World!
печатать/приветмир    процедура/нисходящая/точкавхода    литерал/строка/перенос                    \n
печатать/приветмир    процедура/нисходящая/точкавхода    литарал/строка/конец                "    
печатать/приветмир    процедура/нисходящая/точкавхода    функция/параметры/конец            )        
печатать/приветмир    процедура/нисходящая/точкавхода    инструкция/конец            ;        
приложение/точкавхода    процедура/нисходящая/точкавхода    функция/возврат    
            return        
приложение/точкавхода    процедура/нисходящая/точкавхода    программа/завершение/успех                 EXIT_SUCCESS    
приложение/точкавхода    процедура/нисходящая/точкавхода    инструкция/конец            ;        
приложение/точкавхода    процедура/нисходящая/точкавхода    инструкция/блок/конец    
    }            
функционал        нетерминал                    
        препроцессор/директива/включить    #include                
        препроцессор/директива/начало        #            
        препроцессор/директива/включить/название        include            
функционал        терминал                    
        препроцессор/директива/начало    #                
        препроцессор/директива/стандарт/начало    <                
        препроцессор/директива/стандарт/конец    >                
        препроцессор/директива/включить/название    include                
        отступ/обычный                     
        отступ/параметры    ,                 
        отступ/перенос/1    
                
        отступ/перенос/2    

                
        отступ/перенос/уровень/1    
                    
        библиотека/стандартная/программа    stdlib.h                
        библиотека/стандартная/вводвывод    stdio.h                
        инструкция/блок/начало    {                
        инструкция/блок/конец    }                
        программа/завершение/успех    EXIT_SUCCESS                
        тип/встроенный/целый    int                
        тип/встроенный/символ    char                
        функция/главная/название    main                
        функция/печатать/название    printf                
        инструкция/конец    ;                
        функция/параметры/начало    (                
        функция/параметры/конец    )                
        функция/возврат    return                
        литарал/строка/начало    "                
        литарал/строка/конец    "                
        литерал/строка/приветмир    Hello World!                
        литерал/строка/перенос    \n                
        функция/главная/параметр/1/название    argc                
        функция/главная/параметр/2/название    argv                
        тип/встроенный/массив/начало    [                
        тип/встроенный/массив/конец    ]                
        тип/встроенный/указатель    *

Скачать helloworld_arch.ods


Был добавлен столбец архитектура.
архитектура
процедура/нисходящая
процедура/нисходящая/точкавхода
процедура/нисходящая/включения

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

Между тем более сложные архитектуры могли бы иметь персонализированные элементы, такие как процедуры "процедура/приветмир", "процедура/покамир". И здесь не нужно путать функционал "приветмир" и "покамир" и общие элементы архитектуры, такие как "процедура" и другие, которые воплощают этот функционал.

Расширение метаданных


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

продолжение следует...
LaptevVV
LaptevVV
16.02.2021 05:05
А ты в принципе читал книжку Хамби Программирование таблиц решений?
Я ее еще в советское время читал.
velkin
velkin
16.02.2021 06:02
Здравствуйте, LaptevVV, Вы писали:

LVV>А ты в принципе читал книжку Хамби Программирование таблиц решений?

LVV>Я ее еще в советское время читал.

Сейчас посмотрел, это абсолютно другое.

Программирование таблиц решений, Хамби, 1976
Книга посвящена изложению методов трансляции с одного из непроцедурных языков программирования — с языка таблиц решений. Программы, написанные на этом языке, позволяют удобно описывать сложные ситуации, возникающие при системном анализе. Таблицы решений представляют собой новый перспективный метод программирования, который находит применение при решении многих задач системного анализа. Книга предназначена для разработчиков АСУ, системных аналитиков и системных программистов, занимающихся разработкой трансляторов. Она может служить учебным пособием для студентов, изучающих методы трансляции.

Вот эта таблица:

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

А ещё есть такая таблица:

Другие способы задания функционирования машин состояний

Диаграмма состояний (или иногда граф переходов) — графическое представление множества состояний и функции переходов. Представляет собой размеченный ориентированный граф, вершины которого — состояния конечных автоматом, дуги — переходы из одного состояния в другое, а метки дуг — символы, по которым осуществляется переход из одного состояния в другое. Если переход из состояния q1 в q2 может быть осуществлен по одному из нескольких символов, то все они должны быть надписаны над дугой диаграммы.

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

Следующее состояние
Входной
символ a     Входной
символ b     Любой
другой
символ
p0     p1     p0     p0
p1     p1     p2     p1
p2     p3     p4     p2
p3     p3     p5     p3
p4     p4     p4     p4
p5     p3     p5     p5


Но у меня, особенно это видно в последней упрощённой версии, нет никакой трансляции из одного языка в другой. По факту представлен тот же самый код, то есть даже не абстрактное синтаксическое дерево, а разобранный на терминалы код, который при сложении соответствует оригиналу один в один. Лично я не нашёл как это называется, и я ни разу не встречал подобное решение с метаданными в литературе. Если кто знает, пусть напишет.
LaptevVV
LaptevVV
16.02.2021 08:13
LVV>>А ты в принципе читал книжку Хамби Программирование таблиц решений?
LVV>>Я ее еще в советское время читал.
V>Сейчас посмотрел, это абсолютно другое.
Дело не в трансляции, а в таблицах решений.
Очень неплохой инструмент в некоторых случаях.
velkin
velkin
16.02.2021 08:45
Здравствуйте, LaptevVV, Вы писали:

V>>Сейчас посмотрел, это абсолютно другое.

LVV>Дело не в трансляции, а в таблицах решений.
LVV>Очень неплохой инструмент в некоторых случаях.

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

У меня примерно такие вопросы.
1) Что представляет из себя код?
2) Нужно ли писать уже написанный кем-то код заново?
3) Почему так сложно пользоваться чужими решениями?

И я решаю задачу основываясь на следующих принципах:
1) Код остаётся в исходном виде.
2) Дублирование исключается ссылками на ячейки и диапазоны ячеек.
3) Метаданные образуют дополнительные слои описания.

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