User Tag List

Страница 6 из 7 ПерваяПервая ... 234567 ПоследняяПоследняя
Показано с 51 по 60 из 74

Тема: Осваиваем Hi-Tech C v3.09 для CP/M

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    21.05.2006
    Адрес
    Canada
    Сообщений
    78
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    и действительно, мужики-то и не знают:
    http://zx-pk.ru/threads/18587-xonix-...l=1#post483953
    http://zx-pk.ru/threads/20220-projec...l=1#post790095
    и твой же пост: http://zx-pk.ru/threads/6844-ishchu-...l=1#post702277
    сейчас сам проверил на последней версии sdcc. xnx собрался, с матами и перематами, долго. Запускается, вроде даже надписи все на своих местах...
    И вообще, как то люто ненавидит этот новый sdcc массивы без явного указания размера. Бред.
    Я нашел xnx-evo в последнем выпуске evo sdk.

    У меня тоже не было проблем с компиляцией.
    https://drive.google.com/file/d/0B6X...ew?usp=sharing

    В evo.h я прокомментировал некоторые прототипы:

    Скрытый текст


    I found xnx-evo in the latest evo sdk.

    I didn't have any problems compiling it either.
    https://drive.google.com/file/d/0B6X...ew?usp=sharing

    In evo.h I commented out some prototypes:
    [свернуть]


    Код:
    //заполнение памяти заданным значением
    
    //void memset(void* m,u8 b,u16 len) _naked;
    
    //копирование памяти, области не должны пересекаться
    
    //void memcpy(void* d,void* s,u16 len) _naked;
    
    //генерация 16-битного псевдослучайного числа
    
    //u16 rand16(void) _naked;
    
    //установка цвета бордюра, 0..15
    Это имеет смысл в версии 2.9, но приведет к ухудшению кода в новых версиях sdcc. Причина: sdcc теперь попытается встроить несколько строковых функций, включая memset () и memcpy (). Если вы посмотрите на сгенерированный ASM с новой компиляцией, вы увидите, что эти вызовы функций реализованы с помощью ldir, встроенного в код. Определение ваших собственных функций для замены этого ухудшит ситуацию.

    Я сделал то же самое для rand (). Я подозреваю, что это лучше реализовано в библиотеке компилятора, но я не проверял, чтобы реализация evo-sdk точно знала. Sdcc теперь использует генератор xars Marsaglia, который работает очень быстро, даже несмотря на то, что он реализован в C. В основном я это сделал, потому что z88dk реализует эту функцию в ASM.

    В main.c я изменил некоторые заголовки:

    Скрытый текст


    This made sense in 2.9 but will result in worse code in newer versions of sdcc. The reason is sdcc will now try to inline several string functions including memset() and memcpy(). If you look at the generated ASM with a new compile you'll see these function calls implemented with ldir inlined in the code. Defining your own functions to replace this will make things worse.

    I did the same for rand(). I suspect this is better implemented in the compiler's library but I did not check evo-sdk's implementation to know for sure. sdcc now uses a Marsaglia xor generator which is very fast even though it's implemented in C. Mainly I did it because z88dk implements this function in ASM..

    In main.c I changed some of the header includes:
    [свернуть]


    Код:
    //#include <evo.h>
    #include <string.h>
    #include "evo.h"
    Угловые скобки предназначены для заголовков, найденных в системном каталоге. Это не то, где evo.h находится в моих компиляциях, поэтому я изменил это на кавычки. Я также добавил string.h для получения библиотек memset () и memcpy ().

    Я не могу скомпилировать бинарный файл, потому что мне придется исправлять остальную часть SDK, чтобы она была совместима с более новой версией sdcc. Но я могу перевести на asm и посмотреть, появляются ли какие-либо ошибки.

    Скрытый текст


    Angle brackets are for headers found in the system directory. That's not where evo.h is in my compiles so I changed that to quotes. I also added string.h to get the library memset() and memcpy() .

    I can't compile to a binary because I'd have to fix up the rest of the SDK to be compatible with a newer version of sdcc. But I can translate to asm and see if any errors pop up.
    [свернуть]


    sdcc -mz80 -S main.c -D_naked= (~1-2 minutes)
    sdcc -mz80 -S --max-allocs-per-node200000 main.c -D_naked= (~14 minutes)

    Вы можете выбрать, хотите ли вы быстро компилировать или оптимизировать. В этой программе не так уж много различий, потому что большинство переменных являются статическими. «-Dnaked =» заключается в том, чтобы устранить атрибуты «_naked» во всех функциях C в main.c. Вещи больше не делаются так в new sdcc.

    Вы можете увидеть выходные файлы .asm в .zip выше. Беглый осмотр я не обнаружил.

    Скрытый текст


    You can choose if you want a fast compile or a highly optimized one. In this program there isn't too much difference because most variables are statics. The "-Dnaked=" is to eliminate the "_naked" attributes on all the C functions in main.c. Things are no longer done this way in new sdcc.

    You can see the output .asm files in the .zip above. I did not spot any problems with a cursory examination.
    [свернуть]


    Постоянные какие то "переполнения" у него. Да. Это прекрасный компилятор, очень и очень.
    Это потому, что программист допустил ошибку или просто проигнорировал это. Компилятор правильный. Все эти жалобы касаются кода, подобного этому:

    Скрытый текст


    This is because the programmer has made a mistake or he's simply ignoring this. The compiler is correct. All those complaints are about code similar to this:
    [свернуть]


    Код:
    const u8 levelData1[]={
    IMG_PIC1,PAL_PIC1,MUS_LOOP1,85,
     9,10,-16,16,
    28,10, 16,16,
    255
    };
    Обратите внимание, что это массив символов UNSIGNED. Но программист ставит отрицательные числа там. Эти отрицательные числа представляют собой 16-разрядные целые числа. Например, -16 представляется как 0xffea. Затем компилятор пытается поместить 0xffea в 8-разрядный беззнаковый символ. Он делает все возможное, используя только младший байт и выдавая предупреждение, чтобы сообщить вам, что оно это сделало.

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

    Немного позже в компиляции вы увидите еще одно предупреждение о потере указателя CONST. Это связано с тем, что программист неявно преобразовал указатель CONST в обычный указатель. Опять же, это предупреждение правильное, и оно испускается, потому что это еще один распространенный тип ошибки. Но в этом случае нет ошибки.

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


    Я сделал ту же компиляцию с zsdcc, но на этот раз zsdcc будет использовать «-reserve-regs-iy», что подразумевается «-clib = sdcc_iy». В результирующем коде есть два места, где z88dk исправляет ошибки в sdcc. В z88dk предпочтительнее использовать «-reserve-regs-iy», потому что это приводит к значительно меньшему коду в целом, когда применяется агрессивный набор гласных z88dk.

    Скрытый текст


    Notice that this is an UNSIGNED char array. Yet the programmer is putting negative numbers in there. These negative numbers are 16-bit integers. For example, -16 is represented as 0xffea . The compiler then tries to fit 0xffea into an 8-bit unsigned char. It does its best by using only the least significant byte and emitting an warning to let you know it has done so.

    So all those warnings are the fault of the programmer. sdcc is right to warn about it -- these types of errors can often turn out to be bugs. In this case these aren't bugs.

    A little later in the compile you will see another warning about a pointer losing CONST. This is because the programmer has implicitly casted from a CONST pointer to a regular pointer. Again, this warning is correct and it is emitted because this is another common type of bug. But in this case there is no bug.

    Beginners may find the warnings disconcerting or annoying but for the experienced they can be invaluable for tracking down difficult to find bugs. The fact that other compilers may not report these things as warnings is a weakness of those other compilers.


    I did the same compile with zsdcc but this time zsdcc will use "--reserve-regs-iy" which is implied by "-clib=sdcc_iy". In the resulting code there are two places where z88dk fixes up bugs in sdcc. In z88dk it's preferable to use "--reserve-regs-iy" because it leads to much smaller code in general when z88dk's aggressive peephole set is applied.
    [свернуть]


    zcc +z80 -vn -a -SO3 -clib=sdcc_iy main.c -D_naked= --c-code-in-asm (~1-2 minutes)
    zcc +z80 -vn -a -SO3 -clib=sdcc_iy --max-allocs-per-node200000 main.c -D_naked= --c-code-in-asm (~16 minutes)

    (Целевой компьютер «+ z80» не имеет большого значения для перевода в .asm. Это повлияет только на то, какие заголовки доступны из библиотеки).
    (The target machine "+z80" does not matter much for a translation to .asm. It will only affect what headers are available from the library).

    ...
    чё-то анреал какой-то. воткнул ключ --max-allocs-per-node200000 и пипец, он завис чтоли, этот sdcc? уже минут 10 чёто мухрюет там... ощущение. что я сижу на древней 286, а не на 8ми ядернике. это типо прикольно, таким компилятором пользоваться))))
    Да, это медленно. Команда sdcc не рассматривала лучшие структуры данных в своей первой попытке с этим новым генератором кода. Имейте в виду, что то, что делает sdcc за кулисами, гораздо сложнее, чем, скажем, HTC.

    Просто уменьшите число «max-allocs-per-node» или вообще исключите этот параметр (по умолчанию используется «max-allocs-per-node3000»). В этой программе это не имеет большого значения.

    Я использую 200000 для релизов и когда я ищу способы улучшить вывод кода. Для меня вполне приемлема длинная сборка для выпуска. Для развития вы можете пойти ниже. Я не думаю, вместо этого я правильно разбиваю проект на множество исходных файлов и использую make-файл, так что только файлы, которые я изменяю, перекомпилируются. Таким образом, количество кода, который компилятор должен пережевывать, меньше и вывод генерируется быстрее.

    Кстати, Philip at sdcc использует 1000000, когда он запускает тесты. Я не могу использовать этот номер на этом ноутбуке, так как для больших программ он будет исчерпан. Я также считаю, что разница не слишком велика между 200000 и 1000000. Из-за этого мы принимаем 200000 в качестве магического числа и фокусируем усилия на улучшении вывода кода для этого уровня. Я думаю, что Fuzix принял наш номер 200000 тоже, но в прежние времена это было 500000, я верю.

    Скрытый текст


    Yes it is slow. The sdcc team did not consider better data structures in their first attempt with this new code generator. Keep in mind that what sdcc is doing behind the scenes is much more sophisticated than what, say, HTC is doing.

    Just reduce the "max-allocs-per-node" number or eliminate the option altogether ("max-allocs-per-node3000" is the default). In this program it doesn't make a huge difference.

    I use 200000 for release builds and when I am looking for ways to improve the code output. A long build for a release is perfectly acceptable to me. For development you may want to go lower. I don't though, instead I properly partition a project into many source files and use a makefile so that only files I change are recompiled. This way the amount of code the compiler has to chew on is smaller and output is generated more quickly.

    By the way Philip at sdcc uses 1000000 when he runs benchmarks. I can't use that number on this laptop as it will run out of memory for large programs. I also find the difference is not too much between 200000 and 1000000. Because of this we adopt 200000 as the magic number and focus efforts to improve code output for this level. I think Fuzix has adopted our 200000 number too but in earlier days it was 500000 I believe.
    [свернуть]
    Последний раз редактировалось Alcoholics Anonymous; 29.03.2017 в 23:24.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Сижу, такой, дома, из-за этой псевдопандемии. перечитываю старые темы. наткнулся на эту. Хотелось бы прокомментировать пару моментов:

    Цитата Сообщение от Alcoholics Anonymous Посмотреть сообщение
    В evo.h я прокомментировал некоторые прототипы:
    комментировать прототипы в SDK, в котором не используются стандартные библиотеки и заголовочные файлы, очень спорное действие. Все прототипы вами отключенные были полностью переписаны автором этого sdk. Например, memset(), в отличии от оригинального из библиотеки sdcc и других компиляторов делает вызов _FAST_LDIR, который в свою очередь:
    Код:
    ;более быстрая версия ldir, эффективна при bc>12
    ;из статьи на MSX Assembly Page
    ;в отличие от нормального ldir портит A и флаги
    
    _fast_ldir
    	xor a
    	sub c
    	and 63
    	add a,a
    	ld (.jump),a
    .jump=$+1
    	jr nz,.loop
    .loop
    	dup 64
    	ldi
    	edup
    	jp pe,.loop
    	ret
    Т.е. вы пишите, что "эти вызовы функций реализованы с помощью ldir, встроенного в код. Определение ваших собственных функций для замены этого ухудшит ситуацию." не вникнув в суть кода, а суть в том, что обычный ldir это 21 такт на байт, а реализация memset в sdk при BC>12 даёт около 19 тактов и менее (если не ошибаюсь, вплоть до 17 или 18 тактов на байт). таким образом memset из sdk наоборот - повышает производительность. весь sdk написан без использования (стоковых библиотек, за исключением некоторых функций, который обязательны при кодогенерации.

    Обратите внимание, что это массив символов UNSIGNED.
    во1х, это массив без объявления размера. во2х, 8ми битный (не 16). число отрицательное, 8ми битное, в HEX это будет 0xf0. в одном из своих постов я приводил в пример высказывание автора игры Robo: " нужно было явно задать размеры массивов mus_cnt и musnames.". Т.е. проблема - если массив без размера, то ошибка компиляции. При этом всё тот же Hi Tech съедает эти массивы и даже не давится и код работает. Размер массива можно подсчитать в момент компиляции исходя из его наполнения. Почему-то sdcc после версии 2.9.0 резко разучился это делать. кроме этого, сам же автор игры пишет: "бинарный код под этой версией SDCC получился слишком большой. Игра компилируется, но не работает.". Я тоже пробовал собирать на разных версиях sdcc, но какие-то проблемы постоянно всплывают. при последней попытке я даже не дождался конца компиляции и это на amd ryzen 5 1600x разогнанном. у меня тут эмулятор zxmak2 в visual studio собирается за 3 секунды, какая-то спектрум игра за пол часа не собралась.

    далее тоже интересно (про кодогенерацию sdcc): https://www.msx.org/forum/msx-talk/d...ns-sdcc?page=5
    look at vrampoke & vrampeek functions. SDCC generate some kind of lengtly code:
    this segment
    ld c, 1 (iy)
    ld b, #0x00
    ld a, c
    and a, #0x3f
    or a, #0x40
    out (_port99), a
    is simply extremely stupid.
    ld c, then ld b, 00 then ld a, c (so first ld c could be ld a, .....
    там есть и другие весьма детские болячки, которые просто годами не правятся.

    хотя конечно, иногда пользуюсь этим компилятором (sdcc), но без фанатизма.
    Последний раз редактировалось Sayman; 25.04.2020 в 09:48.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  4. #3

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,733
    Спасибо Благодарностей отдано 
    2,735
    Спасибо Благодарностей получено 
    173
    Поблагодарили
    133 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Угу. В SDCC и ещё куча других недостатков, и о них можно писать целые толмуты. Однако же перед тем, как юзать 200000, поюзай меньшее число. Надо же знать логику этого, чтобы пользоваться грамотно. А массивы без указания размера моветон. Кстати, а хайтек как, хавает?

    - - - Добавлено - - -

    Я чего-то думаю, что SDCC сделает код получше хайтековского без всяких там --max-allocs-per-node

    Филипп честно предупредил меня, что SDCC оптимизирован для использования на Win7 и выше. В XP, которой я до сих пор пользуюсь (старенький ноут на одноядерном проце + один из первых двухъядерных атлонов) компиляция в разы медленее. Тем не менее, жить можно.

    Не буду развивать тему, что кто хочет найти недостатки - тот найдёт их всегда. Восприятие у чела такое, везде какашки видит, кроме своего любимого туалета.

  5. #4

    Регистрация
    16.12.2008
    Адрес
    Kharkov, Ukraina
    Сообщений
    2,221
    Спасибо Благодарностей отдано 
    4
    Спасибо Благодарностей получено 
    21
    Поблагодарили
    18 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Компилятор Hi-Tech C v3.09 достаточно "простой" (пусть будет в кавычках). В этом я думаю его сила. Он не ищет в коде Си того, чего там нет. С другой стороны эта "простата" иногда вылазит боком в неэффективный код. Но, зная особенности компилятора и Z80, эти несуразицы можно свисти к минимуму. Чем, похоже, и пользовались авторы этого компилятора.

    После недели втыкания в дизассемблер HTC 3.09 я уже мог на лету в голове получать си код. Вот загрузка n-го количества параметров в функцию, вот if then переход, а вот оператор case.

    Если мне не изменяет память, HTC 3.09 создавался с выключенной оптимизацией. При включённой оптимизации мне не удавалась после рекомпиляции получить 98% оригинального кода.

    Хотя не все там так просто. Похоже, использовались безусловные переходы, что не приветствуется. Натыкался на код, который я не смог раскусить (ассемблерная вставка?)

    Все выше сказанное не принимайте за истину. Мне просто было интересно проделать кусочек этой работы и приоткрыть завесу тайны самого эффективного компилятора Си на платформе СР/М Z80
    Последний раз редактировалось OrionExt; 29.03.2017 в 22:27.
    Электроника КР-02, MSX YIS-503IIR, Орион-128, Ленинград-2, Pentagon-128k, MSX2 YIS-503IIIR, MSX-EXT, ...

  6. #5

    Регистрация
    21.05.2006
    Адрес
    Canada
    Сообщений
    78
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от OrionExt Посмотреть сообщение
    Компилятор Hi-Tech C v3.09 достаточно "простой" (пусть будет в кавычках). В этом я думаю его сила. Он не ищет в коде Си того, чего там нет. С другой стороны эта "простата" иногда вылазит боком в неэффективный код. Но, зная особенности компилятора и Z80, эти несуразицы можно свисти к минимуму. Чем, похоже, и пользовались авторы этого компилятора.
    Результаты, которые получает HTC, очень впечатляют и вдвойне, если учесть, что он работает на 64-килобайтной машине. Как уже упоминалось в предыдущем посте, было бы целесообразным проект разобрать и понять этот компилятор с целью сделать его способным ориентироваться на машины z80 в целом. Отделите его от CP / M и подключите его к более общим и современным библиотекам, и там есть большой потенциал. Я думаю, любой, у кого есть реальная машина z80, с удовольствием сможет запустить такой компилятор на самой машине.

    На самом деле, вы, вероятно, можете получить 80% пути к идеальной компиляции, не прибегая к мегабайтам интеллекта. Это последние 20%, которые нуждаются в большом анализе и обработке. Sdcc имеет большую часть этого процесса, но он еще далек от совершенства, поэтому вы будете иногда видеть, как он избивается в сравнении с «более простыми» компиляторами.

    Скрытый текст


    The results that HTC gets is very impressive and doubly so when considering it runs on a 64k machine. As was mentioned in a previous post, it would be a worthwhile project to disassemble and understand this compiler with the aim of making it able to target z80 machines generally. Detach it from CP/M and connect it to more general and modern libraries and there is a great a deal of potential there. I think anyone with a real z80 machine would love to be able to run such a compiler on the machine itself.

    In reality, you can probably get 80% of the way to an ideal compile without resorting to megabytes of intelligence. It's the last 20% that needs a lot of analysis and processing. sdcc has the most of this going on but it is far from perfect yet so you'll occasionally see it getting beat in comparisons with "simpler" compilers.
    [свернуть]


    Если мне не изменяет память, HTC 3.09 создавался с выключенной оптимизацией. При включённой оптимизации мне не удавалась после рекомпиляции получить 98% оригинального кода.
    Я бы сделал то же самое, если бы работал в Hitech Существует больше шансов, что ошибки появятся с включенной оптимизацией, поэтому безопасным делом было бы скомпилировать компилятор с выключенной оптимизацией, если это так и было сделано.

    Скрытый текст


    I would have done the same if I worked at Hitech There is a greater chance for bugs to appear with the optimization enabled so the safe thing to do would be to compile the compiler with optimization off, if that's how they did it.
    [свернуть]

  7. #6

    Регистрация
    16.12.2008
    Адрес
    Kharkov, Ukraina
    Сообщений
    2,221
    Спасибо Благодарностей отдано 
    4
    Спасибо Благодарностей получено 
    21
    Поблагодарили
    18 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Alcoholics Anonymous Посмотреть сообщение
    На самом деле, вы, вероятно, можете получить 80% пути к идеальной компиляции, не прибегая к мегабайтам интеллекта. Это последние 20%, которые нуждаются в большом анализе и обработке. Sdcc имеет большую часть этого процесса, но он еще далек от совершенства, поэтому вы будете иногда видеть, как он избивается в сравнении с «более простыми» компиляторами.
    Поддерживаю на сто процентов.

    Эта фраза подтолкнула меня продолжить любительские суждения о кодогенерации вокруг Z80.

    Если пойти дальше и начать рассматривать такие продукты как НТС v7.80 pl2 и SDCC. Первое что я бы их "в лоб" не сравнивал. НТС v7.80 pl2 и SDCC преследовал / преследует разную конечную цель. Это главная мысль.

    От этого и с заядлым постоянством вспыхивающий тут холивар. Чем тоже грешил. Потому что не правильно позиционировал компилятор для себя. Конечно проще написать ???? и сказать "фу какая хрень".

    Вернемся к кодогенерации. Оба компилятора успешно подошли к планке 90% эффективности генерирования кода.

    НТС v7.80 pl2 коммерческий продукт с конечным финансированием и в дальнейшем товар, от которого получали прибыль. Остановился в своем развитии. И достаточно стабильным и прогнозируемым генерируемым кодом на выходе. Сужу на основе разбираемого мною дизассемблера НТС 3.09 с отключенной оптимизацией (о оптимизации чуть позже). Это мой выбор.

    SDCC исследовательский (научный) продукт с открытым кодом. Который преследует цель превысить 90% планку эффективности генерирования кода. И как показала не прекращаемая многолетняя работа над ним, постоянное шатание (отсюда не совместимость в версиях) и как тут было написано "прибегая к мегабайтам интеллекта" - пока с переменным успехом. А так современный компилятор вполне работоспособен при правильном подходе к нему. Что бы я отметил. Не подходит для новичков и у профессионалов с ним периодический происходят трудности в использовании.

    По поводу эффективных и не эффективных библиотек и ловли блох у каждого из компиляторов. Ставить одну библиотеку над другой и определенные ходы в кодогенерации, думаю, не стоит. Все они преследуют определенные цели в узких рамках Z80.

    Ага, оптимизатор. Новичкам я бы посоветовал его отключить. У меня на начальном освоении компилятора с ним возникли большие трудности, я долго не мог понять, что происходить и отчего так выборочно "плющит" генерируемый код. Оптимизатор может исказить сгенерированный код после кодогенератора до неузнаваемости.

    Ну и не все с этими оптимизаторами так просто
    Цитата Сообщение от Alcoholics Anonymous Посмотреть сообщение
    Я бы сделал то же самое, если бы работал в Hitech Существует больше шансов, что ошибки появятся с включенной оптимизацией, поэтому безопасным делом было бы скомпилировать компилятор с выключенной оптимизацией, если это так и было сделано.
    Я почти уверен, что НТС 3.09 ушел в релиз с выключенной оптимизацией. Надо только вспомнить, найти папку с проделанной работай и проверить. У кого "заряжены" инструменты может сделать это и сам.

    Ух, выговорился
    Последний раз редактировалось OrionExt; 30.03.2017 в 16:03.
    Электроника КР-02, MSX YIS-503IIR, Орион-128, Ленинград-2, Pentagon-128k, MSX2 YIS-503IIIR, MSX-EXT, ...

    Этот пользователь поблагодарил OrionExt за это полезное сообщение:

    Oleg N. Cher(25.04.2020)

  8. #7

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,733
    Спасибо Благодарностей отдано 
    2,735
    Спасибо Благодарностей получено 
    173
    Поблагодарили
    133 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Да, примерно так же я декомпилировал игру, скомпилированную из Бейсика. Начинаешь улавливать, чего да как, появляется чутьё, где какая Бейсик-команда была. :-)

    Если кому-то удастся реконструировать компилятор - конечно будет интересно.

  9. #8

    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    да ковырять тут надо не столько сам компилятор, сколько его оптимизатор, файл optim.com. Вот его бы подправить и было бы хорошо, ещё лучше, наваять его под венду.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  10. #9

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,733
    Спасибо Благодарностей отдано 
    2,735
    Спасибо Благодарностей получено 
    173
    Поблагодарили
    133 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я не совсем согласен, что SDCC не подходит для новичков. Чем больше сообщество - тем лучше продукт, как правило. Даже новички могут получить от его использования свою пользу при подходе первого рода. И даже новички могут улучшить компилятор, дав, например, баг-репорт при подходе второго рода.

    - - - Добавлено - - -

    Было бы интересно увидеть новичка, ковыряющегося с эмулятором CP/M или DosBox и Hi-Tech C. :-)

    По сути же наверно один z88dk даёт хотя бы генерацию в tap. А для SDCC же надо освоить хотя бы hex2bin.

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

  11. #10

    Регистрация
    21.05.2006
    Адрес
    Canada
    Сообщений
    78
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от OrionExt Посмотреть сообщение
    Вернемся к кодогенерации. Оба компилятора успешно подошли к планке 90% эффективности генерирования кода.
    Я думаю, что это слишком великодушно Мой ручной код asm намного лучше, в 3 раза меньше и быстрее в сложных функциях. Частично причина заключается в том, что все эти компиляторы начинаются с препятствия - они уже решили, что локальные переменные будут в стеке, и они будут проиндексированы с индексным регистром. В очень небольших функциях, как sdcc, так и HTC могут покончить с этим. Это совершенно противоположное тому, что происходит, когда я пишу сборку от руки. Я начинаю с того, что не хочу использовать индексные регистры, если мне это не нужно. Это одно решение вносит большой вклад в разрыв между компиляторами и людьми при написании кода z80.

    Учитывая ограничение стекового фрейма, производительность компилятора обычно не ужасна. Иногда я приятно удивлён кодом sdcc, который появляется в небольших плотных циклах с 8-битными величинами. Иногда я вижу нечто, что производит обратное впечатление: P Эти вещи я стараюсь исправить в пост-обработке. HTC более шаблонный и предсказуемый в своем поколении кода. Это редко будет действительно плохой код, но вы редко будете так что-то действительно умный. Когда я вижу вывод sdcc, ясно, что генератор кода z80 не рассматривает множество опций и не требует правильного использования индексных регистров (поэтому z88dk может получить намного лучший код из sdcc с помощью -reserve-regs- Iy "). Имейте в виду, что современный компилятор разделен между интерфейсом, в котором происходит весь анализ, и фоновым объектом, где лежит генератор кода. Это генератор кода, который, как я считаю, все еще имеет возможности для улучшения.

    Скрытый текст


    I think that is being much too generous My hand written asm code is much better, in the range of 3x smaller and faster in complex functions. Part of the reason is all these compilers begin with an impediment - they have already decided local variables will be on the stack and they will be indexed with an index register. In very small functions, both sdcc and HTC may do away with this. This is quite the opposite to what happens when I write assembly by hand. I begin by saying I don't want to use the index registers unless I really have to. That one decision contributes a great deal toward the gap between the compilers and humans when writing z80 code.

    Given the stack frame constraint, the compiler performances are not usually terrible. Sometimes I am pleasantly surprised by code sdcc comes up with in small tight loops involving 8-bit quantities. Sometimes I see something that makes the opposite impression :P These things I try to fix up in post-processing. HTC is more formulaic and predictable in its code generation. It will rarely be really bad code but also you will rarely so something really clever. When I see sdcc's output, it's clear that the z80 code generator is not considering many options and doesn't cost the use of index registers properly (this is why z88dk can get much better code out of sdcc with "--reserve-regs-iy"). Keep in mind a modern compiler is divided between a front-end where all the analysis happens and a back-end where the code generator lies. It's the code generator that I believe still has room for improvement.
    [свернуть]


    По поводу эффективных и не эффективных библиотек и ловли блох у каждого из компиляторов. Ставить одну библиотеку над другой и определенные ходы в кодогенерации, думаю, не стоит. Все они преследуют определенные цели в узких рамках Z80.
    Компилятор C состоит из двух частей - переводчика языка и библиотеки. Оба одинаково важны, чтобы позволить программисту выполнить что-либо. Вы можете попробовать делать программы с GCC без GLIBC, но вы не очень далеко. Аналогично попытайтесь построить что-нибудь с помощью Visual Studio, не связывая время выполнения c microsoft или его код win32 gui. Библиотека является неотъемлемой частью компилятора, и поэтому стандарт C определяет, что должно быть там, как минимум. Если компиляторам не хватает больших порций, их полезность уменьшается.

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

    Я могу показать вам результаты нескольких тестов, которые показывают, какой код библиотеки различий может сделать. Zsdcc будет использовать библиотеку языков ассемблера, а sdcc будет использовать свою собственную библиотеку, написанную на C. Имейте в виду, что zsdcc - это sdcc с некоторыми улучшениями, так что это почти сравнение равных.

    Скрытый текст


    A C compiler has two parts - the language translator and the library. Both are equally important to allow a programmer to accomplish anything. You can try to make programs with GCC without GLIBC but you won't get very far. Likewise try to build anything with Visual Studio without linking microsoft's c runtime or its win32 gui code. The library is an essential part of the compiler and that's why the C standard specifies what has to be in there at minimum. If compilers are missing large portions, their usefulness is decreased.

    On the z80, the libraries take on a new importance because the compilers are not able to generate nearly as good code as hand written assembler.

    I can show you a few benchmark results that demonstrate the difference library code can make. zsdcc will be using an assembly language library and sdcc will be using its own library written in C. Keep in mind zsdcc is sdcc with some improvements so this is almost a comparison of equals.
    [свернуть]


    PI BENCHMARK (mainly testing 32-bit integer math)

    Код:
    Z88DK March 2, 2017
    zsdcc #9833 / new c library / small int math
    6246 bytes less page zero
    
    cycle count  = 5278798872
    time @ 4MHz  = 5278798872 / 4*10^6 = 22 min 00 sec
    
    *****
    
    SDCC 3.6.5 #9842 (MINGW64)
    6844 bytes less page zero
    
    cycle count  = 8700157418
    time @ 4MHz  = 8700157418 / 4*10^6 = 36 min 15 sec
    
    SDCC implements its 32-bit math in C.
    Это на 63% медленнее, а дополнительные 600 байтов исходят из того факта, что 32-битная математика sdcc написана на C.

    Если мы сможем принять большой размер кода, zsdcc может быть скомпилирован с использованием библиотеки с быстрыми целыми числами:

    Скрытый текст


    That's 63% slower and an extra 600 bytes coming from the fact sdcc's 32-bit math is written in C.

    If we can accept a large code size, zsdcc can be compiled using a fast integer library:
    [свернуть]


    Код:
    Z88DK March 2, 2017
    zsdcc #9833 / new c library / fast int math
    8997 bytes less page zero
    
    cycle count  = 1739403552
    time @ 4MHz  = 1739403552 / 4*10^6 = 7 min 15 sec
    Это теперь в пять раз быстрее, чем sdcc. И снова основное различие - библиотека.


    Еще один большой результат - математика с плавающей запятой. Это из ЭТАПЫ WHETSTONE:

    Скрытый текст


    That's now five times faster than sdcc. Again the main difference is the library.


    Another large result is in floating point math. This is from the WHETSTONE BENCHMARK:
    [свернуть]


    Код:
    Z88DK March 2, 2017
    zsdcc #9833 / new c library / math48 float package
    24 bit mantissa + 8 bit exponent (internally 40+8)
    6153 bytes less page zero
    
    cycle count  = 916537242
    time @ 4MHz  = 916537242 / 4x10^6 = 229.1343 seconds
    KWIPS        = 100*10*1 / 229.1343 = 4.3643
    MWIPS        = 4.3643 / 1000 = 0.0043643
    
    *****
    
    SDCC 3.6.5 #9842 (MINGW64)
    24 bit mantissa + 8 bit exponent
    14379 bytes less page zero
    
    cycle count  = 2184812093
    time @ 4MHz  = 2184812093 / 4x10^6 = 546.2030  seconds
    KWIPS        = 100*10*1 / 546.2030 = 1.8308
    MWIPS        = 1.8308 / 1000 = 0.0018308
    
    SDCC implements its float library in C.

    Sdcc более чем в два раза медленнее с плавающей библиотекой, написанной на C (и посмотрите на разницу в размерах). Это намного хуже, чем то, что появляется на поверхности. В z88dk математическая библиотека внутренне реализует 48-битное число с плавающей точкой с 40-битной мантиссой. Библиотека sdcc должна иметь дело только с 32-битным плавающей точкой и 24-битной мантиссой. Это значительное преимущество в производительности. Плавающая библиотека sdcc должна иметь более чем у z88dk. На самом деле цифры должны быть наоборот.


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

    По крайней мере, столь же важным, как скорость выполнения, является размер программы. В больших программах существуют очень большие различия в размере кода между sdcc и zsdcc. Частью этого является улучшение генерации кода (улучшение размера кода на 5-10%, хотя есть случаи с краями до 50%), но большая часть кода библиотеки. Я видел экономию 10 тыс. И более на больших скомпилированных программах, главным образом из-за различий в размере кода библиотеки. В программе размер, HTC и другие, как правило, избивают SDCC. И снова это обычно сводится к размеру кода библиотеки. У HTC и других есть свод библиотечного кода, реализованного в ассемблере, тогда как sdcc имеет очень мало этого. В этих сравнениях z88dk также выигрывает у HTC и других в размере кода, в значительной степени благодаря тому, что z88dk имеет намного больший объем библиотечного кода, написанного на ассемблере.


    Постобработка кода не вносит такой же вклад в экономию средств. Я считаю, около 5-10% размера является типичным. Воздействие на время выполнения может быть больше, если преобразования происходят внутри циклов. Одной из важных функций этих преобразований является исправление некоторых ошибок генерации кода sdcc, что позволяет нам надежно использовать «-reserve-regs-iy» и получать улучшенную генерацию кода из самого sdcc.

    Скрытый текст


    sdcc is more than twice as slow with a float library written in C (and look at the size difference). It's much worse than what appears on the surface. In z88dk, the math library internally implements a 48-bit float with a 40-bit mantissa. sdcc's library only has to deal with a 32-bit float and a 24-bit mantissa. That's a significant performance advantage sdcc's float library should have over z88dk's. In fact the numbers should be the other way around.


    These two benchmarks show an obvious difference because most of the running time is in the library code rather than the compiler-generated code. In most code, execution time won't be dominated so much by library code but this library performance advantage will penetrate everywhere.

    At least as important as the execution speed is the program size. In large programs there are very big differences in code size between sdcc and zsdcc. Part of it is better code generation (~5-10% code size improvement although there are fringe cases up to 50%) but a larger part is the library code. I have seen savings of 10k or more on large compiled programs mainly due to differences in library code size. In program size, HTC and others tend to beat sdcc as well. And again this is usually down to library code size. HTC and others do have a body of library code implemented in assembler whereas sdcc has very little of this. In these comparisons, z88dk also beats HTC and others in code size due in large part to the fact z88dk has a much larger body of library code written in assembler.


    The post-processing of code doesn't contribute as much to savings. I find around 5-10% size is typical. The impact on running time can be larger if the transformations happen inside loops. One important function of these transformations is to fix some of sdcc's code generation bugs that allows us to reliably use "--reserve-regs-iy" and get improved code generation out of sdcc itself.
    [свернуть]


    SDCC...Что бы я отметил. Не подходит для новичков и у профессионалов с ним периодический происходят трудности в использовании.
    Я не уверен, что я полностью согласен с этим. Его проще использовать в том смысле, что он лучше соответствует стандартам и может компилировать больше программ, чем другие компиляторы z80. Запуск на современной машине, а не, скажем, CP / M отнимает искусственные ограничения на размер программы.

    По сравнению с HTC и IAR, чего ему действительно не хватает, это несколько стандартных crts. Я видел, что многие люди борются с этим просто потому, что они не знали, как писать crt. После компиляции у вас есть .ihx-файл, который легко превратить в двоичный файл с помощью HEX2BIN. Кроме этого, я бы оценил его равным в простоте использования с IAR и HTC 309 (без учета ограничений, введенных CPM). У HTC 750 есть простая IDE, которая может понравиться некоторым пользователям, но я нахожу только отягчающей.

    Z88DK имеет преимущества перед всеми этими компиляторами: - передний интерфейс позволяет легко смешивать c, asm, макросы и т. Д. Он может хранить отдельные библиотеки для любой машины z80 с выделением из строки компиляции. Крошки уже сделаны. Постобработка включает в себя шаг с использованием «APPMAKE», который может превращать выходные двоичные файлы в COM, ROM, TAP, DSK, независимо от цели. Одна строка для компиляции любого количества исходных файлов в требуемую форму вывода, и для экспертов есть много вариантов. ZSDCC работает внутри этой инструментальной цепи, поэтому «SDCC» также можно использовать в этом простом режиме.

    Скрытый текст


    I'm not sure I'd wholly agree with that. It's easier to use in the sense it has better standards conformance and can compile more programs than the other z80 compilers. Running on a modern machine instead of, say, CP/M takes away artificial limits on program size.

    In comparison with HTC and IAR what it is really lacking is a few more standard crts. I've seen many people struggle with it simply because they did not know how to write a crt. After a compile you have an .ihx file which is easy to turn into a binary with HEX2BIN. Other than that I'd rate it equal in ease of use with IAR and HTC 309 (ignoring the limits introduced by CPM). HTC 750 has a simple IDE that some may like but I only find aggravating to use.

    Z88DK has usage advantages over all these compilers :- the front end makes it easy to mix c, asm, macros, etc. It can hold separate libraries for any z80 machine with selection from the compile line. The crts are already made. The post processing involves a step using "APPMAKE" that can turn the output binaries into COM, ROM, TAP, DSK, whatever the target needs. One line to compile any number of source files to the required output form and there's a lot of options in between for experts. ZSDCC runs inside this toolchain so "SDCC" can be used in this easy manner too.
    [свернуть]

Страница 6 из 7 ПерваяПервая ... 234567 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Осваиваем микрокомпьютер (1 и 2 ч.)
    от kas29 в разделе Пресса
    Ответов: 2
    Последнее: 06.02.2020, 01:27
  2. Видеоподкаст: "Old Gold Tech"
    от unbeliever в разделе Разный софт
    Ответов: 1
    Последнее: 12.06.2010, 13:41

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •