Войти
ФлеймФорумЖелезо

Мой виртуальный 16-битный процессор Simpleton (15 стр)

Страницы: 114 15 16 17 18 Следующая »
#210
9:29, 26 фев. 2021

nonamezerox
> GCC и Шланг/ЛЛВМ архитектурно концептуально идентичные.

Хорошо, но почему тогда нет тысяч проектов своих языков под GCC, включая трёх или четырёх человек здесь прямо на форуме у нас, а Clang признан официальной заменой GCC чтобы GCC ушёл навсегда? Собственно именно поэтому Clang и вынужден поддерживать его флаги - OpenSource готовится отказаться от GCC совсем через Clang.


#211
(Правка: 9:38) 9:30, 26 фев. 2021

=A=L=X=

> Хорошо, но почему тогда нет тысяч проектов своих языков под GCC

    Ada (GCC для Ada, или GNAT),
    Си,
    C++ (C++ для GCC, или G++),
    Фортран (GCC для Fortran, или gfortran),
    Java (GCC для Java, или GCJ, исключена из состава GCC начиная с версии 7[8]),
    Objective-C (GCC для Objective-C, или gobjc),
    Objective-C++ (GCC для Objective-C++, или gobjc++),
    Go (GCC для Go, или gccgo) (с версии 4.6[9]).
    D (GCC для D, или GDC[10], начиная с версии 9.1[11])
Также существуют сторонние front-end’ы для Pascal, Modula-2, Modula-3, Mercury, VHDL и PL/I.

Повторюсь, завязывай отмазываться, не знал так не знал.

Почему  - уже объяснял в прошлом посту, исключительно проблемы с пиаром, проблемы с кодогенерацией в конце нулевых и проблемы с лицензией, у гцц она строгий гпл, отрицающий коммерцию с закрытым кодом, у шланга и ллвм апач, с возможностью притырить в проприетарщину и внутреннюю кухню.

Но никаких архитектурных проблем с расширяемостью, о которых ты упоминал, у него нет. И про монолитность  - аналогично.

Хотя, у ЛЛВМ действительно есть одна фича которой нет у бекенда гцц - возможность JIT компиляции в рантайме.

#212
(Правка: 9:40) 9:38, 26 фев. 2021

nonamezerox

Аааа... Я смешал два понятия - Clang и собственно LLVM.
Согласен, что сама концепция разделения через промежуточный слой не была _основной_ целью Clang. Основная она для LLVM.
Основной целью Clang же было то, чтобы это разделение через LLVM сделать лёгким, доступным и даже начинающие программисты, а не всякие комитетчики из Си или паскаля, или зубры компилерописательства типа автора D могли легко и просто этими инструментариями воспользоваться и не только ими, но и вообще через модульную структуру всем подряд.
Поэтому да, я посмешивал, соглашусь.
Тем не менее думаю что категорически прав, что на LLVM намного проще написать свой язык бэкенд с Clang на свою платформу чем на GCC, с чего эта ветка разговора началась.
Собственно языки что ты перечислил - это зубры от мира программирования. А у нас тут посетители форума влёгкую на LLVM делают свои языки в одиночку.

#213
(Правка: 10:00) 9:55, 26 фев. 2021

=A=L=X=
> Тем не менее думаю что категорически прав, что на LLVM намного проще написать
> свой язык бэкенд с Clang на свою платформу чем на GCC, с чего эта ветка
> разговора началась.

Тем не менее IRL а не в домыслах

https://gcc.gnu.org/onlinedocs/gccint/Back-End.html#Back-End

https://llvm.org/docs/WritingAnLLVMBackend.html

Оба процесса схожи,  вот кто бы мог подумать?

Просто первый изобрели до хипстеров, стриженых с челками под горшок и кричания по интернетам в духе приснопамятной картинки:

Изображение

Потому и пиара такого не было.

#214
10:00, 26 фев. 2021

nonamezerox
> Оба процесса схожи, вот кто бы мог подумать?

Схожи-то они схожи,... вот только LLVM, она не только LL, но ещё и самая настоящая VM, т.е. умеет выполнять, при необходимости, "промежуточный код", на лету.

#215
(Правка: 10:10) 10:03, 26 фев. 2021

0iStalker
> Схожи-то они схожи,... вот только LLVM, она не только LL, но ещё и самая
> настоящая VM, т.е. умеет выполнять, при необходимости, "промежуточный код", на
> лету.

Я, внезапно, в #211, это упомянул.

Более того, на нем аж целый рантайм процессора  в эмуляторе PS3 сделан.

Речь про  то что упомянутые =A=L=X= проблемы вроде несуществующей монолитности -

Неподъёмно в рамках такого хобби. Из-за неподъёмности GCC и был затеян такой проект как Clang где целью является разделение, а потому упрощение, компиляции на две фазы:
а) компиляция из языка программирования в промежуточное представление виртуальной машины LLVM - это называется тут фронтенд
б) компиляция из представления LLVM в конкретное машинное представление (бекенд). Причём т.к. строгих ограничений нет в этой фазе можно не в машинные коды компилировать, а, например, в JavaScript.

