Затем, что делать мега программы, которые умеют всё и сразу, но плохо - это хуже, чем делать программы, которые умеют делать что-то одно, но хорошо:)
Вид для печати
А чего с ней не так?
---------- Post added at 22:23 ---------- Previous post was at 22:16 ----------
Под гибридностью SDCC я имел ввиду то, что не каждый сишный компилятор вызывает внешний препроцессор, внешний ассемблер и т.д. Обмен промежуточными данными между звеньями организован через файлы, которые пишутся на диск и потом читаются с него. Это потери скорости. Плюс оптимальная кодогенерация SDCC, не имеющая аналогов. Есть некоторый потенциал увеличить скорость оптимизацией работы алгоритмов эвристики кодогенератора, о чём упомянул Филипп Краузе, но положение в целом изменить можно только пересмотром архитектуры компилятора и убиранием звеньев.
А сравнивать скорость SDCC и других компиляторов для Z80 смысла нет — последние не дают такого качества кода.
ну какой-нибудь (даже глобальный)
char* hello = "Hello, world!"
порождает код в духе
Так обычно секция .bss себя ведет. А в .data сразу должны лежать проинициализированные данные.Код:ld hl, #_hello
ld (hl), 'H'
inc hl
ld (hl), 'e'
inc hl
ld (hl), 'l'
итд
---------- Post added at 02:15 ---------- Previous post was at 01:32 ----------
А еще я в последнее время часто натыкаюсь на вот такие извраты
Почему нельзя сделать ld a, (#_variable) - непонятно. Значение, загруженное в iy нигде больше не используется, так что тут не в оптимизации какой-нибудь дело.Код:; char variable = 0;
; ...
ld iy, #_variable
ld a, (iy + 0)
С HL же подобное вообще сплошь и рядом
любая запись нового значения в переменную порождает такой код, даже если переменная в следующий раз используется только через 50 строк. LD (NN), A не у дел совершенно.Код:ld hl, #_variable
ld (hl), a
А то с ней не так, что когда я пишу глобальную или статическую переменную - то она должна сразу инициализировться в секции _DATA
Вместо этого - генерится огромный код, который инитит эту переменную. Дикость и глупость.
В ассемблере генеритКод:char a=2;
Чо - руки отвалятся написать сразуКод:.area _DATA
_a::
.ds 1
.area _GSINIT
;cls.c:4: char a=2;
ld iy,#_a
ld 0 (iy),#0x02
Экономия - время инициализации и куча памяти. Руки бы пооборвал...Код:.area _DATA
_a::
.db 2
---------- Post added at 06:41 ---------- Previous post was at 06:38 ----------
Не. В секцию .bss помещаются неинициализированные данные. Которые по стандарту С забиваются нулём.
Но то, что вместо констант в секции .data генерится код - согласен - идиотизм...
Но-но, потише, лошадки. Филипп Краузе — такой же энтузиаст, как и мы. Ему не платят за разработку кодогенератора Z80 для SDCC.
Мне стыдно будет показать Филиппу эту ветку, насколько неблагодарно некоторые... гм... оценивают его труд. Обвиняя во всех смертных грехах. А Вы не думали о том, что может он просто ещё не добрался до этого направления работы?
Так что поменьше эмоций. Вам никто ничего не должен хорошо и безплатно делать. Мы здесь все никому ничего не должны. А Вы не принимаете промежуточные черновые варианты поведения кодогенератора за эталон?
я бы не сделал лучше, но тоже мог бы на это накатить, если бы меня это сильно заботило, но факта с "косяком" это не отменяет. а уж наезд или просто сгоряча высказал что думал... каждый сам решит.