Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Работа с динамической памятью в XDev
https://zx.oberon.org/forum/viewtopic.php?f=8&t=127
Страница 1 из 1

Автор:  Zorko [ 14 июл 2013, 14:04 ]
Заголовок сообщения:  Работа с динамической памятью в XDev

Пока что ни о какой сборке мусора конечно не может быть и речи. Я с ней не разобрался, а кучу метаинформации, которую норовит построить Ofront, просто вырезаю, так что IS не будет работать точно. Но какие-то шаги в направлении работы с указателями приходится делать. Начнём мы с обычного резервирования и ручного освобождения памяти как в Си/Паскале. Для этого в модуль Platform я добавил процедуру DISPOSE. Рабочий пример кода пока только для Win32 (должен без изменений собираться и работать в MS DOS и на Спектруме):
Код: "OBERON"
  1. MODULE DemoDynMem; (*$MAIN*)
  2. IMPORT
  3. IO := Console, Platform;
  4.  
  5. TYPE
  6. PersonPtr = POINTER TO Person;
  7. Person = RECORD
  8. name: ARRAY 20 OF CHAR;
  9. age: INTEGER;
  10. sex: CHAR; (*"M" OR "F"*)
  11. next: PersonPtr;
  12. END;
  13.  
  14. VAR
  15. john, mike, lisa, bob, iren, person: PersonPtr;
  16. list: POINTER TO ARRAY 5 OF PersonPtr;
  17. n: INTEGER;
  18.  
  19. BEGIN
  20. NEW(john); NEW(mike); NEW(lisa); NEW(bob); NEW(iren);
  21. john.name := "John Smith" ; john.sex := "M"; john.age := 32;
  22. john.next := bob;
  23. mike.name := "Michael Bison"; mike.sex := "M"; mike.age := 12;
  24. mike.next := lisa;
  25. lisa.name := "Elisabeth Bow"; lisa.sex := "F"; lisa.age := 21;
  26. lisa.next := NIL;
  27. bob.name := "Boris Fellow" ; bob.sex := "M"; bob.age := 39;
  28. bob.next := iren;
  29. iren.name := "Iren Summer" ; iren.sex := "F"; iren.age := 43;
  30. iren.next := mike;
  31.  
  32. person := john; IO.WriteStrLn("Female:");
  33. WHILE person # NIL DO
  34. IF person.sex = "F" THEN IO.WriteStrLn(person.name) END;
  35. person := person.next;
  36. END; IO.WriteLn;
  37.  
  38. NEW(list);
  39. list[0] := john; list[1] := mike; list[2] := lisa;
  40. list[3] := bob; list[4] := iren;
  41.  
  42. FOR n := LEN(list^) - 1 TO 0 BY -1 DO
  43. IO.WriteStrLn(list[n].name);
  44. IO.WriteCh(list[n].sex); IO.WriteLn;
  45. IO.WriteInt(list[n].age); IO.WriteLn; IO.WriteLn;
  46. Platform.DISPOSE(list[n]);
  47. END;
  48. Platform.DISPOSE(list);
  49. END DemoDynMem.
Обратите отдельное внимание на размер исполняемого файла. В лучших традициях XDev!

Вложения:
Комментарий к файлу: Программа консольная, чтобы увидеть вывод запускаю её в Total Commander комбинацией Shift+Enter.
DemoDynMem.exe.zip [1.35 КБ]
Скачиваний: 1716

Автор:  slenkar [ 14 июл 2013, 18:20 ]
Заголовок сообщения:  Re: Работа с динамической памятью в XDev

1kb :shock:

It works under wine

Цитата:
# wine DemoDynMem.exe
Female:
Iren Summer
Elisabeth Bow

Iren Summer
F
43

Boris Fellow
M
39

Elisabeth Bow
F
21

Michael Bison
M
12

John Smith
M
32

Автор:  Zorko [ 17 июл 2013, 00:10 ]
Заголовок сообщения:  Re: Работа с динамической памятью в XDev

