OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Апрель, 2024 22:12

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




Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 14 Январь, 2006 09:45 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Если в среде Блекбоксе будет несколько менеджеров памяти, то он будет называться по-другому, не так ли?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 14 Январь, 2006 13:48 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
я не понял, может ли значение типа указатель отличаться от адреса ранее размещенного объекта...

Цитата:
Если в среде Блекбоксе будет несколько менеджеров памяти, то он будет называться по-другому, не так ли?


А, Вы вот про что! Действительно, если вы работаете штатно, только средствами языка, то "значение типа указатель отличаться от адреса ранее размещенного объекта" не может - на этом основано все безопасное управление памятью.

Но средства модуля SYSTEM обходят это ограничение. Смысл модификатора [untagged] как раз в том, что он говорит, что этот указатель взят "с потолка", память под него не размещалась менеджером кучи ББ, и ББ за ее использование и освобождение не отвечает. Она может быть выделена либо системно, либо взята от какой-либо глобальной и даже стековой переменной инструкцией SYSTEM.ADR - как в "старых добрых"... В ББ INTEGER - аналог нетипизированного POINTER в Паскале, а POINTER TO RECORD [untagged] - аналог типизированного, но неуправляемого указателя.

Теперь ответил? Или опять слишком подробно и не в ту степь? :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 14 Январь, 2006 14:36 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Конечно, давно ответили уже. Значит [un]BlackBox можно назвать? :) :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 14 Январь, 2006 14:42 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Если честно, не догоняю, о чем вы :-)

О том, что эти вещи противоречат заявляемой идеологии среды? Так потому они и вынесены в SYSTEM, и каждый блэкбоксовик знает, что использовать SYSTEM можно только в крайнем случае, в нескольких системных модулях. Гарантировано, что если в модуле не прописано IMPORT SYSTEM, то он безопасен и переносим. Исключить же SYSTEM вообще нельзя, т.к. Обероны - это языки в первую очередь практические, более того, изначально и по сей день ориентированные на решение задач системного программирования (в широком смысле этого слова).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 14 Январь, 2006 17:23 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
В Blackbox есть функции, аналогичные функциям FillChar и SizeOf?

Кстати, испытание кода, который есть в WinNet, снова было неудачным в том смысле, что результат = 1, а тот же код в Delphi дает результат = 0
Код:
function TForm1.NbLanaEnum: TLana_Enum;
var
 NCB: TNCB;
 L_Enum: TLana_Enum;
 RetCode: Word;
begin
 FillChar(NCB, SizeOf(NCB), 0);
 FillChar(L_Enum, SizeOf(TLana_Enum), 0);
 NCB.Command := NCB_ENUM;
 NCB.Buf := @L_Enum;
 NCB.Length := Sizeof(L_Enum);
 RetCode := NetBiosCmd(NCB);
 if RetCode <> NRC_GOODRET then
  begin
   L_Enum.Length := 0;
   L_Enum.Lana[0] := Byte(RetCode);
  end;
 Result := L_Enum;
end;

(ncb.ncb_retcode = 0 означает, что функция выполнилась верно). ncb_retcode = 1 означает
NRC_BUFLEN = $01; { illegal buffer length }. Значение 255 для NCB.Length := Sizeof(L_Enum) беру из дельфей. Как его определить для ББ, даже не знаю, смотрел описание SYSTEM, там для этого функций не нашел.


