Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 14 дек 2019, 21:22

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Развитие проекта Free Oberon
СообщениеДобавлено: 05 фев 2017, 15:43 
Не в сети
Аватара пользователя

Сообщения: 987
Откуда: Днепропетровская обл.
Артур Ефимов писал(а):
Привет!

Со временем можно приспособить Free Oberon и для работы с Ofront+. Уверен, что это будет совсем несложно. Я выбрал voc, потому что мне срочно нужна была рабочая версия для того, чтобы начать обучение группы по Оберону. Кстати, у нас уже было 7 занятий, в группу поступили ещё 4 новичка. Пока усиленно пишем циклы WHILE, и используем почти только тип INTEGER. Скоро будем вводить процедуры и массивы. Всем очень нравится, особенно мне :D

Одной девушке эти занятия помогли сдать программирование в институте на отлично (первый курс компьютерных наук), другому парню пригодилось для Паскаля в школе, остальные просто учат, некоторые дома решают задачи.

Многомодульные проекты обязательно надо делать, это будет следующий существенный шаг в развитии Free Oberon.
Кроме того, для этого надо бы сделать многооконную систему, то есть чтобы можно было держать открытыми сразу несколько текстовых файлов. В свою очередь, для этого нужна полноценная система (псевдо-)графического интерфейса, я её как раз и разрабатываю в свободное время. Модуль Gui.Mod, который работает на Graph.Mod. Написано уже очень много кода, получилась система, напоминающая VCL в Делфи и подобные вещи. При этом я использовал метод построения объектов из Оберон-07 (см. запись MethodDesc), а не систему Оберон-02. Решил посмотреть, насколько это удобно. Вроде бы, неплохо.

Пример:

Код: "OBERON"
  1. MODULE TestGui;
  2. IMPORT G := Graph, Gui, Out;
  3. VAR screen: G.Bitmap; f: Gui.Form; b: Gui.Button;
  4. BEGIN
  5. G.Settings(640, 480, {G.fullscreen, G.spread, G.sharpPixels, G.initMouse});
  6. screen := G.Init();
  7. IF screen = NIL THEN Out.String('Grpah init failed.'); Out.Ln
  8. ELSE
  9. Gui.Init(screen);
  10. f := Gui.NewForm();
  11. f.do.setBounds(f, 0, 0, screen.w, screen.h);
  12. b := Gui.NewButton('Finish');
  13. b.do.setBounds(b, f.w - 100, f.h - 33, 90, 23);
  14. f.do(Gui.ContainerMethod).append(f, b);
  15. Gui.Run(f);
  16. G.Close
  17. END
  18. END TestGui.

Весь интерфейс, включая указатель мышки, отрисовывается в Обероне. На снимке отпечатался указатель ОС, но в программе он не виден.

Изображение

А обработчики событий подключаются так:
(При нажатии кнопки она будет двигаться на 5 пикселей влево.)

Код: "OBERON"
  1. PROCEDURE FinishClick(c: Gui.Component);
  2. BEGIN
  3. c.do.setX(c, c.x - 5)
  4. END FinishClick;
  5. ...
  6. b.do.setOnClick(b, FinishClick);


Пока что есть события MouseDown, MouseUp, MouseMove, MouseEnter, MouseLeave, KeyDown, TextInput, Click, GetFocus, LostFocus.
Седалны компоненты: Form, Button, Edit, Panel, ScrollBox и можно создавать свои.
Модуль Gui занимает 1172 строки. Graph и SDL2 тоже кое-как подправлен, в SDL2 исправлено несколько глюков.

* * *

Что-то я увлёкся рассказом о Gui, но эту наработку и надо будет использовать в Free Oberon, чтобы сделать многооконный режим, как в Турбо Паскале.

Ещё одна проблема, которую предстоит решить — это понять, как среда будет понимать, что ей делать, когда пользователь нажимает F9 (компиляция и запуск). Хотелось бы сделать, чтобы простые одномодульные программки можно было писать также, как сейчас — чтобы не надо было создавать «проект» под каждый HelloWorld как в каком-нибудь Делфи, и, соответственно, выделять под него каталог и прочее...

При этом, нельзя сделать и так, чтобы среда сама определяла, что́ перед ней: многомодульный проект или просто модуль, который надо бы запустить. В Обероне нет отдельного слова "PROGRAM" (и это хорошо), но это только одна сторона проблемы. А что если человек создаст проект в отдельном каталоге, а потом в тот же каталог накидает файлов-одиночек? Что среда должна делать, когда открывает файл-одиночку: предполагать, что это часть проекта или нет? В общем, надо как-то придумать, чтоб удобно было. Задача это, как оказалось, нетривиальная, учитывая что мы используем язык Оберон для создания обычных «приложений», а не «новой части модульной системы» ОС Оберон.

