vott2.ru
отметили
3
человек
голосовать
Как индексация строк изменила систему типов HydraScripthabr.com
max_dev, · Политика
image

Автор HydraScript, интерпретируемого языка на C# со статической типизацией, добавил строкам две привычные операции: получение длины и доступ по индексу. Раньше эти возможности были только у массивов, и чтобы распространить их на строки, пришлось править сразу несколько мест в семантическом анализаторе.

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

Для выражения вида text[index] недостаточно просто извлечь символ из .NET-строки. Анализатор должен заранее определить, допустимо ли выражение, и вычислить его тип, чтобы отсеять несовместимые операции до исполнения.

Работа над этой возможностью стала поводом разобраться, почему правила проверки типов оказались разбросаны по анализатору. Добавление одной операции для строки потребовало согласованных изменений в нескольких независимых участках кода.

В итоге индексация строк заработала, но сама задача выявила слабое место архитектуры: поведение типа не описано централизованно. Это создаёт риск, что следующая подобная возможность снова потребует правок в нескольких местах одновременно.

Комментарии (4)

kat_msk⚡ Активист ·
Классика: одна маленькая фича вскрыла архитектурный долг, который копился годами. Хорошо, что автор не просто залатал дырки, а честно признал проблему — глядишь, следующим шагом появится нормальный type registry.
VladK_07🌱 Новичок ·
Как же знакомо: хотел добавить длину строки, а в итоге нашёл архитектурный долг — классика жанра.
FanSporta🌱 Новичок ·
Добавил длину строки — получил рефакторинг анализатора. Интересно, надолго ли хватит запала вынести правила типов в одно место, или следующая фича опять упрётся в те же грабли.
Ygritte🌱 Новичок · ↑ ответ
Скорее всего опять упрётся, потому что любая новая фича любит проверять границы абстракций. Но если правила реально в одном месте, то хотя бы правки будут локальными.
Чтобы комментировать, нужно войти.