плохой язык C++ :)
От: Зверёк Харьковский  
Дата: 02.03.06 14:26
Оценка: 46 (7) +3 -6 :))) :))) :))) :))) :)))
avva пишет

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

Одна из главных причин, почему C++ плохой язык: для этого надо сначала понять, почему C хороший. В чем состоит то свойство C, из-за которого его называют "портабильным ассемблером"? Дело не в том, что "близко к машине", и всё низкого уровня. Дело в том, что почти всегда в C эффект любой строки кода локален и очевиден. Когда я что-то делаю в C, неважно что, я очень хорошо понимаю, что именно происходит. Если я пишу x=y, я знаю точно, что происходит. Если я пишу f(...), я знаю точно, какая конкретно функция будет вызвана, я могу указать на неё пальцем, и я знаю точно, что произойдёт в момент входа в неё и выхода из неё. Если я выделяю память, я знаю точно, что она не исчезнет, пока я её не освобожу. Итд. итп. Атомарные строки кода переходят в атомарные куски кода во время запуска, и никаких сюрпризов. Есть исключения: например, если я вызываю функцию через ссылку, я не знаю, что собственно я вызвал, до рантайма. Но этих исключений очень мало и они тоже "локализованы" и их легко понять.

Это необязательно хорошо. Но это — в C — выполняется последовательно, и то, что это последовательно — хорошо. Разные языки по-разному решают вопрос о том, как позволить программистам прятать информацию от самих себя. В объектно-ориентированных языках принцип полиморфизма, принципиального незнания мной того, объект какого класса я вызываю по ссылке (базового или наследника), является краеугольным; и это по-своему хорошо, если проведено последовательно.

C++ — смесь разных принципов отношения к информации и средствам её прятать или открывать, которые доступны программисту; смесь, кажется, очень плохо продуманная. С одной стороны, полностью сохранён "низкий уровень" C, в том числе отсутствие сборки мусора, т.е. очень важный пример того, что заставляем программиста за всем следить и обо всём помнить. Множественное наследование — другой пример: если практически оказывается возможным его воплотить, мы его воплощаем, пусть оно концептуально сложно, пусть оно заставляет программиста выслеживать порядок вызова конструкторов, всякие ужасные "ромбики" и прочую хренотень.

Но, с другой стороны: полностью нарушен (я бы сказал, низвергнут с пьедестала и подвержен особо извращенному поруганию) этот самый принцип локальности поведения системы в ответ на строчку моего кода. Я всего лишь объявил переменную какого-то типа, написав "Typename varname;", но эта строчка может привести к вызову неизвестного мне конструктора, а за ним — кода сколь угодно, вообще говоря, сложности. Я всего лишь применяю известный мне оператор к переменной — а он, оказывает, overloaded у этого класса, и черт знает что на самом деле там произойдет. Я всего лишь вышел из функции, что может быть проще, написал }, а в рантайме на самом деле пошли плясать деструкторы всех автоматических объектов в этой функции. И даже и не буду начинать говорить про copy constructor и прочие подобные прелести.

Так вот, поэтому C++ — плохой язык.

Он настолько много прячет за кулисами, чтобы навязать программисту режим работы "моя хата с краю": пиши свой код, не волнуйся насчёт того, что магически происходит вокруг него, всё хорошо, всё идёт по плану... И в то же время того же программиста заставляет следить за всеми malloc()'ами и new, рассчитывать ужасные иерархии наследования и дикие функции-"френды", не говоря уж о темплейтах. По сути дела, медленно и неумолимо превращает программиста в шизофреника.

FAQ — це мiй ай-кью!
Re: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 02.03.06 14:36
Оценка: 1 (1) +4 :))) :))) :)))
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>avva пишет


Со всех сторон бедные плюсы подпёрли. Сишники-пуританцы снизу, дотнетчики сверху
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: плохой язык C++ :)
От: Kluev  
Дата: 02.03.06 14:38
Оценка: +4
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Зверёк Харьковский, Вы писали:


ЗХ>>avva пишет


IT>Со всех сторон бедные плюсы подпёрли. Сишники-пуританцы снизу, дотнетчики сверху


Собаки лают, караван идет.
Re[2]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 02.03.06 14:38
Оценка: :))) :))) :))) :)
Здравствуйте, IT, Вы писали:

IT>Со всех сторон бедные плюсы подпёрли. Сишники-пуританцы снизу, дотнетчики сверху


Rubyist-ы слева, а функциональщики -- справа

И только C++никам все по барабану


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: плохой язык C++ :)
От: anonymous_user  
Дата: 02.03.06 14:45
Оценка: 6 (2) +1 :))) :))) :))
Здравствуйте, Зверёк Харьковский, Вы писали:

мир вообще очень сложен
бабочка махнет крылом в китае, и начнется ураган во флориде
а с++ был создан затем, чтобы максимально удобно отразить в коде всю сложность окружающего мира
Re[3]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 02.03.06 14:48
Оценка: +1 :)))
Здравствуйте, Kluev, Вы писали:

IT>>Со всех сторон бедные плюсы подпёрли. Сишники-пуританцы снизу, дотнетчики сверху


K>Собаки лают, караван идет.


Главное, что бы этот караван не превратился в караван неуловимых Джо
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: плохой язык C++ :)
От: Programmierer AG  
Дата: 02.03.06 14:51
Оценка: +3 :))) :))) :))) :))) :))) :)
Здравствуйте, anonymous_user, Вы писали:

_>мир вообще очень сложен

_>бабочка махнет крылом в китае, и начнется ураган во флориде
_>а с++ был создан затем, чтобы максимально удобно отразить в коде всю сложность окружающего мира
В C++ можно замечательно отражать в коде всю сложность C++ .

А насчет всей сложности окружающего мира — это ты загнул.
Re[3]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 02.03.06 14:56
Оценка:
Здравствуйте, eao197, Вы писали:

IT>>Со всех сторон бедные плюсы подпёрли. Сишники-пуританцы снизу, дотнетчики сверху


E>Rubyist-ы слева, а функциональщики -- справа


Слева дельфисты-паскалисты. Но в связи с тем, что они начинают сдавать позиции, то уже выстроилась целая очередь, включая рубистов.

E>И только C++никам все по барабану


Ну дай бог им здоровья
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: плохой язык C++ :)
От: Programmierer AG  
Дата: 02.03.06 14:59
Оценка: +2 :))) :))) :)
Здравствуйте, eao197, Вы писали:


IT>>Со всех сторон бедные плюсы подпёрли. Сишники-пуританцы снизу, дотнетчики сверху

E>Rubyist-ы слева, а функциональщики -- справа
Я правильно понимаю, что Rubyist-ы — коммунисты, а функциональщики — экстремисты?
Re[4]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 02.03.06 15:02
Оценка: +1
Здравствуйте, IT, Вы писали:

E>>И только C++никам все по барабану


IT>Ну дай бог им здоровья


Спасибо!


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: плохой язык C++ :)
От: amih Россия  
Дата: 02.03.06 15:02
Оценка: 3 (1) +1 -1
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>avva пишет


ЗХ>

ЗХ>Следующие рассуждения в принципе мне кажутся очень простыми, но ни разу их не встречал.

ЗХ>Одна из главных причин, почему C++ плохой язык: для этого надо сначала понять, почему C хороший. В чем состоит то свойство C, из-за которого его называют "портабильным ассемблером"? Дело не в том, что "близко к машине", и всё низкого уровня. Дело в том, что почти всегда в C эффект любой строки кода локален и очевиден. Когда я что-то делаю в C, неважно что, я очень хорошо понимаю, что именно происходит. Если я пишу x=y, я знаю точно, что происходит. Если я пишу f(...), я знаю точно, какая конкретно функция будет вызвана, я могу указать на неё пальцем, и я знаю точно, что произойдёт в момент входа в неё и выхода из неё. Если я выделяю память, я знаю точно, что она не исчезнет, пока я её не освобожу. Итд. итп. Атомарные строки кода переходят в атомарные куски кода во время запуска, и никаких сюрпризов. Есть исключения: например, если я вызываю функцию через ссылку, я не знаю, что собственно я вызвал, до рантайма. Но этих исключений очень мало и они тоже "локализованы" и их легко понять.
...
превращает программиста в шизофреника.


угу, но только вот при объеме такого "простого и понятного" кода на С в несколько десятков тысяч строк кода понять где что происходит становится вабще невозможно. "из-за деревьев леса не видно". где что инициализируется, где разрушается... и механизмов поправить это в С нет. да, программирование уже вылезло из пеленок, теперь f(...) может означать что угодно, но обратного пути нет, т.к. системы будут становиться только сложнее и сложнее и язык должет отражать эти изменения. обычный человеческий язык тоже сложен и многозначан, но ты ведь понимаеш что я пишу. или ты предлагаеш вернуться к завязыванию узилков на веревочке?
Re[2]: плохой язык C++ :)
От: AVC Россия  
Дата: 02.03.06 15:04
Оценка: 12 (1) :))) :))) :))) :)
Здравствуйте, IT, Вы писали:

IT>Со всех сторон бедные плюсы подпёрли. Сишники-пуританцы снизу, дотнетчики сверху


Сверху, снизу...
Дождемся, кто пристроится сзади...

Но существует одно качество, которое нельзя купить, — это надежность. Цена надежности — погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить.

Хоар
Re[4]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 02.03.06 15:04
Оценка: +1
Здравствуйте, Programmierer AG, Вы писали:

PA>Я правильно понимаю, что Rubyist-ы — коммунисты, а функциональщики — экстремисты?


На счет коммунизма -- это вряд ли. Скорее хиппи

Про функциональшиков ничего не скажу, бо злые они.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[3]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 02.03.06 15:10
Оценка: :))) :))
Здравствуйте, Programmierer AG, Вы писали:

PA>А насчет всей сложности окружающего мира — это ты загнул.


Да, для этого C++ еще не достаточно сложен.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[4]: плохой язык C++ :)
От: Programmierer AG  
Дата: 02.03.06 15:16
Оценка: +1 :)))
Здравствуйте, eao197, Вы писали:

E>Да, для этого C++ еще не достаточно сложен.

Саттер над этим уже работает.

А для отражения зависимости ураганов от бабочек очень не хватает деструкторов копии .
Re[5]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 02.03.06 15:19
Оценка: -1
Здравствуйте, Programmierer AG, Вы писали:

E>>Да, для этого C++ еще не достаточно сложен.

PA>Саттер над этим уже работает.

Угу. Но не он один. Нужно еще Александреску вспомнить, и Абрахамса, и Гуртового и пр. Правда они не столько над языком работают, сколько над стилем его использования. Нужно сказать, что у них получается.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[6]: плохой язык C++ :)
От: Programmierer AG  
Дата: 02.03.06 15:24
Оценка: :))) :)))
Здравствуйте, eao197, Вы писали:

E>Угу. Но не он один. Нужно еще Александреску вспомнить, и Абрахамса, и Гуртового и пр. Правда они не столько над языком работают, сколько над стилем его использования. Нужно сказать, что у них получается.


Это диверсанты-функциональщики на самом деле .
Re[7]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 02.03.06 15:32
Оценка: :)
Здравствуйте, Programmierer AG, Вы писали:

PA>Это диверсанты-функциональщики на самом деле .


Вот я и говорю: бо злые они, функциональщики


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: плохой язык C++ :)
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 02.03.06 17:02
Оценка: 7 (2) +1
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>Следующие рассуждения в принципе мне кажутся очень простыми, но ни разу их не встречал.


Я встречал в частных беседах

Что такое хорошо и что такое плохо это извечный вопрос. Да, C хорош тем, что позволяет четко отследить порядок действий. Одного этого достаточно для написания достаточно сложным комплексов (таких как Linux, Free BSD, ...).

Но это не единственный путь Существует большое количество способов разработки ПО. Кому-то по душе больше один вариант написания ПО, кому-то больше другой. Кого-то десять тысяч строк процедурного кода вгоняют в ужас (невозможно разобраться). Он не в силах разобраться в этом и вопит что это тупиковый путь. Кому-то тяжело разобраться в архитектуре из десятка тесно взаимосвявзаных классов (нет четкого представления о последовательности действий). Но он молчит, потому что выступать против ООП это ересь. Люди разные.

С++ поддерживает несколько способов. Убрав лишние фичи, мы можем получить C-подобный язык, другие фичи --- Java-подобный, третьи фичи --- некий макроязык. Плюс это или минус --- также философский вопрос, на который тоже нет однозначного ответа.
Re[3]: плохой язык C++ :)
От: vladserge Россия  
Дата: 02.03.06 17:57
Оценка: -1 :)))
Здравствуйте, Kluev, Вы писали:

K>Здравствуйте, IT, Вы писали:


IT>>Здравствуйте, Зверёк Харьковский, Вы писали:


ЗХ>>>avva пишет


IT>>Со всех сторон бедные плюсы подпёрли. Сишники-пуританцы снизу, дотнетчики сверху


K>Собаки лают, караван идет.


на йух
С Уважением Сергей Чикирев
Re: плохой язык C++ :)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 02.03.06 18:54
Оценка: -2
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>avva пишет


ЗХ>

ЗХ>Следующие рассуждения в принципе мне кажутся очень простыми, но ни разу их не встречал.
ЗХ>[...]


C — хороший язык, потому что портабельный ассемблер.
C++ — не хороший язык, потому что имеет кучу фич, не похожих на ассемблер.

Вывод? Автор неправомерно относится к C++ как к "C с расширениями". Ерунда, короче.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.03.06 22:24
Оценка: +1 :)
Здравствуйте, eao197, Вы писали:

E>И только C++никам все по барабану


Ну, почему же? Смотри как С++ сразу защищать начинают. Значет не по барабану.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.03.06 22:24
Оценка: :)
Здравствуйте, Programmierer AG, Вы писали:

PA>Я правильно понимаю, что Rubyist-ы — коммунисты, а функциональщики — экстремисты?


Комунисты — это скорее С++-ники. Ждут Ёлкина с Горбатым и надеются на стариков.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.03.06 22:24
Оценка: 1 (1) +1 :))) :)))
Здравствуйте, anonymous_user, Вы писали:

_>а с++ был создан затем, чтобы максимально удобно отразить в коде всю сложность окружающего мира


С++ даже дальше пошел. Нем без проблем можно отразить всю сложность казалось бы простых вещей.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.03.06 22:24
Оценка: :)
Здравствуйте, Programmierer AG, Вы писали:

PA>Это диверсанты-функциональщики на самом деле .


Я бы даже сказал девирсанты метопрограммщики вынужденно ставшие функциональщиками так как Страуструп хитрюга незаметно для основного мира и комитета по стандартизации таки умудрился запихнуть в С++ ФЯ.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.03.06 22:24
Оценка: 12 (1) +1 :)
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>avva пишет



Он все перепутал. Между тем все куда банальнее и проще.

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

А что до побочных эффектов. Фигня все это. Любой язык в итоге позволяет сделать так, чтобы казалось бы невинная строка кода приводила к совершенно несуразным действиям.

Что до переносимого ассемблера, то они созданны. Это байтод Явы и МСИЛ. Вот только создать VM для Явы и дотнета ой как не просто. Потому С будет жить еще очень долго.

А вот то, что жить будет С, а не аналогичный типобезопасный безопасный язык — это нонсенс который ничем кроме как глупости и косности человечества я объяснить не могу. По-моему — это привычка/стериотип возабладвшая над разумом. Насколько я знаю Ричи давно изобрел такой язык. И не только он (тот же Оберон из этой оперы). Но ежики жрут кактуся с упорством достойным лучшего применения.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: плохой язык C++ :)
От: alex_ez Россия alex.jife.ru
Дата: 03.03.06 05:24
Оценка: +1 :)))
Здравствуйте, Зверёк Харьковский, Вы писали:

Не поняв ДАО — нельзя понять язык.
Пойди и пойми ДАО, потом поговорим.
silence in quite
Re[2]: плохой язык C++ :)
От: Anton Batenev Россия https://github.com/abbat
Дата: 03.03.06 07:28
Оценка:
Здравствуйте, alex_ez, Вы писали:

_>Не поняв ДАО — нельзя понять язык.

_>Пойди и пойми ДАО, потом поговорим.

Понятое ДАО — не есть истинное ДАО,
Изреченное ДАО — не есть истинное ДАО,
Написанное ДАО — не есть истинное ДАО,
Истинное ДАО не есть истинное ДАО.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: плохой язык C++ :)
От: VladGalkin Украина  
Дата: 03.03.06 07:29
Оценка: +1
Здравствуйте, alex_ez, Вы писали:

_>Здравствуйте, Зверёк Харьковский, Вы писали:


_>Не поняв ДАО — нельзя понять язык.

_>Пойди и пойми ДАО, потом поговорим.

1) Это мнение не Зверька, а avva;

2) Уважаемый, Вы бы по поводу понимания ДАО C++ Зверьком не спешили бы говорить, а прочитали вот это: C++ulture
Автор: Зверёк Харьковский
Дата: 11.06.04
;
... << RSDN@Home 1.1.4 stable rev. 510>>
ДЭ!
Re[5]: плохой язык C++ :)
От: igna Россия  
Дата: 03.03.06 07:48
Оценка: 1 (1)
Здравствуйте, VladD2, Вы писали:

VD>Комунисты — это скорее С++-ники.


Нет уж, такой хаос не может быть коммунизмом, разве что на этапе революции. Коммунизм это например одна-единственная большая-на-все-случаи-жизни библиотека. И никаких там reinterpret_cast.
Re[5]: плохой язык C++ :)
От: igna Россия  
Дата: 03.03.06 07:55
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

PA>Саттер над этим уже работает.


Похоже наработал уже. Теперь бы еще JVM пристроить.
Re[6]: плохой язык C++ :)
От: VladGalkin Украина  
Дата: 03.03.06 07:55
Оценка: +1 :)
Здравствуйте, igna, Вы писали:

I>Нет уж, такой хаос не может быть коммунизмом, разве что на этапе революции. Коммунизм это например одна-единственная большая-на-все-случаи-жизни библиотека.


Boost?
... << RSDN@Home 1.1.4 stable rev. 510>>
ДЭ!
Re[7]: плохой язык C++ :)
От: igna Россия  
Дата: 03.03.06 08:05
Оценка:
Здравствуйте, VladGalkin, Вы писали:

VG>Boost?


0 баллов. В boost'е отсутствуют предметы первой необходимости. 2-я попытка, пожалуйста.
Re[8]: плохой язык C++ :)
От: VladGalkin Украина  
Дата: 03.03.06 08:11
Оценка:
Здравствуйте, igna, Вы писали:

I>0 баллов. В boost'е отсутствуют предметы первой необходимости. 2-я попытка, пожалуйста.

Что такое предмет первой необходимости? Вот небольшой список, того что есть в Boost (многое из этого в C++ оказывается необходимым):

Smart pointers that provide automatic lifetime management of objects and simplify resource sharing

Consistent, best-practice solutions for performing type conversions and lexical conversions

Utility classes that make programming simpler and clearer

Flexible container libraries that solve common problems not covered by the C++ Standard Library

Powerful support for regular expressions with Boost.Regex

Function objects defined at the call site with Boost.Bind and Boost.Lambda

More flexible callbacks with Boost.Function

Managed signals and slots (a.k.a. the Observer pattern) with Boost.Signals

Beyond the C++ Standard Library: An Introduction to Boost
... << RSDN@Home 1.1.4 stable rev. 510>>
ДЭ!
Re[9]: плохой язык C++ :)
От: igna Россия  
Дата: 03.03.06 08:37
Оценка: 72 (2) +3
Здравствуйте, VladGalkin, Вы писали:

VG>Что такое предмет первой необходимости?


— GUI
— GUI
— GUI
— Database access
— XML

VG>Вот небольшой список, того что есть в Boost (многое из этого в C++ оказывается необходимым):


VG>Smart pointers that provide automatic lifetime management of objects and simplify resource sharing
. . .


Именно. В C++ оказывается необходимым.


P.S. Я между прочим отнюдь не против C++, я — за. И не против C#, а "за". И даже не против коммунизма с капитализмом (*), такой я непротивный.

(*) Хотя и не "за".
Re: плохой язык C++ :)
От: Denis2005 Россия  
Дата: 03.03.06 08:39
Оценка: 30 (3) +1 -1
Все гораздо проще…
С++ ориентрован на сильных умом (experts only), и надо заметить, что в программировании далеко не все этим качеством обладают.

Перед программистом стоит достаточно трудоемкая задача, по сути нахождение оптимального решения по следующим критериям (первое что пришло на ум):


(Список можно продолжать).

Так вот найти то самое оптимальное решение можно, и реализовать его можно только на C++ (std98), пока в него еще не напихали консервативных GC (уверен, что нас ждут новые проблемы переносимости кода ), виртуальных деструкторов по умолчанию и т.п.

(Кстати, наверное как многие заметили, код Александреску не дружит с 4 и 6 пунктом)

Действительно бытует такое мнение, что C++ язык плохой , но это только по тому, на нем пишет народ, которому лучше писать на чём нибудь вроде VB, а еще лучше вообще не писать.

Лично я уже 4-й год по большей части пишу под .NET (C#) (если конечно задача позволяет), ибо почувствовал, что голова уже в большой спешке не справляеться, с горами шаблонов а-ля BOOST.
Re: плохой язык C++ :)
От: Programmierer AG  
Дата: 03.03.06 08:51
Оценка: +4 -1
Зверёк Харьковский,

ЗХ>avva пишет

ИМХО, зря были выделены следующие фразы. Выделение жирным не способствует внимательному прочтению текста.
ЗХ>

эффект любой строки кода локален и очевиден. ... то, что это последовательно — хорошо.


По реакции публики видно, что автора приняли за сишника-старовера, который боится перегрузки операторов, деструкторов и прочей автоматизации. Все уверены, что для avv'ы C++ чересчур сложный, а оттого непонятный => плохой. Никто не удосужился сходить по ссылке и убедиться, что для него на самом деле и монады Хаскеля не проблема. А основная мысль автора, как я ее понял, заключалась не в критике излишней сложности C++, а в критике отсутствия единой концепции языка, объединяющих принципов, из которых нет исключений.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 03.03.06 08:57
Оценка: 2 (1) +1 -6
igna wrote:
> — GUI
> — GUI
> — GUI
Не предмет первой необходимости.

> — Database access

_Далеко_ не предмет первой необходимости.

> — XML

Было обсуждение по включению XML-библиотеки в Boost, но пока завязло
(уже и так куча либ есть).
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[2]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.03.06 09:07
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

PA>А основная мысль автора, как я ее понял, заключалась не в критике излишней сложности C++, а в критике отсутствия единой концепции языка, объединяющих принципов, из которых нет исключений.


Просто в качестве мысли вслух. Интересно, какому-нибудь столь же распространенному языку, как C++, удалось сохранить единую концепцию и стройность языка за двадцать лет своего развития и после столько кардинальных доработок, как в C++ (исключения и шаблоны ведь в C++ не сразу появились)?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: плохой язык C++ :)
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 03.03.06 09:11
Оценка: +2 -5 :))) :)
Здравствуйте, Denis2005, Вы писали:

D>С++ ориентрован на сильных умом


Все сильные умом люди, которых я знаю, не благосклонны к языку С++.
Re[8]: плохой язык C++ :)
От: Programmierer AG  
Дата: 03.03.06 09:12
Оценка: 51 (3) +2 :))) :))) :))) :)
Здравствуйте, VladD2, Вы писали:

PA>>Это диверсанты-функциональщики на самом деле .

VD>Я бы даже сказал девирсанты метопрограммщики вынужденно ставшие функциональщиками так как Страуструп хитрюга незаметно для основного мира и комитета по стандартизации таки умудрился запихнуть в С++ ФЯ.

А мне каатса, Страуструп сам обалдел от того, что получилось из шаблонов.
А вот Erwin Unruh, Todd Velhuizen и, конечно же, Степанов — это наши. Это они подрывают основы C++-сообщества. Они незаметно внедрили функциональный стиль в большинство программ на C++, чтобы потом C++-ники неожиданно обнаружили, что все это фигня по сравнению с настоящими ФЯ. Вот такой коварный план. Первые жертвы уже есть .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: плохой язык C++ :)
От: Programmierer AG  
Дата: 03.03.06 09:19
Оценка:
Здравствуйте, eao197, Вы писали:

E>Просто в качестве мысли вслух. Интересно, какому-нибудь столь же распространенному языку, как C++, удалось сохранить единую концепцию и стройность языка за двадцать лет своего развития и после столько кардинальных доработок, как в C++ (исключения и шаблоны ведь в C++ не сразу появились)?

Не скажу за всю Одессу. Как уже не раз было замечено здесь в Философии, рассуждения о распространенности — тупиковый путь развития беседы, лучше и не начинать.
Я, собственно, и не доказываю ничего. Зверек привел цитату некого Аввы, ее неправильно, поверхностно поняли, и принялись спорить со Зверьком, в том смысле, что C++ — он для умных, а ты пиши на своем C . Вот на этот момент я и хотел обратить внимние.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.03.06 09:25
Оценка: +2 :)
Здравствуйте, Programmierer AG, Вы писали:

PA>А вот Erwin Unruh, Todd Velhuizen и, конечно же, Степанов — это наши. Это они подрывают основы C++-сообщества. Они незаметно внедрили функциональный стиль в большинство программ на C++, чтобы потом C++-ники неожиданно обнаружили, что все это фигня по сравнению с настоящими ФЯ. Вот такой коварный план. Первые жертвы уже есть .


Яркое доказательство того, что в каждой шутке есть (только) доля шутки!
Если за нормальное программирование на C++ начнут выдавать такое
Автор(ы): Bjorn Karlsson
Дата: 24.02.2006
Рассматриваются все типовые случаи применения bind — связывание свободных функций, функций-членов класов, переменных-членов, виртуальных функций, а также функциональная композиция. На простом примере поясняется идея, лежащая в основе реализации bind.
:
int count=std::count_if(
  ints.begin(), 
  ints.end(), 
  boost::bind(
    std::logical_and<bool>(), 
    boost::bind(std::greater<int>(), _1, 5), 
    boost::bind(std::less_equal<int>(), _1, 10)));

std::cout << count << '\n';

std::vector<int>::iterator int_it=std::find_if(
  ints.begin(), 
  ints.end(), 
  boost::bind(std::logical_and<bool>(), 
    boost::bind(std::greater<int>(), _1, 5), 
    boost::bind(std::less_equal<int>(), _1, 10)));

то жертв станет еще больше (на одну так точно ).

Хотя грусно это все, на самом деле. Здесь рядом
Автор: Cyberax
Дата: 02.03.06
Cyberax коротенький тестик привел для замера скорости работы FS, так к этому тесту нужно буст тащить, да еще версию из CVS. Уж на самом деле, на C в таких условиях писать спокойнее.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[4]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.03.06 09:29
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

PA>Как уже не раз было замечено здесь в Философии, рассуждения о распространенности — тупиковый путь развития беседы, лучше и не начинать.


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

PA>Вот на этот момент я и хотел обратить внимние.


Я понял. Просто твое напоминание меня на несколько другие размышления натолкнули. Которыми я и поделился. Без попытки спорить.



SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[10]: плохой язык C++ :)
От: Programmierer AG  
Дата: 03.03.06 09:33
Оценка: +1
Здравствуйте, eao197, Вы писали:


E>Яркое доказательство того, что в каждой шутке есть (только) доля шутки!

E>Если за нормальное программирование на C++ начнут выдавать такое
Автор(ы): Bjorn Karlsson
Дата: 24.02.2006
Рассматриваются все типовые случаи применения bind — связывание свободных функций, функций-членов класов, переменных-членов, виртуальных функций, а также функциональная композиция. На простом примере поясняется идея, лежащая в основе реализации bind.
:

. Этот код на самом деле очень простой. Синтаксического оверхеда (tm) просто много. Заменить boost::bind на лямбда-функции или применение комбинаторов с каррингом, и от него останется пара строчек.

E>Уж на самом деле, на C в таких условиях писать спокойнее.

Необязательно на C, есть масса альтернатив .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: плохой язык C++ :)
От: Programmierer AG  
Дата: 03.03.06 09:37
Оценка:
Здравствуйте, VladGalkin, Вы писали:

_>>Пойди и пойми ДАО, потом поговорим.


VG>1) Это мнение не Зверька, а avva;


VG>2) Уважаемый, Вы бы по поводу понимания ДАО C++ Зверьком не спешили бы говорить, а прочитали вот это: C++ulture
Автор: Зверёк Харьковский
Дата: 11.06.04
;

+10
О чем я и говорил
Автор: Programmierer AG
Дата: 03.03.06
.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: плохой язык C++ :)
От: Programmierer AG  
Дата: 03.03.06 09:49
Оценка:
Здравствуйте, VladGalkin, Вы писали:

VG>

VG>Managed signals and slots (a.k.a. the Observer pattern) with Boost.Signals

Вот их, например, нельзя использовать в многопоточных программах.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: плохой язык C++ :)
От: last_hardcoder  
Дата: 03.03.06 09:50
Оценка: 8 (1) +2 -4
Здравствуйте, Зверёк Харьковский, Вы писали:

С++ плох потому, что в нём намешано слишком много парадигм программирования. Пора бы уже озаботиться созданием приемника C++. Но почему то те, кто предпринимает такие попытки, не видят в чём новая парадигма. Новая парадигма — это обобщённое программирование. Новый язык должен воплощать её минимальным числом максимально выразительных возможностей. Вместо этого создают какие-то jav'ы, C#-ы. Вначале урезают C++ не с того конца. Потом начинают возвращать вырезанное обратно.
Re[10]: плохой язык C++ :)
От: alex_ez Россия alex.jife.ru
Дата: 03.03.06 09:53
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

VG>>

VG>>Managed signals and slots (a.k.a. the Observer pattern) with Boost.Signals

PA>Вот их, например, нельзя использовать в многопоточных программах.

а зочем вам многопоточные программы?
отставить песать многопоточные программы!..
silence in quite
Re[2]: плохой язык C++ :)
От: Left2 Украина  
Дата: 03.03.06 09:57
Оценка:
VD>А вот то, что жить будет С, а не аналогичный типобезопасный безопасный язык — это нонсенс который ничем кроме как глупости и косности человечества я объяснить не могу. По-моему — это привычка/стериотип возабладвшая над разумом. Насколько я знаю Ричи давно изобрел такой язык. И не только он (тот же Оберон из этой оперы). Но ежики жрут кактуся с упорством достойным лучшего применения.

Влад, ну зачем же так
C живёт только потому что он уже есть везде — для любой платформы. Да, он убогий, да, в нём море граблей — но он стандарт де-факто. Вы бы ещё возмутились неудобной раскладкой клавиш на клавиатуре — 100% уверен в том что можно было сделать лучше, но я бы не стал кричать что QWERTY-раскладка обусловлена глупостью и костностью мышления.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: плохой язык C++ :)
От: alex_ez Россия alex.jife.ru
Дата: 03.03.06 09:57
Оценка: :)
Здравствуйте, last_hardcoder, Вы писали:

_>С++ плох потому, что в нём намешано слишком много парадигм программирования. Пора бы уже озаботиться созданием приемника C++. Но почему то те, кто предпринимает такие попытки, не видят в чём новая парадигма. Новая парадигма — это обобщённое программирование. Новый язык должен воплощать её минимальным числом максимально выразительных возможностей. Вместо этого создают какие-то jav'ы, C#-ы. Вначале урезают C++ не с того конца. Потом начинают возвращать вырезанное обратно.


что значит выражение "урезать не с того конца" ?..
java — это кросплатформенный язык программирования.
c# — перевоплощение, помоему, тоже бессмысленное.

и еще, C++ и ANSI C++ совершенно разные вещи.
silence in quite
Re[3]: плохой язык C++ :)
От: Left2 Украина  
Дата: 03.03.06 10:01
Оценка: +1 :)
D>>С++ ориентрован на сильных умом

СГ>Все сильные умом люди, которых я знаю, не благосклонны к языку С++.


"-" поставил не в защиту С++ а потому что высказывание уж очень тянет на разжигание межязыковой вражды
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: плохой язык C++ :)
От: igna Россия  
Дата: 03.03.06 10:21
Оценка: :))) :))
Здравствуйте, eao197, Вы писали:

E>Если за нормальное программирование на C++ начнут выдавать такое
Автор(ы): Bjorn Karlsson
Дата: 24.02.2006
Рассматриваются все типовые случаи применения bind — связывание свободных функций, функций-членов класов, переменных-членов, виртуальных функций, а также функциональная композиция. На простом примере поясняется идея, лежащая в основе реализации bind.
:


E>int count=std::count_if(
E>  ints.begin(), 
E>  ints.end(), 
E>  boost::bind(
E>    std::logical_and<bool>(), 
E>    boost::bind(std::greater<int>(), _1, 5), 
E>    boost::bind(std::less_equal<int>(), _1, 10)));

E>std::cout << count << '\n';

E>std::vector<int>::iterator int_it=std::find_if(
E>  ints.begin(), 
E>  ints.end(), 
E>  boost::bind(std::logical_and<bool>(), 
E>    boost::bind(std::greater<int>(), _1, 5), 
E>    boost::bind(std::less_equal<int>(), _1, 10)));



Вот как будто то же самое, но все-таки полегче, не правда ли?:

using namespace std;
using namespace boost;

int count=count_if(
  ints.begin(), 
  ints.end(), 
  bind(
    logical_and<bool>(), 
    bind(greater<int>(), _1, 5), 
    bind(less_equal<int>(), _1, 10)));

cout << count << '\n';

vector<int>::iterator int_it=find_if(
  ints.begin(), 
  ints.end(), 
  bind(logical_and<bool>(), 
    bind(greater<int>(), _1, 5), 
    bind(less_equal<int>(), _1, 10)));
Re[3]: плохой язык C++ :)
От: igna Россия  
Дата: 03.03.06 10:27
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Все сильные умом люди, которых я знаю, не благосклонны к языку С++.


А к каким языкам благосклонны сильные умом?
Re[11]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.03.06 10:30
Оценка: 2 (2) +4
Здравствуйте, igna, Вы писали:

I>Вот как будто то же самое, но все-таки полегче, не правда ли?:


Не правда. Это все попытки медитациями заставить себя поверить, что это удобно и красиво.
Хотя действительно полегче было бы что-то такое:

I>
I>using namespace std;
I>using namespace boost;

I>int count=count_if(
I>  ints.begin(), 
I>  ints.end(), 
I>  bool lambda( int x ) { return ( 5 < x && x <= 10 ) });

I>cout << count << '\n';

I>vector<int>::iterator int_it=find_if(
I>  ints.begin(), 
I>  ints.end(), 
I>  bool lambda( int x ) { return ( 5 < x && x <= 10 ) });
I>


А если учесть что в двух местах используется одинаковый код, то хотелось иметь возможность написать так:
auto predicat = bool lambda( int x ) { return ( 5 < x && x <= 10 };

int count = count_if( ints.begin(), ints.end(), predicat );
...
auto int_it = find_if( ints.begin(), ints.end(), predicat );


Вот это было бы для меня удобно. И нормально.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[12]: плохой язык C++ :)
От: alex_ez Россия alex.jife.ru
Дата: 03.03.06 10:35
Оценка: -2
Здравствуйте, eao197, Вы писали:

E>auto predicat = bool lambda( int x ) { return ( 5 < x && x <= 10 };

inline f(), #define f()
— не устраивают?..

E>Вот это было бы для меня удобно. И нормально.

так вам, батенька, свой язык писать хочется?.. так пишите в чем проблема?..
silence in quite
Re[13]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.03.06 10:44
Оценка: +1 :)
Здравствуйте, alex_ez, Вы писали:

E>>auto predicat = bool lambda( int x ) { return ( 5 < x && x <= 10 };

_>
inline f(), #define f()
— не устраивают?..


Меня вполне устраивают. И даже наследование от binary_function и unary_function вполне устраивает. Мне не понятно, чем это boost-оводов не устраивает. И зачем создаются вещи вроде boost::bind, если добавление в язык возможности реализации лямбды (или вернее локальной анонимной функции/функтора) даст тоже самое да еще в более читабельном виде.

_>так вам, батенька, свой язык писать хочется?.. так пишите в чем проблема?..


Нет, вот своих языков мне писать уже не хочется. Переболел-с, знаете ли, доктор. Имунитет-с у меня нонче.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[12]: плохой язык C++ :)
От: dmz Россия  
Дата: 03.03.06 10:50
Оценка: 1 (1) :)
E>А если учесть что в двух местах используется одинаковый код, то хотелось иметь возможность написать так:
E>
E>auto predicat = bool lambda( int x ) { return ( 5 < x && x <= 10 };

E>int count = count_if( ints.begin(), ints.end(), predicat );
E>...
E>auto int_it = find_if( ints.begin(), ints.end(), predicat );
E>


E>Вот это было бы для меня удобно. И нормально.

а мне было бы удобнее

int count = 0;
ints.each( { |x| count++ if(5 < x && x <= 10) } );
Re[14]: плохой язык C++ :)
От: alex_ez Россия alex.jife.ru
Дата: 03.03.06 10:52
Оценка: -2 :))
Здравствуйте, eao197, Вы писали:

E>Меня вполне устраивают. И даже наследование от binary_function и unary_function вполне устраивает. Мне не понятно, чем это boost-оводов не устраивает. И зачем создаются вещи вроде boost::bind, если добавление в язык возможности реализации лямбды (или вернее локальной анонимной функции/функтора) даст тоже самое да еще в более читабельном виде.

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

E>Нет, вот своих языков мне писать уже не хочется. Переболел-с, знаете ли, доктор. Имунитет-с у меня нонче.

аналогично, пациент. диагноз: здороф.

в общем, я считаю вопрос закрытым.
silence in quite
Re[13]: плохой язык C++ :)
От: igna Россия  
Дата: 03.03.06 10:55
Оценка:
Здравствуйте, dmz, Вы писали:

dmz>int count = 0;
dmz>ints.each( { |x| count++ if(5 < x && x <= 10) } );


Хорошо еще бы count спрятать.
Re[13]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 03.03.06 10:56
Оценка: +1
Здравствуйте, dmz, Вы писали:

dmz>
dmz>int count = 0;
dmz>ints.each( { |x| count++ if(5 < x && x <= 10) } );
dmz>


Ruby надолго оставляет следы в памяти и в сознании


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 03.03.06 10:57
Оценка: :))
last_hardcoder wrote:
> приемника C++
Это как "приемник Путина"?
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[10]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 03.03.06 10:59
Оценка:
Здравствуйте, eao197, Вы писали:
E>Хотя грусно это все, на самом деле. Здесь рядом
Автор: Cyberax
Дата: 02.03.06
Cyberax коротенький тестик привел для замера скорости работы FS, так к этому тесту нужно буст тащить, да еще версию из CVS. Уж на самом деле, на C в таких условиях писать спокойнее.

Проблема в том, что нет кроссплатформенных функций создания/удаления каталогов и #ifdef'ы ставить лень. Ну а CVSный Boost у меня был под рукой, вот и взял первое попавшееся
Sapienti sat!
Re[3]: плохой язык C++ :)
От: igna Россия  
Дата: 03.03.06 11:01
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>last_hardcoder wrote:

>> приемника C++
C>Это как "приемник Путина"?

Он его ночами крутит, ловит, контра, ФРГ. (C)

Re[13]: плохой язык C++ :)
От: Left2 Украина  
Дата: 03.03.06 11:05
Оценка:
int count = 0;
ints.each( { |x| count++ if(5 < x && x <= 10) } );

Clipper форева !
Хотя и не уверен что такой синтаксис лямбда-функций (в Clipper они назывались "блоки кода") пошёл именно от него
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: плохой язык C++ :)
От: r.oleg Россия  
Дата: 03.03.06 11:13
Оценка: -2 :)
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>avva пишет


ЗХ>

ЗХ>Следующие рассуждения в принципе мне кажутся очень простыми, но ни разу их не встречал.

ЗХ>Одна из главных причин, почему C++ плохой язык: для этого надо сначала понять, почему C хороший. В чем состоит то свойство C, из-за которого его называют "портабильным ассемблером"? Дело не в том, что "близко к машине", и всё низкого уровня. Дело в том, что почти всегда в C эффект любой строки кода локален и очевиден. Когда я что-то делаю в C, неважно что, я очень хорошо понимаю, что именно происходит. Если я пишу x=y, я знаю точно, что происходит. Если я пишу f(...), я знаю точно, какая конкретно функция будет вызвана, я могу указать на неё пальцем, и я знаю точно, что произойдёт в момент входа в неё и выхода из неё. Если я выделяю память, я знаю точно, что она не исчезнет, пока я её не освобожу. Итд. итп. Атомарные строки кода переходят в атомарные куски кода во время запуска, и никаких сюрпризов. Есть исключения: например, если я вызываю функцию через ссылку, я не знаю, что собственно я вызвал, до рантайма. Но этих исключений очень мало и они тоже "локализованы" и их легко понять.

ЗХ>Это необязательно хорошо. Но это — в C — выполняется последовательно, и то, что это последовательно — хорошо. Разные языки по-разному решают вопрос о том, как позволить программистам прятать информацию от самих себя. В объектно-ориентированных языках принцип полиморфизма, принципиального незнания мной того, объект какого класса я вызываю по ссылке (базового или наследника), является краеугольным; и это по-своему хорошо, если проведено последовательно.

ЗХ>C++ — смесь разных принципов отношения к информации и средствам её прятать или открывать, которые доступны программисту; смесь, кажется, очень плохо продуманная. С одной стороны, полностью сохранён "низкий уровень" C, в том числе отсутствие сборки мусора, т.е. очень важный пример того, что заставляем программиста за всем следить и обо всём помнить. Множественное наследование — другой пример: если практически оказывается возможным его воплотить, мы его воплощаем, пусть оно концептуально сложно, пусть оно заставляет программиста выслеживать порядок вызова конструкторов, всякие ужасные "ромбики" и прочую хренотень.

ЗХ>Но, с другой стороны: полностью нарушен (я бы сказал, низвергнут с пьедестала и подвержен особо извращенному поруганию) этот самый принцип локальности поведения системы в ответ на строчку моего кода. Я всего лишь объявил переменную какого-то типа, написав "Typename varname;", но эта строчка может привести к вызову неизвестного мне конструктора, а за ним — кода сколь угодно, вообще говоря, сложности. Я всего лишь применяю известный мне оператор к переменной — а он, оказывает, overloaded у этого класса, и черт знает что на самом деле там произойдет. Я всего лишь вышел из функции, что может быть проще, написал }, а в рантайме на самом деле пошли плясать деструкторы всех автоматических объектов в этой функции. И даже и не буду начинать говорить про copy constructor и прочие подобные прелести.

ЗХ>Так вот, поэтому C++ — плохой язык.

ЗХ>Он настолько много прячет за кулисами, чтобы навязать программисту режим работы "моя хата с краю": пиши свой код, не волнуйся насчёт того, что магически происходит вокруг него, всё хорошо, всё идёт по плану... И в то же время того же программиста заставляет следить за всеми malloc()'ами и new, рассчитывать ужасные иерархии наследования и дикие функции-"френды", не говоря уж о темплейтах. По сути дела, медленно и неумолимо превращает программиста в шизофреника.


согласен, но не совсем, да с++ позволяет очень много, но ведь остается право выбора пользоваться ли этим или нет, при строгом соблюдении договоренностей по кодированию многих таких проблем можно избежать. А вот то что в этом языке много рутинной обязаловки я порлностью согласен, программистких сил этот язык не жалеет. Поэтому, его уже давно никто и не воспринимает как язык для создания серьезных бизнес-приложений.
Re[3]: плохой язык C++ :)
От: last_hardcoder  
Дата: 03.03.06 11:14
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>last_hardcoder wrote:

>> приемника C++
C>Это как "приемник Путина"?

Возможно, в каком то смысле. Просто языков то много появляется. Среди них есть и довольно прогрессивные. Но кроме авторов они никому не интересны. А нужен язык, от которого невозможно отказаться.
Re[4]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 03.03.06 11:30
Оценка:
last_hardcoder wrote:
> C>last_hardcoder wrote:
>> > *приемника C++*
> C>Это как "приемник Путина"?
> Возможно, в каком то смысле. Просто языков то много появляется.
Это я просто не могу удержаться — достало уже слово "приемник" вместо
"преемник", эта ошибка уже на всех сайтах.

> Среди них есть и довольно прогрессивные. Но кроме авторов они никому не

> интересны. А нужен язык, от которого невозможно отказаться.
Вот я и говорю — "преемник Путина"
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[14]: плохой язык C++ :)
От: Трурль  
Дата: 03.03.06 11:41
Оценка: +2 :))
Здравствуйте, igna, Вы писали:

I>Хорошо еще бы count спрятать.


+/(5<ints)&(~ints>10)
Re[3]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.03.06 12:38
Оценка:
Здравствуйте, Left2, Вы писали:

L>Влад, ну зачем же так

L>C живёт только потому что он уже есть везде — для любой платформы. Да, он убогий, да, в нём море граблей — но он стандарт де-факто. Вы бы ещё возмутились неудобной раскладкой клавиш на клавиатуре — 100% уверен в том что можно было сделать лучше, но я бы не стал кричать что QWERTY-раскладка обусловлена глупостью и костностью мышления.

Как раз раскладка на клаве это что называется вымучиный временем стандарт. Вариаций было очень много но выжил именно этот вариант.

Что до стандарта, то реальной необходимости в таком стандарте нет. Более того две самые популярные ОС, написанные на С (Винда и Линух), начинали писаться в 1991-1992 годах. В это время выбор был уже очень велик, но видимо кактусы так заманчивы...
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.03.06 12:38
Оценка:
Здравствуйте, Denis2005, Вы писали:

D>С++ ориентрован на сильных умом (experts only), и надо заметить, что в программировании далеко не все этим качеством обладают.


Написать качественный код на С пожалуй по сложнее чем на С++. Да и на С++ можно писать как на улученом С. Так что аргумент сомнительный.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: плохой язык C++ :)
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 03.03.06 12:43
Оценка: :)
Здравствуйте, Denis2005, Вы писали:

D>Перед программистом стоит достаточно трудоемкая задача, по сути нахождение оптимального решения по следующим критериям (первое что пришло на ум):


D>(Список можно продолжать).


Хватит, он и так слишком детален. Ведь на самом деле задача одна — написать эффективную программу, то есть ту которая утилизирует все доступніе ресурсы. Например, программа под дос — может использовать только 640К (я немножко упрощаю, конечно) и один проц. А у нас есть 2 проца и один гиг. Значит это малоэффективная программа. А эффективной, в данных условиях, была бы программа, которая утилизировала оба проца, весь гиг физической памяти, и пару — виртуальной. При том, если программа утилизирует каждый проц меньше чем на 100% это минус программисту, и на этот процент и должна уменьшаться его зарплата. Если ваша программа не способна утилизировать проц более чем на 1-2%, то вам стоит задуматься о своей профпригодности.
http://www.smalltalk.ru | << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[4]: плохой язык C++ :)
От: Left2 Украина  
Дата: 03.03.06 13:09
Оценка: +2
VD>Как раз раскладка на клаве это что называется вымучиный временем стандарт. Вариаций было очень много но выжил именно этот вариант.

Насколько я помню раскладка QWERTY появилась для того чтобы замедлить скорость набора текста — уж больно быстро стирались деревянные молоточки. Киньте камень кто скажет что такая раскладка "вымучена временем". Просто продали достаточно много машинок с такой раскладкой — и всё, назад пути нет, слишком дорого пытаться победить стандарт.

VD>Что до стандарта, то реальной необходимости в таком стандарте нет. Более того две самые популярные ОС, написанные на С (Винда и Линух), начинали писаться в 1991-1992 годах. В это время выбор был уже очень велик, но видимо кактусы так заманчивы...


Хм.. Сейчас на дворе 2006-й — но я не вижу реальной альтернативы — покажите мне хотя бы один язык, который доступен (не "может быть портирован" — а реально доступен, здесь и сейчас) для всех платформ — начиная от стиральных машинок и заканчивая mainframe?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: плохой язык C++ :)
От: dshe  
Дата: 03.03.06 13:22
Оценка:
Здравствуйте, Left2, Вы писали:

VD>>Как раз раскладка на клаве это что называется вымучиный временем стандарт. Вариаций было очень много но выжил именно этот вариант.


L>...Киньте камень кто скажет что такая раскладка [QWERTY] "вымучена временем". Просто продали достаточно много машинок с такой раскладкой — и всё, назад пути нет, слишком дорого пытаться победить стандарт.


+1

...а вот раскладка Dvorak целенаправленно проектировалась для того, чтобы ускорить набор текста. Но она все равно не смогла вытестить QWERTY.
--
Дмитро
Re[5]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 03.03.06 13:25
Оценка:
Left2 wrote:
> Хм.. Сейчас на дворе 2006-й — но я не вижу реальной альтернативы —
> покажите мне хотя бы один язык, который доступен (не "может быть
> портирован" — а реально доступен, здесь и сейчас) для всех платформ —
> начиная от стиральных машинок и заканчивая mainframe?
Хм... C++?
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[6]: плохой язык C++ :)
От: Left2 Украина  
Дата: 03.03.06 13:29
Оценка:
C>Хм... C++?

Не уверен.
Взять тот же Symbian (чтоб ему пусто было). Там С++ — это как бы родной язык для их API. Только вот от С++ там только название — нет exceptions, соответственно нет STL и т.д. и т.п. С++ слишком всеобьемлющ — выделить из него подмножество которое гарантированно будет работать на всех компиляторах наверное можно, но тогда это будет не более чем С с классами
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[15]: плохой язык C++ :)
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 03.03.06 13:32
Оценка:
Трурль,

I>>Хорошо еще бы count спрятать.


Т>
+/(5<ints)&(~ints>10)


и ints заменить на i
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[7]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 03.03.06 13:33
Оценка: +1
Left2 wrote:
> Не уверен.
> Взять тот же Symbian (чтоб ему пусто было). Там С++ — это как бы родной
> язык для их API. Только вот от С++ там только название — нет exceptions,
> соответственно нет STL и т.д. и т.п.
В новой версии добавили. Я вообще не понимаю зачем они сделали
самодельную систему исключений вместо нормальной их поддержки.

> С++ слишком всеобьемлющ — выделить

> из него подмножество которое гарантированно будет работать на всех
> компиляторах наверное можно, но тогда это будет не более чем С с классами
Однако, есть Comeau C++ — он компилирует код на С++ в код на С. Хотя
результирующий код и получается некроссплатформенным, но Comeau можно
адаптировать для любого компилятора С.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[8]: плохой язык C++ :)
От: Left2 Украина  
Дата: 03.03.06 13:48
Оценка:
C>В новой версии добавили. Я вообще не понимаю зачем они сделали
C>самодельную систему исключений вместо нормальной их поддержки.

+100. Было бы куда проще если бы они просто использовали коды возврата а не городили свою систему исключений — по крайней мере за деструкторы стековых обьектов можно было бы быть спокойным.

C>Однако, есть Comeau C++ — он компилирует код на С++ в код на С. Хотя

C>результирующий код и получается некроссплатформенным, но Comeau можно
C>адаптировать для любого компилятора С.

Ну вот, и в итоге всё равно приходим к pure С, как ни крути
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.03.06 14:03
Оценка: +1
Здравствуйте, Left2, Вы писали:

L>Хм.. Сейчас на дворе 2006-й — но я не вижу реальной альтернативы — покажите мне хотя бы один язык, который доступен (не "может быть портирован" — а реально доступен, здесь и сейчас) для всех платформ — начиная от стиральных машинок и заканчивая mainframe?


Таких языков море. Как не достал этот Оберон, но и он тоже входит в их число. Тот же Ричи создал такой язык. К сожалению я не помню как он называется, но думаю, если глянуть Википедию на Ричи, то быстро найдешь его имя. Просто народ слишком привязан к привычкам и плохо воспринимает новое.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.03.06 14:03
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Хм... C++?


С++ тут как раз плохой пример. Есть только один компилятор который его вообще реализует. А сложность языка приводит к тому, что реализовать его крайне сложно. Отделение бэкэнда и кроскомпиляция конечно помогают. Но все же это не то.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 03.03.06 14:22
Оценка:
VladD2 wrote:
> С++ тут как раз плохой пример. Есть только один компилятор который его
> вообще реализует. А сложность языка приводит к тому, что реализовать его
> крайне сложно. Отделение бэкэнда и кроскомпиляция конечно помогают. Но
> все же это не то.
Что сложнее: компилятор С++ или .NET Framework?
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[6]: плохой язык C++ :)
От: Left2 Украина  
Дата: 03.03.06 14:26
Оценка:
VD>Таких языков море. Как не достал этот Оберон, но и он тоже входит в их число. Тот же Ричи создал такой язык. К сожалению я не помню как он называется, но думаю, если глянуть Википедию на Ричи, то быстро найдешь его имя. Просто народ слишком привязан к привычкам и плохо воспринимает новое.

Я всё же другое имел в виду.
Я не возражаю что есть масса языков, которые можно портировать на любую платформу. Я имел в виду то что я не слышал ни про один язык кроме С, который уже есть для любой платформы. Стандарт де-факто.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.03.06 20:01
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Что сложнее: компилятор С++ или .NET Framework?


Комилятор С++. Ведь его смогли воспроизвести только в одном экземпляре. А разновидностей фрэймворков роде как уже штук 6.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.03.06 20:01
Оценка:
Здравствуйте, Left2, Вы писали:

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


С тоже нет для любой платформы. Его точно так же портируют. При этом используется техника корспомпиляции и сменных генераторов кода. Подобные решения есть не только для С. И очень давно. Вот я и говорю, что засилие С кроме как торжеством привычки и неразмности объяснить нельзя.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 03.03.06 20:22
Оценка:
Здравствуйте, r.oleg, Вы писали:

Цитировать в таком объеме совершенно необязательно.
... << RSDN@Home 1.2.0 alpha rev. 642 on Windows XP 5.1.2600.131072>>
AVK Blog
Re: плохой язык C++ :)
От: Шахтер Интернет  
Дата: 03.03.06 21:57
Оценка: +1
Здравствуйте, Зверёк Харьковский, Вы писали:

Автор (видимо в силу своей высокообразованности) плохо знает, во что выливается такая невинная строчка как


printf("File %s has length=%d\n",file_name,length);


или

FILE *f=fopen("coolfile.txt");
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[7]: плохой язык C++ :)
От: Павел Кузнецов  
Дата: 03.03.06 22:57
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

E>> Нужно еще Александреску вспомнить, и Абрахамса, и Гуртового и пр. Правда они не столько над языком работают, сколько над стилем его использования. Нужно сказать, что у них получается.


PA>Это диверсанты-функциональщики на самом деле .


То-то бы Леша удивился, узнав о себе такое...
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: плохой язык C++ :)
От: xbit Россия  
Дата: 04.03.06 00:02
Оценка: 1 (1) +2 :))) :))
Здравствуйте, igna, Вы писали:

СГ>>Все сильные умом люди, которых я знаю, не благосклонны к языку С++.


I>А к каким языкам благосклонны сильные умом?


Сильные умом благосклонны к языкам не напрягающим их сильные умы...
Нас не догонят!
Re[11]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 04.03.06 03:07
Оценка: +1 -4
Здравствуйте, Cyberax, Вы писали:

C>igna wrote:

>> — GUI
>> — GUI
>> — GUI
C>Не предмет первой необходимости.

Батенька, на дворе давным давно 21 век, а вы всё никак из командной строки не вылезите. Однако, явно наблюдается задержка в развитии

>> — Database access

C>_Далеко_ не предмет первой необходимости.

Как минимум если бы не было одной, то эту свою гениальную мысль ты не смог бы выразить так ярко.

>> — XML

C>Было обсуждение по включению XML-библиотеки в Boost, но пока завязло
C>(уже и так куча либ есть).

А почему завязло?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 04.03.06 03:27
Оценка:
Здравствуйте, Left2, Вы писали:

D>>>С++ ориентрован на сильных умом


СГ>>Все сильные умом люди, которых я знаю, не благосклонны к языку С++.


L>"-" поставил не в защиту С++ а потому что высказывание уж очень тянет на разжигание межязыковой вражды


Минуса это не стоит. Тогда его надо было ставить автору топика. А вообще и ему не за что. Уж слишком часто стали ругать в последнее время плюсы, причём не только враги, но и доброжелатели. В экономике это можно было бы назвать кризисом, но в отличии от экономики пока путей выхода из этого самого кризиса не видно.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 04.03.06 03:32
Оценка:
Здравствуйте, VladD2, Вы писали:

D>>С++ ориентрован на сильных умом (experts only), и надо заметить, что в программировании далеко не все этим качеством обладают.


VD>Написать качественный код на С пожалуй по сложнее чем на С++.


А ассемблер доступен лишь сильным умом и сильнейшим духом. А в машинных кодах пишут только в палате номер шесть.

"Только психотерапия, господа сумасшедшие! И никакого самолечения цветными таблетками!" (c)
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 04.03.06 06:37
Оценка: +1
Здравствуйте, alex_ez, Вы писали:

_>что значит выражение "урезать не с того конца" ?..


Всмысле урезать с начала?

_>java — это кросплатформенный язык программирования.

_>c# — перевоплощение, помоему, тоже бессмысленное.

Вместо перевоплощения в данном случае лучше использовать другое слово — реинкарнация.

_>и еще, C++ и ANSI C++ совершенно разные вещи.


Так же есть и другие совершенно разные вещи: Zortech C++, Turbo C++, Borland C++, Watcom C++, VC++, Builder C++, GCC/G++, Symantec C++, CodeWarrior, Intel C++, Sun C++, IBM VisualAg, DJGPP и куча прочей хрени. И главное — совершенно разной хрени.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: плохой язык C++ :)
От: igna Россия  
Дата: 04.03.06 09:46
Оценка:
Здравствуйте, xbit, Вы писали:

X>Сильные умом благосклонны к языкам не напрягающим их сильные умы...


Тогда это PL/M.
Re[12]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 04.03.06 09:51
Оценка: 2 (1) +4 :))) :))) :))
Здравствуйте, IT, Вы писали:

IT>Батенька, на дворе давным давно 21 век, а вы всё никак из командной строки не вылезите. Однако, явно наблюдается задержка в развитии


Скорее наоборот. Уже 21-й век давно на дворе, Unix уже на дектопах, а вы все в окошках и окошках Как дети малые


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[9]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 04.03.06 10:53
Оценка:
Здравствуйте, VladD2, Вы писали:

C>>Что сложнее: компилятор С++ или .NET Framework?

VD>Комилятор С++. Ведь его смогли воспроизвести только в одном экземпляре. А разновидностей фрэймворков роде как уже штук 6.
Да, и во всех есть _полная_ реализация WinForms?
Sapienti sat!
Re[12]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 04.03.06 11:00
Оценка:
Здравствуйте, IT, Вы писали:

C>>Не предмет первой необходимости.

IT>Батенька, на дворе давным давно 21 век, а вы всё никак из командной строки не вылезите. Однако, явно наблюдается задержка в развитии
Ну что сделать, если у меня во многих задачах не нужно больше

Ну а стандартизовать GUI, по-моему, вообще смысла нет. За время стандартизации успеет появится очередной super-cool метод создания GUI.

>>> — Database access

C>>_Далеко_ не предмет первой необходимости.
IT>Как минимум если бы не было одной, то эту свою гениальную мысль ты не смог бы выразить так ярко.
Смотрим связку Windows+Office: в самой Windows нигде БД через обобщенный интерфейс не используются (хотя в MSI и MMI есть свои реализации недо-SQL), в Word/Excel используются для дополнительных фич (типа привязки таблиц к источникам данных). Хотя да, есть исключение — MS Access

>>> — XML

C>>Было обсуждение по включению XML-библиотеки в Boost, но пока завязло
C>>(уже и так куча либ есть).
IT>А почему завязло?
Решили, что нет смысла создавать yet another XML-библиотеку. Тот же libxml с С++-биндингами вполне адекватен.
Sapienti sat!
Re[13]: плохой язык C++ :)
От: igna Россия  
Дата: 04.03.06 11:20
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Ну а стандартизовать GUI, по-моему, вообще смысла нет. За время стандартизации успеет появится очередной super-cool метод создания GUI.



C++0x Standard Library wishlist (draft revision 6)
. . .
GUI

Requester: Bjarne Stroustrup, Michael Rasmussen, John Medema, others
Paper:

Some form of simple graphic/GUI library (possibly a simple interface to the simpler parts of larger libraries)—a recurent theme.

Some thoughts on this from Michael Rasmussen:
The main architecture resembles the idea behind Java's JDBC. E.g. the language/library provides a standard interface or set of interfaces and developers of graphics libraries does the actual implementation. If put into a design pattern terminology the standard interface is a factory hiding all implementation specific stuff from the programmer. The standard interface would specify features and their dependencies but otherwise leave implementation descessions to the developers of the graphics library.

There are many advantages to this architecture of which I will point out the most important ones:

* Portability: Write one GUI class and reuse it on any platform providing a C++ GUI standards compliant implementation.
* Simplicity: The C++ language does not need to maintain a binary code base on every available platform. All the language needs to maintain is a specification for the interface.
* Compatibility: If the architecture is chosen backwards compatibility can be maintained because the interface will be purely written in standard C++ and have no ties to the underlying platforms graphics specifications and/or hardware.
* Control: No graphics library will be able to extend or change the functionality of the GUI interface in the language. This means that the community will be in full control of the direction and development but at the same time the community will not in any way prevent developers of graphics libraries to go further. A core will be standards compliant and the extention will not be.

It is hard for me to point out some disadvantages but of course one is obvious: The success depends on adaptation from developers of graphics libraries.

Re[4]: плохой язык C++ :)
От: ArtemGorikov Австралия жж
Дата: 04.03.06 11:27
Оценка:
Здравствуйте, VladD2, Вы писали:

E>>И только C++никам все по барабану


VD>Ну, почему же? Смотри как С++ сразу защищать начинают. Значет не по барабану.


Стоит упомянуть ключевая фразу: "C# медленнее(или памяти больше требует — не суть важно) чем _нужное подставить_", и сразу появляются его защитники .
P.S. А вот мне тоже понравилось кнопочки кидать и foreach — в шарпе. И не тормозило ничего (правда софтина была крошечная, почти HelloWorld) Обычные диаложки по сравнению с WinForms — каменный век. Осталось еще написать свой контрол на шарпе и сравнить сложность разработки/качество конечного результата.
Re[10]: плохой язык C++ :)
От: GlebZ Россия  
Дата: 04.03.06 12:28
Оценка: +1
Здравствуйте, igna, Вы писали:

VG>>Что такое предмет первой необходимости?


I>- GUI

I>- GUI
I>- GUI
I>- Database access
I>- XML
Это проблемы не языка, а библиотек. Их собственно и в спецификации C# и Java не найдешь. И все эти библиотеки для C++ существуют.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[10]: плохой язык C++ :)
От: WolfHound  
Дата: 04.03.06 12:46
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Да, и во всех есть _полная_ реализация WinForms?

WinForms имеет такое же отношение к .NET как MFC к С++. Так что мимо кассы.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: плохой язык C++ :)
От: WolfHound  
Дата: 04.03.06 12:46
Оценка: 12 (1) +2
Здравствуйте, xbit, Вы писали:

X>Сильные умом благосклонны к языкам не напрягающим их сильные умы...

Скорее не напрягающие больше чем необходимо.
Ибо

Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн

... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[11]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 04.03.06 15:21
Оценка:
WolfHound wrote:
> C>Да, и во всех есть _полная_ реализация WinForms?
> WinForms имеет такое же отношение к .NET как MFC к С++. Так что мимо кассы.
Простите, а за что мне 5 минусов тогда поставили в ответе про GUI и БД?

Кроме того, я специально спросил ".NET Framework".
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[11]: плохой язык C++ :)
От: igna Россия  
Дата: 04.03.06 15:36
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Это проблемы не языка, а библиотек.


А я и не говорил, что языка. И даже, что проблемы. По секрету, это
Автор: igna
Дата: 03.03.06
был камень не в огород C++, это в другой огород камень. Только не выдавай, обидчивые они...
Re[13]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 04.03.06 17:32
Оценка: +1 -1
Здравствуйте, Cyberax, Вы писали:

C>>>Не предмет первой необходимости.

IT>>Батенька, на дворе давным давно 21 век, а вы всё никак из командной строки не вылезите. Однако, явно наблюдается задержка в развитии
C>Ну что сделать, если у меня во многих задачах не нужно больше

Вот! Я же тебе уже говорил, что тебе надо почаще добавлять к своим выступлениям ИМХО, т.к. ты находишься в подавляющем меньшинстве.

>>>> — Database access

C>>>_Далеко_ не предмет первой необходимости.
IT>>Как минимум если бы не было одной, то эту свою гениальную мысль ты не смог бы выразить так ярко.
C>Смотрим связку Windows+Office: в самой Windows нигде БД через обобщенный интерфейс не используются (хотя в MSI и MMI есть свои реализации недо-SQL), в Word/Excel используются для дополнительных фич (типа привязки таблиц к источникам данных). Хотя да, есть исключение — MS Access

Ты когда-нибудь видел интернет? По сайтам разным ходил? Сообщения свои оставлял? Покупал что-нибудь в интернет магазинахх? Просматривал новости? Открою тебе страшный секрет — это всё сделано на базах данных и для тебя они, получается, предмет первейшей необходимости. Если ты когда-нибудь видел, конечно, интернет

C>>>Было обсуждение по включению XML-библиотеки в Boost, но пока завязло

IT>>А почему завязло?
C>Решили, что нет смысла создавать yet another XML-библиотеку. Тот же libxml с С++-биндингами вполне адекватен.

Если буст претендует на стандарт, то смысл создавать есть и даже очень. Как раз для того, чтобы покончить со зверинцем XML библиотек.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 04.03.06 18:10
Оценка: 5 (3) +3
IT wrote:
> IT>>Батенька, на дворе давным давно 21 век, а вы всё никак из командной
> строки не вылезите. Однако, явно наблюдается задержка в развитии
> C>Ну что сделать, если у меня во многих задачах не нужно больше
> Вот! Я же тебе уже говорил, что тебе надо почаще добавлять к своим
> выступлениям ИМХО, т.к. ты находишься в подавляющем меньшинстве.
Аналогично. Стоило бы написать:

ИМХО:
— GUI
— GUI
— GUI
...


> Ты когда-нибудь видел интернет? По сайтам разным ходил? Сообщения свои

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

> C>Решили, что нет смысла создавать yet another XML-библиотеку. Тот же

> libxml с С++-биндингами вполне адекватен.
> Если буст претендует на стандарт, то смысл создавать есть и даже очень.
> Как раз для того, чтобы покончить со зверинцем XML библиотек.
А зачем? Вот в Java в свое время взяли и зафиксировали версию
Xercex+Xalan в "стандартном" JDK. Потом появились (точнее стали
популярны) намного более удобные JDom/Dom4J, но заменить старые классы
для XML на новые — уже нельзя (на них уже много завязано).

Можно пойти по пути MS и просто добавить JDom/Dom4J в JDK рядом с
Xerces'ом. Но тогда размер JDK быстро начнет расти.

Или другой пример — MS в свое время стандартизовалась (с совершенно
благими намерениями "поддержки всех языков") на UCS2 для представления
Unicode'а. В результате сейчас C# и WinAPI ограничены BMP (Basic
Multilingual Plane), из-за чего появляются проблемы с языками, которых
нет в BMP (и у японцев, которым не нравится китайский порядок сортировки
иероглифов в BMP). _Уже_ начинаются полуработающие извращения с
самопальной поддержкой суррогатов и их несовместимостью с половиной .NET FW.

Я таких примеров еще могу найти. В общем "premature standardization is
the root of all evil".

Я вообще считаю, что в стандарте на язык и его окружение не должно быть
ничего кроме самого важного (контейнеры, алгоритмы, базовый ввод/вывод).
То что вряд ли будет меняться со временем, а остальное лучше обеспечить
библиотеками.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[12]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 07:06
Оценка:
Здравствуйте, Cyberax, Вы писали:

>> C>Да, и во всех есть _полная_ реализация WinForms?

>> WinForms имеет такое же отношение к .NET как MFC к С++. Так что мимо кассы.
C>Простите, а за что мне 5 минусов тогда поставили в ответе про GUI и БД?

C>Кроме того, я специально спросил ".NET Framework".


Тогда задайся еще вопросом "Что сложнее .NET Framework или Windows". Думаю у тебя выйдет, что .NET Framework сложнее, так как для его реализации придется реализовать Windows как базовый компоенет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 08:33
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Это проблемы не языка, а библиотек. Их собственно и в спецификации C# и Java не найдешь. И все эти библиотеки для C++ существуют.


Re[7]: плохой язык C++ :)
Автор: igna
Дата: 03.03.06
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 08:33
Оценка: :)
Здравствуйте, eao197, Вы писали:

E>А если учесть что в двух местах используется одинаковый код, то хотелось иметь возможность написать так:

E>
E>auto predicat = bool lambda( int x ) { return ( 5 < x && x <= 10 };

E>int count = count_if( ints.begin(), ints.end(), predicat );
E>...
E>auto int_it = find_if( ints.begin(), ints.end(), predicat );
E>


E>Вот это было бы для меня удобно. И нормально.


Да, уже несомненно лучше. Если теперь убрать бессмысленные "ints.begin(), ints.end()" и "vector<int>::iterator", а так же написать часную функцию count_if на базе универсальной FoldLeft, то получится код на Namerle.

def seq = [1, 30, 5, 7, 2, 6, 6];

def countIf(seq, predicate)
{
    seq.FoldLeft(0, fun(x, i){ if (predicate(x)) i + 1 else i });
}

def result = countIf(seq, fun(x){ 5 < x && x <= 10 });
Nemerle.IO.printf("Result: %d\n", result);

Result: 3


Короче, на С++ лучше не писать в функциональном стиле. Тогда его убогость будет видна не так сильно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 09:01
Оценка: :)
Здравствуйте, Павел Кузнецов, Вы писали:

PA>>Это диверсанты-функциональщики на самом деле .


ПК>То-то бы Леша удивился, узнав о себе такое...


Оно это знает. Даже писал об этом как-то...
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 09:01
Оценка:
Здравствуйте, eao197, Вы писали:

E>Просто в качестве мысли вслух. Интересно, какому-нибудь столь же распространенному языку, как C++, удалось сохранить единую концепцию и стройность языка за двадцать лет своего развития и после столько кардинальных доработок, как в C++ (исключения и шаблоны ведь в C++ не сразу появились)?


Можно список координальных доработок за последние 10 лет?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 09:01
Оценка: :))
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Все сильные умом люди, которых я знаю, не благосклонны к языку С++.


А ПК?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: плохой язык C++ :)
От: igna Россия  
Дата: 05.03.06 09:10
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Можно список координальных доработок за последние 10 лет?


C++/CLI
Re[13]: плохой язык C++ :)
От: igna Россия  
Дата: 05.03.06 09:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD> ... Если теперь убрать бессмысленные "ints.begin(), ints.end()" и "vector<int>::iterator", ...


 . . .
VD>    seq.FoldLeft(0, fun(x, i){ if (predicate(x)) i + 1 else i });
 . . .



Концепция итератора заметно богаче концепции кой-чего с методом FoldLeft.


Некоторые даже полагают, будто:

... iterator theories are as central to Computer Science as theories of rings or Banach spaces are central to Mathematics. <i>(Alex Stepanov)</i>

Re[14]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 10:18
Оценка: :)
Здравствуйте, igna, Вы писали:

I>Концепция итератора заметно богаче концепции кой-чего с методом FoldLeft.


Если бы ты знал какую глупость ты сейчас произнес.

Я не гуру в этих вопросах но даже мне ясно, что итераторы всего лишь паттерн для перебора последовательности. Между тем есть всего два варианта перебора 1) цикл, 2) рекурсия. FoldLeft — это рекурсивный перебор. На чем он делается уже не важно.


I>Некоторые даже полагают, будто:


I>

I>... iterator theories are as central to Computer Science as theories of rings or Banach spaces are central to Mathematics. <i>(Alex Stepanov)</i>


Я начну слушать Степанова когда он начнет писать внятный код. Хотя на С++ это вообще зделать очень не просто.

В общем, счасливо изучать концепции итераторов дальше. А я лучше буду писать максимально краткий и ясный код.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 10:18
Оценка:
Здравствуйте, igna, Вы писали:

VD>>Можно список координальных доработок за последние 10 лет?


I>C++/CLI


Хотя тут многие не считают C++/CLI вообще С++-ом, ну, да ладно — 1... Дальше?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 05.03.06 11:12
Оценка:
VladD2 wrote:
> C>Кроме того, я специально спросил ".NET *Framework*".
> Тогда задайся еще вопросом "Что сложнее .NET *Framework* или Windows".
> Думаю у тебя выйдет, что .NET Framework сложнее, так как для его
> реализации придется реализовать Windows как базовый компоенет.
Ну вот. В С++ примерно тоже — язык, в котором есть несколько ловушек,
требующих для реализации кучу кода.

Поэтому ваш аргумент "сложный, а значит плохой" — не совсем правильный.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[4]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 05.03.06 11:13
Оценка:
VladD2 wrote:
> E>Просто в качестве мысли вслух. Интересно, какому-нибудь столь же
> распространенному языку, как C++, удалось сохранить единую концепцию и
> стройность языка за двадцать лет своего развития и после столько
> кардинальных доработок, как в C++ (исключения и шаблоны ведь в C++ не
> сразу появились)?
> Можно список координальных доработок за последние 10 лет?
Шаблоны с частичной специализацией, метапрограммирование.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[15]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.03.06 11:22
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>А зачем? Вот в Java в свое время взяли и зафиксировали версию

C>Xercex+Xalan в "стандартном" JDK. Потом появились (точнее стали
C>популярны) намного более удобные JDom/Dom4J, но заменить старые классы
C>для XML на новые — уже нельзя (на них уже много завязано).

Вас обманули. XML-парсеры описываются стандартом JAXP (Java API for XML Processing). Стандарт есть уже давно (где то с версии джавы 1.2), но реализации в JRE до версии 1.3 не было. В 1.3 добавили апачевский парсер, но он полностью совместимм с JAXP и на нем основан. Так что если реализация парсера соответствует стандарту, то никаких проблем заменить Xerces нет.

C>Можно пойти по пути MS и просто добавить JDom/Dom4J в JDK рядом с

C>Xerces'ом. Но тогда размер JDK быстро начнет расти.

А что, у .NET есть две публичных реализации парсера XML?
... << RSDN@Home 1.2.0 alpha rev. 644 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[16]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 05.03.06 11:31
Оценка: :)
AndrewVK wrote:
> Вас обманули. XML-парсеры описываются стандартом JAXP (Java API for XML
> Processing). Стандарт есть уже давно (где то с версии джавы 1.2), но
> реализации в JRE до версии 1.3 не было. В 1.3 добавили апачевский
> парсер, но он полностью совместимм с JAXP и на нем основан. Так что если
> реализация парсера соответствует стандарту, то никаких проблем заменить
> Xerces нет.
Я это знаю, но дело в том что этот стандарт (кстати, он писался вслед за
Xerces) очень неудобен. Вот статья на эту тему:
http://www-128.ibm.com/developerworks/library/x-injava2/

> C>Можно пойти по пути MS и просто добавить JDom/Dom4J в JDK рядом с

> C>Xerces'ом. Но тогда размер JDK быстро начнет расти.
> А что, у .NET есть две публичных реализации парсера XML?
Нет, просто есть копии сборок для 1.0, 1.1 и 2.0.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[17]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.03.06 11:59
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Нет, просто есть копии сборок для 1.0, 1.1 и 2.0.


Где?
... << RSDN@Home 1.2.0 alpha rev. 644 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[15]: плохой язык C++ :)
От: Vermicious Knid  
Дата: 05.03.06 12:16
Оценка:
VD>Если бы ты знал какую глупость ты сейчас произнес.

+1. Функциональное программирование без сомнения более богатая концепция, чем итераторы. Особенно в том виде, в котором оно присутствует в Nemerle(т.е. хорошо так разбавленном императивным, объектно-ориентированным, обобщенным и генеративным программированием). Пример с FoldLeft это далеко не самый показательный случай.

VD>Я не гуру в этих вопросах но даже мне ясно, что итераторы всего лишь паттерн для перебора последовательности. Между тем есть всего два варианта перебора 1) цикл, 2) рекурсия. FoldLeft — это рекурсивный перебор. На чем он делается уже не важно.


Ну вообще-то есть random access итераторы, output итераторы итд. Они позволяют несколько больше, чем просто перебирать последовательность. Но по сути это неважно. Любой вид итератора можно при большом желании реализовать на C# 2.0 и соотвественно Nemerle. Только вот зачастую это никому не нужно. Слишком узок круг этих задач, где такие итераторы сильно облегчают жизнь. У управляемых языков свой подход к обобщенному программированию и опыт показывает, что для того круга задач которые обычно решаются на управляемых языках такой подход зачастую лучше. И наиболее часто используемые итераторы это все таки итераторы для перебора последовательностей, а они .NET средой поддерживаются(как концепция ) в полной мере.

А что касается FoldLeft(и других подобных функций) и рекурсии, то это необязательно. В Nemerle конечно нет циклов и рекурсия обычно оптимизируется в цикл. А так FoldLeft можно и через обычный цикл реализовать:
def FoldLeft(collection, mutable value, func)
{
    foreach(element in collection)
    {
        value = func(value, element);
    }
    value
}

def numbers = [1, 2, 3, 4];
def product = FoldLeft(_, 1, fun(product, number) { product * number });
Nemerle.IO.printf("%d\n", product(numbers));

Конечно здесь во время компиляции foreach раскроется в while, а while в рекурсию, а рекурсия станет циклом, но это не важно.
Re[4]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 05.03.06 13:42
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Можно список координальных доработок за последние 10 лет?


Я говорил о 20-ти годах развития, а не про последние 10 лет
А за последние 10 лет, имхо, самым важным стало:
— уменьшение количества "живых" компиляторов для самых популярных платформ;
— проведенный-таки deadline по предложениям к новому стандарту языка.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[16]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 18:28
Оценка:
Здравствуйте, Vermicious Knid, Вы писали:

VD>>Если бы ты знал какую глупость ты сейчас произнес.


VK>+1. Функциональное программирование без сомнения более богатая концепция, чем итераторы. Особенно в том виде, в котором оно присутствует в Nemerle(т.е. хорошо так разбавленном императивным, объектно-ориентированным, обобщенным и генеративным программированием). Пример с FoldLeft это далеко не самый показательный случай.


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

VK>Ну вообще-то есть random access итераторы, output итераторы итд.


access-итераторы — это вообще оксюморон. Все равно что живой мертвец.

VK> Они позволяют несколько больше, чем просто перебирать последовательность. Но по сути это неважно.


Именно.

VK> Любой вид итератора можно при большом желании реализовать на C# 2.0 и соотвественно Nemerle. Только вот зачастую это никому не нужно. Слишком узок круг этих задач, где такие итераторы сильно облегчают жизнь.


Скажу болше. Во всем дотнете просто применяются другой набор абстракций. Всесто оксюморонов воде random access iterator в нем есть интерфейсы IList<T> и ICollection<T> выполняющие ту же роль, но имеющие более логичные имена и более простой интерфейс.

VK> У управляемых языков свой подход к обобщенному программированию и опыт показывает, что для того круга задач которые обычно решаются на управляемых языках такой подход зачастую лучше. И наиболее часто используемые итераторы это все таки итераторы для перебора последовательностей, а они .NET средой поддерживаются(как концепция ) в полной мере.


Опыт показывает, что вообще трудно найти область где код на С++ оказался бы проще и кратче чем на C#. Хотя конечно если постараться, то найти можно. А уж с Немерлом ему точно не тягаться.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 18:28
Оценка:
Здравствуйте, Cyberax, Вы писали:

>> C>Кроме того, я специально спросил ".NET *Framework*".

>> Тогда задайся еще вопросом "Что сложнее .NET *Framework* или Windows".
>> Думаю у тебя выйдет, что .NET Framework сложнее, так как для его
>> реализации придется реализовать Windows как базовый компоенет.
C>Ну вот. В С++ примерно тоже — язык, в котором есть несколько ловушек,
C>требующих для реализации кучу кода.

C>Поэтому ваш аргумент "сложный, а значит плохой" — не совсем правильный.


Вообще не улавливаю связи.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 18:28
Оценка:
Здравствуйте, Cyberax, Вы писали:

>> Можно список координальных доработок за последние 10 лет?

C>Шаблоны с частичной специализацией, метапрограммирование.

Это 1998-ой год. Где же куча изменений?

Да и какой смысл в этих изменениях? Введение убогого функционального языка времени компиляции?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 18:28
Оценка:
Здравствуйте, eao197, Вы писали:

E>Я говорил о 20-ти годах развития, а не про последние 10 лет


ОК, давай за 20.

Я знаю только два изменения языка. Можешь назвать третье?

E>А за последние 10 лет, имхо, самым важным стало:

E>- уменьшение количества "живых" компиляторов для самых популярных платформ;
E>- проведенный-таки deadline по предложениям к новому стандарту языка.

Ну, то есть, по-твоему, последние 10 лет было не развитие, а деградация?
Представляешь какова была бы польза для общества, если все эти 20 лет мега-контроы занимались бы развитием действительно мощьного языка и вкладывали бы деньги в их компиляторы и средства разработки?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: плохой язык C++ :)
От: igna Россия  
Дата: 05.03.06 20:16
Оценка:
Здравствуйте, VladD2, Вы писали:

VD> ... Я не гуру в этих вопросах но даже мне ясно, что итераторы всего лишь паттерн для перебора последовательности. Между тем есть всего два варианта перебора 1) цикл, 2) рекурсия. FoldLeft — это рекурсивный перебор. На чем он делается уже не важно.


А вот какой чудесный оказывается бывает итератор
Автор: remark
Дата: 05.03.06
.
Re[16]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.03.06 23:30
Оценка: :)
Здравствуйте, igna, Вы писали:

I>Здравствуйте, VladD2, Вы писали:


VD>> ... Я не гуру в этих вопросах но даже мне ясно, что итераторы всего лишь паттерн для перебора последовательности. Между тем есть всего два варианта перебора 1) цикл, 2) рекурсия. FoldLeft — это рекурсивный перебор. На чем он делается уже не важно.


I>А вот какой чудесный оказывается бывает итератор
Автор: remark
Дата: 05.03.06
.


О, да, вещь невероятной полезности.

А простота реализации на плюсах!!! Есть чем гардится. Куда там аналогу на C#:
static IEnumerable<T> Repeater<T>(IEnumerable<T> seq)
{
    while (true)
        foreach (T value in seq)
            yield return value;
}


И использование:
static void Main()
{
    foreach (int value in Repeater(new int[] { 1, 2, 3 }))
        Console.Write(value + " ");
}


Сравни на досуге со своим любимым С++. Забавно, что в Нэмерле yield тоже есть, но реализован в виде макроса.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 06.03.06 05:51
Оценка: :)
VladD2 wrote:
> А простота реализации на плюсах!!! Есть чем гардится. Куда там аналогу
> на C#:
Кстати, а что там у нас с итераторами для изменяющихся контейнеров? Для
C++ они есть в Boost

А как насчет аналога zip-iterator'а (итератор сразу по нескольким
контейнерам) и его применения для обобщенных алгоритмов?
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[18]: плохой язык C++ :)
От: anton_t Россия  
Дата: 06.03.06 06:13
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>VladD2 wrote:

>> А простота реализации на плюсах!!! Есть чем гардится. Куда там аналогу
>> на C#:
C>Кстати, а что там у нас с итераторами для изменяющихся контейнеров? Для
C>C++ они есть в Boost

C>А как насчет аналога zip-iterator'а (итератор сразу по нескольким

C>контейнерам) и его применения для обобщенных алгоритмов?

вот:

    public class Class1
    {
        static IEnumerable<T> Union<T>(IEnumerable<T> one, IEnumerable<T> two)
        {
            foreach (T var in one)
                yield return var;
            foreach (T var in two)
                yield return var;
        }

        static void Main()
        {
            foreach (int val in Union(new int[] { 1, 2, 3 }, new int[] { 5, 6, 7 }))
                Console.Write(val + " ");
            Console.ReadLine();
        }
    }
Re: плохой язык C++ :)
От: Кодёнок  
Дата: 06.03.06 06:35
Оценка: 3 (1) +1
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>эффект любой строки кода локален и очевиден


С одной стороны, хороший принцип. Вирт со своим Обероном кстати, строго ему следует.

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

ЗХ>Но, с другой стороны: полностью нарушен (я бы сказал, низвергнут с пьедестала и подвержен особо извращенному поруганию) этот самый принцип локальности поведения системы в ответ на строчку моего кода. Я всего лишь объявил переменную какого-то типа, написав "Typename varname;", но эта строчка может привести к вызову неизвестного мне конструктора, а за ним — кода сколь угодно, вообще говоря, сложности. Я всего лишь применяю известный мне оператор к переменной — а он, оказывает, overloaded у этого класса, и черт знает что на самом деле там произойдет. Я всего лишь вышел из функции, что может быть проще, написал }, а в рантайме на самом деле пошли плясать деструкторы всех автоматических объектов в этой функции. И даже и не буду начинать говорить про copy constructor и прочие подобные прелести.


ЗХ>Так вот, поэтому C++ — плохой язык.


Автор пытается использовать С++ как Си. То же самое было, когда ругали дотнет. Баян короче [:|||||:]
Re[19]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 06.03.06 06:46
Оценка: :)
anton_t wrote:
> C>А как насчет аналога zip-iterator'а (итератор сразу по нескольким
> C>контейнерам) и его применения для обобщенных алгоритмов?
> вот:
Не подходит. Я могу делать так:
typedef boost::zip_iterator<
     boost::tuples::tuple<
       std::set<int>::iterator,
       std::vector<double>::iterator
       >
     > set_and_vector_iterator;

std::set<int> someSet;
std::vector<double> someVec;

set_and_vector_iterator iter (     
     boost::make_tuple(someSet.begin(),someVec.at(5));
for(;iter!=set_and_vector_iterator();++iter)
{
//Do something
}


Или вот так:
typedef zip_iterator<
     tuple<
       std::deque<int>::iterator,
       std::vector<double>::iterator
       >
     > zip_iter;

std::deque<int> someDeque;
std::vector<double> someVec;

zip_iter begin(make_tuple(someDeque.begin(),someVec.at(5)));
zip_iter end(make_tuple(someDeque.at(11),someVec.at(16)));
std::sort(begin,end);

В этом примере будут отсортированы куски двух массивов. Сравнение
элементов производится сначала по первому элементу тупла, потом по второму.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[17]: плохой язык C++ :)
От: igna Россия  
Дата: 06.03.06 07:30
Оценка: :)))
Здравствуйте, VladD2, Вы писали:

VD> ... Куда там аналогу на C#:


VD>static IEnumerable<T> Repeater<T>(IEnumerable<T> seq)
VD>{
VD>    while (true)
VD>        foreach (T value in seq)
VD>            yield return value;
VD>}


<b>Там</b>
Автор: remark
Дата: 05.03.06
был зацикленный итератор.
Re[18]: плохой язык C++ :)
От: anton_t Россия  
Дата: 06.03.06 07:37
Оценка: 1 (1) +1
Здравствуйте, igna, Вы писали:

I>Здравствуйте, VladD2, Вы писали:


VD>> ... Куда там аналогу на C#:


I>
VD>>static IEnumerable<T> Repeater<T>(IEnumerable<T> seq)
VD>>{
VD>>    while (true)
VD>>        foreach (T value in seq)
VD>>            yield return value;
VD>>}
I>


I><b>Там</b>
Автор: remark
Дата: 05.03.06
был зацикленный итератор.


А тут что, не зацикленный?
Re[19]: плохой язык C++ :)
От: igna Россия  
Дата: 06.03.06 07:42
Оценка:
Здравствуйте, anton_t, Вы писали:

_>А тут что, не зацикленный?


Re[18]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.03.06 07:51
Оценка: :))
Здравствуйте, igna, Вы писали:

I>
VD>>static IEnumerable<T> Repeater<T>(IEnumerable<T> seq)
VD>>{
VD>>    while (true)
VD>>        foreach (T value in seq)
VD>>            yield return value;
VD>>}
I>


I><b>Там</b>
Автор: remark
Дата: 05.03.06
был зацикленный итератор.


То есть без пары килобайт текста не верится, что что-то заработает?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: плохой язык C++ :)
От: igna Россия  
Дата: 06.03.06 08:02
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>То есть без пары килобайт текста не верится, что что-то заработает?


Ага, так оно и было.
Re[8]: плохой язык C++ :)
От: Programmierer AG  
Дата: 06.03.06 08:55
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

E>>> Нужно еще Александреску вспомнить, и Абрахамса, и Гуртового и пр. Правда они не столько над языком работают, сколько над стилем его использования. Нужно сказать, что у них получается.

PA>>Это диверсанты-функциональщики на самом деле .

ПК>То-то бы Леша удивился, узнав о себе такое...

.
Ну, во-первых, это была шутка.
Во-вторых, не имею чести быть с ним знакомым, если действительно удивится — дайте знать .
В-третьих, это же очевидно из дизайна MPL — функции высших порядков, ленивое вычисление, partial application (аналог currying), алгоритмы обработки последовательностей реализованы через fold и т.д.;
http://boost.org/libs/mpl/doc/tutorial/higher-order.html — здесь туториал MPL ссылается на статью Paul'а Hudak'а, популяризатора ФП вообще и Haskell в частности.

В конце концов, я лично заинтересовался ФП после знакомства с MPL (коварный план в действии ).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 06.03.06 08:55
Оценка: 7 (1)
Здравствуйте, VladD2, Вы писали:

VD>ОК, давай за 20.


VD>Я знаю только два изменения языка. Можешь назвать третье?


Вообще-то с памятью у меня не важно, поэтому могу в чем-то ошибиться, но с 1992-го года, когда я начал изучать и использовать C++ изменений в самом языке было довольно много:
-- появилось множественное наследование (имхо, изначально его не было, в 90-х года оно уже было доступно во многих компиляторах, но не везде) и виртуальные базовые классы;
-- отказались от ключевого слова override для перегрузки (имхо, оно еще описывалось в первом издании "Языка программирования C++");
-- добавлено protected-наследование (изначально было только private и public наследование);
-- если не ошибаюсь, был расширен список операторов для перегрузки;
-- добавлена библиотека потокового ввода-вывода (те самые iostream);
-- добавлена поддержка исключений;
-- добавлена поддержка шаблонов (которая, если не ошибаюсь развивалась со временем, например изначально не было возможности объявлять шаблонные методы внутри обычных классов или шаблонные методы внутри шаблонных классов);
-- создана библиотека STL (название которой изначально расшифровывалось как STepanov & Lee, а только затем как Standard Template Library), впоследствии эта библиотека стала стандартной частью C++;
-- добавлены ключевые слова volatile и mutable;
-- добавлены reinterpret_cast, const_cast, static_cast;

И самое главное, что все эти возможности и изменения плавно (к сожалению), с течением времени появлялись во всех более-менее нормальных компиляторах C++. Например, я начал использовать STL где-то в конце 1996-го года и тот STL был просто библиотекой от RogueWare, которую еще к компилятору нужно было прикручивать (в частности, к Watcom C++ 10/11 под OS/2). И помню, сколько было гоморроя по перетаскиванию кода с STL из под одного компилятора в другой. В том же VC++ более-менее нормальная поддержка STL появилась только в 6-й версии.

Так что самое хорошее за последние 10 лет, это то, на большом спектре платформ сейчас можно без проблем использовать нормальное подмножество C++. Хотя и сейчас иногда приходится для некоторых заказчиков связываться с GNU C++ версии 2.95.3.

E>>А за последние 10 лет, имхо, самым важным стало:

E>>- уменьшение количества "живых" компиляторов для самых популярных платформ;
E>>- проведенный-таки deadline по предложениям к новому стандарту языка.

VD>Ну, то есть, по-твоему, последние 10 лет было не развитие, а деградация?


Деградацией вряд ли эти 10 лет можно назвать. Здесь много о чем можно поговорить. Например, о том, что к моменту возникновения C++ в 1983-м году (когда реально действующий компилятор стал доступен для использования) был накоплен большой опыт использования языка C и Страуструпу стало понятно, что он хочет сделать в C++ чтобы облегчить написание программ по сравнению с C. Т.е. к 1983 уже был пройден этап анализа. Последующие 15 лет (до принятия стандарта) можно считать этапом синтеза, на котором C++ принял знакомый нам вид. Следующие годы стали, имхо, очередным этапом анализа. За которым, я надеюсь, будет следующий этап синтеза (в виде следующего стандарта C++ и его реализаций в выживших C++ компиляторах).

Можно еще и с другой стороны глянуть. Это были 10 лет, определивших жизнеспособность C++ в тяжелой конкуретной борьбе (взять хотя бы туже Java в конце 90-х и C# сейчас). C++ выжил. Как оказалось в случае с Java, для Java были созданы новые предметные области, но не было вытеснения C++ из уже занятых ниш.

А можно и еще с одной стороны посмотреть. Сейчас C++ уходит из тех ниш, куда его занесло по воле моды на C++ в 90-х и где вместо C++ хорошо работают managed-языки и среды. И слава богу. Очень замечательно. Чем меньше на C++ будут программировать те, кто не умеет на нем программировать, тем лучше для самого языка. Smalltalk и Lisp тому примеры. Лично я не против того, чтобы С++ стал таким маленьким специализированным корабликом, который решает специфические (не обязательно мейнстримовые) задачи. Лишь бы крыс на нем не было

VD>Представляешь какова была бы польза для общества, если все эти 20 лет мега-контроы занимались бы развитием действительно мощьного языка и вкладывали бы деньги в их компиляторы и средства разработки?


Нет, не представляю. Этого не было.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: плохой язык C++ :)
От: zzzale  
Дата: 06.03.06 09:11
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Автор (видимо в силу своей высокообразованности) плохо знает, во что выливается такая невинная строчка как



Ш>
Ш>printf("File %s has length=%d\n",file_name,length);
Ш>


Ш>или


Ш>
Ш>FILE *f=fopen("coolfile.txt");
Ш>


Касперски приводил пример, что-то вроде этого:

char str[size];
char user[size];
char pwd[size];
printf(str);


вводом %s вместо имени кода во многих случаях можно добиться имя пользователя,ну и пароль при желании.
А вообще — во что она может вылиться?
Re[3]: плохой язык C++ :)
От: zzzale  
Дата: 06.03.06 09:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Написать качественный код на С пожалуй по сложнее чем на С++. Да и на С++ можно писать как на улученом С. Так что аргумент сомнительный.


Всё же лучше на С++ писать как на С++. Просто С++ действительно предоставляет программисту много возмножностей для совершения ошибок. В этом с ним врядли какой язык сможет конкурировать.
Тот же ассемблер — сложный, требует знания множества технических подробностей, необходимо запоминать множество необязательных мелочей, уходит много времени на написание казалось бы простейших вещей, но зато всё работает строго так, как того ожидаешь.
Re[5]: плохой язык C++ :)
От: Left2 Украина  
Дата: 06.03.06 10:18
Оценка: +1
IT>Минуса это не стоит.

Ну, я думаю что если бы я высказался в духе "а вот все мои знакомые (умнейшие люди, кстати!) считают что технология SuperPuperWidgetsProXP — отстой" то был бы готов к тому чтобы отгрести кучу минусов — слишком мало конструктива в высказывании

IT>Тогда его надо было ставить автору топика. А вообще и ему не за что. Уж слишком часто стали ругать в последнее время плюсы, причём не только враги, но и доброжелатели.


А вот с автором топика я скорее согласен чем несогласен Он подымает действительно насущную проблему (которая в принципе присуща не только С++) — о том что один и тот же С++ код может нарожать абсолютно разный ассемлерный в зависимости от того что там и как перекрыто выше. Но имхо подходить к её решению надо иначе — кстати, Страуструп в "как я рожал ёжиков" эту проблему тоже подымает и предлагает это отдать на откуп инструментальным средствам. К примеру, продвинутое IDE может показать где и какие вызываются конструкторы-деструкторы у обьектов, какие операторы на самом деле перекрыты, какие операторы преобразования типов вызываются и т.д. и т.п.

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


Ну насчёт кризиса — это чистая философия что считать кризисом а что нет. Не моя специализация, спорить не стану
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 06.03.06 10:27
Оценка:
Здравствуйте, eao197, Вы писали:

E>Вообще-то с памятью у меня не важно, поэтому могу в чем-то ошибиться, но с 1992-го года, когда я начал изучать и использовать C++ изменений в самом языке было довольно много:

<...список...>

Еще про появление inline-функций забыл сказать.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: плохой язык C++ :)
От: Disappear  
Дата: 06.03.06 11:00
Оценка: 13 (3) +1
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>avva пишет


ЗХ>

ЗХ>Следующие рассуждения в принципе мне кажутся очень простыми, но ни разу их не встречал.

[..skipped..]

ЗХ>Так вот, поэтому C++ — плохой язык.

[..skipped..]

ЗХ>медленно и неумолимо превращает программиста в шизофреника.


Работаю некоторое время в проекте, реализованном на чистом C + Java UI (около 5Mb С кода + Java примерно столько же), до этого всегда практиковался на С++ (в его истинном понимании — stl, исключения, безопасный код).
Как оказалось, поддерживать этот C код настолько трудно, как будто бы мы имели дело с 50 Mb С++ кода. Всюду эти указатели на неизвестный функции, переплетенные структурки, сырые указатели, непроинециализированные данные... вообщем кошмар. Тронешь тут, посыпится там.

Наше руководство уже приняло решение выкинуть этот C код на помойку и переписать все на С++. Без вских религиозных убеждений, внутренних комплексов, задетого самолюбия и пр... просто горький опыт заставил.
Re[5]: плохой язык C++ :)
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.03.06 11:12
Оценка: 44 (5)
Здравствуйте, Left2, Вы писали:
L>Насколько я помню раскладка QWERTY появилась для того чтобы замедлить скорость набора текста — уж больно быстро стирались деревянные молоточки. Киньте камень кто скажет что такая раскладка "вымучена временем". Просто продали достаточно много машинок с такой раскладкой — и всё, назад пути нет, слишком дорого пытаться победить стандарт.
Это миф, не имеющий ничего общего с реальностью. Читать здесь.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[18]: плохой язык C++ :)
От: Кодёнок  
Дата: 06.03.06 11:22
Оценка:
Здравствуйте, igna, Вы писали:

VD>>static IEnumerable<T> Repeater<T>(IEnumerable<T> seq)

VD>>{
VD>> while (true)
VD>> foreach (T value in seq)
VD>> yield return value;
VD>>}
I><b>Там</b>
Автор: remark
Дата: 05.03.06
был зацикленный итератор.


Да. И что?
Re[6]: плохой язык C++ :)
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 06.03.06 11:53
Оценка: 4 (1)
Sinclair,

S>Здравствуйте, Left2, Вы писали:

L>>Насколько я помню раскладка QWERTY появилась для того чтобы замедлить скорость набора текста — уж больно быстро стирались деревянные молоточки. Киньте камень кто скажет что такая раскладка "вымучена временем". Просто продали достаточно много машинок с такой раскладкой — и всё, назад пути нет, слишком дорого пытаться победить стандарт.
S>Это миф, не имеющий ничего общего с реальностью. Читать здесь.

Qwerty неэффективна, отсюда и миф (не вызывающий подозрения прямо скажем).

Глянем, что выбирают профессионалы:

The key, so to speak, is in the keyboard design. Blackburn will type on nothing but the Dvorak keyboard ...


Очень легко обосновать преимущество недостатки QWERTY логически отсюда:

Problems with the Qwerty keyboard:
-- Of the nine most common letters in English (ETAOINHSR, in that order), only three are on home row (ASH), and only two, A and S, are home keys. Five (ETOIR) are on the upper row, and one (N) is on the lower row, making it especially difficult to press.
-- A disproportionate number of very common characters are found on the left side of the keyboard, giving the left hand a bigger workload. The common characters on the left (ETASRDCWGF) are 42.5% of characters in English, while those on the right (OINHLUMYP) make up only 32.6%.
-- ...


Наконец, самая крутая раскладка не Дворак, и уж тем более не Qwerty (хере)
' , . p y  f g c r l   Dvorak layout
a o e u i  d h t n s   32129548
; q j k x  b m w v z

q w e r t  y u i o p   Sholes' layout, with quote replacing /
a s d f g  h j k l ;   59514344
z x c v b  n m , . '

k , u y p  w l m f c   Best evolved layout
o a e i d  r n t h s   28281895
q . ' ; z  x v g b j
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[7]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.03.06 10:30
Оценка:
Здравствуйте, eao197, Вы писали:

E>-- отказались от ключевого слова override для перегрузки (имхо, оно еще описывалось в первом издании "Языка программирования C++");


Ошибся. Было ключевое слово overload, от него отказались, но в первом издании своей книги Страуструп его использовал.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[5]: плохой язык C++ :)
От: Zuka Россия  
Дата: 07.03.06 10:34
Оценка:
Здравствуйте, Left2, Вы писали:


L>Хм.. Сейчас на дворе 2006-й — но я не вижу реальной альтернативы — покажите мне хотя бы один язык, который доступен (не "может быть портирован" — а реально доступен, здесь и сейчас) для всех платформ — начиная от стиральных машинок и заканчивая mainframe?


А толку от того что он портирован? Программа на С для Windows не будет в общем случае работать на стиральной машинке.
Платформы разные. Так что доступность языка на любой платформе имеет очень низкую ценность. Затраты времени на изучение нового языка программирования мизерны по сравнению с затратами времени на изучение новой платформы.
Re: плохой язык C++ :)
От: Pavel Dvorkin Россия  
Дата: 07.03.06 10:55
Оценка: +1
Здравствуйте, Зверёк Харьковский, Вы писали:

>Я всего лишь объявил переменную какого-то типа, написав "Typename varname;", но эта строчка может привести к вызову неизвестного мне конструктора, а за ним — кода сколь угодно, вообще говоря, сложности.


Ну и что ? А вызов функции в С не смущает ? По большому счету это то же самое. Вызов неизвестной (может быть) мне функции, а за ней когда сколько угодно. Если по F10 его проходить. Но есть еще и F11 .

>Я всего лишь применяю известный мне оператор к переменной — а он, оказывает, overloaded у этого класса, и черт знает что на самом деле там произойдет.


Вызов функции там произойдет и что будет — см. выше. Это просто иная форма записи вызова функции (метода)

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


И что ?

>И даже и не буду начинать говорить про copy constructor и прочие подобные прелести.


А зря. ИМХО как раз copy ctor — это лучшее, что есть в С++. Потому что он (да еще operator=) ставят именно под мой контроль создание объектов.

ЗХ>Так вот, поэтому C++ — плохой язык.


ЗХ>Он настолько много прячет за кулисами, чтобы навязать программисту режим работы "моя хата с краю": пиши свой код, не волнуйся насчёт того, что магически происходит вокруг него, всё хорошо, всё идёт по плану...



Не завидую тому, кто так пишет — на любом языке.

>И в то же время того же программиста заставляет следить за всеми malloc()'ами и new, рассчитывать ужасные иерархии наследования и дикие функции-"френды", не говоря уж о темплейтах. По сути дела, медленно и неумолимо превращает программиста в шизофреника.


Ну тогда все серьезное ПО в мире сделано шизофрениками. Или , по крайней мере, большая часть серьезного ПО.

В целом — несерьезно. Наивные рассуждения человека, который с С++ реально не работал.
With best regards
Pavel Dvorkin
Re[4]: плохой язык C++ :)
От: Pavel Dvorkin Россия  
Дата: 07.03.06 10:55
Оценка: +1 :)
Здравствуйте, IT, Вы писали:

IT>Главное, что бы этот караван не превратился в караван неуловимых Джо


Не дождетесь!
With best regards
Pavel Dvorkin
Re[3]: плохой язык C++ :)
От: achp  
Дата: 07.03.06 11:06
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Если ваша программа не способна утилизировать проц более чем на 1-2%, то вам стоит задуматься о своей профпригодности.


Нужно добавить условие: "Если ваша программа не способна утилизировать проц более чем на 1-2%, но при этом сильно подкачивает..."

В моей работе это очень актуально.
Re[10]: плохой язык C++ :)
От: Sheridan Россия  
Дата: 07.03.06 11:37
Оценка:
Здравствуйте, igna, Вы писали:

VG>>Что такое предмет первой необходимости?


I>- GUI

vcl
I>- GUI
qt
I>- GUI
gtk
I>- Database access
qt
I>- XML
qt сотоварищи

[RSDN@Home][1.2.0][alpha][645]
[Hе будь у меня чувства юмора, я давно бы покончил с собой. [М. Ганди]]
Matrix has you...
Re[6]: плохой язык C++ :)
От: Left2 Украина  
Дата: 07.03.06 12:46
Оценка: +1
Z>А толку от того что он портирован? Программа на С для Windows не будет в общем случае работать на стиральной машинке.
Z>Платформы разные. Так что доступность языка на любой платформе имеет очень низкую ценность. Затраты времени на изучение нового языка программирования мизерны по сравнению с затратами времени на изучение новой платформы.

Не скажи, толк есть.

1. Есть довольно много базовых библиотек написаных на чистом C которые с минимальными усилиями прикручиваются на любую платформу — jpeglib, libzip, и т.д. Наличие таких вещей очень сильно облегчает (и удешевляет) разработку.

2. Наличие стандартизованного языка позволяет довольно большие части системы, не завязанные на платформу, тестировать и отлаживать на программерском PC. Это тоже порядком ускоряет разработку.

Ну и в целом наверное ноги у пунктов 1 и 2 растут из одного и того же места
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.03.06 12:57
Оценка:
Здравствуйте, Zuka, Вы писали:

Z>А толку от того что он портирован? Программа на С для Windows не будет в общем случае работать на стиральной машинке.


Смотря какая программа. Если программа не обращается к WinAPI, то почему бы и нет.

Z>Платформы разные. Так что доступность языка на любой платформе имеет очень низкую ценность.


Заблуждение.

Z>Затраты времени на изучение нового языка программирования мизерны


Еще одно заблуждение.

Z>по сравнению с затратами времени на изучение новой платформы.


Если платформа поддерживает стандарт POSIX, то ее изучение может существенно упроститься.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[5]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 07.03.06 13:02
Оценка: :))
Здравствуйте, Pavel Dvorkin, Вы писали:

IT>>Главное, что бы этот караван не превратился в караван неуловимых Джо


PD>Не дождетесь!


Потом не говорите, что я не предупреждал
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: плохой язык C++ :)
От: Left2 Украина  
Дата: 07.03.06 13:04
Оценка:
E>Ошибся. Было ключевое слово overload, от него отказались, но в первом издании своей книги Страуструп его использовал.

Во как!
Что-то я не помню такого в "как я рожал ёжиков"... А почему отказались — он не говорил?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 07.03.06 13:07
Оценка: :)
Здравствуйте, Sheridan, Вы писали:

VG>>>Что такое предмет первой необходимости?


I>>- GUI

S>vcl
I>>- GUI
S>qt
I>>- GUI
S>gtk
I>>- Database access
S>qt
I>>- XML
S>qt сотоварищи

Забавно, но за много лет писанины на плюсах, я ничего из этого не использовал Интересно как другие. Я, конечно, понимаю, что незнание не освобождает, но, с другой стороны, талант всегда пробьёт себе дорогу, а об этих талантах мне не часто приходилось слышать, а видеть я их вообще никогда не видел. Всё больше приходилось пользоваться более популярными, но менее стандартными и переносимыми вещами, как MFC, ADO, MSXML.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.03.06 13:11
Оценка:
Здравствуйте, Left2, Вы писали:

E>>Ошибся. Было ключевое слово overload, от него отказались, но в первом издании своей книги Страуструп его использовал.


L>Что-то я не помню такого в "как я рожал ёжиков"... А почему отказались — он не говорил?


Да потому, что и без него все замечательно работает
Его просто посчитали избыточным.

Кстати, под "как я рожал ежиков" понимается "Дизайн и эволюция языка C++", да?
Жаль, но я не смог эту книгу приобрести И в peer-to-peer сетях не нашел в электронном виде (если не считать варианта то ли на китайском, то ли на японском языке, в иероглифах).


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[12]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.03.06 13:16
Оценка:
Здравствуйте, IT, Вы писали:

IT>Забавно, но за много лет писанины на плюсах, я ничего из этого не использовал Интересно как другие. Я, конечно, понимаю, что незнание не освобождает, но, с другой стороны, талант всегда пробьёт себе дорогу, а об этих талантах мне не часто приходилось слышать, а видеть я их вообще никогда не видел. Всё больше приходилось пользоваться более популярными, но менее стандартными и переносимыми вещами, как MFC, ADO, MSXML.


У нас используется Qt. По сравнению с MFC -- небо и земля, гораздо удобнее именно для GUI (работа со всякими COM не требовалась).
Для работы с XML использовали Xerces и libxml2.
Для доступа к данным OTL.

Qt вообще хорошая штука, жалко дорогая.

А взрослых GUI библиотек (которые проверены временем и имеют репутацию) для C++ не так уж мало:
— Qt;
— wxWidgets;
— FOX Toolkit;
— FLTK.

Есть еще масса, но они поменьше масштабом, имхо.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[13]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 07.03.06 13:24
Оценка: +2
Здравствуйте, eao197, Вы писали:

E>А взрослых GUI библиотек (которые проверены временем и имеют репутацию) для C++ не так уж мало:


Мне не надо много, да ещё и совершенно разных реализаций. Мне нужна всего лишь одна, в крайнем случае её расширения.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.03.06 13:28
Оценка:
Здравствуйте, IT, Вы писали:

E>>А взрослых GUI библиотек (которые проверены временем и имеют репутацию) для C++ не так уж мало:


IT>Мне не надо много, да ещё и совершенно разных реализаций. Мне нужна всего лишь одна, в крайнем случае её расширения.


Ты сейчас в филосовском смысле? Вроде -- вот в Java есть Swing и это стандартная библиотека со всеми вытекающими...
Или же ты для реального проекта GUI-библиотеку для C++ ищещь?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[10]: плохой язык C++ :)
От: Left2 Украина  
Дата: 07.03.06 13:33
Оценка:
E>Да потому, что и без него все замечательно работает

Хм... Просто много раз нарывался на ошибку когда меняешь сигнатуру виртуальной функции в предке и забываешь изменить её в потомке. Отслеживать такие ошибки на этапе компиляции было бы очень правильным решением. Да, я понимаю что в современных компиляторах есть warning-и для такой ситуации, но даже в VC 2005 этот ворнинг по умолчанию выключен.

E>Кстати, под "как я рожал ежиков" понимается "Дизайн и эволюция языка C++", да?


Ага

E>Жаль, но я не смог эту книгу приобрести И в peer-to-peer сетях не нашел в электронном виде (если не считать варианта то ли на китайском, то ли на японском языке, в иероглифах).


Книжка действительно интересная, читал с удовольствием.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[12]: плохой язык C++ :)
От: vdimas Россия  
Дата: 07.03.06 13:39
Оценка:
Здравствуйте, eao197, Вы писали:


E>А если учесть что в двух местах используется одинаковый код, то хотелось иметь возможность написать так:

E>
E>auto predicat = bool lambda( int x ) { return ( 5 < x && x <= 10 };

E>int count = count_if( ints.begin(), ints.end(), predicat );
E>...
E>auto int_it = find_if( ints.begin(), ints.end(), predicat );
E>


а так нельзя разве?:
inline bool predicat( int x ) { return ( 5 < x && x <= 10 };

int count = count_if( ints, predicat );


либа для переопределенных for_each, count_if, find_if и т.д. видел в форумах на С++. В принципе, один раз написать эти переопределения — мелочи.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[15]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 07.03.06 13:40
Оценка: :))
Здравствуйте, eao197, Вы писали:

E>Или же ты для реального проекта GUI-библиотеку для C++ ищещь?


Спаси и сохрани!
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[11]: плохой язык C++ :)
От: dshe  
Дата: 07.03.06 13:45
Оценка: 20 (2)
Здравствуйте, Left2, Вы писали:

E>>Да потому, что и без него все замечательно работает


L>Хм... Просто много раз нарывался на ошибку когда меняешь сигнатуру виртуальной функции в предке и забываешь изменить её в потомке.


Насколько я понимаю, здесь речь шла о перегрузке, а не о переопределении.

Что касается ключевого слова overload, то по-моему оно нужно было для того, чтобы компилятор приукрасил имя функции информацией о типах параметров. А в том, случае если функция не была объявлена overload, то имя оставалось Сишным. Сейчас имена функций по умолчанию приукрашаются. Но для того, чтобы компилятор, этого не делал, достаточно объявить функцию extern "C"
--
Дмитро
Re[11]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.03.06 13:48
Оценка: 4 (1)
Здравствуйте, Left2, Вы писали:

L>Хм... Просто много раз нарывался на ошибку когда меняешь сигнатуру виртуальной функции в предке и забываешь изменить её в потомке. Отслеживать такие ошибки на этапе компиляции было бы очень правильным решением. Да, я понимаю что в современных компиляторах есть warning-и для такой ситуации, но даже в VC 2005 этот ворнинг по умолчанию выключен.


Ключевое слово overload использовалось не для переопределения виртульных методов в производных классах, а для перегрузки методов и функций. Например:
overload Complex add( Complex, Complex );
overload Matrix  add( Matrix, Matrix );
overload Vector  add( Vector, Vector );


Забавно, что я заимел первое издание "Язык программирования C++" где-то в конце 1991-го в электронном виде. Начитался, начал лабораторные на C++ делать (кажется у нас тогда был Turbo C++ 1.00). И вот дошел до задачки, где нужно было перегрузить несколько функций. Начал писать программу с overload, а она не компилируется! И про Интернет мы тогда ничего не знали. Где узнать, что за проблемы с overload?
Экспериментальным путем удалось установить, что overload писать не нужно (в примерах к Turbo C++ нашел работающую перегрузку функций без overload). И только через несколько лет узнал всю правду про overload
Забавно, что печатное издание этой книги я смог купить где-то в 1993-м, то там overload еще использовался


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[13]: плохой язык C++ :)
От: WolfHound  
Дата: 07.03.06 13:49
Оценка: +2 :)
Здравствуйте, vdimas, Вы писали:

V>а так нельзя разве?:

V>
V>inline bool predicat( int x ) { return ( 5 < x && x <= 10 };

V>int count = count_if( ints, predicat );
V>

А если так
void Foo(int min, int max)
{
    auto predicat = bool lambda( int x ) { return min < x && x <= max };
    
    int count = count_if( ints.begin(), ints.end(), predicat );
    ...
    auto int_it = find_if( ints.begin(), ints.end(), predicat );
    ...
}

Ы?
Вся суть этого примера в том что функция имеет доступ к контексту.
Без таких вещей STL так и останится жутиком которым пользоваться невозможно.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[14]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.03.06 13:57
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>
WH>void Foo(int min, int max)
WH>{
WH>    auto predicat = bool lambda( int x ) { return min < x && x <= max };
    
WH>    int count = count_if( ints.begin(), ints.end(), predicat );
WH>    ...
WH>    auto int_it = find_if( ints.begin(), ints.end(), predicat );
WH>    ...
WH>}
WH>


+1

Причем здесь даже не нужно делать настоящие closure и продлевать время жизни min и max до тех пор, пока живет predicat. Достаточно использовать обычные правила C++ -- если сделал на что-то ссылку, то сам контролируй, чтобы ссылка оставалась валидной. В C++ к этому уже привыкли и ничего нового в идеалогии C++ не добавиться.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[14]: плохой язык C++ :)
От: kan_izh Великобритания  
Дата: 07.03.06 14:10
Оценка: :))
IT wrote:

> Мне не надо много, да ещё и совершенно разных реализаций. Мне нужна

> всего лишь одна, в крайнем случае её расширения.

Да вы, батенька, коммунист. Партийный, поди?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[16]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 07.03.06 14:12
Оценка: +1
Здравствуйте, IT, Вы писали:

IT> Спаси и сохрани!




Тогда понятно. Хотелось бы иметь одну стандартную библиотеку, которая была бы всегда и везде И чтобы голова не болела.
Java вспоминается с AWT, Swing и нынешней модой на SWT (или что там в Eclipse используют).

В C++ для одного стандартного GUI поезд уже ушел, имхо. Слишком большие и автономные community у тех же Qt, wxWidgets, FOX, FLTK, Ultra++, OpenGUI и пр. Да и эти GUI для разных типов задач предназначены. Qt -- большой и тяжеловесный, для соответствующих приложений. В ту же степь и wxWidgets. А если нужна быстрая графика, для быстрого динамического отображения чего-нибудь, то здесь FLTK и OpenGUI могут быть полезными.

Кстати знаю случаи, когда для GUI-приложений вместо Java+Swing использовали C++ и Qt для получения более быстрого и компактного приложения.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[15]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 07.03.06 14:21
Оценка: :))) :))) :))
Здравствуйте, kan_izh, Вы писали:

_>Да вы, батенька, коммунист. Партийный, поди?


Дык. Член палитбюро РСДН с 2000 года. Номер партбилета — 1
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: плохой язык C++ :)
От: vdimas Россия  
Дата: 07.03.06 14:38
Оценка: :)
Здравствуйте, WolfHound, Вы писали:


WH>Вся суть этого примера в том что функция имеет доступ к контексту.


Да, в С++ очень нехватает замыканий. С другой стороны, их не вводили потому, что есть возможность вручную эмулировать их функциональными объектами:

struct predicate {
    int max;
    
    predicate(int max_) : max(max_) {}
    
    bool operator(int x) { return SomeFunc(max, x); }
}

int i = count_if(ints.begin(), ints.end(), predicate(maxArg));
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[15]: плохой язык C++ :)
От: WolfHound  
Дата: 07.03.06 15:07
Оценка: +2
Здравствуйте, vdimas, Вы писали:

V>Да, в С++ очень нехватает замыканий. С другой стороны, их не вводили потому, что есть возможность вручную эмулировать их функциональными объектами:

Не ну ты сравни колличество и понятность кода...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: плохой язык C++ :)
От: igna Россия  
Дата: 07.03.06 15:14
Оценка:
Здравствуйте, eao197, Вы писали:

E>В C++ для одного стандартного GUI поезд уже ушел, имхо.



Но не помешало бы вот что:

C++0x Standard Library wishlist (draft revision 6)
. . .
GUI

Requester: Bjarne Stroustrup, Michael Rasmussen, John Medema, others
Paper:

Some form of simple graphic/GUI library (possibly a simple interface to the simpler parts of larger libraries)—a recurent theme.

Re[16]: плохой язык C++ :)
От: vdimas Россия  
Дата: 07.03.06 15:28
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, vdimas, Вы писали:


V>>Да, в С++ очень нехватает замыканий. С другой стороны, их не вводили потому, что есть возможность вручную эмулировать их функциональными объектами:

WH>Не ну ты сравни колличество и понятность кода...

Да не спорю, хотя... описанный функциональный объект повторно применим, а замыкание — это "местное" решение.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[17]: плохой язык C++ :)
От: WolfHound  
Дата: 07.03.06 18:58
Оценка: +1
Здравствуйте, vdimas, Вы писали:

V>Да не спорю, хотя... описанный функциональный объект повторно применим, а замыкание — это "местное" решение.

В подавляющем большинстве случаев повторная применимость таких классов нафиг не уперлась. Вот скажи мне часто тебе нужна возможность повторного использования ветки оператора if? Или тела цикла for?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: плохой язык C++ :)
От: Шахтер Интернет  
Дата: 07.03.06 19:46
Оценка:
Здравствуйте, zzzale, Вы писали:

Z>Здравствуйте, Шахтер, Вы писали:


Ш>>Автор (видимо в силу своей высокообразованности) плохо знает, во что выливается такая невинная строчка как



Ш>>
Ш>>printf("File %s has length=%d\n",file_name,length);
Ш>>


Ш>>или


Ш>>
Ш>>FILE *f=fopen("coolfile.txt");
Ш>>


Z>Касперски приводил пример, что-то вроде этого:


Z>
Z>char str[size];
Z>char user[size];
Z>char pwd[size];
Z>printf(str);
Z>


Z>вводом %s вместо имени кода во многих случаях можно добиться имя пользователя,ну и пароль при желании.

Z>А вообще — во что она может вылиться?

Ну, вообще-то это достаточно сложно устроенные внутри функции.
Фактически, printf -- это простейший интерпретатор строки формата.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[18]: плохой язык C++ :)
От: vdimas Россия  
Дата: 07.03.06 20:23
Оценка:
Здравствуйте, WolfHound, Вы писали:


V>>Да не спорю, хотя... описанный функциональный объект повторно применим, а замыкание — это "местное" решение.

WH>В подавляющем большинстве случаев повторная применимость таких классов нафиг не уперлась. Вот скажи мне часто тебе нужна возможность повторного использования ветки оператора if? Или тела цикла for?

Функциональщики считают, что да. посмотри на программы на Схеме, например. Там программы — это макраме из массы очень коротких, по сравнению с "обычными", процедур.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: плохой язык C++ :)
От: serge_levin Россия  
Дата: 07.03.06 20:47
Оценка:
Здравствуйте, AVC, Вы писали:

AVC>Здравствуйте, IT, Вы писали:


IT>>Со всех сторон бедные плюсы подпёрли. Сишники-пуританцы снизу, дотнетчики сверху


AVC>Сверху, снизу...

AVC>Дождемся, кто пристроится сзади...

Оберонщики
Re[14]: плохой язык C++ :)
От: alexeiz  
Дата: 08.03.06 01:57
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А если так

WH>
WH>void Foo(int min, int max)
WH>{
WH>    auto predicat = bool lambda( int x ) { return min < x && x <= max };
    
WH>    int count = count_if( ints.begin(), ints.end(), predicat );
WH>    ...
WH>    auto int_it = find_if( ints.begin(), ints.end(), predicat );
WH>    ...
WH>}
WH>

WH>Ы?
WH>Вся суть этого примера в том что функция имеет доступ к контексту.
WH>Без таких вещей STL так и останится жутиком которым пользоваться невозможно.

   using namespace boost::lambda;
   count_if(ints.begin(), ints.end(), min < _1 && _1 <= max);

Мое предсказание насчёт C++0x: лямбды не будет. Потому что написать предложение в стандарт, в котором простейшие выражения будут короче чем boost::lambda, ни у кого не выйдет. (а то предложение, которое сейчас есть — фигня полная, там даже лямбда выражений нет)
Re[10]: плохой язык C++ :)
От: alexeiz  
Дата: 08.03.06 02:22
Оценка:
Здравствуйте, eao197, Вы писали:

E>Хотя грусно это все, на самом деле. Здесь рядом
Автор: Cyberax
Дата: 02.03.06
Cyberax коротенький тестик привел для замера скорости работы FS, так к этому тесту нужно буст тащить, да еще версию из CVS.


А в чём проблема? CVS трудно поставить? А в большинстве Линуксов Boost вообше по умолчанию ставится.

> Уж на самом деле, на C в таких условиях писать спокойнее.


CVS поставить и сделать checkout boost'у быстрее. Даже если собрать прийдётся, всё равно быстрее. А пока оно собирается, можно чем-нибудь полезным заняться...
Re[9]: плохой язык C++ :)
От: alexeiz  
Дата: 08.03.06 03:29
Оценка: 12 (1)
Здравствуйте, Left2, Вы писали:

E>>Ошибся. Было ключевое слово overload, от него отказались, но в первом издании своей книги Страуструп его использовал.


L>Во как!

L>Что-то я не помню такого в "как я рожал ёжиков"... А почему отказались — он не говорил?

11.2.4. The overload Keyword

Originally, C++ allowed a name to be used for more than one name (that is, "to be overloaded") only after an explicit overload declaration. For example:

overload max; // ``overload'' — obsolete in 2.0
int max(int,int);
double max(double,double);

I considered it too dangerous to use the same name for two functions without explicitly declaring an intent to overload. For example:

int abs(int); // no ``overload abs''
double abs(double); // used to be an error

This fear of overloading had two sources:
[1] Concern that undetected ambiguities could occur.
[2] Concern that a program could not be properly linked unless the programmer explicitly declared which functions were supposed to be overloaded.

The former fear proved largely groundless. The few problems found in actual use are dealt with by the order-independent overloading resolution rules. The later fear proved to have a basis in a general problem with C separate compilation rules that had nothing to do with overloading.

On the other hand, the overload declarations themselves became a serious problem. One couldn't merge pieces of software using the same function name for different functions unless both pieces had declared that name overloaded. This wasn't usually the case. Typically, the name one wants to overload is the name of a C library function declared in a C header. For example:

/* Header for C standard math library, math.h: */
double sqrt(double);
/* ... */

// header for C++ complex arithmethic library, complex.h:
overload sqrt;
complex sqrt(complex);

Now we could write

#include <complex.h>
#include <math.h>

but not

#include <math.h>
#include <complex.h>

because it was an error to use overload for sqrt() on its second declaration only. There were ways of alleviating this: rearranging declarations, putting constraints on the use of header files, and sprinkling overload declarations everywhere "just in case." However, we found such tricks unmanageable in all but the simplest cases. Abolishing overload declarations and getting rid of the overload keyword worked much better.

Re[12]: плохой язык C++ :)
От: Privalov  
Дата: 08.03.06 06:28
Оценка:
Здравствуйте, eao197, Вы писали:

E>Экспериментальным путем удалось установить, что overload писать не нужно (в примерах к Turbo C++ нашел работающую перегрузку функций без overload). И только через несколько лет узнал всю правду про overload :)


Дак в то время какие-то добрые люди перевели документацию к Turbo C++ и выложили в виде текстовых файлов. У меня она до сих пор дома где-то в архивах лежит. Там и про overload было.
И, если не ошибаюсь, protected-доступ к данным тоже появился в Turbo C++, и там его увидел Страуструп.

E>Забавно, что печатное издание этой книги я смог купить где-то в 1993-м, то там overload еще использовался :)


Я тоже. К нему еще какое-то дополнение шло в виде брошюры. К сожалению, не сохранилось.
Re[17]: плохой язык C++ :)
От: vdimas Россия  
Дата: 08.03.06 07:37
Оценка:
Здравствуйте, eao197, Вы писали:


E>В C++ для одного стандартного GUI поезд уже ушел, имхо.


Мне наоборот кажется, что только вот сейчас появляется возможность сделать более-менее стандартную GUI-библиотеку. Ведь GUI оно существует не само по себе, для ее реализации требуются такие абстракции:
— файловая система
— ресурсы, графика
— блокировки OC и прочая многозадачность
— таймеры
— событийная модель

Ничего этого и близко не было в некоем "стандартном" виде до недавнего времени, и только вот сейчас boost набирает достаточно "мяса", чтобы замахнуться на "стандартный" GUI.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[18]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 08.03.06 09:05
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Ничего этого и близко не было в некоем "стандартном" виде до недавнего времени, и только вот сейчас boost набирает достаточно "мяса", чтобы замахнуться на "стандартный" GUI.


И что, boost будет создавать свой GUI с нуля?
Так же, как они делали с многопоточностью, с асинхронным вводом/выводом и пр. околосистемными вещами? Переписывая заново то, что уже было в других библиотеках, в частности в ACE.

И, например, у меня сейчас есть выбор -- либо использовать ACE (который "C с классами" и во многих случаях предоставляет только C-шные функции), зато работает практически везде, либо брать Boost. И при том, что ACE даже меньше по объему, чем тот же Boost. Не очень радостный выбор, надо сказать. Т.к. Boost набирает популярность и явно становиться мейнстримом в C++.

И что делать с наработками, использующими уже существующие библиотеки (FOX, FLTK, Qt, Ultima++)? Тянуть старые проекты на них, а новые делать на стандартном C++ GUI?

Маловероятно это все.

Кстати, подобные вопросы уже обсуждались здесь
Автор: Dj.ValDen
Дата: 18.02.05
.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[19]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 08.03.06 09:25
Оценка:
eao197 wrote:
> И что, boost будет создавать свой GUI с нуля?
> Так же, как они делали с многопоточностью, с асинхронным вводом/выводом
> и пр. околосистемными вещами? Переписывая заново то, что уже было в
> других библиотеках, в частности в ACE.
Хотя получилось совсем неплохо — тот же asio использовать намного
приятнее, чем ACE (и еще в asio есть фичи типа возможности
неиспользования динамической памяти).

> И, например, у меня сейчас есть выбор -- либо использовать ACE (который

> "C с классами" и во многих случаях предоставляет только C-шные функции),
> зато работает практически везде, либо брать Boost. И при том, что ACE
> даже меньше по объему, чем тот же Boost.
Тот же asio — совсем немного занимает и размещается полностью в хидерах.
Хотя в ACE просто есть много того, что пока нет в Boost'е (например,
реализация CORBA в TAO).

> Маловероятно это все.

Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[15]: плохой язык C++ :)
От: WolfHound  
Дата: 08.03.06 11:28
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>
A>   using namespace boost::lambda;
A>   count_if(ints.begin(), ints.end(), min < _1 && _1 <= max);
A>

A>Мое предсказание насчёт C++0x: лямбды не будет. Потому что написать предложение в стандарт, в котором простейшие выражения будут короче чем boost::lambda, ни у кого не выйдет. (а то предложение, которое сейчас есть — фигня полная, там даже лямбда выражений нет)
Не имешите мои тапочки. Я про boost::lambda прекрасно знаю. Фуфло это. Позволяет описывать только простейшие выражения. А как нужно что-то по сложнее то все. Приехали... столько кода писать приходится что проще в место алгоритма for написать.
struct Point
{
    int x;
    int y;
};
struct Rect
{
    Point p1;
    Point p2;
};
...
count_if(rects.begin(), rects.end(), bool(auto& rect){return min < rect.p1.x && rect.p2.y <= max});

Нука изобрази на boost::lambda... А если понадобится болие сложная логико то... А сколько времени оно компилится...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: плохой язык C++ :)
От: GlebZ Россия  
Дата: 08.03.06 18:18
Оценка: +1 :))) :))
Здравствуйте, eao197, Вы писали:

E>- проведенный-таки deadline по предложениям к новому стандарту языка.

Анекдот в тему:
Милицейская хроника: 10 декабря возле летнего кинотеатра были найдены двое отмороженных. По словам потерпевших, они ожидали начало сеанса фильма "Закрыт на зиму".
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[11]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.03.06 20:08
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>А в чём проблема? CVS трудно поставить?


CVS через прокси и фаерволы без специальной настройки не ходит.
... << RSDN@Home 1.2.0 alpha rev. 644 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[12]: плохой язык C++ :)
От: alexeiz  
Дата: 08.03.06 21:19
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, alexeiz, Вы писали:


A>>А в чём проблема? CVS трудно поставить?


AVK>CVS через прокси и фаерволы без специальной настройки не ходит.


sourceforge имеет сервер с cvs на портах 80 и 443 (http/https), которые открыты на firewall'ах
Re[13]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.03.06 21:20
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>sourceforge имеет сервер с cvs на портах 80 и 443 (http/https), которые открыты на firewall'ах


Эээ, как бы тебе объяснить. Вобщем частенько ситуация такая — есть только http-прокси и настроить ее нельзя. Так вот — через нее к CVS не сходишь. А фаерволы да, таким манером обойти можно.
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[18]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.03.06 21:22
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>В подавляющем большинстве случаев повторная применимость таких классов нафиг не уперлась. Вот скажи мне часто тебе нужна возможность повторного использования ветки оператора if? Или тела цикла for?


Темболее, что если надо, то это в любом языке делается.
Вот только с замыканиями и локальными фунциями это можно делать удобнее и чаще:
SomeMethod(x : int) : bool
{
    def Greater(y) { x > y }
    def Equals(y)  { x == y }
    def GreaterOrEquals(y)  { Greater(y) || Equals(y) }
    
    if (GreaterOrEquals(10))
        ...
    else if (GreaterOrEquals(2))
        ...
    else if (Equals(1))
        ...
    ...
}
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.03.06 21:22
Оценка:
Здравствуйте, vdimas, Вы писали:

WH>>В подавляющем большинстве случаев повторная применимость таких классов нафиг не уперлась. Вот скажи мне часто тебе нужна возможность повторного использования ветки оператора if? Или тела цикла for?


V>Функциональщики считают, что да. посмотри на программы на Схеме, например. Там программы — это макраме из массы очень коротких, по сравнению с "обычными", процедур.


У функциональщиков как раз есть замыкания и "массы очень коротких" функций они объявляют по месту используя контекст методов в которые они вложены.

Так что твой аргумент скорее против С++, чем за.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.03.06 21:22
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>
A>   using namespace boost::lambda;
A>   count_if(ints.begin(), ints.end(), min < _1 && _1 <= max);
A>

A>Мое предсказание насчёт C++0x: лямбды не будет.

Почти уверен, что ты ошибашся, но если ты все же окажешся прав, то это кончиной языка.

A> Потому что написать предложение в стандарт, в котором простейшие выражения будут короче чем boost::lambda, ни у кого не выйдет.


... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.03.06 21:22
Оценка: -1
Здравствуйте, alexeiz, Вы писали:

A>I considered it too dangerous to use the same name for two functions without explicitly declaring an intent to overload. For example:...


Нда, каких только фобий небыло у народа. И ведь это не древние кода когда теории нехватало. Это ведь, блин 80-ый в худшем случае.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: плохой язык C++ :)
От: alexeiz  
Дата: 08.03.06 21:33
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, alexeiz, Вы писали:


A>>
A>>   using namespace boost::lambda;
A>>   count_if(ints.begin(), ints.end(), min < _1 && _1 <= max);
A>>

A>>Мое предсказание насчёт C++0x: лямбды не будет. Потому что написать предложение в стандарт, в котором простейшие выражения будут короче чем boost::lambda, ни у кого не выйдет. (а то предложение, которое сейчас есть — фигня полная, там даже лямбда выражений нет)
WH>Не имешите мои тапочки. Я про boost::lambda прекрасно знаю. Фуфло это.

Твой синтакс тоже фуфло. Ну что такое bool(auto& rect){return ..., что это!? Вот так должно быть:
count_if(begin(), end(), fun x => min < x.p1.x && x.p2.y <= max);


>Позволяет описывать только простейшие выражения. А как нужно что-то по сложнее то все. Приехали... столько кода писать приходится что проще в место алгоритма for написать.

WH>
WH>struct Point
WH>{
WH>    int x;
WH>    int y;
WH>};
WH>struct Rect
WH>{
WH>    Point p1;
WH>    Point p2;
WH>};
WH>...
WH>count_if(rects.begin(), rects.end(), bool(auto& rect){return min < rect.p1.x && rect.p2.y <= max});
WH>

WH>Нука изобрази на boost::lambda...

    return count_if(ints.begin(), ints.end(), min < &(&_1 ->* &Rect::p1) ->* &Point::x && max <= &(&_1 ->* &Rect::p2) ->* &Point::y);


>А если понадобится болие сложная логико то...


Я лучше функтор напишу. Но в простейших вещах трудно по краткости с boost::lambda тягаться.

>А сколько времени оно компилится...
Re[17]: плохой язык C++ :)
От: WolfHound  
Дата: 08.03.06 21:45
Оценка: +1
Здравствуйте, alexeiz, Вы писали:

A>Твой синтакс тоже фуфло. Ну что такое bool(auto& rect){return ..., что это!? Вот так должно быть:

A>
count_if(begin(), end(), fun x => min < x.p1.x && x.p2.y <= max);

А это уже не суть важно. Синтаксический оверхед O(1) . В C#3 можно и так и так. Короткий синтаксис для простых случаев, длинный если нужно что-то навороченое с циклами, временными переменными и тп...

A>
A>    return count_if(ints.begin(), ints.end(), min < &(&_1 ->* &Rect::p1) ->* &Point::x && max <= &(&_1 ->* &Rect::p2) ->* &Point::y);
A>

О! На таком примитиве гора непонятного кода... И что после этого boost::lambda рулит? А если это все еще и шаблонами посыпать..., а если нужен вложеный цикл... Короче тушите всет.

A>Я лучше функтор напишу.

А я for. Ибо с очень большой вероятностью этот функтор понадобится ровно один раз.
A>Но в простейших вещах трудно по краткости с boost::lambda тягаться.
Ну разве что в совсем простейших. Я бы даже сказал примитивных. Вот только примитивных случаев очень не много. Как правило что-то по сложнее типа того кода что выше.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[20]: плохой язык C++ :)
От: vdimas Россия  
Дата: 08.03.06 23:15
Оценка: -1 :)
Здравствуйте, VladD2, Вы писали:

V>>Функциональщики считают, что да. посмотри на программы на Схеме, например. Там программы — это макраме из массы очень коротких, по сравнению с "обычными", процедур.


VD>У функциональщиков как раз есть замыкания и "массы очень коротких" функций они объявляют по месту используя контекст методов в которые они вложены.


Чего гадать? Возьми любые исходники на Схеме чего-нить (полно в сети) да посмотри. Локальные замыкания в Паскалевском стиле не так уж часто используются. А по мне, есть в этом что-то от использования глобальных переменных. Кстати, в Паскале, глобальные переменные — это окружение замыкания процедуры program. (на слух звучит коряво, но "envirounment/окружение" — это термин такой для замыканий)

VD>Так что твой аргумент скорее против С++, чем за.


Да он и не за и не против. Я просто показал как можно на С++ эмулировать замыкания с помощью функциональных объектов. Разумеется, лучше пусть за нас эту работу делает компилятор... А повторную применимость функциональных объектов в С++ можно рассматривать как побочный полезный эффект, т.е. есть шанс, что лишные пару строк на описание функционального объекта могут "отбиться".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: плохой язык C++ :)
От: Zuka Россия  
Дата: 09.03.06 06:25
Оценка:
Здравствуйте, eao197, Вы писали:

E>Смотря какая программа. Если программа не обращается к WinAPI, то почему бы и нет.

"в общем случае" я для кого писал? В любом случае смысла в работе программы для Windows на стиральной машинке не много.

E>Заблуждение.

А объяснения? Или будем просто так друг друга дураками обзывать?

E>Если платформа поддерживает стандарт POSIX, то ее изучение может существенно упроститься.


А если нет? И намного ли? Смысл новой платвормы в том что в ней есть что-то новое, т.е. выходящее за рамки стандарта. Много стиральных машинок поддерживают POSIX?
Re[7]: плохой язык C++ :)
От: Zuka Россия  
Дата: 09.03.06 06:29
Оценка:
Здравствуйте, Left2, Вы писали:

L>Не скажи, толк есть.


L>1. Есть довольно много базовых библиотек написаных на чистом C которые с минимальными усилиями прикручиваются на любую платформу — jpeglib, libzip, и т.д. Наличие таких вещей очень сильно облегчает (и удешевляет) разработку.


L>2. Наличие стандартизованного языка позволяет довольно большие части системы, не завязанные на платформу, тестировать и отлаживать на программерском PC. Это тоже порядком ускоряет разработку.


L>Ну и в целом наверное ноги у пунктов 1 и 2 растут из одного и того же места


В целом согласен.
Но для того чтобы использовать эти библиотеки, система не обязана быть написана на C. =))
Re[21]: плохой язык C++ :)
От: igna Россия  
Дата: 09.03.06 08:09
Оценка:
Здравствуйте, vdimas, Вы писали:

V> ... Я просто показал как можно на С++ эмулировать замыкания с помощью функциональных объектов. Разумеется, лучше пусть за нас эту работу делает компилятор...


Типичная ситуация на мой взгляд. Если на C++ нельзя что-нибудь сделать при промощи специально предназначенных для этого средств языка, то это как правило все-равно можно сделать, хотя бы и с заднего входа. На каком еще языке есть аллокаторы?
Re[8]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 09.03.06 08:34
Оценка:
Здравствуйте, Zuka, Вы писали:

Z>"в общем случае" я для кого писал? В любом случае смысла в работе программы для Windows на стиральной машинке не много.


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

E>>Заблуждение.

Z>А объяснения? Или будем просто так друг друга дураками обзывать?

Первое заблуждение: "Так что доступность языка на любой платформе имеет очень низкую ценность." Если у меня на языке C написана система в N сотен тысяч строк, то отсутствие на нужной мне новой платформе языка C будет означать, что все эти N сотен тысяч строк идут в /dev/null, а всю систему для этой платформы придется переписывать заново. Причем, если существующий язык будет сильно отличаться от C (например, если потребуется использовать Java), то значит придется не просто переписывать под кальку, а перепроектировать с учетом идеологии Java.

Второе заблуждение: изучить новый язык проще, чем новую платформу. Могу ответственно заявить, что изучение C и даже Ruby (не говоря уже про C++) в достаточной степени, чтобы писать на них серьезный production код, не опасаясь случайно занесенных в программу косяков (по элементарному) -- дело не одного месяца.

E>>Если платформа поддерживает стандарт POSIX, то ее изучение может существенно упроститься.


Z>А если нет? И намного ли? Смысл новой платвормы в том что в ней есть что-то новое, т.е. выходящее за рамки стандарта. Много стиральных машинок поддерживают POSIX?


За стиральные машинки сказать не могу.
Но вот встраиваемые системы на основе Linux или других клонов Unix-а от POSIX-а не так уж далеко ушли.

И на счет смысла новой платформы. Новых программных платформ не так уж и много. Из того, что у меня на слуху -- это различные варианты Linux-а и Unix-ов (BSD, Solaris, HP-UX, AIX, Darvin), Windows и Windows CE, Symbian OS, Palm OS (состояние которой оставляет больше вопросов), HP NonStop Kernel и различные real-time OS для встраиваемых систем (которые так же во многом растут из Unix-ов), и совсем уж специфические j2me платформы для смарт-карт и прочей мелюзги . Разработка новой программной платформы -- это слишком фантастический шаг, на который мало кто отваживается. Более реальный сценарий -- это создание новой аппаратной платформы и адаптация к ней уже существующей программной среды (про портирование Linux-а или NetBSD на разные новые платформы лично я слышу чаще всего). И стандарт POSIX как раз предназначен для того, чтобы OS на разных аппаратных средствах предлагала прикладным программам и пользователям один и тот же интерфейс.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[8]: плохой язык C++ :)
От: Left2 Украина  
Дата: 09.03.06 09:18
Оценка:
Z>Но для того чтобы использовать эти библиотеки, система не обязана быть написана на C. =))

Система-то не обязана.
Но для того чтобы скомпилировать библиотеки на этой платформе компилятор С всё равно нужен. Так что как ни крути...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[14]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 09.03.06 09:22
Оценка: +1
AndrewVK wrote:
> A>sourceforge имеет сервер с cvs на портах 80 и 443 (http/https),
> которые открыты на firewall'ах
> Эээ, как бы тебе объяснить. Вобщем частенько ситуация такая — есть
> только http-прокси и настроить ее нельзя. Так вот — через нее к CVS не
> сходишь. А фаерволы да, таким манером обойти можно.
А как раз для таких людей у них есть ежедневные CVS-snapshot'ы.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[3]: плохой язык C++ :)
От: MShura  
Дата: 09.03.06 11:04
Оценка:
ANS>Хватит, он и так слишком детален. Ведь на самом деле задача одна — написать эффективную программу, то есть ту которая утилизирует все доступніе ресурсы. Например, программа под дос — может использовать только 640К (я немножко упрощаю, конечно) и один проц. А у нас есть 2 проца и один гиг. Значит это малоэффективная программа. А эффективной, в данных условиях, была бы программа, которая утилизировала оба проца, весь гиг физической памяти, и пару — виртуальной. При том, если программа утилизирует каждый проц меньше чем на 100% это минус программисту, и на этот процент и должна уменьшаться его зарплата. Если ваша программа не способна утилизировать проц более чем на 1-2%, то вам стоит задуматься о своей профпригодности.

Попробуйте проверить это утверждение на программах, не являющихся компиляторами и не считающих pi с точностью до N знака, а работают с устройствами ввода/вывода (сеть и/или диск) например на дефрагментаторах...
Re[4]: плохой язык C++ :)
От: marat321  
Дата: 09.03.06 12:12
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Ну, вообще-то это достаточно сложно устроенные внутри функции.

Ш>Фактически, printf -- это простейший интерпретатор строки формата.

gcc, например, умеет оптимизировать и разворачивать его примитивные использования:
а ля,
printf("%d",i)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[21]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.03.06 15:06
Оценка:
Здравствуйте, vdimas, Вы писали:

VD>>У функциональщиков как раз есть замыкания и "массы очень коротких" функций они объявляют по месту используя контекст методов в которые они вложены.


V>Чего гадать? Возьми любые исходники на Схеме ...


Спасибо за бесценный совет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.03.06 15:06
Оценка: -1 :))
Здравствуйте, igna, Вы писали:

I>...то это как правило все-равно можно сделать, хотя бы и с заднего входа.


Хочется немного попровить. Не "с заднего входа", а "через задний проход".
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: плохой язык C++ :)
От: igna Россия  
Дата: 09.03.06 16:24
Оценка:
Здравствуйте, VladD2, Вы писали:

VD> ... Не "с заднего входа", а "через задний проход".



Это да. Зато если в C# аллокаторы не предусмотрены, то определить их не получится ни через задний, ни через какой. Или unsafe дает какую-нибудь возможность?
Re[24]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.03.06 20:01
Оценка: -2 :))
Здравствуйте, igna, Вы писали:

I>Это да. Зато если в C# аллокаторы не предусмотрены, то определить их не получится ни через задний, ни через какой. Или unsafe дает какую-нибудь возможность?


На фиг не упали никакие "аллокаторы" в языках с ЖЦ. ЖЦ порвет все "аллокаторы" как Тузик грелку.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 04:14
Оценка: 5 (1)
igna wrote:
> Это да. Зато если в C# аллокаторы не предусмотрены, то определить их не
> получится ни через задний, ни через какой. Или unsafe дает какую-нибудь
> возможность?
В теории — дает. В unsafe можно использовать указатели на объекты вне
GC-кучи. Вот только все объекты вне GC-кучи рассматриваются как
opaque-type'ы, и работать с ними будет ооооооочень неудобно.

В C++/CLI — все нормально
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[25]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 04:14
Оценка:
VladD2 wrote:
> I>Это да. Зато если в C# аллокаторы не предусмотрены, то определить их
> не получится ни через задний, ни через какой. Или unsafe дает
> какую-нибудь возможность?
> На фиг не упали никакие "аллокаторы" в языках с ЖЦ. ЖЦ порвет все
> "аллокаторы" как Тузик грелку.
Ага, точно. "Нам думать не надо — MS уже подумала за нас! Ураа!"
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[21]: плохой язык C++ :)
От: Трурль  
Дата: 10.03.06 06:13
Оценка: +1
Здравствуйте, vdimas, Вы писали:

V>Чего гадать? Возьми любые исходники на Схеме чего-нить (полно в сети) да посмотри. Локальные замыкания в Паскалевском стиле не так уж часто используются.

Берем slib и находим там эти самые локальные замыкания сотнями. А те исходники (которых полно в сети) скорее всего написаны бывшими сишниками.
Re[25]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 07:25
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>На фиг не упали никакие "аллокаторы" в языках с ЖЦ. ЖЦ порвет все "аллокаторы" как Тузик грелку.



Аллокаторы это еще и возможность персистентно хранить контейнеры в файлах используя file mapping, что может использоваться в словарях и энциклопедиях. В таких программах данные нередко read only, сами программы однопользовательские, базы данных тут явно из пушки по тараканам.
Re[26]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 07:58
Оценка: :)
Здравствуйте, igna, Вы писали:

I>Аллокаторы это еще и возможность персистентно хранить контейнеры в файлах используя file mapping, что может использоваться в словарях и энциклопедиях. В таких программах данные нередко read only, сами программы однопользовательские, базы данных тут явно из пушки по тараканам.


а потом понадобится портировать прогу на другую платформу — и всё, понеслась...
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[27]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.03.06 08:01
Оценка:
Здравствуйте, Дарней, Вы писали:

I>>Аллокаторы это еще и возможность персистентно хранить контейнеры в файлах используя file mapping, что может использоваться в словарях и энциклопедиях. В таких программах данные нередко read only, сами программы однопользовательские, базы данных тут явно из пушки по тараканам.


Д>а потом понадобится портировать прогу на другую платформу — и всё, понеслась...


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


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[28]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 08:05
Оценка: -1
Здравствуйте, eao197, Вы писали:

E>Ты издеваешься? Перенос на платформу, которая поддерживает file mapping потребует изменения только кода аллокатора (это будут доли процента от общего объема кода). А если работа с file mapping изначально была реализована не в ручную, а с помощью кросс-платформенной библиотеки, тогда вообще нет проблем.


праавда? А то, что бинарные внутренности контейнера на другой платформе могут быть совсем другими — это ничего? И всё, прощай совместимость сериализованных файлов.
Мне как-то раз уже приходилось исправлять последствия таких художеств
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[29]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.03.06 08:12
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>праавда?


Правда

Д> А то, что бинарные внутренности контейнера на другой платформе могут быть совсем другими — это ничего? И всё, прощай совместимость сериализованных файлов.


Это уже второй вопрос

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


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[29]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 08:37
Оценка: +2 -1
Дарней wrote:
> праавда? А то, что бинарные внутренности контейнера на другой платформе
> могут быть совсем другими — это ничего? И всё, прощай совместимость
> сериализованных файлов.
При первой установке просто преобразуем из кроссплатформенной формы в
оптимизированую для текущей платформы.

> Мне как-то раз уже приходилось исправлять последствия таких художеств

И это говорит программист на .NET, который толково нигде кроме Windows и
не работает...
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[27]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 08:37
Оценка:
Здравствуйте, Дарней, Вы писали:

I>>Аллокаторы это еще и возможность персистентно хранить контейнеры в файлах используя file mapping, что может использоваться в словарях и энциклопедиях. В таких программах данные нередко read only, сами программы однопользовательские, базы данных тут явно из пушки по тараканам.


Д>а потом понадобится портировать прогу на другую платформу — и всё, понеслась...


Так и без портирования приключений с file mapping аллокатором предостаточно. Но иногда на порядок большее быстродействие того стоит.
Re[27]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 08:42
Оценка: -1
Дарней wrote:
> I>Аллокаторы это еще и возможность персистентно хранить контейнеры в
> файлах используя file mapping, что может использоваться в словарях и
> энциклопедиях. В таких программах данные нередко read only, сами
> программы однопользовательские, базы данных тут явно из пушки по тараканам.
> а потом понадобится портировать прогу на другую платформу — и всё,
> понеслась...
А если сайт на aspx понадибится портировать?
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[28]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 08:44
Оценка: 17 (2)
igna wrote:
> Так и без портирования приключений с file mapping аллокатором
> предостаточно. Но иногда на порядок большее быстродействие того стоит.
Попробуйте Boost.Shmem (его недавно приняли в официальный Boost) —
удобнее ничего не нашел.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[29]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 08:48
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>... А то, что бинарные внутренности контейнера на другой платформе могут быть совсем другими — это ничего?


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


Д>И всё, прощай совместимость сериализованных файлов.


Речь не о сериализации. Это просто уточнение (чтобы проходящие мимо чего не так не поняли).


Д>Мне как-то раз уже приходилось исправлять последствия таких художеств


"Художества" нужно применять в нужном месте в нужный час.
Re[30]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 09:14
Оценка: +1 :))
Здравствуйте, eao197, Вы писали:

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

E>Правда

Д>> А то, что бинарные внутренности контейнера на другой платформе могут быть совсем другими — это ничего? И всё, прощай совместимость сериализованных файлов.

E>Это уже второй вопрос


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

E>Ведь речь могла идти и о совместно работающих процессах на одной машине -- им ведь так же данными обмениваться нужно. Тогда вопрос о совместимости не столь актуален.


вопрос встанет тогда, когда прогу придется портировать. А для серьезного проекта такой вопрос встанет обязательно. И маленький пушистый зверек придет, как всегда, неожиданно.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[26]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 09:28
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Ага, точно. "Нам думать не надо — MS уже подумала за нас! Ураа!"


Только глупец может радоваться от того, что ему приходится думать еще о чем-то.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 09:28
Оценка: :)
Здравствуйте, igna, Вы писали:

I>Аллокаторы это еще и возможность персистентно хранить контейнеры в файлах используя file mapping, что может использоваться в словарях и энциклопедиях. В таких программах данные нередко read only, сами программы однопользовательские, базы данных тут явно из пушки по тараканам.


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

Причем для длоступа к данным применяются абстракции вроде потоков. А то как эти абстрации лезут к физическим аднным (через файл-маппинг или еще как) определяется реализациями абстракций.

Мне искренне жать тех кто этого не понимает.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 09:32
Оценка: :)
Здравствуйте, Cyberax, Вы писали:

C>При первой установке просто преобразуем из кроссплатформенной формы в

C>оптимизированую для текущей платформы.

словари тоже "оптимизировать", то бишь конвертировать будем? А может быть, и офисные документы тоже?

C>И это говорит программист на .NET, который толково нигде кроме Windows и

C>не работает...

Ну во первых — это переход на личности, в частности — дискредитация квалификация оппонента.
Во вторых — ты просто попал пальцем в небо. Если тебе так хочется об этом поговорить, то я писал как минимум для четырех разных ОСей. Ну ладно, для трех с половиной — одна из них это WinCE. Можно еще вспомнить всякую экзотику наподобие CP/M и TR-DOS, но это вряд ли кого-то сейчас интересует
В третьих, мой опыт работы с приплюснутым будет раза так в три длительнее, чем на .NET.

так что, мой друг, расскажи лучше что-нибудь по делу. Вместо того, чтобы в очередной раз устраивать сеанс пенисометрии.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[27]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 09:34
Оценка: :))
VladD2 wrote:
> Аллокаторы — это возможность угробить память и насандалить глюков. А с
> данными в файлах можно и без них работать. Причем не менее эффективно.
.NET дает возможность писать кривые и уродские приложения. Причем не
менее неэффективно, чем VB3.

> Причем для длоступа к данным применяются абстракции вроде потоков. А то

> как эти абстрации лезут к физическим аднным (через файл-маппинг или еще
> как) определяется реализациями абстракций.
А для вызова методов у String надо _обязательно_ использовать SOAP через
прокси-сервер в Африке. В конце концов, вы ведь не можете знать заранее
откуда пришла строка?
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[28]: плохой язык C++ :)
От: Left2 Украина  
Дата: 10.03.06 09:38
Оценка:
C>А если сайт на aspx понадибится портировать?

Тогда из С++-библиотеки лёгко постукивая кувалдой делается COM-обьект и юзается почти как родной
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[30]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 09:50
Оценка:
Здравствуйте, igna, Вы писали:

I>Речь не о сериализации. Это просто уточнение (чтобы проходящие мимо чего не так не поняли).


хоть как назови, суть от этого не изменится.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[31]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 09:58
Оценка:
Здравствуйте, Дарней, Вы писали:

C>>При первой установке просто преобразуем из кроссплатформенной формы в

C>>оптимизированую для текущей платформы.
Д>словари тоже "оптимизировать", то бишь конвертировать будем? А может быть, и офисные документы тоже?
Запросто — формировать кэш для быстрой работы. В .NET же используется GAC — чем я хуже?

C>>И это говорит программист на .NET, который толково нигде кроме Windows и

C>>не работает...
Д>Ну во первых — это переход на личности, в частности — дискредитация квалификация оппонента.
Я так и думал, что это предложение будет неправильно понято

Фраза "нигде кроме Windows и не работает" относится к .NET, а не к программисту.

Д>Во вторых — ты просто попал пальцем в небо. Если тебе так хочется об этом поговорить, то я писал как минимум для четырех разных ОСей. Ну ладно, для трех с половиной — одна из них это WinCE. Можно еще вспомнить всякую экзотику наподобие CP/M и TR-DOS, но это вряд ли кого-то сейчас интересует

На Линуксе Mono пока плохо пригодно для запуска программ, написанных на .NETе. Ситуация как с Kylix'ом — программы для Mono можно запускать в .NET, но обратное обычно не верно.
Sapienti sat!
Re[29]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 09:59
Оценка:
Left2 wrote:
> C>А если сайт на aspx понадибится портировать?
> Тогда из С++-библиотеки лёгко постукивая кувалдой делается COM-обьект и
> юзается почти как родной
Вы не поняли... Что будет, если я захочу сайт на aspx захостить на Линуксе?
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[31]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 10:01
Оценка: +1
Дарней wrote:
> I>Речь не о сериализации. Это просто уточнение (чтобы проходящие мимо
> чего не так не поняли).
> хоть как назови, суть от этого не изменится.
Меняется. File mapping и использование custom-allocator'ов позволяет
работать с объектами на диске так, как будто они прямо в памяти лежат.

То есть в таком коде:
struct some
{
    std::string str;
};
std::vector<some> vec_;

std::cout<<vec_.at(100).str;

обращение по индексу в векторе может вызывать _прозрачное_ чтение с
диска нужных страниц.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[32]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 10:12
Оценка: :)
Здравствуйте, Cyberax, Вы писали:

C>Запросто — формировать кэш для быстрой работы. В .NET же используется GAC — чем я хуже?


Угу. То есть бинарный формат первой платформы, для которой писали систему, становится "универсальным".
Перекодировать файл в платформо-специфичный формат (то есть сначала считать файл из "универсального" формата, потом замапить на файл и сохранить), а потом считывать в память маппингом — но зато оччень эффективно . Декодер "универсального" формата, конечно, сначала нужно написать — для каждой платформы, куда надо портировать систему.
При записи на флэшку — повторить всю последовательность в обратном порядке.
Гениально. Где ты берешь такую траву?

C>Фраза "нигде кроме Windows и не работает" относится к .NET, а не к программисту.

C>На Линуксе Mono пока плохо пригодно для запуска программ, написанных на .NETе. Ситуация как с Kylix'ом — программы для Mono можно запускать в .NET, но обратное обычно не верно.

это всё равно на порядок лучше, чем портировать среднестатистическую С++ прогу. В особенности, если до нее уже добрались шаловливые ручки кул-С++-хацкеров.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[33]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 10:19
Оценка:
Дарней wrote:
> C>Запросто — формировать кэш для быстрой работы. В .NET же используется
> GAC — чем я хуже?
> Угу. То есть бинарный формат первой платформы, для которой писали
> систему, становится "универсальным".
Переносимые документы можно хоть в XML делать — тот же Boost.S11N это
поддерживает. А вот локальные закэшированые копии можно хранить в
оптимальном формате.

Ну и документы — это нестандартный случай. А вот игра, в которой графика
уровней хранится в таком кэше — вполне себе вариант. "На халяву"
получаем от ОС крайне эффективный механизм кэширования с минимальным
оверхедом.

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

> Перекодировать файл в платформо-специфичный формат (то есть сначала

> считать файл из "универсального" формата, потом замапить на файл и
> сохранить), а потом считывать в память маппингом — но зато оччень
> эффективно . Декодер "универсального" формата, конечно, сначала нужно
> написать — для каждой платформы, куда надо портировать систему.
> При записи на флэшку — повторить всю последовательность в обратном порядке.
> Гениально. Где ты берешь такую траву?
А откуда MS берет свою траву? Из компилятора C# получается байт код для
стековой машины, который потом JITом обратно переводится в SSA-дерево,
которое потом компилируется. И зачем такой изврат?

> это всё равно на порядок лучше, чем портировать среднестатистическую С++

> прогу. В особенности, если до нее уже добрались шаловливые ручки
> кул-С++-хацкеров.
А я не пишу "среднестатистические" проги
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[33]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.03.06 10:21
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>Угу. То есть бинарный формат первой платформы, для которой писали систему, становится "универсальным".


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

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


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[32]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 10:24
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>обращение по индексу в векторе может вызывать _прозрачное_ чтение с

C>диска нужных страниц.

для этого есть специально разработанный механизм виртуальной памяти. Чем он то тебя не устраивает?
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[27]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 10:27
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Причем для длоступа к данным применяются абстракции вроде потоков.


Это как? Последовательно прочитать ассоциативный контейнер размером в 50 мегабайт?

Аллокаторы ведь подгружают в память только то, что нужно, а не все 50 MB...
Re[33]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 10:29
Оценка:
Дарней wrote:
> C>обращение по индексу в векторе может вызывать _прозрачное_ чтение с
> C>диска нужных страниц.
> для этого есть специально разработанный механизм виртуальной памяти. Чем
> он то тебя не устраивает?
Вы не поняли... Именно благодаря этому механизму это чтение и будет
происходить. То есть физические С++-ные объекты в памяти отображаются
напрямую на диск, как раз с помощью механизма VM.

Теперь покажите, пожалуйста, этот же трюк на C#.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[31]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 10:32
Оценка:
Здравствуйте, Дарней, Вы писали:

I>>Речь не о сериализации. Это просто уточнение (чтобы проходящие мимо чего не так не поняли).


Д>хоть как назови, суть от этого не изменится.



Аллокатор не читает весь контейнер из файла, он читает только то, что нужно.
Re[34]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 10:38
Оценка: -1
Здравствуйте, Cyberax, Вы писали:

C>Переносимые документы можно хоть в XML делать — тот же Boost.S11N это

C>поддерживает. А вот локальные закэшированые копии можно хранить в
C>оптимальном формате.

зачем? что это даст пользователю?

C>Ну и документы — это нестандартный случай.


речь шла именно про этот "нестандартный случай", а не про что-то иное

C>Или как вариант — я использую shared-memory для эффективного общения

C>клиента и сервера в разных процессах на одной машине. Скорость в десятки
C>раз больше, чем при работе с пайпами/сокетами, так как объекты не
C>сериализуются, а просто помещаются (или сразу же там и создаются —
C>зависит от ситуации) в разделяемую память (обычным копиктором).

Ага. Теперь ваши программы будут глючить в десять раз быстрее.

C>А откуда MS берет свою траву? Из компилятора C# получается байт код для

C>стековой машины, который потом JITом обратно переводится в SSA-дерево,
C>которое потом компилируется. И зачем такой изврат?

вероятно, слова "бинарная соместимость" и "за все надо платить" тебе ничего не говорят

C>А я не пишу "среднестатистические" проги


и что же ты пишешь, если не секрет? Ядра ОС? серверы БД? компиляторы?
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[33]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 10:39
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>для этого есть специально разработанный механизм виртуальной памяти.



Его можно использовать с Hashtable из .NET? Чтобы Hashtable оставалась в основном на диске и в память загружались только используемые ее части?
Re[32]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 10:43
Оценка:
Здравствуйте, igna, Вы писали:

I>Аллокатор не читает весь контейнер из файла, он читает только то, что нужно.


"то, что нужно" — это будет как минимум физический сектор диска, то бишь 512 байт
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[34]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 10:43
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Вы не поняли... Именно благодаря этому механизму это чтение и будет

C>происходить. То есть физические С++-ные объекты в памяти отображаются
C>напрямую на диск, как раз с помощью механизма VM.

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

C>Теперь покажите, пожалуйста, этот же трюк на C#.


я предпочитаю не пытаться забивать гвозди ноутбуком, а финансы считать на счетах с костяшками.
Каждой задаче — свой инструмент.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[28]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 10:44
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>.NET дает возможность писать кривые и уродские приложения. Причем не

C>менее неэффективно, чем VB3.

Понимаш ли в чем дело. Твое злопыхательство ни на грам не повредит .NET-у, но вот тебя подобные слова выставляют в не очень хорошем свете.

>> Причем для доступа к данным применяются абстракции вроде потоков. А то

>> как эти абстрации лезут к физическим аднным (через файл-маппинг или еще
>> как) определяется реализациями абстракций.
C>А для вызова методов у String надо _обязательно_ использовать SOAP через
C>прокси-сервер в Африке. В конце концов, вы ведь не можете знать заранее
C>откуда пришла строка?

Похоже ты перетрудился.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 10:51
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>"то, что нужно" — это будет как минимум физический сектор диска, то бишь 512 байт


Да, и что? Если в контейнере десятки мегабайт данных...
Re[34]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 10:52
Оценка: :)
Здравствуйте, igna, Вы писали:

I>Его можно использовать с Hashtable из .NET? Чтобы Hashtable оставалась в основном на диске и в память загружались только используемые ее части?


ты удивишься — поведение по умолчанию именно таково. Если не забывать про гранулярность, конечно.
А ты что, думаешь, что отображенный на диск std::map будет работать эффективно? Святая простота.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[33]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 10:56
Оценка:
Дарней wrote:
> I>Аллокатор не читает весь контейнер из файла, он читает только то, что
> нужно.
> "то, что нужно" — это будет как минимум физический сектор диска, то бишь
> 512 байт
Меньше прочитать аппаратно не получится.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[34]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 10:58
Оценка: +1 :))
Здравствуйте, igna, Вы писали:

I>Да, и что? Если в контейнере десятки мегабайт данных...


для таких случаев умные волосатые дядьки уже придумали базы данных
или тебе хочется во что бы то ни стало изобрести свой велосипед?
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[28]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 11:05
Оценка:
Здравствуйте, igna, Вы писали:

I>Это как? Последовательно прочитать ассоциативный контейнер размером в 50 мегабайт?


В потках есть метод Seek().
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 11:05
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>"то, что нужно" — это будет как минимум физический сектор диска, то бишь 512 байт


Кстати, забвно, но факт. Промышленные СУБД не используют виртуальную память ОС. Они предпочитают читать с диска сами учитывая размер кластера и т.п. А страницы реализуют тоже сами.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 11:05
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Вы не поняли... Что будет, если я захочу сайт на aspx захостить на Линуксе?


Будешь трахаться с Линукса и Моно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 11:05
Оценка:
Дарней wrote:
> C>Вы не поняли... Именно благодаря этому механизму это чтение и будет
> C>происходить. То есть физические С++-ные объекты в памяти отображаются
> C>напрямую на диск, как раз с помощью механизма VM.
> чтобы мендежер памяти сбросил страницу с объектом внутри на диск, вообще
> не нужен никакой трах с аллокаторами. Я тебя и действительно не понимаю
Объясняю.
1. Имеем массив int'ов. Как расположить его в shared memory/file
mapping'е понятно без вопросов.

2. Имеем массив таких объектов:
struct B
{
    int a;
    std::string b,c;
};

Как его расположить в мэпинге? Если тупо записать std::string на диск,
то будет плохо (объяснить?).

3. Делаем так:
struct B
{
    int a;
    std::basic_string<char,shmem_allocator<char> > b,c;
};

Теперь внутренний буффер std::string будет распологаться в shared
memory/file mapping'е.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[35]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.03.06 11:06
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>для таких случаев умные волосатые дядьки уже придумали базы данных

Д>или тебе хочется во что бы то ни стало изобрести свой велосипед?

Насколько мне известно, умные волосатые дядьки (с ними еще и тетька была) из SleepyCat Software используют разделяемую память для организации доступа к БД из нескольких процессов. И file mapping для увеличения скорости работы с БД.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[32]: плохой язык C++ :)
От: dshe  
Дата: 10.03.06 11:09
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Дарней wrote:

>> I>Речь не о сериализации. Это просто уточнение (чтобы проходящие мимо
>> чего не так не поняли).
>> хоть как назови, суть от этого не изменится.
C>Меняется. File mapping и использование custom-allocator'ов позволяет
C>работать с объектами на диске так, как будто они прямо в памяти лежат.

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

C>обращение по индексу в векторе может вызывать _прозрачное_ чтение с

C>диска нужных страниц.

Насколько я понимаю, указатели на персистентные объекты такие же как и указатели на обычные объекты (перегруженный оператор new возвращает (void *), который должен быть валидным указателем, поскольку далее к нему применяется конструктор). Далее, страницы с диска не просто загружаются, они загружаются вместо старых страниц, т.е. на их место. Следовательно, физические адреса персистентных объектов могут иногда совпадать и даже для одного и того же объекта меняться в процессе работы программы (т.е. нужно обновлять ссылки на персистентные объекты, если их физический адрес поменялся). Кроме того, нужно как-то отслеживать можно ли выгружать определенную страницу или нет. Все это, наверное, вполне решаемые задачи, но на мой взгляд их весьма трудно решить "прозрачно".
--
Дмитро
Re[35]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 11:09
Оценка: +1
Здравствуйте, Дарней, Вы писали:

Д>чтобы мендежер памяти сбросил страницу с объектом внутри на диск, вообще не нужен никакой трах с аллокаторами.



Сценарий может быть такой:

Данные на диске. Программа стартует, данные все еще на диске. Пользователь ищет кое-что в file-mapped STL-контейнере, это кое-что (плюс кое-что еще, да, но далеко не весь контейнер) подгружается в память. 99% данных все еще на диске. Пользователь завершает программу и эти 99% так и останутся на этот раз на диске.

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


Д>Каждой задаче — свой инструмент.



Вот оно!
Re[36]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.03.06 11:10
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>3. Делаем так:

C>
C>struct B
C>{
C>    int a;
C>    std::basic_string<char,shmem_allocator<char> > b,c;
C>};
C>


А мы не поимеем трах с std::basic_string<char,shmem_allocator<char>> в программе? Он ведь не совместим с std::string.

Может лучше было бы иметь:
std::vector< B, shmem_allocator<B> > ...

и специализацию shmem_allocator для типа B, который должным образом сериализует b и c, имеющие обычный тип std::string.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[25]: плохой язык C++ :)
От: vdimas Россия  
Дата: 10.03.06 11:11
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, igna, Вы писали:


I>>Это да. Зато если в C# аллокаторы не предусмотрены, то определить их не получится ни через задний, ни через какой. Или unsafe дает какую-нибудь возможность?


VD>На фиг не упали никакие "аллокаторы" в языках с ЖЦ. ЖЦ порвет все "аллокаторы" как Тузик грелку.


Вот не надо эту мысль озвучивать без уточнений, а то черезчур неграмотно выглядит. GC "рвет" не все аллокаторы и далеко не во всех сценариях использования. Кстати, даже в С++ юзают аллокаторы, построенные по принципу GC. И некоторые так и делают, особенно в тех сценариях, где GC действительно является наиболее подходящим.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[22]: плохой язык C++ :)
От: vdimas Россия  
Дата: 10.03.06 11:11
Оценка:
Здравствуйте, Трурль, Вы писали:


V>>Чего гадать? Возьми любые исходники на Схеме чего-нить (полно в сети) да посмотри. Локальные замыкания в Паскалевском стиле не так уж часто используются.

Т>Берем slib и находим там эти самые локальные замыкания сотнями. А те исходники (которых полно в сети) скорее всего написаны бывшими сишниками.

По сравнению с десятком тысяч нелокальных их не видно и под микроскопом.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[19]: плохой язык C++ :)
От: vdimas Россия  
Дата: 10.03.06 11:11
Оценка: 27 (3) +1 -2
Здравствуйте, VladD2, Вы писали:

VD>Темболее, что если надо, то это в любом языке делается.

VD>Вот только с замыканиями и локальными фунциями это можно делать удобнее и чаще:

Можно сравнить "синтаксический оверхед" и run-time эффективность на твоем любимом C# и С++:

C#:
delegate bool Predicate(int arg);

bool SomeMethod(int x) {
    Predicate Greater = delegate(int y) { return x > y; };
    Predicate Equals = delegate(int y) { return x == y; };
    Predicate GreaterOrEquals = delegate(int y) { return Greater(y) || Equals(y); };
    
    if(GreaterOrEquals(10))
    ...
}


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

Итого — 1 лишняя строчка на объявление типа-предиката. В общем случае у нас будет одна лишняя строка на каждое замыкание, т.к. типы и кол-во аргументов в общем случае уникальны.

C++
//using namespace boost::lambda;

typedef function<bool(int)> Predicate;

bool SomeMethod(int x) {
    Predicate Greater = var(x) > _1;         // C#: delegate(int _1) { return x>_1; }
    Predicate Equals = var(x) == _1;
    Predicate GreaterOrEquals = var(x) >= _1;
    
    if(GreaterOrEquals(10))
    ...
}


Сдается мне, что моя запись немного короче

Тем более, что вместо typedef я могу по месту писать требуемый function<type1(type2, ... and so on)>, а в C# я должен явно декларировать делегат перед использованием.

Замыкание красиво и элегантно создается конструкцией var(x) (есть еще константная версия, для избежания копирования по значению больших объектов, если мы не собираемся их модифицировать). Созданное замыкание — суть функциональный объект, который затем используется в функциях высшего порядка. Примеры эти тривиальны, иначе можно было бы показать такое же элегантное порождение curring-функций через bind.

Но это все синтаксис. С точки зрения run-time, в C# динамически создаются экземпляры объектов/замыканий, так что подобный код я бы не рекомендовал применять при обработке значительных объемов данных. Оссобенно хотелось бы отметить эффективность замыкания GreaterOrEquals. Причем ситуация такова, что на данном этапе развития CLR нет никакой возможности оптимизировать это дело, ввиду самой механики эмуляции замыканий. Эти замыкания и код по их вызову "по-честному" создает компилятор. Только вот сам характер генерируемого кода таков, что платформа CLR не в состоянии предотвратить динамическое создание объектов-замыканий никакими оптимизациями, ибо классы, их реализующие, декларативно никак не связаны с целевым методом в конечном байт-коде, кроме как в момент вызова из оного. Т.е. пока что для замыканий существует слишком высокий "abstraction penalty", о котором необходимо помнить (динамическое создание объектов-замыканий!!!).

Напротив, в С++ не создаеются динамические объекты, не используется ни полиморфизм или коссвенная адресация, а значит все инлайнится в момент компиляции таким образом, что вообще никаких локальных объектов не создается (это хорошо видно в режиме релиз с галочкой "генерировать debug информацию", и в результате непосредственно генерируется в теле метода целевой код, как если бы мы написали: "if(x<y) ..."

--------
В принципе, "разглядывая" платформу .Net 2.0 хорошо видно, что подобные свойства нынешней реализации замыканий учтены разработчиками — во фреймворчной библиотеке провоцируется подача "готовых" замыканий как аргументы всяких "цикличных" процедур...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[35]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 11:14
Оценка:
Здравствуйте, Дарней, Вы писали:

I>>Его можно использовать с Hashtable из .NET? Чтобы Hashtable оставалась в основном на диске и в память загружались только используемые ее части?


Д>ты удивишься — поведение по умолчанию именно таково.



А как использовать заполненную Hashtable при повторном старте программы не записывая ее? (Она ведь уже на диске.)
Re[37]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 11:14
Оценка:
eao197 wrote:
> А мы не поимеем трах с std::basic_string<char,shmem_allocator<char>> в
> программе? Он ведь не совместим с std::string.
У меня все нормально работает. В крайнем случае, можно через c_str()
интеоперировать (а std::string — это вообще зло ).

> Может лучше было бы иметь:

> std::vector< B, shmem_allocator<B> > ...
> и специализацию shmem_allocator для типа B, который должным образом
> сериализует b и c, имеющие обычный тип std::string.
Нет смысла. Вся фича как раз в том, что мы прозрачно работаем с графом
объектов, разделяемым между процессами или винчестером.

Такая маленькая и быстрая OODB получается
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[34]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 11:17
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Меньше прочитать аппаратно не получится.


вот и я о том же
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[33]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.03.06 11:18
Оценка: 10 (1)
Здравствуйте, dshe, Вы писали:

D>Насколько я понимаю, указатели на персистентные объекты такие же как и указатели на обычные объекты (перегруженный оператор new возвращает (void *), который должен быть валидным указателем, поскольку далее к нему применяется конструктор). Далее, страницы с диска не просто загружаются, они загружаются вместо старых страниц, т.е. на их место. Следовательно, физические адреса персистентных объектов могут иногда совпадать и даже для одного и того же объекта меняться в процессе работы программы (т.е. нужно обновлять ссылки на персистентные объекты, если их физический адрес поменялся). Кроме того, нужно как-то отслеживать можно ли выгружать определенную страницу или нет. Все это, наверное, вполне решаемые задачи, но на мой взгляд их весьма трудно решить "прозрачно".


Имхо, такая штука нормально решается, если в программе работать не с голыми указателями, а с "умными", которые скрывают в себе всю работу с загрузкой/выгрузкой объектов. Подобный подход, если мне не отшибает память, использовался в ООБД Goods Константина Книжника.

В других ООБД (кажется в ObjectStore) использовался другой подход. Там были обычные голые указатели, но они были уникальными для персистентных объектов. ObjectStore работала с виртуальной памятью: когда происходило обращение к объекту, которого в памяти нет, возникало исключение, оно перехватывалось ObjectStore, в память загружалась нужная страница и указатель оказывался валидным. Соответственно, если в памяти оказывалось слишком много страниц, лишние выгружались.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[33]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 11:19
Оценка: 10 (1)
dshe wrote:
> Идея, использовать allocator'ы для прозрачного обращения в объектам на
> диске, меня тоже когда-то прельщала. Однако я столкнулся с определенными
> сложностями. Интересно было бы взглянуть на работющую реализацию этой идеи.
Вот тут для shared_memory:
http://ice.prohosting.com/newfunk/boost/libs/shmem/doc/html/index.html

Для работы с диском нужно тривиальное изменение в классе сегмента.

Скоро shmem появится в Boost'е (он официально принят, идет доработка по
результатам обсуждения) — так что стоит подождать.

> Насколько я понимаю, указатели на персистентные объекты такие же как и

> указатели на обычные объекты (перегруженный оператор new возвращает
> (void *), который должен быть валидным указателем, поскольку далее к
> нему применяется конструктор). Далее, страницы с диска не просто
> загружаются, они загружаются вместо старых страниц, т.е. на их место.
Не совсем так. Когда я создаю mapping, то могу указать с какого
виртуального адреса его делать.

> Следовательно, физические адреса персистентных объектов могут иногда

> совпадать и даже для одного и того же объекта меняться в процессе работы
> программы (т.е. нужно обновлять ссылки на персистентные объекты, если их
> физический адрес поменялся).
В Windows можно дать гарантию, что mapping будет на один и тот же
виртуальный адрес. Для общего случая — offset_pointer (умный указатель,
записывающий смещение относительно начала блока памяти).

> Кроме того, нужно как-то отслеживать можно

> ли выгружать определенную страницу или нет.
Этим занимается OS совершенно прозрачно для прикладных программ.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[35]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 11:20
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>для таких случаев умные волосатые дядьки уже придумали базы данных

Д>или тебе хочется во что бы то ни стало изобрести свой велосипед?


Тут то мы и зациклились: http://rsdn.ru/Forum/Message.aspx?mid=1772997&amp;only=1

Серьезно, разница в быстродействии на порядок это нормально для таких случаев.
Re[29]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 11:21
Оценка:
Здравствуйте, VladD2, Вы писали:

I>>Это как? Последовательно прочитать ассоциативный контейнер размером в 50 мегабайт?


VD>В потках есть метод Seek().


А контейнер ассоциативный.
Re[36]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 11:24
Оценка: :)
Здравствуйте, igna, Вы писали:

I>А как использовать заполненную Hashtable при повторном старте программы не записывая ее? (Она ведь уже на диске.)


для этого есть базы данных.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[36]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 11:24
Оценка: +1 :)
Здравствуйте, eao197, Вы писали:

E>Насколько мне известно, умные волосатые дядьки (с ними еще и тетька была) из SleepyCat Software используют разделяемую память для организации доступа к БД из нескольких процессов. И file mapping для увеличения скорости работы с БД.


они для этого используют аллокаторы и отображение стль-ных контейнеров на диск? не верю (С)
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[36]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 11:28
Оценка:
igna wrote:
> Д>для таких случаев умные волосатые дядьки уже придумали базы данных
> Д>или тебе хочется во что бы то ни стало изобрести свой велосипед?
> Тут то мы и зациклились:
> http://rsdn.ru/Forum/Message.aspx?mid=1772997&amp;only=1
Автор: igna
Дата: 10.03.06

> <http://rsdn.ru/Forum/Message.aspx?mid=1772997&amp;only=1&gt;
Автор: igna
Дата: 10.03.06

> Серьезно, разница в быстродействии на порядок это нормально для таких
> случаев.
Подтверждаю.

У меня была разница в 50 (пятьдесят!) раз при передаче сложного графа
объектов через сериализацию и Pipe/TCP и помещением этого графа в shmem.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[36]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 11:34
Оценка:
Здравствуйте, igna, Вы писали:

I>Серьезно, разница в быстродействии на порядок это нормально для таких случаев.


разница в геморрое — тоже. Если не на два порядка.
Хотя бывают конечно случаи, когда это себя оправдывает. Редко, очень редко
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re: хороший язык C++
От: KosTiger Россия  
Дата: 10.03.06 11:35
Оценка:
Статья — демагогия.

Статью писал тот, у кого не хватило ума разобраться в Си++, или просто тот, кому за неё заплатили.
Re[37]: плохой язык C++ :)
От: igna Россия  
Дата: 10.03.06 11:37
Оценка:
Здравствуйте, eao197, Вы писали:

E>А мы не поимеем трах с std::basic_string<char,shmem_allocator<char>> в программе? Он ведь не совместим с std::string.



Когда я писал свой file mapped аллокатор, написал заодно и свой string. Наверняка и в boost::ShMem проблема решена.

P.S. Думаю, это непродумано в стандарте, что std::string с разными аллокаторами нельзя присваивать друг другу.
Re[38]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 11:39
Оценка:
igna wrote:
> P.S. Думаю, это непродумано в стандарте, что std::string с разными
> аллокаторами нельзя присваивать друг другу.
Ага, и то что allocator::pointer и allocator::const_pointer должны быть
простыми указателями.

Обещают исправить в C++09
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[3]: язык C++ :)
От: KosTiger Россия  
Дата: 10.03.06 11:42
Оценка: +1 :)
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, anonymous_user, Вы писали:


_>>а с++ был создан затем, чтобы максимально удобно отразить в коде всю сложность окружающего мира


VD>С++ даже дальше пошел. Нем без проблем можно отразить всю сложность казалось бы простых вещей.


На свете много идиотов — усложнить простые вещи можно на любом языке!
Re[37]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 11:48
Оценка:
Дарней wrote:
> E>Насколько мне известно, умные волосатые дядьки (с ними еще и тетька
> была) из SleepyCat Software используют разделяемую память для
> организации доступа к БД из нескольких процессов. И file mapping для
> увеличения скорости работы с БД.
> они для этого используют аллокаторы и отображение стль-ных контейнеров
> на диск? не верю (С)
Горячие BDB-шные парни пишут на чистом С

Но отображение файлов в память они как раз именно так и используют.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[29]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 11:52
Оценка:
VladD2 wrote:
> C>.NET дает возможность писать кривые и уродские приложения. Причем не
> C>менее неэффективно, чем VB3.
> Понимаш ли в чем дело. Твое злопыхательство ни на грам не повредит
> .NET-у, но вот тебя подобные слова выставляют в не очень хорошем свете.
Если ты не заметил, то я просто утрирую твои слова

> C>А для вызова методов у String надо _обязательно_ использовать SOAP через

> C>прокси-сервер в Африке. В конце концов, вы ведь не можете знать заранее
> C>откуда пришла строка?
> Похоже ты перетрудился.
Ну так ты ведь утверждаешь, что всегда надо использовать GC.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[38]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 11:52
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Горячие BDB-шные парни пишут на чистом С


C>Но отображение файлов в память они как раз именно так и используют.


а я и не говорил, что MMF это плохо. Я говорил, что отображение приплюснутых объектов в бинарной форме в персистентное хранилище — это плохо.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[39]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 11:54
Оценка:
Дарней wrote:
> C>Горячие BDB-шные парни пишут на чистом С
> C>Но отображение файлов в память они как раз именно так и используют.
> а я и не говорил, что MMF это плохо. Я говорил, что отображение
> приплюснутых объектов в бинарной форме в персистентное хранилище — это
> плохо.
Потому как непортабельно, а ненормальнопортабельный aspx — это хорошо
Двойные стандарты, однако.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[40]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 11:59
Оценка: :)
Здравствуйте, Cyberax, Вы писали:

C>Потому как непортабельно, а ненормальнопортабельный aspx — это хорошо

C>Двойные стандарты, однако.

как раз aspx под никсами уже хостят. Не знаю правда, насколько это проблематично. В любом случае, ситуация будет улучшаться с развитием Моно. А плюсам уже ничто не поможет.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[41]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 12:01
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>как раз aspx под никсами уже хостят. Не знаю правда, насколько это проблематично.

Как в рекламе: "Сынок, это фантастика". Наблюдается стандартная ситуация — приложения для Mono работают в .NET, обратное неверно.

Д>В любом случае, ситуация будет улучшаться с развитием Моно. А плюсам уже ничто не поможет.

С++ поможет новый Стандарт и новые компиляторы.
Sapienti sat!
Re[42]: плохой язык C++ :)
От: Дарней Россия  
Дата: 10.03.06 12:05
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Как в рекламе: "Сынок, это фантастика". Наблюдается стандартная ситуация — приложения для Mono работают в .NET, обратное неверно.


обратное тогда тоже верно — только с небольшой доработкой.

C>С++ поможет новый Стандарт и новые компиляторы.


новый стандарт только всё ухудшит. Но это уже тема для отдельного флейма
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.03.06 12:13
Оценка: 34 (4)
Здравствуйте, Зверёк Харьковский

Очень точную и емкую характеристику языка C++ я нашел в owerview к языку D (перевод мой):

Индустрия программного обеспечения прошла большой путь после изобретения C. Много новых коцепций было добавлено в язык посредством C++, но обратная совместимость с C была сохранена, включая совместимость почти со всеми слабыми сторонами исходного дизайна. Было много попыток исправить эти слабые стороны, но вопрос совместимости сделал их тщетными. Между тем, и C, и C++ подвергаются постоянному дополнению новыми возможностями. Эти возможности должны очень аккуратно встраиваться в существующие конструкции для избежания переписывания старого кода. Получаемый результат очень сложен -- стандарт C почти 500 страниц, а стандарт C++ больше 750! C++ является очень сложным и дорогим в реализации языком, в результате в реализациях есть отличия, которые делают очень сложным написание полностью переносимого C++ кода.

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


Это слова Walter Bright, разработчика компилятора Digital Mars C++ и языка D.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[43]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 12:20
Оценка:
Дарней wrote:
> C>Как в рекламе: "Сынок, это фантастика". Наблюдается стандартная
> ситуация — приложения для Mono работают в .NET, обратное неверно.
> обратное тогда тоже верно — только с небольшой доработкой.
Тогда это уже не обратная, а прямая ситуация.

> C>С++ поможет новый Стандарт и новые компиляторы.

> новый стандарт только всё ухудшит. Но это уже тема для отдельного флейма
Конечно ухудшит Тот же C# будет по сравнению с ним выглядеть
маломощным карликом.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[21]: плохой язык C++ :)
От: z00n  
Дата: 10.03.06 13:01
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, VladD2, Вы писали:


V>>>Функциональщики считают, что да. посмотри на программы на Схеме, например. Там программы — это макраме из массы очень коротких, по сравнению с "обычными", процедур.


Рискну предположить, что макраме из процедур — это обычно интерфейс к ADT.

VD>>У функциональщиков как раз есть замыкания и "массы очень коротких" функций они объявляют по месту используя контекст методов в которые они вложены.


V>Чего гадать? Возьми любые исходники на Схеме чего-нить (полно в сети) да посмотри. Локальные замыкания в Паскалевском стиле не так уж часто используются. А по мне, есть в этом что-то от использования глобальных переменных. Кстати, в Паскале, глобальные переменные — это окружение замыкания процедуры program. (на слух звучит коряво, но "envirounment/окружение" — это термин такой для замыканий)


Что такое "локальные замыкания"? let — локальное замыкание? cond ? Если нет, почему?
Re[30]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 16:33
Оценка: :)
Здравствуйте, Cyberax, Вы писали:

>> C>.NET дает возможность писать кривые и уродские приложения. Причем не

>> C>менее неэффективно, чем VB3.
>> Понимаш ли в чем дело. Твое злопыхательство ни на грам не повредит
>> .NET-у, но вот тебя подобные слова выставляют в не очень хорошем свете.
C>Если ты не заметил, то я просто утрирую твои слова

И в чем же заключается утрирование?

C>Ну так ты ведь утверждаешь, что всегда надо использовать GC.


Я утверждаю, что в 99% случаев ЖЦ порвет вашу самопальщину. И делаю столь смелые утверждения потому, что сам сделал один из самых быстрых "аллкаторов
Автор(ы): Чистяков Владислав
Дата: 26.11.2002
".
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 16:33
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Вот не надо эту мысль озвучивать без уточнений, а то черезчур неграмотно выглядит. GC "рвет" не все аллокаторы и далеко не во всех сценариях использования.


Ты за свой проффесионализм бойся, а за мой не надо. Я понимаю что говорю. В большинстве случаев порвет. А тот 1-2% происходят когда оптимизацией занимаются действительно знающие люди и в довольно редких случаях. Пока хорошему ЖЦ хватает памяти он весьма эффективен.

V> Кстати, даже в С++ юзают аллокаторы, построенные по принципу GC. И некоторые так и делают, особенно в тех сценариях, где GC действительно является наиболее подходящим.


Вот и срани как нибудь эти реализации. ЖЦ под обычным С++ — это слезы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 16:33
Оценка: 44 (1) +1
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, VladD2, Вы писали:


VD>>Темболее, что если надо, то это в любом языке делается.

VD>>Вот только с замыканиями и локальными фунциями это можно делать удобнее и чаще:

V>Можно сравнить "синтаксический оверхед" и run-time эффективность на твоем любимом C# и С++:


А что же с C# то? Давай как с Nemerle-ом сравним. Хотя и тут в общем то видно, что из С++ пытаются выжать то на что он явно не рассчитан. Что за "var(x)" иди "_1"? Что это за не определенная грязь?

V>Тем более, что вместо typedef я могу по месту писать требуемый function<type1(type2, ... and so on)>, а в C# я должен явно декларировать делегат перед использованием.


В Nemerle вообще писать ничего не нужно. Да и в C# можно определить 4-5 дженерик-делегатов и забыть про их объявление навсегда.

Ты лучше вспомни, о том, что boost::lambda вынуждает:
1. Тащить за собой огромную библиотеку.
2. Резко замедляет компиляцию.
3. Применима только в примитивнихшых случаях.
4. Неполноценная реализация.

Что же ты, например, не смог воспроизвести даже примитивного кода? Почему у тебя в последней функции:
Predicate GreaterOrEquals = var(x) >= _1;

не используются две другие (Greater и Equals)? Напомню, оригинал выглядел так:
def GreaterOrEquals(y)  { Greater(y) || Equals(y) }


В общем, очередная демонстрация так называемой аргументации. Какая на фиг краткость в плюсах? Акстись! Погляди на реальный код на С++. Это же ужасно!
Тут рядом
Автор: VladD2
Дата: 06.03.06
орел даже не поверил, что понравившеся ему извращение на плюсах можно во много раз более кратко записать на шарпе.

V>Замыкание красиво и элегантно создается конструкцией var(x)


Красота не описуемая.
Да и что же ты этой красотой так же Greater и Equals не замкнул?

V> (есть еще константная версия, для избежания копирования по значению больших объектов, если мы не собираемся их модифицировать). Созданное замыкание — суть функциональный объект, который затем используется в функциях высшего порядка. Примеры эти тривиальны, иначе можно было бы показать такое же элегантное порождение curring-функций через bind.


Я плякаль. Тут уже до тебя приводили примеры этой "элегантности". Поверь от нее тошнит.

V>Но это все синтаксис. С точки зрения run-time, в C# динамически создаются экземпляры объектов/замыканий, так что подобный код я бы не рекомендовал


Твои рекомендации к щастью ничего не стоят.

V> применять при обработке значительных объемов данных.




V> Оссобенно хотелось бы отметить эффективность замыкания GreaterOrEquals. Причем ситуация такова, что на данном этапе развития CLR нет никакой возможности оптимизировать это дело, ввиду самой механики эмуляции замыканий. Эти замыкания и код по их вызову "по-честному" создает компилятор. Только вот сам характер генерируемого кода таков, что платформа CLR не в состоянии предотвратить динамическое создание объектов-замыканий никакими оптимизациями, ибо классы, их реализующие, декларативно никак не связаны с целевым методом в конечном байт-коде, кроме как в момент вызова из оного. Т.е. пока что для замыканий существует слишком высокий "abstraction penalty", о котором необходимо помнить (динамическое создание объектов-замыканий!!!).


Ты хоть знаешь сколько стоит создать один мелкий объект? Что касается невозможности оптимизаций, то это не правда. Подобные вещи потенциально полностью устраняются совершенно универсальными алгоритмами.

V>Напротив, в С++ не создаеются динамические объекты, не используется ни полиморфизм или коссвенная адресация, а значит все инлайнится в момент компиляции таким образом,


Хм. Нэемерле тоже не пользуется для таких случаев полиморфизмом. А инлайнится или нет — это уже качество оптимизатора кокретного компилятора. К языку это отношение не имеет.

Зато С++-ный код точно не полноценный. Такое замыкание ни передать никуда нельзя, ни продлить время жизни за пределы функции.


В общем, оправдания убогости стремлением к скорости явно не прокатывает. Скорости ведь хватает. Куда больше можно "выжать" используя более подходящие алгоритмы. А вот выразительности и простоты явно не хватает. Их никогда хватать не будет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 16:44
Оценка:
VladD2 wrote:
> V> Кстати, даже в С++ юзают аллокаторы, построенные по принципу GC. И
> некоторые так и делают, особенно в *тех сценариях*, где GC действительно
> является наиболее подходящим.
> Вот и срани как нибудь эти реализации. ЖЦ под обычным С++ — это слезы.
Кхм.

Boehm GC в Mono ничем почти не отличается от обычного Boehm'а,
применимого для С++. Собственно, в Mono их GC сканирует и C-шную часть кода.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[31]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 16:49
Оценка:
VladD2 wrote:
>> > C>.NET дает возможность писать кривые и уродские приложения. Причем не
>> > C>менее неэффективно, чем VB3.
>> > Понимаш ли в чем дело. Твое злопыхательство ни на грам не повредит
>> > .NET-у, но вот тебя подобные слова выставляют в не очень хорошем свете.
> C>Если ты не заметил, то я просто утрирую твои слова
> И в чем же заключается утрирование?
"Если что-то может быть использовано неправильно — то это отстой и
маздай" — почти ваши слова.

> C>Ну так ты ведь утверждаешь, что всегда надо использовать GC.

> Я утверждаю, что в 99% случаев ЖЦ порвет вашу самопальщину. И делаю
> столь смелые утверждения потому, что сам сделал один из самых быстрых
> "аллкаторов <http://rsdn.ru/article/cpp/QuickHeap.xml&gt;
Автор(ы): Чистяков Владислав
Дата: 26.11.2002
".

Но не самый быстрый. Знаю коммерческий аллокатор, работающий за O(1) для
блоков небольшого размера.

Я уж не говорю, что ваш QuickHeap совершенно непригоден для быстрый
MT-приложений (в них рулит Hoard).

Кроме того, с GC может быть _аллокация_ будет быстрее. Но вот циклы GC
съедают это преимущество.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[4]: язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 17:39
Оценка:
Здравствуйте, KosTiger, Вы писали:

KT>На свете много идиотов — усложнить простые вещи можно на любом языке!


Несомнно, но согласись, С++ будто бы создан для этой задачи!
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[32]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 17:46
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>"Если что-то может быть использовано неправильно — то это отстой и

C>маздай" — почти ваши слова.

Где я такое говорил?

C>Но не самый быстрый.


Ты провоил измерения?

C>Знаю коммерческий аллокатор, работающий за O(1) для

C>блоков небольшого размера.

QuickHeap именно O(1). Причем с очень незначительной константой.

C>Я уж не говорю, что ваш QuickHeap совершенно непригоден для быстрый

C>MT-приложений (в них рулит Hoard).

Измерял?

C>Кроме того, с GC может быть _аллокация_ будет быстрее. Но вот циклы GC

C>съедают это преимущество.

Дык я как раз сравнивал общее время работы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.03.06 17:46
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Boehm GC в Mono ничем почти не отличается от обычного Boehm'а,

C>применимого для С++. Собственно, в Mono их GC сканирует и C-шную часть кода.

Не потому ли Моно проигрывает дотнету в 2-10 раз по скорости?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 18:37
Оценка:
VladD2 wrote:
> C>Boehm GC в Mono ничем почти не отличается от обычного Boehm'а,
> C>применимого для С++. Собственно, в Mono их GC сканирует и C-шную часть
> кода.
> Не потому ли Моно проигрывает дотнету в 2-10 раз по скорости?
В частности из-за этого — специализированый точный GC обычно лучше
консервативного. Ну и JIT у них намного хуже.

PS: а кто тут утверждал, что .NET замечательно работает на куче платформ??
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[33]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 10.03.06 18:41
Оценка:
VladD2 wrote:
> C>"Если что-то может быть использовано неправильно — то это отстой и
> C>маздай" — почти ваши слова.
> Где я такое говорил?

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


> C>Но не самый быстрый.

> Ты провоил измерения?
Уже да

> C>Знаю коммерческий аллокатор, работающий за O(1) для

> C>блоков небольшого размера.
> QuickHeap именно O(1). Причем с очень незначительной константой.
У меня меньше — только простые битовые операции используются (всего с
одним ветвлением, от него тоже можно избавиться).

> C>Я уж не говорю, что ваш QuickHeap совершенно непригоден для быстрый

> C>MT-приложений (в них рулит Hoard).
> Измерял?
Вижу по коду — есть синхронизации. В Hoard'е в большинстве случаев даже
атомарные операции при распределении памяти не используются — она
берется из арены текущего потока.

Ну и сложность у Hoard'а соответствующая.

> C>Кроме того, с GC может быть _аллокация_ будет быстрее. Но вот циклы GC

> C>съедают это преимущество.
> Дык я как раз сравнивал общее время работы.
Тесты в студию. И еще надо помнить, что в С++ есть автоматические объекты.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[27]: плохой язык C++ :)
От: vdimas Россия  
Дата: 10.03.06 18:59
Оценка:
Здравствуйте, VladD2, Вы писали:

V>>Вот не надо эту мысль озвучивать без уточнений, а то черезчур неграмотно выглядит. GC "рвет" не все аллокаторы и далеко не во всех сценариях использования.


VD>Ты за свой проффесионализм бойся, а за мой не надо. Я понимаю что говорю. В большинстве случаев порвет. А тот 1-2% происходят когда оптимизацией занимаются действительно знающие люди и в довольно редких случаях. Пока хорошему ЖЦ хватает памяти он весьма эффективен.


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

Эффективность ЖЦ зависит не только от кол-ва памяти (ведь потребность в памяти — величина относительная), а так же от сценариев использования. Например, если мы в одном потоке создаем данные, а потом передаем для обработки в другие потоки, то GC здесь — идеальное решение, и он порвет все, что можно порвать. В таких случаях и в С++ будет грамотно задействовать GC. Кстати, все сишные и плюсовые реализации Лиспа и Схемы используют GC. ВСЕ БЕЗ ИСКЛЮЧЕНИЯ.

V>> Кстати, даже в С++ юзают аллокаторы, построенные по принципу GC. И некоторые так и делают, особенно в тех сценариях, где GC действительно является наиболее подходящим.


VD>Вот и срани как нибудь эти реализации. ЖЦ под обычным С++ — это слезы.


Я не понял, что именно ты имеешь в виду. В С++ работу с GC осуществляют через GC-хендлы, и значения этих GC-хендлов точно так же корректируются при уплотнении памяти. Если ты именно это имел в виду... то это не проблема.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[39]: плохой язык C++ :)
От: alexeiz  
Дата: 10.03.06 21:13
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>igna wrote:

>> P.S. Думаю, это непродумано в стандарте, что std::string с разными
>> аллокаторами нельзя присваивать друг другу.
C>Ага, и то что allocator::pointer и allocator::const_pointer должны быть
C>простыми указателями.

C>Обещают исправить в C++09


Ничего подобного. Новая модель аллокаторов не прошла. Она не дружит с временными копиями, RVO и rvalue reference.
Re[32]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.03.06 21:46
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Запросто — формировать кэш для быстрой работы. В .NET же используется GAC — чем я хуже?


Ты это, если не знаешь что такое GAC, лучше его не упоминай.
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[30]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.03.06 21:46
Оценка:
Здравствуйте, igna, Вы писали:

I>А контейнер ассоциативный.


Поинтересуйся, почему для хранения на диске используют не хеш-таблицы, а В+ деревья.
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[21]: плохой язык C++ :)
От: vdimas Россия  
Дата: 10.03.06 21:55
Оценка: 42 (3)
Здравствуйте, VladD2, Вы писали:

VD>А что же с C# то? Давай как с Nemerle-ом сравним.


Да вот фиг. Я пока могу сравнивать с тем, на чем рискну делать реальные проекты.

VD>Хотя и тут в общем то видно, что из С++ пытаются выжать то на что он явно не рассчитан. Что за "var(x)" иди "_1"? Что это за не определенная грязь?


_1, _2 и т.д. — это плейсхолдеры, их семантика примерно такова (по аналогии с C#):

delegate(Type1 _1, Type2 _2, Type3 _3) { ... }


VD>Ты лучше вспомни, о том, что boost::lambda вынуждает:

VD>1. Тащить за собой огромную библиотеку.

За собой как раз тащить не надо (т.е. за готовым продуктом ), а во время разработки я и на C# кучу либ использую и меня не напрягает это, скорее наоборот, радует, что кто-то за меня сделал приличную часть работы

VD>2. Резко замедляет компиляцию.


если включить интересующее в stdafx.h, то не так уж и резко.

VD>3. Применима только в примитивнихшых случаях.


именно! и это важное замечание... если на какой-то алгоритм потрачено прилично времени и сил, то не стоит, ИМХО, хоронить его в локальном замыкании, добавь пару строчек оформления для public или там protected-использования.

Т.е. на мой взгляд, все эти "местные" мелкие ф-ии как раз нужны или для примитивных алгоритмых местного масштаба, или для "адаптации" уже имеющихся алгоритмов к местным данным/условиям (curring), вот как раз и с первым и со вторым лямбда прекрасно справляется (связка lambda + bind).

И еще насчет примитивности. Лямбды изначально расчитаны на функциональный стиль и польностью покрывают ВСЕ перегружаемые операторы С++. Хотя, в принципе, можно писать выражения через запятую, это означает их последовательное исполнение. Так же существуют switch, while, if, и loop. Не так уж и примитивно.

VD>4. Неполноценная реализация.


Ты имеешь ввиду — не встроена в язык?
Разумется, сама эта либа потому и существует, что это не встроено в язык. Хотя, мне до сих пор не понятно, почему этого не было сделано. Вон даже в Паскале это есть.

Мне вполне понятно, почему этого не было в С (ведь замыкание требует передачу "окружения", т.е. дополнительные расходы и лишний уровень коссвенной адресации), но в С++, с его оптимизациями и инлайнингом во многих случаях эти расходы банально нивелировались бы...


VD>Что же ты, например, не смог воспроизвести даже примитивного кода? Почему у тебя в последней функции:


ф-ии высшего порядка создаются через bind, вот аналог твоего варианта:
    Predicate GreaterOrEquals = bind(Greater, _1) || bind(Equals, _1);


Забиндить можно было что угодно. Хоть ф-ию, хоть константу. Мы биндим (связываем) с аргументом ф-ии некое значение, либо ф-ию.

VD>В общем, очередная демонстрация так называемой аргументации. Какая на фиг краткость в плюсах? Акстись! Погляди на реальный код на С++. Это же ужасно!

VD>Тут рядом
Автор: VladD2
Дата: 06.03.06
орел даже не поверил, что понравившеся ему извращение на плюсах можно во много раз более кратко записать на шарпе.


Ну ладно... по этой теме мы когда-то ломали копья более обстоятельно и со знанием дела Помниться, я даже вывел идею TransformIterator, на основе которых делал все остальные эмуляции yield. Хотя, действительно очень удобно. Особенно, когда надо перебрать несколько разнородных коллекций. Например, часть закешированных объектов, а остальные достать из базы (если очередь в переборе дойдет).

Извраты типа лямбды наверняка кто-то придумает в С++, чтобы закрыть наиболее частовстречающиеся сценарии с yield.

V>>Замыкание красиво и элегантно создается конструкцией var(x)


VD>Красота не описуемая.

VD>Да и что же ты этой красотой так же Greater и Equals не замкнул?

Потому как я их забиндил, уже показал выше как.

И кстати, у меня там небольшой "синтаксический оверхед". Когда в выражении участвует placeholder, то писать var(x) вовсе не обязательно! Для плейсхолдеров операторы уже перегружены таким образом, что нужное приведение выполняется само, вот исправленные варианты:
    Predicate Greater = x > _1; 
    Predicate Equals = x == _1;


Если бы у нас замыкания были без параметров, то мне потребовалось бы хотя бы раз написать var(x) в выражении, чтобы дать возможность компилятору "поймать" нужную перезагрузку операторов для функциональных объектов библиотеки lambda, остальные замыкания выполнялись бы уже "сами" в процессе приведения типов.


V>> (есть еще константная версия, для избежания копирования по значению больших объектов, если мы не собираемся их модифицировать). Созданное замыкание — суть функциональный объект, который затем используется в функциях высшего порядка. Примеры эти тривиальны, иначе можно было бы показать такое же элегантное порождение curring-функций через bind.


VD> Я плякаль. Тут уже до тебя приводили примеры этой "элегантности". Поверь от нее тошнит.


Без ума креститься — только нагрешить. Локальные замыкания — это способ повышения выразительности и читабельности и ничего более. Если в результате у кого выразительность и читабельность понижается — то в пень такие лямбды, с глаз долой и не позоримся. У С++ есть нормальная возможность создать функциональный объект. Да, пусть мы потрам ровно 3 лишние строчки "синтаксического оверхеда" на вот это, например:
struct MyLambda {
    VeryComplexClass& param;
    MyLambda(VeryComplexClass& p) : param(p) {}
    ...
}


Зато напишем вместо "..." вполне читабельный некий код:
    bool operator()(T1 p1, T2 p2, T3 p3) { 
    /* тут нетривиальный и длинный код, работающий с очень сложным классом */ 
    }


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

V>>Но это все синтаксис. С точки зрения run-time, в C# динамически создаются экземпляры объектов/замыканий, так что подобный код я бы не рекомендовал


VD>Твои рекомендации к щастью ничего не стоят.


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

(кстати, у меня есть кое-какие работающие наметки для декларативного строго-типизированного описания лексеров и парсеров, захотелось мне взять ваш "волшебный" парсер, сижу вот кумекаю, чтобы он AST строил и моими символами-объектами оперировал, а не номерами. Вот пример описания грамматики лексического анализатора:
      static SelectRule DecDigit = "0123456789";

      [Token(typeof(int))]
      static Rule DecNumber = DecDigit + ~(DecDigit);

      [Token(typeof(double))]
      static Rule FloatNumber = ~DecDigit + '.' + DecNumber | DecNumber + '.' + ~DecDigit;


пока не придумал ничего лучше, как взять символ '~' в качестве оператора "{ expr }", т.е. повтор expr от 0 и более раз, еще вот думаю, чтобы такое задействовать в качестве оператора "[ expr ]", т.е. повтор expr 0 или 1 раз.

Символ '!' уже задействован, и означает примерно свой похожий смысл — любой терминал, кроме заданного/заданных.
)

VD>Ты хоть знаешь сколько стоит создать один мелкий объект?


Прекрасно знаю. Особенно хорошо знаю, что значит создавать их постоянно тоннами в цикле некоего частоиспользуемого алгоритма. Я даже знаю, сколько стоит СОЗДАНИЕ одного делегата (не путать со стоимостью его вызова). Потому и предостерегаю от подобных ситуаций. Разумеется, на одиночных вызовах никого не интересуют рекомендации, применимые к циклам.

VD>Что касается невозможности оптимизаций, то это не правда. Подобные вещи потенциально полностью устраняются совершенно универсальными алгоритмами.


На данном этапе развития дотнета — никак. Посмотри код MSIL, который генерится в случае этих замыканий. Там создаются вполне независимые классы, и с какой это стати JIT будет нивелировать динамическое создание объекта и делегата на метод? До такого он пока не докатился. Хотя вполне признаю, что может быть к 4-й или 5-й версии докатится. Но это будет еще очень не скоро.

V>>Напротив, в С++ не создаеются динамические объекты, не используется ни полиморфизм или коссвенная адресация, а значит все инлайнится в момент компиляции таким образом,


VD>Хм. Нэемерле тоже не пользуется для таких случаев полиморфизмом. А инлайнится или нет — это уже качество оптимизатора кокретного компилятора. К языку это отношение не имеет.


Стоп, тут ты не прав. Пока в дотнете мы жестко привязаны к делегатам, как к функциональным объектам, ты не можешь это ограничение "перешагнуть". Я уже демонстрировал технику, по которой использовал общий интерфейс, типа такого:
public interface IFunction<RetT> {
    RetT Invoke();
}

public interface IFunction<RetT, ArgT> {
    RetT Invoke(ArgT arg);
}

// и т.д.


Так вот, у нас есть возможность не только наследовать свои классы и структуры от этого интерфейса, но так же я сгенерировал делегаты до 16-ти параметров. И в чем самый непонятный мне прикол, так это в том, что я не могу такой делегат описать на C#, зато могу спокойно создать его через Emit. Да, именно, вот такой делегат:
public sealed class Function<RetT> : MulticastDelegate, IFunction<RetT> {
    public RetT Invoke();
}


И все это означает, что я теперь смогу создавать generic-методы и типы, в которые могу подавать как делегаты, так и функциональные объекты (!!!), кои могут быть структурами в т.ч., а значит полностью инлайниться JIT-ом.

Как говорится WOW!

Только тем более не понятны 2 вещи:
— почему этого нельзя добиться штатными ср-вами, а только через злостный Emit?
— почему я пишу Invoke, вместо op_invoke???


VD>Зато С++-ный код точно не полноценный. Такое замыкание ни передать никуда нельзя, ни продлить время жизни за пределы функции.


Как раз лямбду в С++ используют в основном не так, а вот так:
for_each(vec.begin(), vec.end(), _1+=10);


Т.е. передают как аргумент циклов... Или других лямбд...
Передавать можно что угодно и куда угодно. Посмотри в моем примере класс typedef Predicate. Фокус в том, что наши лямбды — они совсем не такого типа. Там происходит хитрое приведение результата к моему типу. И вот этот результат ты можешь подать хоть куда угодно. Хотя, так никто не делает, это же не C#, у нас нет никаких ограничений. Функциональный объект обычно является аргументом шаблона и принимает любой параметр, т.е. смысла в таком приведении нет.


VD>В общем, оправдания убогости стремлением к скорости явно не прокатывает. Скорости ведь хватает.


Можно без комментариев? Я вот занят экспериментами с вещами, для которых мне скорости моих 3.2GHz начинает нехватать. И я уже перешел с C# обратно на С++. (Начинал макетировать на C#).

VD>Куда больше можно "выжать" используя более подходящие алгоритмы.


Бывают такие области применений, где данных много, а алгоритмы несложные и уже "выжаты" до предела. Только данных от этого меньше не становится...

VD>А вот выразительности и простоты явно не хватает. Их никогда хватать не будет.


Это да, это есть. И всегда будет, я надеюсь... Как говориться — нет предела совершенству.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[29]: плохой язык C++ :)
От: vdimas Россия  
Дата: 10.03.06 23:25
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Не потому ли Моно проигрывает дотнету в 2-10 раз по скорости?


В основном из-за JIT-а.

Проигрыш в GC заметен только при сборе мусора, а этот проигрыш во многих сценариях не оказывает влияние. Гораздо интереснее время выделения памяти. А оно практически одинаковое.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: язык C++ :)
От: vdimas Россия  
Дата: 10.03.06 23:25
Оценка: 20 (2) +1 :))
Здравствуйте, VladD2, Вы писали:

KT>>На свете много идиотов — усложнить простые вещи можно на любом языке!


VD>Несомнно, но согласись, С++ будто бы создан для этой задачи!


Я думаю, С++ создан для того, чтобы суметь познать себя. Через создание чертикакихногузадерищенко перлов многие проходят в самом начале познания C++... Т.е. это как сходящийся процесс калибровки инструмента с локальными выбросами, где инструмент — ты сам. Всех этих собак надо съесть самому, и нигде ты их так быстро не переваришь, как на плюсах. Не зря лучшие дотнетчики — это бывшие плюсовики, а не джависты


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

----------
И просьба не путать нечитаемый макаронный код с действительно сложными наворотами.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[31]: плохой язык C++ :)
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.03.06 06:44
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

AVK>Поинтересуйся, почему для хранения на диске используют не хеш-таблицы, а В+ деревья.

Ну, иногда все-таки используют. Правда, как я понял, у них несколько больше ограничений, чем у деревьев.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[31]: плохой язык C++ :)
От: igna Россия  
Дата: 11.03.06 08:23
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Поинтересуйся, почему для хранения на диске используют не хеш-таблицы, а В+ деревья.



Hashtable был взят только для примера, и лишь потому, что в .NET FCL отсутствует что-нибудь вроде BTree или BPlusTree. Что впрочем неудивительно, возможности эффективно использовать их все равно нет.
Re[30]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.03.06 10:10
Оценка:
Здравствуйте, vdimas, Вы писали:

V>В основном из-за JIT-а.


И из-за джита тоже. Но ЖЦ влияет не меньше.

V>Проигрыш в GC заметен только при сборе мусора, а этот проигрыш во многих сценариях не оказывает влияние. Гораздо интереснее время выделения памяти. А оно практически одинаковое.


Потери есть на всех стадиях. Даже на стадии барьера записи.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 11.03.06 10:25
Оценка: :)
AndrewVK wrote:
> C>Запросто — формировать кэш для быстрой работы. В .NET же используется
> GAC — чем я хуже?
> Ты это, если не знаешь что такое GAC, лучше его не упоминай.
Глобальный кэш сборок — прекрасно знаю что это такое. У меня будет
"Глобальный Кэш Документов"
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[40]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 11.03.06 10:41
Оценка:
alexeiz wrote:
> C>Ага, и то что allocator::pointer и allocator::const_pointer должны быть
> C>простыми указателями.
> C>Обещают исправить в C++09
> Ничего подобного. Новая модель аллокаторов не прошла. Она не дружит с
> временными копиями, RVO и rvalue reference.
А можно подробнее? В последнем mailing'е ничего такого не нашел (хотя
мог и пропустить).
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[41]: плохой язык C++ :)
От: alexeiz  
Дата: 11.03.06 11:23
Оценка: 12 (1)
Здравствуйте, Cyberax, Вы писали:

C>alexeiz wrote:

>> C>Ага, и то что allocator::pointer и allocator::const_pointer должны быть
>> C>простыми указателями.
>> C>Обещают исправить в C++09
>> Ничего подобного. Новая модель аллокаторов не прошла. Она не дружит с
>> временными копиями, RVO и rvalue reference.
C>А можно подробнее? В последнем mailing'е ничего такого не нашел (хотя
C>мог и пропустить).

N1850 rejected:
http://groups.google.com/group/comp.std.c++/browse_thread/thread/4256d995bb96483b

WG21 meeting minutes of Octorber 3-8 2005:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1915.html

N1850:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1850.pdf
Re[41]: плохой язык C++ :)
От: alexeiz  
Дата: 11.03.06 11:25
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>alexeiz wrote:

>> C>Ага, и то что allocator::pointer и allocator::const_pointer должны быть
>> C>простыми указателями.
>> C>Обещают исправить в C++09
>> Ничего подобного. Новая модель аллокаторов не прошла. Она не дружит с
>> временными копиями, RVO и rvalue reference.
C>А можно подробнее? В последнем mailing'е ничего такого не нашел (хотя
C>мог и пропустить).

Ну и здесь заодно: http://alexeiz.blogspot.com/
Re[42]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 11.03.06 12:24
Оценка:
alexeiz wrote:
>> > C>Ага, и то что allocator::pointer и allocator::const_pointer должны быть
>> > C>простыми указателями.
>> > C>Обещают исправить в C++09
>> > Ничего подобного. Новая модель аллокаторов не прошла. Она не дружит с
>> > временными копиями, RVO и rvalue reference.
> C>А можно подробнее? В последнем mailing'е ничего такого не нашел (хотя
> C>мог и пропустить).
> Ну и здесь заодно: http://alexeiz.blogspot.com/
Ага, спасибо. Действительно у этой модели большие проблемы из-за попыток
совместимости со стандартными контейнерами.

Поэтому я бы согласился просто на добавление метода swap в стандартный
интерфейс аллокатора и разрешение умных указателей как
allocator::pointer, allocator::const_pointer. Ну и еще добавление
методов expand/shrink, которые будут пытаться расширить/сузить блок
памяти, без его перемещения.

Это не требует никаких особых изменений в Стандарте и семантике
стандартных контейнеров.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[6]: язык C++ :)
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 11.03.06 13:14
Оценка: 12 (1) +1
vdimas,

V>----------

V>Те, которые на некотором этапе создают крутонавороченные сложные сверх-нечитаемые перлы на самом деле имеют хоть какие-то шансы в нашей профессии. В отличие от тех, кто не то что составить, но даже и прочитать подобное не в состоянии.

V>----------

V>И просьба не путать нечитаемый макаронный код с действительно сложными наворотами.

Нисогласиин! Читать тяжелее.

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

Разница в том, что в случае макаронного кода эти связи/сущности излишни, а в случае наворотов — необходимые шаги для реализации идеи.

Особенно различие в тяжести чтения/изложения становится тем больше, чем больше концентрация смысла в программе.

Ну и на закусь примерчики, уверен ты приведёшь ещё миллион.
1. реализация библиотек Loki, STL, Boost;
2. любая программа на языках с компактным синтаксисом, скажем K или J
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re: плохой язык C++ :)
От: Disappear  
Дата: 11.03.06 22:29
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>avva пишет


ЗХ>Следующие рассуждения в принципе мне кажутся очень простыми, но ни разу их не встречал.


[..skipped..]

ЗХ>Так вот, поэтому C++ — плохой язык.


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

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

Другим потенциальным источником опасных ситуаций служат указатели из-за того, что не происходит никаких их проверок. Указатель может указывать на абсолютно любой объект в памяти, включая даже и сам машинный код программы, что может приводить к непредсказуемым эффектам. Несмотря на то, что большинство указателей, как правило, указывают на безопасные места, они легко могут быть передвинуты в уже небезопасные области памяти с помощью арифметики указателей, память, на которую они указывают, может быть освобождена и использована по-другому («висячие указатели»), они могут быть неинициализированны («дикие указатели»), или же они просто могут получить любое значение путём приведения типов или присваивания значения другого повреждённого указателя. Другие языки пытаются решить эти проблемы путём использования более ограниченных типов ссылок.

Несмотря на то, что Си непосредственно поддерживает статические массивы, он не имеет средств проверки индексов массивов (проверки границ). Например, возможна запись в шестой элемент массива из пяти элементов, что естественно приведёт к непредсказуемым результатам. Это называется переполнением буфера, и часто является источником проблем защищённости программ, написанных на Си.

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

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

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


http://ru.wikipedia.org
Re[34]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.03.06 15:53
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Глобальный кэш сборок — прекрасно знаю что это такое.


Тогда может объяснишь какое он имеет отношение к быстрой работе и конвертации форматов? Здесь ничего про это не сказано. Может ты кеш ngen имел ввиду?
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[32]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.03.06 15:53
Оценка:
Здравствуйте, igna, Вы писали:

I>Hashtable был взят только для примера, и лишь потому, что в .NET FCL отсутствует что-нибудь вроде BTree или BPlusTree.


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

I> Что впрочем неудивительно, возможности эффективно использовать их все равно нет.


При желании все можно. В том числе и MMF использовать.
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[30]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.03.06 16:34
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Гораздо интереснее время выделения памяти. А оно практически одинаковое.


Было бы странно, если бы и там была разница.
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[44]: плохой язык C++ :)
От: Дарней Россия  
Дата: 13.03.06 02:29
Оценка: :)
Здравствуйте, Cyberax, Вы писали:

C>Тогда это уже не обратная, а прямая ситуация.


хоть горшоком назови, только в печь не ставь
Если отказаться от использования некоторых частей .NET, которые пока не в полном объеме реализованы в Моно — никаких проблем с переносимостью не должно быть. Даже если эти части используются, локализовать их и заменить — вполне тривиальная задача.

>> C>С++ поможет новый Стандарт и новые компиляторы.

>> новый стандарт только всё ухудшит. Но это уже тема для отдельного флейма
C>Конечно ухудшит Тот же C# будет по сравнению с ним выглядеть
C>маломощным карликом.

Скорее, новый C++ будет выглядеть многоножкой, которая запуталась в своих многочисленных ногах. Растущих не только с нижней стороны тела, но также с боков и даже сверху — из соображений совместимости с предыдущими версиями
Не говоря уже о том, что к тому моменту, когда опубликуют наконец новый стандарт С++ (и, что более важно, соответствующие ему компиляторы ) — M$ уже выпустит C# за версией 4.0. А независимые разработчики языков для .NET тоже не дремлют.
Вот ты сам как думаешь, когда появятся полноценные рабочие компиляторы для нового стандарта?
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[31]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 06:05
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Поинтересуйся, почему для хранения на диске используют не хеш-таблицы, а В+ деревья.


Используются и хэш-таблицы. Тоже своебразные. Но есть такой тип индекса HASHED INDEX.

В приципе выгоднее если по индексу делается только скан. Но огромного выигрыша нет, так как B-деревья имеют похожую на хэш-таблицы структуру. По большому счету вычисление страницы очень похоже на расчет кластера. А разница нивилируется из-за того, что нужно обращаться к диску.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 06:05
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>В свою очередб В+ крайне редко используют для хранения данных в памяти. Это я намекаю на то, что алгоритмы работы с диском и памятью чаще различаются, чем совпадают, ввиду того что характеристики доступа и скорости чтения у них различаются катастрофически и нелинейно.


А знашь почему? В+ реализуется сложнее. А вообще-то он и в памяти выгоднее. Как минимум ее меньше тратит.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[45]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 13.03.06 06:09
Оценка: +1 -1
Дарней wrote:
> Если отказаться от использования некоторых частей .NET, которые /пока/
> не в полном объеме реализованы в Моно — никаких проблем с переносимостью
> не должно быть. Даже если эти части используются, локализовать их и
> заменить — вполне тривиальная задача.
Вот! Именно в этом сейчас обвиняют С++ — что его разные компиляторы
поддерживают в разном объеме. Оказывается в С# ситуация ну точно такая же.

> C>Конечно ухудшит Тот же C# будет по сравнению с ним выглядеть

> C>маломощным карликом.
> Скорее, новый C++ будет выглядеть многоножкой, которая запуталась в
> своих многочисленных ногах. Растущих не только с нижней стороны тела, но
> также с боков и даже сверху — из соображений совместимости с предыдущими
> версиями
Ага, и при этом может летать в космос и просачиваться в миллиметровые
отверстия

> Не говоря уже о том, что к тому моменту, когда опубликуют наконец новый

> стандарт С++ (и, что более важно, соответствующие ему компиляторы ) — M$
> уже выпустит C# за версией 4.0. А независимые разработчики языков для
> .NET тоже не дремлют.
> Вот ты сам как думаешь, когда появятся полноценные рабочие компиляторы
> для нового стандарта?
В районе 2009 года. ConceptGCC отслеживает развитие Draft Proposal, а
Herb Sutter в MS пообещал выпустить компилятор "как только, так сразу".
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[33]: плохой язык C++ :)
От: igna Россия  
Дата: 13.03.06 07:12
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, igna, Вы писали:


I>>Hashtable был взят только для примера, и лишь потому, что в .NET FCL отсутствует что-нибудь вроде BTree или BPlusTree.

I>> Что впрочем неудивительно, возможности эффективно использовать их все равно нет.

AVK>При желании все можно. В том числе и MMF использовать.



С Hashtable тоже?
Re[46]: плохой язык C++ :)
От: Дарней Россия  
Дата: 13.03.06 07:25
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Вот! Именно в этом сейчас обвиняют С++ — что его разные компиляторы

C>поддерживают в разном объеме. Оказывается в С# ситуация ну точно такая же.

нет, не в точности. Там нет различий в реализации стандарта — там есть только неполная реализация стандарта. Пока неполная, стоит еще добавить.

C>Ага, и при этом может летать в космос и просачиваться в миллиметровые

C>отверстия

Чтобы в космосе порадовать пользователей внезапной разгерметизацией, а в дырках намертво застревать, если луна находится не в нужной фазе.

C>В районе 2009 года. ConceptGCC отслеживает развитие Draft Proposal, а

C>Herb Sutter в MS пообещал выпустить компилятор "как только, так сразу".

Полной поддержкой текущего стандарта до сих пор мало кто может похвастаться, а ты ожидаешь выхода полноценных новых компиляторов через год-два после выхода нового стандарта? Оптимистично.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[47]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 13.03.06 07:38
Оценка:
Дарней wrote:
> C>Вот! Именно в этом сейчас обвиняют С++ — что его разные компиляторы
> C>поддерживают в разном объеме. Оказывается в С# ситуация ну точно такая же.
> нет, не в точности. Там нет различий в реализации стандарта — там есть
> только неполная реализация стандарта. /Пока/ неполная, стоит еще добавить.
Ну так и в Mono — неполная реализация .NET FW

> C>Ага, и при этом может летать в космос и просачиваться в миллиметровые

> C>отверстия
> Чтобы в космосе порадовать пользователей внезапной разгерметизацией, а в
> дырках намертво застревать, если луна находится не в нужной фазе.
Это только плохие программы так себя ведут

> C>В районе 2009 года. ConceptGCC отслеживает развитие Draft Proposal, а

> C>Herb Sutter в MS пообещал выпустить компилятор "как только, так сразу".
> Полной поддержкой текущего стандарта до сих пор мало кто может
> похвастаться, а ты ожидаешь выхода полноценных новых компиляторов через
> год-два после выхода нового стандарта? Оптимистично.
VS8 уже вполне близок к нормальному компилятору, так что все вполне
оптимистично. GCC еще ближе — там даже exception specification
поддерживается.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[35]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 13.03.06 07:41
Оценка: :)
AndrewVK wrote:
> C>Глобальный кэш сборок — прекрасно знаю что это такое.
> Тогда может объяснишь какое он имеет отношение к быстрой работе и
> конвертации форматов? Здесь
Ну да, можно положить Assemblt в GAC и сделать ей ngen'ом
оптимизированое изображение.

ЗЫ: Блин, договорились называется... Надо спросить не читает ли заказчик
RSDN, сегодня именно ЭТУ ФИЧУ попросили — оптимизированый кэш документов
для их быстрого открытия.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[31]: плохой язык C++ :)
От: srggal Украина  
Дата: 13.03.06 07:56
Оценка: 1 (1) +1
Здравствуйте, Дарней, Вы писали:


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


+1 см. ниже.

Д>ну конечно. Сделать то мы сделаем, а чтобы это можно было использовать в реальной работе — это уже отдельный вопрос



Д>вопрос встанет тогда, когда прогу придется портировать. А для серьезного проекта такой вопрос встанет обязательно. И маленький пушистый зверек придет, как всегда, неожиданно.


По пушистому зверьку, который прийдет из-за вопроса совместимости бинарных сереализованных данных в

серьезногый проект

следует пальнуть ASN1, а полученную пушистую шкурку сдать на мех, а бапки пропить.



ЗЫ Просто в С++ надо больше думать, некоторые от этого отвыкли, им больше нравиться не думать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[48]: плохой язык C++ :)
От: Дарней Россия  
Дата: 13.03.06 08:15
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Ну так и в Mono — неполная реализация .NET FW


ну так я про это и писал. В отличие от реализаций С++, где существует куча нестандартных расширений, а вполне валидный код компилируется далеко не всегда. Достаточно на исходники буста посмотреть — сколько раз там упоминается "обход проблем совместимости"

C>Это только плохие программы так себя ведут


а где они, хорошие? Я пока ни одной не видел, если она сложнее чем hello world

C>VS8 уже вполне близок к нормальному компилятору, так что все вполне

C>оптимистично. GCC еще ближе — там даже exception specification
C>поддерживается.

а где у них про текущий статус соответствия новому стандарту написано?
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[49]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 08:18
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>а где они, хорошие? Я пока ни одной не видел, если она сложнее чем hello world


Microsoft Windows?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[32]: плохой язык C++ :)
От: Дарней Россия  
Дата: 13.03.06 08:19
Оценка:
Здравствуйте, srggal, Вы писали:

S>По пушистому зверьку, который прийдет из-за вопроса совместимости бинарных сереализованных данных в

серьезногый проект

следует пальнуть ASN1, а полученную пушистую шкурку сдать на мех, а бапки пропить.



да, asn.1 хорошая штука. Жаль, что в наших краях он мало распространен
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[33]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 08:23
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>да, asn.1 хорошая штука. Жаль, что в наших краях он мало распространен



Есть у меня подозрение, что и в тех краях asn1 широко известен только в узких кругах.
Иначе XML для передачи данных между приложениями нервно покуривал бы себе в сторонке.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[49]: плохой язык C++ :)
От: igna Россия  
Дата: 13.03.06 08:26
Оценка: +1
Здравствуйте, Дарней, Вы писали:

Д>а где они, хорошие? Я пока ни одной не видел, если она сложнее чем hello world


.NET CLR
Re[33]: плохой язык C++ :)
От: srggal Украина  
Дата: 13.03.06 08:29
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>Здравствуйте, Cyberax, Вы писали:


C>>Запросто — формировать кэш для быстрой работы. В .NET же используется GAC — чем я хуже?


Д>Угу. То есть бинарный формат первой платформы, для которой писали систему, становится "универсальным".

Д>Перекодировать файл в платформо-специфичный формат (то есть сначала считать файл из "универсального" формата, потом замапить на файл и сохранить), а потом считывать в память маппингом — но зато оччень эффективно . Декодер "универсального" формата, конечно, сначала нужно написать — для каждой платформы, куда надо портировать систему.
Д>При записи на флэшку — повторить всю последовательность в обратном порядке.
Д>Гениально. Где ты берешь такую траву?
-1

Про универсальный формат
Автор: srggal
Дата: 13.03.06
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[50]: плохой язык C++ :)
От: Дарней Россия  
Дата: 13.03.06 08:30
Оценка:
Здравствуйте, eao197, Вы писали:

E>Microsoft Windows?


а чего в нем хорошего? Содержит кучу уязвимостей, временами ломается по неизвестным науке причинам.
максимум — на троечку с минусом.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[34]: плохой язык C++ :)
От: srggal Украина  
Дата: 13.03.06 08:35
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Дарней, Вы писали:


Д>>да, asn.1 хорошая штука. Жаль, что в наших краях он мало распространен


E>

E>Есть у меня подозрение, что и в тех краях asn1 широко известен только в узких кругах.
E>Иначе XML для передачи данных между приложениями нервно покуривал бы себе в сторонке.
-1

Не передергивайте

XML получил широкое распространение, потому, что он очень human-readable + на лету может трансформироваться (xsl[t]) + на него с минимум оговорок ложится html + легко его парсить + ограничения задаются в виже самого-же xml (xml-scheme).

НО ЗАТО у него зверский размер, и без сжатия xml нервно курит в сторонке.

ASN1 наоборот совсем не human readable ну может есть гении .

ASN1 гораздо сложней сереализовать/десеарилизовать чем xml, вот ИМХО поэтому он и не так распространён.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[35]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 08:45
Оценка: +4
Здравствуйте, srggal, Вы писали:

E>>Иначе XML для передачи данных между приложениями нервно покуривал бы себе в сторонке.

S>-1

S>Не передергивайте


Я не передергиваю, я специально сказал, что речь идет о передаче данных между приложениями. Где human-readability идет лесом, а вот вопросы размера, расширяемости и, в потенциале, верифицируемости, очень важны (например, криптографическая подпись XML -- это вообще изобретение то еще).

Что касается реализации парсинга и формирования ASN1 в BER, то это может быть даже проще, чем XML. Поскольку такие реализации работают даже на смарт-картах.
А для более сложных упаковок предназначены ASN1 компиляторы.

S>XML получил широкое распространение, потому, что он очень human-readable + на лету может трансформироваться (xsl[t]) + на него с минимум оговорок ложится html + легко его парсить + ограничения задаются в виже самого-же xml (xml-scheme).


А это уже совсем другая область.
Что же касается органичений, то в ASN1 они так же есть.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[36]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 09:20
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Ну да, можно положить Assemblt в GAC и сделать ей ngen'ом

C>оптимизированое изображение.

Афигеть. Блин, ну ты и спорщик.
Для того чтобы обработать ngen'ом сборку не нужно класть ее в GAC. Единственная связь между GAC и ngen это то что каталог ngen'а лежит рядом с каталогом GAC.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[34]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 10:11
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А знашь почему? В+ реализуется сложнее.


Сложнее чего?

VD> А вообще-то он и в памяти выгоднее. Как минимум ее меньше тратит.


Меньше чем кто?
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[34]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 10:22
Оценка:
Здравствуйте, igna, Вы писали:

I>С Hashtable тоже?


Перечитай еще раз мои сообщения вверх по ветке.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[32]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 10:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Используются и хэш-таблицы. Тоже своебразные. Но есть такой тип индекса HASHED INDEX.


Я в курсе. Но только структура его несколько отличается от структуры хеш-таблицы в памяти.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[34]: плохой язык C++ :)
От: Дарней Россия  
Дата: 13.03.06 10:33
Оценка:
Здравствуйте, eao197, Вы писали:

E>Есть у меня подозрение, что и в тех краях asn1 широко известен только в узких кругах.

E>Иначе XML для передачи данных между приложениями нервно покуривал бы себе в сторонке.

я имел в виду не географию, а области программирования
насколько я слышал, asn.1 широко применяется только в телекоммуникациях
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[34]: плохой язык C++ :)
От: Дарней Россия  
Дата: 13.03.06 10:33
Оценка:
Здравствуйте, srggal, Вы писали:

S>Про универсальный формат
Автор: srggal
Дата: 13.03.06


ты просто не понял, о чем спор. Хорошему бинарному формату никакие платформо специфичные версии вообще не нужны, за крайне редкими исключениями. Файлы словарей для энциклопедии в число таких исключений точно не входят.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[35]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 10:39
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>насколько я слышал, asn.1 широко применяется только в телекоммуникациях


+1

Я еще слышал о применении в аэрокосмической области, но тоже для передачи данных.
В частности, Unaligned PER (когда битовая упаковка разных полей идет без выравнивания на границу отдельных байтов) был добавлен в asn.1 по тебованию программистов из области авиации, т.к. Aligned PER оказывался очень расточительным.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[35]: плохой язык C++ :)
От: igna Россия  
Дата: 13.03.06 10:41
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Перечитай еще раз мои сообщения вверх по ветке.



Вот они:




AVK>Поинтересуйся, почему для хранения на диске используют не хеш-таблицы, а В+ деревья.







I>>Hashtable был взят только для примера, и лишь потому, что в .NET FCL отсутствует что-нибудь вроде BTree или BPlusTree.


AVK>В свою очередб В+ крайне редко используют для хранения данных в памяти. Это я намекаю на то, что алгоритмы работы с диском и памятью чаще различаются, чем совпадают, ввиду того что характеристики доступа и скорости чтения у них различаются катастрофически и нелинейно.


I>> Что впрочем неудивительно, возможности эффективно использовать их все равно нет.


AVK>При желании все можно. В том числе и MMF использовать.






I>>С Hashtable тоже?


AVK>Перечитай еще раз мои сообщения вверх по ветке.







Если можно, односложный ответ на вопрос: Можно ли использовать Hashtable вместе с Memory Mapped Files?

Если да, был бы рад узнать, как?
Re[36]: плохой язык C++ :)
От: srggal Украина  
Дата: 13.03.06 10:42
Оценка:
Здравствуйте, eao197, Вы писали:

E>Я еще слышал о применении в аэрокосмической области, но тоже для передачи данных.

E>В частности, Unaligned PER (когда битовая упаковка разных полей идет без выравнивания на границу отдельных байтов) был добавлен в asn.1 по тебованию программистов из области авиации, т.к. Aligned PER оказывался очень расточительным.

Правильно ли я понимаю, что нет никаких ограничений на применение ASN1

Хочется бенефитов от применения ASN1 — применяй, не хочется — не применяй
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[36]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 10:52
Оценка: 5 (1)
Здравствуйте, igna, Вы писали:

I>Если можно, односложный ответ на вопрос: Можно ли использовать Hashtable вместе с Memory Mapped Files?


Существующую напрямую нет (но это и не нужно, почему я уже объяснил), специализированную можно.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[37]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 11:08
Оценка: 8 (1)
Здравствуйте, srggal, Вы писали:

S>Правильно ли я понимаю, что нет никаких ограничений на применение ASN1


Разве это следовало из моих слов?
Asn.1 -- это очень большая спецификация, которая включает в семя много чего. Начиная от самого Abstract Syntax Notation, заканчивая различными схемами кодирования (BER, PER, XER) и различными вариациями.

Так что минимальная цена, которую придется заплатить за использование Asn.1 -- это ознакомление с ней
Хотя бы по книге Лампорта (что само по себе не мало).

S>Хочется бенефитов от применения ASN1 — применяй, не хочется — не применяй


Так в том и суть, что если хочется (а бенефиты действительно есть), то основной выбор нужно сделать в сторону собственноручной реализации кодирования или приобретения Asn.1 компилятора (~$5000, если не ошибаюсь, за продвинутую реализацию). Если протокол простой и достаточно BER-кодирования, то библиотеку для поддержки BER написать не сложно. В остальных случаях Asn.1 компилятор обойдется дороже.

Да и разных реализаций Asn.1 для BER-кодирования не так уж и мало. Т.к. x.509 сертификаты кодируются в Asn.1, то многие криптографические библиотеки содержат средства для ручной работы с Asn.1. Хотя реально живого OpenSource Asn.1 компилятора, имхо, нет.

Поэтому, имхо, Asn.1 для небольших проектов выглядит слишком дорогим решением: и знания нужны, и компилятор не дешев. Но может быть, ситуация изменилась бы, знай об Asn.1 больше народу. Но вот для больших проектов... Но поезд Asn.1 в этой области, имхо, уже давно ушел. И одна из причин в том, что Asn.1 (насколько мне известно) не стандартизирует отображение Asn.1 спецификаций на конкретный язык программирования. Поэтому, покупая Asn.1 компилятор, клиент привязывается к этому компилятору на всю жизнь, т.к. в другом компиляторе используется другой binding.

PS. Свою сериализацию я начал делать не зная про Asn.1 Если бы знал, то, возможно, использовал бы опыт из Asn.1 гораздо больше. А так, только понятие расширяемых типов из Asn.1 позаимствовал.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[38]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 11:23
Оценка:
Здравствуйте, eao197, Вы писали:

E>Так в том и суть, что если хочется (а бенефиты действительно есть), то основной выбор нужно сделать в сторону собственноручной реализации кодирования или приобретения Asn.1 компилятора (~$5000, если не ошибаюсь, за продвинутую реализацию).


Можно вопрос? А что делает ASN.1 компилятор? Генерит код сериализатора? Или что то более специфичное?
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[39]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 11:35
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Можно вопрос? А что делает ASN.1 компилятор? Генерит код сериализатора?


Собственно, чам ASN.1 компилятор только это и должен делать. Плюс еще код десериализатора.

AVK>Или что то более специфичное?


А специфичное обычно делают дополнительные инструменты, которые могут входить в состав компилятора или продаваться отдельно.
См. например: http://www.oss.com/products/products.html


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[38]: плохой язык C++ :)
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 13.03.06 11:51
Оценка: 12 (1) :)
Евгений,

E>Да и разных реализаций Asn.1 для BER-кодирования не так уж и мало. Т.к. x.509 сертификаты кодируются в Asn.1, то многие криптографические библиотеки содержат средства для ручной работы с Asn.1. Хотя реально живого OpenSource Asn.1 компилятора, имхо, нет.


Позволь не согласиться, есть open source Erlang:

asn1ct

The ASN.1 compiler takes an ASN.1 module as input and genarates a corresponding Erlang module which can encode and decode the datatypes specified. Alternatively the compiler takes a specification module (see below) specifying all input modules and generates one module with encode/decode functions. There are also some generic functions which can be used in during development of applications which handles ASN.1 data (encoded as BER or PER).


asn1rt

This module is the interface module for the ASN.1 runtime support functions. To encode and decode ASN.1 types in runtime the functions in this module should be used.


Поскольку у Эрланга есть достаточно развитый механизм взаимодействия с нативным кодом, то Erlang Runtime System можно использовать как библиотечку для проекта на C/C++/Java/etc. Хотя звучит по извращенски и даже как-то кощунственно...
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[39]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 11:58
Оценка: 12 (2)
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Поскольку у Эрланга есть достаточно развитый механизм взаимодействия с нативным кодом, то Erlang Runtime System можно использовать как библиотечку для проекта на C/C++/Java/etc. Хотя звучит по извращенски и даже как-то кощунственно...


Я был не прав не только по отношению к Erlang-у.
Оказалось, что есть живой проект и для C/C++: http://lionet.info/asn1c/
(давно уже не занимался Asn1, утратил связь с реальностью)


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[40]: плохой язык C++ :)
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 13.03.06 12:03
Оценка:
eao197,

E>Оказалось, что есть живой проект и для C/C++: http://lionet.info/asn1c/


Хорошая ссылочка.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[41]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 12:09
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Хорошая ссылочка.


Найдена была вот здесь: http://asn1.elibel.tm.fr/en/index.htm
Может там и еще чего полезного будет.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[40]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 12:19
Оценка:
Здравствуйте, eao197, Вы писали:

E>Собственно, чам ASN.1 компилятор только это и должен делать. Плюс еще код десериализатора.


Тогда еще один вопрос — в стандарте есть язык описания синтаксиса протокола? Если есть, то простенький примерчик можно?
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[41]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 12:32
Оценка: 20 (1)
Здравствуйте, AndrewVK, Вы писали:

E>>Собственно, чам ASN.1 компилятор только это и должен делать. Плюс еще код десериализатора.


AVK>Тогда еще один вопрос — в стандарте есть язык описания синтаксиса протокола?


Да, это самая важная часть стандарта.

AVK> Если есть, то простенький примерчик можно?


Простенький примерчик можно посмотреть здесь: http://lionet.info/asn1c/ (в разделе ASN.1 Basic)

Более сложный примерчик можно взять из книги Лампорта (их там много):
Return-of-sales ::= SEQUENCE
     {version       BIT STRING
               {version1 (0), version2 (1)} DEFAULT {version1},
      no-of-days-reported-on  INTEGER
            {week(7), month (28), maximum (56)} (1..56) DEFAULT week,
      time-and-date-of-report  CHOICE
                 {two-digit-year  UTCTime,
                  four-digit-year GeneralizedTime},
               -- If the system clock provides a four-digit year,
               -- the second alternative shall be used.  With the
               -- first alternative the time shall be interpreted
               -- as a sliding window.
      reason-for-delay  ENUMERATED
            {computer-failure, network-failure, other} OPTIONAL,
               -- Include this field if and only if the
               -- no-of-days-reported-on exceeds seven.
      additional-information  SEQUENCE OF PrintableString OPTIONAL,
               -- Include this field if and only if the
               -- reason-for-delay is "other".
      sales-data  SET OF Report-item,
      ... ! PrintableString : "See wineco manual chapter 15"}

Report-item ::= SEQUENCE
    {item                 OBJECT IDENTIFIER,
     item-description     ObjectDescriptor OPTIONAL,
         -- To be included for any newly-stocked item.
     bar-code-data        OCTET STRING,
         -- Represents the bar-code for the item as specified
         -- in the wineco manual chapter 29.
     ran-out-of-stock  BOOLEAN DEFAULT FALSE,
         -- Send TRUE if stock for item became exhausted at any
         -- time during the period reported on.
     min-stock-level      REAL,
     max-stock-level      REAL,
     average-stock-level  REAL
       -- Give minimum, maximum, and average levels during the
       -- period as a percentage of normal target stock-level-- }

wineco-items OBJECT IDENTIFIER ::=
     { joint-iso-itu-t internationalRA(23) set(42) set-vendors(9) wineco(43) stock-items (0)}


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[35]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 16:38
Оценка:
Здравствуйте, AndrewVK, Вы писали:

VD>>А знашь почему? В+ реализуется сложнее.


AVK>Сложнее чего?


Более простых реализаций деревьев. Например, RB-деревьев.

VD>> А вообще-то он и в памяти выгоднее. Как минимум ее меньше тратит.


AVK>Меньше чем кто?


Чем те же RB-деревья.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 16:38
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Я в курсе. Но только структура его несколько отличается от структуры хеш-таблицы в памяти.


Ровно настолько насколько разные реализации хэш-таблиц отличаются друг-от друга. Алгоритм там тот же. Просто, как я уже говорил, выигрыш не велик, и теряется возможность последовательного сканирования. Ведь записи размещаются в порядки хэш-значений.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 16:38
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Я думаю, С++ создан для того, чтобы суметь познать себя.


Думаю разные Лиспы и Хаскели ничем не хуже для самопознания. То о чем ты говоришь — это банальная тренировка.

V>----------

V>Те, которые на некотором этапе создают крутонавороченные сложные сверх-нечитаемые перлы на самом деле имеют хоть какие-то шансы в нашей профессии. В отличие от тех, кто не то что составить, но даже и прочитать подобное не в состоянии.

Не. Навороты — это простительно для новичков. Чем опытнее становится программист, тем проще должен становиться его код и тем более просты должны быть его решения. У всего конечно есть резумный предел, но если есть два анлогичных решения, то оптыный человек должен выбрать простое. И объясняется это очень просто. Единственная сложная задача в разработке ПО — это предодаление сложности. Сложное решение усложняет общую задачу, а стло быть противоречит главному требованию.

V>----------

V>И просьба не путать нечитаемый макаронный код с действительно сложными наворотами.

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

Правильная декомпозиция и правильный выбор абстракций — это залог успеха. Именно это умеют опытные программисты/архитекторы и не понимаю новички и ламеры. Так вот задача сдерств разработки предоставить программисту возможности для удобной декомпозиции и полноценный набор абстракций.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[48]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 16:38
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Ну так и в Mono — неполная реализация .NET FW


В Моно полностью реализована BCL. В стандарт входит только она. Нет никакого стандарта на фрэймворк.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[50]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 16:38
Оценка:
Здравствуйте, eao197, Вы писали:

Д>>а где они, хорошие? Я пока ни одной не видел, если она сложнее чем hello world


E>Microsoft Windows?


В курсе, что он в основном на С написан. А то что написано на С++ компилируется в основном на МС-ных компиляторах?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[49]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 13.03.06 16:44
Оценка: +1
Здравствуйте, VladD2, Вы писали:

C>>Ну так и в Mono — неполная реализация .NET FW

VD>В Моно полностью реализована BCL. В стандарт входит только она. Нет никакого стандарта на фрэймворк.
Тогда почему C#овцы в каждом втором слуае хвалятся огромной стандартной библиотекой? (А в каждом первом случае хвалятся портируемостью)
Sapienti sat!
Re[36]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 17:20
Оценка:
Здравствуйте, VladD2, Вы писали:

AVK>>Сложнее чего?


VD>Более простых реализаций деревьев. Например, RB-деревьев.


RB деревья как раз используются при необходимости. А вот В+ в реальных проектах я не видел ни разу.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[34]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.06 17:20
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ровно настолько насколько разные реализации хэш-таблиц отличаются друг-от друга.


Не совсем. Та, которая хранится на диске (и не грузится в память целиком), должна быть заточена под минимизацию перемещений головки. А если перенести тупо хеш для памяти на диск путем выдачи адресов из дискового мепа, ничего хорошего скорее всего не получится.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[35]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 13.03.06 17:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Не совсем. Та, которая хранится на диске (и не грузится в память целиком), должна быть заточена под минимизацию перемещений головки. А если перенести тупо хеш для памяти на диск путем выдачи адресов из дискового мепа, ничего хорошего скорее всего не получится.

Кхм.... Swap file?
Sapienti sat!
Re[50]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 18:30
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Тогда почему C#овцы в каждом втором слуае хвалятся огромной стандартной библиотекой? (А в каждом первом случае хвалятся портируемостью)


Спроси у этих мифических "C#овцы".
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 18:30
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>RB деревья как раз используются при необходимости. А вот В+ в реальных проектах я не видел ни разу.


Я видел и то, и другое. И что?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 18:30
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Не совсем. Та, которая хранится на диске (и не грузится в память целиком), должна быть заточена под минимизацию перемещений головки. А если перенести тупо хеш для памяти на диск путем выдачи адресов из дискового мепа, ничего хорошего скорее всего не получится.


Это вопрос выбора хэш-функции, а не реализации.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[51]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 13.03.06 18:38
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В курсе, что он в основном на С написан.


Нет. Думал, что в основном на C++.

VD>А то что написано на С++ компилируется в основном на МС-ных компиляторах?


Я бы сильно удивился, если бы в Windows нашелся MS-ный компонент, скомпилированный Borland-ом или, прости господи, GNU C++


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[52]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.03.06 19:19
Оценка:
Здравствуйте, eao197, Вы писали:

E>Я бы сильно удивился, если бы в Windows нашелся MS-ный компонент, скомпилированный Borland-ом или, прости господи, GNU C++


Ну, при переносе на разные Мипсы/Альфи они были вынуждены сделать код универсальным. Но это в основном этот окд как раз на С написан. На С++ написаны такие нетленки как Write.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[52]: плохой язык C++ :)
От: Left2 Украина  
Дата: 14.03.06 08:54
Оценка: 1 (1) -1
E>Нет. Думал, что в основном на C++.

Не ссорьтесь, горячие парни Решается всё просто — ставите себе debug symbols и смотрите на имена функций. Статистику не мерял, но "на глаз" в XP процентов 80-90 кода на С++.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[37]: плохой язык C++ :)
От: Left2 Украина  
Дата: 14.03.06 09:03
Оценка:
AVK>RB деревья как раз используются при необходимости. А вот В+ в реальных проектах я не видел ни разу.

Symbian OS — в стандартной библиотеке есть реализация B-деревьев. IMHO, переходить от B к B+ имеет смысл только если они лежат на диске — для работы с памятью B-деревья предпочтительнее B+.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[36]: плохой язык C++ :)
От: Left2 Украина  
Дата: 14.03.06 09:03
Оценка: +1
AVK>>Не совсем. Та, которая хранится на диске (и не грузится в память целиком), должна быть заточена под минимизацию перемещений головки. А если перенести тупо хеш для памяти на диск путем выдачи адресов из дискового мепа, ничего хорошего скорее всего не получится.

VD>Это вопрос выбора хэш-функции, а не реализации.


Сильно сомневаюсь что это хорошая идея — хранить данные на диске через хеш-таблицу. Слишком медленным получится последовательное чтение — поскольку прийдётся скакать случайным образом по всей таблице. Хотя, может для каких-то специфических задач это и прокатит... Впрочем, при добавлении в RB-дерево случайным образом страницы тоже могут перемешаться на диске — но тут по крайней мере можно слегка прогнуться и сделать дефрагментацию, а вот хеш-таблицу ничто не спасёт
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[31]: плохой язык C++ :)
От: vdimas Россия  
Дата: 14.03.06 09:17
Оценка:
Здравствуйте, AndrewVK, Вы писали:

V>>Гораздо интереснее время выделения памяти. А оно практически одинаковое.


AVK>Было бы странно, если бы и там была разница.


Там может быть разница, ибо GC от MS напрямую откусывает из виртуальной памяти. Не знаю как сделано в Mono, но из-за его многоплатформенности именно этот момент — эффективное управление большими кусками памяти, весьма специфичный для каждой платформы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[38]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.03.06 09:24
Оценка:
Здравствуйте, Left2, Вы писали:

L>Symbian OS — в стандартной библиотеке есть реализация B-деревьев. IMHO, переходить от B к B+ имеет смысл только если они лежат на диске — для работы с памятью B-деревья предпочтительнее B+.


О! Это я и пытаюсь тут доказать.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[27]: плохой язык C++ :)
От: LeeMouse Россия  
Дата: 14.03.06 09:57
Оценка: 18 (1) -3 :)
Здравствуйте, VladD2, Вы писали:

VD>Ты за свой проффесионализм бойся, а за мой не надо. Я понимаю что говорю. В большинстве случаев порвет. А тот 1-2% происходят когда оптимизацией занимаются действительно знающие люди и в довольно редких случаях. Пока хорошему ЖЦ хватает памяти он весьма эффективен.


ООО, ещё один великий ГУРУ нашёлся, ну надо же...
Судя по стилю постов — недавний студент

VD>Вот и срани как нибудь эти реализации. ЖЦ под обычным С++ — это слезы.


Ну вот сам и сравни, только не облажайся в С++ — коде...
Re[28]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.03.06 11:47
Оценка:
Здравствуйте, LeeMouse, Вы писали:

LM>ООО, ещё один великий ГУРУ нашёлся, ну надо же...

LM>Судя по стилю постов — недавний студент

VD>>Вот и срани как нибудь эти реализации. ЖЦ под обычным С++ — это слезы.


LM>Ну вот сам и сравни, только не облажайся в С++ — коде...


Что можно сказать о этих словах без перехода на твою личность? Да в общем-то ничего. А так как обсуждение твоей личности неимет никакого смысла, то лучше промолчу.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.03.06 11:47
Оценка:
Здравствуйте, Left2, Вы писали:

L>Сильно сомневаюсь что это хорошая идея — хранить данные на диске через хеш-таблицу.


Дык это не вопрос твоих сомнений. Этот тип индксов применяется не в одной СУБД. И не только в СУБД.

L> Слишком медленным получится последовательное чтение — поскольку прийдётся скакать случайным образом по всей таблице.


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

L> Хотя, может для каких-то специфических задач это и прокатит... Впрочем, при добавлении в RB-дерево случайным образом страницы тоже могут перемешаться на диске — но тут по крайней мере можно слегка прогнуться и сделать дефрагментацию, а вот хеш-таблицу ничто не спасёт


RB-дерево — это структура данных не предназначенная для хранения на диске. RB-дерево — это обычное бинарное дерево (т.е. ветка состоит из двух элементов) снабженная "цветами" для корректировки сбалансированности. Ты видимо хотел сказать B-дерево, или B+-дерево.

В них страницы не перемещаются. Основаня операция в них — это разделение страницы. Когда страница переполняется, то она делится на две. Перемещается при этом только часть данных прошлой страницы. Что в общем-то фигня.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: плохой язык C++ :)
От: Left2 Украина  
Дата: 14.03.06 11:57
Оценка:
Влад, насколько я понимаю изначально разговор шёл о том что с помощью С++ аллокаторов можно хранить на диске контейнеры. Я имел в виду стандартные С++ контейнеры — std::map и stdext::hash_map. Что такое B и B+ дерево я себе представляю, в институте учили, но как тут выше заметили B(+) деревьев обычно в библиотеках шаблонов нет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[39]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.03.06 13:52
Оценка: :)
Здравствуйте, Left2, Вы писали:

L>Влад, насколько я понимаю изначально разговор шёл о том что с помощью С++ аллокаторов можно хранить на диске контейнеры. Я имел в виду стандартные С++ контейнеры — std::map и stdext::hash_map. Что такое B и B+ дерево я себе представляю, в институте учили, но как тут выше заметили B(+) деревьев обычно в библиотеках шаблонов нет.


Правильно и посему вместо выбора подходящих структур данных и алгоритмов мы будем через одно место пытаться хнанить на дисках std::map-ы. Гениально! Блин, Кнут при жизни в гробу перевернется.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.03.06 13:52
Оценка:
Здравствуйте, Left2, Вы писали:

L>Symbian OS — в стандартной библиотеке есть реализация B-деревьев. IMHO, переходить от B к B+ имеет смысл только если они лежат на диске — для работы с памятью B-деревья предпочтительнее B+.


Вообще-то B+ отличаются очень незначительно. Это небольшое усовершенствование. Просто связали страницы двунаправленным списком и все. Оно и в памяти удобнее.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[40]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 14.03.06 13:54
Оценка: :))
VladD2 wrote:
> Правильно и посему вместо выбора подходящих структур данных и алгоритмов
> мы будем через одно место пытаться хнанить на дисках std::map-ы.
> Гениально! Блин, Кнут при жизни в гробу перевернется.
Вообще-то, с помощью такого приема можно хранить на диске _любые_
данные. В том числе и те, которые плохо ложаться в реляционную модель
(например, большой битмап).

Причем работа с ними будет абсолютно прозрачна для меня.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[39]: плохой язык C++ :)
От: Left2 Украина  
Дата: 14.03.06 14:08
Оценка: +1
VD>Вообще-то B+ отличаются очень незначительно. Это небольшое усовершенствование. Просто связали страницы двунаправленным списком и все. Оно и в памяти удобнее.

Да в курсе мы чем B от B+ отличаются
Я пытался сказать что в памяти эти указатели для двунаправленного списка избыточны — найти предыдущую-следующую страницу несложно, благо латентности у памяти небольшие. А вот для диска это уже существенно — лишнее обращение к диску стоит дорого.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[40]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.03.06 15:56
Оценка:
Здравствуйте, Left2, Вы писали:

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


Ошибашся. Промежуточные страницы они в принципе в память сразу попадают. Тут в другом дело. Вдло в упрощении сканирования. Алгоритм превращается линейный перебор.

L> А вот для диска это уже существенно — лишнее обращение к диску стоит дорого.


Не будет там никаких лишних обращений. Когда ты переходишь к одной из нижних страниц ты обязан поднять в память корневую страницу. Просто при переборе ты не будешь лазить по дереву, сразу начнешь сканирование записей.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[39]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.03.06 16:49
Оценка: +2
Здравствуйте, VladD2, Вы писали:

VD>Вообще-то B+ отличаются очень незначительно. Это небольшое усовершенствование. Просто связали страницы двунаправленным списком и все.


Нет, не все. В В+ дереве, кроме того, все элементы храняться в листьях (иначе было бы бессмысленно делать указатели на соседние листья).
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[38]: плохой язык C++ :)
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 14.03.06 17:24
Оценка:
Здравствуйте, Left2, Вы писали:

AVK>>RB деревья как раз используются при необходимости. А вот В+ в реальных проектах я не видел ни разу.


L>Symbian OS — в стандартной библиотеке есть реализация B-деревьев. IMHO, переходить от B к B+ имеет смысл только если они лежат на диске — для работы с памятью B-деревья предпочтительнее B+.


А чем обосновано данное утверждение??? В зависимости от типа КеуValuePair, и количества элементов на странице процент лишней памяти весьма незначителен, а вот выигрыш при чесе по страницам весьма заметен. Да и реализация немного проще.
и солнце б утром не вставало, когда бы не было меня
Re[40]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.03.06 17:34
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Нет, не все. В В+ дереве, кроме того, все элементы храняться в листьях (иначе было бы бессмысленно делать указатели на соседние листья).


Ага. Вот только это все равно не влияет на использование их в памяти. Просто более совершенная разновидность алгоритма.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: плохой язык C++ :)
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.03.06 05:12
Оценка: 4 (1) +1
Здравствуйте, Left2, Вы писали:

L>Сильно сомневаюсь что это хорошая идея — хранить данные на диске через хеш-таблицу. Слишком медленным получится последовательное чтение — поскольку прийдётся скакать случайным образом по всей таблице.

Именно поэтому хеш-индексы сейчас малопопулярны. Дело в том, что редкий оптимизатор в силах угадать способ доступа. Тем не менее, они все же применяются — там, где можно заранее определить назначение некоторого индекса. К примеру, FK-индексы как правило используются только для lookup, а lookup по хеш-таблице имеет более мягкую асимптотику, чем по дереву.
L> Хотя, может для каких-то специфических задач это и прокатит... Впрочем, при добавлении в RB-дерево случайным образом страницы тоже могут перемешаться на диске
Не знаю насчет RB-деревьев; для B/B+/B* деревьев все операции требуют log(N) времени, и с учетом очень вероятного кэширования рута и первого уровня дерева этот логарифм превращается в подкачку ровно 1 страницы в 95% случаев.
L>- но тут по крайней мере можно слегка прогнуться и сделать дефрагментацию, а вот хеш-таблицу ничто не спасёт
Я думаю, тебе стоит почитать учебники по проектированию СУБД. Там описаны алгоритмы хеш-индексов, пригодные для дисковых операций.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[37]: плохой язык C++ :)
От: vdimas Россия  
Дата: 15.03.06 06:38
Оценка:
Здравствуйте, AndrewVK, Вы писали:


C>>Ну да, можно положить Assemblt в GAC и сделать ей ngen'ом

C>>оптимизированое изображение.

AVK>Афигеть. Блин, ну ты и спорщик.

AVK>Для того чтобы обработать ngen'ом сборку не нужно класть ее в GAC. Единственная связь между GAC и ngen это то что каталог ngen'а лежит рядом с каталогом GAC.

еще оба требуют твердого имени
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[38]: плохой язык C++ :)
От: Дарней Россия  
Дата: 15.03.06 06:53
Оценка: :)
Здравствуйте, vdimas, Вы писали:

V>еще оба требуют твердого имени


"твердого"? Интересно, что бы сказал про это дедушка Фрейд
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[38]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.03.06 08:19
Оценка:
Здравствуйте, vdimas, Вы писали:

V>еще оба требуют твердого имени


Нет.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[41]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.03.06 08:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ага. Вот только это все равно не влияет на использование их в памяти.


Влияет на использование на диске. В+ дерево в реальности стараются хранить так, чтобы соседние страницы лежали последовательно друг за другом. Это минимизирует количество перемещений головки при выборе диапазона. Для вариантов в памяти это, естественно, никто не делает.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[38]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.03.06 08:21
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Я думаю, тебе стоит почитать учебники по проектированию СУБД. Там описаны алгоритмы хеш-индексов, пригодные для дисковых операций.


А такой есть?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: плохой язык C++ :)
От: Left2 Украина  
Дата: 15.03.06 08:34
Оценка:
L>>- но тут по крайней мере можно слегка прогнуться и сделать дефрагментацию, а вот хеш-таблицу ничто не спасёт
S>Я думаю, тебе стоит почитать учебники по проектированию СУБД. Там описаны алгоритмы хеш-индексов, пригодные для дисковых операций.

Хай Бог Мылуе В ближайшее время проектированием СУБД заниматься не собираюсь Их вроде бы и так выше крыши на рынке — выбирай любую по вкусу и цене
Я уже пытался обьяснить — изначально-то разговор шёл не о написании более-менее честной СУБД а о подтачивании стандартных (ну, или околостандартных ) контейнеров C++ для хранения данных на диске.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[42]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.03.06 08:38
Оценка:
Здравствуйте, AndrewVK, Вы писали:

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


Стараться конечно можно. Вот только по жизни это может вызвать копирование всего содержимого индекса.

И В-дерево тут ничем не отличается. Еше раз повторяю, что В+-дерево — это всего лишь небольшая оптимизация В-дерева. В основном характеристики у них одинаковые. Приемущество В+-дерева проявляется только при последовательном сканировании. Причем это приемущество остается независимо от того где распологается индекс.

AVK> Это минимизирует количество перемещений головки при выборе диапазона. Для вариантов в памяти это, естественно, никто не делает.


И что мешат распологать страницы В-дерева последовательно?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[43]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.03.06 08:50
Оценка: +2
Здравствуйте, VladD2, Вы писали:

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


VD>Стараться конечно можно. Вот только по жизни это может вызвать копирование всего содержимого индекса.


Может. Техника борьбы стандартная — оставлять запас для роста.

VD>И В-дерево тут ничем не отличается.


Отчасти отличается. Там понятие соседняя страница не так очевидно (потому как данные не только в листьях). Ну и главное — в тех деревьях, которые храняться в памяти, В или В+ не важно, такая оптимизация отсутствует.

VD>Приемущество В+-дерева проявляется только при последовательном сканировании.


Я про последовательное сканирование и говорю.

VD> Причем это приемущество остается независимо от того где распологается индекс.


На диске зависит.

VD>И что мешат распологать страницы В-дерева последовательно?


Как ты расположишь страницы В дерева последовательно, если данные есть и в родительской странице и в дочерних?
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[39]: плохой язык C++ :)
От: vdimas Россия  
Дата: 15.03.06 09:02
Оценка: :)
Здравствуйте, Дарней, Вы писали:

Д>"твердого"? Интересно, что бы сказал про это дедушка Фрейд


Кто такие фрейды и при чем тут их дедушка?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[44]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.03.06 10:01
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Как ты расположишь страницы В дерева последовательно, если данные есть и в родительской странице и в дочерних?


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

В общем, ты не прав. В-деревья изначально разрабатывались для хнанения на дисках. B+ конечно лучше. Но это не более чем оптимизация исходного алгоритма.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[39]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.03.06 10:10
Оценка:
Здравствуйте, Left2, Вы писали:

L>Я уже пытался обьяснить — изначально-то разговор шёл не о написании более-менее честной СУБД а о подтачивании стандартных (ну, или околостандартных ) контейнеров C++ для хранения данных на диске.


Ну, вот тебе и посоветовали не маяться дурью. Но ты похоже это не осознал.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[39]: плохой язык C++ :)
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.03.06 10:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А такой есть?

Учебник-то? Конечно. Тот же Гарсиа-Молина со товарищи. Попроси у Мерля почитать
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[40]: плохой язык C++ :)
От: igna Россия  
Дата: 15.03.06 13:11
Оценка:
Здравствуйте, VladD2, Вы писали:

L>>Я уже пытался обьяснить — изначально-то разговор шёл не о написании более-менее честной СУБД а о подтачивании стандартных (ну, или околостандартных ) контейнеров C++ для хранения данных на диске.


VD>Ну, вот тебе и посоветовали не маяться дурью.



Посоветовали не использовать Hashtable и подобные Hashtable контейнеры для хранения на диске. Ну и ладно, в boost'е уже есть File-Mapping-аллокатор (Shmem), появится и boost::btree.
Re[40]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.03.06 14:59
Оценка:
Здравствуйте, Sinclair, Вы писали:

VD>>А такой есть?

S>Учебник-то? Конечно. Тот же Гарсиа-Молина со товарищи. Попроси у Мерля почитать

Мне то зачем? Просто интересно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[36]: плохой язык C++ :)
От: vdimas Россия  
Дата: 15.03.06 17:31
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>3. Делаем так:

C>
C>struct B
C>{
C>    int a;
C>    std::basic_string<char,shmem_allocator<char> > b,c;
C>};
C>

C>Теперь внутренний буффер std::string будет распологаться в shared
C>memory/file mapping'е.

Да фиг там. Если длина строки не больше 32-х/16-ти байт (в зависимости от реализации), то большинство из них дежат эти значения в локальном буфере.

Тогда уж надо сделать что-то типа NullTerminatedAdapter на основе std::vector.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[37]: плохой язык C++ :)
От: alexeiz  
Дата: 15.03.06 22:35
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Cyberax, Вы писали:


C>>3. Делаем так:

C>>
C>>struct B
C>>{
C>>    int a;
C>>    std::basic_string<char,shmem_allocator<char> > b,c;
C>>};
C>>

C>>Теперь внутренний буффер std::string будет распологаться в shared
C>>memory/file mapping'е.

V>Да фиг там. Если длина строки не больше 32-х/16-ти байт (в зависимости от реализации), то большинство из них дежат эти значения в локальном буфере.


Саму строку (в данном случае всю структуру) нужно аллоцировать этим же аллокатором. Тогда всё нормально будет.
Re[37]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 16.03.06 09:25
Оценка:
vdimas wrote:
> C>Теперь внутренний буффер std::string будет распологаться в shared
> C>memory/file mapping'е.
> Да фиг там. Если длина строки не больше 32-х/16-ти байт (в зависимости
> от реализации), то большинство из них дежат эти значения в локальном буфере.
Сама структура тоже создается этим же аллокатором.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[38]: плохой язык C++ :)
От: vdimas Россия  
Дата: 16.03.06 16:57
Оценка:
Здравствуйте, alexeiz, Вы писали:


V>>Да фиг там. Если длина строки не больше 32-х/16-ти байт (в зависимости от реализации), то большинство из них дежат эти значения в локальном буфере.


A>Саму строку (в данном случае всю структуру) нужно аллоцировать этим же аллокатором. Тогда всё нормально будет.


Это значит надо наследовать от std::basic_string и переопределять операторы new/delete? А заодно еще около 20-ти конструкторов???
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[39]: плохой язык C++ :)
От: alexeiz  
Дата: 16.03.06 22:00
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, alexeiz, Вы писали:



V>>>Да фиг там. Если длина строки не больше 32-х/16-ти байт (в зависимости от реализации), то большинство из них дежат эти значения в локальном буфере.


A>>Саму строку (в данном случае всю структуру) нужно аллоцировать этим же аллокатором. Тогда всё нормально будет.


V>Это значит надо наследовать от std::basic_string и переопределять операторы new/delete? А заодно еще около 20-ти конструкторов???


Зачем же так сразу. Просто используешь аллокатор напрямую:
typedef std::basic_string<char,shmem_allocator<char>> sh_string;
typedef sh_string::allocator::rebind<B>::other b_allocator;

//  TODO: add exception handling
B * construct_from(B const & val) {
    b_allocator alloc;
    B * obj = alloc.allocate(1);
    alloc.construct(obj, val);
    return obj;
}

void destroy(B * obj) {
    b_allocator alloc;
    alloc.destroy(obj);
    alloc.deallocate(obj, 1);
}
Re[40]: плохой язык C++ :)
От: vdimas Россия  
Дата: 16.03.06 23:17
Оценка:
Здравствуйте, alexeiz, Вы писали:


A>Зачем же так сразу. Просто используешь аллокатор напрямую:

[skip]

Напрямую можно еще проще через inplace new, стиль мне не нравится. Если бы уж прижало, то я бы скорее переопределил пару десятков конструкторов std::basic_string но сохранил читабельность.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[41]: плохой язык C++ :)
От: alexeiz  
Дата: 17.03.06 00:13
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, alexeiz, Вы писали:



A>>Зачем же так сразу. Просто используешь аллокатор напрямую:

V>[skip]

V>Напрямую можно еще проще через inplace new,


Да, так даже лучше.

> стиль мне не нравится. Если бы уж прижало, то я бы скорее переопределил пару десятков конструкторов std::basic_string но сохранил читабельность.


Зачем переопределять конструкторы? Ты же только память в другом месте аллоцируешь, а функциональность конструкторов у тебя остаётся такой же. Ну, допустим, ты унаследовал от basic_string, где в конструкторах наследуемого класса ты собрался использовать аллокатор?
Re[42]: плохой язык C++ :)
От: vdimas Россия  
Дата: 17.03.06 01:14
Оценка:
Здравствуйте, alexeiz, Вы писали:


A>>>Зачем же так сразу. Просто используешь аллокатор напрямую:

V>>[skip]

V>>Напрямую можно еще проще через inplace new,


A>Да, так даже лучше.


не совсем, ниже поясню

>> стиль мне не нравится. Если бы уж прижало, то я бы скорее переопределил пару десятков конструкторов std::basic_string но сохранил читабельность.


A>Зачем переопределять конструкторы? Ты же только память в другом месте аллоцируешь, а функциональность конструкторов у тебя остаётся такой же. Ну, допустим, ты унаследовал от basic_string, где в конструкторах наследуемого класса ты собрался использовать аллокатор?


Я же сказал в позапрошлом посте, что надо переопределить для типа оператор new. Для std::basic_string его переопределить неудасться, значит, надо переопределить его для своего наследника.

Inplace new мне не нравится по причине банальной: "двухтактная инициализация", невозможность использования в функциональном стиле.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: плохой язык C++ :)
От: Leonid V. Volnin Россия  
Дата: 17.03.06 05:28
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали.

коллега, по-моему это примерно тоже самое что говорить мол, русский язык плохой, потому что он допускает конструкции вида "я вашу маму [sensored]" и "да ты козел необразованный". язык только предоставляет возможности, а как вы ими воспользуетесь — это уже ваши проблемы.
best regards, Leonid
Re[2]: плохой язык C++ :)
От: dshe  
Дата: 17.03.06 07:56
Оценка: +2 :))
Здравствуйте, Leonid V. Volnin, Вы писали:

LVV>Здравствуйте, Зверёк Харьковский, Вы писали.


LVV>коллега, по-моему это примерно тоже самое что говорить мол, русский язык плохой, потому что он допускает конструкции вида "я вашу маму [sensored]" и "да ты козел необразованный". язык только предоставляет возможности, а как вы ими воспользуетесь — это уже ваши проблемы.


Ну, если бы пользуясь русским языком, нужно было бы постоянно заботиться о том, чтобы случайно кого-нибудь не послать, полагаю, что совершенно справедливо можно было бы сказать, что русский язык -- плохой.
--
Дмитро
Re[3]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.03.06 08:02
Оценка: :)
Здравствуйте, dshe, Вы писали:

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


А как же тогда известная песня в исполнении В.Леонтьева:

...Каждый хочет иметь и невесту, и друга...

А ведь казалось бы, совершенно безобидный текст.



SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[3]: плохой язык C++ :)
От: Leonid V. Volnin Россия  
Дата: 17.03.06 08:08
Оценка:
Здравствуйте, dshe, Вы писали:

D>Здравствуйте, Leonid V. Volnin, Вы писали:


LVV>>Здравствуйте, Зверёк Харьковский, Вы писали.


LVV>>коллега, по-моему это примерно тоже самое что говорить мол, русский язык плохой, потому что он допускает конструкции вида "я вашу маму [sensored]" и "да ты козел необразованный". язык только предоставляет возможности, а как вы ими воспользуетесь — это уже ваши проблемы.


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


ну дык разве это не так?
не все же люди могут следить за своей речью, многие сначала говорят, а потом думают.
в результате именно так и получается. так что сомнений нет — русский язык плохой
best regards, Leonid
Re[39]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 17.03.06 08:22
Оценка: +1
vdimas wrote:
> A>Саму строку (в данном случае всю структуру) нужно аллоцировать этим же
> аллокатором. Тогда всё нормально будет.
> Это значит надо наследовать от std::basic_string и переопределять
> операторы new/delete? А заодно еще около 20-ти конструкторов???
Зачем же так грубо, выглядит примерно так:
const ShmemAllocator alloc_inst(segment.get_segment_manager());

typedef std::string<char,std::char_traits<char>,
    ShmemAllocator> MyString;

MyString *str=segment.construct<MyString>("OptionalObjectName")
    (alloc_inst);
//Конструктор std::string с одним параметром-аллокатором

MyString *str2=segment.construct<MyString>("OptionalObjectName")
    ('a',11,alloc_inst);
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[4]: плохой язык C++ :)
От: dshe  
Дата: 17.03.06 08:23
Оценка:
Здравствуйте, Leonid V. Volnin, Вы писали:

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


LVV>ну дык разве это не так?

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

Что ж, даже в естественных языках нет совершенства.
--
Дмитро
Re[2]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.03.06 10:39
Оценка:
Здравствуйте, Leonid V. Volnin, Вы писали:

LVV>коллега, по-моему это примерно тоже самое что говорить мол, русский язык плохой, потому что он допускает конструкции вида "я вашу маму [sensored]" и "да ты козел необразованный". язык только предоставляет возможности, а как вы ими воспользуетесь — это уже ваши проблемы.


Некорректная анлогия. ЯП и разговорные языки сильно отличаются.
ЯП скорее корректнее сравнивать с инструментами. Если есть безопасный инструмент позволяющие выполнить работу приметно так же эффективно как и опасным, то разумный человек скорее выберет безопасный.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: плохой язык C++ :)
От: Leonid V. Volnin Россия  
Дата: 17.03.06 11:30
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Leonid V. Volnin, Вы писали:


LVV>>коллега, по-моему это примерно тоже самое что говорить мол, русский язык плохой, потому что он допускает конструкции вида "я вашу маму [sensored]" и "да ты козел необразованный". язык только предоставляет возможности, а как вы ими воспользуетесь — это уже ваши проблемы.


VD>Некорректная анлогия. ЯП и разговорные языки сильно отличаются.

VD>ЯП скорее корректнее сравнивать с инструментами. Если есть безопасный инструмент позволяющие выполнить работу приметно так же эффективно как и опасным, то разумный человек скорее выберет безопасный.

черт его знает. с инструментами сравнивать скучно :) не ассоциируются у меня языки программирования с инструментами.
с инструментами можно сравнить вспомогательные библиотеки наверное. SDK какое-нибудь. IDE пожалуй можно. но язык программирования?.. язык программирования это тогда уж скорее способ работы с инструментами.
но здесь я аналогию еще не придумал :)
best regards, Leonid
Re[4]: плохой язык C++ :)
От: eaglus Россия  
Дата: 17.03.06 13:53
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Cyberax, Вы писали:


C>>last_hardcoder wrote:

>>> приемника C++
C>>Это как "приемник Путина"?

I>

Он его ночами крутит, ловит, контра, ФРГ. (C)

Ага!

Приёмник — это девайс такой.
Преемник — это тот, кто "преемлет" мою должность после меня. Преемственность у нас.
Re[53]: плохой язык C++ :)
От: Denis2005 Россия  
Дата: 19.03.06 11:40
Оценка:
Здравствуйте, Left2, Вы писали:

L>Не ссорьтесь, горячие парни Решается всё просто — ставите себе debug symbols и смотрите на имена функций. Статистику не мерял, но "на глаз" в XP процентов 80-90 кода на С++.


MS переписал код с "кустарного C" на C, который можно без проблем прогнать через рядовой С++ компилятор.
В частности объявления в стиле K&R были заменены на ANSI-шные.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[54]: плохой язык C++ :)
От: Left2 Украина  
Дата: 20.03.06 09:33
Оценка:
D>MS переписал код с "кустарного C" на C, который можно без проблем прогнать через рядовой С++ компилятор.
D>В частности объявления в стиле K&R были заменены на ANSI-шные.

Не совсем понял что значит "C, который можно без проблем прогнать через рядовой С++ компилятор". Насколько я видел — в call-stack большинство вызываемых функций являются членами классов. Я конечно в pure C не силён, но насколько я знаю он member-функций не поддерживает.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[55]: плохой язык C++ :)
От: Denis2005 Россия  
Дата: 21.03.06 07:09
Оценка: +1
Здравствуйте, Left2, Вы писали:

D>>MS переписал код с "кустарного C" на C, который можно без проблем прогнать через рядовой С++ компилятор.

D>>В частности объявления в стиле K&R были заменены на ANSI-шные.

L>... Насколько я видел — в call-stack большинство вызываемых функций являются членами классов...


Во первых стоит уточнить о каких “80-90% кода XP“ шла речь.
Ядро, API, базовые библиотеки и сервисы сделаны на C, просто были переработаны и адаптированы на подмножество, которое нормально поддерживается стандартом C++.

Далее немалая часть кода переведена с C на C++ почти машинным способом (наглядный пример фрагменты MFC).

Имели (C):
struct HDC;
void Proc(HDC hdc, …);



Получили (C++):
class CDC
{
    …
    void Proc(…)
}


В принципе разница только в том, что (для MS-компиляторов) указатель на объект/структуру будет передан через регистр (как правило ECX). Назвать это C++ можно с большой натяжкой.

Поэтому заявление: “… процентов 80-90 кода на С++”, стоило бы заменить на “процентов 80-90 пародии на C++”.
Re[56]: плохой язык C++ :)
От: alexeiz  
Дата: 21.03.06 08:48
Оценка: +2
Здравствуйте, Denis2005, Вы писали:

D>Здравствуйте, Left2, Вы писали:


D>>>MS переписал код с "кустарного C" на C, который можно без проблем прогнать через рядовой С++ компилятор.

D>>>В частности объявления в стиле K&R были заменены на ANSI-шные.

L>>... Насколько я видел — в call-stack большинство вызываемых функций являются членами классов...


D>Во первых стоит уточнить о каких “80-90% кода XP“ шла речь.

D>Ядро, API, базовые библиотеки и сервисы сделаны на C, просто были переработаны и адаптированы на подмножество, которое нормально поддерживается стандартом C++.

D>Далее немалая часть кода переведена с C на C++ почти машинным способом (наглядный пример фрагменты MFC).


D>Имели (C):

D>
D>struct HDC;
D>void Proc(HDC hdc, …);
D>



D>Получили (C++):

D>
D>class CDC
D>{
D>    …
D>    void Proc(…)
D>}
D>


D>В принципе разница только в том, что (для MS-компиляторов) указатель на объект/структуру будет передан через регистр (как правило ECX). Назвать это C++ можно с большой натяжкой.


D>Поэтому заявление: “… процентов 80-90 кода на С++”, стоило бы заменить на “процентов 80-90 пародии на C++”.


Ты сделал большой комплимент создателям MFC, сказав, что они сделали свою библиотеку на некоторой пародии на C++. Нет, товарищ, код этой библиотеки является для них высшим образцом применения языка C++. По их мнению, это С++, какой он должен быть. И лучше чем это не бывает. И не надо мне рассказывать, что это был 92-й год, С++ в зачатке, итд итп. Если бы хоть кто-либо понимал, что это пародия на С++, код этой библиотеки бы исправили. Благо возможностей было много.

Вообще, в отношении С++ Майкрософт представляет очень упорный бастион. Новые идей дизайна и программирования на С++ эту компанию обходят стороной. Да какие там новые идеи! Видев огромное количество кода (очень много доступно открыто, например, SSCLI, Windows CE, Platform SDK, Win2K для тех кто успел скачать ), я могу смело сказать, что С++ в Майкрософте остановился на уровне 94 года (т.е. STL'ом там и не пахнет, хорошо хоть шаблоны попадаются изредка). Вот я недавно завладел ARM'ом, так это 90-й год. Если придерживаться хотя бы советов из этой книги, то можно гораздо лучше код писать.
Re[57]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.03.06 09:18
Оценка:
Здравствуйте, alexeiz, Вы писали:

Первое китайское предупреждение за оверквотинг.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[57]: плохой язык C++ :)
От: Denis2005 Россия  
Дата: 21.03.06 09:59
Оценка:
Здравствуйте, alexeiz, Вы писали:

A> ... И не надо мне рассказывать, что это был 92-й год, С++ в зачатке, итд итп.


C++ в зачатке был году этак в 85-м, когда как раз официально вышла версия 1.0.

A> ... в Майкрософте остановился на уровне 94 года (т.е. STL'ом там и не пахнет, хорошо хоть шаблоны попадаются изредка). Вот я недавно завладел ARM'ом, так это 90-й год...


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

ARM на сколько я знаю написан по 2.0 (которого еще не было), и компиляторы в 1989-1991 его чуток поддерживали.
В частости Borland Turbo C++ 1.0, умел с горем пополам работать с шаблонами, но не имел exception handling и т.д.
Re[58]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.03.06 10:39
Оценка:
Здравствуйте, Denis2005, Вы писали:

D>В частости Borland Turbo C++ 1.0, умел с горем пополам работать с шаблонами, но не имел exception handling и т.д.


Turbo C++ 1.0 вряд ли. Так же, как и Borland C++ 2.0.
Какие-то подвижки начались с появлением Borland C++ 3.0/3.1, но с ними я практически не работал, т.к. довольно быстро появились Borland C++ 4.0, а затем и 4.1. В одном из них была поддержка шаблонов, а во второй добавили поддержку исключений (либо в обратном порядке, уже не помню). Так же они позволяли создавать 32-х битовый код для Windows (Win32s и бетаверсии Win95). Причем в 4.0 были какие-то проблемы с линковкой 32-х битовых приложений в Win16.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[59]: плохой язык C++ :)
От: Denis2005 Россия  
Дата: 21.03.06 11:45
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Denis2005, Вы писали:


D>>В частости Borland Turbo C++ 1.0, умел с горем пополам работать с шаблонами, но не имел exception handling и т.д.


E>Turbo C++ 1.0 вряд ли. Так же, как и Borland C++ 2.0...


Извиняюсь, в TC++ 1.01 просто было зарезервированно ключевое слово template.

Turbo C++ version 1 was our first compiler that supported the C++ language. The C++ compiler conformed to AT&T's 2.0 specification for the C++ language.


Шаблоны у Борланда в простейшем виде появились только в BC++ 3.0.
Re[57]: плохой язык C++ :)
От: Kluev  
Дата: 21.03.06 11:48
Оценка: -1 :))
Здравствуйте, alexeiz, Вы писали:

A>... я могу смело сказать, что С++ в Майкрософте остановился на уровне 94 года (т.е. STL'ом там и не пахнет, хорошо хоть шаблоны попадаются изредка).


Вот и хорошо что там не пахнет STL-ем. Запаха МФЦ вполне достаточно, а если еще и запах STL... нет это уже перебор.
Re[32]: плохой язык C++ :)
От: prVovik Россия  
Дата: 21.03.06 12:47
Оценка: 17 (3) +2
Здравствуйте, Cyberax, Вы писали:

C>Но не самый быстрый. Знаю коммерческий аллокатор, работающий за O(1) для

C>блоков небольшого размера.

Тут дело даже не в том, что теоетически можно написать супер-аллокатор, применив какие-то инновационные супер оптимальные алгоритмы, которые в конечном счете "порвут" ГЦ. Нет, вся соль в том, что в аллокаторах можно учесть специфику конкретного приложения, благодаря которой можно реализовать крайне эффективное управление памятью, с которой не сможет сравниться никакие универсальные ГЦ и кучи. Например, очень часто можно заметить, что 90% некоторых объектов в программе удаляются (то есть становятся ненужными) в той же последовательности, что и создаются. В этом случае можно использовать супер эффективный менеджер памяти, реализованный на основе циклического буффера. Он будет работать, как О(1), причем константа будет чрезвычайно мала (порядка нескольких команд процессора). Пример такой задачи: к нам приходят сообщения, мы их накапливаем в некотором буффере и постепенно обрабатываем. После обработки сообщение нас больше не интересует. Никакой универсальный ГЦ или хип не сравнятся на этой задаче с тривиальным менеджером памяти на циклическом буффере. Вместо циклического буффера можно использовать, например, стек, в случае, если объекты чаще всего удаляются в порядке обратном созданию. Если подобные задачи покажутся слишком редкими и специфическими, то я не соглашусь с этим. Очень во многих задачах не принципиален порядок уничтожения объектов и часто можно весьма безболезненно сделать так, чтобы объекты преимущественно удалялись в удобном нам порядке. Именно тут мне видится наибольшая польза от возможности ручного управления памятью. Этой возможностью мне приходилось в свое время очень успешно пользоваться, благодаря чему производительность увеличивалась на порядки (узким местом был именно хип)
лэт ми спик фром май харт
Re[33]: плохой язык C++ :)
От: IT Россия linq2db.com
Дата: 21.03.06 13:48
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Пример такой задачи: к нам приходят сообщения, мы их накапливаем в некотором буффере и постепенно обрабатываем. После обработки сообщение нас больше не интересует. Никакой универсальный ГЦ или хип не сравнятся на этой задаче с тривиальным менеджером памяти на циклическом буффере.


Думаю, что GC на подобной задаче покажет себя очень неплохо. Остаётся лишь выяснить стоит ли те несколько процентов повышения производительности того гемороя, который придётся поиметь при разработке подобного аллокатора, вылавливании глюков и переделок в связи с не сразу замеченными косяками в архитектуре.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[34]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.03.06 14:17
Оценка:
Здравствуйте, IT, Вы писали:

V>>Пример такой задачи: к нам приходят сообщения, мы их накапливаем в некотором буффере и постепенно обрабатываем. После обработки сообщение нас больше не интересует. Никакой универсальный ГЦ или хип не сравнятся на этой задаче с тривиальным менеджером памяти на циклическом буффере.


IT>Думаю, что GC на подобной задаче покажет себя очень неплохо. Остаётся лишь выяснить стоит ли те несколько процентов повышения производительности того гемороя, который придётся поиметь при разработке подобного аллокатора, вылавливании глюков и переделок в связи с не сразу замеченными косяками в архитектуре.


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

И кстати, об удобстве. Когда-то в исходниках редактора cooled (из Midnight Commander-а) видел такой фокус по динамическому распределению памяти. Во многих функциях требовалось распределить динамически память, сохранить туда какую-нибудь строку и вернуть указатель на эту память куда-то наверх. Чтобы не заморачиваться с владением памяти и ответственностью за ее удаление, в cooled был применен простой хак. Для выделения такой памяти использовалась специальная функция (названия не помню, пусть будет get_temp_mem()), которая внутри себя владела очередью указателей (на обычном векторе). Как только требовалось память, она выделялась и указатель на нее помещался в данную очередь, после чего возвращался из get_temp_mem(). При этом, если в очереди оказывалось N+1 элементов, то самый старый из них просто удалялся из очереди, а его память освобождалось. Все это работало в предположении, что в один момент времени в программе не может жить больше, чем N указателей, возвращенных get_temp_mem().

Хак, конечно, потенциально опасный. Но, т.к. приложение однопоточное и временные указатели нигде на долго не сохранялись, то даже для небольшого N (кажется, 10) использование get_temp_mem() было вполне безопасным. Но важно, что его использование в чистом C коде было удобным, т.к. не нужно было заботиться об освобождении памяти.

Если же эту схему доработать... Например, использовать в get_temp_mem() циклический буфер и освобождать очередной указатель только, если памяти под ним недостаточно, то после некоторого количества обращений к get_temp_mem() окажется, что размеры буферов стабилизировались и новых обращений к alloc/free вообще не будет.

Применительно к C++ подобные трюки можно делать не только на уровне allocator-ов для STL-контейнеров. Но и даже на уровне собственных new/delete для отдельных классов (если объекты этих классов динамически создаются в программе слишком часто).

Ну это так, вспомнилось.
А GC действительно во многих случаях делает жизнь гораздо проще.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[33]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.03.06 15:34
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Тут дело даже не в том, что теоетически можно написать супер-аллокатор, применив какие-то инновационные супер оптимальные алгоритмы, которые в конечном счете "порвут" ГЦ. Нет, вся соль в том, что в аллокаторах можно учесть специфику конкретного приложения, благодаря которой можно реализовать крайне эффективное управление памятью, с которой не сможет сравниться никакие универсальные ГЦ и кучи.


Хм. Несомненно! Как несомнено то, что потенциально можно написать любую программу на ассемблере и добиться того, что она будет быстрее любой скомпилированной с высокоуровневого языка.

Вот только не некотором объеме оказывается, что затраты на ручную оптимизацию слишком высоки. К тому же оказывается, что для того чтобы осуществить эти оптимизации нужно обладать нехилыми знаниями в довольно тонких вопросах (вроде влияния кэша процессора и т.п.). Ну, и в итоге получается, что в 99.9% случаев GC окажется предпочтительнее.

V> Например, очень часто можно заметить, что 90% некоторых объектов в программе удаляются (то есть становятся ненужными) в той же последовательности, что и создаются. В этом случае можно использовать супер эффективный менеджер памяти, реализованный на основе циклического буффера. Он будет работать, как О(1), причем константа будет чрезвычайно мала (порядка нескольких команд процессора). Пример такой задачи: к нам приходят сообщения, мы их накапливаем в некотором буффере и постепенно обрабатываем. После обработки сообщение нас больше не интересует.


А сообщения одного размера? Ой не верю. А если разных, то твоя идея идет лесом, так как блок маленького размера будет непригоден для следующего сообщения имеющего больший размер.
В то же время ЖЦ основанный на поколениях довольно эффективно разрулит эту ситуацию. Он попросту включится когда нулевое поколение переполнится и сдвинет все живые объекты в первое поколение. Далее сообщения можно будет выделять очень долго. Когда же пройдет несколько таких циклов сдвижек и нулевое поколение станет слишком маленьким, то будет запущена сборка первого поколения в котором к тому времени уже все сообщения умрут.

Что мы имеем в итоге? А имеем довольно быстрое решиние не завязанное на частности вроде той, что блоки должны иметь одинаковый размер.

V> Никакой универсальный ГЦ или хип не сравнятся на этой задаче с тривиальным менеджером памяти на циклическом буффере.


Можно сслочку на то, где ты видел подобные решения в реальной жизни? Сколько таких случаев было?

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


В случае если нужен стек, то использовать лучше стек.
И чаще всего тут не катит. Только если объекты живут в стиле LIFO.
Так вот в ЖЦ Явы уже скоро появится такая оптимизация. Если из анализа кода будет выявлено, ссылки на объекты не выходят за иерархии вызовов, то эти объекты автоматически будут размещаться в стеке.
Ну, а в С++ и без всяких аллокаторов можно вручную размещать объекты в стеке.

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


Тут оно как. Или ты пишешь программу, или занимашся оптимизациями. Так вот ЖЦ можно рассматривать как автоматическое средство глобальной оптимизации.

V> Именно тут мне видится наибольшая польза от возможности ручного управления памятью. Этой возможностью мне приходилось в свое время очень успешно пользоваться, благодаря чему производительность увеличивалась на порядки (узким местом был именно хип)


Увеличить производительность на порядки можно просто использовав более подходящие алогоритмы. Управление памятью на основе ЖЦ и так имеет характеристику блызкую к O(1) (т.е. линейную зависимость).

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

Единственное где ЖЦ реально проигрывает ручному управлению памятью — это в условиях когда памяти катастрофически нехватает. Почти все ЖЦ-алогоритмы рассчитаны на наличие большего объема памяти чем реально требуется по минимуму.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.03.06 15:34
Оценка:
Здравствуйте, eao197, Вы писали:

E>Если это менеджер, который не выделяет память динамически, а использует заранее выделенные буффера памяти, то на ряде задач вполне себя оправдает.


Большинство реализаций ЖЦ как раз так и поступают. Так что "все украдено до нас".
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[34]: плохой язык C++ :)
От: Kluev  
Дата: 21.03.06 16:12
Оценка:
Здравствуйте, VladD2, Вы писали:

V>> Никакой универсальный ГЦ или хип не сравнятся на этой задаче с тривиальным менеджером памяти на циклическом буффере.


VD>Можно сслочку на то, где ты видел подобные решения в реальной жизни? Сколько таких случаев было?


Хотите раельных программ? Их есть у меня.

http://www.qform3d.com/en/91.html — использует рукописный (мой) менеджер памяти.

Стандартный хип на таких обьемах уже не просто тормозил, но и не мог выдать требуемое число блоков. Тогда я написал свой собственный менеджер памяти, и все стало ок.
Re[35]: плохой язык C++ :)
От: igna Россия  
Дата: 21.03.06 16:41
Оценка:
Здравствуйте, eao197, Вы писали:

E>И кстати, об удобстве. Когда-то в исходниках редактора cooled (из Midnight Commander-а) видел такой фокус по динамическому распределению памяти. Во многих функциях требовалось распределить динамически память, сохранить туда какую-нибудь строку и вернуть указатель на эту память куда-то наверх. Чтобы не заморачиваться с владением памяти и ответственностью за ее удаление, в cooled был применен простой хак. Для выделения такой памяти использовалась специальная функция (названия не помню, пусть будет get_temp_mem()), которая внутри себя владела очередью указателей (на обычном векторе). Как только требовалось память, она выделялась и указатель на нее помещался в данную очередь, после чего возвращался из get_temp_mem(). При этом, если в очереди оказывалось N+1 элементов, то самый старый из них просто удалялся из очереди, а его память освобождалось. Все это работало в предположении, что в один момент времени в программе не может жить больше, чем N указателей, возвращенных get_temp_mem().



IMHO это безобразие не стоит упоминания в разговоре про аллокаторы STL.
Re[34]: плохой язык C++ :)
От: igna Россия  
Дата: 21.03.06 16:51
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А сообщения одного размера? Ой не верю.



А вдруг? А может это и вовсе одно и то же сообщение выводимое 10000000 раз в секунду, чтобы поиздеваться над сборщиком мусора?
Re[36]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 21.03.06 18:15
Оценка:
VladD2 wrote:
> E>Если это менеджер, который не выделяет память динамически, а
> использует заранее выделенные буффера памяти, то на ряде задач вполне
> себя оправдает.
> Большинство реализаций ЖЦ как раз так и поступают. Так что "все украдено
> до нас".
Зато во время сборки ГЦ имеют обыкновение периодически сканировать
память, причем несовсемтимо с realtime'ом.

А с realtime-GC уже радужная картина с "простым увеличением указателя на
свободное место" пропадает.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[35]: плохой язык C++ :)
От: EvilChild Ниоткуда  
Дата: 21.03.06 18:28
Оценка:
Здравствуйте, Kluev, Вы писали:

VD>>Можно сслочку на то, где ты видел подобные решения в реальной жизни? Сколько таких случаев было?


K>Хотите раельных программ? Их есть у меня.


K>http://www.qform3d.com/en/91.html — использует рукописный (мой) менеджер памяти.


404 Not Found

K>Стандартный хип на таких обьемах уже не просто тормозил, но и не мог выдать требуемое число блоков. Тогда я написал свой собственный менеджер памяти, и все стало ок.


Сейчас тебе расскажут, что ты исключение подтверждающее правило
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[37]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.03.06 18:50
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Зато во время сборки ГЦ имеют обыкновение периодически сканировать

C>память, причем несовсемтимо с realtime'ом.

Какой на фиг реалтайм под Виндовс? Что ты к нему цепляшся. Ты хоть одну программу реального времени написал?

C>А с realtime-GC уже радужная картина с "простым увеличением указателя на

C>свободное место" пропадает.

Не о собых проблем с realtime-GC. Просто у оного класса алгоритмов свои особенности.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.03.06 18:50
Оценка:
Здравствуйте, Kluev, Вы писали:

K>Хотите раельных программ? Их есть у меня.


K>http://www.qform3d.com/en/91.html — использует рукописный (мой) менеджер памяти.


K>Стандартный хип на таких обьемах уже не просто тормозил, но и не мог выдать требуемое число блоков. Тогда я написал свой собственный менеджер памяти, и все стало ок.


И где гарантия, что твое решение не является в пустую потраченным временем по сровнению с банальным выбором ЖЦ?

В общем, не нужно тыкать в свой код. Ты мне тыкни во всем известные примеры промышленного использования.
Я вот видил пару оптимизаций в соей жизни. И весе они без проблем заменялись бы ЖЦ. Вот к примеру, компилятор C# (MS-ный) использует пул для каких-то тама оптимизаций. Вот только пул ничем не отличается от ЖЦ основанного на поколения с точки зрения скорости.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.03.06 18:50
Оценка:
Здравствуйте, igna, Вы писали:

I>А вдруг? А может это и вовсе одно и то же сообщение выводимое 10000000 раз в секунду, чтобы поиздеваться над сборщиком мусора?


using System;
using System.Diagnostics;

class Program
{
    static char[] _array;
    
    static void Main()
    {

        Stopwatch timer = Stopwatch.StartNew();

        for (int i = 0; i < 10000000; i++)
        {
            _array = new char[100];
            _array = null;
        }

        Console.WriteLine(timer.Elapsed);
        for (int i = 0; i <= GC.MaxGeneration; i++)
            Console.WriteLine("Количество сборок в поколнии {0}: {1}", i, GC.CollectionCount(i));

    }
}


В релизе не из под отладчика на AMD 64 3500+:
00:00:00.6544834
Количество сборок в поколнии 0: 8084
Количество сборок в поколнии 1: 0
Количество сборок в поколнии 2: 0

Еще вопросы есть?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[58]: плохой язык C++ :)
От: alexeiz  
Дата: 21.03.06 19:15
Оценка:
Здравствуйте, Kluev, Вы писали:

K>Здравствуйте, alexeiz, Вы писали:


A>>... я могу смело сказать, что С++ в Майкрософте остановился на уровне 94 года (т.е. STL'ом там и не пахнет, хорошо хоть шаблоны попадаются изредка).


K>Вот и хорошо что там не пахнет STL-ем. Запаха МФЦ вполне достаточно, а если еще и запах STL... нет это уже перебор.


Те, кто не знает стандартных библиотек, обречены на написание своих трёхколёсных велосипедов. Я где-то по этому поводу уже писал: http://rsdn.ru/Forum/Message.aspx?mid=851048&amp;only=1
Автор: alexeiz
Дата: 14.10.04
Re[36]: плохой язык C++ :)
От: alexeiz  
Дата: 21.03.06 21:15
Оценка: 9 (2) -1
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, igna, Вы писали:


I>>А вдруг? А может это и вовсе одно и то же сообщение выводимое 10000000 раз в секунду, чтобы поиздеваться над сборщиком мусора?


VD>
VD>Количество сборок в поколнии 0: 8084
VD>Количество сборок в поколнии 1: 0
VD>Количество сборок в поколнии 2: 0
VD>

VD>Еще вопросы есть?

Ещё бы! Это же один из основных сценариев, под которые .NET GC был перво-наперво соптимизирован. А потом некоторые люди вроде Дона Бокса парили мозги людям, показывая на этом сценарии, какой это великолепный сборщик мусора, и как он легко уделывает new/delete в десятки а то и более раз. Это явление даже своё имя получило: Don Box Hoax. Поищите в google groups кому не лень.
Re[37]: плохой язык C++ :)
От: WolfHound  
Дата: 21.03.06 21:57
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Ещё бы! Это же один из основных сценариев, под которые .NET GC был перво-наперво соптимизирован. А потом некоторые люди вроде Дона Бокса парили мозги людям, показывая на этом сценарии, какой это великолепный сборщик мусора, и как он легко уделывает new/delete в десятки а то и более раз. Это явление даже своё имя получило: Don Box Hoax. Поищите в google groups кому не лень.

Если ты про это
http://discuss.microsoft.com/SCRIPTS/WA-MSD.EXE?A2=ind0208a&amp;L=atl&amp;D=0&amp;P=20241
То заявления данного персонажа яйца выеденого не стоят ибо нет исходных кодов тестов. Следовательно невозможно преверить корректность тестов.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[38]: плохой язык C++ :)
От: alexeiz  
Дата: 21.03.06 22:13
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, alexeiz, Вы писали:


A>>Ещё бы! Это же один из основных сценариев, под которые .NET GC был перво-наперво соптимизирован. А потом некоторые люди вроде Дона Бокса парили мозги людям, показывая на этом сценарии, какой это великолепный сборщик мусора, и как он легко уделывает new/delete в десятки а то и более раз. Это явление даже своё имя получило: Don Box Hoax. Поищите в google groups кому не лень.

WH>Если ты про это
Я не про это, а про Дона Бокса.
Re[39]: плохой язык C++ :)
От: WolfHound  
Дата: 21.03.06 22:15
Оценка:
Здравствуйте, alexeiz, Вы писали:

WH>>Если ты про это

A>Я не про это, а про Дона Бокса.
Что про Дона Бокса? То что он лжет нужно доказать.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[40]: плохой язык C++ :)
От: alexeiz  
Дата: 21.03.06 22:25
Оценка: +1 -1
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, alexeiz, Вы писали:


WH>>>Если ты про это

A>>Я не про это, а про Дона Бокса.
WH>Что про Дона Бокса? То что он лжет нужно доказать.

Что он использовал подобные дешёвые трюки.
Re[59]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 22.03.06 03:43
Оценка:
alexeiz wrote:
> Те, кто не знает стандартных библиотек, обречены на написание своих
> трёхколёсных велосипедов. Я где-то по этому поводу уже писал:
> http://rsdn.ru/Forum/Message.aspx?mid=851048&amp;only=1
Автор: alexeiz
Дата: 14.10.04

Свои квадратные велосипеды иногда значительно лучше стандартной
библиотеки

Мой велосипед, например, поддерживает move construction и resize у
аллокаторов.

Хотя STL все равно надо знать.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[38]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 22.03.06 03:52
Оценка:
VladD2 wrote:
> C>Зато во время сборки ГЦ имеют обыкновение периодически сканировать
> C>память, причем несовсемтимо с realtime'ом.
> Какой на фиг реалтайм под Виндовс? Что ты к нему цепляшся. Ты хоть одну
> программу реального времени написал?
eao107 писал явно не про Windows, если посмотришь выше по треду.

Кстати, отсутствие задержек GC важно в играх, например. И чего-то у нас
качественных сложных игр на суперпроизводительном .NET пока не видно, за
исключением портов старых Doom/Quake'ов.

> C>А с realtime-GC уже радужная картина с "простым увеличением указателя на

> C>свободное место" пропадает.
> Не о собых проблем с realtime-GC. Просто у оного класса алгоритмов свои
> особенности.
Да? Хотите поговорить об этом?
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[39]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.06 06:31
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>eao107 писал явно не про Windows, если посмотришь выше по треду.


eao197, вообще-то.

Да, я говорил не про Windows. Там использовалась OS реального времени.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[40]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 22.03.06 06:33
Оценка: :)
eao197 wrote:
> C>eao107 писал явно не про Windows, если посмотришь выше по треду.
> eao197, вообще-то.
Чего только в 8 утра не напишешь
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[34]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 07:05
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, prVovik, Вы писали:


V>>Тут дело даже не в том, что теоетически можно написать супер-аллокатор, применив какие-то инновационные супер оптимальные алгоритмы, которые в конечном счете "порвут" ГЦ. Нет, вся соль в том, что в аллокаторах можно учесть специфику конкретного приложения, благодаря которой можно реализовать крайне эффективное управление памятью, с которой не сможет сравниться никакие универсальные ГЦ и кучи.


VD>Хм. Несомненно! Как несомнено то, что потенциально можно написать любую программу на ассемблере и добиться того, что она будет быстрее любой скомпилированной с высокоуровневого языка.

При чем тут ассемблер и высокоуровневые языки? Смысл моего топика был в том, что часто работа с памятью происходит (или может происходить) согласно некоторых предопределенных схем. Например, это может быть схема: первый создался, первый удалился. В этих условиях применение применение универсальных рааспределителей памяти (гц, или хип) может оказаться нецелесообразным.

VD>Вот только не некотором объеме оказывается, что затраты на ручную оптимизацию слишком высоки. К тому же оказывается, что для того чтобы осуществить эти оптимизации нужно обладать нехилыми знаниями в довольно тонких вопросах (вроде влияния кэша процессора и т.п.). Ну, и в итоге получается, что в 99.9% случаев GC окажется предпочтительнее.

Конь в вакууме? Какая еще ручная оптимизация? Они разные бывают.

V>> Например, очень часто можно заметить, что 90% некоторых объектов в программе удаляются (то есть становятся ненужными) в той же последовательности, что и создаются. В этом случае можно использовать супер эффективный менеджер памяти, реализованный на основе циклического буффера. Он будет работать, как О(1), причем константа будет чрезвычайно мала (порядка нескольких команд процессора). Пример такой задачи: к нам приходят сообщения, мы их накапливаем в некотором буффере и постепенно обрабатываем. После обработки сообщение нас больше не интересует.


VD>А сообщения одного размера? Ой не верю. А если разных, то твоя идея идет лесом, так как блок маленького размера будет непригоден для следующего сообщения имеющего больший размер.

Не важно какого размера блоки. Важен только их порядок создания и удаления. Есть выделенный кусок памяти и два указателя: один указывает на голову "кучи", второй на "хвост". Выделяем с "головы", удаляем с "хвоста", просто перемещая соответствующим образом указатели.

VD>В то же время ЖЦ основанный на поколениях довольно эффективно разрулит эту ситуацию.

В том то и дело, что он ее будет РАЗРУЛИВАТЬ, как в прочем и хип. А тут то и рулить нечего! Прямо как в том анектоде: "Что тут думать — прыгать надо!"

VD>Можно сслочку на то, где ты видел подобные решения в реальной жизни? Сколько таких случаев было?

Это был проект сетевого движка для MMORPG. Приходило 8к сообщений (разного размера) в секунду и управление памятью как раз было узким местом.

VD>В случае если нужен стек, то использовать лучше стек.

VD>И чаще всего тут не катит. Только если объекты живут в стиле LIFO.
Нет. В случае, если удаляется объект не на вершине, то можно запоминать удаляемый указатель и реально освобождать память уже после того, как удалится объект на вершине стека. Точно такая же стретегия и для FIFO.

VD>Ну, а в С++ и без всяких аллокаторов можно вручную размещать объекты в стеке.

Не всегда удобно. Я имел ввиду именно некоторое хранилище объектов, которое разделяется между разными участками кода.

VD>Тут оно как. Или ты пишешь программу, или занимашся оптимизациями. Так вот ЖЦ можно рассматривать как автоматическое средство глобальной оптимизации.

У ГЦ есть свои особенности, которые в одних случаях идут в "+", а в других в "-". Да ты и сам об этом далее говоришь. Важно то, что и ГЦ и хип — это УНИВЕРСАЛЬНЫЕ средства, которые понятия не имеют о логике и характере работы моей программы.

VD>Увеличить производительность на порядки можно просто использовав более подходящие алогоритмы.

Совершенно верно! Например, использовав более подходящие задаче алгоритмы управления памятью. Именно это и было сделано.

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

Если задача близка к системной, то управление памятью может стать прикладной задачей.
лэт ми спик фром май харт
Re[37]: плохой язык C++ :)
От: igna Россия  
Дата: 22.03.06 07:37
Оценка: 12 (1) -1
Здравствуйте, alexeiz, Вы писали:

A> ... Don Box Hoax. Поищите в google groups кому не лень.



. . .

My measurements shows a performance ratio of 8:1 in advantage for C#
over C++. But no C++ would allocate such small objects on the heap.
C#, on the otherhand, have no choice. And if you rewrite to proper C++
code you get a ratio of 42:1 -that is C++ is 42 times (!) quicker than
C#. So I enlarged the test with a) object specific new/delete op and
b) with a object of approx size 32 kb. The meassurements are found
below — and they are quiet astonishing: C++ outperforms C# in every
aspect, only with one exception: the Don Box demo!!!

. . .

(http://discuss.microsoft.com/SCRIPTS/WA-MSD.EXE?A2=ind0208a&amp;L=atl&amp;P=20241)

Re[36]: плохой язык C++ :)
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 22.03.06 07:53
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Еще вопросы есть?


Я, в общем, с тобой согласн, но в примере демонстрируется идеальный случай.
http://www.smalltalk.ru | << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[39]: плохой язык C++ :)
От: igna Россия  
Дата: 22.03.06 08:10
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Кстати, отсутствие задержек GC важно в играх, например.



Или такой пример: Случайно выключил телефон во время процесса подозрительно напоминающего сборку мусора, результат — пропажа кое-какой информации. Да, понимаю, программа не должна была разрешать выключение в это время; но это пример того, как уменьшая вероятность ошибок программиста в одном месте использование GC увеличивает ее в другом.
Re[39]: плохой язык C++ :)
От: z00n  
Дата: 22.03.06 08:22
Оценка: 26 (1) +1
Здравствуйте, Cyberax, Вы писали:

C>Кстати, отсутствие задержек GC важно в играх, например. И чего-то у нас

C>качественных сложных игр на суперпроизводительном .NET пока не видно, за
C>исключением портов старых Doom/Quake'ов.

Старая мантра. Для игр достаточно самых примитивных GC:

Tim Sweeney:

Garbage collection performance in games:
Though an Unreal Engine 3 game can easily consume 512MB memory (on console) or up to 2GB (on PC, in the editing tools), less than 10% of that memory consists of data that contains pointers. The rest is bulk binary resources — like texture maps, sounds, animations, which don't require scanning for references.
50MB of data is well within the range of a mark-and-sweep garbage collector taking a few milliseconds within a game running at 30 frames per second. This is what we do. Realtime garbage collection is another possibility, but we didn't want to try to implement that within a primarily C++ engine.
Garbage collecting memory:
I do believe this is completely practical as the sole memory management solution, even in a realtime application like a game.

Re[36]: плохой язык C++ :)
От: Kluev  
Дата: 22.03.06 08:31
Оценка: +1 -1
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Kluev, Вы писали:


K>>Хотите раельных программ? Их есть у меня.


K>>http://www.qform3d.com/en/91.html — использует рукописный (мой) менеджер памяти.


K>>Стандартный хип на таких обьемах уже не просто тормозил, но и не мог выдать требуемое число блоков. Тогда я написал свой собственный менеджер памяти, и все стало ок.


VD>И где гарантия, что твое решение не является в пустую потраченным временем по сровнению с банальным выбором ЖЦ?

А где противоположная гарантия, что ЖЦ лучше моего решения? Напиши аналогичную программу на ЖЦ и сравним.


VD>В общем, не нужно тыкать в свой код.

А в какой надо тыкать, в чужой?

VD>Я вот видил пару оптимизаций в соей жизни. И весе они без проблем заменялись бы ЖЦ. Вот к примеру, компилятор C# (MS-ный) использует пул для каких-то тама оптимизаций. Вот только пул ничем не отличается от ЖЦ основанного на поколения с точки зрения скорости.


Свежо предание, но верится с трудом.
Re[38]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 09:03
Оценка:
Здравствуйте, igna, Вы писали:

I>

I>My measurements shows a performance ratio of 8:1 in advantage for C# over C++. But no C++ would allocate such small objects on the heap. C#, on the otherhand, have no choice. And if you rewrite to proper C++ code you get a ratio of 42:1 -that is C++ is 42 times (!) quicker than C#. So I enlarged the test with a) object specific new/delete op and b) with a object of approx size 32 kb. The meassurements are found below — and they are quiet astonishing: C++ outperforms C# in every aspect, only with one exception: the Don Box demo!!!

Еще раз: Данное заявление без исходных кодов ничего не стоит. То есть АБСОЛЮТНО НИЧЕГО.
Особенно на фоне выделеного... этот разоблачитель сравнивает теплое с мягким и при этом не знает о существовании value типов.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[35]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 09:03
Оценка:
Здравствуйте, prVovik, Вы писали:

VD>>Можно сслочку на то, где ты видел подобные решения в реальной жизни? Сколько таких случаев было?

V>Это был проект сетевого движка для MMORPG. Приходило 8к сообщений (разного размера) в секунду и управление памятью как раз было узким местом.
8 тысяч коротко живущих объектов в секунду... да ГЦ это даже не заметит. Это для него вобще не цифра.
Причем если для обычной кучи объекты разного размера приводят к фрагментации и серьезному замедлению работы то мусорщику на это начхать.
Болие того алгоритм мусорщика таков что при сборке мусора время тратится ТОЛЬКО на живые объекты. А в твоем случае подавляющие большинство объектов будут мусором.
Те это вобще идеальные условия для мусорщика.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[40]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 09:23
Оценка:
Здравствуйте, igna, Вы писали:

I>Или такой пример: Случайно выключил телефон во время процесса подозрительно напоминающего сборку мусора, результат — пропажа кое-какой информации. Да, понимаю, программа не должна была разрешать выключение в это время; но это пример того, как уменьшая вероятность ошибок программиста в одном месте использование GC увеличивает ее в другом.

Я думаю там были какието другие тормоза. Ибо я не верю что сборку мусора можно заметить на глаз даже на телефоне.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[39]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 09:23
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Кстати, отсутствие задержек GC важно в играх, например.

Бред. Сборки нулевого и первого поколений никто не заметит ибо они не приведут к выпадению кадров. А сборка второго поколения приведет к выпадению одного кадра раз в несколько минут. И это тоже никто не заметит.
C>И чего-то у нас качественных сложных игр на суперпроизводительном .NET пока не видно, за исключением портов старых Doom/Quake'ов.
Вот только про разработчиков игр не надо. Я с ними очень не мало общался. В подавляющем большинстве случаев это просто жутчайшие консерваторы готовые удавится за пол процента производительности.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[36]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.06 09:26
Оценка: -1
Здравствуйте, WolfHound, Вы писали:

V>>Это был проект сетевого движка для MMORPG. Приходило 8к сообщений (разного размера) в секунду и управление памятью как раз было узким местом.

WH>8 тысяч коротко живущих объектов в секунду... да ГЦ это даже не заметит. Это для него вобще не цифра.

Как я понимаю, речь шла не о 8K объектов в секунду, а об обработке 8K сообщений в секунду. Еще не известно, сколько и чего создавалось во время обработки одного сообщения. А обработка 8K сообщений в секунду в сетевом приложении это не кисло.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[36]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 09:29
Оценка: 12 (1) :)
Здравствуйте, WolfHound, Вы писали:

VD>>>Можно сслочку на то, где ты видел подобные решения в реальной жизни? Сколько таких случаев было?

V>>Это был проект сетевого движка для MMORPG. Приходило 8к сообщений (разного размера) в секунду и управление памятью как раз было узким местом.
WH>8 тысяч коротко живущих объектов в секунду... да ГЦ это даже не заметит. Это для него вобще не цифра.
WH>Причем если для обычной кучи объекты разного размера приводят к фрагментации и серьезному замедлению работы то мусорщику на это начхать.
WH>Болие того алгоритм мусорщика таков что при сборке мусора время тратится ТОЛЬКО на живые объекты. А в твоем случае подавляющие большинство объектов будут мусором.
WH>Те это вобще идеальные условия для мусорщика.
Проблема в том, что это была не целая программа, а библиотека, от которой требовалось минимальная загрузка процессора. А работа с памятью была узким местом. Далее, в моем случае библиотека использовала фиксированные небольшой буфер памяти, и не "отжирала" память у основной программы — сервера (а она ему ой как была нужна, мморпг все-таки!!!). Плюс была применена очень эффективная оптимизация этого менеджера, когда при освобождении всех объектов, то есть когда указатель на хвост догонял указатель на голову, оба этих указателей сбрасывались в начало буфера. Благодаря этому бОльшая часть буфера все время находилась в файле подкачки и извлекалась оттуда только в случае "затора" сообщений.

По поводу большенства мертвых объектов. Доставала объекты оснавная программа (сервер), а не сетевая библиотека. И когда сервер соизволит достать очередное сообщение — это только серверу известно, и сколько поколений переживут сообщения в буффере тоже не понятно. Далее, подумай про объемы: 8к сообщений в секунду, каждое из которых в среднем по 4 килобайта. Получаем 32 мегабайта в секунду. Некислая я скажу нагрузка на ГЦ будет — дефрагментация получится очень "вкусной" операцией
лэт ми спик фром май харт
Re[40]: плохой язык C++ :)
От: Дарней Россия  
Дата: 22.03.06 09:40
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

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


но при этом рынок переполнен играми, которые глючат, тормозят на ровном месте и жрут память вагонами.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[41]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 09:53
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>Здравствуйте, WolfHound, Вы писали:


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


Д>но при этом рынок переполнен играми, которые глючат, тормозят на ровном месте и жрут память вагонами.


И о чем это говорит?
лэт ми спик фром май харт
Re[37]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 09:56
Оценка: +1
Здравствуйте, eao197, Вы писали:

E>Как я понимаю, речь шла не о 8K объектов в секунду, а об обработке 8K сообщений в секунду. Еще не известно, сколько и чего создавалось во время обработки одного сообщения.

Да какая разница? Это всеравно будут коротко живущие объекты.
E>А обработка 8K сообщений в секунду в сетевом приложении это не кисло.
И как сеть связана с мусорщиком? Вобще говоря сеть по сравнению с мусорщиком тормоз просто жутчайший.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[37]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 09:56
Оценка: +1
Здравствуйте, prVovik, Вы писали:

V>Проблема в том, что это была не целая программа, а библиотека, от которой требовалось минимальная загрузка процессора. А работа с памятью была узким местом.

И что? Скорость работы с памятью
V>Далее, в моем случае библиотека использовала фиксированные небольшой буфер памяти, и не "отжирала" память у основной программы — сервера (а она ему ой как была нужна, мморпг все-таки!!!).
Ой... MMORPG все упали ниц... да на любой сервер прилжений в сердней конторе нагрузка не меньше. И ничего их пишут и на .NET и на мение шутсрой Жабе...
V>Плюс была применена очень эффективная оптимизация этого менеджера, когда при освобождении всех объектов, то есть когда указатель на хвост догонял указатель на голову, оба этих указателей сбрасывались в начало буфера. Благодаря этому бОльшая часть буфера все время находилась в файле подкачки и извлекалась оттуда только в случае "затора" сообщений.
А Мусорщик оптимизирует нулевое поколение под кешь процессора... И кто быстрее?
Кстати а что произойдет если буфера таки не хватит?

V>По поводу большенства мертвых объектов. Доставала объекты оснавная программа (сервер), а не сетевая библиотека. И когда сервер соизволит достать очередное сообщение — это только серверу известно, и сколько поколений переживут сообщения в буффере тоже не понятно. Далее, подумай про объемы: 8к сообщений в секунду, каждое из которых в среднем по 4 килобайта. Получаем 32 мегабайта в секунду.

Из этих цифр следует что сервер весьма шустро выберает сообщения. Иначе у вас вся память бы забилась...
V>Некислая я скажу нагрузка на ГЦ будет — дефрагментация получится очень "вкусной" операцией
Угу... вот только мусорщик не дураки писали... если в нулевом поколении скопилось много живых объктов то весь блок просто перевидут в первое поколение без дефрагментации... А под нулевое поколение выделят новый блок памяти.
Причем если верить тебе то заторы у вас случались редко...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[42]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 09:57
Оценка: :))
Здравствуйте, prVovik, Вы писали:

Д>>но при этом рынок переполнен играми, которые глючат, тормозят на ровном месте и жрут память вагонами.

V>И о чем это говорит?
Я бы сказал вот только мне после этого придется себя забанить...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[42]: плохой язык C++ :)
От: Дарней Россия  
Дата: 22.03.06 10:00
Оценка:
Здравствуйте, prVovik, Вы писали:

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


Д>>но при этом рынок переполнен играми, которые глючат, тормозят на ровном месте и жрут память вагонами.


V>И о чем это говорит?


это говорит о том, что излишний консерватизм до добра не доводит.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[40]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 22.03.06 10:04
Оценка:
z00n wrote:
> C>Кстати, отсутствие задержек GC важно в играх, например. И чего-то у нас
> C>качественных сложных игр на суперпроизводительном .NET пока не видно, за
> C>исключением портов старых Doom/Quake'ов.
> Старая мантра. Для игр достаточно самых примитивных GC
Хороший пример, кстати. В U3 они используют GC для UScript'а и некоторых
игровых объектов, что вполне логично.

А вот дорогими ресурсами (файлы, текстуры и т.п.) управляют
непосредственно из С++. Дорогие мутирующие операции тоже производятся в
С++ без вмешательства GC.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[41]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 22.03.06 10:08
Оценка: 1 (1)
Cyberax wrote:
> А вот дорогими ресурсами (файлы, текстуры и т.п.) управляют
> непосредственно из С++. Дорогие мутирующие операции тоже производятся в
> С++ без вмешательства GC.
И еще:

UnrealScript uses a simple recursive mark-and-sweep garbage collector
which is only executed when changing levels, along with some
special-case code to garbage-collect destroyed actors during
gameplay.

Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[38]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.06 10:18
Оценка: +1 -1
Здравствуйте, WolfHound, Вы писали:

WH>Да какая разница? Это всеравно будут коротко живущие объекты.

E>>А обработка 8K сообщений в секунду в сетевом приложении это не кисло.
WH>И как сеть связана с мусорщиком? Вобще говоря сеть по сравнению с мусорщиком тормоз просто жутчайший.

Смотря какая сеть.

А вообще я говорил о том, что обработка 8K сообшений в секунду, будь это в real-time приложении, это было бы очень серьезно. Ведь на обработку каждого сообщения требовалось бы не больше 125 микросекунд. А ведь обработка -- это не только new/delete.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[38]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 10:35
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, prVovik, Вы писали:


V>>Плюс была применена очень эффективная оптимизация этого менеджера, когда при освобождении всех объектов, то есть когда указатель на хвост догонял указатель на голову, оба этих указателей сбрасывались в начало буфера. Благодаря этому бОльшая часть буфера все время находилась в файле подкачки и извлекалась оттуда только в случае "затора" сообщений.

WH>А Мусорщик оптимизирует нулевое поколение под кешь процессора...
Звучит впечатляюще

WH>И кто быстрее?

Конечно, быстрее будет фиксированный буфер небольшого размера с последовательным доступом. Могут быть сомнения?

WH>Кстати а что произойдет если буфера таки не хватит?

Сервер перестанет принимать новые сообщения, пока не разгребет старые. Пользователей "лаганет".

WH>Угу... вот только мусорщик не дураки писали... если в нулевом поколении скопилось много живых объктов то весь блок просто перевидут в первое поколение без дефрагментации... А под нулевое поколение выделят новый блок памяти.

*мечтательно* эх, а была бы память бесконечной, ее бы тогда вообще не надо было бы освобождать
лэт ми спик фром май харт
Re[43]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 10:36
Оценка:
Здравствуйте, Дарней, Вы писали:


Д>излишний консерватизм до добра не доводит.


да, с этим утверждением трудно поспорить
лэт ми спик фром май харт
Re[39]: плохой язык C++ :)
От: igna Россия  
Дата: 22.03.06 10:43
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>... этот разоблачитель сравнивает теплое с мягким ...



Это да. Но то, что на C# можно писать не создавая мусора, не отменяет того, что библиотека .NET Framework иногда создает его там, где это не является необходимым; например StreamReader.ReadLine при каждом вызове возвращает новый String, и в классе StreamReader нет метода читающего в имеющийся StreamBuilder.
Re[41]: плохой язык C++ :)
От: igna Россия  
Дата: 22.03.06 10:54
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Я думаю там были какието другие тормоза. Ибо я не верю что сборку мусора можно заметить на глаз даже на телефоне.



Может быть, но было так: Пытаюсь сохранить новую запись, нет места. Удаляю некоторые ненужные записи и пытаюсь сохранить еще раз. Телефон "зависает" секунд на 10, потом сохраняет запись. Наблюдал такое поведение несколько раз. Siemens M55.
Re[39]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 10:54
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>eao107 писал явно не про Windows, если посмотришь выше по треду.


А про что? Про Линукс? Про переносимый софт? Ды эти случаи тоже по определению не могут быть реалтаймными.

C>Кстати, отсутствие задержек GC важно в играх, например.


Кстати, отсуствие задержек видимых человеком и требования к СРВ — это разные вещи.
Современные ЖЦ, особенно дотнетный, отлично подходят для интерактивных задач.

C> И чего-то у нас

C>качественных сложных игр на суперпроизводительном .NET пока не видно, за
C>исключением портов старых Doom/Quake'ов.

Их не видит, тот кто не хчет. Скачай Арену понляди.

>> C>А с realtime-GC уже радужная картина с "простым увеличением указателя на

>> C>свободное место" пропадает.
>> Не о собых проблем с realtime-GC. Просто у оного класса алгоритмов свои
>> особенности.
C>Да? Хотите поговорить об этом?

Не с тобой.
В общем, старая заезжаенная пластинк уже надоела. В стоый раз повторяются "аргументы" которые не выдерживают даже малейшей критики. Мне это попросту не интересно. Счастливо оставаться со своими фобиями наедине.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[40]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 10:54
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Cyberax, Вы писали:


C>>Кстати, отсутствие задержек GC важно в играх, например.

WH>Бред. Сборки нулевого и первого поколений никто не заметит ибо они не приведут к выпадению кадров. А сборка второго поколения приведет к выпадению одного кадра раз в несколько минут. И это тоже никто не заметит.

Реально и сборка второго поколения не страшна, так как может производиться с помощью Concurrent GC.

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


И что самое забавное порождающие при этом монстров вроде ФИРА.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 10:54
Оценка:
Здравствуйте, Kluev, Вы писали:

K>А где противоположная гарантия, что ЖЦ лучше моего решения? Напиши аналогичную программу на ЖЦ и сравним.


Зачем же программу? Достаточно корректных тестов. Я их пописал не много, и сейчас уже вряд ли буду заниматься такой фигней, как совственные системы управления памятью.

Кстати, можешь попробовать вместо своего чуда техники просто вставить мой QuickHeap. Будет любопытно...

VD>>В общем, не нужно тыкать в свой код.

K>А в какой надо тыкать, в чужой?

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

VD>>Я вот видил пару оптимизаций в соей жизни. И весе они без проблем заменялись бы ЖЦ. Вот к примеру, компилятор C# (MS-ный) использует пул для каких-то тама оптимизаций. Вот только пул ничем не отличается от ЖЦ основанного на поколения с точки зрения скорости.


K>Свежо предание, но верится с трудом.


А ты не верь. Ты проверь. Я вот проврял. И если памяти достаточно, то ЖЦ обычно выглядит очень не плохо.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 10:54
Оценка:
Здравствуйте, alexeiz, Вы писали:

A>Ещё бы! Это же один из основных сценариев, под которые .NET GC был перво-наперво соптимизирован.


Цитирую вопрос:

А может это и вовсе одно и то же сообщение выводимое 10000000 раз в секунду, чтобы поиздеваться над сборщиком мусора?


A> А потом некоторые люди вроде Дона Бокса парили мозги людям, показывая на этом сценарии, какой это великолепный сборщик мусора, и как он легко уделывает new/delete в десятки а то и более раз. Это явление даже своё имя получило: Don Box Hoax. Поищите в google groups кому не лень.


Понимаш ли, Дон Бокс человек уважаемый и просто так свое имя позорить не будет. Он говорит то, что есть. Единственное разумное возражение тут может быть одно. При ручном управлении памятью ее зачастую можно занимать в секе. Это действително более эффективно. Но и тут есть что сказать. 1. Вэлю-типы в дотнете тоже позволяют избавиться от динамической памяти. 2. Скоро появятся промышленные реализации рантаймов автоматически размещающие объекты в стеке.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 10:54
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

VD>>Еще вопросы есть?


ANS>Я, в общем, с тобой согласн, но в примере демонстрируется идеальный случай.


Прошу обратить внимание на то, что это ответ на реплику:

VD>А сообщения одного размера? Ой не верю.
А вдруг? А может это и вовсе одно и то же сообщение выводимое 10000000 раз в секунду, чтобы поиздеваться над сборщиком мусора?


Оппоненты откровенно неразбираются в сути вопроса и всю свою логику строют на основе совбственных фобий и предубеждений.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 10:54
Оценка:
Здравствуйте, prVovik, Вы писали:

V>При чем тут ассемблер и высокоуровневые языки?


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

V>Смысл моего топика был в том, что часто работа с памятью происходит (или может происходить) согласно некоторых предопределенных схем. Например, это может быть схема: первый создался, первый удалился. В этих условиях применение применение универсальных рааспределителей памяти (гц, или хип) может оказаться нецелесообразным.


Пойми. И GC и неуправляемые коучи пишут не идеоты. И если у меня скоростная характеристика близка к O(1), то хоть в лепешку разбейся но серьезного выигрыша ты неполучишь.

Знаешь, как легче всего получить выигрыш от собственной реализации кучи?
Просто не задействовать в ней защиту от многопоточного доступу. Блокировки (даже самые легкие) отнимают основное время при выделении памяти.


В ЖЦ, выделение памяти в них деалется просым инкрементом. И основные затраты тут тоже на блокировку.

V>Это был проект сетевого движка для MMORPG. Приходило 8к сообщений (разного размера) в секунду и управление памятью как раз было узким местом.


Так, все! На этом мы пожалуй закончим. В сумашедший дом я не играю.
Читай классику: Оптимизация – ваш злейший враг
Автор(ы): Dr. Joseph M. Newcomer
Дата: 25.06.2005
В этом эссе доктор Ньюкамер делится своим опытом и соображениями по поводу преждевременной, несвоевременной или неактуальной оптимизации, призывая программистов избежать подобных ошибок.

Бнин, свой хип для оптимизации 8 000 выделений объектов в секунду, да еще в программе которая по определению не предвявлет особых требований к производительности.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 10:54
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Далее, в моем случае библиотека использовала фиксированные небольшой буфер памяти,


Ага. На 8 000 сообщений.

Пойми, что все твои рссуждения о скорости выделения памяти — это чистой воды фобии. Если бы писал свою программу на дотенте, то ты бы и не заметил никаких проблем.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: плохой язык C++ :)
От: igna Россия  
Дата: 22.03.06 11:05
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Прошу обратить внимание на то, что это ответ на реплику:


VD>А сообщения одного размера? Ой не верю.
>А вдруг? А может это и вовсе одно и то же сообщение выводимое 10000000 раз в секунду, чтобы поиздеваться над сборщиком мусора?


VD>Оппоненты откровенно неразбираются в сути вопроса и всю свою логику строют на основе совбственных фобий и предубеждений.



Понравилось? Я рад. А может это процитированное пару раз сообщение было написано, чтобы поиздеваться не над сборщиком мусора?
Re[39]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 11:05
Оценка:
Здравствуйте, prVovik, Вы писали:

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

Не факт.
V>Могут быть сомнения?
Если буфер выпал из кеша процессора то могут..., а ты там еще про своп говорил...

V>Сервер перестанет принимать новые сообщения, пока не разгребет старые. Пользователей "лаганет".

И как часто он лагает?

V>*мечтательно* эх, а была бы память бесконечной, ее бы тогда вообще не надо было бы освобождать

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

Вобще 3 поколения нужны для того чтобы эффективно работать в условиях когда существует большое колличество объектов с коротким временем жизни. Большинство объектов умрет в нулевом поколении. В первое поколение попадают долгоживущие объекты и случайно выжившие короткоживущие объекты(они использовались в момент когда произошла сборка нулевого поколения). К моменту сборки первого поколения вероятность того что кто-то ссылается на короткоживущие объекты практичеки равна нулю. Те во второе поколение попадут только долго живущие объекты.
Таким образом сборка нулевого покаления отрабатывает просто мнгновенно(особенно если учесть то что все в кеше процессора), первое поколение используется как буфер для случайно уцелевших объектов, а во втором поколении сидят объекты с длинным временем жизни... их туда сослали чтобы по ногами не путались.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[41]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 11:15
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Реально и сборка второго поколения не страшна, так как может производиться с помощью Concurrent GC.

Кстати ИМХО лучший вариант для мягкого реалтайма типа игр это собирать нулевое и первое поколение обычным мусорщиком, а второе конкурентным.

VD>И что самое забавное порождающие при этом монстров вроде ФИРА.

Я его на своей машине так и не смог запустить... хотя машина зверь... четвертая квака летает. Может конечно компакт кривой попался...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[36]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 11:15
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, prVovik, Вы писали:

V>>При чем тут ассемблер и высокоуровневые языки?
VD>При том, что ручное уравление памятью ничем не отличается от ручного управления кодогенерацией.
Хм... Ничего не понял. А что общего между кодогенерацией и алгоритмами управления памятью?

VD>Пойми. И GC и неуправляемые коучи пишут не идеоты.

Не сомневаюсь в этом. Но они и понятия не имеют о МОЕЙ задаче.

VD>И если у меня скоростная характеристика близка к O(1), то хоть в лепешку разбейся но серьезного выигрыша ты неполучишь.

Неужели? А если константа будет час?

VD>Знаешь, как легче всего получить выигрыш от собственной реализации кучи?

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

VD>Просто не задействовать в ней защиту от многопоточного доступу. Блокировки (даже самые легкие) отнимают основное время при выделении памяти.

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

VD>В ЖЦ, выделение памяти в них деалется просым инкрементом. И основные затраты тут тоже на блокировку.

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

V>>Это был проект сетевого движка для MMORPG. Приходило 8к сообщений (разного размера) в секунду и управление памятью как раз было узким местом.

VD>Так, все! На этом мы пожалуй закончим. В сумашедший дом я не играю.
Ты о чем?

VD>Читай классику: Оптимизация – ваш злейший враг
Автор(ы): Dr. Joseph M. Newcomer
Дата: 25.06.2005
В этом эссе доктор Ньюкамер делится своим опытом и соображениями по поводу преждевременной, несвоевременной или неактуальной оптимизации, призывая программистов избежать подобных ошибок.

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

VD>Бнин, свой хип для оптимизации 8 000 выделений объектов в секунду, да еще в программе которая по определению не предвявлет особых требований к производительности.

Во-первых, требования к производительности были очень жесткими. Во-вторых, читай выше, не хочу повторяться.
лэт ми спик фром май харт
Re[40]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 11:18
Оценка:
Здравствуйте, igna, Вы писали:

I>Это да. Но то, что на C# можно писать не создавая мусора, не отменяет того, что библиотека .NET Framework иногда создает его там, где это не является необходимым; например StreamReader.ReadLine при каждом вызове возвращает новый String, и в классе StreamReader нет метода читающего в имеющийся StreamBuilder.

По сравнения с чтением с диска...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[38]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 11:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, prVovik, Вы писали:


V>>Далее, в моем случае библиотека использовала фиксированные небольшой буфер памяти,


VD>Ага. На 8 000 сообщений.

Что смешного?
лэт ми спик фром май харт
Re[37]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 11:23
Оценка: +1 :)
Здравствуйте, prVovik, Вы писали:

VD>>Пойми. И GC и неуправляемые коучи пишут не идеоты.

V>Не сомневаюсь в этом. Но они и понятия не имеют о МОЕЙ задаче.
Вот только главный прикол в том что ГЦ как будто специально оптимизировали под твою задачу.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[41]: плохой язык C++ :)
От: igna Россия  
Дата: 22.03.06 11:27
Оценка:
Здравствуйте, WolfHound, Вы писали:


I>>... StreamReader.ReadLine при каждом вызове возвращает новый String, и в классе StreamReader нет метода читающего в имеющийся StreamBuilder.


WH> По сравнения с чтением с диска...



Кто сказал? Почему с диска?
Re[42]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 11:38
Оценка:
Здравствуйте, igna, Вы писали:

I>Кто сказал? Почему с диска?

Ну еще может быть из сети... да еще и через дешифратор с декомпрессором...
Короче ИМХО случаи где можно заметить создание этой строки настолько редки что создатели фреймворка решили с этим не заморачиваться. К тому же если у нас ReadLine то поток текстовый... а текстовые данные в критических к производительности местах обычно не гоняют. Ну не сочетается текст с выжиманием производительности. Ну никак.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[37]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.06 11:41
Оценка:
Здравствуйте, eao197, Вы писали:

E>Как я понимаю, речь шла не о 8K объектов в секунду, а об обработке 8K сообщений в секунду. Еще не известно, сколько и чего создавалось во время обработки одного сообщения. А обработка 8K сообщений в секунду в сетевом приложении это не кисло.


2VladD2: а минус за что? С чем конкретно ты не согласен?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[40]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 11:42
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, prVovik, Вы писали:


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

WH>Не факт.
V>>Могут быть сомнения?
WH>Если буфер выпал из кеша процессора то могут..., а ты там еще про своп говорил...
А ничего, что ГЦ старается "сожрать" как можно больше памяти, она что, типа вся целиком в кеше помещается и никогда не выпадает?
А про своп я говорил, чтобы подчеркнуть, что из всего буфера активно используется только маленькая его часть, которая, кстати, и будет находиться в кеше.

V>>Сервер перестанет принимать новые сообщения, пока не разгребет старые. Пользователей "лаганет".

WH>И как часто он лагает?
А хз
Это уже были не мои проблемы.

V>>*мечтательно* эх, а была бы память бесконечной, ее бы тогда вообще не надо было бы освобождать

WH>Память будет освобождена при сборке первого поколения, а оно собирается гораздо реже чем нулевое и к томц времене с большой вероятностью весь блок станет мусором те будет просто помечен как свободный, а если там и останутся живые объекты то скопировать несколько килобайт для современного железа это вобще не проблема.

WH>Вобще 3 поколения нужны для того чтобы эффективно работать в условиях когда существует большое колличество объектов с коротким временем жизни. Большинство объектов умрет в нулевом поколении. В первое поколение попадают долгоживущие объекты и случайно выжившие короткоживущие объекты(они использовались в момент когда произошла сборка нулевого поколения). К моменту сборки первого поколения вероятность того что кто-то ссылается на короткоживущие объекты практичеки равна нулю. Те во второе поколение попадут только долго живущие объекты.

WH>Таким образом сборка нулевого покаления отрабатывает просто мнгновенно(особенно если учесть то что все в кеше процессора), первое поколение используется как буфер для случайно уцелевших объектов, а во втором поколении сидят объекты с длинным временем жизни... их туда сослали чтобы по ногами не путались.
Обрати внимание. При реализации этой стратегии принималась во внимение некоторая частность о характере управления памятью, а именно, утверждение, что чем раньше был создан объект, тем больше вероятность, что он скоро будет уничтожен. И нетовский ГЦ был создан с ориентировкой именно на эту частность. Да, согласен, что это наиболее распространенная схема управления памятью (кстати к другим ресурсам это уже относится в меньшей степени), и высокая производительность этого ГЦ как раз и обусловлена на заточку под эту схему управления памятью.

Все хорошо, когда программа укладывается в стандартные рамки нетовского ГЦ LIFO (последним создался — первым удалишься — LCFD скорее ), все замечательно работает. Примеры супер-быстрой работы такого ГЦ на схеме использования памятью, на которую он расчитан, неоднократно приводились. Это, лишь, доказывает, что код, занимающийся управлением памятью должен знать о характере ее использования. Но случаи бывают разные. Вот помню, как Сергей Губанов как-то приводил пример, в котором "убогий" обероновский ГЦ "рвал" дотнетовский. А все потому, что схемы использования памяти была не LIFO (LCFD), а FIFO (FCFD). А вот если бы дотнетовский гц был ориентированн на последнюю схему, все было бы иначе . Это я к тому, что не бывает серебрянных пуль, которые хорошо работают во всех случаях. Для каждого супостата нужен свой снаряд
лэт ми спик фром май харт
Re[41]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 12:24
Оценка: +1
Здравствуйте, prVovik, Вы писали:

V>А ничего, что ГЦ старается "сожрать" как можно больше памяти, она что, типа вся целиком в кеше помещается и никогда не выпадает?

Размеры нулевого и первого поколений фиксированы. Растет второе поколение в котором сидят долгоживущие объекты.
Сообщения из твоей задачи туда не попадут.
V>А про своп я говорил, чтобы подчеркнуть, что из всего буфера активно используется только маленькая его часть, которая, кстати, и будет находиться в кеше.
Те делаем вывод что сервер очень оперативно выгребал сообщения. А заторы были очень редки. Так?

V>Обрати внимание. При реализации этой стратегии принималась во внимение некоторая частность о характере управления памятью, а именно, утверждение, что чем раньше был создан объект, тем больше вероятность, что он скоро будет уничтожен. И нетовский ГЦ был создан с ориентировкой именно на эту частность. Да, согласен, что это наиболее распространенная схема управления памятью (кстати к другим ресурсам это уже относится в меньшей степени), и высокая производительность этого ГЦ как раз и обусловлена на заточку под эту схему управления памятью.

Причем твоя задаче прекрасно в эту схему укладывается. А другими ресурсами в .NET релят ручками. Причем лично мне using + IDisposible хватало всегда.

V>Все хорошо, когда программа укладывается в стандартные рамки нетовского ГЦ LIFO (последним создался — первым удалишься — LCFD скорее ), все замечательно работает. Примеры супер-быстрой работы такого ГЦ на схеме использования памятью, на которую он расчитан, неоднократно приводились. Это, лишь, доказывает, что код, занимающийся управлением памятью должен знать о характере ее использования. Но случаи бывают разные. Вот помню, как Сергей Губанов как-то приводил пример, в котором "убогий" обероновский ГЦ "рвал" дотнетовский. А все потому, что схемы использования памяти была не LIFO (LCFD), а FIFO (FCFD).

Ссылку пожалуйста. Чтото мне мерещится что когда к этому тесту добавили 1000000 вечно живущих объектов (те создали болие или мение реальные условия) оберон просто умер.
Короче не работающая программа можер работать сколь угодно быстро...
V>А вот если бы дотнетовский гц был ориентированн на последнюю схему, все было бы иначе . Это я к тому, что не бывает серебрянных пуль, которые хорошо работают во всех случаях. Для каждого супостата нужен свой снаряд
Бывают посоребренные пули которые хорошо работают в подавляющем большенстве случаев. И для твоего супостата эти пули прекрасно подходят.
Единственный случай когда я отказался от услуг ГЦ в .NET это был бинарный дифф для того чтобы резать на куски бэкап быза RSDN'а. Но там сценарий работы был таким: В начале работы создать несколько миллионов одинаковых объектов, а в конце работы их все удалить. Для этого я воспользовался массивом value типов.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[42]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 12:43
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Те делаем вывод что сервер очень оперативно выгребал сообщения. А заторы были очень редки. Так?

Так, но не забывай, что само по себе время жизни объекта мало что значит. Важно время жизни относительно других объектов. Я не знаю, что именно делал сервер во время обработки каждого сообщения (а делать он мог много чего ), но факт есть факт: сообщения жили по принципу первое создалось, первое удалилось.
лэт ми спик фром май харт
Re[42]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 13:02
Оценка:
Здравствуйте, igna, Вы писали:

I>Может быть, но было так: Пытаюсь сохранить новую запись, нет места. Удаляю некоторые ненужные записи и пытаюсь сохранить еще раз. Телефон "зависает" секунд на 10, потом сохраняет запись. Наблюдал такое поведение несколько раз. Siemens M55.


Siemens M55 вроде как на Symbian OS живет. И телефонная книга у него не на Яве значит.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 13:02
Оценка:
Здравствуйте, prVovik, Вы писали:

V>По поводу большенства мертвых объектов. Доставала объекты оснавная программа (сервер), а не сетевая библиотека. И когда сервер соизволит достать очередное сообщение — это только серверу известно, и сколько поколений переживут сообщения в буффере тоже не понятно. Далее, подумай про объемы: 8к сообщений в секунду, каждое из которых в среднем по 4 килобайта. Получаем 32 мегабайта в секунду. Некислая я скажу нагрузка на ГЦ будет — дефрагментация получится очень "вкусной" операцией


Ну ты заливаешь! Ты прежде чем токое нести узнал бы какова средняя пропускная способность у 100 мегабитной сети. Я тебе как краевед скажу, что где-то оголо 10 мег в секунду.

На вашей игрушке можно смело писать звучные лозунги вроде:

Мы работаем на будущее!!!... Минимальные требования для сетевой игры Gigabit Ethernet!


А вот для ЖЦ это тем не менее вообще не работа. Вот простенький тест:
using System;
using System.Collections.Generic;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        Stopwatch timer = Stopwatch.StartNew();
        List<char[]> list = new List<char[]>(100);

        for (int i = 0; i < 8000; i++)
        {
            list.Add(new char[4 * 1024]);

            if (i % 100 == 0)
                list.Clear();
        }

        Console.WriteLine(timer.Elapsed);
        for (int i = 0; i <= GC.MaxGeneration; i++)
            Console.WriteLine("Количество сборок в поколнии {0}: {1}", i, GC.CollectionCount(i));
    }
}

Вто что получается на маей машине:
00:00:00.0547748
Количество сборок в поколнии 0: 17
Количество сборок в поколнии 1: 6
Количество сборок в поколнии 2: 0


На этом хочу закончить эту позновательную беседу. Дела, знаете ли, ждут. Фэнтези определенно не мой любимый жанр.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[43]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 13:04
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Так, но не забывай, что само по себе время жизни объекта мало что значит. Важно время жизни относительно других объектов. Я не знаю, что именно делал сервер во время обработки каждого сообщения (а делать он мог много чего ), но факт есть факт: сообщения жили по принципу первое создалось, первое удалилось.

Ну не верю я в что эти объекты попадут дальше первого поколения. И как следствие не будет просадки по производительности.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[43]: плохой язык C++ :)
От: igna Россия  
Дата: 22.03.06 13:17
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Siemens M55 вроде как на Symbian OS живет. И телефонная книга у него не на Яве значит.



GC на C++ значит...
Re[39]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 13:22
Оценка:
Здравствуйте, prVovik, Вы писали:

VD>>Ага. На 8 000 сообщений.

V>Что смешного?

"фиксированные небольшой буфер памяти" в количестве 8000, да еще и с размером по 4 К — это 32 метра! И это при том, что сообщения-то идут последовательно.

Развернутый ответ здесь:
Re[37]: плохой язык C++ :)
Автор: VladD2
Дата: 22.03.06
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[42]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 13:22
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Кстати ИМХО лучший вариант для мягкого реалтайма типа игр это собирать нулевое и первое поколение обычным мусорщиком, а второе конкурентным.


Так и делается. Вообще-то я об этом в статье написал (из #5 2005). Тебе как члену команды она доступна. Так что можешь почитать. Там об этом как раз и рассказывается.

VD>>И что самое забавное порождающие при этом монстров вроде ФИРА.

WH>Я его на своей машине так и не смог запустить... хотя машина зверь...

Я на домашней запустил. Там 6800 GT с 128 метрами.
Правда пришлось час провести в их тесте (слава богу хоть его сделали) и выяснить что нужно отключить. Основное что пришлось отключиь — это мягкие тени.

WH>четвертая квака летает. Может конечно компакт кривой попался...


4 Квака у меня летает и на машине с ATI 9800 Pro. Причем мягкие тени там не хуже ФИРА.

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

... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[43]: плохой язык C++ :)
От: Left2 Украина  
Дата: 22.03.06 13:24
Оценка:
VD>Siemens M55 вроде как на Symbian OS живет. И телефонная книга у него не на Яве значит.

Неправда Ваша.
Единственный сименс на Symbian OS — это SX1.
Ну и к тому же Symbian и Java — это не антиподы, под Symbian можно замечательно писать на Java.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[37]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 13:24
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Хм... Ничего не понял. А что общего между кодогенерацией и алгоритмами управления памятью?


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

VD>>Пойми. И GC и неуправляемые коучи пишут не идеоты.

V>Не сомневаюсь в этом. Но они и понятия не имеют о МОЕЙ задаче.

Ага. Им и не надо. Они пишут очень быстрый универсальный алгоритм.

VD>>И если у меня скоростная характеристика близка к O(1), то хоть в лепешку разбейся но серьезного выигрыша ты неполучишь.

V>Неужели? А если константа будет час?

...то пора апгрэйдить технику.
Если серьезно, то не нужно выдумывать. В том то все и дело, что ЖЦ обеспечивает очень и очень хорошие характеристики. Они сравнимы с теми самыми ручными оптимизациями, а не стоят ничего.

V> Именно об этом я и толковал. Точнее о том, что хорошо, когда средство разработки предоставляет возможность удобно реализовать вещи, которые не были предусмотрены создателями данного средства разработки.


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

V>>>Это был проект сетевого движка для MMORPG. Приходило 8к сообщений (разного размера) в секунду и управление памятью как раз было узким местом.

VD>>Так, все! На этом мы пожалуй закончим. В сумашедший дом я не играю.
V>Ты о чем?

Ну, раз ты не понял, то вот развернутое объяснение:
Re[37]: плохой язык C++ :)
Автор: VladD2
Дата: 22.03.06
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[44]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 13:24
Оценка:
Здравствуйте, igna, Вы писали:

I>GC на C++ значит...


Ну, вот мы и выяснили первопричину.
Шучу конечно. Но сам ЖЦ тут не причем.

К тому же девайсы вроде телевонов не выключаются обычно. Они выключаются если у них батарейку вынуть.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[43]: плохой язык C++ :)
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 22.03.06 13:45
Оценка: :))
Здравствуйте, VladD2, Вы писали:

VD>Короче, в реальном мире релят грамотные специалисты, прямые руки и тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты, тесты.


А автокомплит со статической типизацией на пару?
http://www.smalltalk.ru | << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[45]: плохой язык C++ :)
От: igna Россия  
Дата: 22.03.06 13:48
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>... Но сам ЖЦ тут не причем.



Откуда уверенность?



VD>К тому же девайсы вроде телевонов не выключаются обычно. Они выключаются если у них батарейку вынуть.



Это ново. Но и без того случая с непреднамеренным выключением время от времени возникающая пауза в 10 секунд не радует.
Re[38]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 13:54
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Ну ты заливаешь! Ты прежде чем токое нести узнал бы какова средняя пропускная способность у 100 мегабитной сети. Я тебе как краевед скажу, что где-то оголо 10 мег в секунду.


VD>На вашей игрушке можно смело писать звучные лозунги вроде:

VD>

Мы работаем на будущее!!!... Минимальные требования для сетевой игры Gigabit Ethernet!

это СЕРВЕР

VD>А вот для ЖЦ это тем не менее вообще не работа. Вот простенький тест:

и что этот "тест" показал?
лэт ми спик фром май харт
Re[38]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.06 13:55
Оценка: 12 (1)
Здравствуйте, VladD2, Вы писали:

VD>А вот для ЖЦ это тем не менее вообще не работа. Вот простенький тест:

...
VD>Вто что получается на маей машине:
VD>
VD>00:00:00.0547748
VD>Количество сборок в поколнии 0: 17
VD>Количество сборок в поколнии 1: 6
VD>Количество сборок в поколнии 2: 0
VD>


Как я понимаю, твой тест отработал за ~55 миллисекунд. На какой машине?

Алаверды (код теста ниже). Машина Pentium M 1.5GHz, 512Mb.

Visual C++ 7.1.
Компиляция:
cl -GX -O2 -MT -ot_vc71.exe t1.cpp

Получаем:

simple alloc_objects
duration: 1.703
price: 0.08515
alloc raw_vectors
duration: 0.937
price: 0.04685


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

Зато второй тест с char[] уже выигрывает у твоего варианта с GC. Хотя можещь заметить, что никаких ухищрений по повышению производительности работы с памятью не делается. Интересно, не правда ли?

А вот другой компилятор:
Digital Mars C++ 8.42n
Компиляция:
dmc -o -ot_digital_mars.exe t1.cpp

Получаем:

simple alloc_objects
duration: 1.796
price: 0.0898
alloc raw_vectors
duration: 0.094
price: 0.0047




#include <iostream>
#include <list>
#include <string>
#include <algorithm>
#include <ctime>

template< class T >
void
run_and_measure(
    T functor )
{
    const unsigned int cycles = 20u;
    std::clock_t start, finish;

    start = std::clock();
    for( unsigned int i = 0; i != cycles; ++i )
        functor();
    finish = std::clock();

    double duration = double( finish - start ) / CLOCKS_PER_SEC;
    double price = duration / cycles;
    std::cout
        << "duration: " << duration << std::endl
        << "price: " << price << std::endl;
}

void
alloc_objects()
{
    typedef std::list< std::string > list_t;

    list_t list;

    for( unsigned int i = 0; i != 8000; ++i )
    {
        list.push_back( std::string( 4 * 1024, 0 ) );

        if( !( i % 100 ) )
            list.clear();
    }
}

void
raw_vector_destroyer( char * p )
{
    delete[] p;
}

void
alloc_raw_vectors()
{
    typedef std::list< char * > list_t;

    list_t list;

    for( unsigned int i = 0; i != 8000; ++i )
    {
        list.push_back( new char[ 4 * 1024 ] );

        if( !( i % 100 ) )
        {
            std::for_each( list.begin(), list.end(), raw_vector_destroyer );
            list.clear();
        }
    }
}

int
main()
{
    std::cout << "simple alloc_objects" << std::endl;
    run_and_measure( alloc_objects );

    std::cout << "alloc raw_vectors" << std::endl;
    run_and_measure( alloc_raw_vectors );

    return 0;
}


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[40]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 13:55
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, prVovik, Вы писали:


VD>>>Ага. На 8 000 сообщений.

V>>Что смешного?

VD>"фиксированные небольшой буфер памяти" в количестве 8000, да еще и с размером по 4 К — это 32 метра! И это при том, что сообщения-то идут последовательно.


и?
лэт ми спик фром май харт
Re[38]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 13:58
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Понимаеш, ли в чем дело. Занимаясь подобными оптимизациями ты выиграшь доли процента в скорости

С чего ты это взял?
В моем случае по сравнению со стандартным хипом суммарная производительность программы увеличилась в несколько раз.
лэт ми спик фром май харт
Re[39]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 14:01
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Здравствуйте, VladD2, Вы писали:


VD>>Понимаеш, ли в чем дело. Занимаясь подобными оптимизациями ты выиграшь доли процента в скорости

V>С чего ты это взял?
V>В моем случае по сравнению со стандартным хипом суммарная производительность программы увеличилась в несколько раз.
точнее не программы (сервера) а конкретно его сетевой части.
лэт ми спик фром май харт
Re[46]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 14:20
Оценка:
Здравствуйте, igna, Вы писали:

VD>>... Но сам ЖЦ тут не причем.


I>Откуда уверенность?


Влючи логику. Зачем валить напраслену на алгоритмы, если у отдельных порограммистов кривые руки? К тому же ты не знаешь реальных причин проблем.
В общем, оставь свои домыслы при себе и не делай на их основе каких бы то нибыло выводов.

VD>>К тому же девайсы вроде телевонов не выключаются обычно. Они выключаются если у них батарейку вынуть.


I>Это ново. Но и без того случая с непреднамеренным выключением время от времени возникающая пауза в 10 секунд не радует.


Пиши баг-репорты в создателям Сембиан. Может они тебе предложат патчик.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[44]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 14:20
Оценка:
Здравствуйте, Left2, Вы писали:

VD>>Siemens M55 вроде как на Symbian OS живет. И телефонная книга у него не на Яве значит.


L>Неправда Ваша.

L>Единственный сименс на Symbian OS — это SX1.
L>Ну и к тому же Symbian и Java — это не антиподы, под Symbian можно замечательно писать на Java.

Возмнжно. Но то, что там не Symbian, а некий самопал еще не означает, что всь софт телефона написан на Яве. И уж темболее не значит, что глюки из-за ЖЦ.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[44]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 14:20
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>А автокомплит со статической типизацией на пару?


А они помогают грамотным специалистам с прямыми руками решать задачи легко и быстро.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[41]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 14:20
Оценка:
Здравствуйте, WolfHound, Вы писали:

I>>Это да. Но то, что на C# можно писать не создавая мусора, не отменяет того, что библиотека .NET Framework иногда создает его там, где это не является необходимым; например StreamReader.ReadLine при каждом вызове возвращает новый String, и в классе StreamReader нет метода читающего в имеющийся StreamBuilder.

WH> По сравнения с чтением с диска...

Блин, слава богу, что экономисты вроде igna не проектируют библиотек. А то мы так бы ижли с ручным выделеним буферов под каждый чих.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[42]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 14:20
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Единственный случай когда я отказался от услуг ГЦ в .NET это был бинарный дифф для того чтобы резать на куски бэкап быза RSDN'а. Но там сценарий работы был таким: В начале работы создать несколько миллионов одинаковых объектов, а в конце работы их все удалить. Для этого я воспользовался массивом value типов.


Я бы не стал говорить "отказался". Это скорее разумное использование возможностей системы. Память то все равно управлялась в итоге ЖЦ.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 15:03
Оценка: -1
Здравствуйте, eao197, Вы писали:

E>2VladD2: а минус за что? С чем конкретно ты не согласен?


Челове явно сказл, что выделяет память под 8000 сообщений, что их размеры их равны, и что память под них можно выделять из циклического буфера. Ты же мало того, что начал выискивать тайный смысл в его словах, но и подвигнул его на откроенный год о 8 000 сообщений по 4 Кб каждое. Нехитрый подсчет показывает, что такой объем данных через сеть в секунду можно пропихнуть если только она гигабитная. О тормозах памяти при таком расскладе можно забыть.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 15:03
Оценка:
Здравствуйте, igna, Вы писали:

I>

I> . . .

I>My measurements shows a performance ratio of 8:1 in advantage for C#
I>over C++. But no C++ would allocate such small objects on the heap.
I>C#, on the otherhand, have no choice. And if you rewrite to proper C++
I>code you get a ratio of 42:1 -that is C++ is 42 times (!) quicker than
I>C#. So I enlarged the test with a) object specific new/delete op and
I>b) with a object of approx size 32 kb. The meassurements are found
I>below — and they are quiet astonishing: C++ outperforms C# in every
I>aspect, only with one exception: the Don Box demo!!!

I> . . .

I>(http://discuss.microsoft.com/SCRIPTS/WA-MSD.EXE?A2=ind0208a&amp;L=atl&amp;P=20241)



И? То есть мы сошлись на том, что GC порвет большинство рукопашных оптимизаций динамического выделения памяти?
А с размещением в стэке все яснее ясного.
1. Есть вэлью-типы.
2. Ведутся работы по встраиванию в промышленные ЖЦ автоматического размещения объектов в стэке.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[39]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 15:03
Оценка: 20 (1)
Здравствуйте, eao197, Вы писали:

E>Как я понимаю, твой тест отработал за ~55 миллисекунд.


Ага. А в этой сказке про белого бычка речь шала о 1 секунде, то есть о 1000 милисек.

E> На какой машине?


На машие с процессорм 2.2 гигагерца и частатой памяти 400 мегагерц.
Банальная апроксимация показывает, что за секунду этот код выполнится практически на любом писюке способном тинять NT.

E>Алаверды (код теста ниже). Машина Pentium M 1.5GHz, 512Mb.

...

E>Visual C++ 7.1.

E>Компиляция:
...

E>
E>cl -GX -O2 -MT -ot_vc71.exe t1.cpp
E>

E>Получаем:
E>

E>simple alloc_objects
E>duration: 1.703
E>price: 0.08515
E>alloc raw_vectors
E>duration: 0.937
E>price: 0.04685


Чтобы не гадать, я исправил твой тест и запустил на той же машине (компилировал в релиз из под VS2005):
simple alloc_objects
duration: 1.562
price: 0.0781
alloc raw_vectors
duration: 0.656
price: 0.0328


А исправил я пустячёк... заменил std::string на std::wstring и char на wchar_t. А то как-то не очень честно, ведь в дотнете char все же равен 2 байтам.

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


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

Во как.

E>Зато второй тест с char[] уже выигрывает у твоего варианта с GC.


Как видишь нифига он не выиграл.


E> Хотя можещь заметить, что никаких ухищрений по повышению производительности работы с памятью не делается. Интересно, не правда ли?


А что собственно интересного? Ну, ошибся. Ну, получил не верные результаты.

Собственно этот тест не был призван продемонстрировать производительность ЖЦ, так как он как раз очень неплохо ложиться на паттерны используемые обычными С-кучами. Но его не долго переделать, так чтобы он демонстрировал это приемущество.

Я чуть-чуть поколдовал над тестом (мой и твоей реализацией) и у меня получились следующие результатаы...
Для С++ (твой тест):
simple alloc_objects
duration: 7.077
price: 0.35385
alloc raw_vectors
duration: 3.516
price: 0.1758

Аналогичный тест на C#:
00:00:00.1742056
Количество сборок в поколнии 0: 97
Количество сборок в поколнии 1: 27
Количество сборок в поколнии 2: 0

Теперь о сути изменений. Естественно я исправил твою ошибку и использовал в С++-тесте wchar_t вместо char. Так же я изменил количество повторений с 8 000 до 80 000 и сделал размер объекта динамически изменяемым.

Собственно вот сам код.
C#:
using System;
using System.Collections.Generic;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        Stopwatch timer = Stopwatch.StartNew();
        List<char[]> list = new List<char[]>(100);

        for (int i = 0; i < 80000; i++)
        {
            list.Add(new char[i % 4 * 1024]);

            if (i % 100 == 0)
                list.Clear();
        }

        Console.WriteLine(timer.Elapsed);
        for (int i = 0; i <= GC.MaxGeneration; i++)
            Console.WriteLine("Количество сборок в поколнии {0}: {1}", i, GC.CollectionCount(i));
    }
}

C++:
// Alloc1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <list>
#include <string>
#include <algorithm>
#include <ctime>

typedef wchar_t TYPE;
static const int Count = 80000;

template< class T >
void
run_and_measure(
                T functor )
{
  const unsigned int cycles = 20u;
  std::clock_t start, finish;

  start = std::clock();
  for( unsigned int i = 0; i != cycles; ++i )
    functor();
  finish = std::clock();

  double duration = double( finish - start ) / CLOCKS_PER_SEC;
  double price = duration / cycles;
  std::cout
    << "duration: " << duration << std::endl
    << "price: " << price << std::endl;
}

void
alloc_objects()
{
  typedef std::list< std::wstring > list_t;

  list_t list;

  for( unsigned int i = 0; i != Count; ++i )
  {
    list.push_back( std::wstring(i % 4 * 1024, 0 ) );

    if( !( i % 100 ) )
      list.clear();
  }
}

void
raw_vector_destroyer( TYPE * p )
{
  delete[] p;
}

void
alloc_raw_vectors()
{
  typedef std::list< TYPE * > list_t;

  list_t list;

  for( unsigned int i = 0; i != Count; ++i )
  {
    list.push_back( new TYPE[i % 4 * 1024] );

    if( !( i % 100 ) )
    {
      std::for_each( list.begin(), list.end(), raw_vector_destroyer );
      list.clear();
    }
  }
}

int
main()
{
  std::cout << "simple alloc_objects" << std::endl;
  run_and_measure( alloc_objects );

  std::cout << "alloc raw_vectors" << std::endl;
  run_and_measure( alloc_raw_vectors );

  return 0;
}


Про Марс не скажу, но его результаты не натуральны. Скорее всего что-то соптимизировалось.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[39]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 15:03
Оценка:
Здравствуйте, prVovik, Вы писали:

V>С чего ты это взял?

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

Извини, но не верю. Особенно после сказок про 8 000 * 4К сообещений принимаемых по сети.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[39]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.06 15:07
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>И? То есть мы сошлись на том, что GC порвет большинство рукопашных оптимизаций динамического выделения памяти?


Мне кажется, ты пытаешься выдавать желаемое за действительное. Как насчет порвать простой штатный распределитель памяти в C++?
Автор: eao197
Дата: 22.03.06


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[39]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 15:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Челове явно сказл, что выделяет память под 8000 сообщений, что их размеры их равны,

Какие еще равные размеры?
Может ссылку дашь?

VD>и что память под них можно выделять из циклического буфера. Ты же мало того, что начал выискивать тайный смысл в его словах, но и подвигнул его на откроенный год о 8 000 сообщений по 4 Кб каждое. Нехитрый подсчет показывает, что такой объем данных через сеть в секунду можно пропихнуть если только она гигабитная. О тормозах памяти при таком расскладе можно забыть.

ЕЩЕ РАЗ ПОВТОРЯЮ МЕДЛЕННО: РЕЧЬ ИДЕТ О СЕРВЕРЕ.
И реально выделений есс-но было не 8к, а больше. Я их не считал.
лэт ми спик фром май харт
Re[40]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.06 15:19
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>А исправил я пустячёк... заменил std::string на std::wstring и char на wchar_t. А то как-то не очень честно, ведь в дотнете char все же равен 2 байтам.


Имхо, это проблемы .Net-а, ведь речь шла о 4K сообщениях, а не о 8K сообщениях

VD>Я чуть-чуть поколдовал над тестом (мой и твоей реализацией) и у меня получились следующие результатаы...

VD>Для С++ (твой тест):
VD>
VD>simple alloc_objects
VD>duration: 7.077
VD>price: 0.35385
VD>alloc raw_vectors
VD>duration: 3.516
VD>price: 0.1758
VD>


А теперь посмотри, что ты выделил жирным и текст программы, которую ты запускал. duration -- это продолжительность 20(!) повторений теста, а вот price -- это усредненное время выполнения одного теста. И величина, как видишь, получается похожей на твой C# вариант.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[40]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 15:20
Оценка:
Здравствуйте, prVovik, Вы писали:

VD>>и что память под них можно выделять из циклического буфера. Ты же мало того, что начал выискивать тайный смысл в его словах, но и подвигнул его на откроенный год о 8 000 сообщений по 4 Кб каждое. Нехитрый подсчет показывает, что такой объем данных через сеть в секунду можно пропихнуть если только она гигабитная. О тормозах памяти при таком расскладе можно забыть.

V>ЕЩЕ РАЗ ПОВТОРЯЮ МЕДЛЕННО: РЕЧЬ ИДЕТ О СЕРВЕРЕ.
V>И реально выделений есс-но было не 8к, а больше. Я их не считал.
Тут проблема была в том, что стандартный виндосячий хип — это тормоз жуткий.
лэт ми спик фром май харт
Re[42]: плохой язык C++ :)
От: igna Россия  
Дата: 22.03.06 15:21
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Блин, слава богу, что экономисты вроде igna не проектируют библиотек. А то мы так бы ижли с ручным выделеним буферов под каждый чих.



ReadLine возвращающий String и ReadLine читающий в переданный ему StringBuilder вполне могли бы сосуществовать. И каждый жил бы в соответствии с чем-то своим. Правда да, для приверженцев очередной Религии Программирования это конечно кощунство.
Re[40]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.06 15:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Извини, но не верю. Особенно после сказок про 8 000 * 4К сообещений принимаемых по сети.


А ты у AndrewVK пораспрашивай про производительность различных сетей (см. например, что он мне сам говорил: http://www.rsdn.ru/Forum/Message.aspx?mid=1781228&amp;only=1
Автор: AndrewVK
Дата: 14.03.06
).


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[39]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.06 15:38
Оценка:
Здравствуйте, VladD2, Вы писали:

E>>2VladD2: а минус за что? С чем конкретно ты не согласен?


VD>Челове явно сказл, что выделяет память под 8000 сообщений, что их размеры их равны, и что память под них можно выделять из циклического буфера.


Вот, что человек сказал
Автор: prVovik
Дата: 22.03.06

Это был проект сетевого движка для MMORPG. Приходило 8к сообщений (разного размера) в секунду и управление памятью как раз было узким местом.


Т.е. человек говорил про обработку 8K сообщений в секунду. А не о простом укладывании куда-то.

VD>Нехитрый подсчет показывает, что такой объем данных через сеть в секунду можно пропихнуть если только она гигабитная. О тормозах памяти при таком расскладе можно забыть.


А если сеть гигабитная? Это что редкость?
А если это сеть через FireWire?
А если это ATM сеть?
Или какой-нибудь InfiniBand?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[40]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 22.03.06 16:22
Оценка:
Здравствуйте, VladD2, Вы писали:

Результаты под Linux (Slackware 10.2, ядро 2.6.13, gcc 3.3.6), машина та же, что и в моих Windows-тестах.
simple alloc_objects
duration: 3.26
price: 0.163
alloc raw_vectors
duration: 0.61
price: 0.0305


Только я заменил в версии для Linux-а wchar_t на unsigned short, т.к. в Linux-е wchar_t -- это 4-ре байта.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[41]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 16:54
Оценка:
Здравствуйте, eao197, Вы писали:

VD>>Извини, но не верю. Особенно после сказок про 8 000 * 4К сообещений принимаемых по сети.


E>А ты у AndrewVK пораспрашивай про производительность различных сетей (см. например, что он мне сам говорил: http://www.rsdn.ru/Forum/Message.aspx?mid=1781228&amp;only=1
Автор: AndrewVK
Дата: 14.03.06
).


Ненадо переводить стрелки. Мы обсуждаем конкретную "оптимизацию". По-моему, очевидно, что никакая оптимизация там была не нужна. Да и сам рссказ на правду не тянет. 32 метра в игрушках по сети не передается. Даже действительно интерактивные игры вроде Ку передают в худшем случае килобайты в секунду. И просходит это потому, что иначе никто не будет играть в такие игры по Интернету.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[40]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 16:54
Оценка:
Здравствуйте, eao197, Вы писали:

E>Вот, что человек сказал
Автор: prVovik
Дата: 22.03.06

E>

E>Это был проект сетевого движка для MMORPG. Приходило 8к сообщений (разного размера) в секунду и управление памятью как раз было узким местом.


E>Т.е. человек говорил про обработку 8K сообщений в секунду. А не о простом укладывании куда-то.


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

VD>>Нехитрый подсчет показывает, что такой объем данных через сеть в секунду можно пропихнуть если только она гигабитная. О тормозах памяти при таком расскладе можно забыть.


E>А если сеть гигабитная? Это что редкость?


MMORPG == игрушка. Если игрушка требует гигабайтной сети, то ее авторы разарятся, так как они на фиг никому не упала. К тому же MMORPG — это еще и не сильно интерактивная вещь.

В общем, если слова о 8000 сообщений по 4Кб каждое правда (во что я лично не верю), то авторам нужно было не оптимизировать работу с памятью (ты и сам видишь, что даже стандартного хипа за глаза для этой задачи), а оптимизировать передачу данных по сети. Передавать только дельту. Вот тогда игра работала бы быстро и не лагала.

E>А если это сеть через FireWire?

E>А если это ATM сеть?
E>Или какой-нибудь InfiniBand?

Ты уверен, что понимашь о чем говоришь?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[40]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 16:54
Оценка:
Здравствуйте, prVovik, Вы писали:

VD>>Челове явно сказл, что выделяет память под 8000 сообщений, что их размеры их равны,

V>Какие еще равные размеры?
V>Может ссылку дашь?

Сори, про равные размеры сказал: igna
Автор: igna
Дата: 21.03.06
.

VD>>и что память под них можно выделять из циклического буфера. Ты же мало того, что начал выискивать тайный смысл в его словах, но и подвигнул его на откроенный год о 8 000 сообщений по 4 Кб каждое. Нехитрый подсчет показывает, что такой объем данных через сеть в секунду можно пропихнуть если только она гигабитная. О тормозах памяти при таком расскладе можно забыть.

V>ЕЩЕ РАЗ ПОВТОРЯЮ МЕДЛЕННО: РЕЧЬ ИДЕТ О СЕРВЕРЕ.
V>И реально выделений есс-но было не 8к, а больше. Я их не считал.

Да какая разница о чем? Для сообщения размером в 4 Кб нужно ровно 4Кб памяти. Спроси у Дворкина если мне не веришь.

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

Если ты говоришь правду, то вам нужно было заниматься оптимизацией передачи данных по сети, а не выделением памяти.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[41]: плохой язык C++ :)
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.03.06 16:54
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Тут проблема была в том, что стандартный виндосячий хип — это тормоз жуткий.


Максимум в 2-4 раза хуже лушчих реализаций. Порой даже ничем не хуже.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[42]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 22.03.06 17:47
Оценка:
VladD2 wrote:
> Ненадо переводить стрелки. Мы обсуждаем конкретную "оптимизацию".
> По-моему, очевидно, что никакая оптимизация там была не нужна. Да и сам
> рссказ на правду не тянет. 32 метра в игрушках по сети не передается.
Это _MMORPG_ с кучей клиентов.

1000 клиентов на сервер — вполне нормально, а это дает всего 3.2кб/сек
на пользователя. А это модемная скорость.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[41]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 22.03.06 17:48
Оценка:
VladD2 wrote:
> MMORPG == игрушка. Если игрушка требует гигабайтной сети, то ее авторы
> разарятся, так как они на фиг никому не упала. К тому же MMORPG — это
> еще и не сильно интерактивная вещь.
В MMORPG обычно делают разные login- и game-серверы, так что канал в
1Гбит между ними — вполне нормально.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[41]: плохой язык C++ :)
От: WolfHound  
Дата: 22.03.06 17:52
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>MMORPG == игрушка. Если игрушка требует гигабайтной сети, то ее авторы разарятся, так как они на фиг никому не упала. К тому же MMORPG — это еще и не сильно интерактивная вещь.

У MMORPG есть не только клиент. Но и сервер. prVovik говорит про сервер.
А там и нагрузка не маленькая. Хотя лично я бы сервер для MMORPG делал в расчете на кластер. Всеравно масштабируемость нужна на случай если игра популярной станет.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[41]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 18:09
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Да какая разница о чем? Для сообщения размером в 4 Кб нужно ровно 4Кб памяти. Спроси у Дворкина если мне не веришь.

Да, на счет 4кб я неверно выразился. По ТЗ это был максимальный размер сообщения.

VD>Если ты говоришь правду, то вам нужно было заниматься оптимизацией передачи данных по сети, а не выделением памяти.

Я данными не занимался. Было ТЗ с 8к сообщений и макс размер 4к. Все. На остальное мне было наплевать.
лэт ми спик фром май харт
Re[42]: плохой язык C++ :)
От: prVovik Россия  
Дата: 22.03.06 18:18
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Хотя лично я бы сервер для MMORPG делал в расчете на кластер. Всеравно масштабируемость нужна на случай если игра популярной станет.

Да мы сервер и не писали. Только сетевой движек.
лэт ми спик фром май харт
Re[43]: плохой язык C++ :)
От: Дарней Россия  
Дата: 23.03.06 02:30
Оценка:
Здравствуйте, igna, Вы писали:

I>ReadLine возвращающий String и ReadLine читающий в переданный ему StringBuilder вполне могли бы сосуществовать. И каждый жил бы в соответствии с чем-то своим. Правда да, для приверженцев очередной Религии Программирования это конечно кощунство.


Это никому не нужно. А кому это таки нужно, те пишут на MC++
Универсальных инструментов не бывает.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[44]: плохой язык C++ :)
От: igna Россия  
Дата: 23.03.06 06:27
Оценка: +1 :)
Здравствуйте, Дарней, Вы писали:

Д>Это никому не нужно.



Точнее, это никому не должно быть нужно!
Re[40]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 23.03.06 10:15
Оценка: 18 (3)
Здравствуйте, VladD2.

Решил еще раз вернуться к данному тесту. Во-первых, обнаружил ошибку -- в тесте с raw-векторами при выходе из цикла не уничтожались элементы. Во-вторых, добавил тест, где raw-вектора сохраняются в std::vector нужной размерности, а не в std::list (т.к. std::list может для каждого элемента динамически создавать дополнительный внутренний объект для провязывания в список). В-третьих, реализовал простейший менеджер памяти, заточенный для конкретно этой задачи и переопределил с его помощью new/delete.

Замерял производительность на Visual C++ v.7.1 (компиляция через 'cl -GX -O2') и Digital Mars C++ v.8.42 (компиляция через 'dmc -Ae -o').
Вот результаты со стандарным распределителем памяти:
Visual C++
simple alloc_objects
duration: 16.115
price: 0.80575
alloc raw_vectors
duration: 6.153
price: 0.30765
alloc raw_vectors_in_vectors
duration: 5.637
price: 0.28185

Digital Mars C++
simple alloc_objects
duration: 8.86
price: 0.443
alloc raw_vectors
duration: 0.812
price: 0.0406
alloc raw_vectors_in_vectors
duration: 0.516
price: 0.0258


А вот результаты с собственным распределителем памяти:
Visual C++
simple alloc_objects
duration: 5.527
price: 0.27635
alloc raw_vectors
duration: 0.157
price: 0.00785
alloc raw_vectors_in_vectors
duration: 0.125
price: 0.00625

Digital Mars C++
simple alloc_objects
duration: 6.547
price: 0.32735
alloc raw_vectors
duration: 0.281
price: 0.01405
alloc raw_vectors_in_vectors
duration: 0.157
price: 0.00785


Т.е. для Visual C++ применение собственного распределителя памяти, заточенного под конкретную задачу дало прирост в ~40 раз (0.007 против 0.307, и 0.006 против 0.281). Для Digital Mars C++ прирост не так существеннен -- всего ~4 раза. Но ведь все это без изменения исходников самого теста. Просто так на ровном месте взяли и увеличили скорость в несколько раз. Разумеется не бесплатно, но об этом чуть ниже.

А вот под Linux-ом результаты были интереснее. Во-первых, оказалось, что g++ v.3.3.6 и его C++ библиотека требует выделять память большими кусками, чем Visual C++ и Digital Mars C++. В моем распределителе памяти изначально предполагалось, что будет не более 128 блоков по 8K каждый. В случае же с g++ пришлось размер блока увеличивать до 16Kb. В результате тест с std::string на стандартном распределителе памяти выиграл у моего распределителя. Зато в остальных случаях мой распределитель дал увеличение производительности, но всего в два раза.

Какой ценой дался этот прирост в скорости? Ну, во-первых, привязкой распределителя к конкретным условиям. А именно то, что в самом худшем случае не может быть больше 100 блоков размером ~8K. Если это условие нарушается, то программа просто перестает работать. Во-вторых, расходом памяти. Распределитель сразу создает необходимые буфера для размещения блоков. В третьих, трудозатратами. На создание распределителя (точнее, нескольких его вариаций) ушло ~2-2.5 часа (главным образом потому, что начал я его делать вечером после работы, совершил поэтому несколько глупых ошибок, которые долго вылавливал). В-четвертых, выяснилось, что кроме того, что распределитель оказался привязанным к конкретной задаче, он еще не очень хорошо переносится на другие платформы/компиляторы, что очень не приятно.

Но, если есть необходимость выжать максимальную скорость для конкретной задачи на конкретной платформе (прирост в 40 раз для Visual C++ -- это серьезно, однако), то цена вполне умеренная.

Кстати, на полном серьезе, без подколок. А как увеличить производительность конкретно этого теста на C# без переделки исходников теста?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[41]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 23.03.06 10:20
Оценка:
Исходники.



Файл теста
#include <iostream>
#include <list>
#include <vector>
#include <string>
#include <algorithm>
#include <ctime>
 
typedef unsigned short TYPE;
static const int Count = 80000;
 
template< class T >
void
run_and_measure(
                T functor )
{
  const unsigned int cycles = 20u;
  std::clock_t start, finish;
 
  start = std::clock();
  for( unsigned int i = 0; i != cycles; ++i )
    functor();
  finish = std::clock();
 
  double duration = double( finish - start ) / CLOCKS_PER_SEC;
  double price = duration / cycles;
  std::cout
    << "duration: " << duration << std::endl
    << "price: " << price << std::endl;
}
 
void
alloc_objects()
{
  typedef std::list< std::wstring > list_t;
 
  list_t list;
 
  for( unsigned int i = 0; i != Count; ++i )
  {
    list.push_back( std::wstring(i % 4 * 1024, 0 ) );
 
    if( !( i % 100 ) )
      list.clear();
  }
}
 
void
raw_vector_destroyer( TYPE * p )
{
  delete[] p;
}

void
alloc_raw_vectors()
{
  typedef std::list< TYPE * > list_t;
 
  list_t list;
 
  for( unsigned int i = 0; i != Count; ++i )
  {
    list.push_back( new TYPE[ i % 4 * 1024 ] );
 
    if( !( i % 100 ) )
    {
      std::for_each( list.begin(), list.end(), raw_vector_destroyer );
      list.clear();
    }
  }

  std::for_each( list.begin(), list.end(), raw_vector_destroyer );
}

void
alloc_raw_vectors_in_vectors()
{
    typedef std::vector< TYPE * > list_t;

    list_t list;
    list.reserve( 100 );

    for( unsigned int i = 0; i != Count; ++i )
    {
        list.push_back( new TYPE[ i % 4 * 1024 ] );

        if( !( i % 100 ) )
        {
            std::for_each( list.begin(), list.end(), raw_vector_destroyer );
            list.clear();
        }
    }

  std::for_each( list.begin(), list.end(), raw_vector_destroyer );
}
 
int
main()
{
  std::cout << "simple alloc_objects" << std::endl;
  run_and_measure( alloc_objects );
 
  std::cout << "alloc raw_vectors" << std::endl;
  run_and_measure( alloc_raw_vectors );
 
  std::cout << "alloc raw_vectors_in_vectors" << std::endl;
  run_and_measure( alloc_raw_vectors_in_vectors );
  
  return 0;
}




Вспомогательные классы для распределителя памяти, файл mem_mgr.hpp:
#if !defined( MEM_MGR_HPP )
#define MEM_MGR_HPP

#include <stdexcept>
#include <cstdlib>
#include <cstdio>

using namespace std;

template< class T, unsigned int Capacity >
class cyclic_queue_t
    {
    private :
        T    m_begin[ Capacity ];
        T *    m_end;
        T *    m_head;
        T *    m_tail;
        unsigned int m_count;

    public :
        cyclic_queue_t()
            :    m_end( m_begin + Capacity )
            ,    m_head( m_begin )
            ,    m_tail( m_begin )
            ,    m_count( 0 )
            {}

        void
        push( T v )
            {
                if( m_count == Capacity )
                    {
                        fprintf( stderr, "cyclic_queue overflow!\n" );
                        abort();
                    }
                else
                    ++m_count;

                *m_tail = v;
                if( (++m_tail) == m_end )
                    m_tail = m_begin;
            }

        T
        head() const
            {
                return *m_head;
            }

        void
        pop()
            {
                if( !m_count )
                    {
                        fprintf( stderr, "cyclic_queue underflow!\n" );
                        abort();
                    }
                else
                    ++m_count;

                if( (++m_head) == m_end )
                    m_head = m_begin;
            }
    };

template< unsigned int Block_size, unsigned int Capacity >
class mem_pool_t
    {
    private :
        char    m_buf[ Block_size * Capacity ];
        const char * const m_right;

        cyclic_queue_t< char *, Capacity >    m_free_blocks;
        
    public :
        mem_pool_t()
            :    m_right( m_buf + Block_size * Capacity )
            {
                for( unsigned int i = 0; i != Capacity; ++i )
                    m_free_blocks.push( m_buf + Block_size * i );
            }

        char *
        alloc( unsigned int object_size )
            {
                if( Block_size < object_size )
                    {
                        fprintf( stderr, "mem_pool<%u,%u>: object_size: %u\n",
                                Block_size,
                                Capacity,
                                object_size );
                        throw std::bad_alloc();
                    }

                char * r = m_free_blocks.head();
                m_free_blocks.pop();

                return r;
            }

        bool
        dealloc( char * p )
            {
                if( m_buf <= p && p < m_right )
                    {
                        m_free_blocks.push( p );
                        return true;
                    }

                return false;
            }

    private :
        mem_pool_t( const mem_pool_t & o );
        mem_pool_t & operator=( const mem_pool_t & o );
    };

template<
    unsigned int Min_block_size,
    unsigned int Min_Capacity,
    unsigned int Max_block_size,
    unsigned int Max_Capacity >
class mem_mgr_t
    {
    public :
        mem_mgr_t()
            {}

        char *
        alloc( unsigned int size )
            {
                if( size <= Min_block_size )
                    return m_min_pool.alloc( size );

                return m_max_pool.alloc( size );
            }

        void
        dealloc( char * ptr )
            {
                if( !m_min_pool.dealloc( ptr ) )
                    m_max_pool.dealloc( ptr );
            }

    private :
        mem_pool_t< Min_block_size, Min_Capacity >    m_min_pool;
        mem_pool_t< Max_block_size, Max_Capacity >    m_max_pool;

    private :
        mem_mgr_t( const mem_mgr_t & o );
        mem_mgr_t & operator=( const mem_mgr_t & o );
    };

#endif




Сам распределитель памяти (custom_new.cpp):
#include "mem_mgr.hpp"

typedef mem_mgr_t< 128, 512, 8 * 1024, 128 > mem_manager_t;

static mem_manager_t &
manager()
    {
        static mem_manager_t m;
        return m;
    }

void *
operator new( unsigned int size ) { return manager().alloc( size ); }

void *
operator new[]( unsigned int size ) { return manager().alloc( size ); }

void
operator delete( void * p ) { manager().dealloc( reinterpret_cast< char * >( p ) ); }

void
operator delete[]( void * p ) { manager().dealloc( reinterpret_cast< char * >( p ) ); }


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[41]: плохой язык C++ :)
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 23.03.06 12:26
Оценка:
Здравствуйте, eao197, Вы писали:

E>Кстати, на полном серьезе, без подколок. А как увеличить производительность конкретно этого теста на C# без переделки исходников теста?


Можно покрутить размеры Эдема/Выживших + условия перевода объекта в старое поколение.
http://www.smalltalk.ru | << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[41]: плохой язык C++ :)
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 23.03.06 13:46
Оценка:
Здравствуйте, eao197, Вы писали:

E>Но, если есть необходимость выжать максимальную скорость для конкретной задачи на конкретной платформе (прирост в 40 раз для Visual C++ -- это серьезно, однако)


Это несерьезно, потому что на реальной задаче на выделение памяти будет уходить куда меньший процент общего времени и выигрышь будет смешным. Тебе не зря Влад обращал внимание на абсолютное значение времени.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[42]: плохой язык C++ :)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 23.03.06 13:54
Оценка:
Здравствуйте, AndrewVK, Вы писали:

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


Еще раз: Влад указал на абсолютное значение времи исполнения двадцати тестов.

Что касается выигрыша, то все зависит от конкретной задачи и ситуации. И во многих из них выгрыш в 4-ре раза (как в случае с Digital Mars, не говоря уже про 40 раз для Visual C++) уже будет совсем не смешным, а критически важным.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[41]: плохой язык C++ :)
От: Cyberax Марс  
Дата: 24.03.06 08:10
Оценка:
WolfHound wrote:
> I>Или такой пример: Случайно выключил телефон во время процесса
> подозрительно напоминающего сборку мусора, результат — пропажа кое-какой
> информации. Да, понимаю, программа не должна была разрешать выключение в
> это время; но это пример того, как уменьшая вероятность ошибок
> программиста в одном месте использование GC увеличивает ее в другом.
> Я думаю там были какието другие тормоза. Ибо я не верю что сборку мусора
> можно заметить на глаз даже на телефоне.
Ага, конечно. На моем S65 очень даже заметно.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[4]: плохой язык C++ :)
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.04.06 09:09
Оценка: +1 :)
Здравствуйте, eao197, Вы писали:

E>А как же тогда известная песня в исполнении В.Леонтьева:

E>

E>...Каждый хочет иметь и невесту, и друга...

E>А ведь казалось бы, совершенно безобидный текст.
У Леонтьева вообще с песнями... Как бы это выразиться... Словом, не могу я эту хрень слушать. А конкретно процитированная песня вообще походу была написана на спор. Или он в фанты проиграл "спеть полную хрень со сцены 10000 раз".
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: плохой язык C++ :)
От: Freezy Россия  
Дата: 20.04.06 17:37
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Сергей Губанов, Вы писали:

СГ>>Все сильные умом люди, которых я знаю, не благосклонны к языку С++.
I>А к каким языкам благосклонны сильные умом?

Оберон, или какой-нибудь Паскаль

Кстати, забыл сказать, что модераторам пора поглядеть — выделенное жирным шрифтом трактуется не иначе как наезд на всех, кто пишет на C++ . Во всяком случае, умные люди такие вещи не говорят Пора уже уважать других участников
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[45]: плохой язык C++ :)
От: Дарней Россия  
Дата: 21.04.06 03:59
Оценка:
Здравствуйте, igna, Вы писали:

I>Точнее, это никому не должно быть нужно!


Точно. А кто все-таки не может жить без сексуальных извращений, тот пишет на C++/CLI
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.