* * *

Насчёт шрифтов, мне пару человек тоже про это сказали. Кому-то не нравится, что шрифт смазанный, когда окно раздвинуто на весь экран. SDL2 выводит всё через текстуру, то есть увеличение (даже в оконном режиме) можно производить на дробные числа, например, увеличить шрифт в 1,7 раза.

Есть ещё другая идея — позволять пользователю выбирать шрифт, ну и, разумеется, сделать несколько шрифтов на выбор: побольше, поменьше, посовременней, поаркадней… Но для этого сначала надо как-то переделать кодировку, чтобы всё работало через UTF-8, а то сейчас получается, что файлы сохраняются в UTF-8, откомпилированная программа работает в UTF-8, а Free Oberon всё воспринимает и внутренне представляет в кодировке CP866. В итоге, если кто-то использует русский язык в программе, то в Терминале Оберона она работает правильно, а в Command Prompt — нет (там UTF-8 не работает), на Линуксе такой проблемы нет. В общем-то, что делать с Command Prompt'ом — непонятно.

Может быть, сделать, чтобы каждый шрифт был представлен не BMP-файлом, а каталогом с BMP-файлами, в котором будет текстовый файл с настройками, а в каждом BMP-файле — какой-либо диапазон юникода.

Ещё надо предусмотреть какой-нибудь модуль для людей, чтобы можно было с русскими буквами работать нормально. Например, перебирать их в строке. Дейв мне объяснял, что придётся делать так.

Артур


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Развитие проекта Free Oberon
СообщениеДобавлено: 06 фев 2017, 00:11 
Не в сети
Аватара пользователя

Сообщения: 987
Откуда: Днепропетровская обл.
Список задач "на повестке дня" по Free Oberon

Цитата:
Наверное, пора сделать репозиторий на Гитхабе.
Сейчас основная работа идёт по следующим направлениям:

1. Доработка стандартной библиотеки компилятора voc, который используется в системе. А именно:
1.1. Работа с типом REAL — считывание с консоли и вывод на консоль (уже есть, но надо переписать).
1.2. Работа с файлами, модули Files и Texts. Сейчас, если файл не удалось открыть, voc просто делает HALT. Должна быть возможность получить список файлов в каталоге и т. п. Возможно, надо убрать всё лишнее из типа Texts.Text (например, информацию о шрифтах ОС «Оберон»), а оставить только то, что необходимо для эффективной и удобной обработки «обычных» текстовых файлов.

2. Доработка псевдографического интерфейса до уровня TurboPascal, то есть:
2.1. Возможность использования указателя мыши (в том числе, для перемещения по тексту и для выделения текста).
2.2. Выпадающие меню сверху (File, Edit и прочее).
2.3. Возможность работы с несколькими открытыми файлами одновременно.
2.4. Удобные диалоги открытия и сохранения файлов. Тут надо явно пойти дальше, чем TurboPascal, у них этот диалог совсем неудобный.

3. Полуавтоматическая компиляция проекта, состоящего из нескольких модулей. Например, чтобы можно было тот же FreeOberon скомпилировать в самом себе. Этот пункт можно сделать только тогда, когда в основном будет закончен пункт №2.
3.1. Разработать формат «файла проекта», если таковой будет (а, видимо, без него не обойтись).
3.2. Автоматическое создание дерева модулей на основе исходного кода проектов.

4. Доработка эмулятора терминала:
4.1. Поддержка команд VT100 (цвет текста и фона, очистка экрана, перемещение курсора по экрану; модуль vt100 в voc уже есть).
4.2. Выключение запущенной программы при нажатии Ctrl+Break — сейчас это происходит не всегда и не убивает процесс, а просто «отключает» его (забывает о нём, а процесс себе дальше работает).
4.3. Возможность выбирать один из доступных растровых шрифтов разного размера.

5. Кодировка.
5.1. Поддержка русских букв в альтернативных кодировках (для учебных целей). Сейчас используется кодировка UTF-8, что создаёт для учеников некоторые сложности при обработке символьных массивов, содержащих русские буквы, поэтому им приходится работать только с латиницей.
5.2. Более полная поддержка UTF-8.
5.3. Написание модуля для работы со строками, закодированными в формате UTF-8 (переход к следующей литере, подсчёт количества литер).

