Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 427 428 [429] 430 431 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#6421
,
|
|
|
|
Генерация кода в рантайме? Но зачем, если проще диспетчеризовать в рантайме? Нет, не тип. Это переменная. Зачем? Если при длине списка > 3 все равно рано или поздно придется диспетчеризацию проводить. Или генерировать код постоянно при каждом обращении. Или он что, сгенерирует код для всех длин списков а потом будет просто его вызывать в зависимости от длины? Цитата D_KEY @ Цитата У нас уже есть две перегрузки scalarProduct, которых достаточно для работы примера. Ага, оно и видно по твоему желанию генерировать типы в рантайме. Haskell этим не занимается. Насколько я знаю. Хаскелл рантаймом вообще не занимается. Но рантайм может этим заниматься. И чем это хуже генерации кода в рантайме? А ничего, что Cons<Cons<Cons<Cons<Nil>>>> и Cons<Cons<Cons<Nil>>> -- это разные типы? И что эти типы будут известны только в рантайме? Как компилятор при компиляции узнает, сколько раз нужно выполнить scalarProduct<Cons> 3 или 4? Цитата D_KEY @ Ты не понимаешь разницы между типом во время компиляции и ссылкой на класс во время выполнения? Я не вижу разницы применительно к instanceof. Т.е. ты пытаешься применить принцип работы дженериков к тайпклассам? Ну-ну. Цитата D_KEY @ ИМХО, ты путаешь с шаблонами. При параметрическом полиморфизме не нужно точно знать тип-параметр. Нет, я не путаю тайпклассы с шаблонами. Тайпклассы -- это не параметрический полиморфизм, а специальный. В приведенном хаскелльном коде вообще нет параметрического полиморфизма. Добавлено И да, даже для всех вызовов параметрически полиморфных функций в хаскелле все типы известны точно перед компиляцией (в исполняемую программы, а не в бинарный хаскельный модуль). Никаких типовых переменных не остается. |
|
Сообщ.
#6422
,
|
|
|
|
Цитата korvin @ Генерация кода в рантайме? Но зачем, если проще диспетчеризовать в рантайме? Да не в рантайме, а во время компиляции. Я тебе на низкоуровневых примитивах кодогенерации(шаблонах) показал, что может делать компилятор для создания корректного кода без создания типов в рантайме. Что не так-то? Добавлено Цитата korvin @ Зачем? Если при длине списка > 3 все равно рано или поздно придется диспетчеризацию проводить. Или генерировать код постоянно при каждом обращении. Или он что, сгенерирует код для всех длин списков а потом будет просто его вызывать в зависимости от длины? Нет. Тебе не нужно знать длину при генерации кода. Тебе достаточно знать Nil у тебя там или Cons. А это ты знаешь. Цитата А ничего, что Cons<Cons<Cons<Cons<Nil>>>> и Cons<Cons<Cons<Nil>>> -- это разные типы? Да, это разные типы. Но с одним представлением. И на этапе выполнения тебе не нужно проводить между ними различия. Цитата Как компилятор при компиляции узнает, сколько раз нужно выполнить scalarProduct<Cons> 3 или 4? Попробуй понять тот мой код. Там все это есть. Цитата Т.е. ты пытаешься применить принцип работы дженериков к тайпклассам? Ну-ну. Я отвечал на вопрос про дженерики. Цитата Цитата D_KEY @ ИМХО, ты путаешь с шаблонами. При параметрическом полиморфизме не нужно точно знать тип-параметр. Нет, я не путаю тайпклассы с шаблонами. Тайпклассы -- это не параметрический полиморфизм, а специальный. В приведенном хаскелльном коде вообще нет параметрического полиморфизма. Я не о тайпклассах, я о параметрическом полиморфизме в инстансе тайпкласса для Cons. Добавлено В общем, нужно на словах объяснить то, что я пытался объяснить тем псевдокодом. |
|
Сообщ.
#6423
,
|
|
|
|
Цитата D_KEY @ Да не в рантайме, а во время компиляции. Я тебе на низкоуровневых примитивах кодогенерации(шаблонах) показал, что может делать компилятор для создания корректного кода без создания типов в рантайме. Что не так-то? Окей, давай так: есть список (Cons 1 (Cons 2 (Cons 3 (Cons 4 Nil)))), полученный в рантайме от n=4. Какой код для него скомпилирует компилятор? Добавлено Цитата D_KEY @ Нет. Тебе не нужно знать длину при генерации кода. Тебе достаточно знать Nil у тебя там или Cons. А это ты знаешь. лол, нет, не знаю, откуда? Длина заранее неизвестна, следовательно неизвестно, сколько нужно Cons'ов пройти, чтобы добраться до Nil'а. Добавлено Цитата D_KEY @ Да, это разные типы. Но с одним представлением. И на этапе выполнения тебе не нужно проводить между ними различия. Да, не нужно, если scalarProduct ad-hoc полиморфна и может диспетчеризоваться в рантайме. Добавлено Цитата D_KEY @ Я не о тайпклассах, я о параметрическом полиморфизме в инстансе тайпкласса для Cons. Там нет параметрического полиморфизма. Добавлено Цитата D_KEY @ Попробуй понять тот мой код. Там все это есть. Попробуй понять, что я говорю. Напиши мне сгенерированый код для scalarProduct. В синтаксисе C++. |
|
Сообщ.
#6424
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Да не в рантайме, а во время компиляции. Я тебе на низкоуровневых примитивах кодогенерации(шаблонах) показал, что может делать компилятор для создания корректного кода без создания типов в рантайме. Что не так-то? Окей, давай так: есть список (Cons 1 (Cons 2 (Cons 3 (Cons 4 Nil)))), полученный в рантайме от n=4. Какой код для него скомпилирует компилятор? Позднее по шагам распишу кодогенерацию. Цитата Цитата D_KEY @ Нет. Тебе не нужно знать длину при генерации кода. Тебе достаточно знать Nil у тебя там или Cons. А это ты знаешь. лол, нет, не знаю, откуда? Длина заранее неизвестна, следовательно неизвестно, сколько нужно Cons'ов пройти, чтобы добраться до Nil'а. Мы не на стадии выполнения находимся, а на стадии генерации кода компилятором. Тебе не нужно знать, сколько Cons'ов нужно пройти, тебе нужно сгенерировать две версии для инстанса с Cons - одну для Cons<Nil>, другую для Cons<любой другой тип>. Цитата Цитата D_KEY @ Да, это разные типы. Но с одним представлением. И на этапе выполнения тебе не нужно проводить между ними различия. Да, не нужно, если scalarProduct ad-hoc полиморфна и может диспетчеризоваться в рантайме. Добавлено Цитата D_KEY @ Я не о тайпклассах, я о параметрическом полиморфизме в инстансе тайпкласса для Cons. Там нет параметрического полиморфизма. Добавлено Цитата korvin @ Попробуй понять, что я говорю. Напиши мне сгенерированый код для scalarProduct. В синтаксисе C++. На С++ без дженериков мне придется прибегнуть к void* или чему-то похожему - не хочу. Я тебе написал на дженериках+шаблонах. Раскрыть шаблоны? Добавлено |
|
Сообщ.
#6425
,
|
|
|
|
Цитата D_KEY @ Мы не на стадии выполнения находимся, а на стадии генерации кода компилятором. Тебе не нужно знать, сколько Cons'ов нужно пройти, тебе нужно сгенерировать две версии для инстанса с Cons - одну для Cons<Nil>, другую для Cons<любой другой тип>. А если типов, для которых инстанциирован ScalarProduct много, компилятор для всех сгенерирует код Cons<T>? Если нет, то чем Nil таким особенным выделился? Ну допустим у нас есть разный сгенерированный код для Cons<Nil> и Cons<другой тип>, на последней итерации test' scalarProduct вызывается для неизвестного ScalarProduct a. Дальше что? Добавлено Цитата D_KEY @ ![]() Что тебя так удивляет? Добавлено Цитата D_KEY @ На С++ без дженериков мне придется прибегнуть к void* или чему-то похожему - не хочу. Я тебе написал на дженериках+шаблонах. Раскрыть шаблоны? Без каких дженериков? Ты же говорил про сгенерированный машкод? Ну хорошо, не в C++, а в том псевдоязыке с шаблонами и дженериками. Добавлено Вот смотри, как это вижу я: ![]() ![]() test' {T : Type} 0 _ (x : T) (y : T) = scalarProduct x y => scalarProduct {T : Type} (x : T) (y : T) = (getInstance ScalarProduct T) x y где ScalarProduct.instances = Hash [ Nil => <code for Nil data> ; Cons => <code for Cons data> ] Вот теперь в том же духе, только в твоем любимом синтаксисе опиши, что происходит при вызове scalarProduct(x, y) Добавлено соответственно ![]() ![]() <code for Nil> = lambda (x : Nil) (y : Nil) = 0 <code for Cons> = lambda {T : Type} (x : Cons T) (y : Cons T) = match x -> (cons i xt), y -> (cons j yt) in i*j + scalarProduct {T} xt yt -- и опять выбор имплементации |
|
Сообщ.
#6426
,
|
|
|
|
Или я туплю сейчас, или действительно что-то не допонял тогда
Так что может ты и прав.Да, такие вопросы у меня явно не получается обдумывать параллельно работе, в отличие от обычных... Добавлено Цитата korvin @ Хаскелл рантаймом вообще не занимается. Если я ошибся и ты прав, то как этот код тогда работает? |
|
Сообщ.
#6427
,
|
|
|
|
Цитата D_KEY @ Если я ошибся и ты прав, то как этот код тогда работает? Ну поскольку это забота рантайма, то зависит от рантайма. Примерный алгоритм, каким он по-моему является, я описал, обычный typecase по меткам типов например (или меткам конструкторов). Кстаи Ocaml, afaik, в некоторых случаях вставляет метки типов в рантайм-значения. Вероятно он это делает только для экземпляров классов например. В Хаскелле же вероятно компилятор видит, что не может статически вывести полный тип аргументов scalarProduct и вставляет рантайм-проверку. |
|
Сообщ.
#6428
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Если я ошибся и ты прав, то как этот код тогда работает? Ну поскольку это забота рантайма, то зависит от рантайма. ... В Хаскелле же вероятно компилятор видит, что не может статически вывести полный тип аргументов scalarProduct и вставляет рантайм-проверку. Он же вроде никогда таким не занимается... |
|
Сообщ.
#6429
,
|
|
|
|
Цитата D_KEY @ Он же вроде никогда таким не занимается... Сам не занимается, но "перекладывает ответственность" на рантайм. Добавлено Говорит типа: вот тут я фик знает какой конкретно тип, но для него есть инстанс ScalarProduct, так что ты, рантайм, сам там разберись, какой инстанс выбрать, я умываю руки. Мавр сделал свое дело, мавр может уходить =) |
|
Сообщ.
#6430
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Он же вроде никогда таким не занимается... Сам не занимается, но "перекладывает ответственность" на рантайм. Добавлено Говорит типа: вот тут я фик знает какой конкретно тип, но для него есть инстанс ScalarProduct, так что ты, рантайм, сам там разберись, какой инстанс выбрать, я умываю руки. Мавр сделал свое дело, мавр может уходить =) Это я понял, но у меня пока нет уверенности, что тут требуется рантайм. Как назло интересная(для меня) задачка совпала с отсутствием времени |
|
Сообщ.
#6431
,
|
|
|
|
Цитата D_KEY @ Это я понял, но у меня пока нет уверенности, что тут требуется рантайм. Как назло интересная(для меня) задачка совпала с отсутствием времени ![]() Ну я даже не знаю, какие еще аргументы привести. Попробуй, как будет время, описать алгоритм выполнения scalarProduct подобный моему, только без рантайма, тогда продолжим. |
|
Сообщ.
#6432
,
|
|
|
|
Цитата korvin @ Попробуй, как будет время Ок. |
|
Сообщ.
#6433
,
|
|
|
|
D_KEY тут интересуется, можно ли на дельфях или шарпе написать такое?
![]() ![]() ![]() #include "xsmell.hpp" #include <iostream> TAG(html, NO_ATTRIBS); TAG(head, NO_ATTRIBS); TAG(title, NO_ATTRIBS); TAG(body, NO_ATTRIBS); TAG(p, NO_ATTRIBS); TAG(a, ATTRIB(href)); TAG(img, ATTRIB(src), ATTRIB(alt)); int main() { using namespace xsmell; document doc = _ <html>_ <head>_ <title>"XSMELL demo"<!title>_ <!head>_ <body>_ <p>"Yesssssssssssssssss!"<!p>_ <img .src("chucknorris.png") .alt("sneezing eyes open")>_ <!img>_ <!body>_ <!html> _; std::cout << doc << '\n'; return 0; } |
|
Сообщ.
#6434
,
|
|
|
|
Цитата MyNameIsIgor @ D_KEY тут интересуется |
|
Сообщ.
#6435
,
|
|
|
|
Цитата MyNameIsIgor @ D_KEY тут интересуется, можно ли на дельфях или шарпе написать такое? Надеюсь что нет |