OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 22:30

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Пятница, 05 Сентябрь, 2008 19:08 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 252
Откуда: Austria, Bruck
http://russian.joelonsoftware.com/Artic ... asics.html

Интересно


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Пятница, 05 Сентябрь, 2008 20:39 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
hothing писал(а):
Интересно
Помню, изучая Компонентный Паскаль после обычного Паскаля мне пришлось много думать о том, как же выстроить стратегию работы со строками.
С одной стороны есть LEN, а с другой стороны str$, COPY и ноль на конце...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Суббота, 06 Сентябрь, 2008 00:55 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Александр Ильин писал(а):
Помню, изучая Компонентный Паскаль после обычного Паскаля мне пришлось много думать о том, как же выстроить стратегию работы со строками.
С одной стороны есть LEN, а с другой стороны str$, COPY и ноль на конце...


На самом деле все очень просто. Строки с нулем на конце нужны только для WinAPI (ну или других внешних либ). Если они возникают где-то еще, значит вы используете их не по назначению, со всеми вытекающими :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Суббота, 06 Сентябрь, 2008 01:44 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Александр Ильин писал(а):
hothing писал(а):
... изучая Компонентный Паскаль после обычного Паскаля мне пришлось много думать о том, как же выстроить стратегию работы со строками. ...

По-моему, это всё равно, что думать о том, как выстроить работу с целыми числами при наличии нескольких целочисленных типов -- разве нет?
(Мы тут про КП, не про Оберон или О-2.)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Суббота, 06 Сентябрь, 2008 09:57 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Vlad писал(а):
На самом деле все очень просто. Строки с нулем на конце нужны только для WinAPI (ну или других внешних либ). Если они возникают где-то еще, значит вы используете их не по назначению, со всеми вытекающими :)
Казалось бы, это так. Но стандартная процедура COPY копирует строку не целиком, а до нулевого символа. Присваивание "a := b" копирует целиком, но работает только при условии, что a и b одного типа. Если b получено в процедуру как open array, т.е. без указания типа, присваивание невозможно, остаётся либо COPY, либо самописанный цикл. Конкатенации строк (+) в Обероне[-2] вообще нет.

Проблема в том, что язык сохраняет для программиста различение между контейнером (массив символов) и содержимым (используемым объёмом - до нулевого символа). В КП признали наличие проблемы и ввели символ $, чтобы явно из контейнера вытаскивать содержимое до нуля, после чего такое содержимое сделали совместимым по присваиванию с любым контейнером, обойдя чрезмерную типобезопасность. Добавили и конкатенацию. Вот цитата из "Docu/CP-New/What is New in Component Pascal.odc": "The + operator now allows to concatenate strings. The target variable must be of sufficient length to hold the resulting string".

Видите, переменная-результат не будет, а должна иметь достаточный размер. Если я не хочу трэпа, а хочу заранее убедиться в таком предусловии или даже выделить нужную память - как мне следует поступить? Просуммировать LEN каждого из параметров и в результате выделить память с большим запасом? Или померить длину каждого из них до нуля и сложить эти значения? Я понимаю, что можно выполнить LEN(s$) для всех элементов, но по производительности это будет только хуже.

Когда я продумывал стратегию работы со строками, у меня был соблазн считать так, как предлагает Vlad и на преимущество чего указывает Сполски, - что длина строки = LEN контейнера. В этом случае ноль в конце ставить не нужно, ну разве что для общения с ОС и прочими внешними библиотеками. Однако для констант компилятор сам добавляет ноль, не спрашивая меня. Без нуля не работает COPY (Оберон) и "$" (КП) - придётся использовать SYSTEM.MOVE с присущими ему рисками и вообще импортом SYSTEM. Да и вообще, получается как минимум непоследовательность: где-то нули есть, а где-то нет.

