Size: a a a

Конференция C++ Russia

2020 February 26

S

Sergey in Конференция C++ Russia
Yauheni Akhotnikau
Так там же сама JVM бросать может. Ведь, если я правильно помню, в JVM ссылочные типы создаются через new, а new может бросать исключения. Т.е. создается сам объект State-монады и при его создании вылетает исключение.

И что? Вся библия нафиг, ведь не принято же бросать...
Раз уж пошли такие набросы, то может быть кто нибудь знает, как из С++ из user space обработать синий экран в windows?
источник

AP

Antony Polukhin in Конференция C++ Russia
Sergey
1) Монады - это дополнительный уровень абстракции который создает новую систему типов поверх существующей. В новой системе типов есть две операции: первая переводит объект из старой системы типов в новую (unit), а вторая (bind) - это выполнение произвольной функции над содержимым монады.
2) Есть 3 самых типа известных монад: MayBe, State и IO. Что такое MayBe представить достаточно легко, по смыслу это очень похоже на std::optional и std::variant, но... у них нет операции bind и нам каждый раз приходится проверять, есть ли значение в optional и писать свич на вариант. При наличии этой операции писать этот свич будет не надо. State монада - это чуть более сложная абстракция, которая добавляет какие то метаданные о типах. Характерный пример - это монада Try из скалы https://www.scala-lang.org/api/2.9.3/scala/util/Try.html. Там как и на С++ не существуют checked exception'ы, но в отличии от С++ никто как правило не ожидает, что ему неожиданно выбросят в морду эксепшен. Для того, чтобы обрабатывать ошибки зачастую используют эту монаду, которая по сути к возвращаемому значению добавляет опциональный эксепшен и если у тебя есть цепочка операций, сделанная через bind, то при падении первой операции у тебя просто запишется эксепшен в стейт и дальше функции выполняться не будут. IO монады достаточно сложные в понимании и не нужны в языках с императивными конструкциями
Яб послушал такой доклад )
"Монады с человеческим лицом

10 минутный экскурс для начинающих в то, о чем все говорят но мало кто понимает"
источник

AV

Alexey Veselovsky in Конференция C++ Russia
Sergey
Раз уж пошли такие набросы, то может быть кто нибудь знает, как из С++ из user space обработать синий экран в windows?
Штука в том, что bsod не передаёт управление юзерспейсу, а исключение - передаёт
источник

S

Sergey in Конференция C++ Russia
Alexey Veselovsky
Кстати, а это исключение (о нехватке памяти) в jvm только при new бывает? Ведь память может кончиться и без new
1) это не исключение, это Error, но его тоже можно выкидывать, оно называется OutOfMemoryError
2) не может, JVM проактивно растит кучу, то есть она жрет памяти больше, чем реально потребляет. Если памяти не хватает, GC не помог и не может вырастить кучу, то OutOfMemoryError
источник

S

Sergey in Конференция C++ Russia
Alexey Veselovsky
Штука в том, что bsod не передаёт управление юзерспейсу, а исключение - передаёт
Нет, не передает. У тебя нет контекста JVM и сделать ничего ты не можешь.
источник

YA

Yauheni Akhotnikau in Конференция C++ Russia
Это не набросы. new можно и свой определить. И bad_alloc может означать не общую нехватку памяти, а выход за какой-то заранее заданный предел. Либо еще allocator-ы можно вспомнить, которые выделяют память из заранее выданного им блока.

А в контексте C++ хорошо бы понимать, во что выливается все это оборачивание в state-монады. И что делать для обеспечения exception safety.

Ведь в C++ об этом заботятся больше, чем в JVM и .NET языках.
источник

AV

Alexey Veselovsky in Конференция C++ Russia
Sergey
1) это не исключение, это Error, но его тоже можно выкидывать, оно называется OutOfMemoryError
2) не может, JVM проактивно растит кучу, то есть она жрет памяти больше, чем реально потребляет. Если памяти не хватает, GC не помог и не может вырастить кучу, то OutOfMemoryError
А jvm под служебные структуры память не кушает? Например при сборке мусора там, или на работу jit?
источник

