@haskellru

Страница 317 из 1551
Aragaer
23.06.2017
19:10:47
соответственно в случае с хаскеллом я себе представляю нечто похожее. Вместе с выводом типов на выходе получается какой-то возможно очень многословный промежуточный код, на который потом натравливается оптимизатор с ножом

Andrei
23.06.2017
19:12:51
А точно кто-нибудь знает?

Aragaer
23.06.2017
19:13:11
вобщем это не про язык, а про реализацию

Google
Aragaer
23.06.2017
19:14:32
я где-то слышал, что ghc на каком-то промежуточном этапе генерит сишный код, а потом его скармливает в gcc 8)

Дмитрий
23.06.2017
19:14:33
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.57.1581

Matway
23.06.2017
19:15:25
вобщем это не про язык, а про реализацию
Это про теорию computer science. Есть ли другое решение задачи. Поскольку в Хаскель идут state-of-the-art штуки, вдруг что-то такое изобрели?

Max
23.06.2017
19:15:47
А где-то я видел портянку, как ghc собирает. Там три или четыре промежуточных представления.

@qnikst вроде писал. Или ссылку давал.

Alexander
23.06.2017
19:17:07
на ghc wiki да и в журнале каком-то было

http://www.stephendiehl.com/posts/ghc_01.html http://www.aosabook.org/en/ghc.html

второе наверное лучше

у слову тут какой-то веселый диалог был, но мне лень перечитывать

что толковое было? на все ответили?

Andrei
23.06.2017
19:19:39
На часть ответили. Еще есть вопрос, но его трудно сформулировать.

Alexander
23.06.2017
19:19:45
http://www.aosabook.org/images/ghc/hscpipe2.png

картинка для тех кому лень открывать

Google
Alexander
23.06.2017
19:23:04
про maybe там какой-то очень странный вопрос был

Aragaer
23.06.2017
19:23:46
во, специализация перегруженных функций это вот почти оно

Aldar
23.06.2017
19:23:55
newtype он удаляет из рантайма, но это и так понятно

Alexander
23.06.2017
19:24:00
это как спросить, что если у нас есть union u { int foo; char * bar;} и попросить компилятор убрать код для одного варианта

Vladislav
23.06.2017
19:24:27
http://www.aosabook.org/images/ghc/hscpipe2.png
constructor specialization - не оно? (в Simplify-фазе)

Alexander
23.06.2017
19:24:53
врятли

просто это какое-то очень странное желание

я подозреваю что constructor specialization это спасение от лишних indirections убирание конструкторов где можно и т.п.

но давай лучше поищем

просто я бы такого поведения не ждал, оно очень странное и может взлететь только если все статически выводится

https://www.researchgate.net/publication/228350990_Constructor_specialisation_for_Haskell_programs

вроде вот статья

Vladislav
23.06.2017
19:27:42
https://www.researchgate.net/publication/228350990_Constructor_specialisation_for_Haskell_programs
ага, судя по абстракту это именно оно

Andrei
23.06.2017
19:27:58
просто я бы такого поведения не ждал, оно очень странное и может взлететь только если все статически выводится
Если нас заботит производительность — это может стать очень хорошей оптимизацией. Представьте если бы скажем в плюсах виртуальные функции могли бы девиртуализовываться компилятором, который бы статически выводил тип.

Vladislav
23.06.2017
19:27:58
"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
23.06.2017
19:28:10
ну это statically known

Vladislav
23.06.2017
19:28:25
ну это statically known
так об том и вопрос был

Alexander
23.06.2017
19:28:29
а

Aldar
23.06.2017
19:29:18
ну это statically known
то есть есть там монады IO нигде не было, то это statically known?

Google
Aragaer
23.06.2017
19:29:29
ну на самом деле это очень простой шаг, если перед этим функцию заинлайнить. Если не инлайнить, то есть вариант со специализацией

Alexander
23.06.2017
19:29:45
нет, statically known это когда statically known

вот написал ты: foobar :: Either a b -> ... foobar (Left e) = .. foobar (Right g) =..

ты не знаешь что тебе передадут

Aragaer
23.06.2017
19:30:18
если у тебя IO String, то значит статически знаешь стринг

Alexander
23.06.2017
19:30:35
но берёшь и используешь как foobar (Either 1)

foobar (Left 1)

компилятору извесно что это left, и если foobar не очень большой и его можно инлайнить, то тогда можно заинлайнить, увидеть что только одна ветка и выкинуть другую