Если уж нули нужны, то пусть лучше будут везде, подумал я. Пусть реальная длина строки будет LEN-1, с этим неудобством можно смириться, применяя одни кострукции и воздерживаясь от других (скажем, используя везде WHILE i < LEN, но не FOR i := 0 TO LEN). Всё равно это константное смещение, а не интервал - длина строки равна LEN-1, а не 0..LEN-1, как в случае если 0X завершает строку. Возвращаясь к разбору конкатенации, я должен выделить под результат число байт = (сумме LEN всех компонентов минус число компонентов) плюс один. Однако снова проблема: конкатенация не всегда будет давать всегда строку ожидаемой длины, поскольку любой 0X в середине строки будет считать завершающим. На уровне компилятора укоренено представление о том, что строка завершается нулём - так было в Обероне, так осталось в КП. Значит, конкатенация в варианте КП для меня бесполезна, всё равно надо создавать библиотечную функцию. У пользователя такой библиотеки будет возникать вопрос - в каком случае что использовать.

Есть ещё один немаловажный аспект, о котором пишет Сполски, - производительность. Гораздо дешевле размещать контейнеры фиксированного размера в стеке, чем динамической длины в куче. Здесь Оберон/КП перекладывают принятие решений на разработчика: критичные по быстродействию вещи лучше написать без динамической памяти. Учитывая это, более эффективным для конкатенации решением будет существующее: есть контейнер фиксированного размера, накидаем в него куски строк, а в конце добавим ноль. В результате добавление каждого фрагмента сопровождается двумя вычислениями длины, то есть, преимущества паскалевских строк для этой типичной операции - потеряны. И LEN ничем уже помочь не может.

В общем, я пришёл примерно к такому выводу. Работу со строками лучше вынести в [стандартную] библиотеку или полностью встроить в компилятор. Наличие в компиляторе полумер только маскирует проблему, откладывая её решение. И чем больше таких полумер заложено в компилятор, тем сложнее написать библиотеку, совместимую со всеми этими огрызками решений. В идеале строка не должна ничего общего иметь с массивом символов, достаточно предусмотреть конвертацию одного в другое, и всё. Для работы со строками должны быть свои библиотечные функции, либо - по соображениям эффективности - языковые операции. Строка и контейнер должны чётко различаться, и работа со строками должна быть воможной без оглядки на контейнер. Если хочешь работать на уровне контейнеров - работай с массивами символов. Если хочешь работать со строками, то работай с ними. В последнем случае должно работать прозрачное выделение памяти под содержимое и быть моментально доступным знание о реальной длине строки. Не думаю, что удастся полноценно совместить работу нижнего и верхнего уровня, если поместить это в библиотеку, а не в компилятор. Но это пока что только мнение.

В Обероне 2007 были какие-то подвижки на тему строк, сейчас не припомню.

Кстати, кто-нибудь знает какую-нибудь хорошую книгу или статью про эффективную работу со строками?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Суббота, 06 Сентябрь, 2008 10:02 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Info21 писал(а):
По-моему, это всё равно, что думать о том, как выстроить работу с целыми числами при наличии нескольких целочисленных типов -- разве нет?
Ну, какую-то аналогию найти можно, наверное. Почему-то с целыми числами у меня никаких проблем не возникало, так что лучше поясните, что вы имеете в виду. Конечно, иногда бывает "жаба давит" и думаешь, INTEGER брать или SHORTINT. А вот производительность основных операций или работы с динамической памятью для целых типов далеко не так актуальны (в моей практике).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Воскресенье, 07 Сентябрь, 2008 06:48 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Александр Ильин писал(а):
В общем, я пришёл примерно к такому выводу. Работу со строками лучше вынести в [стандартную] библиотеку или полностью встроить в компилятор.
По-хорошему, компилятор должен давать возможность переопределения реализации работы со строками по требованию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Воскресенье, 07 Сентябрь, 2008 07:50 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
GUEST писал(а):
Александр Ильин писал(а):
В общем, я пришёл примерно к такому выводу. Работу со строками лучше вынести в [стандартную] библиотеку или полностью встроить в компилятор.
По-хорошему, компилятор должен давать возможность переопределения реализации работы со строками по требованию.

