Welcome, Guest. Please login or register.


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

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: C programozás (Aztec C / Hisoft C)
« Reply #45 on: 2016.November.12. 22:32:12 »
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).

Ezt amugy talan Fejszen :) is kommenteltem: ez nem tudom miert meglepo, ez manapsag is pontosan igy van a UNIX-szeru op'rendszereken pl Linuxon is. Az mas kerdes, hogy "normal" esetben user szamara nem lathato, mert egy pipe-on at atadja az assembler-nek, igy az asm-al nem is talalkozol, de amugy ott van kozben az is, es egyetlen kapcsoloval ra is birhatod, hogy adja oda neked inkabb. Xep128-nal is hasznaltam pl, hogy lassam, mit produkal :-D

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #46 on: 2016.November.12. 23:57:18 »
Ezt amugy talan Fejszen :) is kommenteltem: ez nem tudom miert meglepo, ez manapsag is pontosan igy van a UNIX-szeru op'rendszereken pl Linuxon is. Az mas kerdes, hogy "normal" esetben user szamara nem lathato, mert egy pipe-on at atadja az assembler-nek, igy az asm-al nem is talalkozol, de amugy ott van kozben az is, es egyetlen kapcsoloval ra is birhatod, hogy adja oda neked inkabb. Xep128-nal is hasznaltam pl, hogy lassam, mit produkal :-D
Nekem meglepő volt, mert nem nagyon használok GCC-t :-)
*** Speicherplatz zu klein

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 #47 on: 2016.November.13. 13:12:36 »
Kösz az infót! Be is írtam ide.
Akkor az már nem is az eredeti könyv teljesen, hanem bővített "kiadás".
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: C programozás (Aztec C / Hisoft C)
« Reply #48 on: 2016.November.13. 17:40:42 »
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.

Ez is erdekes amugy, modern C compilerek meg mindig elfogadjak a "register" kulcsszot, de figyelmen kivul hagyjak, ui az optimalizalo kepessegeik alapjan onalloan, a register szerepeltetese nelkul is regiszterekbe tesznek dolgokat, attol fuggoen, hogy a cel CPU mennyit enged meg, es melyik/melyek az/azok a valtozo(k), amit erdemes szerinte. Foleg 64 bit x86 eseten (mivel ott tobb a regiszter, stb) nezegettem sokszor, hogy pl a gcc milyen kodot general, sokszor egesz meglepo, hogy csak regiszter muveletek vannak, es a kod ranezesre sem irhato meg jobban assembly-ben "kezzel" sem igazan ...

Nekem meglepő volt, mert nem nagyon használok GCC-t :-)

Amugy altalanos UNIX filozofia, nem kifejezetten csak a gcc csinalja ezt :) Tradicionalisan a "cc" nevu parancs a "C compiler" (legyen az gcc vagy mas), az "as" meg az assembler.

Offline Lacika

  • EP addict
  • *
  • Posts: 3198
  • Country: hu
    • http://www.ep128.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #49 on: 2016.November.13. 18:22:10 »
Akkor az már nem is az eredeti könyv teljesen, hanem bővített "kiadás".

Igen, az Aztec és a HiSoft fordítóról van benne némi plusz infó, a Unix-os dolgok viszont kimaradtak belőle (nem sok).

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: C programozás (Aztec C / Hisoft C)
« Reply #50 on: 2016.November.13. 19:22:21 »
Igen, az Aztec és a HiSoft fordítóról van benne némi plusz infó, a Unix-os dolgok viszont kimaradtak belőle (nem sok).

Amugy szoban forgo C forditok csak a K&R szintaxist tamogattak fuggevenyeknel? Marmint erre gondolok K&R kapcsan:

Code: C
  1. int example (a, b)
  2. char* a;
  3. char* b;
  4. { ... }

Mig manapsag ezt mar nem kifejezetten szokas hasznalni mar, hanem:

Code: C
  1. int example ( char* a, char* b)
  2. { ... }

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #51 on: 2016.November.13. 20:32:02 »
Amugy szoban forgo C forditok csak a K&R szintaxist tamogattak fuggevenyeknel? Marmint erre gondolok K&R kapcsan:

Code: C
  1. int example (a, b)
  2. char* a;
  3. char* b;
  4. { ... }

Mig manapsag ezt mar nem kifejezetten szokas hasznalni mar, hanem:

Code: C
  1. int example ( char* a, char* b)
  2. { ... }

Az Aztec C a K&R szintaxist támogatja (a régi 7-es UNIX (és a cal.c) is azzal van írva. Az újat nem is fogadja el. A HiSooft-ot nem néztem, most a HiTech-hel próbálkozok. Az egy kicsit többet tud.
*** Speicherplatz zu klein

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: C programozás (Aztec C / Hisoft C)
« Reply #52 on: 2016.November.13. 20:56:52 »
Az Aztec C a K&R szintaxist támogatja (a régi 7-es UNIX (és a cal.c) is azzal van írva. Az újat nem is fogadja el. A HiSooft-ot nem néztem, most a HiTech-hel próbálkozok. Az egy kicsit többet tud.

Errol eszembe jut az ELKS project (elvileg "Embeddable Linux Kernel Subset"), ami UNIX-szeru cucc "regebbi" gepekre kb, mondjuk 286-osra. Talaltak hozza egy compiler-t, bcc neven. Az meg csak a K&R szintaxist tamogatta. Ezert irtak egy source "elforditot" ami atalakitja K&R-re elobb, es azt adja a bcc-nek. Brrrrrrrrrrr :-)

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #53 on: 2016.November.13. 21:01:36 »
Ez is erdekes amugy, modern C compilerek meg mindig elfogadjak a "register" kulcsszot, de figyelmen kivul hagyjak, ui az optimalizalo kepessegeik alapjan onalloan, a register szerepeltetese nelkul is regiszterekbe tesznek dolgokat, attol fuggoen, hogy a cel CPU mennyit enged meg, es melyik/melyek az/azok a valtozo(k), amit erdemes szerinte.

Hasonló az inline kulcsszó a CPP-ben. Azt ugye a makrók kiváltására hozták létre, makrókkal ugyanis elég veszélyes dolgokba is belefuthat az ember... :-)

