Доброго времени чтения, уважаемые читатели habrahabr.ru
Для обучения программированию предложены сотни языков, включая управление графическими элементами. По этому предложение нового языка для обучения требует дополнительных обоснований.
Попробую описать преимущества предлагаемого языка обучения программированию (рабочее название PL/2) и программирования игр (рабочее название PL/2 script), и предлагаю найти недостатки в подходе.
Основными парадигмами предполагаются следующие:
Ассемблерный код, позволяющий управлять процессором
Логическое программирование, представленное языками Prolog, SQL
Функциональное программирование
Императивное программирование, описываемое алгоритмами
Объектное программирование, заключающееся в передаче и обработке сигналов
В настоящее время эти методики объединяются в расширениях существующих языков программирования. Предлагается подход для объединения парадигм в едином синтаксисе, заранее разрешающем конфликты между различными подходами, что уменьшит затраты времени на изучение различных синтаксисов.
Итак, ключевые элементы учебного языка программирования.
Исходный текст
Файл с исходным текстом состоит из произвольного текста (комментарии, описание алгоритма), в который могут включаться [именованные] фрагменты на различных языках программирования — PL/2, sql, html, текст, PL/2 script.
начало вставки кода обозначается ключевым словом meta (мета) в первой позиции строки
окончание вставки обозначается последовательность /meta в первой позиции строки
Синтаксис PL/2 включает единообразные требования к отступам, в частности, текст программы смещен не менее чем на 4 позиции от начала строки.
Структура текста программы
Размер сдвига между уровнями вложенности составляет 4 пробела. Продолжение оператора на следующей строке смещается не менее, чем на 3 пробела относительно уровня оператора
Основной уровень программы смещен на 4 пробела относительно символа разметки исходного файла meta, соответственно, ни один символ программы не может иметь отступ менее 4 пробелов
Синтаксис
Для разных видов блоков предполагаются разные виды скобок:
круглые скобки (...) используются для описания и передачи параметров при вызове методов
квадратные скобки [...] используются для описания размерности массивов и указания индекса при доступе к элементу массива.
фигурные скобки {...} используются для указания различных элементов структуры программы. Для локализации ошибок фигурные скобки снабжаются дополнительными символами.
{-… -} — аналог круглых скобок — используется при описании тела реляционного класса
{#… #} — используется при описании тела функционального блока
{$… $} — внешние обрамляющие скобки при описании константы структурного класса
{*… *} — описание тела класса или интерфейса
{&… &} — описание тела метода
{@… @} — тело пространства имен
{|… |} — параллельно выполняемые блоки
{%… %} — управляемый блок
{=… =} — класс ответственности
{… } — внутренний блок в теле метода
Операторы
== сравнение на равенство
=/= сравнение на неравенство
:= присваивание значения переменной
++ преффиксный инкримент
-- преффиксный декремент
+ сложение
- вычитание
* умножение
/ деление
-/- рациональное деление (выделяется только для наглядности формул, в т.ч. в IDE)
(? boolean ? value_true :: value_false ?) - тернарный оператор
Императивное программирование
Предлагается следующий синтаксис для структурного программирования:
Операторы, заключенные между скобками {& и &}, выполняются последовательно в порядке, указанном в тексте программы
Для изменения порядка выполнения используются операторы цикла и ветвления
выполнение при исполнении условия
if (условие){
...
}
выполнение блока при исполнении первого из условий и блок else при не выполнении ни одного из условий
decision{
if (<условие1>)
...
if (<условие2>)
...
else
...
}
переключатель по численному значению с указанием константы или члена перечисления
switch (<выражение>){
case <значение1>:
...
case <значение2>:
...
else
...
}
В выражениях можно также использовать оператор тернарного выбора
Оператор цикла
loop [explicit] [метка]
{
for <[тип] переменная [ := инициализатор]>;
from <контейнер>;
while <условие, при котором цикл продолжает итерации>;
next <оператор итерации>;
where <условие выполнения тела цикла>
...
continue;
...
break [метка блока];
...
}
Здесь:
loop — оператор начала цикла
explicit — цикл исполняется хотя бы один раз, проверка условия выхода из цикла перед первым проходом не выполняется
for — список переменных цикла и их инициализация
while — условие, при котором цикл продолжает итерации
next — команды, выполняемые после итерации
from — контейнер, из которого выбираются элементы при проходе по циклу
where — условие для выполнения тела цикла
continue — оператор досрочного перехода к следующей итерации
break — оператор досрочного выхода из текущего или указанного цикла
Обработка ошибок
управление транзакциями и участками с возможностью отказа
transaction{
finalize
{
}
catch
{
}
{
throw // выполнить catch и finalize
revoke // отменить все изменения состояния программы, очистить очередь исходящих сигналов и выполнить код finalize
}
}
Объектно-ориентированное программирование
new — создание нового объекта
drop — удаление объекта
работа с коллекциями
select ::= — получение информации об именованных объектах коллекции
insert += — включение нового объекта в коллекцию
delete -= — удаление объекта из коллекции
update — множественные обновления в коллекции
управление правами действий объекта над объектами указанного класса или его свойствами/методами
grant += — назначить разрешающие права объекта на класс или свойство
deny += — назначить запрещающие права объекту на класс или свойство
revoke — удалить права объекта на класс
Виды классов
Классы делятся на следующие типы:
- domain class — элементарный класс среды исполнения
- relation class — связь между указанными объектами (аналогично предложениям Prolog, списку параметров функций), методы и свойства отсутствуют, доступ происходит только к открытым членам. По возможностям аналогично набору, возвращаемому из реляционной базы данных
- structure class — структура с открытыми элементами. Для доступа к элементу текущего объекта используется слово this. Может содержать методы для обработки.
- system class — система, которая может содержать закрытые и защищенные наследуемые элементы.
- process class — процесс, которому можно передать инициализирующие значения и получить результирующие значения. Соответствует службе. Любой метод получает не только указатель на себя (this), но и указатель на вызвавший класс или объект (sender). Это позволяет проверить авторизацию объекта, осуществляющего доступ к методу. Содержит стандартные методы.
Не императивное программирование
операторы работы с лямбда-выражениями и списками
- ::= — определение раскрытия выражения
- |> — конвейер для всех элементов из левой коллекции, задаваемый правым выражением
кванторы существования и всеобщности на упорядоченных списках
- &> — коллекция из всех элементов из левой коллекции, удовлетворяющих правому выражению
- !> — конвейер для всех элементов из левой коллекции, не удовлетворяющих заданному правому выражению
- %> — коллекция из первого элемента из левой коллекции, удовлетворяющего правому выражению (арифметически — остаток от деления)
- $> — коллекция из последнего элемента из левого списка, удовлетворяющего заданному правому выражению
- ~> — все элементы списка, кроме первого, удовлетворяющие правому условию
например,
head ::= %> (true),
tail ::= ~> (true)
Ассемблер
Используется класс процессора, аргументами методов которого являются аргументы ассемблерных команд, а свойствами — регистры процессорного ядра.
Такой подход позволяет использовать наследование, как переход к новому поколению линейки процессоров, а также использовать полные имена команд вместо коротких мнемоник и возможность равноправного описания в системах помощи.
Hallo, world
hallo.pl2
При использовании program код помещается в метод default.Default.Main()
meta source="pl2" name="example2"
using user.OS.IO; // using OS Console interface
program (String arguments[] execution time command line parameters )
{&
Console.write_line("Hallo, world!");
&}
/meta
*** hallo.pl2 ***
PL/2 script
Язык PL/2 script предоставляет возможность описания сценариев и расширения классов во время описания переменной для программирования игр.
Вместо функциональной переменной предлагается использовать строку, которая (как в Excel) начинается со знака равенства.
При этом описание классов и объектов удобно хранить в XML, а код использовать для активной обработки.
Описание класса:
<?xml version="1.0" encoding="windows-1251"?>
<pl2script>
<type id="type.class.Scene" save="true">
<help id="class.Scene.help">pl2script/game/scene.htm</help>
<system>
<class id="class.Scene" domain="type" save="true">
<name>
<ascii>Scene</ascii>
<local>Сцена</local>
</name>
<tip id="class.Scene.tip">
<ascii>Game class as a main class for a game</ascii>
<local>Класс для описания контекста игры</local>
</tip>
</class>
<property id="class.Scene..." domain="string" save="true">
<name>
<ascii>prop ...</ascii>
<local>prop ...</local>
</name>
<tip id="class.Scene..tip">
<ascii>tip ...</ascii>
<local>Сообщение при ...</local>
</tip>
</property>
</system>
</type>
</pl2script>
Описание объекта:
<?xml version="1.0" encoding="windows-1251"?>
<pl2script>
<scene id="game.">
<name>Ноосфера</name>
<description>Большой мир</description>
<message>Вы попали в большой мир</message>
<way id="game.universe" path="Universe/index" enabled="true">Вселенная</way>
<way id="game.solar" path="Solar/index" enabled="true">Солнечная система</way>
<way id="game.earth" path="Earth/index" enabled="true">Земля</way>
<way id="game.country" path="country/index" enabled="true">По стране</way>
<way id="game.body" path="body/index" enabled="true">В себя</way>
<way id="game.school" path="school/index" enabled="true">В школу</way>
<way id="game.plant" path="plant/index" enabled="true">На завод</way>
<way id="game.university" path="university/index" enabled="true">В университет</way>
</scene>
</pl2script>
Прошу высказаться о проблемах, возможных при использовании такого синтаксиса
Ссылки:
habrahabr.ru/post/136272/ Какой язык программирования должен быть первым при изучении в школе?
habrahabr.ru/post/176243/ «Национальные» языки программирования
Спасибо пользователю oeai за ссылку на проект INSTEAD и язык Lua
Автор: palexisru