Код:
MODULE NBSTest2;

   IMPORT SYSTEM, log := StdLog, n := WinNet, Strings, Services, WinApi;

   PROCEDURE Zero2(VAR a: n.NCB);
      VAR i: INTEGER;
   BEGIN
         a.ncb_command := 0X; a.ncb_retcode := 0X; a.ncb_lsn := 0X; a.ncb_num := 0X;
         a.ncb_buffer := NIL; a.ncb_length := 0; a.ncb_rto := 0X; a.ncb_sto := 0X;
         a.ncb_post := NIL; a.ncb_lana_num := 0X; a.ncb_cmd_cplt := 0X; a.ncb_event := 0;
         
         i := 0;
         WHILE i < LEN(a.ncb_callname) DO    
            a.ncb_callname[i] := 0X; INC( i )
         END;
         i := 0;
         WHILE i < LEN(a.ncb_name) DO
            a.ncb_name[i] := 0X; INC( i )
         END;          
         i := 0;
         WHILE i < LEN(a.ncb_reserve) DO    
            a.ncb_reserve[i] := 0X;
            INC( i )
         END
   END Zero2;
   
   
   PROCEDURE ZeroLana(VAR lana: n.LANA_ENUM);
      VAR i: INTEGER;
   BEGIN
      lana.length := 0X;
      FOR i := 0 TO 255-1 DO lana.lana[i] := 0X END
   END ZeroLana;
   
   PROCEDURE print(c: SHORTCHAR);
   BEGIN
      log.String(' result = '); log.Int(ORD( c )); log.Ln
   END print;

   PROCEDURE convert(IN s: ARRAY OF CHAR; OUT sc: ARRAY OF SHORTCHAR);
      VAR i: INTEGER;
   BEGIN   
      log.String('---------');
      FOR i := 0 TO LEN ( s$ ) DO
         sc[i] := SHORT( s[i] );
         log.Char(sc[i])
      END;
      
      log.String('---------'); log.Ln
   END convert;
   
   PROCEDURE Do2*;
      VAR retcode: SHORTCHAR;
      lana: n.LANA_ENUM;
      adapter: n.ADAPTER_STATUS;
      adr: INTEGER;
      s: ARRAY 255 OF CHAR;
      ss: ARRAY 255 OF SHORTCHAR;
      ncb: n.NCB;
   BEGIN
      Zero2( ncb );
      ZeroLana( lana );
      ncb.ncb_command := SHORT( CHR (n.NCBENUM));
      ncb.ncb_buffer := SYSTEM.VAL(WinApi.PtrSTR, lana);
      ncb.ncb_length := 255;
      retcode :=  n.Netbios(ncb);
      print(retcode);
      
      log.String(' len = '); log.Char(LONG(lana.length)); log.Ln;
   END Do2;
END NBSTest2.
NBSTest2.Do2

Лог
Код:
 result =  1
 len =  00X


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 14 Январь, 2006 19:05 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В КП есть встроенная функция SIZE(), которая возвращает размер памяти, занимаемой аргументом, в байтах. Это в описание языка включено, а не в SYSTEM.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 14 Январь, 2006 19:34 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Нда, а вот с FillChar тяжелее... Вообще говоря в WinAPI есть функции ZeroMemory, FillMemory, но в модуль WinApi они включены не были.

Открываю исходник Windows Delphi - и вижу, что они не экспортированы из Kernel32.dll - а прям там и реализованы, через псевдопроцедуру Дельфы FillChar... Видимо, они и в сишных заголовках SDK тоже напрямую реализуются, без обращения к kernel, что, впрочем, логично...

В ББ реализации этого я не видел. Для обычных записей я писал зануление с разборкой типа через Meta, а вот для [untagged], видимо, придется в машинных кодах написать :-( Утилиту для трансляции мнемокодов OMS не предоставила, к сожалению.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 14 Январь, 2006 19:49 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
А впрочем... Можно и без этого написать:
Код:
   PROCEDURE FillMemory* (adr, count: INTEGER; val: BYTE);
      VAR i: INTEGER;
   BEGIN
      FOR i := 0 TO count -1 DO
         SYSTEM.PUT(adr + i, val)
      END
   END FillMemory;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 15 Январь, 2006 00:17 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Гарантировано, что если в модуле не прописано IMPORT SYSTEM, то он безопасен и переносим.


А если он импортирует другой модуль, который импортирует SYSTEM?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 15 Январь, 2006 00:24 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
А впрочем... Можно и без этого написать:
Код:
         SYSTEM.PUT(adr + i, val)


Ой как все плохо. И это язык системного программирования? ;) А в чем заключается его системность, если такие простые вещи выглядят так коряво?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 15 Январь, 2006 00:38 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Влад, ты и правда не понимаешь или придуриваешься? :-)
Если тебе приходится использовать низкоуровневую работу с битами памяти где-то кроме ядра твоей системы - значит, эта система спроектирована из рук вон плохо. Потому что вся низкоуровневость должна быть как можно скорее сокрыта за слоем абстрактных понятий языка. Только так можно гарантировать надежность, расширяемость и независимость от окружения. И Оберон дает еще при всем и прекрасную скорость.
Хотя в этих нескольких модулях ядра код на Обероне может выглядеть действительно грязновато - за счет префикса SYSTEM и прочего... Именно поэтому Excelsior в своем XDS позволила свободно стыковать Модулу-2 и Оберон-2 (Обероновский модуль может использовать модуль Модулы) - это очень удобно в системных проектах.

