1 / 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. 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

Download Presentation

Típusok

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  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. 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 • értelmezett nyelvek • korlátozott deklaráció • gyors indulás • nem, vagy gyengén típusos nyelvek • gyorsabb alkalmazásfejlesztés • automatikus memóriakezelés

  4. alapfilozófia: a programozó hibát hibára halmozhat esetleg fontos az optimális erõforráshasználat C++, Ada, Java, Eiffel 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

  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_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

  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óval1000l (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ávalclass Test: passdef instantiate(Class): instance = Class() print instanceinstantiate(Test) • az eredmény pedig:<__main__.Test instance at 0x4021a72c>

  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áradef call_method(aMethod) puts aMethod.call()enddef one() return 1endcall_method(method(:one)) # Symbol példány átadásacall_method(method('one')) # metódusnév átadása (String példány) • a kimenet:11

  28. Referenciák: Ruby (osztályok) • osztályra is mutathat referenciaclass Testenddef instantiate(aClass) instance = aClass.new p instanceendinstantiate(Test) • a kimenet:#<Test:0x401c7164>

  29. Kifejezések: Ruby • Ruby-ban az elágazások mind kifejezések:absval = if val >= 0 then val else -val endhex_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 -1end

  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/ • ASCII table: http://www.asciitable.com/ • UTF-8 and Unicode FAQ: http://www.cl.cam.ac.uk/~mgk25/unicode.html

More Related