ЛПП чистой воды.

И "подъемнось" бекендов и у ллвм и у гцц примерно +- одинаковая.

И проблемы у ГЦЦ на смом деле немного более другие (кодогенерация и её качество, лицензия), нежели архитектурные, в связи с чем популярность шланга превозмогла и пиар попер.

#216
(Правка: 10:45) 10:24, 26 фев. 2021

=A=L=X=

> Х/з, но ни разу не видел чтобы GCC в JavaScript компилировал

И да, совсем забыл:

https://github.com/pipcet/gcc/tree/asmjs/gcc/config/asmjs
https://github.com/pipcet/gcc/tree/asmjs/gcc/config/wasm32
https://github.com/pipcet/gcc/tree/asmjs/gcc/config/wasm64

#217
10:53, 26 фев. 2021

nonamezerox

Хорошо, спасибо за информацию. В связи с тем что Clang у меня слился с LLVM я как то иначе себе их вместе представлял как LLVM. А оказывается LLVM появился раньше и был использован.
Забавно, пока гуглил увидел что для GCC есть таргет и собственно в LLVM. :D Хотя почему то по твоей ссылке его нет.

#218
15:33, 27 фев. 2021

Сегодня в ассемблере сформировал концепцию препроцессора, ибо важно и нужно для комфортного программирования.
И уже можно инклюдить файлы, но главное что скоро можно будет городить #ifdef-ы и самое главное что #define-ы.
Это получается однопроходный и одномодульный ассемблер где входом является лишь один файл (без модульности) который сперва обрабатывается препроцессором, потом получившийся слепок препроцессора как массива из массивов лексем натравливается ассемблер и он уже заполняет память виртуальной машины инструкциями и данными. Далее можно сбросить получившийся дамп на диск как бинарный образ. В общем концепция очень похожая на SjAsm/Plus и мне она нравится. В 8-битности простота лучше воровства.

Но это присказка.
Задумался тут насколько всё-таки Simpleton 4 дружелюбен по отношению к таким концепциям ЯВУ (типа Си) как локальные переменные и вообще переменные в стеке.
И вы знаете - я думаю, что дружелюбие тут не полное (как типично для 8-биток), но и совсем не полное говно!

В Simpleton (не только 4) полностью отсутствуют режимы адресации со смещением. Поэтому единственный способ нацелится на переменную в стеке - это сперва в какой то регистр (допустим R3) прописать сумму SP (R5) со смещением и потому уже работать с аргументом или локальной переменной через этот регистр косвенно как [ R3 ].

Например складываем два параметра находящиеся в стеке по положительным смещениям +1 и +2 (помним что в +0 содержится адрес возврата и эта ячейка занята) и помещаем в локальную переменную по смещению соответственно -1:

R0 = SP + 1
R1 = SP + 2
R3 = SP - 1
[ R3 ] = [ R0 ] + [ R1 ]
Т.е. последняя операция уже полностью косвенная  - берет из ячеек памяти куда указывают регистры R0 и R1 сумму и помещает их в ячейку памяти куда указывает регистр R3.
Сколько такая конструкция языка Си суммы двух параметров с занесением в локальную переменную займёт слов?
В данном случае все смещения - слова обычных immediate арифметических операций. И плюс каждая операция тоже занимает слово.
Поэтому:
R0 = SP + 1 ; опкод + immediate = 2
R1 = SP + 2 ; опкод + immediate = 2
R3 = SP - 1 ; опкод + immediate = 2
[ R3 ] = [ R0 ] + [ R1 ] ; тут просто опкод = 1
Т.е. 7 слов или 14 байт.

Но если вспомнить режим инструкций inplace-immediate когда смещения от -8 до +7 зашиваются в само слово инструкции, то получается:

R0 <- SP + 1 ; immediate в опкоде = 1
R1 <- SP + 2 ; immediate в опкоде = 1
R3 <- SP - 1 ; immediate в опкоде = 1
[ R3 ] = [ R0 ] + [ R1 ] ; один опкод = 1
Тут уже 4 слова или 8 байт.

Предположим в таком процессоре как Z80 мы хотим сделать подобное пусть даже просто с байтами, то получится примерно такое:

ld a, (ix+1)
add a, (ix+2)
ld (ix-1), a
А знаете что тут смешно? То, что здесь действие производится над одним байтом (а не словом как в Simpleton, т.к. у Simpleton меньше слова байта нет), но размер всех этих инструкций суммарно при наличии режима индексации... 9 байт!

Т.е. Simpleton при всём своём упоре на крайную простоту умудряется выигрывать даже если мы делим его усилия над словами на два! :D

#219
15:38, 27 фев. 2021

