OberonCore
https://forum.oberoncore.ru/

Критика строк в стиле Си на Хабре
https://forum.oberoncore.ru/viewtopic.php?f=27&t=5894
Страница 1 из 2

Автор:  prospero78 [ Вторник, 20 Сентябрь, 2016 10:35 ]
Заголовок сообщения:  Критика строк в стиле Си на Хабре

https://habrahabr.ru/post/126566/
Статья старая, может кто-то и читал. Но поскольку, строки в стиле Си ещё похоже долго будут использоваться -- статья не потеряет актуальности ещё долго))

Как-то я не задумывался над тем, что с длиной строки, обработку такой строки можно аппаратно ускорить. Кроме вопроса безопасности))

http://russian.joelonsoftware.com/Artic ... asics.html
Ещё одна статья про сложности строк в Си.

Автор:  Rifat [ Вторник, 20 Сентябрь, 2016 11:08 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

В Обероне тоже есть строки, которые заканчиваются нулём.
Код:
PROCEDURE Proc();
VAR str: ARRAY 100 OF CHAR;
BEGIN
  str := "Hello";
END Proc;

Допустить, мы будем хранить рядом со строкой еще одно число, где хранится длина текущей строки чтобы в дальнейшем можно было быстрее конкатенировать строки и так далее.
В данном случае, со словом Hello, у нас длина будет 5 символов.
Но что если в дальнейшем будет обращение к элементу массива str[1] := 0X; ?
Получается, что каждое присваивание элементу массива должно проверяться на то, что нет ли там нулевой строки и не уменьшилась ли строка.

Автор:  prospero78 [ Вторник, 20 Сентябрь, 2016 11:43 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Вопрос решается легко.
1. Ноль -- обозначает конец строки (хотя сам массив может быть гораздо длиннее).
2. В строке (буквально) хранить её длину первым числом -- неразумно.
Сделать примерно так:
Код:
TYPE
    tString: REACORD
        len:INTEGER;
        str:ARRAY 100 OF CHAR;
    END;
VAR
    str : tString
BEGIN
........

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

Во второй статье отличный анекдот про маляра Шлемиэля. Это про проблемы конкатенации в Си)) Не в бровь, а в глаз)) И инетерсные подробности работы malloc. Это практически недоделанный сборщик мусора!!!)))

Автор:  Valery Solovey [ Вторник, 20 Сентябрь, 2016 17:13 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Rifat писал(а):
Но что если в дальнейшем будет обращение к элементу массива str[1] := 0X; ?
Заменять все коды без графического обозначения на пробел или другой, специальный символ из имеющихся в кодовой таблице.

Автор:  Alexey_Donskoy [ Вторник, 20 Сентябрь, 2016 19:36 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Valery Solovey писал(а):
Заменять все коды без графического обозначения на пробел
Существует обширная практика хранения BLOB в строках. На самом деле удобно.

Автор:  Valery Solovey [ Вторник, 20 Сентябрь, 2016 20:43 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

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

Автор:  Valery Solovey [ Вторник, 20 Сентябрь, 2016 20:44 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Alexey_Donskoy писал(а):
Существует обширная практика хранения BLOB в строках. На самом деле удобно.
Это удобнее, чем обычный массив байт?

Автор:  Alexey_Donskoy [ Вторник, 20 Сентябрь, 2016 20:59 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Valery Solovey писал(а):
Это удобнее, чем обычный массив байт?
Зачастую да. Например, в Дельфе в TStringList укладывать.
Но, может, это только моя специфика, сейчас особо не с чем сравнивать...

Автор:  Борис Рюмшин [ Вторник, 20 Сентябрь, 2016 21:22 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

У сишников в строках проблема не в завершающем нуле, а отсутствии контроля границ массива.

Автор:  prospero78 [ Среда, 21 Сентябрь, 2016 09:33 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Борис Рюмшин писал(а):
У сишников в строках проблема не в завершающем нуле, а отсутствии контроля границ массива.

У сишников проблема в самом построении языка))
Статью вчера прочитал: "протечка абстракций".
Вот 146% про Си. И эти сквозные протечки -- неустранимы. С++ -- попытка устранить. Кривая))
Я не вижу протечку в Оберонах. Если, конечно, специально в потроха не лезть))

Автор:  Comdiv [ Вторник, 18 Октябрь, 2016 19:00 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Борис Рюмшин писал(а):
У сишников в строках проблема не в завершающем нуле, а отсутствии контроля границ массива.

В 0 тоже есть проблема. Когда содержимое строки получают извне, многие забывают проверить, чтобы в содержимом не было 0, так как в этом случае длина строки окажется короче ожидаемой. Такие особенности остро встают при работе над безопасностью приложения. Неправильного поведения программы можно добиться и без порчи памяти.
К слову, если бы проблема была только в отсутствии контроля границ, то её бы и не было вовсе, потому что современные компиляторы Си умеют их контролировать. Для получения такого контроля нужно использовать ключ -fsanitize=address , поддерживаемый и gcc, и clang. По моим наблюдениям для gcc программа замедляется раза в 3, но при включённой оптимизации всё равно работает быстрей эквивалентной программы на Blackbox.

Автор:  prospero78 [ Вторник, 18 Октябрь, 2016 19:28 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Это немножко из другой оперы.
Это про взаимодействие двух систем, поэтому здесь работает заповедь дедушки Вирта:"Вся программа должна строиться в оборонительном стиле". Поэтому при подобной ситуации программа на О может остановиться, но не упасть или улететь в космос. Это огромная разница.
Внутри правильных Оберонов подобная ситуация невозможна. Что касается быстродействия, тут опять же: я предпочту неубиваемый "Москвич" с предельной скоростью 120, чем смешной "Феррари", который развалится через 500 км на скорости 340 км в час. На практике проблема вычислительной мощности в 67% случаев перерастает в проблему ввода-вывода. Например, отрисовка на экране)))
Кроме того, включение такой опции безопасности в GCC говорит о том, что проблема не высосана из пальца. И эта опция неполноценна, так как это попытка заштукатурить кривой фундамент.