AV

Alexey Veselovsky in Конференция C++ Russia
Кстати, jvm, при new обязательно трогает все аллоцированные странички? Как оно с lazy commit / overcommit взаимодействует?
источник

S

Sergey in Конференция C++ Russia
Alexey Veselovsky
Кстати, jvm, при new обязательно трогает все аллоцированные странички? Как оно с lazy commit / overcommit взаимодействует?
Я бы ответил, что зависит от конкретного экземпляра, там везде по разному сделано и стандартов на это нет
источник

AV

Alexey Veselovsky in Конференция C++ Russia
Sergey
Я бы ответил, что зависит от конкретного экземпляра, там везде по разному сделано и стандартов на это нет
То есть исключение это может вылететь просто когда итерируешься по массиву?
источник

AV

Alexey Veselovsky in Конференция C++ Russia
или доступаешься к полю
источник

S

Sergey in Конференция C++ Russia
Alexey Veselovsky
То есть исключение это может вылететь просто когда итерируешься по массиву?
нет, это было про lazy commit и overcommit
источник

AV

Alexey Veselovsky in Конференция C++ Russia
Sergey
нет, это было про lazy commit и overcommit
Дык если оно не трогает все странички, то это означает, что нехватка памяти случится не при new, а при итерировании/доступу к этой памяти
источник

S

Sergey in Конференция C++ Russia
Конечно не трогает, а зачем трогать, если нет аллокаций?
источник

S

Sergey in Конференция C++ Russia
Может только GC что то удалить не более того
источник

AV

Alexey Veselovsky in Конференция C++ Russia
Sergey
Конечно не трогает, а зачем трогать, если нет аллокаций?
Вот ты говоришь new char[1024*1024*1024]; - при вызове этой строчки jvm потрогает все эти байтики, или просто память выделит?
источник

PZ

Pavel Zhigulin in Конференция C++ Russia
Sergey
1) Монады - это дополнительный уровень абстракции который создает новую систему типов поверх существующей. В новой системе типов есть две операции: первая переводит объект из старой системы типов в новую (unit), а вторая (bind) - это выполнение произвольной функции над содержимым монады.
2) Есть 3 самых типа известных монад: MayBe, State и IO. Что такое MayBe представить достаточно легко, по смыслу это очень похоже на std::optional и std::variant, но... у них нет операции bind и нам каждый раз приходится проверять, есть ли значение в optional и писать свич на вариант. При наличии этой операции писать этот свич будет не надо. State монада - это чуть более сложная абстракция, которая добавляет какие то метаданные о типах. Характерный пример - это монада Try из скалы https://www.scala-lang.org/api/2.9.3/scala/util/Try.html. Там как и на С++ не существуют checked exception'ы, но в отличии от С++ никто как правило не ожидает, что ему неожиданно выбросят в морду эксепшен. Для того, чтобы обрабатывать ошибки зачастую используют эту монаду, которая по сути к возвращаемому значению добавляет опциональный эксепшен и если у тебя есть цепочка операций, сделанная через bind, то при падении первой операции у тебя просто запишется эксепшен в стейт и дальше функции выполняться не будут. IO монады достаточно сложные в понимании и не нужны в языках с императивными конструкциями
Допустим, но в чем собственно профит? Я имею ввиду, почему я должен захотеть все переписать через монады?
источник

AV

Anton Vertver in Конференция C++ Russia
Alexey Veselovsky
Вот ты говоришь new char[1024*1024*1024]; - при вызове этой строчки jvm потрогает все эти байтики, или просто память выделит?
При размерах больше чем 64кб переведет массив в виртуальную память
источник

S

Sergey in Конференция C++ Russia
Maybe монады нужны, чтобы не писать много if'ов и не проверять везде не является ли у тебя указатель nullptr, а рассматривать только позитивный случай.
Со стейт монадами примерно тоже самое: ты пишешь код, как будто у тебя только позитивный кейс и эксепшены не выпадают
источник

AV

Alexey Veselovsky in Конференция C++ Russia
Anton Vertver
При размерах больше чем 64кб переведет массив в виртуальную память
Э?
источник