Upload
shamara-amena
View
40
Download
0
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)