LINUX.ORG.RU

Finally, there are the «other» languages like Eiffel, Haskell, and Racket. Programming languages have a lot in common with religions

Он поди лор читает?

Debasher ★★★★★ ()
Последнее исправление: Debasher (всего исправлений: 1)

Это сейчас модно, писать статью вброс в оправдание такого ужасного выбора?

umren ★★★★★ ()

The new C++11 has copy and move semantics, iterators, range-based for loops, lambdas, the auto keyword, smart pointers, and a whole slew of new data structures and algorithms in the STL.

Ага, ага. А copy-on-write в STL НЕТУ. А realloc-а в std::vector НЕТУ. До сих пор НЕТУ стандартизированного ABI (весь этот манглинг-деманглинг каждый может городить, как ему вздумается). Нормального способа работать с типами (SFINAE - костыль, и этот enable_if через SFINAE накостылен) НЕТУ. Метапрограммирование в плюсах сосет.

Все, я кончил

SZT ★★★ ()

а урл у статьи why-im-choosing-c.
собсна, против плюсов ничего не имею. у всех языков есть своя ниша для разработки. в С-образных языках (кроме до-диеза) использование возможностей языка в значительной степени зависит от опыта программиста и некривых рук. в руках тупого нуба плюсы могут оказаться страшнее атомной бомбы.

Iron_Bug ★★ ()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от SZT

А copy-on-write в STL НЕТУ.

Он там не нужен. Совсем. Подробности у Саттера. Более того, стандарт допускал раньше CoW для строк. А теперь не допускает.

А realloc-а в std::vector НЕТУ

Сделай замеры производительности, покажи, насколько он нужен.

Нормального способа работать с типами (SFINAE - костыль, и этот enable_if через SFINAE накостылен)

гугли concepts и concepts lite

Метапрограммирование в плюсах сосет.

В реально пригодных для продакшн языках оно в принципе сосёт. И тут кресты ещё не так плохи.

anonymous ()

Не взлетит срач, понедельник же.

Gvidon ★★★ ()

Ну типа да, С++11 это был реальный прорыв. До 11-ого стандарта усиленно искал альтернативы. Теперь перестал.

quoob ()

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

true_admin ★★★★★ ()
Ответ на: комментарий от anonymous

Он там не нужен. Совсем. Подробности у Саттера.

Разрабы языка решают за меня, что мне нужно а что нет. Отлично, просто отлично

Сделай замеры производительности, покажи, насколько он нужен.

Плюсы http://pastebin.com/w5LH3FCG

real	0m0.155s
user	0m0.054s
sys	0m0.093s

Сишка http://pastebin.com/Xdhc7sx5

real	0m0.052s
user	0m0.019s
sys	0m0.027s
Таким образом - нужен. ЧТД.

гугли concepts и concepts lite

В стандарте есть?

В реально пригодных для продакшн языках оно в принципе сосёт. И тут кресты ещё не так плохи.

Каким критериям должен соответствовать язык, чтоб его считать пригодным для продакшн?

SZT ★★★ ()
Ответ на: комментарий от SZT

Каким критериям должен соответствовать язык, чтоб его считать пригодным для продакшн?

без круглых скобочек, очевидно же

lazyklimm ★★★★★ ()
Ответ на: комментарий от true_admin

царь не про большие проекты :) Он и хеллуворлды-то не очень — больше про кококо.

slackwarrior ★★★★★ ()
Ответ на: комментарий от SZT

Разрабы языка решают за меня, что мне нужно а что нет. Отлично, просто отлично

Не языка, а библиотеки. Возьми библиотеку/фреймворк с CoW, вроде Qt.

Плюсы
Сишка

Ты померил вектор и наколеночный велик на Си. А надо проверить увеличит ли использование realloc производительность вектора.

В стандарте есть?

Будет.

anonymous ()

It's seems as if the language committee has been observing all the innovation going on in the world at large, and has done a great job of reacting to the times.

Чухня. Главная причина, почему C++11 рулит и педалит - это то, что комитет в полном составе сменился на молодых и вменяемых.

anonymous ()

Краткое содержание: Пишу на Си. Понадобились хэши. Сам написать ниасилил. Использовать либу пе додумался. Сделал вывод что пора менять язык. Взглянул на go, rust, swift - испугался. Нашел хэши в STL. C++ - мой выбор. Малаца, хорошо сделали. (Кстати, я средний кодер и питонщик)

