Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

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.

Hasonló előadás


Az előadások a következő témára: "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."— Előadás másolata:

1 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

2 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

3 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

4 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

5 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

6 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_s 3.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

7 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

8 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

9 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

10 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)

11 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

12 Logikai kifejezések ● scriptnyelvekben általában nincs külön logikai típus ● tetszõleges kifejezésnek van igazságértéke

13 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

14 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

15 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.

16 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

17 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

18 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

19 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

20 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

21 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

22 Referenciák ● scriptnyelvekben nincsenek mutató típusok ● a referenciák kedveltek ● általában van inicializálatlán érték – Python: None – Ruby: nil

23 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...)

24 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

25 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:

26 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

27 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ása call_method(method('one')) # metódusnév átadása (String példány) ● a kimenet: 1 1

28 Referenciák: Ruby (osztályok) ● osztályra is mutathat referencia class Test end def instantiate(aClass) instance = aClass.new p instance end instantiate(Test) ● a kimenet: #

29 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 digit when 'A' then 10 when 'B' then 11 when 'C' then 12 when 'D' then 13 when 'E' then 14 when 'F' then 15 else-1 end

30 Listák és hash-ek ● Perl, Python, Ruby nyelvek alaptípusai közé tartoznak ● nem típuskonstrukciók ● heterogén adatszerkezetek

31 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)

32 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)

33 Linkek ● Unicode Home Page: http://www.unicode.org/http://www.unicode.org/ ● ASCII table: http://www.asciitable.com/http://www.asciitable.com/ ● UTF-8 and Unicode FAQ: http://www.cl.cam.ac.uk/~mgk25/unicode.html http://www.cl.cam.ac.uk/~mgk25/unicode.html


Letölteni ppt "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."

Hasonló előadás


Google Hirdetések