Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет yigal_s ([info]yigal_s)
@ 2011-09-18 14:16:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
the main C++ pattern of programming
I've come to the conclusion that any programmer that would prefer the project to be
in C++ over C is likely a programmer that I really *would* prefer to piss
off, so that he doesn't come and screw up any project I'm involved with.

(C) Linus T.

От так. Пойду учить С. Там, кстати, как, построение вручную таблиц виртуальных функций не практикуется еще в больших проектах? Мне как-то один противник С++ гордо показывал макросы, с помощью которых он в С "может сделать то же самое".


(Добавить комментарий)


[info]heller_i@lj
2011-09-18 15:19 (ссылка)
Торвальдс широко известен своими неадекватными и не в меру мудаковатыми высказываниями.

(Ответить) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-18 15:23 (ссылка)
я его, кстати, практически не читал.
ни в речах, ни в сорсах :-)

но всегда интересно послушать умного человека. даже если он не прав, он может излагать содержательные и небезынтересные вещи.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]heller_i@lj
2011-09-18 15:43 (ссылка)
тон его высказываний конкретно о с++ очень далёк от компетентности и профессионализма.

(Ответить) (Уровень выше)


[info]cmm@lj
2011-09-18 15:31 (ссылка)
Там, кстати, как, построение вручную таблиц виртуальных функций не практикуется еще в больших проектах?

практикуется, натурально.  вот в том же линуксе, собственно, всю дорогу.
а что? :)

(Ответить) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-18 15:44 (ссылка)
да так, ничего. там Линус и ООП ругает по ходу дела заодно.

)))

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]cmm@lj
2011-09-18 15:51 (ссылка)
ругает он какие-то гипотетические "объектные модели".
а что такое "ООП" вообще никому не известно!

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-18 18:01 (ссылка)
* что такое "ООП" вообще никому не известно!

Вроде классики на эту тему что-то такое говорили. Инкапсуляция, наследование и этот, как его, полиморфизм. Инкапсуляцию и наследование я уже освоил, классные вещи, а полиморфизм этот на самом деле только усложняет код.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]cmm@lj
2011-09-19 00:54 (ссылка)
да-да :)

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

так вот: хрен бы даже с ним с самим сиплюсплюсом, а вот с сиплюсплюсниками каши не сваришь!

(Ответить) (Уровень выше)


[info]iwr@lj
2011-09-19 04:58 (ссылка)
> Инкапсуляцию и наследование я уже освоил, классные вещи, а полиморфизм этот на самом деле только усложняет код.

Да фсё ж наоборот!
От наследования одни прамблемы, инкапсуляция (как её обычно юзают) - зло, а вот полиморфизьм - это весч! Только если он статический :-р.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 12:36 (ссылка)
да, статический полиморфизм - вещь.

Я вообще думаю, что развитие С++ наконец придет к тому, что исходные данные будут передаваться в качестве параметров темплейта, а работа программы будет заключаться в её компиляции.

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 12:40 (ссылка)
Пральна. А для всего остального есть питон!

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 19:58 (ссылка)
питон тоже надо перевести на с++ темплейты и все остальные языки тоже. то есть все языки должны вычисляться в результате раскрытия темплейтов в С++.

(Ответить) (Уровень выше)


[info]dumalkin@lj
2011-09-18 16:11 (ссылка)
Практикуется.
Вообще виртуальные функции с точки зрения программиста, любящего контролировать каждую инструкцию микрокода - бардак и бедлам, не говоря уже о том, что page faults могут случится в совершенно невинных с точки зрения кода местах.
В действительно больших (50-100 человеко/лет и больше) проектах, тянущихся 5-10 лет, попытка писать весь код в Ace-стиле, согласно последним указаниям С++ комитета, приводит к жуткому и неподдерживаемому коду, хуже которого может быть только проект написанный на Perl людьми, свободно на нем общающимися.

(Ответить) (Ветвь дискуссии)


[info]iwr@lj
2011-09-18 16:36 (ссылка)
> Вообще виртуальные функции с точки зрения программиста, любящего контролировать каждую инструкцию микрокода - бардак и бедлам,

А с т.з. программиста, любящего контролировать напряжение на каждой ноге каждого транзистора, "инструкции микрокода" - бардак и бедлам ;-)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dumalkin@lj
2011-09-18 16:37 (ссылка)
Транзисторы - это уже другой факультет. Настоящие программисты железками не занимаются :)

(Ответить) (Уровень выше)


[info]iwr@lj
2011-09-18 16:36 (ссылка)
> попытка писать весь код в Ace-стиле, согласно последним указаниям С++ комитета

