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/ |