На фиг, на фиг такой компилятор...

"В библиотеку, жывотное!" (С)
//ув. GUEST понимает, что призыв не к нему//


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Воскресенье, 07 Сентябрь, 2008 18:04 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Info21, если Вам хотелось что-то мне сказать лично, можно было написать в ЛС. Мне это польстило бы. К сожалению, действия по изменению языка зависят не только от нас с Вами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Воскресенье, 07 Сентябрь, 2008 18:58 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
GUEST писал(а):
Info21, если Вам хотелось что-то мне сказать лично, можно было написать в ЛС. ...

Уверяю Вас, я бы так и поступил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Воскресенье, 07 Сентябрь, 2008 19:39 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Александр Ильин писал(а):
В идеале строка не должна ничего общего иметь с массивом символов, достаточно предусмотреть конвертацию одного в другое, и всё... Строка и контейнер должны чётко различаться, и работа со строками должна быть воможной без оглядки на контейнер. Если хочешь работать на уровне контейнеров - работай с массивами символов. Если хочешь работать со строками, то работай с ними. В последнем случае должно работать прозрачное выделение памяти под содержимое и быть моментально доступным знание о реальной длине строки. Не думаю, что удастся полноценно совместить работу нижнего и верхнего уровня, если поместить это в библиотеку, а не в компилятор. Но это пока что только мнение.
Почему строка не должна иметь ничего общего с массивом (из сказанного выше я не понял)? И что Вы называете контейнером в таком случае? По-моему, если есть тип "строка", то он и является контейнером.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Понедельник, 08 Сентябрь, 2008 09:34 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 252
Откуда: Austria, Bruck
А по мне оптимальное решение было найдено, дла Форта (sPF). В строке хранится и длина, и оконечний нуль. Есть и еще интересное решение: хранить максимальную длину строки и реальную. Но более затратно по памяти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Понедельник, 08 Сентябрь, 2008 09:54 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну уж максимальную длину блока памяти хранить и гарантировать границы - об этом и говорить нечего. Куда без этого.
Увы, наша древняя PC-архитектура не имеет аппаратных средств для этого. Но она не вечна :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Понедельник, 08 Сентябрь, 2008 16:20 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Александр Ильин писал(а):
Но стандартная процедура COPY копирует строку не целиком, а до нулевого символа.


Ну и не используйте ее, если она заточена под сишные убогие строки :)

Александр Ильин писал(а):
Присваивание "a := b" копирует целиком, но работает только при условии, что a и b одного типа. Если b получено в процедуру как open array, т.е. без указания типа, присваивание невозможно, остаётся либо COPY, либо самописанный цикл.


Дык, кто мешает написать свою Strings.Assign? Чтобы не писать цикл и чтобы не использовать COPY?

Александр Ильин писал(а):
Конкатенации строк (+) в Обероне[-2] вообще нет.


Аналогично. В библиотеку. Хотя, конечно, без перегрузки операторов грустно, но оберонщики сами хотели все писать явно :)

Александр Ильин писал(а):
Видите, переменная-результат не будет, а должна иметь достаточный размер. Если я не хочу трэпа, а хочу заранее убедиться в таком предусловии или даже выделить нужную память - как мне следует поступить?


Забить на статические массивы и использовать нормальные динамические строки :) В библиотеке. Как это сделали в C++ ;)

Александр Ильин писал(а):
У пользователя такой библиотеки будет возникать вопрос - в каком случае что использовать.


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

Александр Ильин писал(а):
Есть ещё один немаловажный аспект, о котором пишет Сполски, - производительность. Гораздо дешевле размещать контейнеры фиксированного размера в стеке, чем динамической длины в куче. Здесь Оберон/КП перекладывают принятие решений на разработчика: критичные по быстродействию вещи лучше написать без динамической памяти.


