Затем, что делать мега программы, которые умеют всё и сразу, но плохо - это хуже, чем делать программы, которые умеют делать что-то одно, но хорошо:)
Вид для печати
А чего с ней не так?
---------- 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.
Мне стыдно будет показать Филиппу эту ветку, насколько неблагодарно некоторые... гм... оценивают его труд. Обвиняя во всех смертных грехах. А Вы не думали о том, что может он просто ещё не добрался до этого направления работы?
Так что поменьше эмоций. Вам никто ничего не должен хорошо и безплатно делать. Мы здесь все никому ничего не должны. А Вы не принимаете промежуточные черновые варианты поведения кодогенератора за эталон?
я бы не сделал лучше, но тоже мог бы на это накатить, если бы меня это сильно заботило, но факта с "косяком" это не отменяет. а уж наезд или просто сгоряча высказал что думал... каждый сам решит.
Я критикую не Филипа - респект ему и уважуха, сам проект мне нравится. Иначе бы я просто не писал в эту ветку.
Я критикую реализацию простой в общемто вещи - генерации кода инициализации переменных типа static. А эмоции... Ну сам понимаешь. Когда что-то давно хочешь, а этого нет - они возникают:) Както раз я пытался разобраться с кодогенерацией SDCC, чтобы поправить эту фичу, но не разобрался.
Во всех известных мне компиляторах C - в секцию .data помещаются уже инициализированные данные. И нигде код не генерится. Исключение - микроконтроллеры - но там слепок секции .data хранится в ПЗУ и при инициализации полностью копируется на своё место в ОЗУ.
Так что если кого задела моя ругань - извиняюсь.
Но если кто подскажет - где и как в исходниках SDCC генерится инициализация переменных - то скажу спасибо.
с другой стороны, если я представляю себя на месте автора... мне бы не хотелось, чтобы спрашивали одно и то же куча людей. плюс, надо посмотреть всякие трекеры и прочие места, не сообщалось ли там уже такое. данная вещь (про инициализацию) - очевидна, я не поверю, что никто про это раньше не говорил и что автор не в курсе. я уверен, что это есть в планах давным давно. могу ошибаться, но скорее всего - нет.
и мотивацию тоже надо учитывать;) ее недостаточно для написания нормального репорта, а просто мнение выразить - пожалуйста.
Что-то вообще странное с инициализацией у нас
По идее, первые две строки абсолютно равнозначны. ОднакоКод:char* hello1 = "Hello";
char hello2[] = { 'H', 'e', 'l', 'l', 'o', 0 };
void main() { }
А ведь нет! Попробовал для ds390 (от балды), там все хорошо. Надо заводить тикет.Код:.area _DATA
_hello1::
.ds 2
_hello2::
.ds 6
.area _GSINIT
;1.c:1: char* hello1 = "Hello";
ld hl,#__str_0
ld (_hello1),hl
;1.c:2: char hello2[] = { 'H', 'e', 'l', 'l', 'o', 0 };
ld hl,#_hello2
ld (hl),#0x48
inc hl
ld (hl),#0x65
ld hl,#_hello2 + 2
ld (hl),#0x6C
ld hl,#_hello2 + 3
ld (hl),#0x6C
ld hl,#_hello2 + 4
ld (hl),#0x6F
ld hl,#_hello2 + 5
ld (hl),#0x00
.area _CODE
__str_0:
.ascii "Hello"
---------- Post added at 00:24 ---------- Previous post was at 00:03 ----------
Завел
потому что "Hello" - в данном случае - константа. А char* hello1 - переменная-указатаель.
Если ты напишешь
char a[10]="hello", то сгенерится
Код:.area _DATA
_a::
.ds 10
;--------------------------------------------------------
; overlayable items in ram
;--------------------------------------------------------
.area _OVERLAY
;--------------------------------------------------------
; external initialized ram data
;--------------------------------------------------------
;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
.area _HOME
.area _GSINIT
.area _GSFINAL
.area _GSINIT
;cls.c:4: char a[10]="hello";
ld hl,#_a
ld (hl),#0x68
ld a,#0x65
ld (#_a + 1),a
ld a,#0x6C
ld (#_a + 2),a
ld (#_a + 3),a
ld a,#0x6F
ld (#_a + 4),a
ld bc,#_a + 5
ld a,#0x00
ld (bc),a
Я говорю - кодогенерация для инита переменных Z80 - очень сырая. Кто хорошо знает английский - напишите аффтору, еслти нет такой темы.
По-хорошему надо просто генерить
И никакого кодаКод:.area _DATA
_a::
.ascii "hello",0,0,0,0,0
Если написать
const char a[10]="hello", то сгенерится всё верно, только в сегмент _CODE
Я писал, закрыли, потому что дубликат древнего http://sourceforge.net/tracker/?func...99&atid=350599
psb, если Вы делаете с помощью SDCC что-то для души, то понимаете пользу от Ваших идей, донесённую до авторов проекта SDCC, как интеллектуальный вклад, своеобразную инвестицию в свой личный проект. Разумеется, это не касается тех людей, которые только лениво ковыряют SDCC и акцентируются на его недостатках, а не достоинствах.
Надо думать, не каждую озвученную здесь идею удастся реализовать быстро. SDCC — большой коллективный проект. И некоторые идеи очень сложно реализовать на одном уровне без пересмотра всей структуры компилятора архитектором проекта.
Теперь по сути. Я конечно напишу Филиппу об этой неэффективности с инициализацией .DATA. Но конечно было бы хорошо, если бы каждый пользователь SDCC старался обогатить его идеями и донести до Филиппа своё видение проблемы, поскольку я могу это сделать только со своей колокольни. Да и сам ещё не все свои идеи по кодогенерации протащил в SDCC.
---------- Post added at 13:50 ---------- Previous post was at 13:12 ----------
Да, тем более, Филипп подтвердил, что действительно трудится на внутренней мотивации (возможно, дополнительный стимул — ностальгия по ColecoVision). Господа, не будем забывать, что SDCC — это в первую очередь не программа, а люди.
Цитата:
Сообщение от Philipp Klaus Krause
Обсуждалось же на первых страницах этой темы, я первым поднял вопрос инициализации данных. Для сегмента инициализированных, но неконстантных данных, необходим код инициализации, как минимум - в виде LDIR. Потому что если начальные значения этих данных размещаются в ПЗУ, то сами данные должны размещаться в ОЗУ, т.е. по другим адресам.
С другой стороны, эту проблему можно отнести не к компилятору, а к загрузчику исполняемых файлов. То есть компилятор генерирует сегмент инициализированных данных и заполняет его чем надо, а уж как эти значения попадут в ОЗУ - проблема загрузчика. Если это ось - то в исполняемом файле код инициализации не нужен, ось сама загрузит файл и разместит где надо сегменты; а если это ПЗУ - то в ПЗУ должен быть упрощенный загрузчик, который инициализирует сегмент данных.
Всё верно.
(Просто как-то это мимо ушей люди пропускают.)
Изначально, компилятор затачивался под ColecoVision, там четкое разделение на ROM/RAM.
Вот включили приставку, выполняется ROM, он и должен инициализировать RAM и потом уже начать выполнять собственно main().
(Другими словами, нужна более эффективная инициализация сегмента инициализированных данных.
Тикет на это есть.)
Смотря какие критерии. Для Z80 доминирующий критерий один — качество кода. А какой же компилер по-вашему лучший? Только без софистики, давайте объективные данные, с указанием версий, а лучше всего бенчмарки. (Тему "хайтек си рулез" мы уже обсудили в этой ветке раньше.)
Я полагаю, по-настоящему оценить то, что делает Краузе, может только тот человек, который сам имеет серьёзный опыт разработки больших проектов. Прочувствовав на своей шкуре все сложности производства такого проекта, начинаешь поневоле уважать чужой труд.
Если кто-то из "критиков" претендует, буду рад увидеть список реализованных Вами проектов.
я не претендую, но лично мне субъективно больше понравился iar. по качеству кода, ага. доказывать ничего не буду, смотрел их уже давно (а проблемы, как видно, остались те же).
psb, если бы Вы критиковали глючность SDCC, я бы ещё понял. Но Вы утверждаете (причём абсолютно голословно), что у iar лучше код, хотя сравнивали давно, и так далее. Этим самым Вы распускаете на форумах мифы, в которые верят новички. Вы вредитель, psb.
Мало ли во что Вы верите. Давайте тестировать на бенчмарках. Хотя бы на этом: http://colecovision.eu/stuff/testbench.tar.gz. У Филиппа не было под рукой iar, но Вы сами знаете как за рубежом относятся к ворованным продуктам. Поэтому в списке протестированных компиляторов iar не присутствует. Но Вы можете наблюдать прогресс развития кодогенерации SDCC.
Притом я не сомневаюсь, что Вы сумеете накопать частный случай, где iar покажет небольшой выигрыш перед SDCC, однако в остальном SDCC уже не тот, что был. У меня есть проект Дурак, и я уже несколько лет, собирая его разными версиями SDCC, наблюдал всё более качественную кодогенерацию, конечно не всегда она улучшалась линейно, но в целом если взять 2.x.x и теперешнюю 3.2.1, то получится очень впечатляющая разница. Несколько килобайт в Дураке выиграно на одной только кодогенерации. А Вы, видимо, не смотрели кодогенерацию новых версий SDCC, и по привычке переносите свои старые суждения iar vs SDCC в настоящее время, не потрудившись их как следует проверить. Мне бы не было так грустно, если бы я сам когда-то, начиная программировать на Си для Z80, не купился на такие заверения про HITECH-C на данном форуме. А когда сопоставил кодогенерацию — увидел сам. Поэтому распространение мифов такого рода считаю полезным пресекать.
спасибо, капитан очевидность! я так и сказал сразу, что не в курсе особо, дело было давно.
ну раз у вас оружие наготове, вы не могли бы такой тест провести с iar'ом? или вы плохо относитесь к ворованным программам и не знаете где взять iar?
Да, не знаю. Не искал. А какая там нынче последняя его версия?
т.е. вы не знаете, не пробовали, но это я тут мифы распространяю...
та же, что и была, он давно не развивается. хз даже какая, хз даже навскидку где искать. но найти всяко можно, возможно даже где-то на этом форуме. если захотеть. мне в данный момент на все это положить, поэтому от меня помощи не будет.
У меня был такой опыт. Проект - webserver из штатных примеров uIP v1.0.
- HitechC (v3.09 1988 год выпуска, freeware) - 18кб и код работает.
- SDCC 3.х.x (3 месячной давности) - код 26кб (это в лучшем случае, когда я прошел по всем граблям разных вариантов инициализации констант, по началу было более 30к) и код не работает (разваливается где-то посередине выполнения), хотя и компилируется без ошибок.
В отсутсвие нормального отладчика, дебажить выход SDCC чтобы понять отчего его код не работает, как-то не было желания.
Так что поосторожнее с распространением мифов. :)
наоборот sdcc частный случай где уделывает
cvu_vinb.c - 9
galois_lfsr.c - 19
get_tile.c-104
huffman_iterative.c - 136
huffman_recursive.c - 154
init_loop.c - 43
insertion_sort.c - 126
memcpy_compression.c - 67
memtovmemcpy.c - 60
play_music.c - 417
sdcc_mullong.c - 203
set_screen_mode.c - 50
set_sprite_x.c - 79
z88dk-mktime.c - 278
TOTAL - 1745 у SDCC 2703
можешь фразу: SDCC лучший в мире кодогенератор С для Z80 засунуть в свой зад, лучший открытый - да.
Я как раз предлагаю распространять не мифы, а объективную информацию. Хотя опыт показывает, что если кому-то в данный момент положить на всё, кроме самоутверждения, то это его состояние по жизни. И надежд на улучшение мало. Про прочих с задами я промолчу. Error404, SDCC мог сдублировать проинициализированные массивы, да мало ли. Наконец, где ключики компиляции? Вобщем, будет или детский сад, или нет.