Для обучения программированию предложены сотни языков, включая управление графическими элементами. По этому предложение нового языка для обучения требует дополнительных обоснований.
Попробую описать преимущества предлагаемого языка обучения программированию (рабочее название 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>
Прошу высказаться о проблемах, возможных при использовании такого синтаксиса
Ссылки:
http://ift.tt/1t4tRpr Какой язык программирования должен быть первым при изучении в школе?
http://ift.tt/XDiWGP «Национальные» языки программирования
Спасибо пользователю oeai за ссылку на проект INSTEAD и язык Lua
This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.
Комментариев нет:
Отправить комментарий