:-О
это что за указания?!
пруфлинк не подкините?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dumalkin@lj
2011-09-18 16:39 (ссылка)
В смысле ? Пруфлинк на стандарты С++ ?
Ну тут вроде должны быть - http://www.open-std.org/jtc1/sc22/wg21/

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-18 17:09 (ссылка)
А где там про "Ace-стиль"?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dumalkin@lj
2011-09-18 17:20 (ссылка)
Фраза "писать весь код в Ace-стиле, согласно последним указаниям С++ комитета"
подразумевает что "Асе стиль" написания кода, в том числе, включает в себя написание кода использующего последние фичеры языка, стандартизованные (раз последние) - в последних указания (стандартах) комитета.

Пруфлинк на формальное определение Асе-стиля, комитета вообще и С++ комитета в частности, обязательности следования каким либо рекомендациям / указаниям, равно как и документированное доказательство непричастности вышеозначенного комитета к Заговору Сионистских Мудрецов - искать не буду.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-18 17:42 (ссылка)
Гм. Я считал, что выражение "АСЕ-стиль" означает как раз таки ровно противоположное "коду использующему последние фичеры языка", а именно, эдакий говнокод в стиле жёсткого фреймворка на "Cи-с-классами", с кучей макросов, собственных велосипедов и прочих радостей.
А "код, использующий последние фичеры языка" - это, скорее, asio-стиль ;-). И вот он как раз весьма элегантен и очень просто поддерживается.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dumalkin@lj
2011-09-18 17:56 (ссылка)
С asio отдельно не встречался, если это вариация/часть Буста - то Буст мне не понравился :)
С Асе в производстве встречался - и он мне не понравился :)
Вообще после .Нет (на Java не работал, возможно похоже) для больших проектов трудно найти что-то более подходящее (это не повод для холивара) - можно быстро с группой 3 умных, 10 серых и 5 тупых сделать нечто вполне приличное.
На различных вариациях С++ фреймворков надо больше народа в целом, и больший процент умных.

Мы пишем на этом - http://www.mprest.com/Products_mCore.aspx
Судя по всему какие-то общие идеи (асинхронность, как минимум) с asio перекликаются.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 04:55 (ссылка)
> (это не повод для холивара)

отчего же :-р

> можно быстро с группой 3 умных, 10 серых и 5 тупых сделать нечто вполне приличное

В общем, да. Только эти трое умных от дотнета за полгода изрядно отупеют :))). Придётся каждые полгода брать новых!

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 12:10 (ссылка)
не, ну наверное можно и на дотнете что-то очень нетривиальное залудить.

Т.е. по моим не очень значимым наблюдениям, проекты на Java и С# в среднем проще и примитивнее проектов на С++ (я имею в виду не сложности борьбы с ручным менеджментом памяти, конструкторами копирования и прочими С++ проблемами). Но это не означает, что на Java или C# нельзя залудить очень серьезный проект. И вот там народ тупеть никак не будет.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 12:46 (ссылка)
Народ тупеть не будет в предметной области. Т.е. если человек - спец в какой-нить там комп.лингвистике или в вижене, то ясень пень, его специализация ни от какого дотнета не пострадает. Но есть ведь ещё такой зверь как программер an sich. И с ним от дотнета обязательно произойдёт что-то нехорошое.


> Но это не означает, что на Java или C# нельзя залудить очень серьезный проект

Джаву вообще вынесем за скобки, это на редкость мудацкая хрень.
А что касается C# мы его любим явно не за сборщик мусора и множественное наследование интерфейсов )). А за лямбду, за генераторы, за linq, наконец. Т.е. за... костыли - в твоём определении :-р.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 13:05 (ссылка)
нет, я как раз считаю, что можно и как программисту развиваться под дотнетом. Просто для этого нужно решать нетривиальные задачи в области программирования, а не предметной области. Такие задачи тоже встречаются, и на них можно расти.

Т.е. конечно от борьбы с ветрянными мельницами в С++ можно тоже неплохо прокачать интеллект, но весь этот онанизм с ловлей очередного memory-corruption, потерянной или преждевременно освобожденной памятью и изысками темплейтного недо-метапрограммирования изрядно задолбал.


(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 13:13 (ссылка)
> но весь этот онанизм с ловлей очередного memory-corruption, потерянной или преждевременно освобожденной памятью

Мля, ты уже 125-й раз упоминаешь memory management. Да нету в 2011 г. в c++ ручного управления меморями!! А если кто-то кое-где у нас порой таким занимается, то вывести его в чисто поле, поставить лицом к стенке и пустить пулю в лоб!

> и изысками темплейтного недо-метапрограммирования

А вот это очень даже приятственный онанизм. Главное совмещать его со свежим воздухом :-р.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 13:40 (ссылка)
* Да нету в 2011 г. в c++ ручного управления меморями

я долго долго смеялся.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 13:48 (ссылка)
Ну и здря.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 14:06 (ссылка)
точно так же ты мог 20 лет назад написать смартпоинтеры, кто мешал? при чем тут С++ 2011?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 14:13 (ссылка)
Я не говорил ничего про c++ 2011!
Я говорил о подходах, которые применяются сейчас чаще, чем раньше. Ну, типа, люди немного научились писать на этом мостре, knowledge-base поднакопился, компиляторы стали нормальные, и т.д..

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 14:28 (ссылка)
* Я не говорил ничего про c++ 2011!

А это? " нету в 2011 г. в c++ ручного управления меморями"

)))