makoven ★★★★ ()
Ответ на: комментарий от Iron_Bug

URL наверняка автосгенерирован. + обычно преобразовывается или выбрасывается, если в конце/начале.

anonymous ()
Ответ на: комментарий от SZT

user 0m0.019s

Так точно никто не меряет. Код должен работать хотя бы секунду. Увидишь, результат будет другим.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Там основное время в sys тратится на mmap mremap munmap. На user можешь вообще не смотреть

Хотя не, там и user влияет. Похоже что совсем плохи дела с оптимизацией в этом STL

SZT ★★★ ()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от true_admin

Сделал с for (int i = 0; i <= 99999999; i++ ) и там и там Результат:

user@user-MS-7519:~/prog/bench$ g++ -O3 cpp.cpp 
user@user-MS-7519:~/prog/bench$ time ./a.out 

real	0m1.052s
user	0m0.415s
sys	0m0.620s
user@user-MS-7519:~/prog/bench$ time ./a.out 

real	0m1.008s
user	0m0.407s
sys	0m0.588s
user@user-MS-7519:~/prog/bench$ gcc -std=c99 -O3 c.c 
user@user-MS-7519:~/prog/bench$ time ./a.out 

real	0m0.524s
user	0m0.197s
sys	0m0.316s
user@user-MS-7519:~/prog/bench$ time ./a.out 

real	0m0.533s
user	0m0.203s
sys	0m0.316s
Плюсовый вектор примерно в два раза проигрывает моему наколенному велосипеду. Советую еще под strace запустить

SZT ★★★ ()
Ответ на: комментарий от SZT

На user можешь вообще не смотреть

WAT??

Некогда объяснять, ты намерял фигню. Просто увеличь цикл и сравни данные с теми что ты запостил. У меня разница over 50%, у тебя комп быстрее, разница может быть ещё больше. Разбор причины оставляю в качестве самостоятельного упражнения для пытливого читателя.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

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

Не перевирай. У автора в основном питон и немножко си, в котором он ниасилил коллекции (уже фейспалм) и решил пошукать языки погламурнее. Так как все ваши горасты это вынос мозга (тут можно отчасти согласиться), остался единственный вариант: питон и кресты. И тут автор внезапно заметил няшные форы и умные указатели, теперь он фанат крестов (как мало нужно быдлокодеру для счастья).

anonymous ()
Ответ на: комментарий от Gvidon

А так не считается. Я могу и в Си предварительно malloc-нуть побольше. Тут мы сравниваем то, насколько плюсы проигрывают оттого, что приходится вместо realloc делать malloc и копировать, а потом еще free

SZT ★★★ ()
Ответ на: комментарий от true_admin

Ну вот я намерял побольше, плюсы все так же проигрывают

SZT ★★★ ()
Ответ на: комментарий от SZT

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

Ну и чтоб было совсем интереснее, давай аналог std::deque сделай, там поржем.

anonymous ()
Ответ на: комментарий от SZT

приходится вместо realloc делать malloc и копировать, а потом еще free

И делают так в плюсах по вполне понятным и логичным причинам. Меня устраивает.

Gvidon ★★★ ()
Ответ на: комментарий от SZT

плюсы все так же проигрывают

Да речь не об этом. Я не говорю что плюсы выигрывают. Я говорю что первый твой результат ни о чём не говорит т.к. время бенчмарка сравнимо с флуктуациями.

Во втором случае мы видим что половина времени ушла в sys. В как бы _userspace_ коде. О чём это говорит? О том что у тебя на каждый чих системные вызовы идут, а это неправильно. Послушай Gvidon, он правильно указал на источник проблем.

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

true_admin ★★★★★ ()
Ответ на: комментарий от SZT

А copy-on-write в STL НЕТУ.

Сейчас модно требовать выпила CoW там, где оно есть

annulen ★★★★★ ()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от anonymous

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

Если и то и другое запустить под strace, можно заметить что числа там такие же

С код:

mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa39eb99000
mremap(0x7fa39eb99000, 266240, 528384, MREMAP_MAYMOVE) = 0x7fa39eb18000
mremap(0x7fa39eb18000, 528384, 1052672, MREMAP_MAYMOVE) = 0x7fa39ea17000
mremap(0x7fa39ea17000, 1052672, 2101248, MREMAP_MAYMOVE) = 0x7fa39e41e000
mremap(0x7fa39e41e000, 2101248, 4198400, MREMAP_MAYMOVE) = 0x7fa39e01d000
mremap(0x7fa39e01d000, 4198400, 8392704, MREMAP_MAYMOVE) = 0x7fa39d81c000
mremap(0x7fa39d81c000, 8392704, 16781312, MREMAP_MAYMOVE) = 0x7fa39c81b000
mremap(0x7fa39c81b000, 16781312, 33558528, MREMAP_MAYMOVE) = 0x7fa39a81a000
mremap(0x7fa39a81a000, 33558528, 67112960, MREMAP_MAYMOVE) = 0x7fa396819000
mremap(0x7fa396819000, 67112960, 134221824, MREMAP_MAYMOVE) = 0x7fa38e818000
mremap(0x7fa38e818000, 134221824, 268439552, MREMAP_MAYMOVE) = 0x7fa37e817000
mremap(0x7fa37e817000, 268439552, 536875008, MREMAP_MAYMOVE) = 0x7fa35e816000
munmap(0x7fa35e816000, 536875008)       = 0
exit_group(0)                           = ?

С++ код:

