Подтвердить что ты не робот

Что означает "безопасный тип" и "строго типизированный" означает одно и то же?

Значит ли "тип-безопасно" и "строго типизировано" то же самое?

4b9b3361

Ответ 1

Нет, не обязательно - хотя это зависит от вашего определения терминов, и нет очень четких и общепринятых определений.

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

Например, в С# 4.0 вы можете:

dynamic foo = "hello";
dynamic length = foo.Length; // Uses String.Length at execution time
foo = new int[] { 10, 20, 30 };
length = foo.Length; // Uses Array.Length at execution time
dynamic bar = (FileStream) foo; // Fails!

Последняя строка - это ключ к безопасному типу: нет безопасного преобразования из массива int в FileStream, поэтому операция завершается неудачно - вместо обработки байтов объекта массива, как если бы они были FileStream.

EDIT: С# обычно как "строго типизированный" (как язык), так и безопасный тип: компилятор не позволит вам совершать произвольные вызовы для объекта, а среда выполнения не позволит вам выполнять неправильные преобразования.

Я не совсем уверен, где небезопасный код вписывается - я не знаю достаточно об этом, чтобы комментировать, боюсь.

Динамическая типизация в С# 4 позволяет использовать слабо типизированный, но все же безопасный тип кода, как показано выше.

Обратите внимание, что foreach выполняет неявное преобразование, делая его своего рода гибридом:

ArrayList list = new ArrayList();
list.Add("foo");

foreach (FileStream stream in list)
{
    ...
}

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

Ответ 2

Хороший вопрос. Прочитайте эту запись в wikipedia, здесь выдержка:

Бенджамин С. Пирс, автор типов и языки программирования и дополнительные Типы и языки программирования, говорит, "Я провел несколько недель... пытаясь сортировать из терминологии" сильно напечатано "," статически типизировано "," безопасно ", и т.д., и нашел это удивительно сложно.... Использование этих условий настолько разнообразна, что их почти бесполезно".

Ответ 3

"Тип Safe" означает, что не задействовано литье и ошибок типа времени выполнения.

Некоторые люди утверждают, что "Сильно напечатанное" ничего не значит, или "это хорошо", или "мне удобно с ним".

В любом случае "Тип Safe" относится к части кода или API, когда "Strongly Typed" относится ко всему языку или платформе.

Ответ 4

Они в основном такие же, это просто вопрос интерпретации:

Из Википедии:

Тип безопасности:

Тип безопасности является синонимом одного из многих определений сильной типизации; но тип безопасности и динамическая типизация взаимно совместимы. Динамически типизированный язык, такой как Smalltalk, можно рассматривать как строго типизированный язык с очень разрешительной системой типов, где любая синтаксически правильная программа хорошо типизирована; пока его динамическая семантика гарантирует, что никакая такая программа никогда не "ошибается" в соответствующем смысле, она удовлетворяет вышеприведенному определению и может быть названа безопасным по типу.

Ответ 5

ype safe означает предотвращение доступа программ к памяти за пределами общедоступных свойств объекта. Когда код не является безопасным для типа, могут возникать нежелательные побочные эффекты. Тип-безопасность важна для изоляции сборки и обеспечения безопасности. Когда код является безопасным по типу, среда выполнения общего языка может полностью изолировать сборки друг от друга.