pl. vegyük ezt az egyszerű függvényt (remélem, nem rontom el :-)):
Code: [Select]
bool IsOdd(int n)
{
    return (n & 1);
}

namármost, ugye ha szép, könnyen karbantartható kódot akarunk, akkor csinálunk egy soros függvényt is akár. Csak hát ugye nagyobb a függvény overhead-je, mint maga a függvény.

Erre találták ki az inline módosítót, amit a függvény elé írva olyan kód jön létre fordításkor, mintha kvázi makró lenne.

Namármost, arra akartam kilyukadni, hogy az inline is olyan, mint a register, hogy opcionálisan veszi figyelembe a fordító, de pl. ha be van kapcsolva az optimalizálás, akkor inline kulcsszó nélkül is "inline-olja" az adott függvényt a fordító, ha úgy gondolja, hogy úgy jobb lenne...
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 2297
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #54 on: 2016.November.13. 21:10:24 »
most a HiTech-hel próbálkozok. Az egy kicsit többet tud.
Itt a HiTech C-vel fordított .com.

A Hitech esetén CP/M kompatibilis text file-nak kell lennie a forrásnak, vagyis chr(26) EOF-bájtra kell végződnie. Különben nem hajlandó lefordítani, még a preprocessor kiakad... :-)
*** Speicherplatz zu klein

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: C programozás (Aztec C / Hisoft C)
« Reply #55 on: 2016.November.14. 00:39:20 »
Hasonló az inline kulcsszó a CPP-ben.

A CPP az C++ itt? C-ben is van, legalabbis C99 -ben mar igen.

De amugy igen, voltakepp hasonlo, vegulis a mai modern compiler-ek eleg okosak, hogy maguktol is kitalaljak, mikor mi kell, ez igaz kb az inline -ra es a register -re is. Sot, szerintem az esetek 99%-ban (csak tipp persze) rosszabbul is jar az ember, ha megprobal okosabb lenni a forditonal, foleg egy modern architekturan, ahol van mondjuk 32db regisztered, es pl register -nel nem biztos, hogy fejben tartja mar az ember, hogy mit erdmesebb valoban CPU regiszterben tarolni es mit nem :)

Ugyanakkor, a register kulcsszo hasznalata elvileg azt is maga utan vonja, hogy "nincs cime", tehat az ilyen muveletet akkor egyes C forditok meg sem engednek, annak ellenere, hogy amugy a register kulcsszo sok mindenre nincs hasznalva ... Pl:

Code: C
  1. void akarmi ( void ) {
  2.    register int a;
  3.    int *p = &a;   /* gcc eseten forditasi hibat okoz ez a sor, ami persze nincs, ha nincs az elozo sorban ott a "register" kulcsszo ... */
  4.    ... stb ...

Ha nem hasznaljuk viszont a register kulcsszot, attol lehet, hogy a fordito azt csinal belole, am sajat magatol lemond errol, ha pl a cimet akarja valami, mig fentebb pl nem.

Masik hasonlo erdekesseg, hogy miket csinalnak a mai compiler-ek, az pl konkretan az volt, hogy pont emu irasnal futottam abba bele, hogy mi az optimalisabb (itt epp kepet akar renderelni az ember, es a p mondjuk legyen egy pointer ami mutat a kirajzolando pixel-re, a lenti pelda persze nem a valodi eset pont, de most mindegy):

Code: C
  1. *(p++) = ...;
  2. *(p++) = ...;
  3. *(p++) = ...;
  4. *(p++) = ...;
  5. /* A fenti a jobb, vagy pedig ez itt lentebb: */
  6. p[0] = ...;
  7. p[1] = ...;
  8. p[2] = ...;
  9. p[3] = ...;
  10. p += 4;

Raadasul a "p" adott esetben nalam pl egy globalis valtozo volt, mert kell kesobb is. Nos, legalabbis gcc-vel (pont az emlitett -S kapcsolo hasznalataval, hogy lassam milyen asm kodot allit elo), kiderult, hogy a ketto kb tok ugyanazt erredmenyezi. Raadasul igen okos is a fordito: bar a "p" pointer nem igazi "register" tema, mert hat a renderelo fuggveny utan meg kell tartani az erteket, es eleve mint globalis valtozo szerel, stb, a gcc legalabbis azt csinalta, hogy egyszer betoltotte egy regiszterbe es szepen ott hasznalgatta, aztan a fuggveny vegen egyszer irta vissza a memoriaba. Meg az elso esetben is, ahol azt varna pedig az ember, hogy a sok p++ miatt ezt minden lepes utan megcsinalja. Valojaban, ez akar problema is lehet, ha pl multi-thread programunk van, es masik thread is nezi az erteket (es arra szamitunk hogy allandoan no), vagy pl oprendszert fejlesztunk, es interrupt handler, stb, ekkor ugye ajanlatos meg a "volatile" kulcsszot hasznalni, jelezve a forditonak, hogy ne csinaljon ilyen optimalizaciokat, mert lehet, hogy 'varatlanul' kell 'mashol is' az erteke. Na, igazabol - mint mindig - nem tudom normalisan, szepen es eleg precizen kifejezni magam :) de remelem azert ertheto :)

Es akkor lehetne meg olyan erdekessegekrol is beszelni, mint pl a "restrict" kulcsszo szerepe (szinten C99).