|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Solid C - компилятор Си для Спринтера
Author |
Message |
Vasil Ivanov
Doomed
Joined: 11 Dec 2003 14:34 Posts: 413
|
Кусок из фидошной эхи (былые времена):
======================================
в Hi-Tech C для PC есть
- глобальное распределение регистров и
- передача аргументов в регистрах
(этих фич нет в варианте для CPM)
MSX-C/SOLID-C: кроме того, что есть в Hi-Tech имеет:
- нерекурсивные ф-ции
- распределение регистров с помощью PUSH/POP
======================================
Кусок из доки Солид Си:
==============================================
Одной из целей разработки компилятора MSX-C было создание инструментального средства, которое позволяяет писать и саму операционную систему, и программное обеспечение для ЭВМ. Для достижения этой цели в кодогенератор введены различные дополнительные средства.Так, разработаны средства автоматического распределения регистров. Благодаря этим средствам, которые впервые внедрены в компиляторе для микро-ЭВМ, удалось существенно повысить эффективность объектного кода. В результате этих мероприятий стало возможным писать на высоко-уровневом языке, которым является Си, даже системы, работающие в условиях жестких ограничений по памяти и реальному масштабу времени. При этом почти полностью устранена необходимость программирования на Ассемблере.
==============================================
Уверен, что переменные не всегда будут попадать в регистры (только для самых простых случаев), обязательно будут переменные и в ячейках памяти. Регистров мало, а передавать нужно много чего и данный компилятор не настолько умен, чтобы удивить кодеров, пишущих на асме. Ессно с ручной оптимизацией все эти компиляторы все-равно не стоит сравнивать. Поэтому считаю, что для 8-ми биток самым оптимальным вариантом будет инструмент типа "C--", можно одновременно писать к примеру lzw-алгоритмы и boot-загрузчики
_________________Vasil Ivanov vasil-i@yandex.ru
|
10 Nov 2014 09:15 |
|
|
Sayman
Maniac
Joined: 05 Oct 2009 19:44 Posts: 223 Location: 212.164.105.5
|
не то, чтобы некропостинг, но всё таки: тут следует задать встречный вопрос - а ваш Солид умеет в 32 бита? нет, не умеет. и с этим огромным минусом можно просто хоронить данный компилятор. т.е. в рамках CP/M этот компилятор может и был бы хорош, но у нас тут и файлы могут быть больше мегабайта и сектора 32бита. не имея 32х битной логики и арифметики пилить на таком инструменте что-либо просто не возможно. банально тот же fdisk пролетает мимо данного компилятора. большие файлы тоже не прогрузить "нахрапом" (особенно когда по размеру файла нужно вычислять кол-во выделяемой памяти) и т.д. а так, хайтех древний под цпм тоже умеет "распределять" по регистрам, но через директиву register, т.е. вручную.
|
28 Oct 2020 23:07 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Извините, что вмешиваюсь, но мне этот вопрос тоже очень интересен... Я вот тут декомпилировал до исходника некий разрекламированный Best_C, и, честно говоря, был в полном ужасе от того, как он компилирует - всё в основном пихает в стек и работает через стек. Про то, чтобы " юзать регистры проца как часто используемые переменные" - и рядом нет. Поэтому как-то в другую сторону меня качнуло - посмотреть на компилятор PL/M. Он вроде как поумнее компилирует код, по сравнению с тем-же Best_C. Но смысл компилятора С в некоторой переносимости программ, хотя... попадалась мне заметка Демина aka Begoon, где он пишет, что z80 и i8080 в принципе весьма неудобные процы для создания эффективного компилятора С...
_________________ iLavr
|
29 Oct 2020 10:50 |
|
|
Sayman
Maniac
Joined: 05 Oct 2009 19:44 Posts: 223 Location: 212.164.105.5
|
Solid C, конечно умеет передавать аргументы через стек. это очень здорово. согласно мануала, до трёх аргументов. для типа char использует A, E, C. Для типа int - HL, DE, BC. остальные аргументы через стек засылаются. и т.д. далеко не все компиляторы умеют в регистры для z80. некоторые прям фанатеют от SDCC, а он регистры ненавидит. максимум что о н может, это передавать только 1 аргумент через регистр и то, не при помощи стандартной директивы register, а левыми (правыми) __z88dk_callee и подобной хернёй. Хайтех для cp/m с регистрами работать не умеет совсем. однако версия под ms-dos уже этому обучена. какие ещё компиляторы умеют передавать аргументы через регистры и далее с ними работать не через стек, точно даже не смогу подсказать. Оригинальных исходников Solid C не существует. У Василия декомпиляция, как я понял (можно попробовать у него поклянчить). Сам же автор компилятора давно умер (к сожалению) не успев расшарить исходники. кстати, i8080 куда хуже в плане кодогенерации, чем z80, т.к. более куцый. кстати, Лавр, а где твой Спринтер? или его у тебя и не было никогда? 2Василий. возрадуйся, чел. Ты когда то прям желал компилятор C-- под z80. Вот он: https://github.com/alemorf/zx_spectrum_ ... r/cmm_last
|
29 Oct 2020 22:50 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
Лавр у нас фанат Специалиста
|
30 Oct 2020 00:58 |
|
|
Sayman
Maniac
Joined: 05 Oct 2009 19:44 Posts: 223 Location: 212.164.105.5
|
ну ясно. спринтероводов нынче мало. все или сильно заняты или просто нет интереса. вот и ты своего никак запустить не можешь. жаль...
|
30 Oct 2020 01:57 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну компилятору С это как бы немного безразлично должно быть. И цпм на Специалисте есть и процессоры те же... Вот не пойму никак одну простую вещь - если бы я писал компилятор, ничего об них не зная, я бы сделал так: заготовил нужное количество функций в текстовом виде под соответствующие операторы, а потом в процессе компиляции собирал эти функции в исходный файл по тексту исходника, не повторяясь 2 раза. После чего основной движок был бы текстовый шитый код, который вызывет эти функции, передавая им аргументы через регистры или стек. Функции, естественно, должны быть реентабельные. Всё что сформировано в текстовом виде - скомпилировать ассемблером. Я с этой целью полез Форт декомпилировать, но он тоже не так делает...
_________________ iLavr
|
30 Oct 2020 09:45 |
|
|
Sayman
Maniac
Joined: 05 Oct 2009 19:44 Posts: 223 Location: 212.164.105.5
|
когда то давно под i8080 был один компилятор сей, BDS C. запускался он из под цпм. поставлялся в комплекте с исходниками. вроде генерил код под i8080 и на нём же работал. но он не умеет в long и float.
|
01 Nov 2020 03:53 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Когда я потерпел неудачу с Best-C для "Специалиста", то поискал другой образец, как писать компилятор С. И нашел я следующий проект: SMALL CТам есть и такой вариант: Вот только времени заняться этим пока не нашлось...
_________________ iLavr
|
01 Nov 2020 08:29 |
|
|
Sayman
Maniac
Joined: 05 Oct 2009 19:44 Posts: 223 Location: 212.164.105.5
|
SmallC это помойка. на его основе как раз и написаны такие компиляторы, как SDCC и Z88DK. лучше на BDS C посмотри. загляни сюда. если не заглядывал ранее: http://www.z80.eu/c-compiler.html
|
01 Nov 2020 09:08 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
|
01 Nov 2020 10:14 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Видел это ранее... но - спасибо, исходник скачал... На SmallC я обратил внимание, поскольку его успешно переносили на разные платформы. Выходит, подумал я, - код его многим достаточно понятен. Так-то опыта у меня в этом практически нет.
_________________ iLavr
|
01 Nov 2020 10:39 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
Склеил несколько разных тем по Solid C в одну - так проще ориентироваться Я обратил внимание, что сборки Solid C, включающей английские документы, которые мы тут всем посёлком переводили в своё время, так и не случилось - вот я думаю может собрать такую сборку и заодно поддержку DLL туда же воткнуть? Там правда новый CLIB.IRL к которому нет исходников - так вот может Василий покопается в архивах и выдаст нам обновлённые исходники CLIB где есть поддержка DLL?
|
13 Dec 2020 02:33 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
Перепроверил через 16 лет - да, %X не работает нормально с типами char - ему надо 16-битный int т.е. int i = *buffer; printf("0x%02X\n", i); отработает верно P.S. вот так тоже работает: printf("0x%02X\n", (int)*buffer); т.е. суть в том, что в этом компиляторе если в формате стоит %X то аргументом должен быть int (а с char будет работать только %c показывая соответствующую букву)
|
16 Dec 2020 23:46 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22589 Location: Silicon Valley
|
Всё присматриваюсь как автоматизировать процесс сборки - если C-файл положить вместе с EXE-шниками, то можно собирать батничком (это HELLO.BAT, который лежит в EXAMPLES): Далее выяснилось, что cc1 принимает только файлы с раширением .c, cc2 - только с расширением .tmc, а asm - только с расширением .asm - и если расширения не указывать, то оно само их добавит: Для того, чтобы можно было применять этот батничок к разным файлам, можно завести переменную: Потом я попробовал разнести EXE-шники и исходники в разные места - CC1 и CC2 понимают длинные пути (до 80 и 64 символов длиной соответственно - так указано в документацией), AS вроде тоже (на сколько длинно - не проверял), а вот LD ожидает имя длиной не более 12 символов - соответственно он может работать только с файлами из текущего каталога, где также должна лежать либа CLIB.IRL
|
08 Mar 2021 02:02 |
|
|
Who is online |
Users browsing this forum: No registered users and 20 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|