Позволю себе привести отрывок из недавней переписки с директором Excelsiora А. Хапугиным:
Цитата:
Хочу добавить, что по моему мнению двуязыковость нашей среды
(Модула-2/Оберон-2) для программирования полной операционной системы
дает серьезные преимущества, которые почему-то пока никто не заметил.
Поделюсь с Вами, возможно получу в ответ мнение серьезного практика
:-) . Есть части ОС, которые попросту неудобно делать на Обероне из-за
отсутствия реальной адресной арифметики, работы с железом, работы с
памятью "традиционным" способом и т.п. На Обероне такие места выглядят
"грязью", которую разработчики старательно "прячут", потом говоря в
документации о "2-3 системно-зависимых модулях" (в которые нормальному
человеку не надо заглядывать :-)). Но Модула-2 для этого подходит
практически идеально, во всех смыслах - от объема требуемого текста до
сохранения надежности и контроля. Она для этого и разрабатывалась,
собственон первая операционая система Вирта была на Модуле. А
Модуловские модули в XDS можно непосредственно импортировать в Оберон,
как если бы это был просто Оберон, но без единого класса - только
функции (и без метасредств). Ядро можно сделать на Модуле, и безо
всяких специальных усилий использовать из Оберона. Получается, что
ядро становится "чище" и значит надежнее.


Последний раз редактировалось Илья Ермаков Воскресенье, 15 Январь, 2006 01:06, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 15 Январь, 2006 01:04 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
А если он импортирует другой модуль, который импортирует SYSTEM?


Ну и что? Это же не .NET, где импортируются все уровни. Я могу подменить системный модуль X любой другой реализацией, в том числе и без импорта SYSTEM, если интерфейс X останется тем же, клиенты ничего не заметят вообще, никакой перекомпиляции не требуется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 15 Январь, 2006 10:00 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Про эти вещи мы уже поговорили. Я же спрашивал лишь об отдельном решении в плане необходимости переименования. Но, наверное, трудно придумать что-то, что к ней приведет. :cry:
А что Владу было непонятно в процитированном коде? Программы прежде всего читаются людьми, а потом уже выполняются.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 15 Январь, 2006 13:34 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Кстати, о независимости от окружения. Складывается такое впечатление, что ББ в этом отношении уступает классическому Оберону. Oberon и в Linux и на MAC OS работает. Последняя даже с двумя платформами одновременно. Кто кого догоняет?
2Cardinal: а куда пропала строчка adr:=SYSTEM.ADR(lana);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 15 Январь, 2006 14:11 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
2 GUEST: а зачем она нужна?
Вообщем, в итоге у меня получилось так:
Код:
   TYPE
      Buffer = ARRAY 300 OF SHORTCHAR;
      
   PROCEDURE FillMemory(adr, count: INTEGER; val: BYTE);
      VAR i: INTEGER;
   BEGIN
        FOR i := 0 TO count -1 DO SYSTEM.PUT(adr + i, val) END   
   END FillMemory;
