Welcome, Guest. Please login or register.


Author Topic: C programozás (Aztec C / Hisoft C) (Read 13411 times)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #30 on: 2016.January.05. 13:44:22 »
A C verzión még lehetett volna optimalizálni, tehát a fenti időknél gyorsabb is lehetne. :oops: De itt elsősorban a fordítók összehasonlítása volt a cél.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #31 on: 2016.January.05. 18:34:17 »
Valamivel gyorsabb változat:

[ Guests cannot view attachments ]

SDCC: 1.423 másodperc
z88dk: 4.665 másodperc

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #32 on: 2016.January.06. 12:01:51 »
nem rossz, azért nagyságrendileg hasonló lett az eredmény :-)
azért az durva, mennyivel lassabb kódot állít elő a z88dk
*** Speicherplatz zu klein

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #33 on: 2016.January.06. 22:45:52 »
nem rossz, azért nagyságrendileg hasonló lett az eredmény :-)

Még egy kevés javulás (az SDCC verzió valamivel kisebb is lett - lehetne nagyobb és gyorsabb is):
[ Guests cannot view attachments ]

SDCC: 1.328 másodperc
z88dk: 4.532 másodperc

Quote
azért az durva, mennyivel lassabb kódot állít elő a z88dk

Ez már nem egészen fair összehasonlítás, mert a gyorsabb verziók az SDCC-vel készültek (azzal teszteltem, hogy az egyes változtatások javítanak-e a kódon), ezért bizonyos mértékben arra a fordítóra optimalizáltak. De más tesztekben is általában az SDCC jobb kódot generál - legalábbis a C runtime használata nélkül, egész számos aritmetikával. A runtime függvények és a float típus megvalósítása viszont a z88dk-ban tűnnek jobbnak, azzal jobban is futott a mandel.c és a tunnel.c.

Offline Alcoholics Anonymous

  • Newbie
  • Posts: 10
  • Country: ca
    • Z88DK Homepage
Re: C programozás (Aztec C / Hisoft C)
« Reply #34 on: 2016.January.07. 02:43:24 »
Ez már nem egészen fair összehasonlítás, mert a gyorsabb verziók az SDCC-vel készültek (azzal teszteltem, hogy az egyes változtatások javítanak-e a kódon), ezért bizonyos mértékben arra a fordítóra optimalizáltak. De más tesztekben is általában az SDCC jobb kódot generál - legalábbis a C runtime használata nélkül, egész számos aritmetikával. A runtime függvények és a float típus megvalósítása viszont a z88dk-ban tűnnek jobbnak, azzal jobban is futott a mandel.c és a tunnel.c.

