33
Típusok Kiegészítések és megjegyzések Nyékyné G. Judit: Programozási nyelvek c. könyvének hasonló címû fejezetéhez

Típusok

Embed Size (px)

DESCRIPTION

Kiegészítések és megjegyzések Nyékyné G. Judit: Programozási nyelvek c. könyvének hasonló címû fejezetéhez. Típusok. Tartalom. Dinamikus és statikus típusrendszerek Skalár típusok Nagy egész számok kezelése Logikai kifejezések Szemétgyûjtés Referenciák. fordított nyelvek - PowerPoint PPT Presentation

Citation preview

Típusok

Kiegészítések és megjegyzések Nyékyné G. Judit: Programozási nyelvek c. könyvének hasonló címû

fejezetéhez

Tartalom

● Dinamikus és statikus típusrendszerek● Skalár típusok● Nagy egész számok kezelése● Logikai kifejezések● Szemétgyûjtés● Referenciák

Dinamikus és statikus típusrendszerek● értelmezett nyelvek● korlátozott deklaráció● gyors indulás● nem, vagy gyengén

típusos nyelvek● gyorsabb

alkalmazásfejlesztés● automatikus

memóriakezelés

● fordított nyelvek● deklaráció fontos● lassú fordítás● általában erõsen

típusos nyelvek● biztonságosság a

típusellenõrzés által● manuális vagy

automatikus memóriakezelés

Dinamikus és statikus típusrendszerek● alapfilozófia: bízzunk

a programozóban, tudja, hogy mit akar

● az erõforrások jelentõsége kisebb (memória, CPU-idõ)

● Perl, Python, Ruby, Smalltalk

● alapfilozófia: a programozó hibát hibára halmozhat

● esetleg fontos az optimális erõforráshasználat

● C++, Ada, Java, Eiffel

Skalár típusokról

● Milyen különbséget tesz a nyelv a skalár típusok és az összetett típusok, osztályok között?

● Általában máshogy kezelik õket (gépi reprezentáció optimális volta miatt)

● Van aki rosszul csinálja...● Bizonyos nyelvek homogén módon kezelik

ezeket a típusokat is: Smalltalk, Ruby

Skalár típusokról: Smalltalk, Ruby

● Smalltalk példa: 1 + 2● Ruby nyelven a skalár típusok is objektumként

kezeltek:2.to_s3.times { puts “Hello world!” }2 + 3 # operátor túlterhelés

● mégis van különbség: a skalárok immediate típusok: értékadáskor és paraméterátvételkor az objektum érték adódik át, nem referencia

Skalár típusokról: Python

● Hasonló különbségtétel van Pythonban: mutable és immutable típusok

● immutable: skalárok, tuple, sztring● mutable: tömbök, szótárak● érdekesség: Pythonban van Complex típus, és a

szintaxis része complex literálok megadása a + bj alakban, ahol b valamilyen számliterál

Skalár típusokról: Perl

● a Perl mást ért skalár típus alatt: a Perl skalár típusai rendelkeznek belsõ szerkezettel

● skalárok a számok, a szövegek és a referenciák● nem skalárok az összetett típusok: listák és

asszociatív tömbök● egy számot számként és szövegként is tárol

Nagy számok kezelése: Python

● 2.1 verzióig:– OverflowError ha a plain int intervallumából kilépett

az érték– long integer literálok megadása az l módosítóval

1000l (nincs deklaráció!)● 2.2 verziótól automatikus konverzió long integer-

re, sõt a változó típusa eredetileg is long

Nagy számok kezelése: Ruby

● minden egész számot reprezentáló objektum alapesetben (ha nem túl nagy az érték) a Fixnum osztály egy példánya lesz

● amikor kinövi az értékhatárokat, akkor automatikusan 'konvertálódik' Bignum típusúra

● a 'konverzió' visszafele is mûködik, ha csökken a változó értéke (következik abból, hogy az egészek immediate típusok)

