Что такое струны Паскаля?

Названы ли они после языка программирования или математика?

Каковы определяющие характеристики строк Паскаля? В Статья в Википедии о строках кажется, что определяющим признаком является сохранение длины строки в первом байте. В другой статье мне кажется, что макет памяти строк также важен.

Во время просмотра несвязанного потока SO кто-то сказал, что строки Pascal делают Excel быстрым. В чем преимущества строк Pascal над строками с нулевым завершением? Или, в общем, в каких ситуациях строки Pascal превосходят?

Строки Pascal реализованы на любых других языках?

Наконец, я использую оба слова ( "Pascal Strings" ) или только первые ( "строки Паскаля" )? Я технический писатель...

Ответ 1

Строки Паскаля стали популярными благодаря одной конкретной, но огромной влиятельной реализации Pascal, названной UCSD. Таким образом, строки UCSD - лучший термин. Это та же самая реализация, которая сделала популярные интерпретаторы байт-кода.

В общем, это не один конкретный тип, а основной принцип наличия размера, предваряемого символьными данными. Это позволяет получить длину постоянной операции (O (1)) вместо сканирования символьных данных для нулевого символа.

Не все Паскали использовали эту концепцию. IIRC, оригинальная (семидесятая) конвенция заключалась в том, чтобы космос заполнить выделение и отсканировать назад для символа без пробела (что делает невозможным прерывание строк). Более того, поскольку программное обеспечение в основном использовалось изолированно, использовались всевозможные схемы, часто основанные на том, что было выгодно для этой реализации/архитектуры.

Самые популярные диалекты из Borland (Turbo Pascal, Delphi и Free Pascal) обычно основываются на диалекте UCSD и, следовательно, имеют паскальные строки, Delphi в настоящее время имеет 5 таких строк. (short/ansi/wide/unicode/open)

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

Итак, вместо этого, скопировав строку, используя

while (p^) do begin P^=p2^; inc(p) inc(p2); end;

что полностью эквивалентно

while (*s++ = *t++);

в C при использовании оптимизирующего компилятора.

вам нужно сделать, например.

while (len>0) do begin p^:=p2^; inc(p) inc(p2); dec(len); end;

или даже

i:=1;
while (i<=len) do begin p[i]:=p2[i]; inc(i); end;

Это привело к тому, что количество команд в цепочке строк Pascal немного больше, чем эквивалентная строка с нулевым завершением, и добавляет еще одно значение в реальном времени. Кроме того, UCSD был языком интерпретатора байт-кода (p-code), а последний код, основанный на использовании строки pascal, является "безопасным".

В случае архитектуры, которая построила операторы post increment (++) (например, PDP-8,11 C была разработана для первоначально), версия указателя была еще дешевле, особенно без оптимизации. В настоящее время оптимизация компиляторов может легко обнаружить любую из этих конструкций и преобразовать их в лучшее.

Более важно то, что с начала 90-х годов безопасность стала более важной и, в основном, исключительно полагаясь на свойство null terminated strings, неодобрилась, поскольку небольшие ошибки в проверке могут вызвать потенциально возможные проблемы с переполнением буфера. C и его стандарты, таким образом, не одобряли использование старой строки, а теперь используют версии "-n-" старых строковых подпрограмм (strNcpy и т.д.), Которым требуется максимальная длина. Это добавляет одно и то же дополнительное значение в реальном времени, подобное длине, например, как управляемый вручную принцип паскальских строк, где программист должен позаботиться о передаче длины (или максимального размера буфера для функций C -N). Строки Паскаля по-прежнему имеют преимущество перехода к последнему занятому char в операции O (1) и тому факту, что нет запрещенных символов.

Строки с префиксом длины также широко используются в формате файла, потому что, очевидно, полезно количество байтов для чтения вперед.

Ответ 2

Это старое название, относящееся к тем временам, когда "язык C в сравнении с языком Паскаля" был фактически сравним людей. В зависимости от того, кого вы спросите, он либо специально сохраняет длину в первом байте, либо ссылается на любой префикс длины (два байта, четыре байта). Другие данные управления памятью не включены, они зависят от реализации и не имеют принципиального отличия от строк C.

Строки Паскаля превосходят... все. Строки, завершенные NUL, сохраняют от одного до трех байтов на коротких строках, которые, возможно, были полезны в 1970 году, но даже не стоит упоминать сегодня практически во всех обстоятельствах. Помимо того, что невозможно хранить нулевой байт (что не так уж плохо для текста, но исключает любые двоичные данные), вы не можете эффективно определять длину строки. Это отрицательно влияет на хорошую часть строковых алгоритмов. Например, в комментарии, к которому вы ссылаетесь, является сравнение строк: если у вас есть длина, вы можете мгновенно return false при сравнении строк разной длины. Есть также много других недостатков, не связанных с производительностью.

По этим причинам практически каждая реализация языка выше, чем около 1980 года, использует префиксы длины для строк. Это еще одна причина, по которой имя "pascal string" устарело.