Здравствуйте, samius, Вы писали:
S>>>"Объекты, которые можно складывать" FDS>>И кто же определил такой тип? Или по-вашему достаточно того, чтобы он фактически был, а синтаксическое определение и явное использование понятия "тип" не обязательно?
S>Нет, не обязательно. Существует толпа языков, не использующих тип явно, в отличии от языков, в которых бы не было типа совсем.
Т.е. это означает, что объект в этой толпе языков имеет множество типов вне одной ветки дерева, а так же информация об этом неявно типе где-то хранится, или нет?
FDS>>Такой операции не может быть, если у нас нет явно объявленных типов, т.к. в таком случае будет непонятно, какую из функций сложения вызывать S>В таком случае мне не понятно, что Вы имеет в виду под перегрузкой операторов вообще.
Я имею в виду, что для каждого объекта я могу задать свою операцию сложения, которая будет обладать одинаковым синтаксисом и именем для всех объектов, где операция задана, но работать в них по разному.
Здравствуйте, TimurSPB, Вы писали:
TSP>В инновационных проектах (особенно инет), которые постоянно меняются и развиваются, когда нужны быстрые решения — языки со слабой типизацией. Phyton, PHP, Ruby и etc.
Здравствуйте, deniok, Вы писали:
AVK>>Хм. А как тогда трактовать статический полиморфизм ввиде перегрузки функций по количеству аргументов? Вроде бы в этом случае типы не нужны, нет?
D>Это вопрос трактовки термина "тип". Если понимать его как способ классификации имеющихся сущностей, то разделение по арности — тоже род типизации.
Ну я понимаю, что презерватив и на глобус натянуть можно. Только это уже чистая софистика. Тип в контексте разговора должен быть чем то реально существующим, а не голой абстракцией.
Здравствуйте, FDSC, Вы писали:
FDS>>>Ну почему же, процедура имеет адрес, значит компилятор знает, сколько памяти под неё выделять, когда хранится указатель на неё. S>>Из адреса не выводится объем памяти )))
FDS>Из адреса выводится объём памяти на указатель, так же, как и для любого другого массива данных.
Что бы это значило?
FDS>>>Кроме этого, компилятор так же по типу процедуры определяет сколько места в стеке занимают данные. S>>Это не факт. Процедуры могут иметь один тип, но разные реализации.
FDS>Место в стеке, используемое для передачи параметров функции, а так же число, стоящее как операнд в команде RET для освобождения этой памяти, однозначно определяется сигнатурой функции и соглашением о её вызове.
Тем не менее две функции одной сигнатуры и соглашения о вызове могут иметь разные реализации, соответсвенно по-разному использовать стек внутри себя. Я не понимаю к чему все это, тип функции не определяет объем памяти, используемой функцией.
S>>Это когда вместо типа данных возвращается процедура, которая в свою очередь вернет данные при определенных обстоятельствах.
FDS>В данном случае компилятор знает, что данные хранятся как процедура — а больше ему и не нужно.
Компилятор об этом может и не знать
FDS>Я, признаться, ни разу не видел, чтобы при объявленном типе String прямо туда можно было бы запихнуть процедуру, а значит компилятор должен знать о том, что там хранится не сама строка, а процедура, т.е. имеет информацию о том, что эта процедура есть, нужно хранить указатель на неё, знает, как эту процедуру вызвать.
Прямо туда — это куда?
FDS>Таким образом, объявляя процедуру как способ получения данных мы всё равно сообщаем компилятору некоторую информацию о способе хранения данных и их получения (точнее, о том, что данные выражаются в адресе функции и факте её вызова).
О способе хранения — нет. О способе их получения — не факт. Эта информация может быть получена динамически.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, FDSC, Вы писали:
FDS>>В этой строке нет ни слова о классах — только об интерфейсах.
AVK>Хм, а некий известный заранее интерфейс может не являться типом?
Хм. Хм. Хмммм...
Скажем так: не обязательно, что этот интерфейс как-то отмечен и имеет название (см. спор про операцию "+"), следовательно, говорить о типе можно примерно так же, как говорить о конечном автомате в программе, где есть парсинг, который можно сделать путём объявления конечного автомата.
То бишь математически тип конечно есть, но фактически этот тип уже никому не нужен — он не помечается и не объявляется и сам термин "тип" можно не использовать.
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, samius, Вы писали:
FDS>>>И кто же определил такой тип? Или по-вашему достаточно того, чтобы он фактически был, а синтаксическое определение и явное использование понятия "тип" не обязательно?
S>>Нет, не обязательно. Существует толпа языков, не использующих тип явно, в отличии от языков, в которых бы не было типа совсем.
FDS>Т.е. это означает, что объект в этой толпе языков имеет множество типов вне одной ветки дерева, а так же информация об этом неявно типе где-то хранится, или нет?
Нет, не означает
S>>В таком случае мне не понятно, что Вы имеет в виду под перегрузкой операторов вообще.
FDS>Я имею в виду, что для каждого объекта я могу задать свою операцию сложения, которая будет обладать одинаковым синтаксисом и именем для всех объектов, где операция задана, но работать в них по разному.
Тогда операция сложения может задаваться лишь типом (ассоциацией с процедурой сложения) первого аргумента. Задание этой операции у второго аргумента не обязательно.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, deniok, Вы писали:
AVK>>>Хм. А как тогда трактовать статический полиморфизм ввиде перегрузки функций по количеству аргументов? Вроде бы в этом случае типы не нужны, нет?
D>>Это вопрос трактовки термина "тип". Если понимать его как способ классификации имеющихся сущностей, то разделение по арности — тоже род типизации.
AVK>Ну я понимаю, что презерватив и на глобус натянуть можно. Только это уже чистая софистика. Тип в контексте разговора должен быть чем то реально существующим, а не голой абстракцией.
мне показалось, что вы говорите именно о голой абстракции — ведь интерфейс объекта может быть задан неявно — просто возможностью наличия или отсутствия некоторой операции (операции сложения, например)
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, AndrewVK, Вы писали:
AVK>>Здравствуйте, deniok, Вы писали:
AVK>>>>Хм. А как тогда трактовать статический полиморфизм ввиде перегрузки функций по количеству аргументов? Вроде бы в этом случае типы не нужны, нет?
D>>>Это вопрос трактовки термина "тип". Если понимать его как способ классификации имеющихся сущностей, то разделение по арности — тоже род типизации.
AVK>>Ну я понимаю, что презерватив и на глобус натянуть можно. Только это уже чистая софистика. Тип в контексте разговора должен быть чем то реально существующим, а не голой абстракцией.
FDS>В этом сообщении http://rsdn.ru/forum/philosophy/3664919.1.aspx
мне показалось, что вы говорите именно о голой абстракции — ведь интерфейс объекта может быть задан неявно — просто возможностью наличия или отсутствия некоторой операции (операции сложения, например)
Т.е. по-твоему duck typing не является типизацией?
Здравствуйте, samius, Вы писали:
FDS>>Из адреса выводится объём памяти на указатель, так же, как и для любого другого массива данных. S>Что бы это значило?
Это значит, что мы определяем объём памяти, который должен быть использован для хранения этого указателя, до бишь делаем примерно то же, что и когда декларируем поле int.
S>Тем не менее две функции одной сигнатуры и соглашения о вызове могут иметь разные реализации, соответсвенно по-разному использовать стек внутри себя. Я не понимаю к чему все это, тип функции не определяет объем памяти, используемой функцией.
Это к тому, что тип функции и её сигнатура есть обязательные вещи для транслятора — иначе он не сможет правильно вызвать соответствующую функцию и правильно передать туда параметры. Поэтому тип функции ничуть не меньше говорит компилятору о том, как хранить определённые данные (аргументы функции), чем, скажем, объявление полей структуры.
FDS>>Я, признаться, ни разу не видел, чтобы при объявленном типе String прямо туда можно было бы запихнуть процедуру, а значит компилятор должен знать о том, что там хранится не сама строка, а процедура, т.е. имеет информацию о том, что эта процедура есть, нужно хранить указатель на неё, знает, как эту процедуру вызвать.
S>Прямо туда — это куда?
В поле типа String. Всегда вместо этого объявляется делегат, интерфейс или объект, приводимый к String
FDS>>Таким образом, объявляя процедуру как способ получения данных мы всё равно сообщаем компилятору некоторую информацию о способе хранения данных и их получения (точнее, о том, что данные выражаются в адресе функции и факте её вызова). S>О способе хранения — нет. О способе их получения — не факт. Эта информация может быть получена динамически.
О способе хранения — да. См. выше про хранение аргументов функции и указателя на неё.
О способе получения — да, так как мы должны вызвать функцию и отвести место, куда будем получать результат (если результат сложный — то место под указатель на результат)
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, deniok, Вы писали:
AVK>>>Хм. А как тогда трактовать статический полиморфизм ввиде перегрузки функций по количеству аргументов? Вроде бы в этом случае типы не нужны, нет?
D>>Это вопрос трактовки термина "тип". Если понимать его как способ классификации имеющихся сущностей, то разделение по арности — тоже род типизации.
AVK>Ну я понимаю, что презерватив и на глобус натянуть можно. Только это уже чистая софистика. Тип в контексте разговора должен быть чем то реально существующим, а не голой абстракцией.
Для подсистемы диспетчеризации отношение таких сущностей (скажем,f(a,b) и f(a,b,c)) к разным типам — самая реальная реальность. А то что программисту не надо тут писать типы, так и в Хаскелле их тоже можно почти нигде не писать — их компилятор выводит для проверки. Я не вижу здесь принципиальной разницы.
мне показалось, что вы говорите именно о голой абстракции — ведь интерфейс объекта может быть задан неявно — просто возможностью наличия или отсутствия некоторой операции (операции сложения, например)
К>Т.е. по-твоему duck typing не является типизацией?
Не совсем: если при этом речь идёт об объявленном типе — то является типизацией, а если просто идёт проверка на наличие и совместимость некоторых операций, то нет, тогда это просто проверка. Так же, как не является проверкой типа операция проверки на чётность числа if (a mod 2)ф [для особо аккуратных if (a and 1 == 0)], но от неё вполне может зависеть ветка исполнения программы
Здравствуйте, deniok, Вы писали:
D>Для подсистемы диспетчеризации отношение таких сущностей (скажем,f(a,b) и f(a,b,c)) к разным типам — самая реальная реальность.
Еще раз — при желании презерватив можно натянуть на глобус. Но по факту говорить о типе функций для языка, у которого вообще функционального типа может не быть, глупо.
D> А то что программисту не надо тут писать типы, так и в Хаскелле их тоже можно почти нигде не писать — их компилятор выводит для проверки.
Нельзя писать != отсутствуют. Потому что как только они несовпадут, к примеру, ты сразу о существовании типов в Хаскеле узнаешь.
Здравствуйте, samius, Вы писали:
FDS>>Т.е. это означает, что объект в этой толпе языков имеет множество типов вне одной ветки дерева, а так же информация об этом неявно типе где-то хранится, или нет?
S>Нет, не означает
Тогда я могу назвать операцией типизации конструкцию if a mod 2 then ?
S>>>В таком случае мне не понятно, что Вы имеет в виду под перегрузкой операторов вообще.
FDS>>Я имею в виду, что для каждого объекта я могу задать свою операцию сложения, которая будет обладать одинаковым синтаксисом и именем для всех объектов, где операция задана, но работать в них по разному.
S>Тогда операция сложения может задаваться лишь типом (ассоциацией с процедурой сложения) первого аргумента. Задание этой операции у второго аргумента не обязательно.
Тогда может оказаться, что операция сложения вылетит в связи с несовместимостью типов.
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, samius, Вы писали:
S>>Тем не менее две функции одной сигнатуры и соглашения о вызове могут иметь разные реализации, соответсвенно по-разному использовать стек внутри себя. Я не понимаю к чему все это, тип функции не определяет объем памяти, используемой функцией.
FDS>Это к тому, что тип функции и её сигнатура есть обязательные вещи для транслятора — иначе он не сможет правильно вызвать соответствующую функцию и правильно передать туда параметры. Поэтому тип функции ничуть не меньше говорит компилятору о том, как хранить определённые данные (аргументы функции), чем, скажем, объявление полей структуры.
object*object -> object.
Много чего сказало это компилятору о том как хранить данные?
FDS>>>Я, признаться, ни разу не видел, чтобы при объявленном типе String прямо туда можно было бы запихнуть процедуру, а значит компилятор должен знать о том, что там хранится не сама строка, а процедура, т.е. имеет информацию о том, что эта процедура есть, нужно хранить указатель на неё, знает, как эту процедуру вызвать.
S>>Прямо туда — это куда?
FDS>В поле типа String. Всегда вместо этого объявляется делегат, интерфейс или объект, приводимый к String
Я тоже не встречал такого бреда — в поле типа String засунуть процедуру. Спишем это на позднее время
FDS>>>Таким образом, объявляя процедуру как способ получения данных мы всё равно сообщаем компилятору некоторую информацию о способе хранения данных и их получения (точнее, о том, что данные выражаются в адресе функции и факте её вызова). S>>О способе хранения — нет. О способе их получения — не факт. Эта информация может быть получена динамически.
FDS>О способе хранения — да. См. выше про хранение аргументов функции и указателя на неё.
Не исключаю что функция object*object -> object положит аргументы в словарь и вернет словарь. А может положить их в список и вернуть список, а может записать их в файл и вернуть хэндл файла. Так что сигнатура и соглашение не говорят ничего компилятору о способе хранения переданных данных.
FDS>О способе получения — да, так как мы должны вызвать функцию и отвести место, куда будем получать результат (если результат сложный — то место под указатель на результат)
мы должны вызвать функцию, чтобы получить данные обратно. Зачем об этой функции что-то знать компилятору?
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, FDSC, Вы писали:
FDS>>Скажем так: не обязательно, что этот интерфейс как-то отмечен и имеет название (см. спор про операцию "+")
AVK>Ну ты же сам их назвал — строка, число.
Это я их назвал, но это не значит, что они объявлены специально как целое 32-битное число и т.п. То бишь для компилятора разница лишь в том, какие методы объявлены в этих объектах
Здравствуйте, FDSC, Вы писали:
FDS>Здравствуйте, samius, Вы писали:
FDS>>>Т.е. это означает, что объект в этой толпе языков имеет множество типов вне одной ветки дерева, а так же информация об этом неявно типе где-то хранится, или нет?
S>>Нет, не означает
FDS>Тогда я могу назвать операцией типизации конструкцию if a mod 2 then ?
Вы — можете. Уверен в этом теперь.
FDS>>>Я имею в виду, что для каждого объекта я могу задать свою операцию сложения, которая будет обладать одинаковым синтаксисом и именем для всех объектов, где операция задана, но работать в них по разному.
S>>Тогда операция сложения может задаваться лишь типом (ассоциацией с процедурой сложения) первого аргумента. Задание этой операции у второго аргумента не обязательно.
FDS>Тогда может оказаться, что операция сложения вылетит в связи с несовместимостью типов.
Иначе может оказаться что вылетит операция диспетчеризации метода сложения
Здравствуйте, FDSC, Вы писали:
FDS>Это я их назвал, но это не значит, что они объявлены специально как целое 32-битное число и т.п.
Если эти термины имеют какой то смысл в контексте языка (не реализации), то таки типы есть.
FDS> То бишь для компилятора разница лишь в том, какие методы объявлены в этих объектах
Все, как только компилятор знает про объявленные методы, сразу же имеем типы. Единственная возможность поиметь полиморфизм операторов без типов — язык, в котором методы привязываются к экземплярам в рантайме.
Здравствуйте, samius, Вы писали:
S>object*object -> object. S>Много чего сказало это компилятору о том как хранить данные?
Столько, сколько ему нужно. Это сказало компилятору, что нужно выделить 8 байт в стеке для аргументов и байта на результат (для 32-битной архитектуры)
FDS>>>>Я, признаться, ни разу не видел, чтобы при объявленном типе String прямо туда можно было бы запихнуть процедуру, а значит компилятор должен знать о том, что там хранится не сама строка, а процедура, т.е. имеет информацию о том, что эта процедура есть, нужно хранить указатель на неё, знает, как эту процедуру вызвать.
S>>>Прямо туда — это куда?
FDS>>В поле типа String. Всегда вместо этого объявляется делегат, интерфейс или объект, приводимый к String S>Я тоже не встречал такого бреда — в поле типа String засунуть процедуру. Спишем это на позднее время
Ну вот, а значит когда мы объявляем вызов функции, которая возвращает строку, то это не то же самое, что объявление строки
S>Не исключаю что функция object*object -> object положит аргументы в словарь и вернет словарь. А может положить их в список и вернуть список, а может записать их в файл и вернуть хэндл файла. Так что сигнатура и соглашение не говорят ничего компилятору о способе хранения переданных данных.
Говорят. Я уже писал, выше в этом сообщении и в предыдущем сообщении, но ты невнимательно прочитал.
Объявление функции object * object -> object говорит компилятору, что он делает приращение вершины стека на 2 указателя (8-мь или 16-ть байт, в зависимости от архитектуры), определяет место под результат в виде 1 указателя, ставит команду call на месте вызова функции и передаёт ей указатель на эту функцию. А если ты хочешь, чтобы в одной строчке программы сразу объявить как и что она делает и хранит, то ты многого хочешь. Достаточно того, что компилятор из этой строки узнал новую и необходимую для него информацию.
FDS>>О способе получения — да, так как мы должны вызвать функцию и отвести место, куда будем получать результат (если результат сложный — то место под указатель на результат) S>мы должны вызвать функцию, чтобы получить данные обратно. Зачем об этой функции что-то знать компилятору?
Чтобы её правильно вызвать, как ты понимаешь.