Nagy számok kezelése: Perl

● ha egy skalár értéke túl nagy lesz, akkor az értéke 'inf'-re változik

● nagy számok kezelése a Math::BigInt és Math::BigFloat osztályok segítségével lehetséges

Logikai kifejezések

● scriptnyelvekben általában nincs külön logikai típus

● tetszõleges kifejezésnek van igazságértéke

Logikai kifejezések: Perl

● nincs logikai típus● kifejezés pontosan akkor hamis, ha az értéke 0,

vagy az üres sztring● hamis: 0, 0.0, '0', '', undef, ()● igaz: '00', '0.0', '0E0', {}, []● értékadás szerepelhet logikai kifejezésben

Logikai kifejezések: Python

● nincs logikai típus● hamis minden, ami None, False, minden

numerikus típusú 0 (egész, lebegõpontos, komplex), minden üres sorozat ('', [], ()), illetve mapping ({})

● továbbá hamis minden objektum, melynek __nonzero__ metódusa 0-t ad vissza (ha van)

● továbbá hamis, ha nincs __nonzero__, de van __len__, és az 0-t ad vissza

● értékadás nem szerepelhet logikai kifejezésben

Logikai kifejezések: Ruby

● nincs logikai típus● FalseClass: egyetlen példánya a false● TrueClass: egyetlen példánya a true● minden igaz, ami nem nil, vagy false● igaz: 0, '', stb.

Lusta kiértékelés C++-ban

● érdekesség: ha C++-ban felüldefiniáljuk a || vagy az && operátort, akkor már paraméterátadás fog történni, ezért mindkét operandus kiértékelõdik, a lusta kiértékelés nem teljesül már

● Scott Meyers ezért nem javasolja, hogy ezt felüldefiniáljuk

Valós típusok

● semmi izgalom...● Perl kezeli õket: native floating point (dupla

pontosságú)● Python dupla pontosságú valósakat kezel● Ruby dupla pontosságú valósakat kezel

Szemétgyûjtés

● fõbb típusok:– hivatkozásszámlálás (reference counting)– mark-and-sweep: az elérhetetlen objektumok

megjelölése, késõbb a jelöltek felszabadítása– másolás (copying): a teljes memóriaterület

felszabadítása, majd az elérhetõk visszamásolása

Szemétgyûjtés: Perl

● referenciaszámlálást alkalmaz● az önhivatkozó objektumok nem szabadulnak fel● ezért kétszintû a szemétgyûjtés: a szál

befejezõdésekor egy mark-and-sweep szemétgyûjtés során felszabadul minden elérhetetlen objektum is

● ez szükséges azért, hogy az interpreter beágyazható és többszálú legyen

Szemétgyûjtés: Python

● a specifikáció nem köti meg a szemétgyûjtés fajtáját

● a jelenlegi implementáció hivatkozásokat számlál, egy késleltetett lefutású ciklikus-hivatkozás vizsgálóval

● azonnal felszabaduló objektumok● nem garantált a ciklikusan hivatkozott

objektumok felszabadítása

Szemétgyûjtés: Ruby

● mark-and-sweep algoritmust használ– conservative garbage collection: néhány objektum

felszabadítatlan maradhat, de a performancia jó● objektumon kívûl definiálható finalizer:

– a felszabadítás után hívódik meg– ObjectSpace.define_finalizer(object, proc { |id| puts “Finalizing #{id}”})

● GC.disable / GC.enable● GC.start

Referenciák

● scriptnyelvekben nincsenek mutató típusok● a referenciák kedveltek● általában van inicializálatlán érték

– Python: None– Ruby: nil

Referenciák: Perl

● Perl 5-ös verziótól tartalmaz referencia típust● visszakompatibilitás miatt nem minden referencia

– numerikus, szöveges értékek, file handle– listák– hash-ek– referenciák, melyek mutathatnak:

● skalárra (referenciára is!)● listára, hash-re● függvényre

● objektum-orientáltság referenciák segítségével● nincs null-referencia● $a==$b a referenciákat hasonlítja össze (kivéve...)

Referenciák: Python

● minden objektumot referenciákon keresztül kezel● immutable objektumokból egy példány is lehet

(implementációfüggõ)– a = 1 b=1: a és b ugyanarra az objektumra

mutathatnak● mutable objektumoknál ez nem igaz

– a = [] b = []: két különbözõ listára hivatkoznak– a = b = []: ugyanarra az objektumra hivatkoznak

● a == b az objektumok értékét hasonlítja össze– más típusú értékek nem egyenlõek– más típusú értékek sorrendje konzisztens, de

tetszõleges

Referenciák: Python

● mutathatunk függvényre, osztályra(!) referenciával

class Test: pass

def instantiate(Class):instance = Class()print instance

instantiate(Test)

● az eredmény pedig:<__main__.Test instance at 0x4021a72c>

Referenciák: Ruby

● minden objektumot referenciákon keresztül kezel● immediate objektumokból egy példány van

– a = 1 b=1: a és b ugyanarra az objektumra mutatnak● egyéb objektumoknál ez nem igaz

– a = [] b = []: két különbözõ listára hivatkoznak– a = b = []: ugyanarra az objektumra hivatkoznak

● a == b az objektumok értékét hasonlítja össze– más típusú értékek nem egyenlõek

Referenciák: Ruby (metódusok)

● blokkok és Proc objektumok használatosak● Method osztály használható metódusok átadására

def call_method(aMethod)puts aMethod.call()

end

def one()return 1

end

call_method(method(:one)) # Symbol példány átadásacall_method(method('one')) # metódusnév átadása (String példány)

● a kimenet:11

Referenciák: Ruby (osztályok)

● osztályra is mutathat referenciaclass Testend

def instantiate(aClass)instance = aClass.newp instance

end

instantiate(Test)

● a kimenet:#<Test:0x401c7164>

Kifejezések: Ruby

● Ruby-ban az elágazások mind kifejezések:absval = if val >= 0 then val else -val end

hex_digit_value = case digitwhen 'A' then 10when 'B' then 11when 'C' then 12when 'D' then 13when 'E' then 14when 'F' then 15else -1

end

Listák és hash-ek

● Perl, Python, Ruby nyelvek alaptípusai közé tartoznak

● nem típuskonstrukciók● heterogén adatszerkezetek

Karakterkészletek

● ASCII (American Standard Code for Information Interchange): 7 bites karakterkészlet

● Extended ASCII: 8 bites, sok van belõle (ISO-8859-1, ISO-8859-2, stb.) (5.3.3)

● A Unicode egy karakterkészlet (is), melyet a Unicode Project dolgozott ki, és fejleszt ma is

● Az ISO-10646 szabvány definiálja az UCS (Universal Character Set) karakterkészletet, mely gyakorlatilag minden lehetséges karaktert tartalmaz (hieroglifák és Tolkien Tengwar-ja is)

Kódolások

● A Unicode 21, az UCS 32 bites● UCS-2: 16 bites Unicode karakterek ábrázolására

használják (pl. Java), eredetileg az ISO-10646 szabványban definiálták

● UTF-8: ASCII kompatibilis, könnyen kezelhetõ egyszerû és nagyszerû kódolás (teljes ISO-10646)

● tehát: 16 biten nem ábrázolható a teljes ISO-10646 karaketerkészlet (5.3.3)

● A Unicode karakterkészlet (és egyebek), de nem kódolás (5.4.3)

Linkek

● Unicode Home Page: http://www.unicode.org/● ASCII table: http://www.asciitable.com/● UTF-8 and Unicode FAQ:

http://www.cl.cam.ac.uk/~mgk25/unicode.html