* люди немного научились писать на этом мостре

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 14:30 (ссылка)
> А это? " нету в 2011 г. в c++ ручного управления меморями"

Читат умеэш, да? В 2011 г., а не в c++11.

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

а он ещё и книги издавал?
во гад, нажывался на простом трудовом народе!!

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 15:00 (ссылка)
ты понимешь, что смарт-поинтеры можно уже в 96-м писать и не чесаться? Что в 98-м уже все практически программисты Вындоуз знали AddRef-Release решение в DCOM? то ж мне америку открыл.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 16:24 (ссылка)
А ты понимаешь, что одно дело "могли писать", а другое - распространение идей в массах? В 96-м это, может быть, делали александрески и саттеры, а сегодня написана туева хуча книг и статеек, которые не читал только совсем ленивый ламер. Массовая психология, знаешь ли.
Я уж не говорю о том, что в 9х-м, конечно, каждый мог изобрести свой shared_ptr, weak_ptr, bind и т.п., но сегодня они УЖЕ ЕСТЬ out of the box.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 16:36 (ссылка)
ну объясни мне, как мне заиметь конструкт вроде new, возвращающий шаред поинтер, что-то вроде

shared_ptr< IBase > ptr= shared_new CDerived(arg1, arg2);

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 16:44 (ссылка)
не понял, зачем тебе именно "конструкт вроде new"?
Вот так пойдёт?
shared_ptr< IBase > ptr(new CDerived(arg1, arg2));
Или, если ты беспокоишься о фрагметации хипа, то:
shared_ptr< IBase > ptr = make_shared< CDerived > (arg1, arg2);

Или ты хочешь "идеальный форвардинг" арг1, арг2?
Поясни, в чём, такскать, поинт.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 17:35 (ссылка)
как зачем?

Теоретически, чтобы в С++ не было поинтеров в юзер-коде )))

Практически, чтоб в аргументы функции передавать, которая ожидает смарт-поинтера.

Скажем

f( shared_new CDerived(arg1, arg2) ) - я согласен видеть, а

f( shared_ptr< IBase >(new CDerived(arg1, arg2) ) уже не согласен по целому ряду обстоятельств.

> shared_ptr< IBase > ptr = make_shared< CDerived > (arg1, arg2);

Ух-ты! Это то что надо. Теперь расскажи мне, как я мог бы подобное написать скажем, в 2009-м году, не говоря уже о 1999-м. Внимательно тебя слушаю.

* Или ты хочешь "идеальный форвардинг"

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 17:44 (ссылка)
> f( shared_ptr< IBase >(new CDerived(arg1, arg2) ) уже не согласен по целому ряду обстоятельств

Я тут вижу только одно обстоятельство: в более общем виде (если, например, таких аргумента 2) это будет не exception-safe. Но кто тебе мешает присвоить это сперва временному shared_ptr, я так и не понял. Именно так это обычно приличные люди и делают :).


> Теперь расскажи мне, как я мог бы подобное написать скажем, в 2009-м году, не говоря уже о 1999-м.

Я что-то не понял... Ты хочешь, чтобы я тебе доказал твой собственный тезис, которым ты пытался опровергать мой?! Это же твои слова были, что мол уже 96-м можно было писать всё что хош.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 18:13 (ссылка)
* Я тут вижу только одно обстоятельство: в более общем виде (если, например, таких аргумента 2) это будет не exception-safe.

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

* Это же твои слова были, что мол уже 96-м можно было писать всё что хош.

Так я ж и говорю, что куча моих проектов в 99-м - 2001-м пролетели именно потому, что всё, что многое из того, что можно было С ВИДУ написать в С++, реально было не юзабильно.

Т.е. дело совсем не в том, что появились библиотечные стандартные смартпоинтеры, а в том, что и с ними всё было практически грустно вплоть до последнего времени. Ну а теперь со всяким вашим идеальным форвардингом, r-value reference, l-value reference, referenct им. левой пятки и прочим всё будет совсем монструозным, стоит чуть-чуть отойти от юзеровского кода. И сам понимаешь, каждый нормальный юзер захочет написать всё же что-то своё в подобном стиле, т.е. вся эта монструозная многословная хрень потечет в проекты как по трубам.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 18:28 (ссылка)
> Так я ж и говорю, что куча моих проектов в 99-м - 2001-м пролетели именно потому, что всё, что многое из того, что можно было С ВИДУ написать в С++, реально было не юзабильно.

Ну слихуйте. Вообще-то эта ветка была про memory-management, а не про решение задачи форвардинга. То, что в до C++0x-ные времена решения у этой задачи в общем случае не было, никак не пасулит raii вообще и shared_ptr в частности.
Мой же поинт заключался всего лишь в том, что раньше эти подходы юзали только спецы вроде тебя, а сейчас их юзает каждый лох (типа меня). Распространилось, такскать, высокое знание в народе.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 19:08 (ссылка)
Ну ты меня похож обогнал в знании плюсов, не прибедняйся уж.

И не юзал я эти подходы ни разу, почему - долгая история, но, возможно, это было ошибкой. При том, что сейчас всё это юзаю и не особо в восторге, кстати.

(Ответить) (Уровень выше)


[info]yigal_s@lj
2011-09-19 18:24 (ссылка)
* Но кто тебе мешает присвоить это сперва временному shared_ptr, я так и не понял.

Фигня какая-то. То обещают смарт-поинтеры, то просят не писать длинных выражений, поскольку память может потеряться. Как говорится, либо крестик снимите, либо трусы оденьте.

* Именно так это обычно приличные люди и делают :)