brk(0)                                  = 0x82b000
brk(0x84c000)                           = 0x84c000
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84ebb18000
mmap(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84ebacc000
munmap(0x7f84ebb18000, 135168)          = 0
mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84eba4b000
munmap(0x7f84ebacc000, 266240)          = 0
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84eb94a000
munmap(0x7f84eba4b000, 528384)          = 0
mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84eab33000
munmap(0x7f84eb94a000, 1052672)         = 0
mmap(NULL, 4198400, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84ea732000
munmap(0x7f84eab33000, 2101248)         = 0
mmap(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e9f31000
munmap(0x7f84ea732000, 4198400)         = 0
mmap(NULL, 16781312, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e8f30000
munmap(0x7f84e9f31000, 8392704)         = 0
mmap(NULL, 33558528, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e6f2f000
munmap(0x7f84e8f30000, 16781312)        = 0
mmap(NULL, 67112960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84e2f2e000
munmap(0x7f84e6f2f000, 33558528)        = 0
mmap(NULL, 134221824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84daf2d000
munmap(0x7f84e2f2e000, 67112960)        = 0
mmap(NULL, 268439552, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84caf2c000
munmap(0x7f84daf2d000, 134221824)       = 0
mmap(NULL, 536875008, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f84aaf2b000
munmap(0x7f84caf2c000, 268439552)       = 0
munmap(0x7f84aaf2b000, 536875008)       = 0
exit_group(0)                           = ?

Последовательность 266240 528384 1052672 2101248 из системных вызовов mremap там такая же, как в плюсовом коде с STL последовательность вызовов mmap. Притом в плюсах каждый раз через memcpy приходится копировать данные из старой в свежеmmap-нутую память, что конечно же очень хреново с т.з. производительности

Ну и чтоб было совсем интереснее, давай аналог std::deque сделай, там поржем.

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

SZT ★★★ ()
Последнее исправление: SZT (всего исправлений: 1)

Off-topic

Just as an example, I managed to write 2500 lines of C++ using the more modern style of RAII and shared pointers, and there were zero memory leaks on the first try! The equivalent functionality in C would have probably been 2x the code, and an additional week studying Valgrind errors.

Сходил конем.

https://github.com/cjdrake?tab=repositories

Понял что конь остался в закрытом коммерц. Царь detected.

For many years I was happy as a mostly two-language programmer. Use Python for mostly everything, and drop down to C when you really need the performance. But then I started to write a medium-sized library in C that required a larger toolbox than usual.

Вот так всегда, все есть, вроде счастлив, ну не хватает чего-то и все тут...

To make a long story short, I looked into some of these languages, but eventually came back to C++.

Сказал, будто вернулся к бывшей, потому что негде больше жить :(

По теме:

Статья ни о чем. Вообще ни о чем. Сказ о том, как очередной инженер гугла «прозрел».

znenyegvkby ()
Ответ на: комментарий от Gvidon

И делают так в плюсах по вполне понятным и логичным причинам.

И что же это за причины такие, от которых должна страдать производительность в векторе?

SZT ★★★ ()
Ответ на: комментарий от SZT

Копирование элементов на новый this.

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

anonymous ()
Ответ на: комментарий от SZT

Конструкторы копирования и деструкторы. Да, теоритически можно было бы написать специализацию вектора для чисел и указателей, но это просто никому не нужно, потому что реальной проблемы я всё равно не вижу. В подавляющем большинстве приложений никто не делает миллионы push_back'ов, а если и делает, то только после предварительного вызова reserve. Ну и накатать велосипед вроде твоего сишного тоже никто не запрещает, но это только после очень внимательного профилирования.

Gvidon ★★★ ()
Ответ на: комментарий от SZT

А copy-on-write в STL НЕТУ.

CoW это прежде всего оверхед, а уже потом оптимизация для отдельных случаев. Кто хочет CoW по умолчанию, то явно должен выбрать другой ЯП.

А realloc-а в std::vector НЕТУ.

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

До сих пор НЕТУ стандартизированного ABI

И не будет. Стандартный ABI - он для примитивного С.

весь этот манглинг-деманглинг каждый может городить, как ему вздумается

Ты хотел придраться - ты придрался. А так в новомодном rust, например, тот же манглинг. В D - манглинг и т.д. Потому-что опять же это не С, где нет перегрузки функций, шаблонов, классов и т.д. и т.п.

Нормального способа работать с типами (SFINAE - костыль, и этот enable_if через SFINAE накостылен) НЕТУ.

А чем тебя enable_if не устраивает? У меня только одна претензия - многословно получается, но зато это не требовало изменения языка. К тому же clang прекрасно понимает enable_if и выдает компактные и читабельные ошибки с ним.

Метапрограммирование в плюсах сосет.

Либо у нас есть препроцессор от С, либо мы имеем нормальное метапрограммирование. У авторов С++, думаю, тоже не вызывает восторга данная ситуация.

anonymous ()

А не пофик, кто там что выбрал?

Bfgeshka ★★★★★ ()
Ответ на: комментарий от anonymous

Стандартный ABI - он для примитивного С.

И давно в Це появился стандартный ABI?

Gvidon ★★★ ()

Нуачо? Если хочешь писать на новом языке, не хочешь учить новый язык, и знаешь Си++ - пиши на C++11. Вполне разумное решение.

tailgunner ★★★★★ ()
Ответ на: комментарий от SZT

А copy-on-write в STL НЕТУ. А realloc-а в std::vector НЕТУ. До сих пор НЕТУ стандартизированного ABI (весь этот манглинг-деманглинг каждый может городить, как ему вздумается). Нормального способа работать с типами (SFINAE - костыль, и этот enable_if через SFINAE накостылен) НЕТУ. Метапрограммирование в плюсах сосет.

Расскажи, что из вышеперечисленного лучше сделано в Си.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Расскажи, что из вышеперечисленного лучше сделано в Си.

А я тут разве противопоставляю Си и C++? Я просто говорю о том, что меня в C++ не устраивает

SZT ★★★ ()
Ответ на: комментарий от SZT

А я тут разве противопоставляю Си и C++?

Выглядит именно так.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Надо короче лиспосишку пилить с ручным управлением памяти и удобным метапрограммированием через AST на этапе компиляции (и чтоб еще можно было и в рантайм JIT всунуть при большом желании, и там тоже метапрограммировать через AST как вздумается)

SZT ★★★ ()
Ответ на: комментарий от SZT

Надо короче лиспосишку пилить с ручным управлением памяти и удобным метапрограммированием через AST

Были уже такие - не взлетели.

tailgunner ★★★★★ ()
Ответ на: комментарий от Gvidon

И давно в Це появился стандартный ABI?

Ты тоже хотел придраться - и придрался. Хотя, конечно, я не уверен, что тот же MSVC разных версий не выдаст что-то несовместимое.

anonymous ()
Ответ на: комментарий от SZT

удобным метапрограммированием через AST

А зачем вам метапрограммирование? Можете показать пример, мол, без метапрограммирования в такой-то задаче нужно 10 приседаний, а с метапрограммированием всего 5?

eao197 ★★★★ ()
Ответ на: комментарий от SZT

Напиши это в комментах к оригиналу, че.

loz ★★★★★ ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)