...

   PROCEDURE GetLana(OUT l: n.LANA_ENUM);
      VAR ncb: n.NCB; buffer: Buffer; ret: SHORTCHAR; i: INTEGER;
   BEGIN
      FillMemory(SYSTEM.ADR(ncb), SIZE(n.NCB), 0);
      FillMemory(SYSTEM.ADR(buffer), SIZE(Buffer), 0);
      ncb.ncb_command := SHORT(CHR( n.NCBENUM ));
      ncb.ncb_buffer := buffer;
      ncb.ncb_length := SIZE( n.LANA_ENUM );
      ret := n.Netbios( ncb );
      IF ret = 0X THEN
         l.length := buffer[0];
         FOR i := 0 TO SIZE(n.LANA_ENUM )-2 DO
            l.lana[i] := buffer[i+1];
            
         END;
      END;
      
   END GetLana;

Код
Код:
ncb.ncb_buffer := SYSTEM.VAL(WinApi.PtrSTR, lana)
не работает


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 15 Январь, 2006 15:03 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну так что в итоге - работает или нет?

2Guest:
По поводу того, что Оберон больше независим от среды - с этим и спорить бессмысленно, Оберон создан как платформа, работающая на голом железе. ББ как раз и задумывался как промышленная реализация в первую очередь под Windows и Mac OS. Кстати, заказные проекты под Unix выполнялись - на гидростанции в Бразилии работает версия под "custom UNIX port for 64bits processors" (см. презентацию Пфистера, где-то в середине...

Одна из проблем переноса в том, что в ББ GUI плотно связано с OLE и COM, и отвязываться от них не так просто... Хотя без-GUI-шные версии уже есть - у Ткачева (info21) в РАН на вычислительном кластере что-то уже работает...

Мы в Метасистемах пишем пока только под Windows, и ББ нас более чем устраивает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 15 Январь, 2006 15:10 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
2Cardinal: Только для того, чтобы не заниматься копированием значений. Кроме того экономится стековая память. Сейчас у Вас и l и buffer в стеке находится. А если написать: ncb.ncb_buffer = SYSTEM.VAL(WinApi.PtrSTR, SYSTEM.ADR(l)) то buffer можно убрать.
2Илья Ермаков:Надо хотя бы определить эти проблемы, что-ли. Info21 говорил что кто-то их решает, но кто и когда неизвестно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 15 Январь, 2006 16:41 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 18:08
Сообщения: 76
2 GUEST: Да, Вы правы. Не додумался я, что нужно подставлять адрес. В помощи ББ написано:
Цитата:
VAL(T, x)
T, x: любой тип;
Возвращает Т
х интерпретируется в качестве типа T
.
2 Илья Ермаков: В итоге работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 16 Январь, 2006 01:53 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
Надо хотя бы определить эти проблемы, что-ли. Info21 говорил что кто-то их решает, но кто и когда неизвестно.


Вы абсолютно правы :-)
Но проблема в том, что у основных пользователей ББ в России сейчас пока нет ресурсов развивать его глобально, "чтобы было". Что Институт ядерной физики, где работает Ткачев, что мы, сейчас решаем сугубо повседневные задачи, которые перед нами стоят - по возможности закладывая задел на будущее. Но глобальные задачи навроде "полностью перенести ББ на Линукс к такому-то сроку" мы перед собой ставить (пока) не имеем возможности.

По поводу информации о переносе на Линукс спросите у самого Инфо-21, мы, как я уже сказал, Линуксом (пока) не занимаемся.

А подъем энтузиазма и участия - это хорошо, для того и создавался этот ресурс :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 16 Январь, 2006 01:57 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Влад, ты и правда не понимаешь или придуриваешься? :-)


Ну вообще вопрос был скорее риторическим. И так все понятно ;)

Илья Ермаков писал(а):
Но Модула-2 для этого подходит
практически идеально, во всех смыслах - от объема требуемого текста до
сохранения надежности и контроля.


Звучит как очередная "панацея"... Которую (как всегда) никто не может оценить...


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

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


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

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


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

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