OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 23:58

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




Начать новую тему Ответить на тему  [ Сообщений: 68 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 04:56 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Как бороться со структурами с битовыми полями, а также с юнионами, когда пишем биндинг к сишной либе?

Вот есть нечто вроде такого:
Код:
typedef struct S
{
   Type type;
   union {
       struct {
           u32int a    : 1;
           u32int b    : 7;
           u32int c    : 13;
           u32int d    : 27;
           u32int e    : 1;
           u32int f    : 7;
        } s;
        char foo[10];
        u32int j;
   } u;
} struct_t;

struct_t new_struct();
BOOL print_struct(struct_t s);
void init(struct_t* s);

Как будет это выглядеть на Обероне (обычном, 2, или 07)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 08:41 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Alexey Veselovsky писал(а):
Как бороться со структурами с битовыми полями, а также с юнионами, когда пишем биндинг к сишной либе?
Написать конвертирующие процеруды.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 16:47 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Александр Ильин писал(а):
Alexey Veselovsky писал(а):
Как бороться со структурами с битовыми полями, а также с юнионами, когда пишем биндинг к сишной либе?
Написать конвертирующие процеруды.

Т.е. полноценный маршалинг с копированием данных? Прозрачно никак? А функции конвертации наверно удобней на Си писать...

<удалено модератором>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 18:31 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Отделена тема "Си-unions в КП": viewtopic.php?f=2&t=3052


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 19:48 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Вот так с битовыми полями борются во freepascal'e (ключевое слово bitpacked):
Код:
type
    Unsigned_7  = 0 .. (1 shl 7)  - 1;
    Unsigned_20 = 0 .. (1 shl 20) - 1;

type
    page_t = bitpacked record
       present  : boolean;
       rw       : boolean;
       user     : boolean;
       accessed : boolean;
       dirty    : boolean;
       unused   : Unsigned_7;
       frame    : Unsigned_20;
    end;

Вопрос -- имеет ли смысл подобный расширизм для оберона?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 20:26 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Алексей, я позволю себе задать вопрос абсолютно когерентный Вашему :)

Если кто помнит "задачку от Галкова", то там был употреблен самопальный термин "нормализация" последовательности. Последовательность битов от датчика (00 -> 01 -> 11 -> 10) надо сделать нормальной: (00 -> 01 -> 10 -> 11). В общем, никаких придумок - просто жизнь.

Просто же все: 0-вой бит надо про-XOR-ить с первым:
Код:
   union {
       struct {
           bit0    : 1;
           bit1    : 1;
        };
        int i;
   } Counter;

   Counter.bit0 ^= Counter.bit1; // и всего делов


ВОПРОС: как это сделать на Обероне :?:
Не, ну я пробовал конечно же... Просто потом ухи в трубочку сворачиваются. Может не понимаю чего :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 21:17 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Galkov писал(а):
В общем, никаких придумок - просто жизнь.
Как это никаких придумок. Кто-то же до этого додумался.
Это узкоспециальная жизнь.
Возможно даже извращенные формы.
С какой стати это должно на Обероне выражаться "просто".
Оберон не поощряет извращения -- чтобы не превратить в ад неузкоспециальную жизнь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 21:28 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Galkov писал(а):
Просто же все: 0-вой бит надо про-XOR-ить с первым:
Код:
   union {
       struct {
           bit0    : 1;
           bit1    : 1;
        };
        int i;
   } Counter;

   Counter.bit0 ^= Counter.bit1; // и всего делов


ВОПРОС: как это сделать на Обероне :?:
Не, ну я пробовал конечно же... Просто потом ухи в трубочку сворачиваются. Может не понимаю чего :)


У меня лично получился вот такой вот ужас:
Код:
PROCEDURE JustDoIt (i:LONGINT) : LONGINT;
VAR
    b0, b1 : BOOLEAN;
    j : SET;
BEGIN
    j := SYSTEM.VAL(SET, i);
    b0 := 0 IN j;
    b1 := 1 IN j;
    IF (b0 & ~b1) OR (~b0 & b1) THEN
        j:=j+{0}
    ELSE
        j:=j-{0};
    END;
    RETURN SYSTEM.VAL(LONGINT, j);