"приличный человек", синоним "терпила"

(Ответить) (Уровень выше)


[info]yigal_s@lj
2011-09-19 18:31 (ссылка)
т.е. я с твоим тезисом разбирался, что мол в 2011м году нет ручного управления памятью. А тут вдруг выясняется, что стандарт, неимоверными и мудацкими выкрутасами обеспечивший возможность писать что-то приличное с неручным управлением, вышел... две недели назад )))

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 18:44 (ссылка)
эхх
мля...
либо у тебя проблемы с пониманием прочитанного, либо у меня с написанием написанного :))

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 19:08 (ссылка)
да всё нормально, я так, гоню слегка.

(Ответить) (Уровень выше)


[info]yigal_s@lj
2011-09-19 20:03 (ссылка)
в целом, nice talk, хорошо пообщались, как в добрые старые времена )))

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-20 03:37 (ссылка)
ага, только плова "самаркандского" не хватало ))

(Ответить) (Уровень выше)


[info]yigal_s@lj
2011-09-19 20:10 (ссылка)
кстати, наш разговор натолкнул меня на одну оригинальную промышленную идейку. Нечто, чего мне не хватало на моей последней израильской работе.

Мне б её лет так 10 назад - это было бы очень круто. Но, возможно, и сегодня она где-то потянет.

Если хочешь, готов приватно поделиться )))

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-20 03:13 (ссылка)
Давай, делись скрытым комментом )).
А скока бабла я на этой идейке смогу срубить? :-Р

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-20 11:24 (ссылка)
я лучше в чате, или по скайпу или письмом.

увы, за такие мелочи денег не платят.

Я, кстати, еще один момент припомнил.

Допустим, есть у тебя вся из себя навороченная с++ программа с шаред-поинтерами. Только вот беда, у объектов в С++ бывают члены - тоже объекты. Как такой объект передать куда-то? По указателю или ссылке - нельзя, ведь кто-то эту ссылку может запомнить, а объект потом пропадёт. Шаред-поинтер, опять же, вроде бы такие изыски не поддерживает.

Опять же, представь себе, что ты создаешь объект на стеке. И хочешь передать его в функцию. А функция, вот беда, написана в лучших традициях и принимает только шаред-поинтеры, или референсы на константные шаред поинтеры, но никак не простой референс или указатель.

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-20 13:19 (ссылка)

> я лучше в чате, или по скайпу или письмом

ok :)

>Только вот беда, у объектов в С++ бывают члены - тоже объекты. Как такой объект передать куда-то? По указателю или ссылке - нельзя, ведь кто-то эту ссылку может запомнить, а объект потом пропадёт. Шаред-поинтер, опять же, вроде бы такие изыски не поддерживает.


Гм. Вот так пойдёт?

#include < boost/shared_ptr.hpp >

struct inner
{
int i_;
};

struct outer
{
int o_;
inner i_;
};


int main()
{
using boost::shared_ptr;
shared_ptr< outer > o(new outer());
shared_ptr< inner > i(o, &o->i_);
// i and o manage the *same* object!
}


> Опять же, представь себе, что ты создаешь объект на стеке. И хочешь передать его в функцию. А функция, вот беда, написана в лучших традициях и принимает только шаред-поинтеры, или референсы на константные шаред поинтеры, но никак не простой референс или указатель.

Несогласный я. Принятие функцией (константной) ссылки на объект - это один дизайновый "мессежд", а принятие шаред птра - другой мессежд. Если ф-ция принимает шаред птр, она говорит: "что я с ним буду делать - не твоё дело, на то он и *шаред*". Если же ф-ция, выходя, заканчивает работу с объектом, то никакого "дизайнового" смысла в принятии шареда нет, и это просто лишнее ограничение - сиречь проёб.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-20 13:41 (ссылка)
* Гм. Вот так пойдёт?

