OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 11 Декабрь, 2017 08:27

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: Воскресенье, 21 Февраль, 2016 21:25 

Зарегистрирован: Вторник, 15 Декабрь, 2009 11:43
Сообщения: 111
Алгоритмический язык ДАЛВЯЗ 2. Силуэтное программирование

Вложение:
dalvjaz2_part1.pdf [794.26 КБ]
Скачиваний: 86

Вложение:
dalvjaz2_part2.pdf [919.45 КБ]
Скачиваний: 85

Вложение:
dal2874.rar [639.35 КБ]
Скачиваний: 59


Введение

Наконец-то в 2016, без малого через четыре года после того, как я
выложил на форуме http://forum.oberoncore.ru описание алгоритмического
языка ДАЛВЯЗ 2 (файл dalvjaz2_description.pdf), я смог сформулировать,
какой смысл применительно к языку ДАЛВЯЗ 2 имеет термин "силуэтное
программирование".

Силуэтное программирование на языке ДАЛВЯЗ 2 - это совокупность приемов
визуального программирования, применяемая для разработки в графическом
редакторе ДАЛВЯЗ 2 в формате структурных блок-схем процедур с циклом
сложного условия и обеспечивающая программисту более комфортные с точки
зрения эргономики, чем при вводе в текстовом редакторе, условия ввода
исходного кода процедуры.

Ну, такое утверждение хорошо бы доказать, а еще лучше проверить на
практике. А то уже вон сколько графических систем программирования с
редактированием исходного кода в формате блок-схем понапридумывали, а
они у программистов широкого признания не завоевали, говорят - неудобно.

Почему неудобно и как удобно ?
Рассуждения на эту тему и составляют основное содержание этого материала,
в котором я объединил в одно целое уже имевшиеся у меня разные варианты
описания языка ДАЛВЯЗ 2, задуманного мной как сильно упрощенное и удобное
для практического программирования на языках семейств Pascal и С/С++
подобие алгоритмического языка ДРАКОН.


Содержание

ЧАСТЬ 1. ТЕОРИЯ
1.1. Почему неудобны стандартные блок-схемы
1.2. Что такое силуэт
1.3. Алгоритмический язык ДАЛВЯЗ 2
1.4. Формирование в ДАЛВЯЗ 2 блок-схемы на основе исходного
кода процедуры
1.5. Программирование на ДАЛВЯЗ 2 с циклом сложного условия
1.6. Конкретный пример схемы
1.7. Панель инструментов для работы со схемой
1.8. Редактирование схемы в ДАЛВЯЗ 2
1.9. Работа с русифицированной программной логикой верхнего
уровня в ДАЛВЯЗ 2

ЧАСТЬ 2. ПРАКТИКА
2.1. Файл конфигурации программы dal2.cfg
2.2. Файл стилей отображения схемы styles.cfg
2.3. Возможные варианты служебных комментариев
2.4. Шаблоны редактирования процедуры
2.5. Редактирование структурных блок-схем произвольного вида
2.6. Использование пиктограмм и рисунков при создании схем
2.7. Всплывающие окна для элементов схемы
2.8. Создание схемы для псевдокода
2.9. Описание логики программы на над-процедурном уровне
2.10. Создание текущей версии процедуры вывод_схемы, начало
2.11. Создание схемы с точки зрения программиста
2.12. Создание текущей версии процедуры вывод_схемы, окончание
Заключение
ЛИТЕРАТУРА И ССЫЛКИ В СЕТИ ИНТЕРНЕТ



<readme.txt>

Программа dal_vjaz_2, v.0.87.4


Очередная версия программы dal_vjaz_2 v.0.87.4 является приложением
к выкладываемому вместе с ней материалу "Алгоритмический язык ДАЛВЯЗ 2.
Силуэтное программирование", в котором приведено достаточно подробное
описание работы с этой программой. Но некоторые вопросы остались за
рамками вышеуказанного материала, а потому поясняются ниже.

Программа dal_vjaz_2 0.87.4 является свободно распространяемым ПО c
открытым кодом и выкладывается "как есть", с возможностью дальнейшего
развития и совершенствования всеми желающими.

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


файлы конфигурации: dal2.cfg, styles.cfg
файл, задающий размеры основной формы: formsize.dat
пробные файлы: proc2.txt, proc3.txt, proc_bb.txt


