Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Nick_, Вы писали:
А>>>"Динамически типизированный" и бестиповый — это одно и то же.
N_>>Сомнительное утверждение. Не мог бы ты это обосновать?
А>Некоторая сущность (в данном случае тип) присутствует в языке, если в нем имеются средства для её выражения. В противном случае все эти "типы" существуют только в нашем сознании, но никак ни в программах, ни в языке.
Плохо ищете типы в языке. Если бы типы отсутствовали, например, в языке Erlang, а существовали только в моем сознании, то и паттерн-матчинг я мог бы выполнять только в своем сознании. Однако то, что с этим вполне справляется Erlang runtime — это факт, причем этот факт доказан многочисленными независимыми экспериментами.

Из которых большинство людей, которые представляют себе устройство компилятора и рантайма, делают вывод о наличии информации о типах (каждое значение в динамически типизированном языке сопровождается информацией о его типе, JFYI, иначе динамическая типизация работать не будет), и о происходящих во время выполнения проверках типов.
Вывод об отсутствии типов (sic!) в динамически типизированных языках экстравагантен, и, гхм,

экспериментально не подтверждается, как, впрочем, и априорно — достаточно прочесть
любой мануал по
любому динамически типизированному языку.
Термин же "бестиповый" в специализированной литературе не распространен, а встречается исключительно в форумах и мэйллистах. Где его часто берут в кавычки, и сразу же поясняют "в том смысле, что...". Единственно где видал "бестиповый" в литературе — это у Дяхтеренко на софткрафте. Его труд, впрочем, во многих аспектах не отличается научной точностью, хоть и в целом там все в порядке. И вообще, посчитайте количество ссылок в гугле по сочетанию "бестиповый язык", прежде чем говорить о распространенности термина (десятки страниц).
И это неспроста. Сложно называть "бестиповыми" языки, к которым существуют системы типов, это нонсенс (soft type system — не меняющая семантики динамически типизированного языка система типов, которая используется для выведения типов и статической их проверки). Для лиспа их целых три (реализованных в ряде тулзов), для эрланга несколько штук (статической проверкой типов занимается т. н. Dyalizer), для JScript автор ее описал подробно в своем блоге — еще бы, компилятор JScript, как и многие современные компляторы динамически типизированных языков, выполняет type inference — как здесь без системы типов? Так что у кого-то типы может и существуют в сознании, но только не у людей, занимающихся компиляторами.
А>>>Полиморфизм нужен чтобы обходить ограничения, накладываемые системой типов. Если никаких
А>>>ограничений нет, значит нет и типов и полиморфизм ни к чему.
N_>>Разные системы типов, естественно, накладывают разные ограничения на программу. Но полиморфизм — это не сбоку приделка к простой системе типов, а ее обобщение.
А>Ну правильно, обобщение. Но вот зачем понадобилось это обобщение? Очевидно, как раз потому, что ограничения, накладываемые мономорфной системой типов слишком серьезные.
Не правильно, не обобщение. И никто его специально не придумывал, это элементарное наблюдение.
Полиморфной функцией называется функция, способная принимать аргументы разных типов. А все остальное существует только в вашем сознании. Можете верить,

можете нет, но именно это,
не зависящее от языка программирования определение используется или подразумевается в специализированной литературе.
Кстати, нам понадобится
определение типа. Нестрого, но по существу верно: тип определяется
множеством значений + правилами преобразования из/в другие типы. Абстрактные типы данных — это более специальный случай — они определяются только набором допустимых операций над ними (не структурой, но при этом у ADT все равно есть множество значений). Определение "подтипа" нам не понадобится — полиморфизм в общем случае не завязан на подтипы.
Функция в Visual Basic, принимающая значение типа вариант — полиморфна. Функция printf из стандарной либы C — полиморфна. Виртуальная функция (метод) класса — полиморфна, так как объект является неявным параметром (а с точки зрения вызывающего эта функция выглядит как одна функция, и неважно, что ее определение раскидано по разным классам). Шаблонная функция в языке С++ полиморфна. Любой метод в языке Smalltalk полиморфен по всем аргументам. Любой вызов в динамически типизированном языке полиморфен по определению, так как любое значение несет информацию о типе. То, как реализуется полиморфизм — дело десятое, это вопрос синтаксиса и семантики языка.
Полиморфизм подразделяется на
исскуственный (если программист явно передает функции информацию о типе, как например в printf; в этом случае говорят, что полиморфизм языком не поддерживается, но это не мешает определить полиморфную функцию, используя
специальные соглашения о передаче информации о типе. Полиморфизм не поддерживается языками С, Forth, Pascal) и
естественный (если информация о типе передается неявно, т. е. средствами языка — это виртуальные функции, вызовы в динамически типизированных языках, итд).
Также, полиморфизм подразделяется на
ad-hoc (разное действие для аргумента разного типа — printf, виртуальные функции) и
параметрический (одинаковое действие для аргументов разных типов — например функция append для объекта "очередь" в языках Erlang, Java, Smalltalk).
Можно также выделить полиморфизм времени выполнения и компиляции, но
для динамически типизированных языков смысловой разницы нет (вот оно, единственное место, где полиморфизм пересекается с динамической типизацией).
И все.
Вот эта "теория" не противоречит здравому смыслу,
не приводит к парадоксальным выводам "по определению", и реально описывает то общее, что есть в системах типов и полиморфизме
разных языков программирования. Примерно в таком виде она преподается на ВМиК МГУ. Разумеется, прекрасно согласуясь с практикой. И с печатными работами

.