Ну так, знаешь, кривовато выглядит. Но лучше чем ничего. Сойдет. Хотя, кривовато.

> Опять же, представь себе, что ты создаешь объект на стеке. И хочешь передать его в функцию. А функция, вот беда, написана в лучших традициях и принимает только шаред-поинтеры, или референсы на константные шаред поинтеры, но никак не простой референс или указатель.

> Если же ф-ция, выходя, заканчивает работу с объектом, то никакого "дизайнового" смысла в принятии шареда нет, и это просто лишнее ограничение - сиречь проёб.

По-моему, помнить о том, какая функция заканчивает работу с объектом, а какая нет, и давать им в зависимости от этого разные прототипы - довольно утомительно. Это, кстати, еще одна особенность работы с памятью в С++ без garbage collector.

И заметь, ты сам признался, что в твоём дизайне raw-поинтеры будут использоваться в 80-90% случаев.

Как-то всё это стрёмно выходит.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-21 11:33 (ссылка)
> По-моему, помнить о том, какая функция заканчивает работу с объектом, а какая нет, и давать им в зависимости от этого разные прототипы - довольно утомительно. Это, кстати, еще одна особенность работы с памятью в С++ без garbage collector.

Я что-то потерял нить. А как в языке с GC ты собрался передавать в функции "объекты на стеке"??
Как ты понимаешь, чисто технически нет никакой проблемы передать в f(const shared_ptr< void > &) объект, созданный на стеке. Проблема здесь именно дизайнового плана.


> ты сам признался, что в твоём дизайне raw-поинтеры будут использоваться в 80-90% случаев

Не говорил я такого. Я говорил, что можно "окказионально" передавать raw-поинтеры в те места, где они заведово используются синхронно - на управление временем жизни это никак не влияет.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-21 12:19 (ссылка)
* А как в языке с GC ты собрался передавать в функции "объекты на стеке"??

А в чем проблема? GC прекрасно может разобраться, что объект сидит на стеке, а не в хипе, и освобождать его не актуально.

* Как ты понимаешь, чисто технически нет никакой проблемы передать в f(const shared_ptr< void > &) объект, созданный на стеке.

Не-а. Не понимаю.

* Я говорил, что можно "окказионально" передавать raw-поинтеры в те места, где они заведово используются синхронно

таких мест в программе как раз 80-90%. Т.е. получается сборная солянка из шаред-поинтеров и обычных поинтеров с перспективой перепутать одно и другое.


(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-21 12:23 (ссылка)
>> * Как ты понимаешь, чисто технически нет никакой проблемы передать в f(const shared_ptr< void > &) объект, созданный на стеке.
> Не-а. Не понимаю.

yourFunction(shared_ptr(&stackObj, null_deleter));

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-21 13:09 (ссылка)
чудесно. спасибо за ликвидацию безграмотности!

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-21 13:11 (ссылка)
стёб detected

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-21 13:16 (ссылка)
никакого стёба. я как бы помню, что в бустовских указателях конфигурируется стратегия уничтожения, но как-то подзабыл все преимущества этого конкретного подхода.

Т.е. там где я работаю, мы эту конфигурацию делаем чуть по другому, и я сам когда писал смарт-поинтеры в далеком прошлом, делал конфигурирование по-другому. Со своими преимуществами и недостатками. Ну вот и... не осознаю всей мощи бустовского варианта. А ты подсказал/напомнил.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-21 13:19 (ссылка)
Кстати, это уже давно tr1 и даже некоторое время std (msvc10) :).

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-21 13:52 (ссылка)
Всё это хорошо, конечно.

Вот только одно "Но". Как минимум одно. Есть куча ситуаций, когда надо детерминированно закрывать ресурс. Вся эта игра в garbage collection построена на том, что мы притворяемся, что у нас есть неограниченная память, и нам всё равно, когда реально кто-то там подчистит то, что не использовуется больше. Шаред-поинтеры - ущербная имплементация того ж garbage-collector.


Однако, в ситуациях, когда деструктор объекта выполняет нетривиальную работу, или когда эта работа тривиальна, но есть другая "закрывающая функция", скажем, как "close" в файлах, которая делает нетривиальную работу и должна быть вызвана "во время", все эти концепции смарт-поинтеров пролетают. Т.е. мы почти избавились от memory-corruptions и "как бы" почти избавились от memory-leaks, но всё равно где-то как-то нам придется следить за тем, кто кем владеет и кто в каком порядке что освобождает. И снова возникает явное управление ресурсами, если не их "освобождением", то их "закрытием".

