Alexander
там столько ядер, а памяти не то, чтобы много
Alexander
но в любом случае, имхо люди со странными архитектурами уж могут опции поменять
Alexander
это хотя бы ожидаемо
Alexander
или если хочешь чтобы программа в 10мб работала
Alexander
в 2018
A64m
смешно было, когда с 512k до 1m увеличили в 2016
Alexander
ага
A64m
тяжело далось решение, наверняка
A64m
причем , к примеру, в clr размеры эфемерных поколений вот такие | | 32-bit | 64-bit | | ------------------ | ------ | ------ | | Workstation GC | 16 MB | 256 MB | | Server GC | 64 MB | 4 GB | | Server GC > 4 CPUs | 32 MB | 2 GB | | Server GC > 8 CPUs | 16 MB | 1 GB |
A64m
чет на l2 кеш пентиума 2 не ровняются
Alexander
@lightgreen вот это изменение способно ускорить 95% программ минимум в 2 раза
Dmitry
Вот тут написано: https://kouzdra.livejournal.com/912059.html
Dmitry
Проще говоря, надо "отщепить" от мира массив, in-place мутировать его, потом влить обратно в мир.
Dmitry
При этом, как я понял, под капотом отщепление и вливание может тоже быть in-place
саша
При этом, как я понял, под капотом отщепление и вливание может тоже быть in-place
Ну это с линейными типами. А без линейных типов никак, ибо ссылочная прозрачность нарушается.
Dmitry
А, блин, протупил. Вопрос был про фп-БЕЗ-линейных типов :) Тогда не знаю. Могу только предложить книжку Окасаки про ФП, там предложено много приёмов, как можно без in-place жить.
Dmitry
Кстати, а компилятор не способен ли определить, что к какому-то объекту в памяти доступ только с одного места? Ну и заменить все операции на in-place.
саша
Кстати, а компилятор не способен ли определить, что к какому-то объекту в памяти доступ только с одного места? Ну и заменить все операции на in-place.
Ну собственно линейные типы позволяют определить, что доступ к какому-то объекту в памяти есть только из одного места. Без этого по идее нужно делать какие-то эвристики и на их основе магическим образом вычислять это.
Oleg
если бы в котлине были HKT и тайпклассы, меня бы в скале не было.
Предположительно твоё отсутствие в скале привело бы к её уничтожению?
Oleg
В статьях про секвенции об этом норм написано
Oleg
Только не найду в каких
Big Bux Chungus
У меня большое эго конечно, но не настолько. Нет, это просто будет лучше язык и все разумные люди я думаю перейдут.
Big Bux Chungus
Он уже лучше для всех, кто в скале ради лучшей жавы
Big Bux Chungus
А будет ещё и лучше для тех, кто пишет фп
саша
runST
А это точно легально? С ST не может быть ситуации когда ссылочная прозрачность будет утеряна? Ну например изменение чего-то в двух разных местах?
Big Bux Chungus
не может быть
саша
логически это просто оптимизированный State
Так State a может быть спокойно скопирован. При этом ссылочную прозрачность гарантирует иммутабельность. Как гарантии ссылочной прозрачности достигаются в ST без линейности?
Big Bux Chungus
с помощью Rank2 polymorphism
Cheese
а на самом деле потому что это IO
Big Bux Chungus
http://homepages.dcc.ufmg.br/~camarao/fp/articles/lazy-state.pdf
Big Bux Chungus
2.4 Encapsulation
саша
Спасибо за разъяснения, буду изучать.
A64m
А это точно легально? С ST не может быть ситуации когда ссылочная прозрачность будет утеряна? Ну например изменение чего-то в двух разных местах?
не может, только если при оттаивании и заморозке копировать, т.е. код на ST будет копировать массивы лишний раз, так что фактически всякие ф-и так написанные опасно замораживают/размораживают то что можно, по мнению программиста чтоб вся функция не стала опасной
A64m
в векторе правда есть правила перезаписи для некоторых случаев, когда копирование можно выкинуть (когда массив новый создается прямо перед тем как растаивается, к примеру), но это только часть ненужных копирований устраняет
Oleg
Так State a может быть спокойно скопирован. При этом ссылочную прозрачность гарантирует иммутабельность. Как гарантии ссылочной прозрачности достигаются в ST без линейности?
Ключевое отличие, что слой ST даёт тебе разрешение на мутабельные действия, включая создание и изменение ссылок и массивов разом. Разделить возможности: дать ридонли к этому, мутабельный к тому, возможность создать то и удалить сё, - довольно сложно. Имея только интуиционисткие типы крайне сложно отследить, что не протекают разрешения. Можно придумать коммутирующие слои ST монад, но вводить отдельный слой для каждой переменной - затруднительно. Если дать возможность удалять, после удаления ссылки массива запретить чтение/изменение опять же крайне сложно. С линейными ты можешь таскать изолированные капабилити для каждого действия с каждым мутабельным объектом.
Alexander
с IndexedMonad можно сделать более хитрые правила
Alexander
в общем-то с IndexedMonad вполне возможно можно эмулировать линейные типы
Alexander
но писать код печально будет
Alexander
т.е. в тайплевел состоянии будет лежать список (s и информации о типе)
Alexander
но там будет такой ад, что мне даже представлять не хочется
Oleg
в общем-то с IndexedMonad вполне возможно можно эмулировать линейные типы
Ну да, если ввести вообще вручную моноидальные категории любой формы и композить вручную. Это как будто пишешь вручную на IR
Alexander
ну там поидее руками мало что будет сделано
кана
@graninas помню ты писал, что вы как-то стопали выполнение сценария на фри-монадах и сериализовывали список выполненных команд, а потом восстанавливали и продолжали?
Anonymous
@Racsicofalapatorius будет жить. Поприветствуем!
кана
а каким образом вообще это сериализировалось?
кана
там же лямбды
Alexander
Ну, сценарий-то выполняется по шагам, несмотря на то, что он является выражением. Там в стеке интерпретатора был RecorderT, который это позволяет делать. На каждом шагу он либо выполняет монадическую операцию сценария, либо берет ее результат, каковой он был при прошлом выполнении. Там можно "проиграть" записанные результаты в порядке появления. Это, кстати, использовалось еще и для правильного форкания дочерних workflow
Alexander
Конечно, есть требование, чтобы каждая операция сценария возвращала сериализуемый результат. Точнее, возвращать она может любой, но несериализуемые не могут выполниться по шагам.
кана
хм, то есть хранились не команды, а результаты?
Alexander
Да
Алексей
А есть где посмотреть на код?
Alexander
Код этого проекта приватный
Alexander
Alexander
Alexander
Alexander
Пример сценария:
Alexander
Anonymous
@ArtemHlystov будет жить. Поприветствуем!
Alexander
Описание языка:
Alexander
Зигохистоморфный
@graninas пиши статью об этом подходе...
Зигохистоморфный
Хотел...
так что останавило?
Андрей
лень, хаскель же
Андрей
время не пришло)
Alexander
так что останавило?
Другие проекты, конечно. То подготовка эвентов, то дополнительные интересы вроде STM и подготовка докладов на конфы.
Alexander
Alexander
error: undefined
Андрей
вообще workflows интересная тема
Андрей
вот сделать бы это всё на уровне БД
Alexander
вот сделать бы это всё на уровне БД
Ну, там у нас все клалось в БД, чтобы можно было resumable требование поддержать. Можно раннер загасить, на другой машине поднять, - и workflow продолжит выполняться с того же места.
Alexander
А сообщения мы через RabbitMQ прогоняли.