Oberon-строки с длиной без подсчёта

Как известно, в языке Oberon строку можно поместить в массив литер, добавив завершающий 0X. Это приводит к потребности подсчёта длины, когда она необходима, что может приводить к избыточным накладным расходам. Но в отличии от языка C в Oberon из-за требования безопасности памяти также всегда доступен размер массива. Это даёт возможность хранения сведений о конце строки так, чтобы её длину не приходилось подсчитывать.

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

Но что, если разница между размером массива и длиной строки больше 100H ? Всё просто — это означает, что в хвосте массива очень много свободного места, поэтому длину строки можно хранить в нём любым удобным способом, а узнать длину можно будет в два приёма.

Недостатком подхода может служить более сложная поддержка правильности хранения длины при поэлементной обработке строк в массивах. В то же время подсчёт длины может быть воплощён очень производительно, если вместо поэлементного перебора использовать векторные инструкции. В пределах длины около 300 такое воплощение остаётя вполне приемлемым по времени работы, и только при очень больших строках разница становится драматичной. Но нужны ли такие строки? Даже ответ на вопрос «нужны ли строки в самом языке?» совсем не очевиден, если не обращаться исключительно к традиции.