Вот такая фигня.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-21 14:01 (ссылка)
Таки ровно наоборот, имхо: шаред-поинтеры - это не "ущербная имплементация того ж garbage-collector", а схема, при которой у тебя, с одной стороны, есть возможность автоматического управления временем жизни, а с другой стороны, - это время жизни остаётся абсолютно детерминированным. Т.е. решаешь - на этапе дизайна - сколько кому жить.
Да, конечно, проёб в дизайне приведёт к (псевдо)утечке, но:
1) с GC он приведёт к тому же гораздо быстрее, потому что там надо вручную вообще всё финализировать (не считая левых примочек типа дотнетовского using).
2) без GC и без шаред-поинтеров такие проёбы обычно приводят к крэшу, и чинить его гораздо сложнее, чем псевдоутечку.

Т.о., шаред-поинтеры - оптимальный вариант.
А такой схемы, чтоб программа сама писалась всё само как надо закрывалось и не корруптилось, кажется, ещё не придумали ;-).

(Ответить) (Уровень выше)


[info]yigal_s@lj
2011-09-21 13:54 (ссылка)
т.е. по сути, та же проблема возникает снова, на этот раз она чревата не memory corruption and leaks, а использованием закрытых ресурсов и незакрытыми вовремя ресурсами.

"Те же яйца, вид сбоку".

Хотя, конечно, в целом приятнее дело иметь со вторым, а не с первым.

(Ответить) (Уровень выше)


[info]yigal_s@lj
2011-09-21 16:31 (ссылка)
мда... а ведь и вправду мог бы быть стёб. Оказывается, как мне объяснили опытные люди, это решение сосёт.

Подробности в приват.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-22 02:46 (ссылка)
А чего в приват? Коммерческая тайна? :)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-22 12:19 (ссылка)
причины привата - снова в приват )))

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-22 15:40 (ссылка)
Ну давай, пиши в приват :)

(Ответить) (Уровень выше)


[info]yigal_s@lj
2011-09-19 13:43 (ссылка)
* А вот это очень даже приятственный онанизм.

Вот уж дудки. 90% моих промышленных идей (а не просто для развлечения) в этой области пошли прахом из-за кривого дизайна С++ тех времен.

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 13:48 (ссылка)
Мда... МК52 плохо темплейты компилировал :)).

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 14:05 (ссылка)
я пока-что ничего не говорил про компиляторы. только про С++ сам по себе.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 14:18 (ссылка)
Aa, "из-за кривого дизайна С++" - это вообще до стандарта 98-го года?
Меня тогда ещё не было :)).

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 14:26 (ссылка)
98-го, 2003-го, 2009-го.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 14:27 (ссылка)
А, ну тогда не знаю... В бусте всё работает.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 14:29 (ссылка)
Работает то, что СМОГЛИ написать, продравшись через тонны проблем.

(Ответить) (Уровень выше)


[info]yigal_s@lj
2011-09-18 18:43 (ссылка)
а что ты имеешь в виду под изпользованием последних фичеров C++ в asio?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 04:52 (ссылка)
В плане интерфейса - мувабельные и/о объекты, мувабельные хэндлеры, "вариадики". В плане имплементации - всё, что только можно :).
Ну и вообще, асио само по себе - "последний фичер c++", потому что он в tr2 и, по мнению страуса, в следующем стандарте будет в std.
Но я имел в виду даже не только это, а то, что аффтар называет "a modern C++ approach", т.е. хорошая интероперабильность с STL-ем и вообще с std, отсутствие всяких "наследий тяжёлых времён" в дизайне, типа глубоких иерархий наследования, продвижение полезных идиом типа shared_from_this, "фукционального" подхода и т.д., и т.п..

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 12:06 (ссылка)
о, как я отстал от культуры и балета!

чем же полезно shared_from_this? Очередной же мудацкий костыль.

Ладно, спасибо за ответ, надо будет всё это почитать.

По секрету, я очень плохо знаю буст и очень жалею, что не знал о нем в тот момент, когда он только начинался. Может, тогда б в нем и полторы моих строчки было, ну а сейчас поезд ушел, народ заматерел, а меня, помнится, еще в 98-м году уволили из одной хай-тек фирмы за использование препроцессора, темплейтов, исключений и мультитреда. Причем, оформленных в весьма понятный интерфейс.

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 12:36 (ссылка)
> чем же полезно shared_from_this?

Дык это просто применение старого-доброго raii на благо асинхронных систем. Типа, биндишь хэндлер асинхронной подсистемы не куда попало, а на shared_from_this, и потом оно всё само когда надо умирает и отваливается.
Или даже такая разновидность: биндишь на нормальный поинтер, а weak_ptr передаёшь в качестве трэкера.
Оченно это всё помогает управлять временем жыздни.


> Очередной же мудацкий костыль

Смотри, с тем же успехом "мудацким костылём" можно обозвать и всякие псевдофункциональные примочки типа лямбды или даже тривиального бинда и трэйты, не говоря уж об TMP в целом. А кто-то называет это "множественностью парадигм" :)).


> По секрету, я очень плохо знаю буст

