Разработка системы эффектов для языка Cangjie
Во многих языках программирования существуют системы эффектов — способы контролировать побочные эффекты в системе типов. Например, это Checked Exceptions в Java, Result-типы в Rust и Go, а Haskell и вовсе построен на концепции, что по умолчанию функции являются чистыми и все побочные эффекты должны быть указаны. Большинство систем эффектов, которые используются в промышленных языках, довольно сложные в использовании, предполагают инвазивное встраивание в существующие программы, и/или ограничены в области применения (Java Checked Exceptions, пожалуй, самый показательный пример — несмотря на повышение безопасности, их используют крайне редко).
С 2019 года Huawei занимается разработкой нового промышленного языка Cangjie. Сейчас в нем не существует системы эффектов, а так как язык сравнительно новый, можно надеяться, что first-class реализация будет активно использоваться. Чтобы сделать систему эффектов для Cangjie, я взял Safer Exceptions из Scala и расширил этот подход для более качественного взаимодействия с языком.
Мой подход отличается от Safer Exceptions в Scala тем, что Scala — функциональный язык, и неявные параметры (которые являются ядром технической реализации) используют также и для других целей (например, для классов типов). Из-за этого неявные параметры задизайнены так, что чтение кода с ними очень затруднено, существуют глобальные имплиситы и т. п. Моя реализация системы эффектов в Cangjie проще для понимания, ошибки при рефакторинге возникают реже (что, по сути, является основной проблемой Scala).
Разница с системами эффектов из других языков в том, что моя версия более гибкая (например, можно работать с произвольными эффектами в отличие от типов-ошибок) и более эргономичная в случае императивных языков (например, не требует дубликации стандартной библиотеки в отличие от монад).
В итоге система, которую я реализовал, поможет улучшить код на Cangjie, а также ее можно внедрить в другие (существующие или новые) промышленные языки, избежав указанных выше недостатков.