class proba(object) attrib a1 attrib a2 method m1 :a1 method m2 :a2:b:c:m
A példában m1 lényegében egy alias az a1 attribútumra.
Az m2 metódus feltételezi, hogy az a2 (beágyazott objektum) attribútumnak, van egy b attribútuma, annak egy c attribútuma és annak egy m metódusa. Ennek a metódusnak továbbítódik a metódushívás.
*[x1..x2] // paraméterek felsorolása x1-től x2-ig *[x1..] // paraméterek felsorolása x1-től (ameddig van) *[..x2] // paraméterek felsorolása x2-ig (1-től) *[..] // összes paraméter (mint *)A szintaktika a string szeletekhez hasonló. A túllógó indexek módosulnak a tényleges méretekhez alkalmazkodva.
? x:="1" //1 (C) ? x::=(val()+1)::str::alltrim //2 (C) ? x::=(val()+1)::str::alltrim //3 (C) ? x::=val+1 //4 (N)
function hopp(a:=exp)
ugyanaz, mint
function hopp(a) if(a==NIL) a:=exp end
x:="Próba szerencse" ? x[1] // 'P' ? x[..4] // 'Prób' ? x[4..8] // 'ba sz' ? x[8..] // 'zerencse' ? x[..] // 'Próba szerencse' (másolat)A közönséges indexelésnél az index túlnyúlása runtime errort okoz. A szeletek túlnyúló indexei módosulnak a substr-hez hasonlóan (de nem trükköz, pl. negatív indexet nem számít hátulról).
hash:=simplehashNew() hash['próba']:='szerencse' // hash:set('próba','szerencse') ? hash['ilyennincs'] // hash:get('ilyennincs') --> NIL ? hash['próba'] // hash:get('próba') --> szerencseA simplehash objektumokat stringekkel lehet indexeleni. Belsőleg a simplehash osztály set(key,value) és get(key) metódusait használja. A key szerepben bináris és karakter string állhat, a value akármi lehet.
"\n" {raw_cat("\\n\\\n");/*egy nagy string*/}
helyett
"\n" {raw_cat("\\n\"\nL\"");/*darabol*/}
chmod -> _wchmod getcwd -> _wgetcwd mkdir -> _wmkdir rmdir -> _wrmdir remove -> _wremove rename -> _wrename fopen -> _wfopen stat -> _wstat sopen -> _wsopen FindFirstFile -> FindFirstFileW CopyFile -> CopyFileW stb. nincs: _wexec, _wspawn rossz: _wsystem (elromlanak a nem-ASCII argumentumok)
Példa:
#ifdef _UNIX_ _retni( chmod(_parb(1),_parni(2)) ); #else bin2str(base); _retni( _wchmod(_parc(1),_parni(2)) ); #endif
Kellemetlen, hogy sok helyen megjelent ez a kettősség. Most a windowsos websrv kezeli a cirill betűs directorykat és fájlokat, de nem tud végrehajtani nem-ASCII CGI-t.
Korábban ilyenkor az attribútumok tömbjében lyuk maradt. Az object:attrvals metódus az attrnames és asarray párhuzamosnak gondolt tömbök összepárosításával működik. A felüldefiniálás után asarray lyukas maradt, de attrnames nem, azaz a tömbök mégsem párhuzamosak, így az adatok elcsúsztak. Ezért attrib -> method felüldefiniálás után a classMethod újraszámolja az attribútumok indexét, és megszünteti a lyukat.
Új függvény class.prg-ben: classMethodCount. classMethNames a hash-beli elhelyezkedés sorrendjében adja a metódusneveket (a korábbi név sorrend helyett).
A CCC3-beli class.prg átvive CCC2-be (backport).
A CCC2 olyan compatibility réteget kapott, ami lehetővé teszi, hogy a CCC3 alá fejlesztett könyvtárak (egy része) változtatás nélkül leforduljon CCC2 alatt. Így fordulnak CCC2-ben a socket, sql2, jtlib könyvtárak, tehát nem kell ezeket két változatban is karban tartani.
Új UNIX spawn implementáció prg-ben.
Lényegesen fejlődött a GTK interfész, van Glade modul, amivel CCC-ben is lehet egérhúzogatással GUI-t szerkeszteni. Fejlődött a Jáva terminál interfész (komaptibilis javítások). Utoljára készült el, egyben lényegesen fejlődött az SQL2 interfész, a specifikáció verziószáma 1.0-ról 1.1-re változott, a dokumentáció átvizsgálva, kibővítve. Dinamikus tableentity objektum generálás tds-ből. Jeed: Jáva terminálos tableEntity EDitor.
A CCC3 telepítéséről rövid dokumentáció olvasható itt. A preferált terjesztési módszer: forrás letöltés subversion (svn) klienssel.
A GTK-t, Jáva terminált, SQL2-t érintő javítások/változások nincsenek backportolva a CCC2-be, ezért az új projekteket mindenképpen CCC3 környezetben érdemes fejleszteni.
Befejeződött a CCC2 fejlesztése. Az új/megváltozott típusok miatt a CCC3 nem teljesen kompatibilis a CCC2-vel, ezért a CCC2 nem vált feleslegessé, mindazontáltal a továbbiakban csak hibajavítások lesznek hozzá a nem portolandó programok fenntartása érdekében.
A mostani új CCC2 csomagok tartalmazzák a korábbi delta csomagokat és az azóta keletkezett kisebb javításokat. A csomagnevek kissé változtak, hogy a CCC2 és CCC3 csomagok egymás mellett keveredés nélkül kezelhetők legyenek.
Megjegyzés a GTK-hoz: A windowsos fordítók közül a Borland (FreeCommandLineTools, 2000-ből származik, nincs újabb) nem képes lefordítani a GTK-t. Az MSC lefordítja ugyan, de egyes programok (pl. appwindow) SIGSEGV-vel elszállnak. Ezért egyedül a MinGW látszik alkalmasnak windowsos GTK programok készítésére.
LGPL license: Az egész CCC projektet LGPL license alá helyeztük. Ebből adódóan el kellett hagynunk azokat a nem szabad komponenseket, amik license-elése ellentmond az LGPL-nek, nevezetesen a Ctree alapú táblaobjektumokat. Megjegyzés: a Ctree teljes mértékben helyettesíthető a BTBTX táblaobjektummal.
Flex és Lemon telepítés: A CCC telepítője automatikusan installálja a flex-et és lemon-t ($CCCDIR/usr alá), ezért nem kell a telepítésükkel külön foglalkozni.
Kivételkezelés: Több recover, amik típus alapján válogatnak a kivételek között, új finally ág, mindez Jáva mintára. A ppo2cpp a 4.3.xx változattól kezdve fordítja az új szintaktikát. Recover nélküli break kilépés helyett kiértékeli az errorblockot. A könyvtárakban eval(errorblock(),e) helyett break(e). Különféle error leszármazottak syserror-ban. Az object osztályban új metódus: isderivedfrom. Prototype objectek.
Táblaobjektumok: A hibakezelés a fentieknek megfelelően változott, speciális hibaosztályok: tabStructError, tabIndexError. A Ctree alapú táblaobjektumok kikerültek a csomagokból.
Szignál kezelés: signal.ch-ban egységesen használt signum konstansok. Mutex lockok alatt a szignálok tiltva (deadlock ellen). Windows ctrlcblock megszűnt, setposixsignal átalakítva. Szignálok blokkolása Linuxon és Windowson egységesítve. Signalblock paraméterezése változott: eval(signalblock(),signum). Szálak indításakor védekezés a szignálok ellen. siglocklev, sigcccmask öröklődik a szálak között.
Új szignál API: signal_description, signal_lock, signal_unlock, signal_raise, signal_send, signal_pending, signal_clear, signal_setmask, signal_mask, signal_unmask.
Megjegyzés a szignálokhoz: A szálbiztonság és a korrekt szignálkezelés legfontosabb kritériuma: Minden olyan pillanatban, amikor egy másik szálból szemétgyűjtés indulhat, vagy a szál szignált kaphat a vermeken kell legyen minden élő változó, de nem lehet ott semmi más (pl. keletkezőben vagy megszűnőben levő változók). E kritérium teljesítése csak a ccc2 és ccc2_ui_ könyvtáraknál kitűzött cél. Ha egy nem szálbiztosan megírt program a szignálkezelőben szemetet gyűjt, elszállhat. A CCC alap futtatórendszere (ccc2 és ccc2_ui_) a szignálkezelés alatt is ép állapotban tartja a változóteret, és elkerüli a deadlockokat. A reentráns programoknál szokásos általános szabályokon kívül semmilyen tiltás nincs, elvileg bármi futhat a szignálkezelőben.
A signal_lock(), signal_unlock() API csak azt a szálat védi a szignáltól, ami a signal_lock()-ot meghívta. Ettől még bármely másik szál kaphat SIGINT-et, és az egész program kiléphet. Windowson éppenséggel mindig ez a helyzet, ui. a SIGINT-et mindig egy újonnan induló szál kapja. A signal_lock() ezért csak arra való, hogy a mutexeket védje deadlock ellen. Ha az egész programot kell védeni a SIGINT-től akkor ki kell cserélni a minden szálra globális signalblock()-ot. Így működik az új setposixsignal().
Castolások: Az összes (char*) cast felülvizsgálva. Áttérés const char* deklarációkra, ahol az lehetővé teszi a (char*) cast elhagyását, pl. char *txt=(char*)YYText() helyett const char *txt=YYText(). A strings(), stringn() függvények char* helyett const char*-t várnak, szintén a castok kerülése érdekében.
Megjegyzés a castoláshoz: char *buf="string literal"; régi értelmezése: inicializált karakterbuffer, új értelmezése: karakterkonstans (readonly szegmensbe helyezve). Korábban a -fwritable_strings opcióval választható volt a régi értelmezés, most azonban ez az opció a GCC-ben megszűnt. A string literál helybeni nagybetűre konvertálása SIGSEGV-t okoz. Ha a C++ logikus akarna lenni, akkor a fenti sorra hibát kéne jeleznie. Ehelyett a C++ tervezőjének két kötetes, 1000 oldalas könyvében azt olvasom: A sok régi programra való tekintettel (!) a fordítók a fenti sort warning nélkül fogadják el. Következmény: Az inkompatibilis változás miatt, és amiatt, hogy az új C++ szabvány következetlenül használja a char* és const char* típusokat, régi C programok warning-mentes fordítás után SIGSEGV-znek.
Szemétgyűjtés, szálbiztonság: A szemétgyűjtés és a VALUE értékadás szinkronizálásában a vitatott zsilipelés helyett szálanként privát mutexek lockolva. A nem szálbiztos *stack++=NIL helyett mindenhol PUSHNIL().
Kulcsszavak: Egyes kulcsszavak (pl. next) használhatók függvénynévként. A lexikai elemző a szimbólum előtt/mögött levő "." (névtér határoló), illetve a szimbólumot követő "(" karakter alapján állapítja meg, hogy nem kulcsszóról, hanem közönséges szimbólumról van szó. Továbbra sem lehet függvénynévként használni olyan kulcsszavakat, amiket a normál használatban zárójeles kifejezés követhet, ilyen pl. az if és while. Megjegyzések: 1) Metódus és osztálynév szerepben mindig is megengedett volt kulcsszavakat használni. 2) Változónév szerepben ezután sem megengedettek a kulcsszavak.
Egyéb: Build, prg2ppo, z, zgrep statikusan linkel. sread()-ből kivéve az 1 órás timeout. Stack kezelési hiba javítva evalarr()-ban. asort()-ban az összehasonlító block alatt gc engedélyezve. Egyes include filék több példányban tárolása megszűnt. Run és quit preprocesszálása megszűnt. Solarison javítva a waitpid() WNOHANG módja. A cccapi.h Windowson inkludálja windows.h-t, azért felesleges azt máshol is inkludálni. A prg2ppo preprocesszorban áttértünk case sensitive filéspecifikációk használatára, ez régi programokban hibákat hozhat ki.
A GCC-ben megszűnt a -fwritable-strings opció. Ez az inkompatibilis változtatás bármely eddig jónak számító és a -fwritable-strings nélkül is warning mentesen forduló programba segfaultot vihet. Például, ha a program egy stringet helyben akar nagybetűre konvertálni. A ccc-fltk-config-ban előfordult ilyen eset.
A mostani változások az Opteron, vagy Athlon-64 processzoron 64-bites Linuxot futtató felhasználókat érintik. Egyéb 64-bites (Itanium, Sparc) rendszereken nem történt próbálkozás. A régi rendszereken remélhetőleg nem romlik el semmi. Az új könyvtár általában futtatja a régi programokat, tehát nem kell feltétlenül mindent újrafordítani.
32-bites rendszeren a C szintű int/long számok és pointerek mindig tárolhatók egy double-ban, azaz egy Clipper számváltozóban. 64-biten azonban már más a helyzet. Létrehoztunk ezért egy új Clipper típust (jele P=pointer), amit olyan adatok tárolására lehet használni, mint pl. egy Windows handle, OCI handle, thread azonosító, stb..
Clipper szinten a P változókkal a tároláson, értékadáson kívül kevés értelmes dolgot lehet csinálni: p1:=p2, p1==p2, p1!=p2, p==NIL, p!=NIL, l2hex(p), valtype(p), empty(p), xtoc(p), qout(p).
C szinten a pointer(void*) függvény a veremre teszi a változót, a _parp(i) makró átveszi a P tipúsú paramétert, a _retp(p) makró létrehozza a vermen a P típusú visszatérési értéket.
A 64-bites port nem tartalmazza a CTREE adatbáziskezelőt. Pontosabban a csomagban továbbra is benne vannak a 32-bites bináris könyvtárak, ezek azonban nem használhatók 64-biten. A BTBTX adatbáziskezelő kiválóan fordul 64-biten is.
Technikai megjegyzések:
A 64-bit érdekében nem kellett változtatni a fordítón. A generált C kód 32-biten és 64-biten ugyanaz. A futtatókönyvtár forrása is ugyanaz 32 és 64-biten, még #ifdef makrókra sincs szükség. A bináris kód attól függően lesz 32 vagy 64-bites, hogy a rendszeren mi a void* típus mérete.
32-biten:
sizeof(short)==2 sizeof(int)==4 sizeof(long)==4 sizeof(void*)==4
64-biten:
sizeof(short)==2 sizeof(int)==4 sizeof(long)==8 sizeof(void*)==8
A mostani változtatások lényege: Azokon a helyeken, ahol a C réteg 64-bites mennyiséget adott volna át a Clipper rétegnek számváltozóban, ott a számváltozó (N) helyett az új pointer (P) típusra tértünk át.
Új szintaktika hosszú string literálok írására: A <<SYM>>raw string<<SYM>> kifejezésben SYM egy tetszőleges szimbólum. A raw string akármilyen hosszú lehet, bármi lehet benne, kivéve <<SYM>>, mert az lezárja a stringet.
Scrollozó Windows konzolok támogatása. Korábban a programok az egész képernyő buffert vették képernyőnek, most alkalmazkodnak a látható méretekhez.