plcc/docs/file.typ
2025-12-28 16:55:49 +03:00

112 lines
3.4 KiB
Typst
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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*\"]
}
")