Size: a a a

Compiler Development

2020 March 15

МБ

Михаил Бахтерев in Compiler Development
polunin.ai
fn substract(a: int, b: int) -> c: int{c <= a && c < b && b >= 0 || c > a } { a - b }
Стандартные вопросы: 1. Работает ли это уже для чего-то отличного от Nat и Pos? 2. Удалось ли уже реализовать переход от cons-овых векторов к обычным, индексируемым? 3. Если спецификация substract в три раза длиннее самого кода, что будет для реальных программ из пары тысяч операторов? 4. Почему я не могу написать substract a b = if b >= 0 then min a b - 1 else a + 1? 5. Что делать, если на множестве не определён частичный порядок? И т.д. и т.п.
источник

AT

Alexander Tchitchigin in Compiler Development
Михаил Бахтерев
Стандартные вопросы: 1. Работает ли это уже для чего-то отличного от Nat и Pos? 2. Удалось ли уже реализовать переход от cons-овых векторов к обычным, индексируемым? 3. Если спецификация substract в три раза длиннее самого кода, что будет для реальных программ из пары тысяч операторов? 4. Почему я не могу написать substract a b = if b >= 0 then min a b - 1 else a + 1? 5. Что делать, если на множестве не определён частичный порядок? И т.д. и т.п.
Сами посмотрите: https://project-everest.github.io/ 😉
источник

МБ

Михаил Бахтерев in Compiler Development
Я видел. И именно в этом, как мне кажется, проблема. Там около сотни тысяч строчек кода, для того, чтобы обосновать 300 строчек на Си 🤷🏿‍♂️
источник

МБ

Михаил Бахтерев in Compiler Development
И, если я верно понимаю, F* - это не только завтипы, но ещё и SMT-решатели.
источник
2020 March 16

p

polunin.ai in Compiler Development
Михаил Бахтерев
Стандартные вопросы: 1. Работает ли это уже для чего-то отличного от Nat и Pos? 2. Удалось ли уже реализовать переход от cons-овых векторов к обычным, индексируемым? 3. Если спецификация substract в три раза длиннее самого кода, что будет для реальных программ из пары тысяч операторов? 4. Почему я не могу написать substract a b = if b >= 0 then min a b - 1 else a + 1? 5. Что делать, если на множестве не определён частичный порядок? И т.д. и т.п.
3. В обычном коде вместо этого будет куча тестов, либо куча багов.
источник

p

polunin.ai in Compiler Development
Остальное не понял
источник

МБ

Михаил Бахтерев in Compiler Development
polunin.ai
3. В обычном коде вместо этого будет куча тестов, либо куча багов.
Почему?
источник

p

polunin.ai in Compiler Development
Потому что для функции
fn substract(a: int, b: int) -> int {
 return a-b;
}
Нужно сделать 3-4 теста, чтобы доказать что она работает правильно
источник

G

Gymmasssorla in Compiler Development
polunin.ai
Потому что для функции
fn substract(a: int, b: int) -> int {
 return a-b;
}
Нужно сделать 3-4 теста, чтобы доказать что она работает правильно
(И всё равно не докажешь)
источник

p

polunin.ai in Compiler Development
Gymmasssorla
(И всё равно не докажешь)
Ну можно предполагать что если она на определенных данных ведёт себя правильно, то и на других будет все ок
источник

G

Gymmasssorla in Compiler Development
Да, _предполагать_
источник

МБ

Михаил Бахтерев in Compiler Development
polunin.ai
Потому что для функции
fn substract(a: int, b: int) -> int {
 return a-b;
}
Нужно сделать 3-4 теста, чтобы доказать что она работает правильно
Зачем? Проблема в том, что рассматриается вырожденный случай, когда всем всё понятно, что правильно. А в реальных задачах типы становятся очень большими, доказательства очень длинными.

Если моя задача составлять proof-ы, то это ok, я обеспечен почётной работой до конца жизни. Но если моя задача что-то вычислить, переслать данные, разумно ли тратить время на такую степень формализации? Компилятор же тут сам ничего толком не выведет
источник

p

polunin.ai in Compiler Development
Михаил Бахтерев
Зачем? Проблема в том, что рассматриается вырожденный случай, когда всем всё понятно, что правильно. А в реальных задачах типы становятся очень большими, доказательства очень длинными.

Если моя задача составлять proof-ы, то это ok, я обеспечен почётной работой до конца жизни. Но если моя задача что-то вычислить, переслать данные, разумно ли тратить время на такую степень формализации? Компилятор же тут сам ничего толком не выведет
Если у тебя очень длинное доказательство, это повод разбить функцию на более мелкие
источник

К

Константин in Compiler Development
Проблема в том, что рассматриается вырожденный случай, когда всем всё понятно, что правильно
А этот очевидный случай как раз неправильный и система доказательства полной корректности бы его не приняла.
Ну и вполне нормально написать в спецификации что result = a - b,  а не городить всё то, что тут было предложено
источник

M

MaxGraey in Compiler Development
polunin.ai
3. В обычном коде вместо этого будет куча тестов, либо куча багов.
но ведь ошибки можно допустить и при написании самих пруфов;)
источник

FO

FORTRAN ONE LOVE in Compiler Development
Alexander Tchitchigin
Насчёт внешних зависимостей вообще не понятно - я не припоминаю генератора парсеров, который бы использовал внешние зависимости.

Насчёт человекочитаемости - сделать-то более-менее можно, просто у генераторов парсеров в приоритете скорость разбора и потребление памяти, а это противоречит человекочитаемости. Ну и вообще, не очень понятно зачем кому-то сильно вчитываться в сгенерированный код?..
Иногда надо изучать кодогенерированный код, чтобы найти ошибки в своем коде, поэтому хорошо бы иметь возможность читать сгенерированный код
источник

FO

FORTRAN ONE LOVE in Compiler Development
polunin.ai
fn substract(a: int, b: int) -> c: int{c <= a && c < b && b >= 0 || c > a } { a - b }
А пачку условий, если левый и / или правый меньше 0?
источник

МБ

Михаил Бахтерев in Compiler Development
Константин
Проблема в том, что рассматриается вырожденный случай, когда всем всё понятно, что правильно
А этот очевидный случай как раз неправильный и система доказательства полной корректности бы его не приняла.
Ну и вполне нормально написать в спецификации что result = a - b,  а не городить всё то, что тут было предложено
А какой смысл писать result = a - b, если  и так написано substract a b = a - b? Ведь, чисто с технической точки зрения, мы просто увеличиваем корректность кода повторением одного и того же в двух разных местах. Но, ведь, нет никаких гарантий, что ошибка именно на уровне типов, а не на уровне термов. Во-вторых, тесты делают то же самое. И можно строго доказать, что не нужно проверять каждую функцию в программе, а достаточно проверять свойства на верхнем уровне, и тогда с высокой степенью вероятности substract будет вести себя, как -.

Прошу прощения за offtopic, но для меня этот вопрос животрепещущий в дизайне языка, поэтому я задаю все эти глупые вопросы. То есть, я не противник полезности типов, но мне бы хотелось понять истинную их ценность.

Я вот недавно фигачил в марафонском режиме математический код на Схеме (сам не знаю, как так получилось), задача про bigdata, и структуры данных там были не самые тривиальные. Ошибки в типах при этом были редким явлением и совсем примитивное тестирование их обнаруживало сразу же. Основные ошибки были в самих вычислениях, даже в самой математической модели. И если бы мне пришлось всякий раз менять систему доказательств (даже если принять, что я мог бы выразить всю нужную мне математику в типах), я бы и за год не справился бы с этой задачей. Это можно утверждать наверняка, потому что есть же пример Certigrad,  где для обоснования простого градиентного спуска потребовалась годовая работа института. Хотя, на бумажке это делается минут за 15.

Вот и вопрос... А язык я делаю именно для таких нагрузок (ну, то есть, получается, под себя и коллег). По идее, мне нужен не такой инструмент, который заставляет меня повторять в очень сложном формализме все мои алгоритмические заморочки, а такой, который по коду предсказывает возможные проблемы в исполнении. Чтобы я сразу видел, что вот тут есть шанс вызвать #undefined, как функцию, и вот тебе тестовый контрпример.

Или нет? Что я не вижу, не замечаю и игнорирую?
источник

AT

Alexander Tchitchigin in Compiler Development
MaxGraey
но ведь ошибки можно допустить и при написании самих пруфов;)
А вот этого нельзя - чекер не пропустит... Можно сделать ошибку в типах/спецификации, но вот в доказательстве - нельзя.
источник

AT

Alexander Tchitchigin in Compiler Development
FORTRAN ONE LOVE
Иногда надо изучать кодогенерированный код, чтобы найти ошибки в своем коде, поэтому хорошо бы иметь возможность читать сгенерированный код
Поскольку генерируется код, а не бинарник, изучать его всегда можно. Некоторым-то и бинарник не проблема. 😊
Другое дело, что этот код ничем человеческий не напоминает.
источник