LINUX.ORG.RU

Как бы вы реализовали аналог bit flags на архитектуре без поддержки целых чисел, и без поддержки стандартных битовых инструкций?

 


0

2

Числа представлены в float. Битовый сдвиг отсутствует. Нужна не сам bit flags, а что нибудь альтернативное, что было бы эффективно на такой платформе.

Ситуация вымышленная, воспринимайте как головоломку.

★★★★

Последнее исправление: MOPKOBKA (всего исправлений: 4)

если есть байтовая(али какая длина слова на этом чуде) арифметика - то всю булеву можно через умножение и вычетание

как то

a&b в еденичном бите это a*b

a|b в еденичном бите это a+b-a*b

сдвигов если нет то можно умножением и целочисленным на степени двойки

вообще какойто конь из высших сфер

qulinxao3 ★★
()
Ответ на: комментарий от jpegqs

Даже без float возможно, если есть полонота по тьюрингу. Интересно, есть ли что то на такую тему, как Hacker's Delight для битовых операций, но для float.

MOPKOBKA ★★★★
() автор топика
Ответ на: комментарий от anonymous

Ситуация вымышленная. Но наверное есть достаточное количество скриптовых языков без поддержки целых чисел и битовых операций. Сразу вспоминается Lua, в котором битовые операции и целые появились относительно недавно.

MOPKOBKA ★★★★
() автор топика
Ответ на: комментарий от MOPKOBKA

у тяж компухтер если лень алгебру расчехлять сделай брут форс перебор - али какую нейронку :)

по факту у тебя есть таблица входов и нужных выходов вот скажем на младших 2 битах ( для простоты очистим входа посредством %4)

x y x&y 0 0 0 0 1 0 0 2 0 0 3 0 1 0 0 1 1 1 1 2 0 1 3 1 2 0 0 2 1 0 2 2 2 2 3 2 3 0 0 3 1 1 3 2 2 3 3 3

хм самый простой вариант разнести так далеко что бы

(x1B+x0)*(y1B+y0)=x1*y1BB+(x1*y0+y1*x1)B+x0*y0

т.е в этом случае у тя не все биты для флагов используются зато проще логику

например если бит флага реально занимает 3 бита тогда

(x1x0)&&(y1y0)==

z=x*y

x0y0 это z%2

x1y1 это z//64

и да отдельная радость нормализация вот этого всего и оценка когда необходимо нормализовать промежуточные

а вообще если скорость не критична лучше по битово разбирать собирать - и вынести всё в отдельную либу

qulinxao3 ★★
()
Ответ на: комментарий от MOPKOBKA

Для or возможно проще - основная идея упрощающая арифметику - разнести реальные биты на многобитные позиции - тогда обычная арифметика будет без переносов - тогда типо можно организовать типо паралельную логику на обычной арифметике

но для этого опят же нужно переодически нормализовать = т.е забивать нолями возникшие паразитные значения

ваще вот эти вот преседания - были модны на заре cs в 50-60ых можно щя в инете в том же acm communications найти много публикаций на похожие темы

вот как пример - как найти полное число лет между двумя календарными датами

на входе скажем даты в виде строк YYYYMMDD

так вот если мы в big-ендиан - можно просто вычесть эти datum как восмибайтовые целые -

bsd арифметика оттудаже

qulinxao3 ★★
()
Ответ на: комментарий от MOPKOBKA

Но наверное есть достаточное количество скриптовых языков без поддержки целых чисел и битовых операций.

Проще реализацию пропатчить чем вот это пердолево разводить.

hateyoufeel ★★★★★
()

В такой вымышленной ситуации конечно странно, что есть float но нет ints, которые являются основой для вычисления floats-типов. Ну ок, даже если нет битовых операций, то их можно заменить:

(ниже для ints, для конкретно вашей реализации floats обратитесь к стандарту на лично ваш флоат (например IEE 754) чтобы увидеть как надо перераспределить биты.

  • >> N это деление на 2^N
  • << N это умножение на 2^N
  • a & b = (a + b - (a * b)) / 2
  • a | b = (a + b + (a * b)) / 2
  • Инверсия строится в зависимости от размеров ваших флоатов, man IEE 754, чтобы посмотреть какие точно биты вам надо перевернуть

Строите примитивы типа NOT, AND, OR, потом XOR, NAND, а на основе последних двух можно вообще вывести абсолютно всю булеву логику.

PPP328 ★★★★★
()
Последнее исправление: PPP328 (всего исправлений: 1)

перезакрывая тему:

через https://github.com/oriansj/stage0?tab=readme-ov-file

вот классика:

https://www.google.com/search?q=GRIMLEY EVANS, Edmund - bcompile

и очередная копия :

https://github.com/smtlaissezfaire/bcompiler

зачем действительно парится с эмуляцией - когда если есть тьюринг полнота и возможность исполнения бинаря = то можно раскуриться до любого уровня языка

qulinxao3 ★★
()
Последнее исправление: qulinxao3 (всего исправлений: 1)

Числа представлены в float. Битовый сдвиг отсутствует. Нужна не сам bit flags, а что нибудь альтернативное, что было бы эффективно на такой платформе.

то есть, типа форт только с float числами а не int?

ну можно представить их как мантисса и порядок и расписывать IEEE представление. оно неудобное: разрядная сетка неравномерна в окрестности нуля, но в принципе можно подобрать функции с магическими константами которые будут в IEEE представлении эквивалентны битовым сдвигам.

но проще взять какой-нибудь PL1/XPL и «битовые строки» оттуда. и добавить битовые строки в язык.

и делать операции с битовыми строками.

то есть: работать как со строками, только не строками байт или слов (двойных байт) – а со строками бит.

и делать что-то аналогичное стандартным функциям того же PL1 только с строками бит, а не строками байт. а, они там кажется примерно так и работают.

anonymous
()

Числа представлены в float. Битовый сдвиг отсутствует. Нужна не сам bit flags, а что нибудь альтернативное, что было бы эффективно на такой платформе.

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

alysnix ★★★
()
Ответ на: комментарий от qulinxao3

а в святосишечке HolyC Терри из TempleOS тупо придумал свой «интерпретируемый Си» типа pike или pawn, но с конструкцией asm, JIT-компиляцией и нормальной модульностью.

в этом смысле процесс загрузки TempleOS / Zealot OS напоминает tcc и JSLinux из QEMU Фабриса Белларда: всё ядро сразу компилируется и тут же запускается… за исключением того что ELF-формата нету, #include святосишечный – конпелирует и запускает, а livecoding-подобный шелл позволят тут же запускать функции святосишки словно команды tcsh шелла.

в общем, TempleOS в этом смысле напоминает эдакий Tiny Core Linux, Toybox или там JSLinux или ZilchOS (поверх NixOS и tcc)

или какой-то XFDOS типа NanoLinux = поверх Tiny Core linux сборка FLTK + Nano-X/Microwindows + webkit браузер на FLTK, EDE и прочий миниофис типа abiword или gnumeric только поверх FLTK и Microwindows

«TempleOS – это DOS, лучший чем DOS!!» :)) 64-битный ZealotOS и простая линейная память

…но с некоторыми исключениями: конпелятор святосишечки HolyC встроен сразу в ядро; отладчик и монитор сразу тут же доступны; шелл запускает (и при необходимости, конпелирует) команды на святосишке; ах, да.

и есть ещё векторный гипертекстовый фидонет что-то вроде «грамотного программирования» – формат документов DlDoc в котором можно скриптовать макросами терминал или 3D-анимацию, музыку, меши и прочее запускать интерактивно гиперссылкаме.

кстати, вот чего-то типа классического weave/tangle там и не хватает.

а так довольно прикольно: init с PID=1 называется Adam; датчик случайных чисел – это функция god(n) = random(0..n-1); священное писание с которым разговаривает Терри реализовано даже не как случайные марковские цепи – а просто типа cat|head -n $(god(fortunes.nlines))|tail -1