Ну и как часто вам приходится писать критические по быстродействию вещи? ;) Лично мне, например, "ускорять" строковые операции за счет отказа от динамической памяти пришлось только один раз. Это в C++, где динамическая память тормозная. А в языках с нормальным GC, выделение памяти в куче - это несколько процессорных инструкций...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Понедельник, 08 Сентябрь, 2008 22:34 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Vlad писал(а):
Забить на статические массивы и использовать нормальные динамические строки :) В библиотеке. Как это сделали в C++ ;)
Вы имеете ввиду STL, где нет проверок на выход за диапазон? :lol:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Понедельник, 08 Сентябрь, 2008 23:59 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
slava писал(а):
Vlad писал(а):
Забить на статические массивы и использовать нормальные динамические строки :) В библиотеке. Как это сделали в C++ ;)
Вы имеете ввиду STL, где нет проверок на выход за диапазон? :lol:


Да, STL, где нет трапов при копировании и конкатенации строк ;) И проблем с нулевыми символами в строке тоже нет ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Вторник, 09 Сентябрь, 2008 09:53 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Александр Ильин писал(а):
Кстати, кто-нибудь знает какую-нибудь хорошую книгу или статью про эффективную работу со строками?

Тонкости работы со строками


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Вторник, 09 Сентябрь, 2008 10:01 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Vlad писал(а):
slava писал(а):
Vlad писал(а):
Забить на статические массивы и использовать нормальные динамические строки :) В библиотеке. Как это сделали в C++ ;)
Вы имеете ввиду STL, где нет проверок на выход за диапазон? :lol:
Да, STL, где нет трапов при копировании и конкатенации строк ;) И проблем с нулевыми символами в строке тоже нет ;)
Нет трапов, но есть crash'ы так же как и в char[].
Причем для константных строк и строк, с неизменяемым размером, все равно используется char[] (нет нагрузки на heap).

Это в чистом виде Lack of Abstraction (по Джоэлу) :wink: .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Вторник, 09 Сентябрь, 2008 13:55 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
PGR писал(а):
Александр Ильин писал(а):
Кстати, кто-нибудь знает какую-нибудь хорошую книгу или статью про эффективную работу со строками?

Тонкости работы со строками
По-моему, это не то, Что искал Александр. Его, скорее, интересовали принципы, а не использование конкретных инструментов конкретного языка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Джоэл Сполски, Назад, к основам
СообщениеДобавлено: Вторник, 09 Сентябрь, 2008 15:03 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
slava писал(а):
Нет трапов, но есть crash'ы так же как и в char[].


А еще в C++ оператор присваивания обозначается значком '='. Вы мне хотите рассказать про недостатки C++ или чего? Так я их и так очень хорошо знаю. У вас конкретные претензии к дизайну std::string есть, вроде тех о которых говорил Александр Ильин применительно к встроенным обероновским строкам?

slava писал(а):
Причем для константных строк и строк, с неизменяемым размером, все равно используется char[] (нет нагрузки на heap).


Где вы начитались этих отрывочных сведений? Во-первых, что там используется внутри std::string - лично дело писателей STL. Во-вторых, для коротких строк некоторые имплементации могут обходиться без использования хипа. В-третьих, для эффективных константных строк (если уж они понадобились) используют свои велосипеды с отличным от std::string дизайном, заточенным под константные операции (в частности, у такой строки просто не будет операции изменения размера).

slava писал(а):
Это в чистом виде Lack of Abstraction (по Джоэлу) :wink: .


Нет, это у вас в чистом виде lack of knowledge. Зато желания кинуть какашку хоть отбавляй :)


Последний раз редактировалось Vlad Вторник, 09 Сентябрь, 2008 15:20, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB