Расскажите, пожалуйста, зачем нужны системы типов. Какие задачи они решают?
Например, очевидно, что типы позволяют производить проверки корректности кода, диспатчить полиморфизмы типа оператора сложения (хотя здесь я не уверен).
Здравствуйте, Temoto, Вы писали:
T>Привет.
T>Расскажите, пожалуйста, зачем нужны системы типов. Какие задачи они решают?
T>Например, очевидно, что типы позволяют производить проверки корректности кода, диспатчить полиморфизмы типа оператора сложения (хотя здесь я не уверен).
Полиморфизмы можно и без типов сделать
Ну, вообще говоря они позволяют использовать код повторно при наследовании (доопределение методов и полей, полиморфизм), приводить типы вверх по дереву и унифицированно обращаться с ними, дают компилятору информацию о том как именно хранить и что хранить в объекте (иначе каждый объект должен быть словарём переменных), ограничивать область видимости методов (икапсуляция, абстрагирование), предоставлять стандартные интерфейсы без реализации
T>>Расскажите, пожалуйста, зачем нужны системы типов. Какие задачи они решают?
T>>Например, очевидно, что типы позволяют производить проверки корректности кода, диспатчить полиморфизмы типа оператора сложения (хотя здесь я не уверен).
Спасибо за ответ.
FDS>Полиморфизмы можно и без типов сделать
Можно поподробнее? Как компилятор узнает какую именно реализацию оператора сложения подставить, если ему неизвестен тип операндов?
Здравствуйте, Temoto, Вы писали:
FDS>>Полиморфизмы можно и без типов сделать
T>Можно поподробнее? Как компилятор узнает какую именно реализацию оператора сложения подставить, если ему неизвестен тип операндов?
У вас во всех операндах должен быть определён один и тот же метод "+", который хранится в словаре методов. Компилятор, точнее интерпретатор, посмотрит на то, что все методы в объектах одинаковые, и применит их соотв. образом.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, FDSC, Вы писали:
FDS>>Полиморфизмы можно и без типов сделать
S>Исходя из определения полиморфизма — это вряд ли.
Полиморфизм (polymorphism) (от греческого polymorphos) — это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач.
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, Temoto, Вы писали:
FDS>>>Полиморфизмы можно и без типов сделать
T>>Можно поподробнее? Как компилятор узнает какую именно реализацию оператора сложения подставить, если ему неизвестен тип операндов?
FDS>У вас во всех операндах должен быть определён один и тот же метод "+", который хранится в словаре методов. Компилятор, точнее интерпретатор, посмотрит на то, что все методы в объектах одинаковые, и применит их соотв. образом.
Т.е. "во всех операндах должен быть определён" тип с методом "+" ?
Здравствуйте, Курилка, Вы писали:
FDS>>У вас во всех операндах должен быть определён один и тот же метод "+", который хранится в словаре методов. Компилятор, точнее интерпретатор, посмотрит на то, что все методы в объектах одинаковые, и применит их соотв. образом.
К>Т.е. "во всех операндах должен быть определён" тип с методом "+" ?
Совершенно не обязательно. Если допустить, что для каждого объекта можно добавлять свой метод, то мы не нуждаемся в типах вообще.
Здравствуйте, FDSC, Вы писали:
FDS>>>Полиморфизмы можно и без типов сделать
S>>Исходя из определения полиморфизма — это вряд ли.
FDS>отсюда FDS>
FDS>Полиморфизм (polymorphism) (от греческого polymorphos) — это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач.
FDS>Чем вам мешает это определение, если нет типов?
Здравствуйте, FDSC, Вы писали:
К>>Т.е. "во всех операндах должен быть определён" тип с методом "+" ?
FDS>Совершенно не обязательно. Если допустить, что для каждого объекта можно добавлять свой метод, то мы не нуждаемся в типах вообще.
А одинаковая совокупность добавленных к объекту методов не порождает общности этих объектов, могущей быть при этом названной типом? Кто-то может в них и не нуждаться, но по факту они будут существовать, нес па?
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, Курилка, Вы писали:
К>>Т.е. "во всех операндах должен быть определён" тип с методом "+" ?
FDS>Совершенно не обязательно. Если допустить, что для каждого объекта можно добавлять свой метод, то мы не нуждаемся в типах вообще.
В таком случае тип будет отождествлен с совокупностью методов, добавленных к объекту. Это динамическая типизация, но тем не менее, типизация.
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, Temoto, Вы писали:
FDS>>>Полиморфизмы можно и без типов сделать
T>>Можно поподробнее? Как компилятор узнает какую именно реализацию оператора сложения подставить, если ему неизвестен тип операндов?
FDS>У вас во всех операндах должен быть определён один и тот же метод "+", который хранится в словаре методов. Компилятор, точнее интерпретатор, посмотрит на то, что все методы в объектах одинаковые, и применит их соотв. образом.
Хм.. допустим все значения являются объектами (в смысле словарями имя:метод), хотя это уже очень сильное допущение, в изначальном вопросе его не было.
Допустим также, что в каких-то двух объектах a и b есть метод "+". Какую сигнатуру имеет этот метод?
Допустим, что a это число 5, а b это число 3. Очевидно, что в этих объектах "методы + одинаковые". Какова последовательность действий (логических выводов?) компилятора чтобы применить реализацию plus_int_int :: Int -> Int -> Int?
В конце концов всё сведется к вызову какой-то низкоуровневой функции, которая ожидает конкретные аргументы. Пусть даже это будет x86 инструкция ADD, суть тут не меняется.
Вопрос был не про то, что полиморфизм можно представить/записать, а про то, как его диспатчить, то есть собственно вызывать конкретные реализации.
T>>Расскажите, пожалуйста, зачем нужны системы типов. Какие задачи они решают?
T>>Например, очевидно, что типы позволяют производить проверки корректности кода, диспатчить полиморфизмы типа оператора сложения (хотя здесь я не уверен).
FDS>Полиморфизмы можно и без типов сделать
FDS>Ну, вообще говоря они позволяют использовать код повторно при наследовании (доопределение методов и полей, полиморфизм), приводить типы вверх по дереву и унифицированно обращаться с ними, дают компилятору информацию о том как именно хранить и что хранить в объекте (иначе каждый объект должен быть словарём переменных), ограничивать область видимости методов (икапсуляция, абстрагирование), предоставлять стандартные интерфейсы без реализации
Хранение — бесспорно, спасибо.
Ограничение видимости... вот в питоне, например, ограничение *видимости* делается как раз без типов. Когда метод называется с двух подчёркиваний, его ровно с таким именем "снаружи" не видно. Его видно иначе, как Class__name, но это детали. В гипотетическом языке можно сделать синтаксической ошибкой x.__foo() и не ошибкой this.__foo(); если при этом this будет зарезервированным словом, и любому объекту можно добавить метод __foo "на лету" — получается ограничение без типов.
Ещё интересно подробнее про "приводить типы вверх по дереву и унифицированно обращаться с ними". Система типов позволяет приводить типы вверх по дереву. Честно говоря, я не понял фразу.
И про это тоже: "предоставлять стандартные интерфейсы без реализации". В гипотетическом языке каждый объект это словарь имя:метод (хороший пример — Javascript). Вы вызываете метод length, чтобы получить длину объекта dreams (допустим это список снов). Не совсем понятно, имеет ли тут место "предоставление интерфейсов" или нет. Вроде всё работает, в документации описан интерфейс: length :: Object -> Int, однако назначать для этого специальный тип объекту dreams не нужно.
T>Расскажите, пожалуйста, зачем нужны системы типов. Какие задачи они решают?
Попробую подытожить.
Типы позволяют:
производить проверку корректности кода,
диспатчить полиморфизмы,
выбирать способ представления данных в памяти.
Было мнение, что диспатчить полиморфизм можно и без типов, но это не противоречит второму пункту. Остальное тоже можно делать и в рамках одного типа, но с разветвлённой системой — намного более эффективно.
Пока это всё, к сожалению, многие светлые умы обходят вопрос стороной.
Здравствуйте, deniok, Вы писали:
D>А одинаковая совокупность добавленных к объекту методов не порождает общности этих объектов, могущей быть при этом названной типом? Кто-то может в них и не нуждаться, но по факту они будут существовать, нес па?
Как вы правильно сказали, наоборот, порождает, а вовсе не требует эту самую систему типов
Здравствуйте, samius, Вы писали:
S>В таком случае тип будет отождествлен с совокупностью методов, добавленных к объекту. Это динамическая типизация, но тем не менее, типизация.
Это не так.
1. Нам совершенно не нужно знать тип объекта и отождествлять объект с его типом для того, чтобы реализовать полиморфизм некоторой операции
2. Тип может задаваться объектом и иметь только один экземпляр — говорить при этом о системе типов абсурдно.
Поэтому мы всегда можем сказать, что типизация для полиморфизма нам не нужна, хотя в общем и целом в реальной программе так или иначе некоторые вещи можно будет выделить как типы, что, однако, не означает, что сам язык будет содержать такое понятие как "тип".
Здравствуйте, Temoto, Вы писали:
FDS>>Ну, вообще говоря они позволяют использовать код повторно при наследовании (доопределение методов и полей, полиморфизм), приводить типы вверх по дереву и унифицированно обращаться с ними, дают компилятору информацию о том как именно хранить и что хранить в объекте (иначе каждый объект должен быть словарём переменных), ограничивать область видимости методов (икапсуляция, абстрагирование), предоставлять стандартные интерфейсы без реализации
T>Хранение — бесспорно, спасибо.
Здесь есть варианты. Например, процедурные типы данных. Очевидно, что процедура имеет тип, но этот тип ничего не говорит компилятору/интерпретатору о способе хранения данных. Тип процедуры не то же самое, что тип данных, тем не менее процедуры позволяют хранить данные в форме отличном от "словаря переменных".
T>Ещё интересно подробнее про "приводить типы вверх по дереву и унифицированно обращаться с ними". Система типов позволяет приводить типы вверх по дереву. Честно говоря, я не понял фразу.
Речь идет о дереве наследования в традиционных ООП языках, т.е. интерпретация производных типов в качестве базовых. Кроме приведения upcast существует и приведение downcast. Система типов в случае downcast-а должна контроллировать корректность приведения.
T>И про это тоже: "предоставлять стандартные интерфейсы без реализации". В гипотетическом языке каждый объект это словарь имя:метод (хороший пример — Javascript). Вы вызываете метод length, чтобы получить длину объекта dreams (допустим это список снов). Не совсем понятно, имеет ли тут место "предоставление интерфейсов" или нет. Вроде всё работает, в документации описан интерфейс: length :: Object -> Int, однако назначать для этого специальный тип объекту dreams не нужно.
Здесь опять-таки слово интерфейс употребляется в контексте традиционных ООП языков. Аналог в хаскеле — класс типов, т.е. декларация того, что для некоторых типов должна существовать совокупность методов.
Здравствуйте, Temoto, Вы писали:
T>Хм.. допустим все значения являются объектами (в смысле словарями имя:метод), хотя это уже очень сильное допущение, в изначальном вопросе его не было.
В изначальном вопросе вообще ничего не было, я лишь просто абстрактно ответил на то, что такое возможно без типов, что не значит, что хотя бы один язык так делает
T>Допустим также, что в каких-то двух объектах a и b есть метод "+". Какую сигнатуру имеет этот метод?
Оператор плюс, насколько мне помнится, всегда был бинарным, сигнатуру имеет, соответственно, в виде двух объектов (любого типа, так как типизации у нас нет)
T>Допустим, что a это число 5, а b это число 3. Очевидно, что в этих объектах "методы + одинаковые". Какова последовательность действий (логических выводов?) компилятора чтобы применить реализацию plus_int_int :: Int -> Int -> Int?
Я думаю правильней object * object -> object
a и b есть два параметра, результат является вызовом функции, представляющей реализацию оператора "+"
Например,
a и b — числа
Тогда им соответствует функция сложения именно двух чисел (например, ассемблерная вставка или побитовое сложение соответствующей области памяти )
a и b — строки
Тогда им соответствует функция конкантенации, т.е. совмещения двух областей памяти в одну последовательно.
Интерпретатор ищет функцию "+", подставляет a и b в неё и получает некий результирующий объект. Всё (при динамической типизации).
Я что-то упустил?
T>В конце концов всё сведется к вызову какой-то низкоуровневой функции, которая ожидает конкретные аргументы. Пусть даже это будет x86 инструкция ADD, суть тут не меняется.
И?
T>Вопрос был не про то, что полиморфизм можно представить/записать, а про то, как его диспатчить, то есть собственно вызывать конкретные реализации.
Здравствуйте, FDSC, Вы писали:
T>>Допустим, что a это число 5, а b это число 3. Очевидно, что в этих объектах "методы + одинаковые". Какова последовательность действий (логических выводов?) компилятора чтобы применить реализацию plus_int_int :: Int -> Int -> Int?
FDS>Я думаю правильней object * object -> object
FDS>a и b есть два параметра, результат является вызовом функции, представляющей реализацию оператора "+" FDS>Например, FDS>a и b — числа FDS>Тогда им соответствует функция сложения именно двух чисел (например, ассемблерная вставка или побитовое сложение соответствующей области памяти ) FDS>a и b — строки FDS>Тогда им соответствует функция конкантенации, т.е. совмещения двух областей памяти в одну последовательно.
И чем же здесь являются понятия "числа" и "строки"?