slenkar, specially for you - XDev's cross-platform in action. Now under DOS and Linux. :) I've started a new subsystem LinDev - for development native Linux applications in Oberon-2. I hope you will like this idea!

https://github.com/Oleg-N-Cher/BB-XDev/blob/master/DosDev/DYNMEM.EXE - for MS DOS
https://github.com/Oleg-N-Cher/BB-XDev/blob/master/LinDev/DemoDynMem - for Linux (i386)

P.S. Building the DynMem module for DOS needs the modified Ofront, because old Turbo C does not support identifiers concatenation ##

Автор:  Jordan [ 18 июл 2013, 07:18 ]
Заголовок сообщения:  Re: Работа с динамической памятью в XDev

Уже неплохо. Но как мы знаем минимальная программа = операционная система, но приятно, что занимает 1 кб.

Возможно ли в ofront, внедрить подобие шаблонов? Не в ручную приводить каждый тип. А именно генерировать АТД. Естественно, что совместимость теряется, но каждый раз писать велосипед 2013 году, как то ...

Автор:  Jordan [ 18 июл 2013, 07:22 ]
Заголовок сообщения:  Re: Работа с динамической памятью в XDev

Надеюсь, вы не будете оспаривать преимущества, атд?

Автор:  geniepro [ 18 июл 2013, 08:26 ]
Заголовок сообщения:  Re: Работа с динамической памятью в XDev

Jordan писал(а):
Возможно ли в ofront, внедрить подобие шаблонов? Не в ручную приводить каждый тип. А именно генерировать АТД. Естественно, что совместимость теряется, но каждый раз писать велосипед 2013 году, как то ...

Надеюсь, вы не будете оспаривать преимущества, атд?

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

То, о чём говорите Вы -- это на самом деле родовые типы данных по терминологии языка Ада. Шаблонные типы, дженерики...

Был эксперимент по созданию варианта Оберона с дженериками, но почему-то этот проект забросили...

ЗЫ. Сам я считаю, что дженерики весьма важны...

Автор:  Zorko [ 18 июл 2013, 12:35 ]
Заголовок сообщения:  Re: Работа с динамической памятью в XDev

Полагаю, Оберон тем и ценен, что является минимумом, ядром (по определению Андреаса Хейлсберга — до 90% семантики у императивных языков — общие, так вот Оберон и реализует те самые 90%), и добавить в Ofront дженерики можно и нужно. Проблема только в том, что заниматься этим практически некому. Но если начинать эту работу, хорошо сначала посмотреть что уже сделано в этом направлении.

Стану ли я заниматься внедрением в Ofront дженериков? Может быть, но неизвестно когда. Сначала надо сборку мусора осилить, ИМХО это важнее.

Jordan писал(а):
Надеюсь, вы не будете оспаривать преимущества, атд?
Не буду конечно. Даже Вирт заметил, что язык Оберон был продуктом, соответствующим поставленным задачам. А про параллельность сказал, что она не поддержана в Обероне-1 не потому, что он её отрицает, а потому что ОС Оберон была задумана как однопользовательская и однопоточная. Здесь ответ в том, что безусловно надо Оберон превратить в современный промышленный язык, но желательно чтобы он при этом на слишком распух.

Так что я был бы рад видеть инициативу по доработке Оберона/Ofront'а в нужных по Вашему мнению направлениях. Это можно делать с помощью компактных расширений языка Оберон (типа OberonX или Component Pascal), тогда можно позиционировать компилятор Оберона с поддержкой расширений X и Y, например. Это позволит оставить ядро Оберона простым, а расширения будут рассматриваться отдельно от конкретных реализаций.

Автор:  slenkar [ 19 июл 2013, 01:11 ]
Заголовок сообщения:  Re: Работа с динамической памятью в XDev

The linux demos work great :mrgreen:

Страница 1 из 1 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/