Aragaer
тогда в компайл тайме при использовании этой библиотеки может быть выброшена ветка для Int. Так?
Vladislav
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
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;} и попросить компилятор убрать код для одного варианта
Alexander
врятли
Alexander
просто это какое-то очень странное желание
Alexander
я подозреваю что constructor specialization это спасение от лишних indirections убирание конструкторов где можно и т.п.
Alexander
но давай лучше поищем
Alexander
просто я бы такого поведения не ждал, оно очень странное и может взлететь только если все статически выводится
Alexander
https://www.researchgate.net/publication/228350990_Constructor_specialisation_for_Haskell_programs
Alexander
вроде вот статья
Vladislav
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
Andrei
Alexander
а
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
Vasiliy
с either корректнее было бы сравнивать std::variant
Alexander
угу или с union, как я предложил
Andrei
Потому что это, вообще говоря, довольно непросто.
Aragaer
чтобы разрулить юнион, надо где-то добавлять информацию о том, что там внутри на самом деле
Andrei
При чём тут union?
Alexander
ну как и в haskell