Да там и знать нечего, нет такой библиотеки :)). Буст - это просто брэнд. Означает, что либу не на помойке нашли, а грамотные люди сваяли и проверили.
А всё "ядро" буста уже в любом случае в std или на крайняк в tr1.

> а меня, помнится, еще в 98-м году уволили из одной хай-тек фирмы

Той фирмы уже сто лет как нет. И, видимо, неспроста! :-Р

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 12:49 (ссылка)
* Той фирмы уже сто лет как нет. И, видимо, неспроста! :-Р

Удивишься, но есть и вполне себе процветает.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]iwr@lj
2011-09-19 12:52 (ссылка)
Ск-к? Фигасе, мне казалось, он давно издохъ.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 12:57 (ссылка)
Ну, они избавились от всякого неадекватного балласта вроде меня и чуть не издохли дела у них пошли в гору.

(Ответить) (Уровень выше)


[info]iwr@lj
2011-09-18 16:34 (ссылка)
"Linus T" - это псевдоним юзера yosefk :))

(Ответить)


[info]dmitri_pavlov@lj
2011-09-19 09:47 (ссылка)
Проблема в том, что нормальный компилятор C++ не написан, и, видимо, не будет написан никогда.
Существующие компиляторы даже и близко не подходят к утверждаемой Страуструпом теоретической эффективностью
программ на C++ по сравнению с C (например, тот же STL),
и, кроме того, обладают абсолютно чудовищной скоростью компиляции.

Современный язык, решающий проблемы C и не страдающий дефектами C++ --- Go (http://golang.org).

(Ответить) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 12:20 (ссылка)
я не уверен, что проблема именно в этом и только в этом. Компиляторы в теории можно написать, STL доработать (это естественно, что универсальные имплементации контейнеров будут работать медленнее, чем заточенные под конкретные ограничения задач. В какой-то старой и на момент выхода достаточно нетривиальной книжке "Scientific and Engineering C++" John J. Barton, Lee R. Nackman вроде бы как раз были продемонстрированы какие-то результаты по контейнеров, допускающих fine-tuning, но вроде в промышленные библиотеки те идеи не ушли.


Сам по себе язык неудобен и сложен (я говорю не о сложности понимания и изучения новичком, как раз новичок резво кидается в написание очередных С++ трюков и в восторге от всяких сложностей), а о практическом применении. Т.е., даже отбросив всвозможные книжки Mayers об Effective and More effective C++, до 90% содержания которых приличный программист должен додуматься сам, остаётся куча нетривиальных вещей, описываемых, к примеру, в серии книг Саттера "Exceptional C++". Это долгая история, я могу приводит примеры, но в кратце, я считаю, что язык, требующий для нормальной работы на нём экспертных знаний, знания уймы тонкостей и чтения уймы нетривиальных книг - достаточно неудачен.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dmitri_pavlov@lj
2011-09-19 12:36 (ссылка)
Указанный дефект (чрезмерная сложность и запутанность),
тоже, несомненно, имеет место.

Между прочим, Linux написан на C,
в нём больше 11 миллионов строк,
и никаких проблем из-за такого выбора языка нет.
Я бы не сказал, что способ реализации виртуальных
функций, выбранный в Linux, доставляет особые проблемы,
разве что синтаксические неудобства возникают.
Но и C++ имеет крайне неудачный синтаксис, так что
и в этом отношении его преимущество сомнительно.

(И опять же, синтаксис Go существенно улучшен по сравнению
с C, тем более с C++.)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 12:44 (ссылка)
Я участвовал в проектах на пару миллионов строк С++ и мне очень тяжело представить, как это всё можно было бы писать на С (речь не об использовании С++ для GUI, а именно о написании на нём "потрохов" системы). То есть, безусловно, можно и на С, как можно было бы и на ассемблере.

Опять же, по МОЕМУ опыту, программисты не знающие ОО, но знающие С, пишут в целом очень плохой код. Даже когда этот код именно на С. Постоянные ничем не обоснованные type-casts, например. Летающие во все стороны void указатели. Готовность выдать спагетти-код любого уровня запутанности, лишь бы работало. Не владение базисными архитектурными идеями, вроде использования плаг-ин архитектур, а не жесткой привязки фичеров к главному коду. Итд итп.

Но безусловно, С++ имеет кучу недостатков, в том числе препятствующих его спокойному и эффективному использованию в low-level.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dmitri_pavlov@lj
2011-09-19 13:40 (ссылка)
>Я участвовал в проектах на пару миллионов строк С++ и мне очень тяжело представить, как это всё можно было бы писать на С

Возможно, именно это имеет ввиду Torvalds?

А вообще говоря, способ избежать подобных проблем
(которые ООП не решает, кстати) известен давно:
Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.

Типичный пример программы, грубо нарушающей эту философию --- любой современный распространённый браузер
(FIrefox, Chrome, Opera, IE).
Неудивительно, что все они чудовищно глючат и постоянно крэшатся.

Так что проблемы с большими проектами надуманные, надо
просто уметь разделять программы.
Linux --- особый случай из-за необходимости эффективно
осуществлять коммуникацию между разными частями ядра.
Если бы микроядра умели писать эффективно,
то и ядро было бы маленьким.
А так Linux следует упомянутой философии, но с поправками
на реальность (программы ядра общаются путём общей памяти).

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 14:49 (ссылка)
* Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.

странный подход. Ну, напишите в таком духе графический интерактивный редактор, или практичную базу данных, или дебаггер.

* Так что проблемы с большими проектами надуманные, надо
просто уметь разделять программы.

В больших реальных, а не игрушечных демонстрационных проектах, есть уйма разных бизнес-требований довольно замысловатым образом взаимодействующих, а то и противоречащих друг другу. Разделить подобные требования, абстрагировать их , избавиться от их взаимодействия и противодействия порой не проще, чем отделить в человеке нервную систему от кровеносной, а мышцы от костей. Это еще вообще до ВСЯКОГО программирования. Те или иные технические решения имеют свои ограничения, и опять же в силу этих ограничений достаточно замысловатым образом взаимодействуют с бизнес-требованиями. Это опять же еще практически до всякого реального программирования, только на уровне результатов ресёча и отладки технических решений. Разговоры о разделении программ - фикция. Это нужно уметь делать, но далеко не всегда это сделать возможно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dmitri_pavlov@lj
2011-09-19 16:19 (ссылка)
>странный подход. Ну, напишите в таком духе графический интерактивный редактор, или практичную базу данных, или дебаггер.

Гм, вообще-то я просто процитировал Unix philosophy (https://secure.wikimedia.org/wikipedia/en/wiki/Unix_philosophy).

>странный подход. Ну, напишите в таком духе графический интерактивный редактор, или практичную базу данных, или дебаггер.

Не вижу препятствий.
В своё время весь Unix был так сделан, а затем и Plan 9.

Абзац про «бизнес-требования» довольно невнятный,
а конкретные примеры существуют?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 18:22 (ссылка)
> Гм, вообще-то я просто процитировал Unix philosophy.

да я знаю. осталось рассмотреть, какая часть ядра сделана по этой философии.

>странный подход. Ну, напишите в таком духе графический интерактивный редактор, или практичную базу данных, или дебаггер.

> Не вижу препятствий.

Ух-ты! А что, XLib в юниксе тоже построен как обработчк потока символов?

> Абзац про «бизнес-требования» довольно невнятный,
а конкретные примеры существуют?

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dmitri_pavlov@lj
2011-09-19 19:17 (ссылка)
>да я знаю. осталось рассмотреть, какая часть ядра сделана по этой философии.

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

>Ух-ты! А что, XLib в юниксе тоже построен как обработчк потока символов?

А вот X Window как раз писали не в Bell Labs,
и философии Unix он совсем не следует,
поэтому он такой кривой и плохо интегрирован
с остальным Unix.

Для сравнения, в Plan 9 управление графикой
осуществляется в текстовом формате через обычный файл,
поэтому, например, окнами можно управлять из скрипта
(что успешно и делается).

>кажется самим собой разумеющимся

Опять общие слова.
Единственное существенное препятствие
для философии Unix, которое видно сразу
— это производительность.
Учитывая, как глубоко нынешним программистам
наплевать на производительность
(что легко видеть на примере тех же браузеров),
этот аргумент не является очень сильным.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]yigal_s@lj
2011-09-19 19:42 (ссылка)
* Ведь загружаемые модули — это те же программы,
только память у них общая.

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

>кажется самим собой разумеющимся

* Опять общие слова.

Ну что есть. Извините, если разочаровал, такие вещи у меня в памяти надолго не откладываются.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]dmitri_pavlov@lj
2011-09-19 22:33 (ссылка)
>Т.е. каждый модуль в ядре юникса занимается тем, что читает поток символов со своего стандартного ввода и выдает поток символов на стандартный вывод?

Я уже объяснил в предыдущем комментарии,
что как раз по причине эффективности Linux не является микроядром
и взаимодействие осуществляется путём разделения памяти.

Впрочем, большое количество драйверов управляется
именно таким образом — через файловые системы
/proc и /sys.

(Ответить) (Уровень выше)


[info]iwr@lj
2011-09-21 11:41 (ссылка)
> Т.е. каждый модуль в ядре юникса занимается тем, что читает поток символов со своего стандартного ввода и выдает поток символов на стандартный вывод?


Представил, как драйвер винта обменивается с контроллером xml-ями. :-Р

(Ответить) (Уровень выше)


[info]yigal_s@lj
2011-09-19 14:51 (ссылка)
Те или иные технические решения имеют свои ограничения, и опять же в силу этих ограничений достаточно замысловатым образом взаимодействуют с бизнес-требованиями И ДРУГ С ДРУГОМ )))

(Ответить) (Уровень выше)