Aragaer
тогда в компайл тайме при использовании этой библиотеки может быть выброшена ветка для Int. Так?
Aragaer
я думаю, что можно это контролировать флагами оптимизации
Дима
В хаскеле за годы развития набралось уже наверное безумное количество оптимизаций с самыми хитровывернутыми следствиями из теории типов)
Aragaer
скажем так. Я обычно для себя все перевожу на С. Или в данном случае на плюсы. Есть библиотека с перегруженной функцией, которая может принимать инт или стринг. Или может темплейт - и две функции. Суть та же. Если я линкуюсь с этой либой статически, линкер подхватит только одну из двух версий. Если динамически - останутся обе, но используется только одна.
Aragaer
но если я поврубаю всякие lto и прочие вещи, компилятор может сотворить с кодом дофига всего и сделать просто return 42, если это и есть результат работы программы
Aragaer
соответственно в случае с хаскеллом я себе представляю нечто похожее. Вместе с выводом типов на выходе получается какой-то возможно очень многословный промежуточный код, на который потом натравливается оптимизатор с ножом
Andrei
А точно кто-нибудь знает?
Aragaer
вобщем это не про язык, а про реализацию
Aragaer
я где-то слышал, что ghc на каком-то промежуточном этапе генерит сишный код, а потом его скармливает в gcc 8)
Дима
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.57.1581
Matway
вобщем это не про язык, а про реализацию
Это про теорию computer science. Есть ли другое решение задачи. Поскольку в Хаскель идут state-of-the-art штуки, вдруг что-то такое изобрели?
Max
А где-то я видел портянку, как ghc собирает. Там три или четыре промежуточных представления.
Max
@qnikst вроде писал. Или ссылку давал.
Alexander
на ghc wiki да и в журнале каком-то было
Alexander
http://www.stephendiehl.com/posts/ghc_01.html http://www.aosabook.org/en/ghc.html
Alexander
второе наверное лучше
Alexander
у слову тут какой-то веселый диалог был, но мне лень перечитывать
Alexander
что толковое было? на все ответили?
Andrei
На часть ответили. Еще есть вопрос, но его трудно сформулировать.
Alexander
http://www.aosabook.org/images/ghc/hscpipe2.png
Alexander
картинка для тех кому лень открывать
Alexander
про maybe там какой-то очень странный вопрос был
Aragaer
во, специализация перегруженных функций это вот почти оно
Алдар
newtype он удаляет из рантайма, но это и так понятно
Alexander
это как спросить, что если у нас есть union u { int foo; char * bar;} и попросить компилятор убрать код для одного варианта
Vladislav
http://www.aosabook.org/images/ghc/hscpipe2.png
constructor specialization - не оно? (в Simplify-фазе)
Alexander
врятли
Alexander
просто это какое-то очень странное желание
Alexander
я подозреваю что constructor specialization это спасение от лишних indirections убирание конструкторов где можно и т.п.
Alexander
но давай лучше поищем
Alexander
просто я бы такого поведения не ждал, оно очень странное и может взлететь только если все статически выводится
Alexander
https://www.researchgate.net/publication/228350990_Constructor_specialisation_for_Haskell_programs
Alexander
вроде вот статья
Vladislav
https://www.researchgate.net/publication/228350990_Constructor_specialisation_for_Haskell_programs
ага, судя по абстракту это именно оно
Andrei
просто я бы такого поведения не ждал, оно очень странное и может взлететь только если все статически выводится
Если нас заботит производительность — это может стать очень хорошей оптимизацией. Представьте если бы скажем в плюсах виртуальные функции могли бы девиртуализовываться компилятором, который бы статически выводил тип.
Vladislav
"Sometimes a function is called with arguments that are statically known to already be in construc-tor form, so that the work of pattern-matching is wasted."
Alexander
ну это statically known
Vladislav
ну это statically known
так об том и вопрос был
Alexander
а
Алдар
ну это statically known
то есть есть там монады IO нигде не было, то это statically known?
Aragaer
ну на самом деле это очень простой шаг, если перед этим функцию заинлайнить. Если не инлайнить, то есть вариант со специализацией
Alexander
нет, statically known это когда statically known
Alexander
вот написал ты: foobar :: Either a b -> ... foobar (Left e) = .. foobar (Right g) =..
Alexander
ты не знаешь что тебе передадут
Aragaer
если у тебя IO String, то значит статически знаешь стринг
Alexander
но берёшь и используешь как foobar (Either 1)
Alexander
foobar (Left 1)
Alexander
компилятору извесно что это left, и если foobar не очень большой и его можно инлайнить, то тогда можно заинлайнить, увидеть что только одна ветка и выкинуть другую
Aragaer
ну это и есть специализация - разделить один foobar на foobarLeft и foobarRight
Alexander
возможно ещё оптимизировать
Алдар
но если там нигде нет IO, означает что не было ввода-вывода
Alexander
это какое-то интересное применение слова специализация
Alexander
не скажу что неверное, но я всегда его воспринимал как специализацию для типа
Aragaer
ну в этом и смысл, да. Было foobar :: Either Int String ->
Alexander
вообще чем слушать меня лучше почитать саймона
Aragaer
а стало foobarLeft :: Int и foobarRight :: String
Alexander
не стало
Алдар
Тайпклассы же!
концепты в цпп аналог тайпклассов же?
Vladislav
концепты в цпп аналог тайпклассов же?
дождемся ли мы этих концептов-то?
Alexander
нет
Alexander
не аналог, но близкие моменты есть
Alexander
@aragaer ок, я не совсем прав, оно все же генерит новые функции, что логично
Aragaer
... я помню, читал где-то, что у ллвм была фишка, когда бинарник содержал в себе ллвм байткод для рантайм специализации
Alexander
а кстати почему про эту оптимизацию заговорили*
Alexander
я думаю, что почти все это делают
Alexander
или я не прав?
Aragaer
причем вплоть до специализации по конкретным значениям
Vasiliy
с either корректнее было бы сравнивать std::variant
Alexander
угу или с union, как я предложил
Vasiliy
но если я поврубаю всякие lto и прочие вещи, компилятор может сотворить с кодом дофига всего и сделать просто return 42, если это и есть результат работы программы
опять же, return 42 - это на уровне значений, и я почти уверен, что как gcc превратит x*8 в x«3¸ так и функция (fromJust . Just) превратится в id где-то по-дороге в core
Andrei
с either корректнее было бы сравнивать std::variant
Да, именно. Но variant в плюсах не разруливается в компайлтайме, даже если это возможно.
Andrei
Потому что это, вообще говоря, довольно непросто.
Aragaer
чтобы разрулить юнион, надо где-то добавлять информацию о том, что там внутри на самом деле
Andrei
При чём тут union?
Alexander
ну как и в haskell