в общем, вполне такой приятный аналог ДОСа со священной сишечкой

сети там изначально не было, но в форках вроде уже и добавили.

например, точно видел IRC-сервер и IRC-клиент и чатбота.

к нему бы LLM chatgpt прикрутить – на святосишке написанного, а не на C++.

вообще, святосишка напоминает местами C, местами С++, местами Pike, Pawn или ещё какой интерпретируемый С/Cint/Ch/BCPL.

о, вот кстати. MUD1.bcpl изначальный запускаемый в эмуляторе TOPS-10.

TRIPOS – целая OS на BCPL (куски шелла были в AmigaDOS).

комплект BCPL современного который с книжкой под RaspberryPi идёт – про то,как там FFI к Cи прикрутить, например, тот же SDL2 и прочую рисовалку.

чуть ли не метапрог эдакий

вообще, на BCPL ещё можно. тоже также: битовые строки как-то реализовать конпелируемыми подфункциями словно встроенными в PL1, а дальше уже проще.

но вообще если там только числа float а не прочие – странный какой-то язык.

обычно наборот, инты делают а float не делают. и возись с decimal fixed point или BCD как хочешь.

десятичная арифметика вместо двоичной например по умолчанию в REXX, COBOL, PL1 (хотя там можно и так, и так).

anonymous
()

Нужна не сам bit flags, а что нибудь альтернативное, что было бы эффективно на такой платформе.

чтобы эффективно – что ? и как ты определяешь эффективность?

anonymous
()
Ответ на: комментарий от qulinxao3

DuskOS «almost C compiler»

это скорее конпелятор недосишки, чем ещё какой. вот например был Aztech C под Z80 кажется или под CP/M который примерно на 5 килобайт был больше чем Turbo Pascal 3.0 под CP/M (тоже весь в память сразу помещался, и никакой подгрузки или там оверлеев не требовал). это скорее K&R C.

а в DuskOS недосишка – это что-то скорее похожее на S-Lang из JOE текстового редактора и прочих Pine.

там эта скриптуха тоже в форт конпелируется.

в Plan9 kencc-шке и Inferno – ассемблер 8a реализован на #define из сишного препроцессора и битовой арифметике.

есть какой-то yacc синтаксический сахарок, но он там не сильно нужен.

то есть, уже возможностей cpp препроцессора в целом достаточно чтобы реализовать некоторый недоассемблер.

чтобы реализовать недосишку или недоассемблер, например на форте, тоже потрудиться придётся совсем немного.

anonymous
()
Ответ на: комментарий от qulinxao3

если переписать например Dear ImGui на лимбо64 под purgatorio/9ferno (Limbo64), то из-за горутин встроенных в язык, наверное, можно изобразить нечто типа реактивного layout manager-а.

допустим, у нас есть двойная буферизация. или тройная.

первый кадр рисуется в immediate mode как в ImGui.

второй кадр содержит коллбеки с горутинами к первому. и может перевычислять что-то типа сетки или таблицы или экстентов типа «бокса и клея» из теха.

третий кадр – отображается на экране.

потом переключаем frame=(frame+1)%3 буферы кадров.

первый рисуется почти декларативно, явно как imm mode как в imGui (а не в отложенном редиме).

второй с коллбеками – делает что-то типа geometry manager из tk.

третий тупо показывается.

хотя там в inferno и tk есть (без tcl. tcl нет, а tk есть).

но наверно imgui подобные виджеты были бы ещё компактнее.

anonymous
()
Ответ на: комментарий от anonymous

Тот случай, когда один комментарий анонимуса интереснее всей темы.

Не хочешь статью на эту тему написать? «Уникальные возможности TempleOS», заодно расписав, как её поставить from scratch. А то в публикациях про неё в лучшем случае рассказывают, что там можно графику в текстовые файлы включать. Это в лучшем случае, а обычно просто съезжают на нелёгкую судьбу автора. Я готов редактором поработать. :)

hobbit ★★★★★
()