Т.е. в итоге у Simpleton 4 довольно дёшево для его архитектуры получается адресовать 7 параметров в стеке и 7 локальных аргументов.
Всё что за эти смещения выбивается должно получить + 1 слово на собственно смещение.
Забавно.

#220
15:30, 2 мар. 2021

Перевёл (лол, дожил, сперва перевожу на английский, потом обратно себя же на русский!) документацию с гитхаба на русский: https://hype.retroscene.org/blog/1062.html
По большому счёту это то что писалось выше по теме тут подбитое в одну статью и немного переформатированное с переставленными акцентами.

#221
(Правка: 6:27) 5:19, 3 мар. 2021

На https://hype.retroscene.org/blog/1062.html тут же предложили отличнейшую идею.
Я еще про Simpleton 3 писал, что в нём есть запрещённая комбинация аргументов - когда приёмник результата есть [ PC ] (т.е. ячейка памяти куда указывает регистр PC - счётчик инструкций).
Т.е. попытка записать данные прямо в поток инструкций который сейчас выполняется просто не имеет смысла и была запрещена.
В отличие от записи чтение из [ PC ] в Simpleton 3/4 очень важно, т.к. из-за автоматического пост-инкремента PC при косвенном чтении реализует считывание непосредственных 16-битных данных лежащих сразу за опкодом.
В Simpleton 4 я тоже сразу эту комбинацию запретил (хотя в краткой документации уже это просто не упомянул) и мысленно зарезервировал её под какие то гипотетические будущие расширения системы команд процессора если вдруг.
Однако пользователь Lethargeek с hype.retroscene.org заметил, что команда CMP в Simpleton 4 выглядит странновато, что действительно верно, т.к. ей не нужна трёхоперандная сущность вида

R = Y ? X
где ? это операция сравнения обновляющая флаги как Y - X, но всегда возвращающая из АЛУ Y. Тогда Y = Y ? X эквивалентно типовым инструкциям сравнения вида CMP A, B других машин, но выглядит избыточно.

Так его идея заключается в  том, чтобы в качестве сравнения использовать как раз операцию Y - X, но раз у нас трёхоперандная система, то договорится, что какая то комбинация бит для R будет означать игнорирование результата из АЛУ.
И всё.
И такая комбинация, как понятно уже, есть - это [ PC ] в поле "R" опкода.
Как следствие этого разумного использования бит мы:
- устраняем необходимость в отдельном опкоде CMP, вместо него имея:

void = r0 - r1 ; void означает, что результат никуда не записывается
- получаем нахаляву т.н. "тестирующие" инструкции которые обновляют флаги, но не трогают регистры:
; тестирование на битовые паттерны (инструкции типа TEST в других машинах):
void = r0 & $0010 
void = r1 | $1110
Можем, например, в инструкции размером в одно слово RRCI протестировать один бит аргумента провращав его во флаг Carry и отбросив результат:
void <= r0 >> 3 ; третий бит попадает во флаг Carry 
jnc метка1
...
Плюс еще с помощью inplace-immediate стало возможным проводить сравнения с константами в диапазоне от -7..+8 за одно слово-инструкцию, а не за два в случае с реальным 16-битным immediate.
Круто!
Свободных опкодов стало больше, а возможностей при этом не убавилось, а значительно прибавилось! :D

#222
9:50, 3 мар. 2021

=A=L=X=
> Однако пользователь Lethargeek с hype.retroscene.org заметил, что команда CMP в
> Simpleton 4 выглядит странновато, что действительно верно, т.к. ей не нужна
> трёхоперандная сущность вида
>
> R = Y ? X
>
> где ? это операция сравнения обновляющая флаги как Y - X, но всегда
> возвращающая из АЛУ Y.
В зависимости от результата сравнения СМР можно возвращать в R или Y или X.
(т.е.  функционал  команд MAX, MIN знаковых-безнаковых)

#223
9:59, 3 мар. 2021

KPG
> В зависимости от результата сравнения СМР можно возвращать в R или Y или X.
> (т.е. функционал команд MAX, MIN знаковых-безнаковых)
Это слишком много опкодов для не особо часто встречаемой задачи. У Simpleton наоборот опкодов так мало, что лучше оставлять только самые необходимые штуки.
А min/max и так почти везде решается условными переходами.

#224
(Правка: 11:01) 10:17, 3 мар. 2021

=A=L=X=
> Это слишком много опкодов для не особо часто встречаемой задачи. У Simpleton
> наоборот опкодов так мало, что лучше оставлять только самые необходимые штуки.
> А min/max и так почти везде решается условными переходами.
Возврат одного или другого значения при операции сравнения  вроде как типовая операция для IF .. ELSE  CASE ... для дальнейшего использования, может и избыточно для CMP и использования флагов после неё  но вполне просматривается в ассемблерных программах.

Страницы: 114 15 16 17 18 Следующая »
ФлеймФорумЖелезо