Size: a a a

Compiler Development

2020 April 21

МБ

Михаил Бахтерев in Compiler Development
А с какой стороны раскрыть? Bash запускает процессы и ими оперирует.
источник

KR

K R in Compiler Development
Михаил Бахтерев
А с какой стороны раскрыть? Bash запускает процессы и ими оперирует.
Ну я просто не понимаю эту фразу.

Чем это качественно отличается от обычных функций в контексте?
источник

LW

Lev Walkin in Compiler Development
две «функции» могут быть одновременно запущены и постепенно потреблять результаты работы друг друга
источник

МБ

Михаил Бахтерев in Compiler Development
K R
Ну я просто не понимаю эту фразу.

Чем это качественно отличается от обычных функций в контексте?
Ну... Даже не знаю, как на пальцах объяснить.

Функция при вычислении даёт результат. Во время вычисления она, как бы, замкнута в себе. Нельзя залезть внутрь этого вычисления. Поэтому, какой-нибудь сокет со внешним, неопределённым внутренне подключением нельзя выразить на языке функций.

Процессы же открыты к своему окружению. Подключиться и повлиять на результат можно.
источник

KR

K R in Compiler Development
Михаил Бахтерев
Ну... Даже не знаю, как на пальцах объяснить.

Функция при вычислении даёт результат. Во время вычисления она, как бы, замкнута в себе. Нельзя залезть внутрь этого вычисления. Поэтому, какой-нибудь сокет со внешним, неопределённым внутренне подключением нельзя выразить на языке функций.

Процессы же открыты к своему окружению. Подключиться и повлиять на результат можно.
То есть, в данном случае существенно то, что функция является ораклом.

Но посмотрите, тогда какой-нибудь ленивый fold, применённый к потоку, вполне ведёт себя как процесс.
источник

МБ

Михаил Бахтерев in Compiler Development
K R
То есть, в данном случае существенно то, что функция является ораклом.

Но посмотрите, тогда какой-нибудь ленивый fold, применённый к потоку, вполне ведёт себя как процесс.
Нет. Оракулы - это другая концепция. Поцессы детерминированы. Недетерминировано их исполнение. Оракулы же недетерминируемы в принципе.
источник

KR

K R in Compiler Development
Михаил Бахтерев
Нет. Оракулы - это другая концепция. Поцессы детерминированы. Недетерминировано их исполнение. Оракулы же недетерминируемы в принципе.
Какая разница, кстати? Мы же наблюдаем только результат исполнения.
источник

E

Eugene in Compiler Development
ещё Дейкстра полвека назад учил, что надо уметь жить в недетерменированном мире, ибо детерменированность — лишь подмножество недетерменированности...
источник

МБ

Михаил Бахтерев in Compiler Development
K R
То есть, в данном случае существенно то, что функция является ораклом.

Но посмотрите, тогда какой-нибудь ленивый fold, применённый к потоку, вполне ведёт себя как процесс.
Нет. Вы не можете повлиять на fold в процессе его вычисления. Только аргументом. Но аргумент тоже будет формироваться функцией.

Моделировать процессы (замкнутые) можно функциями. И обратно: мы все функции вычисляем процессами. Но отличия есть.
источник

МБ

Михаил Бахтерев in Compiler Development
K R
Какая разница, кстати? Мы же наблюдаем только результат исполнения.
Сокет. Процессом описывается, функцией - нет. Вполне наблюдаемая разница.
источник

МБ

Михаил Бахтерев in Compiler Development
Eugene
ещё Дейкстра полвека назад учил, что надо уметь жить в недетерменированном мире, ибо детерменированность — лишь подмножество недетерменированности...
Это сложно. Пространства состояний растут экспоненциально быстро.
источник

KR

K R in Compiler Development
Михаил Бахтерев
Сокет. Процессом описывается, функцией - нет. Вполне наблюдаемая разница.
Ок. То есть, функция в чисто cs смысле. Ок. Перечитываю с учётом этого вышенаписанное.
источник

МБ

Михаил Бахтерев in Compiler Development
K R
Ок. То есть, функция в чисто cs смысле. Ок. Перечитываю с учётом этого вышенаписанное.
Эмс... Ну. Да. Не в философском, а в конкретном. Ну, чтобы можно было с этим определением вычислять.
источник

МБ

Михаил Бахтерев in Compiler Development
Но просто же call-by-need относится именно к этому понятию функции: частично определённые функции, заданные lambda-выражениями.
источник

KR

K R in Compiler Development
Михаил Бахтерев
Но просто же call-by-need относится именно к этому понятию функции: частично определённые функции, заданные lambda-выражениями.
Увы, это как в анекдоте про математика и воздушный шар - в реальных ЯП функций не бывает, есть процессы.

Более того, скрипты на bash крайне редко используют дополнительные каналы управления, помимо stdin.
источник

МБ

Михаил Бахтерев in Compiler Development
K R
Увы, это как в анекдоте про математика и воздушный шар - в реальных ЯП функций не бывает, есть процессы.

Более того, скрипты на bash крайне редко используют дополнительные каналы управления, помимо stdin.
В реальных ЯП всё вычисляется в процессах, но эти процессы могут представлять именно функции. И call-by-need относится к этому поведению. Именно поэтому в Haskell нужна IO, чтобы запрятать другие процессы под неё.
источник

KR

K R in Compiler Development
Михаил Бахтерев
В реальных ЯП всё вычисляется в процессах, но эти процессы могут представлять именно функции. И call-by-need относится к этому поведению. Именно поэтому в Haskell нужна IO, чтобы запрятать другие процессы под неё.
Ну да. :-(
источник

МБ

Михаил Бахтерев in Compiler Development
Вот. А сами процессы всегда энергичные. Там прямо доказывается, что ленивость и энергичность эквивалентны для них. Ну. Хм... Или всегда ленивые. В общем, не суть. Это другая абстракция.

И интересно, что Bash и UNIX позволяют с ними работать почти как со значениями и при помощи функций. Это так-то большое достижение инженерной мысли. Задолго до монад.
источник

KR

K R in Compiler Development
Михаил Бахтерев
Вот. А сами процессы всегда энергичные. Там прямо доказывается, что ленивость и энергичность эквивалентны для них. Ну. Хм... Или всегда ленивые. В общем, не суть. Это другая абстракция.

И интересно, что Bash и UNIX позволяют с ними работать почти как со значениями и при помощи функций. Это так-то большое достижение инженерной мысли. Задолго до монад.
Оно нестрогое. Обычный яп тоже работает с процессами как с функциями «почти наверняка». А R, например, вообще реализует «ленивые функции с побочными эффектами». И это почти всегда нормально работает.

Bash и pipes реализуют  условный «ленивый fold», но это не новость.
источник

KR

K R in Compiler Development
В pipes есть одно отличие от ленивых списков - вызов flush. То есть, более тонкий контроль выполнения. Интересно, это осмысленно как-то в Хаскели вставлять?
источник