dynamic type checking (tsz. dynamic type checkings)
Ebben a leírásban részletesen megvizsgáljuk:
A típusellenőrzés (type checking) célja, hogy ellenőrizze, hogy az egyes műveletekhez használt adatok megfelelő típusúak-e. Például:
# Rossz típushasználat:
3 + "hello" # hibát ad, mert nem adhatunk össze int-et és stringet
Ha egy nyelv típusellenőrzést végez, biztosítja, hogy a típusok között értelmes műveletek történjenek.
Szempont | Statikus típusellenőrzés | Dinamikus típusellenőrzés |
---|---|---|
Ellenőrzés ideje | Fordításkor (compile time) | Futásidőben (runtime) |
Ellenőrzést végzi | Fordító | Futásidejű környezet (interpreter vagy VM) |
Példák | C, C++, Java, Rust | Python, JavaScript, Ruby, PHP |
Hibák detektálása | Már fordításkor | Csak futás közben |
Típusinformáció | Deklarált vagy inferált | Minden objektumnak van típusa, de a változónak nincs fix típusa |
int
, float
, str
, list
stb.).x = 42 # x most int
x = "hello" # x most string
+
, a rendszer futásidőben ellenőrzi, hogy az operandusok típusai kompatibilisek-e:a = 5
b = 10
print(a + b) # OK, int + int
a = "foo"
print(a + b) # runtime error: str + int nem engedélyezett
Python dinamikusan típusos és dinamikusan típusellenőrzött nyelv:
def add(a, b):
return a + b
print(add(2, 3)) # 5
print(add("foo", "bar")) # "foobar"
print(add(2, "bar")) # runtime error: TypeError
JavaScript szintén dinamikusan típusellenőrzött, de a típuskonverzió (coercion) agresszívebb:
console.log(2 + 3); // 5
console.log("foo" + "bar"); // "foobar"
console.log(2 + "bar"); // "2bar" (nem hiba, automatikus konverzió)
Megjegyzés: Ezért JavaScriptben a típuskezelés sokszor hibaforrás.
Ruby is dinamikusan típusellenőrzött:
def add(a, b)
a + b
end
puts add(2, 3) # 5
puts add("foo", "bar") # "foobar"
puts add(2, "bar") # runtime error: TypeError
x = 10
x = "string"
def print_twice(x):
print(x)
print(x)
print_twice(42)
print_twice("hello")
print_twice()
def foo(x):
return x.upper() # ha nem str, futáskor hibázik
Sok dinamikusan típusellenőrzött nyelvben ma már lehetőség van opcionális statikus típusellenőrzésre, pl.:
type hints
+ mypy
ellenőrzőTypeScript
(szuperszett)Példa Pythonban:
def add(a: int, b: int) -> int:
return a + b
Itt a típusok ellenőrizhetők statikus eszközzel, de futásidőben a Python továbbra is dinamikus.
Tulajdonság | Dinamikus típusellenőrzés |
---|---|
Mikor ellenőriz? | Futásidőben |
Rugalmasság | Nagy |
Hibák felderítése | Később (runtime) |
Kód olvashatóság | Könnyebb kódolás, de kevésbé egyértelmű |
Sebesség | Lassabb, mert runtime ellenőrzések kellenek |
Példák | Python, JavaScript, Ruby, PHP |
A dinamikus típusellenőrzés nagy rugalmasságot ad, de több figyelmet igényel a fejlesztő részéről, mivel nem garantálja a típusok helyességét fordítási időben.