Описание подключения dll, сгенерированной в среде КП, приведено
в теме "КП + Delphi".
Описание концепции логики верхнего уровня, использованной для
разработки dll в среде КП, приведено в теме "программная логика
верхнего уровня".
Что касается проекта pasdll (информация для тех, кто захочет вносить
изменения в проект dal2874), то его надо перетранслировать каждый раз
после внесения изменений в определения форм проекта dal2874.

Для считывания текста процедуры со служебными комментариями нужно нажать
кнопку "Счит.", после чего откроется форма с окном ввода текста
процедуры, в которое по Shift + Ins нужно вставить этот текст, после
чего нажать кнопку "Сохранить".

Если при чтении служебных комментариев возникнут ошибки, то на экране
вместо схемы процедуры появится сообщение об ошибке и текст процедуры с
предполагаемым местом ошибки, обозначенным строкой "?>".
Нужно учитывать, что строкой "?>" часто обозначается не само место
ошибки, а место, где программа столкнулась с проблемой при считывании
служебных комментариев процедуры. Например, при возникновении сообщения
"нет ЕСЛИ для КОНЕЦ" с пометкой в тексте процедуры "?> КОНЕЦ" только
сам программист сможет разобраться, забыл ли он про ЕСЛИ, или добавил
лишний КОНЕЦ. ну и так далее.
После исправления ошибки в тексте процедуры нужно считать этот текст
снова.

Для сохранения текста отредактированной процедуры нужно нажать кнопку
"Сохр.", после чего текст отредактированной процедуры будет скопирован в
клипборд Windows, откуда этот текст по Shift + Ins можно вставить в
любой текстовый файл.
Кроме того, текст отредактированной процедуры записывается в файл
proc.txt в рабочем каталоге программы, а предыдущая версия файла
proc.txt сохраняется под именем proc.__o .

Для сохранения схемы в jpg-файле нужно нажать кнопку "JPG", после чего
схема будет сохранена в подкаталоге \rk рабочего каталога программы с
именем shema.jpg.
Если схема очень большая (больше схемы "Морозко"), то на экране может
появиться сообщение "недостаточно памяти для выполнения операции".

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

Если кажется, что для минимизированной схемы перетаскивание мышью с
нажатой правой кнопкой слишком медленное, то нужно уменьшить параметр
"диапазон прокрутки", например до 150.

</readme.txt>

А в заключение 2 примера

Фрагмент схемы процедуры "вывод_схемы" для русифицированного КП:
Вложение:
dal_vjaz_2.jpg
dal_vjaz_2.jpg [ 156.14 КБ | Просмотров: 1132 ]


Пример для КП
Из текста процедуры
Код:
(* i.1 proc *)
   PROCEDURE WndHandler (wnd, msg, wParam, lParam: INTEGER): INTEGER;
      VAR res: INTEGER; ps: WinApi.PAINTSTRUCT; dc: WinApi.HDC;
   BEGIN
      IF msg = WinApi.WM_DESTROY THEN
         (**) WinApi.PostQuitMessage(0)
      ELSIF msg = WinApi.WM_PAINT THEN
         dc := WinApi.BeginPaint(wnd, ps);
         res :=WinApi.TextOut(dc, 50, 50, message, LEN(message));
         res :=WinApi.EndPaint(wnd, ps)
      ELSIF msg = WinApi.WM_CHAR THEN
         res := WinApi.Beep(800, 200)
      ELSE
         (**) RETURN WinApi.DefWindowProc(wnd, msg, wParam, lParam)
      END;
   (** ВЫХОД *)
   RETURN 0
   END WndHandler;
(** КОНЕЦ ПРОЦЕДУРЫ *)

