4

Является ли качество языка, где не требуется объявлять тип переменных (например, PHP и Perl), известный как слабая типизация или динамическая типизация? У меня возникли проблемы с моей головой вокруг двух условий.Является ли качество языка, где не требуется объявлять тип переменных пример слабого ввода или динамического ввода

Я прав, что динамическое/статическое типирование относится к преобразованию типов, тогда как слабая/сильная типизация относится к замедлению переменной?

+2

Нет, одна вещь не должны делать с Другие. C# не всегда требует, чтобы вы объявляли тип, потому что он имеет «тип вывода»; то есть он может определить в контексте, что такое тип. Но он по-прежнему является строго типизированным языком. –

ответ

3

В соответствии с: http://en.wikipedia.org/wiki/Type_system#Static_and_dynamic_type_checking_in_practice

Weak typing means that a language implicitly converts (or casts) types when used.

тогда:

A programming language is said to use static typing when type checking is performed during compile-time as opposed to run-time.

Так, сильное/слабое и статический/динамический две разные размеры. Язык будет одним из сильных/слабых, а также одним из статических динамических. Например, Ruby и Javascript динамически типизируются, но Ruby строго типизирован, а Javascript слабо типизирован. То есть, в Ruby, следующий код с выдаст ошибку:

1.9.2p290 :001 > 'a'+1 
TypeError: can't convert Fixnum into String 

, тогда как в JavaScript, вы получите:

> 'a'+1 
>> 'a1' 

Таким образом, строго типизированный язык требует, чтобы преобразовать две переменные к тому же типу чтобы скомбинировать их (например, с использованием 1.to_s), в то время как слабо типизированный язык попытается принудить две переменные к одному и тому же типу, используя некоторую дополнительную встроенную логику языка - в случае JavaScript, комбинирование чего-либо с String будет конвертировать это значение строки.

См.: http://www.artima.com/weblogs/viewpost.jsp?thread=7590 для получения более подробного объяснения.

0

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

Скажем, в C# У меня есть этот класс:

public class Foo 
{ 
    public int Bar; 
    public double Baz; 
} 

И я объявить переменную типа Foo:

var myFoo = new Foo(); 

Когда я ссылаться на Foo, как это:

foo. 

Visual Studio отобразит список, содержащий Bar и Baz, когда я набираю ., потому что он уже знает, что myFoo содержит этих членов; он имеет тип Foo. Это сильная типизация; это означает, что если я пропущу Bar или Baz, моя программа даже не будет компилироваться.

Однако, скажем, я объявить переменную типа dynamic Это вызывает объект привязки быть отложено, пока программа не будет выполнена:

dynamic myFoo = new Foo(); 
myFoo.Grapes = 6; 

будет скомпилирован. Я не получу ошибку, пока программа не будет запущена; исключение из среды выполнения будет выбрано потому, что Grapes не существует на Foo.

0

Это старый вопрос, но и для будущих читателей эта большая статья может очистить вещи: http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html

Это своего рода долго, но это определенно стоит.

Сильные и слабые Typing:

Probably the most common way type systems are classified is "strong" or "weak." This is unfortunate, since these words have nearly no meaning at all. It is, to a limited extent, possible to compare two languages with very similar type systems, and designate one as having the stronger of those two systems. Beyond that, the words mean nothing at all.

Статические и динамические типы

This is very nearly the only common classification of type systems that has real meaning. As a matter of fact, it's significance is frequently under-estimated [...] Dynamic and static type systems are two completely different things, whose goals happen to partially overlap.

A static type system is a mechanism by which a compiler examines source code and assigns labels (called "types") to pieces of the syntax, and then uses them to infer something about the program's behavior. A dynamic type system is a mechanism by which a compiler generates code to keep track of the sort of data (coincidentally, also called its "type") used by the program. The use of the same word "type" in each of these two systems is, of course, not really entirely coincidental; yet it is best understood as having a sort of weak historical significance. Great confusion results from trying to find a world view in which "type" really means the same thing in both systems. It doesn't.

Явные/неявные типы:

When these terms are used, they refer to the extent to which a compiler will reason about the static types of parts of a program. All programming languages have some form of reasoning about types. Some have more than others. ML and Haskell have implicit types, in that no (or very few, depending on the language and extensions in use) type declarations are needed. Java and Ada have very explicit types, and one is constantly declaring the types of things. All of the above have (relatively, compared to C and C++, for example) strong static type systems.

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

  • Нет связанных вопросов^_^