Обсуждение:Динамическая типизация

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Разве Perl и JavaScript обладают динамической типизацией? Там вроде все переменные строкового типа (В Javascript хэши/квазиобъекты), а при операциях над ними происходит приведение к нужному типу. В памяти они хранятся независимо от типа, в отличие от, например, PHP, где переменная со значением "1" может быть как строковой, так и int/float, что можно узнать выведя type_of() Krishna 12:52, 18 ноября 2007 (UTC)[ответить]

Ну в этом легко убедиться на примере:
  • Вот для JavaScript: объявляю переменную как строку, вывожу строку, потом туда пишу int, вижу его, +2 даёт int 3, потом складываю со строкой, получаю "3string2" - что это, ежели не динамическая типизация?
<html><head><title>test</title></head>
<body>
<script type="text/javascript">
function DoTest(obj) {
  var res = "string1";
  alert(res);

  res = 1;
  alert(res);

  res += 2;
  alert(res);

  res += 'string2';
  alert(res);
}
</script>
<a href="#" onClick="DoTest()">Click to test</a>
</body></html>
Вы смешиваете динамическую типизацию и неявное приведение типов. Для динамической типизации необходимо и достаточно, чтобы тип переменной или параметра определялся не во время компиляции, а во время исполнения программы. Так, скажем, у Smalltalk-а типизация вполне себе динамическая, но на такие фокусы со складыванием строк с числами он выругается. Причём (важный момент) выругается ровно тогда, когда в процессе выполнения программы наткнётся на эту строчку. Ровно то же самое относится к питону - типизация динамическая, а неявного приведения типов нет. --Eugenius 09:43, 17 ноября 2008 (UTC)[ответить]
Согласен, ну вот если мы можем менять тип присвоением (как в двух первых присвоениях в примере), то это показывает тип переменной дается во время исполнения, а вот вторые два присвоения демонстрируют неявное приведение, это - да. Timur.shemsedinov 13:56, 17 ноября 2008 (UTC)[ответить]

Пространства имен[править код]

Заметил такой факт: в языках со статической типизацией есть отдельные пространства имен как минимум для переменных и функций/методов, с динамической оно одно на всё.

Примеры не соответствуют тематике статьи[править код]

Путаете строгую/слабую типизацию и динамическую/статическую.

Динамическая/статическая типизации - это о том, КОГДА вы получаете информацию о типе. В динамически типизированных языках эта информация получается в рантайме, в статически типизированных - на этапе компиляции.

Строгая/слабая типизации - это о том, КАК строго язык проверяет тип при передаче в функцию. Иными словами, это о том, использует ли язык неявное привидение типов.

За OPascal не скажу, не знаком, но примеры с PHP/Python/JS -- это примеры о разнице строгости/слабости типизации. Более корректными примерами было бы сравнение строгого статически типизированного языка (например OCaml, Haskell) со строгим динамически типизированным языком (например Racket, SBCL, Python). Или же слабого статически типизированного языка (например C, Java) со слабым динамически типизированным языком (например PHP, JS).

А сравнение PHP/Python/JS - это вообще не понятно для чего. Примеры в этом виде не дают читателю никакого представления о плюсах-минусах динамической типизации.