OberonCore https://forum.oberoncore.ru/ |
|
Oberon & bitfields & unions https://forum.oberoncore.ru/viewtopic.php?f=30&t=3051 |
Страница 1 из 4 |
Автор: | Alexey Veselovsky [ Вторник, 07 Декабрь, 2010 04:56 ] |
Заголовок сообщения: | Oberon & bitfields & unions |
Как бороться со структурами с битовыми полями, а также с юнионами, когда пишем биндинг к сишной либе? Вот есть нечто вроде такого: Код: 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)? |
Автор: | Александр Ильин [ Вторник, 07 Декабрь, 2010 08:41 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Alexey Veselovsky писал(а): Как бороться со структурами с битовыми полями, а также с юнионами, когда пишем биндинг к сишной либе? Написать конвертирующие процеруды.
|
Автор: | Alexey Veselovsky [ Вторник, 07 Декабрь, 2010 16:47 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Александр Ильин писал(а): Alexey Veselovsky писал(а): Как бороться со структурами с битовыми полями, а также с юнионами, когда пишем биндинг к сишной либе? Написать конвертирующие процеруды.Т.е. полноценный маршалинг с копированием данных? Прозрачно никак? А функции конвертации наверно удобней на Си писать... <удалено модератором> |
Автор: | Евгений Темиргалеев [ Вторник, 07 Декабрь, 2010 18:31 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Отделена тема "Си-unions в КП": viewtopic.php?f=2&t=3052 |
Автор: | Alexey Veselovsky [ Вторник, 07 Декабрь, 2010 19:48 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Вот так с битовыми полями борются во 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; Вопрос -- имеет ли смысл подобный расширизм для оберона? |
Автор: | Galkov [ Вторник, 07 Декабрь, 2010 20:26 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Алексей, я позволю себе задать вопрос абсолютно когерентный Вашему ![]() Если кто помнит "задачку от Галкова", то там был употреблен самопальный термин "нормализация" последовательности. Последовательность битов от датчика (00 -> 01 -> 11 -> 10) надо сделать нормальной: (00 -> 01 -> 10 -> 11). В общем, никаких придумок - просто жизнь. Просто же все: 0-вой бит надо про-XOR-ить с первым: Код: union { struct { bit0 : 1; bit1 : 1; }; int i; } Counter; Counter.bit0 ^= Counter.bit1; // и всего делов ВОПРОС: как это сделать на Обероне ![]() Не, ну я пробовал конечно же... Просто потом ухи в трубочку сворачиваются. Может не понимаю чего ![]() |
Автор: | Info21 [ Вторник, 07 Декабрь, 2010 21:17 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Galkov писал(а): В общем, никаких придумок - просто жизнь. Как это никаких придумок. Кто-то же до этого додумался.Это узкоспециальная жизнь. Возможно даже извращенные формы. С какой стати это должно на Обероне выражаться "просто". Оберон не поощряет извращения -- чтобы не превратить в ад неузкоспециальную жизнь. |
Автор: | Alexey Veselovsky [ Вторник, 07 Декабрь, 2010 21:28 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
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; Но в плане оберона у меня конечно руки-крюки. Наверняка как-то элегантней можно. |
Автор: | Geniepro [ Вторник, 07 Декабрь, 2010 22:16 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Alexey Veselovsky писал(а): Вопрос -- имеет ли смысл подобный расширизм для оберона? Имхо -- не стоит. Выигрываете чуток памяти на битах, зато теряете очень много тактов процессора на работу с этими битами. Оно того стоит? |
Автор: | Geniepro [ Вторник, 07 Декабрь, 2010 22:18 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Galkov писал(а): Код: Counter.bit0 ^= Counter.bit1; // и всего делов |
Автор: | Евгений Темиргалеев [ Вторник, 07 Декабрь, 2010 22:20 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Galkov писал(а): ВОПРОС: как это сделать на Обероне КП: ![]() Код: i := ORD(BITS(i) / BITS(ASH(i, -1))); На Обероне через SYSTEM.VAL аналогично (нету BITS).Либо так: Код: i := ASH(0B4H, -2*i) MOD 4;
|
Автор: | Geniepro [ Вторник, 07 Декабрь, 2010 22:23 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Galkov писал(а): Последовательность битов от датчика (00 -> 01 -> 11 -> 10) надо сделать нормальной: (00 -> 01 -> 10 -> 11). ВОПРОС: как это сделать на Обероне ![]() Не, ну я пробовал конечно же... Просто потом ухи в трубочку сворачиваются. Может не понимаю чего ![]() так сойдёт? Код: IF Counter > 1 THEN Counter := 5 - Counter END;
|
Автор: | Евгений Темиргалеев [ Вторник, 07 Декабрь, 2010 22:23 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Geniepro писал(а): Galkov писал(а): Код: Counter.bit0 ^= Counter.bit1; // и всего делов |
Автор: | Евгений Темиргалеев [ Вторник, 07 Декабрь, 2010 22:28 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Geniepro писал(а): так сойдёт? 5 баллов Код: IF Counter > 1 THEN Counter := 5 - Counter END; ![]() Главное приподняться над уровнем битов. |
Автор: | Info21 [ Вторник, 07 Декабрь, 2010 23:43 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Евгений Темиргалеев писал(а): Geniepro писал(а): так сойдёт? 5 баллов Код: IF Counter > 1 THEN Counter := 5 - Counter END; ![]() Главное приподняться над уровнем битов. |
Автор: | Galkov [ Среда, 08 Декабрь, 2010 01:06 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Парни, ВЫ чего!!! ![]() 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) И, обогащенные разными вариантами кодов, поразмышляем над предложением Алексея: имеет ли смысл подобный расширизм для оберона? Если короче: перед тем как давать шаблонный ответ - давайте подумаем. Слепить шаблонный ответ - много ума не надо. Тем более, что слышали сто раз. |
Автор: | Илья Ермаков [ Среда, 08 Декабрь, 2010 02:51 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Если уж извращаться... В ББ реализовать для таких специфичных низкоуровневых задач свои операции легко - составляется процедура в маш. кодах: PROCEDURE [code] MyOp (..); --- здесь маш. код Фактически, это просто поименованный двоичный кусок кода и соглашение по его вызову. Даже параметры разгребаете в коде сами. Компилятор, встретив в тексте КП обращение к такой процедуре, будет делать инлайн маш. кода. Правда, для этого при компиляции клиентских модулей надо иметь кодовый файл модуля с используемыми операциями (обычно ведь нужен только символьный, т.к. компиляция раздельна). |
Автор: | Alexey Veselovsky [ Среда, 08 Декабрь, 2010 06:01 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Geniepro писал(а): Alexey Veselovsky писал(а): Вопрос -- имеет ли смысл подобный расширизм для оберона? Имхо -- не стоит. Выигрываете чуток памяти на битах, зато теряете очень много тактов процессора на работу с этими битами. Оно того стоит? Дело даже не в выигрыше по памяти в каком-то алгоритме реализуемым нами. Дело в другом. Вот есть у вас скажем некий протокол. Скажем те IP или X11 protocol, у него поля данных запакованы с точностью до бита. Довольно сложно и многословно разбирать такой протокол не имея битовых полей, или bitpacked записей. Ну или не имея синтаксиса для бинарей как в ерланге. Аналогично с взаимодействием с Сишными либами. Частенько структуры данных там имеют битовые поля. То же самое касается и юнионов в принципе. В любом случае для подобных расширизмов нужно в синтаксис языка ввести понятие атрибута сущности (записи, функции). Точнее -- списка атрибутов. Вообще, такое ощущение, что для подобных вещей уже вырастает некоторый новый язык (назовем его Oberon-C), дружественный одновременно и оберону и внешнему миру. |
Автор: | Alexey Veselovsky [ Среда, 08 Декабрь, 2010 06:40 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
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; |
Автор: | Alexey Veselovsky [ Среда, 08 Декабрь, 2010 07:34 ] |
Заголовок сообщения: | Re: Oberon & bitfields & unions |
Немножко в тему: было интервью с Джеймсом Гослингом (вольная стенограмма тут: http://alskor.blogspot.com/2010/12/blog-post.html , там же есть ссылка на видео) Выдержка: Цитата: Вопрос: о каком функционале в Java жалеете? XOR! (смеется). Кто его вообще использует из присутствующих? (в аудитории - молчание). Ынтырпрайзу XOR не нужен ![]() |
Страница 1 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |