01/12/2020, Alexander Tchitchigin¶
https://www.jeffsmits.net/assets/articles/sle20-paper4.pdf Gradually Typing Strategies
Статья рассказывает о применении популярной техники постепенной типизации (Gradual Typing) в необычной области – к языку переписывания термов Stratego (который используется для “program normalization, type checkers, program analyses, code generators, and more”). Несмотря на отсутствие проверки типов в Stratego до сего момента, он тем не менее послужил для вдохновения авторов Haskell фреймворка SYB.
Использование Gradual Typing (постепенной типизации) мотивировано двумя факторами. Первый – обратная совместимость, так как Stratego (в составе фреймворков Stratego/XT и Spoofax) используется в production-системах, разрабатываемых как в академии (researchr.org, conf.researchr.org, платформа онлайн-курсов TU Delft), так и в индустрии (где-то в недрах Oracle Labs). Второй – высокая “динамичность” переписывания термов, которая в некоторых случаях используется (а кто-то скажет “эксплуатируется”) для (временного) порождения нетипизируемых термов и превращения их обратно в типизируемые.
Дополнительно задача осложняется наличием в Stratego правил переписывания “высшего порядка” (называемых “стратегиями переписывания”), принимающих и применяющих другие правила переписывания (или стратегии). Отсюда возникает понятие Type-Preserving стратегий, реализующее ограниченную форму Higher-Kinded Types.
Кроме того, авторы применяют механизм “прозрачных” во время исполнения прокси-типов для того чтобы избежать накапливания лишних динамических преобразований типов при передаче правил переписывания из статически-типизированных стратегий в динамически-типизированные и обратно.
Проверка полученной системы типов на существующем проекте (учебный ассемблер для Java-байткода) продемонстрировала два достаточно ожидаемых результата: а) корректный динамический код написан так как если бы был статически типизирован, поэтому его легко аннотировать явными типами и почти не приходится при этом рефакторить; б) плохо протестированный динамический код содержит ошибки, которые легко обнаруживаются тайп-чекером (например, возврат списка вместо элемента — классика, сам на таком попадался).