Aragaer
23.06.2017
19:31:25
ну это и есть специализация - разделить один foobar на foobarLeft и foobarRight

Alexander
23.06.2017
19:31:26
возможно ещё оптимизировать

Aldar
23.06.2017
19:31:49
но если там нигде нет IO, означает что не было ввода-вывода

Alexander
23.06.2017
19:32:00
это какое-то интересное применение слова специализация

не скажу что неверное, но я всегда его воспринимал как специализацию для типа

Дед Пегас
23.06.2017
19:32:57
Aragaer
23.06.2017
19:33:05
ну в этом и смысл, да. Было foobar :: Either Int String ->

Alexander
23.06.2017
19:33:12
вообще чем слушать меня лучше почитать саймона

Aragaer
23.06.2017
19:33:18
а стало foobarLeft :: Int и foobarRight :: String

Alexander
23.06.2017
19:33:23
не стало

Aldar
23.06.2017
19:33:50
Тайпклассы же!
концепты в цпп аналог тайпклассов же?

Vladislav
23.06.2017
19:34:49
концепты в цпп аналог тайпклассов же?
дождемся ли мы этих концептов-то?

Google
Alexander
23.06.2017
19:34:53
нет

не аналог, но близкие моменты есть

@aragaer ок, я не совсем прав, оно все же генерит новые функции, что логично

Aragaer
23.06.2017
19:37:25
... я помню, читал где-то, что у ллвм была фишка, когда бинарник содержал в себе ллвм байткод для рантайм специализации

Alexander
23.06.2017
19:39:59
а кстати почему про эту оптимизацию заговорили*

я думаю, что почти все это делают

или я не прав?

Aragaer
23.06.2017
19:44:17
причем вплоть до специализации по конкретным значениям

Alexander
23.06.2017
19:52:54
угу или с union, как я предложил

Vasiliy
23.06.2017
19:56:41
но если я поврубаю всякие lto и прочие вещи, компилятор может сотворить с кодом дофига всего и сделать просто return 42, если это и есть результат работы программы
опять же, return 42 - это на уровне значений, и я почти уверен, что как gcc превратит x*8 в x«3¸ так и функция (fromJust . Just) превратится в id где-то по-дороге в core

Andrei
23.06.2017
19:59:22
с either корректнее было бы сравнивать std::variant
Да, именно. Но variant в плюсах не разруливается в компайлтайме, даже если это возможно.

Потому что это, вообще говоря, довольно непросто.

Aragaer
23.06.2017
19:59:50
чтобы разрулить юнион, надо где-то добавлять информацию о том, что там внутри на самом деле

Andrei
23.06.2017
20:00:00
При чём тут union?

Alexander
23.06.2017
20:00:04
ну как и в haskell

потому что either A B ~ union

Andrei
23.06.2017
20:00:32
Нет, это не union, это std::variant

Aragaer
23.06.2017
20:00:42
struct { bool is_pointer; union { char *pointer; int value }};

Google
Andrei
23.06.2017
20:00:59
std::variant это union + информация о типе

Vladislav
23.06.2017
20:01:06
struct { bool is_pointer; union { char *pointer; int value }};
тяжелое наследие сишечки, не надо так

Aragaer
23.06.2017
20:01:29
кому тяжелое наследие, а для меня родной язык практически

Alexander
23.06.2017
20:01:35
нормально, не на плюсах же писать, в сам деле

Vasiliy
23.06.2017
20:01:47
потому что either A B ~ union
кроме того, что в сях можно обращаться к любым полям, огребая UB :D

Aragaer
23.06.2017
20:02:09
так вот по этому is_pointer технически можно сделать специализацию. Если компилятор сильно заморочится

Alexander
23.06.2017
20:02:11
ну да struct + union

а то начнётся ещё вспоминания про boxing и т.п.

@lightgreen а можно хотя бы +1 класс типов?

мне чтобы из прокси достать head и tail?

для типов

там нужно уровне значений case сделать как-то

Vasiliy
23.06.2017
20:05:17
Aragaer
23.06.2017
20:06:15
я тут на днях столкнулся с тем, как гцц может заморочиться...

два строковых литерала склеить может, если один из них заканчивается на другой

Vasiliy
23.06.2017
20:06:54
я в хорошем смысле :)

а так, да, мы тут баг в optional искали

нашли баг в гцц, который известен, ужасен, фиксу не подлежит

Страница 317 из 1551