Я пытаюсь понять, что значит для языка быть типобезопасным. В динамически типизированном языке проверка типов выполняется во время выполнения, например, если я запускаю следующий код PHP:
<?php
class MyClass
{
}
// Create a MyClass instance
$mc = new MyClass();
// Create an int variable
$i = 1234;
// Add $mc and $i
$result = $mc + $i;
?>
Я получу ошибку, потому что + operator
не поддерживает MyClass
тип данных. Таким образом, в основном проверка типов была выполнена во время выполнения.
Означает ли безопасность типов, что проверка типа выполняется независимо от того, выполняется ли она во время компиляции или во время выполнения, или это означает, что проверка типа должна выполняться только во время компиляции, и поэтому каждой переменной должен быть явно присвоен тип данных (например, C , Паскаль, Ява и др.).
«Безопасный тип» обычно означает «безопасный тип памяти», то есть вы не можете обрабатывать память, содержащую один тип, как если бы это был другой тип.
По этому определению большинство языков более высокого уровня, включая динамически типизированные языки, являются безопасными по типу, потому что любая попытка использовать тип неправильно гарантирует ошибку (время компиляции или выполнения) в них.
Таким образом, безопасность типов является в основном проблемой для языков низкого уровня, особенно C и C ++. И эти проблемы часто связаны с указателями или кастингом (например, reinterpret_cast
в C ++).
C # — интересный случай, лежащий между двумя группами: он по умолчанию безопасен для типов, но вы можете отключить безопасность типов для частей вашего кода, используя unsafe
ключевое слово (обычно по причинам производительности или взаимодействия).
Но если вы комбинируете безопасность типов со статической типизацией, это не обязательно означает необходимость писать типы. Многие статические безопасные от типов языки, особенно функциональные или вдохновленные ими, используют вывод типа. Это означает, что компилятор может сам определять тип переменной, основываясь на том, что ей присвоено, поэтому вам не нужно ее печатать. Примерами этого являются auto
Ключевое слово в C ++ и var
в C #.
Ответ — нет. Python является примером динамически, но строго типизированного языка:
>>> "foo" + 42
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
Haxe — пример безопасного для типов языка времени компиляции, который все еще не требует, чтобы типы были объявлены статически:
class Test {
static function main() {
trace(10 * Test.some());
}
static function some() {
return "foo";
}
}
> Build failure
> Test.hx:3: characters 19-30 : String should be Int
Это сделано с вывод типа.