Даже без float возможно, если есть полонота по тьюрингу. Интересно, есть ли что то на такую тему, как Hacker's Delight для битовых операций, но для float.
Ситуация вымышленная. Но наверное есть достаточное количество скриптовых языков без поддержки целых чисел и битовых операций. Сразу вспоминается Lua, в котором битовые операции и целые появились относительно недавно.
Для or возможно проще - основная идея упрощающая арифметику - разнести реальные биты на многобитные позиции - тогда обычная арифметика будет без переносов - тогда типо можно организовать типо паралельную логику на обычной арифметике
но для этого опят же нужно переодически нормализовать = т.е забивать нолями возникшие паразитные значения
ваще вот эти вот преседания - были модны на заре cs в 50-60ых можно щя в инете в том же acm communications найти много публикаций на похожие темы
вот как пример - как найти полное число лет между двумя календарными датами
на входе скажем даты в виде строк YYYYMMDD
так вот если мы в big-ендиан - можно просто вычесть эти datum как восмибайтовые целые -
В такой вымышленной ситуации конечно странно, что есть 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, а на основе последних двух можно вообще вывести абсолютно всю булеву логику.
зачем действительно парится с эмуляцией - когда если есть тьюринг полнота и возможность исполнения бинаря = то можно раскуриться до любого уровня языка
Числа представлены в float. Битовый сдвиг отсутствует. Нужна не сам bit flags, а что нибудь альтернативное, что было бы эффективно на такой платформе.
то есть, типа форт только с float числами а не int?
ну можно представить их как мантисса и порядок и расписывать IEEE представление. оно неудобное: разрядная сетка неравномерна в окрестности нуля, но в принципе можно подобрать функции с магическими константами которые будут в IEEE представлении эквивалентны битовым сдвигам.
но проще взять какой-нибудь PL1/XPL и «битовые строки» оттуда. и добавить битовые строки в язык.
и делать операции с битовыми строками.
то есть: работать как со строками, только не строками байт или слов (двойных байт) – а со строками бит.
и делать что-то аналогичное стандартным функциям того же PL1 только с строками бит, а не строками байт. а, они там кажется примерно так и работают.
а в святосишечке 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 (хотя там можно и так, и так).
это скорее конпелятор недосишки, чем ещё какой. вот например был 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 препроцессора в целом достаточно чтобы реализовать некоторый недоассемблер.
чтобы реализовать недосишку или недоассемблер, например на форте, тоже потрудиться придётся совсем немного.
если переписать например 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 подобные виджеты были бы ещё компактнее.
Тот случай, когда один комментарий анонимуса интереснее всей темы.
Не хочешь статью на эту тему написать? «Уникальные возможности TempleOS», заодно расписав, как её поставить from scratch. А то в публикациях про неё в лучшем случае рассказывают, что там можно графику в текстовые файлы включать. Это в лучшем случае, а обычно просто съезжают на нелёгкую судьбу автора. Я готов редактором поработать. :)