Автор Тема: Чем плохи изменяемые строки?  (Прочитано 13867 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Чем плохи изменяемые строки?
« : Декабрь 18, 2012, 04:02:25 pm »
Наверно глупый вопрос, но я не врубаюсь.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #1 : Декабрь 18, 2012, 04:12:36 pm »
а что это )))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем плохи изменяемые строки?
« Ответ #2 : Декабрь 18, 2012, 04:17:04 pm »
Ну как в Оберонах например. (да, да - ARRAY OF CHAR  :) ) Могу изменить один символ и это не приведет к созданию копии строки. В Lua так сделать нельзя. Строки там неизменяемые и любые изменения приводят к копированию. И так сейчас вроде делают во всех современных языках. Почему?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #3 : Декабрь 18, 2012, 04:23:40 pm »
Ну как в Оберонах например. (да, да - ARRAY OF CHAR  :) )Почему?
Потому что в Обероне нет строк )
array of char он и есть array of char
а чтобы реализовать в виртовском компиляторе такие строки полчаса не хватит, поэтому они и плохи )

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #4 : Декабрь 18, 2012, 04:24:37 pm »
Ну как в Оберонах например. (да, да - ARRAY OF CHAR  :) )Почему?
Потому что в Обероне нет строк )
array of char он и есть array of char
а чтобы реализовать в виртовском компиляторе такие строки полчаса не хватит, поэтому они и плохи )
А кстати, нафига в язык вшивать строки? Никогда не понимал этого действа.
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #5 : Декабрь 18, 2012, 04:26:59 pm »
А кстати, нафига в язык вшивать строки? Никогда не понимал этого действа.

Чтобы сделать их неизменяемыми. См. сабж :)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #6 : Декабрь 18, 2012, 04:30:18 pm »
А кстати, нафига в язык вшивать строки? Никогда не понимал этого действа.
"вшитые" строки обладают определенным поведением и наделены неким набором определенных операций, известных на этапе компиляции и контролируемых. А так прижется вводить механизм операторов, опять в полчаса не уложиться

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем плохи изменяемые строки?
« Ответ #7 : Декабрь 18, 2012, 04:30:32 pm »
Ну как в Оберонах например. (да, да - ARRAY OF CHAR  :) )Почему?
Потому что в Обероне нет строк )
array of char он и есть array of char
а чтобы реализовать в виртовском компиляторе такие строки полчаса не хватит, поэтому они и плохи )
Array... да не совсем, т.к. есть дополнительный синтаксис для строк (присваивания, конкатенация...)
Но речь не об этом.

Вопрос: Почему в современных языках отдают предпочтение неизменяемым строкам?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #8 : Декабрь 18, 2012, 04:30:42 pm »
А кстати, нафига в язык вшивать строки? Никогда не понимал этого действа.

Чтобы сделать их неизменяемыми. См. сабж :)
Ну, ничто же не мешает их сделать неизменяемыми библиотечные строки. Ну, если язык конечно достаточно высокоуровневый ;-)
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #9 : Декабрь 18, 2012, 04:31:40 pm »
Наверно глупый вопрос, но я не врубаюсь.

Чтобы в твоей программе кнопка "Да" не могла поменяться на "Нет" только потому, что ты строчку "Да" отдал в чужую компоненту (а может и в свою, но забыл, что она модифицирует эту строчку).

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #10 : Декабрь 18, 2012, 04:34:19 pm »
Вопрос: Почему в современных языках отдают предпочтение неизменяемым строкам?
Скорость работы - копируется только указатель, ну или небольшой дескриптор, а реальное копирование происходит только при необходимости - при изменении

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #11 : Декабрь 18, 2012, 04:37:58 pm »
Наверно глупый вопрос, но я не врубаюсь.

Чтобы в твоей программе кнопка "Да" не могла поменяться на "Нет" только потому, что ты строчку "Да" отдал в чужую компоненту (а может и в свою, но забыл, что она модифицирует эту строчку).
По моему, очевидно что если кто-то хочет менять переменную, то на входе у него будет VAR-параметр (или не const, если у нас плюсцы), а если не хочет, то будет VAL. Не вижу проблем тащемто :-)

Не понятно почему именно для строк сделано это исключение, почему его нет например для чисел. Или там для сокетов :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Чем плохи изменяемые строки?
« Ответ #12 : Декабрь 18, 2012, 04:40:30 pm »
ОК. Тогда более конкретно:

Я люблю писать всякие алгоритмы над строками в следующем стиле:
1. завожу переменную buffer
2. перебираю исходную строку символ за символом и собираю нужные символы в буфер
3. при достижении опред. условий скидываю буфер в массив например.

В CP это делается максимально просто, удобно и эффективно.
В 1С мне похер, т.к. там эффективность меня обычно мало волнует.

В Lua я не знаю как такое провернуть (эффективно).
Начальный размер буферу я задать не могу. При добавлении символа буфер будет копироваться....

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #13 : Декабрь 18, 2012, 04:49:17 pm »
По моему, очевидно что если кто-то хочет менять переменную, то на входе у него будет VAR-параметр (или не const, если у нас плюсцы), а если не хочет, то будет VAL. Не вижу проблем тащемто :-)

Это не всегда очевидно. Сегодня у компоненты нет VAR, а завтра появился... и хорошо, если компиялтор про это скажет. Кроме того, VAR очень захочется поставить, если его отсутствие подразумевает копирование строки (массива) - типа оптимизация. А в случае изменяемых строк именно копирование и будет подразумеваться  ;)

В плюсах тоже самое - сегодня там const ссылка, завтра - не-const. Компилятор поймает, но не во всех ситуациях. И даже если там всегда const - это все равно ничего не гарантирует. Строка может придти по const ссылке, но это вовсе не означает константности самой строки - ее может поменять кто-то другой для кого она не-const. Я уже не говорю про const_cast<>...
Короче, изменяемые строки - однозначное зло.
« Последнее редактирование: Декабрь 18, 2012, 04:51:07 pm от vlad »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #14 : Декабрь 18, 2012, 04:53:34 pm »
ОК. Тогда более конкретно:

Я люблю писать всякие алгоритмы над строками в следующем стиле:
1. завожу переменную buffer
2. перебираю исходную строку символ за символом и собираю нужные символы в буфер
3. при достижении опред. условий скидываю буфер в массив например.

В CP это делается максимально просто, удобно и эффективно.
В 1С мне похер, т.к. там эффективность меня обычно мало волнует.

В Lua я не знаю как такое провернуть (эффективно).
Начальный размер буферу я задать не могу. При добавлении символа буфер будет копироваться....
Ну, не знаю как в луа, а во ВСЕХ современных языках несмотря на строки, никто массивы из char'ов не отменял. И их то как раз модифицировать можно как угодно.
Y = λf.(λx.f (x x)) (λx.f (x x))