Size: a a a

Compiler Development

2020 December 03

AT

Alexander Tchitchigi... in Compiler Development
d t
Концепция владения ресурсами же - по более одного процента будет.
Один процент — это на то, что мы неправильно прочитали мысли неизвестного автора.
источник

AT

Alexander Tchitchigi... in Compiler Development
Потому что в принципе под compile-time memory management иногда подразумевают и другие вещи. Регионы, например.
источник

PS

Pavel Samolysov in Compiler Development
Столкнулся с таким вопросом, хотя это возможно больше про дизайн языков. В расте нет non-type template parameters, назовем это так. В С++ уже очень давно можно передавать значение int/size_t как параметр шаблона. Иногда это очень удобно, например у нас есть матрица и мы можем при компиляции проверить, что она квадратная, определив функцию перемножения, как multiply<size_t>(matrix<size_t, size_t> A, matrix<size_t, size_t> B) -> matrix<size_t, size_t> (псевдокод).

Но в реальности то матрицы скорее всего будут загружаться в рантайме из какого-нибудь источника, хотя размеры и могут быть строго заданы: "вот тебе матрица 32x32, а значения я заполню в рантайме". Однако если алгоритм перемножения рекурсивный, Strassen, например, то при компиляции для умножения матриц 32x32 должны  будут сгенерироваться процедуры для 16x16, 8x8 и т.д. Т.е. код сильно разбухает. Возникает вопрос как избежать этого trade off'а: и размер в компайл-тайме проверить и код не раздувать. Есть ли какие-то для этого механизмы в языках программирования вообще и в языках без non-type template parameters в частности?
источник

AK

Andrei Kurosh in Compiler Development
Pavel Samolysov
Столкнулся с таким вопросом, хотя это возможно больше про дизайн языков. В расте нет non-type template parameters, назовем это так. В С++ уже очень давно можно передавать значение int/size_t как параметр шаблона. Иногда это очень удобно, например у нас есть матрица и мы можем при компиляции проверить, что она квадратная, определив функцию перемножения, как multiply<size_t>(matrix<size_t, size_t> A, matrix<size_t, size_t> B) -> matrix<size_t, size_t> (псевдокод).

Но в реальности то матрицы скорее всего будут загружаться в рантайме из какого-нибудь источника, хотя размеры и могут быть строго заданы: "вот тебе матрица 32x32, а значения я заполню в рантайме". Однако если алгоритм перемножения рекурсивный, Strassen, например, то при компиляции для умножения матриц 32x32 должны  будут сгенерироваться процедуры для 16x16, 8x8 и т.д. Т.е. код сильно разбухает. Возникает вопрос как избежать этого trade off'а: и размер в компайл-тайме проверить и код не раздувать. Есть ли какие-то для этого механизмы в языках программирования вообще и в языках без non-type template parameters в частности?
Нужны завтипы
источник

M

MrSmith in Compiler Development
Kitsu
Не, просто обычный RAII. Скоуп закрылся -- память освободилась, никакой магии
Нет это не RAII,  holding a resource is a class invariant, and is tied to object lifetime, что говорит вики, и с чем сложно поспорить, а rust как раз про lifetime и про то что он вычисляется а не привязан к скоупу или не  менеджиться в ручную.
Проще говоря в расте обьект может жить и несколько с половиной скоупов завися от прописаных лайфтаймов
источник

AK

Andrei Kurosh in Compiler Development
В тайпскрипте также есть типы-литералы, на которых можно соорудить проверку на соответствие размеров матриц, а код генерится общий. Но перемножение матриц на джиесе так себе идея в любом случае :)
источник

PS

Pavel Samolysov in Compiler Development
Andrei Kurosh
Нужны завтипы
Т.е. это хороший кейс, чтобы попробовать языки с завтипами, idris там и его друзей?
источник

AT

Alexander Tchitchigi... in Compiler Development
Pavel Samolysov
Т.е. это хороший кейс, чтобы попробовать языки с завтипами, idris там и его друзей?
Конкретно для матриц и прочей аналитической геометрии можно обойтись refinement types.
источник

AT

Alexander Tchitchigi... in Compiler Development
Pavel Samolysov
Т.е. это хороший кейс, чтобы попробовать языки с завтипами, idris там и его друзей?
"Чтобы попробовать" кейс не очень хороший — начать предпочтительнее с чего-то попроще.
источник

AK

Andrei Kurosh in Compiler Development
Pavel Samolysov
Т.е. это хороший кейс, чтобы попробовать языки с завтипами, idris там и его друзей?
Это одна из задач, которую непосредственно решают завтипы. Но вот будет ли цена этого решения для вас оправданной - это открытый вопрос
источник

AT

Alexander Tchitchigi... in Compiler Development
источник

BD

Berkus Decker in Compiler Development
hazer_hazer
Я догадываюсь, что это, для того, чтобы как в плюсах не стрелять по ногам.
Но как компайл-тайм система управления памятью решает эту проблему?
аффинными типами и анализом лайфтаймов
источник

PS

Pavel Samolysov in Compiler Development
Alexander Tchitchigin
Конкретно для матриц и прочей аналитической геометрии можно обойтись refinement types.
Refinement type это тоже из области зависимых типов или есть что-то похожее в том же С++, может хаскеле (просто с этими языками хотя бы знаком)?
источник

AT

Alexander Tchitchigi... in Compiler Development
Pavel Samolysov
Refinement type это тоже из области зависимых типов или есть что-то похожее в том же С++, может хаскеле (просто с этими языками хотя бы знаком)?
Есть Liquid Haskell, реализующий, соответственно, Liquid Types.
источник

PS

Pavel Samolysov in Compiler Development
Спасибо большое за ссылку
источник

AT

Alexander Tchitchigi... in Compiler Development
Pavel Samolysov
Refinement type это тоже из области зависимых типов или есть что-то похожее в том же С++, может хаскеле (просто с этими языками хотя бы знаком)?
Refinement Types можно сделать как "подмножество" (или специализацию) полноценных зав. типов, но можно и не заходить так далеко, и обойтись 4 видами кайндов без полной зависимости типов от значений. 😊
источник

M

MrSmith in Compiler Development
Alexander Tchitchigin
"Compile-time memory management system" == RAII. В данном случае с вероятностью 99%. Хотя источник Вы не указали.
Нет, везде написано, что RAII это связывание времени жизни обьекта и управления ресурсами. Если я динамически заолоцирую к примеру Reader для файла, а потом вручную освобожу память, деструктор вызовется и закроет фаил.
Это и есть RAII - время жизни обьекта и ресурсов связанны, но никакого контроля времени жизни кроме рук в примере нет
источник

AT

Alexander Tchitchigi... in Compiler Development
MrSmith
Нет, везде написано, что RAII это связывание времени жизни обьекта и управления ресурсами. Если я динамически заолоцирую к примеру Reader для файла, а потом вручную освобожу память, деструктор вызовется и закроет фаил.
Это и есть RAII - время жизни обьекта и ресурсов связанны, но никакого контроля времени жизни кроме рук в примере нет
А с каких пор у нас оперативка — не ресурс? 😉
источник

AT

Alexander Tchitchigi... in Compiler Development
Pavel Samolysov
Спасибо большое за ссылку
Где-то ещё видео должно быть опубликовано.
источник

M

MrSmith in Compiler Development
Alexander Tchitchigin
А с каких пор у нас оперативка — не ресурс? 😉
Ресурс, но не ресурс класса, все просто класс его не контролирует значит не управляет им, вырожденые случае вида класс контролирует свою же память предлагаю не рассматривать
источник