получаем следующую схему:
Вложение:
shema.jpg
shema.jpg [ 95.79 КБ | Просмотров: 1132 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Февраль, 2016 20:45 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 974
Откуда: Украина, Киев
Получается, что ДРАКОН скрывает (инкапсулирует) реализацию веточного цикла в схеме "силуэт", а ДАЛВЯЗ 2 всё это демострирует программисту, загромождая схему...
В чём тогда преимущества для программиста?
Мною в 2008 году (8 лет назад) был предоставлен транслятор ДРАКОН-схем в исходный код на языке Активный Оберон. http://sage.com.ua/ru.shtml?e6l0 Транслятор автоматически генерировал в том числе и код веточного цикла. Эта операция и должна делаться автоматически!
Всё что делается автоматически облегчает труд программиста и исключает ошибки человека (человеческий фактор), предоставляя программисту лишь приятное занятие по наполнению основной алгоритмической части схемы.
Сгенерированный код веточного цикла:
Код:
CONST
  Dr018VtkExit = 0;
  Dr018Vtk0143 = 143;
  Dr018Vtk0154 = 154;
  Dr018Vtk0168 = 168;
  Dr018Vtk0177 = 177;
  Dr018Vtk0149 = 149;

...

VAR
  Dr018Vtk: INTEGER;

...

  BEGIN {ACTIVE}
    Dr018Vtk := Dr018Vtk0143;
    WHILE Dr018Vtk # Dr018VtkExit DO
      CASE Dr018Vtk OF
      | Dr018Vtk0143: (* Init *)
        NEW(receiveBuf, Base.MaxUDPDataLen);
        NEW(sendBuf, 0);
        NEW(clients);
        NEW (users);
        running := TRUE;
        terminated := FALSE;
        Dr018Vtk := Dr018Vtk0154
      | Dr018Vtk0154: (* Packet receive *)
        IF running THEN
          CheckKeepAlive(clients);
          s.Receive (receiveBuf^, 0, Base.MaxUDPDataLen, 1, ip, port, len, res);
          IF (res = UDP.Ok) & (len > 0) THEN
            receiveBufOffset := 0;
            (* Version check *)
            IF Base.BufGetInt(receiveBuf, receiveBufOffset) = Base.VERSION THEN
              Dr018Vtk := Dr018Vtk0168
            ELSE
              Dr018Vtk := Dr018Vtk0154
            END; (* IF *)
          ELSE
            Dr018Vtk := Dr018Vtk0154
          END; (* IF *)
        ELSE
          Dr018Vtk := Dr018Vtk0149
        END; (* IF *)
      | Dr018Vtk0168: (* Authentication *)
        command := Base.BufGetInt(receiveBuf, receiveBufOffset);
        seqNum := Base.BufGetInt(receiveBuf, receiveBufOffset);
        uin := Base.BufGetLInt(receiveBuf, receiveBufOffset);
        Utilities.IntToStr(seqNum, str1);
        Utilities.Concat(" SeqNum: ", str1, str1);
        Utilities.Concat(str1, " Command: ", str1);
        Utilities.IntToStr(uin, str2);
        Utilities.Concat("User ID: ", str2, str2);
        Utilities.Concat(str2, str1, str1);
        Base.CommandDecode(command, str2);
        Utilities.Concat(str1, str2, str1);
        Log(AosEvents.Information, 0, str1, FALSE);
        IF FindClient(clients, uin, client) THEN
          (* Additional check *)
          IF (IP.AdrsEqual(client.ip, ip)) & (client.port = port) THEN
            Dr018Vtk := Dr018Vtk0177
          ELSE
            Dr018Vtk := Dr018Vtk0154
          END; (* IF *)
        ELSE
          CASE command OF
          | Base.LOGIN:
            password := Base.BufGetString(receiveBuf, receiveBufOffset);
            IF users.PasswordCorrect(uin, password) THEN
              NEW(client);
              client.ip := ip;
              client.port := port;
              client.uin := uin;
              client.inSeqNum := seqNum;
              client.outSeqNum := 0;
              Kernel.SetTimer(client.keepAliveTimer, Base.clientKeepAliveAwait);
              clients.Add(client);
              Server_LoginReply(client, sendBuf, s);
              MulticastStatus(clients, client, Base.USER_ONLINE, sendBuf, s);
            END; (* IF *)
          | Base.NEW_USER_REG:
            password := Base.BufGetString(receiveBuf, receiveBufOffset);
            shortName := Base.BufGetString(receiveBuf, receiveBufOffset);
            fullName := Base.BufGetString(receiveBuf, receiveBufOffset);
            eMail := Base.BufGetString(receiveBuf, receiveBufOffset);
            user := users.Add(password, shortName, fullName, eMail);
            Server_NewUserReply(ip, port, user.uin, seqNum, sendBuf, s);
          ELSE (* CASE *)
          END; (* CASE *)
          Dr018Vtk := Dr018Vtk0154
        END; (* IF *)
      | Dr018Vtk0177: (* Packet handle *)
        IF command = Base.ACK THEN
          IF Base.SeqNumInACKList(client.ACKList, seqNum, ACKReq) THEN
            client.ACKList.Remove(ACKReq);
          END; (* IF *)
        ELSE
          IF Base.isNextSeqNum(seqNum, client.inSeqNum) THEN
            client.inSeqNum := seqNum;
            CASE command OF
            | Base.SEND_MESSAGE:
              Server_ACK(client, sendBuf, s);
              receiverUin := Base.BufGetLInt(receiveBuf, receiveBufOffset);
              messageType := Base.BufGetInt(receiveBuf, receiveBufOffset);
              message := Base.BufGetString(receiveBuf, receiveBufOffset);
              dt := Dates.Now();
              IF receiverUin = 0 THEN
                MulticastMessage(clients, client, dt, messageType, message, sendBuf, s);
              ELSE
                IF FindClient(clients, receiverUin, receiver) THEN
                  Server_ReceiveMessage(client, receiver, dt, messageType, message, sendBuf, s);
                END; (* IF *)
              END; (* IF *)
            | Base.KEEP_ALIVE:
              Server_ACK(client, sendBuf, s);
              Kernel.SetTimer(client.keepAliveTimer, Base.clientKeepAliveAwait);
            | Base.INFO_REQ:
              receiverUin := Base.BufGetLInt(receiveBuf, receiveBufOffset);
              user := users.Find(receiverUin);
              IF user # NIL THEN
                Server_InfoReply(client, user, sendBuf, s);
              END; (* IF *)
            | Base.SEND_TEXT_CODE:
              Server_ACK(client, sendBuf, s);
              textCode := Base.BufGetString(receiveBuf, receiveBufOffset);
              IF textCode^ = "USER_DISCONNECTED" THEN
                MulticastStatus(clients, client, Base.USER_OFFLINE, sendBuf, s);
                clients.Remove(client);
              END; (* IF *)
            ELSE (* CASE *)
            END; (* CASE *)
          END; (* IF *)
        END; (* IF *)
        Dr018Vtk := Dr018Vtk0154
      | Dr018Vtk0149: (* End *)
        users.Store;
        FinalizeClients(clients);
        clients.Clear;
        BEGIN {EXCLUSIVE} terminated := TRUE END;
        Dr018Vtk := Dr018VtkExit
      ELSE (* CASE *)
      END (* CASE *)
    END (* WHILE *)

  END Instance;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 23 Февраль, 2016 17:09 

Зарегистрирован: Вторник, 15 Декабрь, 2009 11:43
Сообщения: 111
Здравствуйте, Ярослав.

Главное отличие ДАЛВЯЗ 2 от языка ДРАКОН состоит именно в том, что ДРАКОН - это
инструмент для людей, которые профессионально программированием не занимались, а
ДАЛВЯЗ 2 задумывался как инструмент для программистов. А у программиста должен быть
полный контроль над исходным кодом своей программы.
Если рассматривать вопрос функционирования силуэта, то цикл сложного условия, заставляющий
его работать в качестве силуэта, в процедуре всего один, а к тому же в ДАЛВЯЗ 2 этого цикла
может и не быть вовсе - тогда процедура будет состоять только из сложного условия, как во втором
примере моего предыдущего поста.

Возможно при чтении от Вас ускользнул один момент:

Силуэтное программирование на языке ДАЛВЯЗ 2 - это совокупность приемов
визуального программирования, применяемая для разработки в графическом
редакторе ДАЛВЯЗ 2 в формате структурных блок-схем процедур с циклом
сложного условия и обеспечивающая программисту более комфортные с точки
зрения эргономики, чем при вводе в текстовом редакторе, условия ввода
исходного кода процедуры.

Можете ли Вы или разработчики других редакторов для языка ДРАКОН уверенно
заявить: "Да, с точки зрения эргономики мой редактор конечно дает программисту
гораздо лучшие условия ввода текста процедуры, чем обычный текстовый редактор" ?

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2017, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB