Какие задачи решают системы типов
От: Temoto  
Дата: 06.01.10 13:11
Оценка:
Привет.

Расскажите, пожалуйста, зачем нужны системы типов. Какие задачи они решают?

Например, очевидно, что типы позволяют производить проверки корректности кода, диспатчить полиморфизмы типа оператора сложения (хотя здесь я не уверен).
системы типов типы
Re: Какие задачи решают системы типов
От: FDSC Россия consp11.github.io блог
Дата: 11.01.10 17:49
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Привет.


T>Расскажите, пожалуйста, зачем нужны системы типов. Какие задачи они решают?


T>Например, очевидно, что типы позволяют производить проверки корректности кода, диспатчить полиморфизмы типа оператора сложения (хотя здесь я не уверен).


Полиморфизмы можно и без типов сделать

Ну, вообще говоря они позволяют использовать код повторно при наследовании (доопределение методов и полей, полиморфизм), приводить типы вверх по дереву и унифицированно обращаться с ними, дают компилятору информацию о том как именно хранить и что хранить в объекте (иначе каждый объект должен быть словарём переменных), ограничивать область видимости методов (икапсуляция, абстрагирование), предоставлять стандартные интерфейсы без реализации

Это то, что сразу на ум приходит.
Re[2]: Какие задачи решают системы типов
От: Temoto  
Дата: 11.01.10 18:04
Оценка:
T>>Расскажите, пожалуйста, зачем нужны системы типов. Какие задачи они решают?

T>>Например, очевидно, что типы позволяют производить проверки корректности кода, диспатчить полиморфизмы типа оператора сложения (хотя здесь я не уверен).


Спасибо за ответ.

FDS>Полиморфизмы можно и без типов сделать


Можно поподробнее? Как компилятор узнает какую именно реализацию оператора сложения подставить, если ему неизвестен тип операндов?
Re[2]: Какие задачи решают системы типов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 11.01.10 18:05
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Полиморфизмы можно и без типов сделать


Исходя из определения полиморфизма — это вряд ли.
Re[3]: Какие задачи решают системы типов
От: FDSC Россия consp11.github.io блог
Дата: 11.01.10 18:09
Оценка:
Здравствуйте, Temoto, Вы писали:

FDS>>Полиморфизмы можно и без типов сделать


T>Можно поподробнее? Как компилятор узнает какую именно реализацию оператора сложения подставить, если ему неизвестен тип операндов?


У вас во всех операндах должен быть определён один и тот же метод "+", который хранится в словаре методов. Компилятор, точнее интерпретатор, посмотрит на то, что все методы в объектах одинаковые, и применит их соотв. образом.
Re[3]: Какие задачи решают системы типов
От: FDSC Россия consp11.github.io блог
Дата: 11.01.10 18:11
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, FDSC, Вы писали:


FDS>>Полиморфизмы можно и без типов сделать


S>Исходя из определения полиморфизма — это вряд ли.


отсюда

Полиморфизм (polymorphism) (от греческого polymorphos) — это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач.


Чем вам мешает это определение, если нет типов?
Re[4]: Какие задачи решают системы типов
От: Курилка Россия http://kirya.narod.ru/
Дата: 11.01.10 18:12
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Здравствуйте, Temoto, Вы писали:


FDS>>>Полиморфизмы можно и без типов сделать


T>>Можно поподробнее? Как компилятор узнает какую именно реализацию оператора сложения подставить, если ему неизвестен тип операндов?


FDS>У вас во всех операндах должен быть определён один и тот же метод "+", который хранится в словаре методов. Компилятор, точнее интерпретатор, посмотрит на то, что все методы в объектах одинаковые, и применит их соотв. образом.


Т.е. "во всех операндах должен быть определён" тип с методом "+" ?
Re[5]: Какие задачи решают системы типов
От: FDSC Россия consp11.github.io блог
Дата: 11.01.10 18:16
Оценка: :)
Здравствуйте, Курилка, Вы писали:

FDS>>У вас во всех операндах должен быть определён один и тот же метод "+", который хранится в словаре методов. Компилятор, точнее интерпретатор, посмотрит на то, что все методы в объектах одинаковые, и применит их соотв. образом.


К>Т.е. "во всех операндах должен быть определён" тип с методом "+" ?


Совершенно не обязательно. Если допустить, что для каждого объекта можно добавлять свой метод, то мы не нуждаемся в типах вообще.
Re[4]: Какие задачи решают системы типов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 11.01.10 18:20
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>>>Полиморфизмы можно и без типов сделать


S>>Исходя из определения полиморфизма — это вряд ли.


FDS>отсюда

FDS>

FDS>Полиморфизм (polymorphism) (от греческого polymorphos) — это свойство, которое позволяет одно и то же имя использовать для решения двух или более схожих, но технически разных задач.


FDS>Чем вам мешает это определение, если нет типов?


Ни чем. Я не считаю это за определение.
Re[6]: Какие задачи решают системы типов
От: deniok Россия  
Дата: 11.01.10 18:29
Оценка:
Здравствуйте, FDSC, Вы писали:

К>>Т.е. "во всех операндах должен быть определён" тип с методом "+" ?


FDS>Совершенно не обязательно. Если допустить, что для каждого объекта можно добавлять свой метод, то мы не нуждаемся в типах вообще.


А одинаковая совокупность добавленных к объекту методов не порождает общности этих объектов, могущей быть при этом названной типом? Кто-то может в них и не нуждаться, но по факту они будут существовать, нес па?
Re[6]: Какие задачи решают системы типов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 11.01.10 18:29
Оценка: +2
Здравствуйте, FDSC, Вы писали:

FDS>Здравствуйте, Курилка, Вы писали:


К>>Т.е. "во всех операндах должен быть определён" тип с методом "+" ?


FDS>Совершенно не обязательно. Если допустить, что для каждого объекта можно добавлять свой метод, то мы не нуждаемся в типах вообще.


В таком случае тип будет отождествлен с совокупностью методов, добавленных к объекту. Это динамическая типизация, но тем не менее, типизация.
Re[4]: Какие задачи решают системы типов
От: Temoto  
Дата: 11.01.10 19:11
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Здравствуйте, Temoto, Вы писали:


FDS>>>Полиморфизмы можно и без типов сделать


T>>Можно поподробнее? Как компилятор узнает какую именно реализацию оператора сложения подставить, если ему неизвестен тип операндов?


FDS>У вас во всех операндах должен быть определён один и тот же метод "+", который хранится в словаре методов. Компилятор, точнее интерпретатор, посмотрит на то, что все методы в объектах одинаковые, и применит их соотв. образом.


Хм.. допустим все значения являются объектами (в смысле словарями имя:метод), хотя это уже очень сильное допущение, в изначальном вопросе его не было.
Допустим также, что в каких-то двух объектах a и b есть метод "+". Какую сигнатуру имеет этот метод?
Допустим, что a это число 5, а b это число 3. Очевидно, что в этих объектах "методы + одинаковые". Какова последовательность действий (логических выводов?) компилятора чтобы применить реализацию plus_int_int :: Int -> Int -> Int?

В конце концов всё сведется к вызову какой-то низкоуровневой функции, которая ожидает конкретные аргументы. Пусть даже это будет x86 инструкция ADD, суть тут не меняется.

Вопрос был не про то, что полиморфизм можно представить/записать, а про то, как его диспатчить, то есть собственно вызывать конкретные реализации.
Re[2]: Какие задачи решают системы типов
От: Temoto  
Дата: 11.01.10 19:35
Оценка:
T>>Расскажите, пожалуйста, зачем нужны системы типов. Какие задачи они решают?

T>>Например, очевидно, что типы позволяют производить проверки корректности кода, диспатчить полиморфизмы типа оператора сложения (хотя здесь я не уверен).


FDS>Полиморфизмы можно и без типов сделать


FDS>Ну, вообще говоря они позволяют использовать код повторно при наследовании (доопределение методов и полей, полиморфизм), приводить типы вверх по дереву и унифицированно обращаться с ними, дают компилятору информацию о том как именно хранить и что хранить в объекте (иначе каждый объект должен быть словарём переменных), ограничивать область видимости методов (икапсуляция, абстрагирование), предоставлять стандартные интерфейсы без реализации


Хранение — бесспорно, спасибо.

Ограничение видимости... вот в питоне, например, ограничение *видимости* делается как раз без типов. Когда метод называется с двух подчёркиваний, его ровно с таким именем "снаружи" не видно. Его видно иначе, как Class__name, но это детали. В гипотетическом языке можно сделать синтаксической ошибкой x.__foo() и не ошибкой this.__foo(); если при этом this будет зарезервированным словом, и любому объекту можно добавить метод __foo "на лету" — получается ограничение без типов.

Ещё интересно подробнее про "приводить типы вверх по дереву и унифицированно обращаться с ними". Система типов позволяет приводить типы вверх по дереву. Честно говоря, я не понял фразу.

И про это тоже: "предоставлять стандартные интерфейсы без реализации". В гипотетическом языке каждый объект это словарь имя:метод (хороший пример — Javascript). Вы вызываете метод length, чтобы получить длину объекта dreams (допустим это список снов). Не совсем понятно, имеет ли тут место "предоставление интерфейсов" или нет. Вроде всё работает, в документации описан интерфейс: length :: Object -> Int, однако назначать для этого специальный тип объекту dreams не нужно.
Re: Какие задачи решают системы типов
От: Temoto  
Дата: 11.01.10 19:49
Оценка:
T>Расскажите, пожалуйста, зачем нужны системы типов. Какие задачи они решают?

