112 lines
3.4 KiB
Typst
112 lines
3.4 KiB
Typst
|
|
#import "@preview/diagraph:0.3.6": render, raw-render
|
|||
|
|
|
|||
|
|
== "Дорожная карта" (план развития) языка plcc
|
|||
|
|
|
|||
|
|
=== Ограничения, накладываемые на разработку языка
|
|||
|
|
|
|||
|
|
В основе языка plcc предусмотрены принципы и ограничения:
|
|||
|
|
|
|||
|
|
1. Выполнения в условиях реального времени.
|
|||
|
|
|
|||
|
|
2. Принципах продвинутого статического анализа кода, в частности...
|
|||
|
|
|
|||
|
|
3. контент-адресуемости (если формулы эквивалентны, то считаются равными; возможно отслеживание изменений на уровне абстрактного синтаксического дерева)
|
|||
|
|
|
|||
|
|
4. Ориентации на исполнение на ПЛК.
|
|||
|
|
|
|||
|
|
5. Ориентации на возможность распределенного исполнения программ.
|
|||
|
|
|
|||
|
|
=== Перспективы
|
|||
|
|
|
|||
|
|
1. Поддержка распределенного исполнения
|
|||
|
|
|
|||
|
|
2. Поддержка трехзначной и Null Convention логики
|
|||
|
|
|
|||
|
|
3. "Стимулирование" использования чистых функций вместо функциональных блоков, сокращение количества внутренних переменных
|
|||
|
|
|
|||
|
|
== Пример АСД
|
|||
|
|
|
|||
|
|
=== Пример построения полной формы АСД языка plcc
|
|||
|
|
|
|||
|
|
Полная форма АСД включает в себя управляющие узлы и примитивные функции:
|
|||
|
|
|
|||
|
|
|
|||
|
|
#render("
|
|||
|
|
digraph {
|
|||
|
|
none -> C0
|
|||
|
|
C0 -> sin
|
|||
|
|
C0 -> C1
|
|||
|
|
C1 -> \"+\";
|
|||
|
|
C1 -> ┴;
|
|||
|
|
┴ -> C2
|
|||
|
|
C2 -> cos;
|
|||
|
|
C2 -> x1;
|
|||
|
|
┴ -> C3
|
|||
|
|
C3 -> \"3*\";
|
|||
|
|
C3 -> x2;
|
|||
|
|
none [label=\"\", shape=none]
|
|||
|
|
x1 [label=x, shape=block];
|
|||
|
|
x2 [label=x, shape=block];
|
|||
|
|
sin [shape=block]
|
|||
|
|
\"+\" [shape=block]
|
|||
|
|
cos [shape=block]
|
|||
|
|
\"3*\" [shape=block]
|
|||
|
|
}
|
|||
|
|
")
|
|||
|
|
|
|||
|
|
=== Пример построения краткой формы АСД языка plcc
|
|||
|
|
|
|||
|
|
Краткая форма АСД состоит в сокрытии композиционного управляющего узла с под одноместными функциями:
|
|||
|
|
|
|||
|
|
#render("
|
|||
|
|
digraph {
|
|||
|
|
none -> sin
|
|||
|
|
sin -> \"+\";
|
|||
|
|
\"+\" -> ┴;
|
|||
|
|
┴ -> cos;
|
|||
|
|
cos -> x1;
|
|||
|
|
┴ -> \"3*\";
|
|||
|
|
\"3*\" -> x2;
|
|||
|
|
x1 [label=x];
|
|||
|
|
x2 [label=x];
|
|||
|
|
none [label=\"\", shape=none]
|
|||
|
|
}
|
|||
|
|
")
|
|||
|
|
|
|||
|
|
== Пример равенства АСД
|
|||
|
|
|
|||
|
|
За счет свойства коммутативности операции сложения для чисел $a + b = b + a$, одно поддерево плюс другое равно те же самые деревья, но сложенные в обратном порядке:
|
|||
|
|
|
|||
|
|
#render("
|
|||
|
|
digraph {
|
|||
|
|
none -> sin
|
|||
|
|
sin -> \"+\";
|
|||
|
|
\"+\" -> ┴;
|
|||
|
|
┴ -> cos;
|
|||
|
|
cos -> x1;
|
|||
|
|
┴ -> \"3*\";
|
|||
|
|
\"3*\" -> x2;
|
|||
|
|
x1 [label=x];
|
|||
|
|
x2 [label=x];
|
|||
|
|
|
|||
|
|
|
|||
|
|
nonen -> sinn
|
|||
|
|
sinn -> plusn;
|
|||
|
|
plusn -> ┴n [color=red];
|
|||
|
|
┴n -> triple [color=red];
|
|||
|
|
triple -> x2n;
|
|||
|
|
┴n -> cosn [color=red];
|
|||
|
|
cosn -> x1n;
|
|||
|
|
|
|||
|
|
x1n [label=x];
|
|||
|
|
x2n [label=x];
|
|||
|
|
|
|||
|
|
|
|||
|
|
none, nonen [label=\"\", shape=none]
|
|||
|
|
sinn [label=sin]
|
|||
|
|
plusn [label=\"+\", color=red]
|
|||
|
|
cosn [label=cos]
|
|||
|
|
┴n [label=┴, color=red]
|
|||
|
|
triple [label=\"3*\"]
|
|||
|
|
}
|
|||
|
|
")
|