Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaMárton Hegedűs Megváltozta több, mint 10 éve
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
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.