END JustDoIt;


Но в плане оберона у меня конечно руки-крюки. Наверняка как-то элегантней можно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 22:16 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Alexey Veselovsky писал(а):
Вопрос -- имеет ли смысл подобный расширизм для оберона?

Имхо -- не стоит.
Выигрываете чуток памяти на битах, зато теряете очень много тактов процессора на работу с этими битами.
Оно того стоит?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 22:18 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Galkov писал(а):
Код:
    Counter.bit0 ^= Counter.bit1; // и всего делов
И в какие машинные инструкции эти "всего и делов" превращаются?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 22:20 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Galkov писал(а):
ВОПРОС: как это сделать на Обероне :?:
КП:
Код:
i := ORD(BITS(i) / BITS(ASH(i, -1)));
На Обероне через SYSTEM.VAL аналогично (нету BITS).

Либо так:
Код:
i := ASH(0B4H, -2*i) MOD 4;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 22:23 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Galkov писал(а):
Последовательность битов от датчика (00 -> 01 -> 11 -> 10) надо сделать нормальной: (00 -> 01 -> 10 -> 11).

ВОПРОС: как это сделать на Обероне :?:
Не, ну я пробовал конечно же... Просто потом ухи в трубочку сворачиваются. Может не понимаю чего :)

так сойдёт?
Код:
IF Counter > 1 THEN Counter := 5 - Counter END;


Последний раз редактировалось Geniepro Вторник, 07 Декабрь, 2010 22:26, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 22:23 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Geniepro писал(а):
Galkov писал(а):
Код:
    Counter.bit0 ^= Counter.bit1; // и всего делов
И в какие машинные инструкции эти "всего и делов" превращаются?
я бы предположил, что в такие: i = (i & ~1) | ((i & 1) ^ ((i & 2) >> 1)). И как там уж дальше кодогенератор/оптимизатор...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 22:28 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Geniepro писал(а):
так сойдёт?
Код:
IF Counter > 1 THEN Counter := 5 - Counter END;
5 баллов :)
Главное приподняться над уровнем битов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Вторник, 07 Декабрь, 2010 23:43 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Евгений Темиргалеев писал(а):
Geniepro писал(а):
так сойдёт?
Код:
IF Counter > 1 THEN Counter := 5 - Counter END;
5 баллов :)
Главное приподняться над уровнем битов.
Главное приподняться над приматическим уровнем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Среда, 08 Декабрь, 2010 01:06 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Парни, ВЫ чего!!! :)

Counter - это солидное число, а вовсе не обрубок из двух битов. У него есть union-поле i типа INTEGER. На 8-битном контроллере я байты конечно экономлю, но все равно - 24 бита.
Получается надо гораздо сложнее, чем в простых приведенных вариантах.

Функционально правильно сделанно у Алексея, но ведь логические операции-то ленивые!!! Это не просто УЖОС, это УЖОС в квадрате :)
Ну и безусловно правильно сказал Евгений: i = (i & ~1) | ((i & 1) ^ ((i & 2) >> 1)) - именно так они (ЯВУ) собаки и делают...
(btw: на PC это 3 команды: bt [Counter],1; setc al; xor byte[Counter],al - но увидеть тот компилятор, который так сделает - несбыточная мечта)
Но это другая песня. Хотя функциональность нужна именно такая - ни шага в сторону.

Коллеги, я дико извиняюсь конечно же, что специально не заострил внимание на многобитности Counter-а... В моей-то голове - все настолько очевидным казалось :(

Как бы я поясню план наших размышлений (мне именно такой представляется правильным)

1) Не будем говорить о том кто чего поощряет, и что является извращением, а что нет. Такой трюк с битами есть внешняя данность. И те кто это придумывал - вовсе не дураки, не смотря на то, что не посоветовались с Федором Васильевичем. В общем, предложение: холивары - где нибудь в другой теме, про приматологию.
(btw: В электронике одновременное изменение нескольких сигналов называется гонками. А даже не существует теорий синтеза электронных схем без гонок, если одновременно меняются несколько входных сигналов. Если один - то без вопросов. Вот потому "так не математически" и устроена входная последовательность сигналов)