6. Документация.
6.1 Создание документации по коду — для изучения Оберона на примере создания текстового редактора, а также для новых членов команды разработчиков.
6.2. Создание документации по языку и библиотекам, чтобы программист мог легко понять, как в Обероне «прочитать файл» или «сгенерировать псевдослучайное число».


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Развитие проекта Free Oberon
СообщениеДобавлено: 02 дек 2019, 15:49 
Не в сети
Аватара пользователя

Сообщения: 15
Откуда: Рига, Латвийская ССР
С тех пор некоторые пункты были успешно выполнены:

2. Доработка псевдографического интерфейса до уровня TurboPascal, то есть:
2.1. Возможность использования указателя мыши (в том числе, для перемещения по тексту и для выделения текста).
2.2. Выпадающие меню сверху (File, Edit и прочее).
2.3. Возможность работы с несколькими открытыми файлами одновременно.

3. Полуавтоматическая компиляция проекта, состоящего из нескольких модулей. Например, чтобы можно было тот же FreeOberon скомпилировать в самом себе. Этот пункт можно сделать только тогда, когда в основном будет закончен пункт №2.
3.1. Разработать формат «файла проекта», если таковой будет (а, видимо, без него не обойтись).
3.2. Автоматическое создание дерева модулей на основе исходного кода проектов.

Теперь в Free Oberon при компиляции автоматически создаётся дерево модулей, после чего файлы компилируются в правильном порядке. Долго я готовился к написанию этого куска кода, а в итоге заняло это всего несколько часов. Потребовалось написать пару рекурсивных процедур, которые открывают файлы и считывают в них секцию IMPORT с помощью простого синтаксического анализатора, также выполненного в виде пары процедур. По сути этот анализатор должен был уметь только пропускать (вложенные) комментарии, понимать ключевые слова MODULE и IMPORT, и считывать последовательность модулей с псевдонимами (MODULE A; IMPORT Out, S := Strings;). Простота языка Оберон позволяет с лёгкостью написать такой анализатор.

Также автоматически подключаются и компилируются куски программы, написанные на Си.
Наприимер, если создать такие файлы:
    Chmod.Mod
    Chmod/Chmod.c
    Chmod/Chmod.h
то Free Oberon увидит, что рядом с файлом Chmod.Mod находится каталог с таким же названием, зайдёт в него и попытается в нём найти Си-файл и h-файл (с таким же названием).
Если это удалось, он скомпилирует сначала, Си-файл, используя gcc, а также включит его в список компоновки исполнимого файла.

Также автоматически подключаются библиотеки SDL2 и SDL2_image, если в дереве модулей есть модуль Graph.

А вот без файла проекта удалось обойтись. Для компиляции проекта достаточно переместить фокус на окно с главным модулем и нажать F9. Входящие в проект файлы, таким образом, определяются автоматически (по дереву модулей). Если в каком-либо файле проекта произойдёт ошибка, он будет открыт, а ошибка отображена.

Окно открытия и сохранения не переделано, справка не добавлена. Окно со списком ошибок по прежнему имеет «эфемерный» характер, то есть исчезает после нажатия любой клавиши.

Зато теперь окна можно двигать, есть функция расположения окон каскадом или методом «замостить».
В планах — перевод Free Oberon на различные языки (интернационализация и локализация), расширение поддержки Юникода.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Развитие проекта Free Oberon
СообщениеДобавлено: 03 дек 2019, 00:54 
Не в сети

Сообщения: 73
kekc_leader писал(а):
Теперь в Free Oberon при компиляции автоматически создаётся дерево модулей, после чего файлы компилируются в правильном порядке. Долго я готовился к написанию этого куска кода, а в итоге заняло это всего несколько часов. Потребовалось написать пару рекурсивных процедур, которые открывают файлы и считывают в них секцию IMPORT с помощью простого синтаксического анализатора, также выполненного в виде пары процедур. По сути этот анализатор должен был уметь только пропускать (вложенные) комментарии, понимать ключевые слова MODULE и IMPORT, и считывать последовательность модулей с псевдонимами (MODULE A; IMPORT Out, S := Strings;). Простота языка Оберон позволяет с лёгкостью написать такой анализатор.
Я что-то подобное проделывал для паскалевских исходников тут 8-)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Развитие проекта Free Oberon
СообщениеДобавлено: 07 дек 2019, 17:43 
Не в сети

Сообщения: 1
kekc_leader писал(а):
С тех пор некоторые пункты были успешно выполнены:

Здравствуйте, а эти изменения уже доступны в гитхаб версии FreeOberon?


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

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


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

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


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club