Автор:  Comdiv [ Вторник, 18 Октябрь, 2016 20:14 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Я отвечал не вообще, а конкретно на утверждение. Никто не убеждает, что нужно использовать Си, но:
1. Контроль за памятью в Си есть.
2. Проблема с завершающим нулём есть и при наличи контроля за памятью.
Остальное - лирика.

Автор:  Александр Ильин [ Вторник, 18 Октябрь, 2016 21:12 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

prospero78 писал(а):
заповедь дедушки Вирта:"Вся программа должна строиться в оборонительном стиле".
В "оберонительном".

Автор:  Илья Ермаков [ Четверг, 20 Октябрь, 2016 09:23 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Comdiv писал(а):
По моим наблюдениям для gcc программа замедляется раза в 3, но при включённой оптимизации всё равно работает быстрей эквивалентной программы на Blackbox.

Тут нужно отметить, у ББ вообще старый компилятор, медленный код не из-за только лишь границ массива (ну, желающие могут выключить контроль границ и проверить).
Хотя, очевидно, что это зависит от алгоритма, который меряем.
Реально, думаю, замедление должно быть из-за контроля границ на 5-20% (от алгоритма, опять же).
Именно такая цифра, по-моему, будет при сравнении C# и C++ на массивовых алгоритмах.
В С же требуется контролировать не просто массивы, а адресную арифметику, поэтому, конечно, замедление колоссальное - и используют его только в отладочном режиме, по сути.

Автор:  Илья Ермаков [ Четверг, 20 Октябрь, 2016 09:27 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Comdiv писал(а):
Я отвечал не вообще, а конкретно на утверждение. Никто не убеждает, что нужно использовать Си, но:
1. Контроль за памятью в Си есть.
2. Проблема с завершающим нулём есть и при наличи контроля за памятью.
Остальное - лирика.


Не, ну по большому счёту, что-то где-то всегда, можно сказать, есть, в каком-нибудь виде, если сову брать эластичную... :)

В release-сборках большинства приложений контроль за памятью деактивирован.
Если я не прав, просьба привести несколько противоположных примеров.
Таким образом.... хоть контроль за памятью в Си есть... контроля за памятью в Си-приложениях, как правило, нет...
Остальное - лирика :)

Автор:  Comdiv [ Четверг, 20 Октябрь, 2016 14:32 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Примеры есть, "но мы вам о них не расскажем" (С). Это не прихоть.

В проектах, где важна защищённость, но по каким-то причинам используется C эту возможность не отключают, если замедленной производительности достаточно.
Сборщик мусора тоже используют.

Автор:  Илья Ермаков [ Четверг, 20 Октябрь, 2016 17:53 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Ну, значит, речь о специфических, а не массовых, кейсах, верно?
А массовая статистика последствий от выхода за границы - убийственна, как известно.

Автор:  prospero78 [ Четверг, 20 Октябрь, 2016 19:13 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Хм...
1. Проверки используются...
2. Сборщик мусора используется....
Мы всё ещё говорим о Си?))))

Автор:  Илья Ермаков [ Четверг, 20 Октябрь, 2016 19:35 ]
Заголовок сообщения:  Re: Критика строк в стиле Си на Хабре

Консервативный сборщик там у них есть... Т.е. всякое значение, потенциально могущее указывать на объект кучи, трактуется как якорь (как в ББ для стека).

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/