This translation is going to be terrible so I put the english into code blocks.  Sorry :(



Próbálta már a legújabb z88dk amely egyesíti sdcc és z88dk együtt?

A különbség z88dk és sdcc ez:

sdcc könyvtára minimális, és azt végrehajtani C. Egy maroknyi funkciókat valósították ASM és ezek közé tartozik a 16 bites aritmetikai, memcpy, strcpy, strncpy, strchr, és memset. sdcc a fordító megpróbálja generálni optimalizált fordította C. Az ötlet mögött sdcc könyvtára, hogy C-ben írt, hogy a hordozható annak minden cél CPU-k.

z88dk könyvtár célja a C-szabvány követelményei és meg van írva assembly nyelven. z88dk a fordító megpróbálja létrehozni a kis lefordított C - ezért látod sok hívásokat. Az ötlet mögött z88dk könyvtára, hogy a legtöbb végrehajtási időt fordítanak a könyvtári rutinok így a sebesség szállítják a könyvtár és a kis kód mérete kézbesíti a fordító.

Ha összevetjük a kis C töredékek, amelyek nem élnek könyvtári funkciókat, sdcc akkor mindig gyorsabb kódot, mint z88dk. Azonban a reálisabb programok, ahol könyvtári funkciók fontosak, z88dk gyorsabb lesz, és kisebb. Láttad eltúlzott esetében ez az, amikor összeállítása a float funkciókat. sdcc float könyvtár 32 bites és teljesen C nyelven írt z88dk a 48 bites és teljesen assembly nyelven. z88dk float végrehajtása majdnem 3-szor kisebb, és majdnem 3-szer gyorsabb, mint a sdcc ellenére nagyobb úszós. Hasonló eredményt a 32 bites egész matek, de mind z88dk és sdcc is hasonló teljesítményt nyújt 16 bites egész matematikai mivel mindkettő végre asm.

Láthatjuk néhány benchmark eredmények itt:
http://www.z88dk.org/wiki/doku.php?id=temp:front#benchmarks

Code: [Select]
Have you tried the latest z88dk which combines sdcc and z88dk together?

The difference between z88dk and sdcc is this:

sdcc's library is minimal and it is implemented in C.  A handful of functions are implemented in asm and these include 16-bit arithmetic,  memcpy, strcpy, strncpy, strchr, and memset.  sdcc's compiler tries to generate optimized translated C.  The idea behind sdcc's library is that, written in C, it is portable to all of its target CPUs.

z88dk's library aims for C standard compliance and it is written in assembly language.  z88dk's compiler tries to generate small translated C - that's why you see many calls.  The idea behind z88dk's library is that most execution time will be spent in library routines so the speed is delivered by the library and small code size is delivered by the compiler.

When you compare small C fragments that don't make use of library functions, sdcc will always generate faster code than z88dk.  However, in more realistic programs where library functions are important, z88dk will normally be faster and smaller.   You saw an exaggerated case of this when you compiled using float functions.  sdcc's float library is 32-bit and entirely written in C.  z88dk's is 48-bit and entirely in assembly language.  z88dk's float implementation is almost 3 times smaller and almost 3 times faster than sdcc's despite the larger float type.  Similar results come from 32-bit integer math but both z88dk and sdcc will have similar performance for 16-bit integer math since both are implemented in asm.

You can see some benchmark results here:
http://www.z88dk.org/wiki/doku.php?id=temp:front#benchmarks

sdcc és z88dk is módosult az elmúlt évben el kell végezni kompatibilisek egymással. Az új verzió lehetővé teszi z88dk sdcc kell használni, mint a C fordítót, mialatt a CRT-k és a C könyvtár és javítása sdcc kimenet. Ezek együtt eredményezi kód mérete és sebessége, hogy nagyon jó, mint a kereskedelmi összeállítói.

Ha az új verzió a z88dk telepítve, és egy foltozott sdcc végrehajtható, akkor össze programokat, mint ez:

zcc +embedded -vn -SO3 -startup=0 -clib=sdcc_iy --max-allocs-per-node200000 test.c -o test

Lesz, aki pragma a csúcsra "test.c" megváltoztatni a org címre:

#pragma output CRT_ORG_CODE = 32768

A kimenet lesz "test_CODE.bin", amely ORGed címen 32.768 ebben az esetben.

Code: [Select]
sdcc and z88dk have been modified in the past year to be made compatible with each other.  The new version of z88dk allows sdcc to be used as C compiler while supplying the crts and C library and improving sdcc's output.  This combination produces results in code size and speed that are very good compared to commercial compilers.

If you have the new version of z88dk installed and have a [url=http://www.z88dk.org/wiki/doku.php?id=temp:front#sdcc1]patched sdcc executable,[/url] you can compile programs like this:

zcc +embedded -vn -SO3 -startup=0 -clib=sdcc_iy --max-allocs-per-node200000 test.c -o test

You will have to add a pragma to the top of "test.c" to change the org address:

#pragma output CRT_ORG_CODE = 32768

The output will be "test_CODE.bin" which is ORGed at address 32768 in this case.

Mert ez a beágyazott célpont nincs stdio stdout, stderr így printf kellene helyettesíteni sprintf vagy sprintf. % f is le van tiltva alapértelmezésben úgy, hogy lehetővé tegye bármely% aefg a könyvtár újra kell építeni. Ez a fajta dolog leírt wiki.

Hogy egyszerűen csak nézd meg a lefordított C nincs, hogy létrehoz egy bináris és tudod használni bármilyen kívánt funkciókat:

zcc +embedded -vn -a -SO3 -clib=sdcc_iy --max-allocs-per-node200000 test.c

Code: [Select]
Because it's the embedded target there is no stdio, stdout, stderr so printf would have to be replaced by sprintf or snprintf.  %f is also disabled by default so to enable any of %aefg the library has to be rebuilt.  That's the sort of thing described in the wiki.

To simply look at the translated C you don't have to generate a binary and you can use whatever functions you want:

zcc +embedded -vn -a -SO3 -clib=sdcc_iy --max-allocs-per-node200000 test.c

Ez a kombináció a z88dk / sdcc mindig gyorsabb és kisebb, mint akár sdcc önmagában vagy z88dk egyedül (kivéve, ha a program tartalmaz sok long), és ez nagyon jó betartását C szabvány. sdcc szállítja a fordító megfelelés és z88dk ellátja a könyvtár betartását.

Sajnos már csak három célokat jelenleg definiált erre a pályára: +cpm +embedded +zx. +embedded az általános cél, és fel lehet használni összeállításához bármilyen Z80 gép, de természetesen a dolgok, mint stdin, stdout, stderr, grafika, hang, stb nem lesz elérhető, mint a célhardver határozatlan.

Code: [Select]
This combination of z88dk/sdcc is always faster and smaller than either sdcc alone or z88dk alone (except when the program contains lots of longs) and it has very good compliance with the C standard.  sdcc supplies the compiler compliance and z88dk supplies the library compliance.

Unfortunately there are only three targets currently defined for this combination:  +cpm +embedded and +zx.  +embedded is the general target and can be used to compile for any z80 machine but of course things like stdin, stdout, stderr, graphics, sound, etc will not be available as the target hardware is undefined.
« Last Edit: 2016.January.07. 02:53:50 by Alcoholics Anonymous »

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9926
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: C programozás (Aztec C / Hisoft C)
« Reply #35 on: 2016.January.07. 14:48:42 »
This translation is going to be terrible so I put the english into code blocks.  Sorry :(
I think you should start a topic "C programming (Aztec C / Hisoft C)" in the English forum instead.
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #36 on: 2016.November.11. 11:47:27 »
Kicsit próbálgattam az Aztec C fordítót:
a UNIX-os "cal" program lefordítva CP/M-re:
« Last Edit: 2016.November.11. 12:26:20 by Povi »
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #37 on: 2016.November.11. 11:54:09 »
Érdekes egyébként ez a régi C forrás (UNIX V6)...

A += és -= operátorok helyett =+ és =- van...

Meg is hülyül tőle a kód :-) Lefordul, csak aztán nem érted, miért fagy le futás közben...

Tudtommal a B nyelvben voltak += és -= operátorok, és a C-ben már megfordították, hogy a "a =- b" kifejezés ne értelmeződjön "a = -b"-nek a "a = a - b" helyett... De ezek szerint akkor még a korai C nyelvben is így volt...
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #38 on: 2016.November.11. 12:27:32 »
javított com fájl... :oops:

az évet nem írta ki a fejlécbe, valamiért %l formázó karakter volt a printf utasításban (régen lehet, hogy az volt?) a %d helyett...
most már jó
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #39 on: 2016.November.11. 13:37:32 »
A += és -= operátorok helyett =+ és =- van...

Tudtommal a B nyelvben voltak += és -= operátorok, és a C-ben már megfordították, hogy a "a =- b" kifejezés ne értelmeződjön "a = -b"-nek a "a = a - b" helyett... De ezek szerint akkor még a korai C nyelvben is így volt...

Hm... A Wiki azt írja, csak 1978 óta (a K&R könyv óta) van += és -= operátor. Azelőtt tényleg =+ és =- volt...
*** Speicherplatz zu klein

Offline Lacika

  • EP addict
  • *
  • Posts: 3197
  • Country: hu
    • http://www.ep128.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #40 on: 2016.November.11. 17:27:09 »
Forrásprogramot lehet kérni?

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #41 on: 2016.November.11. 19:50:00 »
Forrásprogramot lehet kérni?
a unix v7 cal.c forráskódja módosítás nélkül lefordul:
http://www.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/cal.c
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #42 on: 2016.November.11. 21:26:38 »
kicsit gyorsabb lesz a kód, ha a 116. sor környékét átírod így:

Code: [Select]
register d, i;
helyett ezt:
Code: [Select]
   int d;
    register i;

magyarázat: hatókörönként (kapcsos zárójelen belül) csak egy változó fog regiszterként használódni, a többinek az értéke a RAM-ban lesz eltárolva.
Viszont akkor már érdemesebb a ciklusváltozót regiszterbe rakni, mivel ahhoz fog a legtöbbször hozzányúlni a progi.

Ha több, mint egy változóhoz van register módosító jelző, akkor a legelsőhöz fogja használni az Aztec fordító.

Egyébként nem rossz dolog, hogy az Aztec először ASM forráskódot állít elő, mert így elég egyszerű még kézzel kicsit optimalizálni a kódot. (ilyenkor mindig elgondolkodok, hogy tényleg ez volt a csúcs a '80-as években? manapság el vagyunk kényeztetve a szénné optimalizált fordított kódokkal).

Csatolmányban lásd a kézzel kicsit optimalizált asm kódot és a lefordított .com fájlt. (csak a cal() függvénybe nyúltam bele).
« Last Edit: 2016.November.11. 21:58:39 by Povi »
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #43 on: 2016.November.12. 10:21:14 »
kis kiegészítés...

a CC.COM 8080 assembly-re fordít, ott csak egy változó lehet regiszterben, a BC-be kerül.

a CZ.COM viszont Z80-ra fordít, és három "register"-es változónk lehet, a másik kettőt az IX-be és IY-ba pakolja. Érdekes, hogy ugyanúgy 8080 assembly forráskódot állít elő, a Z80 specifikus (indexregiszteres) utasítások DB-vel vannak benne.
*** Speicherplatz zu klein

Offline Lacika

  • EP addict
  • *
  • Posts: 3197
  • Country: hu
    • http://www.ep128.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #44 on: 2016.November.12. 10:58:39 »
Kösz az infót! Be is írtam ide.