значит отделять одно от другого в независимые классы - неправильно
Нет, неправильно валить всё в одну кучу, потому что не может сложиться ситуации, когда из-за логической ошибки нужного метода вообще не найдётся - в противоположность типичной ситуации при динамической типизации.
Почему же в одну кучу? Одна куча лишь по общему предку, а так да - функции отдельно от переменных, поскольку действительно разные понятия.
Ну и непонятно - почему "не может сложиться ситуации", когда может? Если параметр нетипизирован в момент компиляции, то в момент выполнения там может быть что угодно, а значит это абсолютно обязательное условие для работоспособности такой программы - проверять на несовпадение типов и бросать ошибку.
например типы float и int занимающие 4 байта, могут быть помещены в одно и то же место в памяти и далее использующая это значение функция выполнит с ними операции того типа, который предполагал увидеть программист, и в одном из случаев действительно будет логическая ошибка из-за разницы форматов float и int
Это вообще не имеет никакого отношения к системе типов языка. (Можно подумать, что, например, в C# нельзя запихнуть float вместо int или наоборот.)
Ну как же не имеет? В сях есть такие типы? В плюсах есть? Там ещё и юнионы из таких типов есть, что бы жизнь мёдом не казалась. И именно с такими типами работает С. Это для него основа, всё остальное - по сути вне языка, то есть язык позволяет собрать произвольную структуру, но в самом языке её ведь нет.
-- 07.12.2018, 15:46 --словарь функций, перебираемый во время исполнения
Зачем его перебирать, словарь — это ведь просто запись из методов и ссылок на словари суперклассов. Каждому методу в этой структуре соответствует единственный путь.
Ну и что, если путь единственный? Его ведь тоже нужно выбрать из нескольких. А значит нужен некий поиск. Алгоритм поиска может и не использовать полный перебор, но поскольку мы не об алгоритме, то в общем виде там именно перебор. А в частных случаях с применением конкретных алгоритмов - перебор можно ограничить. Но ведь конкретный алгоритм не указан, так откуда мы знаем, что там ограничено?
и точно так же тип функции невозможно определить статически, если ей даются на вход нетипизированные параметры
Но ей не передаются нетипизированные параметры, пока мы о позднем связывании в статических языках.
Вообще да, здесь присутствует некоторый сумбур. Сначала речь зашла о типизации, далее о вызове функций, далее конкретизировали вызов фразой "позднее связывание". По ходу этой пьессы "показания менялись" в зависимости от того контекста, которым в данный момент оперировал автор.
При позднем связывании на примере
C++ происходит передача параметров в виде класса предка, а в реальности там может быть некий наследник, поэтому для конкретного наследника во время выполнения подбирается подходящий метод. Но представим себе ситуацию, когда наследник не подходит под дефолтную обработку, но обязательно требует наличия эксклюзивного метода именно для него. А метод написать забыли, либо не успели, либо ещё что. Что произойдёт тогда? Произойдёт логическая ошибка.
Ну и нетипизированные функции, а ля
JavaScript, это так же один из вариантов, но в нём строгость типизации понижена до общего предка уровня
Object. То есть тип вроде есть, но по сути его нет.
И так же был разговор про мультиметоды. Но здесь вообще всё зависит от реализации, а конкретный язык не указан, поэтому здесь вообще полная свобода трактовок - как их вызывать и что будет дальше.
Вот отсюда и нестыковки. Точнее - разногласия из-за того, что каждый хочет видеть свой контекст, а про другие пока не думает.
Поэтому что бы строго что-то определять - нужно строго задать контекст. И тогда да, тогда можно копаться в логических ошибках друг друга.
это тип, а не его отсутствие, потому что система типов его умеет выражать и работает с ним регулярным в сравнении с остальными образом
Да, но в контексте
JavaScript тип вроде есть, но по сути его нет. То есть всё опять про контекст.
То есть здесь нет самой возможности во время исполнения определить тип.
Это отдельная шкала: есть ли RTTI/reflection (конечно, может быть разница в доступности той или иной информации из этого набора пользователю языка, но здесь она несущественна). Есть статические языки с рудиментарным отражением, необходимым для тех проверок, которые пришлось сделать динамическими, а в динамических языках с таким просто почти нет толку, если это не язык машинных команд чего-нибудь.
Reflection использует программист, а компилятору эта штука не нужна, поскольку у него данные о программе уже присутствуют во вполне полноценном виде (готовые сложные структуры вместо рефлективно найденных простых списков или чего-то подобного). Компилятор видит - этот тип не определён, а потому вставляет в готовый код проверку на реально поступивший на вход тип, ну и далее добавляет вызов функции поиска подходящего метода/функции, а рефлексия при этом никак не участвует, потому что все данные для анализа уже есть в виде дерева разбора, зачем ещё что-то искать?