Попробую подытожить.

Типы позволяют:

Было мнение, что диспатчить полиморфизм можно и без типов, но это не противоречит второму пункту. Остальное тоже можно делать и в рамках одного типа, но с разветвлённой системой — намного более эффективно.

Пока это всё, к сожалению, многие светлые умы обходят вопрос стороной.
Re[7]: Какие задачи решают системы типов
От: FDSC Россия consp11.github.io блог
Дата: 11.01.10 20:17
Оценка:
Здравствуйте, deniok, Вы писали:

D>А одинаковая совокупность добавленных к объекту методов не порождает общности этих объектов, могущей быть при этом названной типом? Кто-то может в них и не нуждаться, но по факту они будут существовать, нес па?


Как вы правильно сказали, наоборот, порождает, а вовсе не требует эту самую систему типов
Re[7]: Какие задачи решают системы типов
От: FDSC Россия consp11.github.io блог
Дата: 11.01.10 20:20
Оценка: -1
Здравствуйте, samius, Вы писали:

S>В таком случае тип будет отождествлен с совокупностью методов, добавленных к объекту. Это динамическая типизация, но тем не менее, типизация.


Это не так.
1. Нам совершенно не нужно знать тип объекта и отождествлять объект с его типом для того, чтобы реализовать полиморфизм некоторой операции
2. Тип может задаваться объектом и иметь только один экземпляр — говорить при этом о системе типов абсурдно.

Поэтому мы всегда можем сказать, что типизация для полиморфизма нам не нужна, хотя в общем и целом в реальной программе так или иначе некоторые вещи можно будет выделить как типы, что, однако, не означает, что сам язык будет содержать такое понятие как "тип".
Re[3]: Какие задачи решают системы типов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 11.01.10 20:26
Оценка:
Здравствуйте, Temoto, Вы писали:

FDS>>Ну, вообще говоря они позволяют использовать код повторно при наследовании (доопределение методов и полей, полиморфизм), приводить типы вверх по дереву и унифицированно обращаться с ними, дают компилятору информацию о том как именно хранить и что хранить в объекте (иначе каждый объект должен быть словарём переменных), ограничивать область видимости методов (икапсуляция, абстрагирование), предоставлять стандартные интерфейсы без реализации


T>Хранение — бесспорно, спасибо.

Здесь есть варианты. Например, процедурные типы данных. Очевидно, что процедура имеет тип, но этот тип ничего не говорит компилятору/интерпретатору о способе хранения данных. Тип процедуры не то же самое, что тип данных, тем не менее процедуры позволяют хранить данные в форме отличном от "словаря переменных".

T>Ещё интересно подробнее про "приводить типы вверх по дереву и унифицированно обращаться с ними". Система типов позволяет приводить типы вверх по дереву. Честно говоря, я не понял фразу.

Речь идет о дереве наследования в традиционных ООП языках, т.е. интерпретация производных типов в качестве базовых. Кроме приведения upcast существует и приведение downcast. Система типов в случае downcast-а должна контроллировать корректность приведения.

T>И про это тоже: "предоставлять стандартные интерфейсы без реализации". В гипотетическом языке каждый объект это словарь имя:метод (хороший пример — Javascript). Вы вызываете метод length, чтобы получить длину объекта dreams (допустим это список снов). Не совсем понятно, имеет ли тут место "предоставление интерфейсов" или нет. Вроде всё работает, в документации описан интерфейс: length :: Object -> Int, однако назначать для этого специальный тип объекту dreams не нужно.

Здесь опять-таки слово интерфейс употребляется в контексте традиционных ООП языков. Аналог в хаскеле — класс типов, т.е. декларация того, что для некоторых типов должна существовать совокупность методов.
Re[5]: Какие задачи решают системы типов
От: FDSC Россия consp11.github.io блог
Дата: 11.01.10 20:29
Оценка:
Здравствуйте, 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>Вопрос был не про то, что полиморфизм можно представить/записать, а про то, как его диспатчить, то есть собственно вызывать конкретные реализации.


По-моему я и отвечал на этот вопрос, разве нет?
Re[5]: Какие задачи решают системы типов
От: FDSC Россия consp11.github.io блог
Дата: 11.01.10 20:31
Оценка:
Здравствуйте, samius, Вы писали:

S>Ни чем. Я не считаю это за определение.


Ну а я не считаю за определение ваше определение. И?
Полиморфизм не обязан привязываться к типам и может не оперировать такими понятиями как "тип".
Re[6]: Какие задачи решают системы типов
От: samius Япония http://sams-tricks.blogspot.com
Дата: 11.01.10 20:36
Оценка:
Здравствуйте, 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>Тогда им соответствует функция конкантенации, т.е. совмещения двух областей памяти в одну последовательно.

И чем же здесь являются понятия "числа" и "строки"?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.