3

Я пытаюсь понять, что означает, что язык будет безопасным по типу. В динамически типизированных языках, проверка типа производится во время выполнения, так, например, если я запускаю следующий 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, Pascal, Java и т. д.).

+0

Для этой конкретной ситуации существует определенная безопасность типа, но нет, если вы скажете 'function x() {$ i = 0; if (true) {$ i = "bla"; } return $ i; } '... –

+0

кстати. ваш exmaple приведет к 1235, так что там нет безопасности –

+0

@Royal Bg Если язык выполняет проверку типов во время выполнения и останавливает программу, если обнаружена ошибка типа, такой язык называется безопасным языком типа? –

ответ

3

Ответ отрицательный. 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 

Это делается с помощью type inference.

+0

Как Haxe знает, тип данных переменной при компиляции, если они не статически объявлены, я могу просто изменить тип данных внутри блока 'if', чтобы Haxe не знал, какой тип данных будет во время компиляции. –

+0

@Steve: в какой-то момент вам нужно назначить что-то для var, и именно здесь Haxe передает свой тип. Вы также можете объявить переменную динамической, как в Python. См. Http://old.haxe.org/ref/type_infer – georg

+0

Что я имел в виду, если Haxe выполнял проверку типов во время компиляции, а также поддерживает создание переменных без явного указания их типа данных, это означает, что я могу сделать блок if, который изменяет тип данных переменной во время выполнения, а позже эта переменная используется в инструкции, которая не поддерживает этот вновь измененный тип данных. Например: var i = 123; if (something) i = new MyClass(); var result = i + otherVariable; –

3

«Тип сейфа» обычно означает «безопасный тип памяти», то есть вы не можете обрабатывать память, содержащую один тип, как если бы это был другой тип.

В соответствии с этим определением большинство языков более высокого уровня, включая языки с динамически типизированным типом, безопасны по типу, потому что любая попытка использовать тип неправильно гарантированно вызывает ошибку (время компиляции или время выполнения).

Итак, тип безопасности в основном является проблемой для языков низкого уровня, особенно для C и C++. И эти проблемы часто связаны с указателями или литьем (например, reinterpret_cast на C++).

C# - интересный случай, который находится между двумя группами: по умолчанию он безопасен по типу, но вы можете отключить безопасность типов для частей своего кода, используя ключевое слово unsafe (обычно для целей производительности или взаимодействия).


Но если вы сочетаете безопасность типа со статической типизацией, это не обязательно означает необходимость писать типы. Многие статические типы безопасных языков, особенно функциональные или вдохновленные ими, используют type inference. Это означает, что компилятор может самостоятельно определить тип переменной, основываясь на назначении ей, поэтому вам не нужно вводить ее. Примерами этого являются ключевое слово auto в C++ и var в C#.

+1

Тип безопасности не является проблемой, так как он мешает вам совершать ошибки и помогает вам чтобы убедиться, что вы знаете, что вы делаете (PHP - это как приготовление пищи с ингредиентами, о которых вы не знаете). И по моему личному мнению тип вывода в безопасных языках типов не очень хорош, так как он позволяет вам потерять обзор о переменные типа к легкому. Да, нет? Тогда человек, которому нужно расширять или менять свой блок кода спустя несколько десятилетий. – modiX

Смежные вопросы