330 likes | 481 Views
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
E N D
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 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
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
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óval1000l (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ávalclass Test: passdef instantiate(Class): instance = Class() print instanceinstantiate(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á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
Referenciák: Ruby (osztályok) • osztályra is mutathat referenciaclass Testenddef instantiate(aClass) instance = aClass.new p instanceendinstantiate(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 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
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