2) Напишем таки функционально правильный код на Обероне. Ей-ей не просто

3) Вспомним, что код в первую очередь пишется для Человека

4) И, обогащенные разными вариантами кодов, поразмышляем над предложением Алексея: имеет ли смысл подобный расширизм для оберона?

Если короче: перед тем как давать шаблонный ответ - давайте подумаем. Слепить шаблонный ответ - много ума не надо. Тем более, что слышали сто раз.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Среда, 08 Декабрь, 2010 02:51 
Модератор
Аватара пользователя

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

В ББ реализовать для таких специфичных низкоуровневых задач свои операции легко - составляется процедура в маш. кодах:

PROCEDURE [code] MyOp (..);
--- здесь маш. код

Фактически, это просто поименованный двоичный кусок кода и соглашение по его вызову. Даже параметры разгребаете в коде сами.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Среда, 08 Декабрь, 2010 06:01 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Geniepro писал(а):
Alexey Veselovsky писал(а):
Вопрос -- имеет ли смысл подобный расширизм для оберона?

Имхо -- не стоит.
Выигрываете чуток памяти на битах, зато теряете очень много тактов процессора на работу с этими битами.
Оно того стоит?

Дело даже не в выигрыше по памяти в каком-то алгоритме реализуемым нами. Дело в другом. Вот есть у вас скажем некий протокол. Скажем те IP или X11 protocol, у него поля данных запакованы с точностью до бита. Довольно сложно и многословно разбирать такой протокол не имея битовых полей, или bitpacked записей. Ну или не имея синтаксиса для бинарей как в ерланге.

Аналогично с взаимодействием с Сишными либами. Частенько структуры данных там имеют битовые поля.

То же самое касается и юнионов в принципе.

В любом случае для подобных расширизмов нужно в синтаксис языка ввести понятие атрибута сущности (записи, функции). Точнее -- списка атрибутов.

Вообще, такое ощущение, что для подобных вещей уже вырастает некоторый новый язык (назовем его Oberon-C), дружественный одновременно и оберону и внешнему миру.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Среда, 08 Декабрь, 2010 06:40 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Galkov писал(а):
Функционально правильно сделанно у Алексея, но ведь логические операции-то ленивые!!! Это не просто УЖОС, это УЖОС в квадрате :)

Я кстати, не понял причины почему нет XOR'а в операциях над множеством ну и для логических выражений. Нет, я понимаю что эту операцию можно выразить через другие, однако машина обычно XOR умеет на прямую, а компилятору нужно быть ну очень умным (и оптимизирующим) чтобы в этой вот белиберде что я нарисовал в условии IF'a распознать XOR и при кодогенерации воткнуть туда именно его. По моему, это уже избыточный минимализм.

Как я понимаю, для этой (да и многих других задач) было бы полезно иметь возможность выбирать подмножество данного множества и в дальнейшем с ним работать. Скажем функция SUBSET куда передается множество, и границы подмножества (например SUBSET({1},1,1) = {0} ).

Тогда, если добавить недостающий XOR, код свелся бы к такому:
Код:
PROCEDURE JustDoIt (i:LONGINT) : LONGINT;
VAR
    j : SET;
BEGIN
    j := SYSTEM.VAL(SET, i);
    j := (SUBSET(j,0,0) XOR SUBSET(j,1,1))*{0} + (j - {0});
    RETURN SYSTEM.VAL(LONGINT, j);
END JustDoIt;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon & bitfields & unions
СообщениеДобавлено: Среда, 08 Декабрь, 2010 07:34 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Немножко в тему: было интервью с Джеймсом Гослингом (вольная стенограмма тут: http://alskor.blogspot.com/2010/12/blog-post.html , там же есть ссылка на видео)

Выдержка:
Цитата:
Вопрос: о каком функционале в Java жалеете?

XOR! (смеется). Кто его вообще использует из присутствующих? (в аудитории - молчание).


Ынтырпрайзу XOR не нужен :-)


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

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


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

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


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

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