Lingua Franca избавляет от гонок данных ещё на этапе компиляции
Intuitive concurrent programming in any language
Lingua Franca — это координационный язык для детерминированных многопоточных и распределённых систем, который устраняет гонки данных по построению и придаёт времени чёткую семантику. Логику реакторов можно писать на C, C++, Python, TypeScript или Rust, а анализ причинно-следственных связей отвергает некорректные программы, например цикл, где игрок пытается увидеть выбор соперника раньше собственного хода. Проект вырос из исследований UC Berkeley при участии Kiel University, TU Dresden и других.
Если бы класс Player пытался увидеть выбор соперника до того, как сделает свой, анализ причинно-следственных связей Lingua Franca обнаружил бы петлю причинности и сообщил, что программа некорректна.
- samuell
Мне нравится, что пример кода, похоже, указывает на то, что они взяли концепцию «портов» из потокового программирования (flow-based programming), которая, возможно, является одним из его абсолютно сильнейших преимуществ:
player2.reveal -> player1.observe
player1.reveal -> player2.observe
То есть, обеспечение соединений потока данных между отдельными входами/выходами, а не только между компонентами, что иначе слишком ограничительно и обычно требует много дополнительного синтаксиса для обработки такой маршрутизации.
Писал об этом в контексте систем рабочих процессов давным-давно (https://livingsystems.cc/posts/workflows-dataflow-not-task-d...)
---
Правка 11:12 CET: Я понимаю, что «именованные порты» лучше передают то, что я имел в виду здесь, как подробно описано в комментарии ниже.
- XCabbage
На первый взгляд я не совсем понимаю, какую проблему это должно решить. Было бы неплохо увидеть простую пример-программу с параллелизмом, написанную на чистом Python, затем обсуждение раздражающего учёта, связанного с избеганием ошибок параллелизма, и какие ловушки легко поджидают, а затем пример того, как то же самое было бы реализовано с использованием Lingua Franca, и объяснение того, как это устраняет учёт и ловушки.
- phyzome
Питч для лифта нужно доработать.
«на любом языке», но затем на странице сказано: «В настоящее время мы поддерживаем C, C++, Python, TypeScript и Rust».
«Lingua Franca — это язык координации», но затем «Не новый язык программирования».
Кажется, я понимаю, к чему это ведёт, но описания нуждаются в значительном улучшении.
- Garlef
Мне кажется, главный пример на целевой странице немного противоречит интуиции?
Камень-ножницы-бумага, но граф представляет раскрытие как реакцию на наблюдение? В цикле? И где-то есть минимальная задержка в волшебную 1 секунду? Почему 1 секунда, а не 0,1 секунды? Может ли это накапливаться, и игроки выйдут из синхронизации? (Немного странно «просто подождать, лол», если язык нацелен на решение проблем в распределённых системах).
В целом пример был бы лучше, если бы он отделил игру от игроков, а также выделил цикл повторения.
Может быть, позволить обоим игрокам раскрыться перед хостом, а затем получить результат (и выбор) ~ Таким образом, оба игрока могут быть уверены, что выбор другого игрока не зависит от наблюдения.
(Я знаю, что пример «корректен» в том смысле, что выбор делается независимо от наблюдения, но я думаю, что пример можно улучшить, если он более чисто решит некоторые проблемы координации, связанные со сценарием, через архитектуру кода).
В целом мне очень нравится идея наличия этого полиглотного метаязыка!
- gbin
Если вам нравится эта идея и вы работаете в робототехнике, попробуйте copper-rs, он работает на той же основополагающей концепции, но во время компиляции на Rust + описание графа.
Последнее дополнение к ядру — это функция планирования с профилированием, которая позволяет оптимизировать параллелизм графа всё ещё во время компиляции на основе предыдущих измерений времени из его детерминированных журналов.