LINUX.ORG.RU

Ушат помоев в сторону крестолюбов

 , , ,


15

14

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

Последние 7 лет я пишу сугубо на C, и только под Linux (да, да -std=gnu99 и accept4, dup3, __attribute__((cleanup(dtor))) и прочие приятности, позволяющие сделать волосы шелковистее на 15.5%) и не понимаю, для чего вообще нужен C++? То, что на сишке делается красиво и элегантно, в крестах напоминает соитие парализованных дцпшников (к сожалению, утерял картинку, но именно этот образ всплывает в голове, когда вижу очередную порцию крестолапши).

Давайте посмотрим на типичного C++ разработчика: он использует STL, boost, многие любят Qt (не только для GUI), якобы чтобы «писать кроссплатформенный код». В итоге болезный не знает током ни WinAPI, ни POSIX — ничерта. Он абсолютно не разбирается, как работает целевая система, для которой пишет код! Крестокодер просто не осознает, какой лютый ужас кроется за его любимыми iostream-ами, какое лютое говно лежит в boost::filesystem::path, насколько убого-низкоуровневым является boost::asio в 2016 году.

Только крестораб может эпично обосраться и просадить производительность, забыв передавать по ссылке параметры для «горячих» функций (то есть, просто забыв написать «&» в нужном месте).

Также эти убогие завистливо смотрят на type inference в языках, проектировавшихся не как «C на стероидах», и в ответ начинают лепить template и auto не к месту, от чего код адово пухнет и даже IDE перестает его понимать.

Серьезно, просто прекратите писать на этом языке. В следующий раз, начиная новый проект, выберите java (щютка)/go/swift/rust/c. Прекратите насиловать труп и отравлять зловонием все вокруг!

Перемещено true_admin из talks

Ответ на: комментарий от invy

C++ везде

И не говори :D

$ for i in /proc/*/exe; do [ -e "$i" ] && ldd $i | grep -qF 'stdc++' && readlink $i; done
/usr/lib64/firefox/firefox
$ for i in /proc/*/exe; do [ -e "$i" ] && readlink $i; done | wc -l
48
1 из 48 — прям на каждом шагу!

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

Ты видишь там new, маразматик? Его код аналогичен

S tmp1;
tmp1.i = 1;
tmp1.s = std::string{"cat"};
m.emplace(std::make_pair(std::string{"one"}, std::move(tmp)));

Stil ★★★★★ ()

Сишка дырявая и устаревшая, Rust её должен вытеснить — чем скорее, тем лучше.

GoodRiddance ()
Ответ на: комментарий от invy

Иии что тебе это говорит о поведении этой имплементации хэш. таблицы?

Это не цитата из документации, лол. А мне это говорит, что в отличие от unordered_map

  • итераторы не инвалидируются при вставках
  • при удалении становятся невалидными лишь итераторы, указывающие на удаляемые элементы
kawaii_neko ★★★ ()
Ответ на: комментарий от kawaii_neko
% for i in /proc/*/exe; do [ -e "$i" ] && ldd $i | grep -qF 'stdc++' && readlink $i; done | sort | uniq | wc -l
33
% for i in /proc/*/exe; do [ -e "$i" ] && readlink $i; done | sort | uniq | wc -l
67
invy ★★★★★ ()
Ответ на: комментарий от kawaii_neko

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

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

На стеке

Кстати, почему именно на стеке?

неупорядоченная карта с ключом строкой и значением S

Что такое неупорядоченная карта? можно НЕ оперировать плюсовыми понятиями, пожалуйста? Я не просто так попросил объяснить что происходит в коде...

В карту добавляются пары ключ-значение (например ключ: «one», значение: S.i = 1, S.s = «cat»)

без понятия «карта» мне трудно представить что имеется ввиду

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

Два вопроса:
1) Зачем совать в стек те данные, которые там не должны быть? Если пишешь что-то сложнее хелловорлда, там вообще желательно держать локальные переменные/структуры/etc.
2) Что за объект? Объясни подробнее что и куда ты хочешь переместить.

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

Сишка дырявая

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

и устаревшая

Тут давеча какой-то плеер выбросили из реп арча из-за того, что в него 2 года не коммитили. Ты из этих же хипстеров?

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

std::string{«cat»}

Любитель фигурных скобок что ли? Или просто на вызове strlen решил сэкономить? А может ты из секты альтернативно одаренных, для которых все, что не new за выделение памяти не считается?

Твой говнокод ничем не отличается от изначального кроме лишнего словоблудия.

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

для прикладного ПО слишком убого, для системного — чересчур наворочено

Говорят, игроделы на плюсах пишут...

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

sort | uniq

hint: sort -u

А чего стесняешься крестопроцессы светить, кдеешнег?

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

А чего стесняешься крестопроцессы светить, кдеешнег?

Для тебя будет сюрпризом:

/opt/google/chrome/chrome
/opt/google/chrome/nacl_helper
/usr/bin/gedit
/usr/bin/gnome-shell
/usr/bin/gnome-software
/usr/bin/pidgin
/usr/bin/qbittorrent
/usr/bin/skype
/usr/bin/update-notifier
/usr/bin/xbrlapi
/usr/lib/dleyna-renderer/dleyna-renderer-service
/usr/lib/evolution/evolution-addressbook-factory
/usr/lib/evolution/evolution-addressbook-factory-subprocess
/usr/lib/evolution/evolution-alarm-notify
/usr/lib/evolution/evolution-calendar-factory
/usr/lib/evolution/evolution-calendar-factory-subprocess
/usr/lib/evolution/evolution-source-registry
/usr/lib/gnome-online-accounts/goa-daemon
/usr/lib/gnome-session/gnome-session-binary
/usr/lib/gnome-settings-daemon/gnome-settings-daemon
/usr/lib/gnome-settings-daemon/gsd-printer
/usr/lib/gnome-shell/gnome-shell-calendar-server
/usr/lib/gnome-terminal/gnome-terminal-server
/usr/lib/gvfs/gvfs-afc-volume-monitor
/usr/lib/gvfs/gvfsd-dav
/usr/lib/gvfs/gvfsd-http
/usr/lib/ibus/ibus-ui-gtk3
/usr/lib/ibus/ibus-x11
/usr/lib/telepathy/telepathy-logger
/usr/lib/tracker/tracker-extract
/usr/lib/tracker/tracker-miner-fs
/usr/lib/tracker/tracker-miner-user-guides
/usr/lib/x86_64-linux-gnu/zeitgeist-fts

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

Rust её должен вытеснить

Я сильно сомневаюсь, что rust хоть что-то потеснит, раз даже D не взлетел.

У ржавчины тупо нет ниши: крестолегаси так и останется на крестах, сишколегаси — на сишке. Для новых проектов есть куда более вменяемые альтернативы, для новичков rust — это синоним слова «жопа», для тертых калачей вроде меня — синоним слова «убожество». На волне хайпа может и переползут на него несколько крестопаралитиков, но язык еще более мертворожденный, чем haskell (без обид).

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

Для тебя будет сюрпризом:

Ну ты бы тоже для начала разобрался, каким образом libstdc++ оказался у gedit, gnome-terminal-server или pidgin в списке зависимостей, потому как эти оба на сишке писаны.

Итого: хром, скайп и qbittorrent — 3 из 67.

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

Кстати, почему именно на стеке?

Потому что быстрее.

Что такое неупорядоченная карта? можно НЕ оперировать плюсовыми понятиями, пожалуйста? Я не просто так попросил объяснить что происходит в коде...

Хэш таблица

без понятия «карта» мне трудно представить что имеется ввиду

См. выше.

1) Зачем совать в стек те данные, которые там не должны быть? Если пишешь что-то сложнее хелловорлда, там вообще желательно держать локальные переменные/структуры/etc.

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

Что за объект? Объясни подробнее что и куда ты хочешь переместить.

Экземпляр структуры.

Объясни подробнее что и куда ты хочешь переместить.

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

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

Хаскель в большой степени академический язык, на нём пишут потому, что это «приятно». К чему ты его сюда приплёл вообще не ясно. На мой взгляд у Раста шансов побольше, чем было у Д когда-либо.

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

В косых лапах - да, дырявая.

Уверен, что и ты, и оп, и авторы того недавно всплывавшего gstreamer плагина себя криворукими тоже не считаете.

Только почему-то уязвимости находят в любом софте...

Раст в принципе безопасен. Если уязвимость найдена в сишном коде — виноват язык. Если в расте — исключительно сам программист.

арч
плеер

Очень интересная информация.

GoodRiddance ()
Ответ на: комментарий от asaw
    std::unordered_map<std::string, S> m;
    
    m.emplace(std::make_pair<std::string, S>("one", {1, "cat"}));
    m.emplace(std::make_pair<std::string, S>("two", {2, "dogs"}));
    m.emplace(std::make_pair<std::string, S>("three", {3, "cows"}));

Jeezes, son... ты прям как на Java пишешь!

std::unordered_map<std::string, S> m = {
	  {"one", {1, "cat"}}
	, {"two", {2, "dogs"}}
	, {"three", {3, "cows"}}
};

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

Его код аналогичен

Твой говнокод ничем не отличается от изначального

Бинго, ёпт.

Кстати твоего говнокода мы так и не увидели.

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

Забавно то, что ни один крестоодепт в этом треде не осилил прокомментировать вывод valgrind

Просто включи --leak-check=full --show-leak-kinds=all и всё станет понятно.

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

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

Но это не играет роли на самом деле. Куча серьезного софта написана на плюсах.

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

По хоткею можно же копипастить строку, ну и аутистам наверное нравятся похожие симметричные строчки.

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

наш любимый gcc

Это говно даже код скомпилить не может.

int main()
{
    void clean_up(void** ptr) { goto **ptr; }

    void* p __attribute((__cleanup__(clean_up))) = &&label;
label:
    return 0;
}
$ gcc prog.c -Wall -Wextra -O2 -march=native -std=c11
prog.c: In function 'clean_up.1725.isra.0.constprop.1':
prog.c:3:10: internal compiler error: Segmentation fault
     void clean_up(void** ptr) { goto **ptr; }
          ^
0x7d62af crash_signal
	../../gcc-4.8.2/gcc/toplev.c:332
0x7f8dc4 cleanup_control_flow_bb
	../../gcc-4.8.2/gcc/tree-cfgcleanup.c:202
0x7f8dc4 cleanup_tree_cfg_bb
	../../gcc-4.8.2/gcc/tree-cfgcleanup.c:586
0x7f9e77 cleanup_tree_cfg_1
	../../gcc-4.8.2/gcc/tree-cfgcleanup.c:631
0x7f9e77 cleanup_tree_cfg_noloop
	../../gcc-4.8.2/gcc/tree-cfgcleanup.c:687
0x7f9e77 cleanup_tree_cfg()
	../../gcc-4.8.2/gcc/tree-cfgcleanup.c:742
0x743fbc execute_function_todo
	../../gcc-4.8.2/gcc/passes.c:1924
0x7447ee execute_todo
	../../gcc-4.8.2/gcc/passes.c:1999

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

для тертых калачей вроде меня

Ты себе льстишь.

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

Вопрос: почему любой спец. софт (автокады, фотошопы и т.п., тысячи их) написан на С++, и даже если их разработчиков попросили бы написать снова с нуля - они опять бы выбрали плюсы? Даже если новых разрабов набрать.

На Delphi. А переписывают на C#. А жаль.

gag ★★★★★ ()

Ушат помоев в сторону крестолюбов

Ты себя переоцениваешь.

crutch_master ★★★★★ ()

Так это boost и qt уг, а сами плюсики то норм.

Lavos ★★★★★ ()

kawaii_neko ★  безумный сишник

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

RazrFalcon ★★★★★ ()

Си самый портируемый язык. Код можно скомпилировать под любую платформу. Ваш * никому не нужен.

и только под Linux (да, да -std=gnu99 и accept4, dup3, __attribute__((cleanup(dtor)))

Вот вам и сишники. Как только дело доходит до написания портируемого кода - самые «умные» разбегаются.

RazrFalcon ★★★★★ ()

многие любят Qt (не только для GUI)

Многие готовы пожертвовать 10-20% производительности ради быстроты разработки и удобства поддержки.

Открываем любой проект на С и читаем чейнжлог: исправили утечку, исправили segfault, исправили уязвимость, добавили минорную фичу, реализовав её в 100500 строк кода/лапши.

Открываем ченжлог на Rust/C++11 - опа, первые три категории исчезли, а фичи заняли в разы меньше кода.

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

для тертых калачей вроде меня

С вашим ЧСВ да в президенты.

RazrFalcon ★★★★★ ()

насколько убого-низкоуровневым является boost::asio в 2016 году

а что по вашему мнению является высокоуровневым аналогом asio в 2016 году?

basp ()
Ответ на: комментарий от asaw

А в чем подвох? То что получится многословнее? Гибкость не та? Вот аналог, с нашей любимой BDB

#include <sys/types.h>
#include <limits.h>
#include <db.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

struct S
{
	int i;
	char s[1];
};

static int
put(DB *db, char *k, int i, const char *d)
{
	DBT key, data;
	size_t datlen;
	struct S *s;

	datlen = sizeof(struct S) + strlen(d);
	s = alloca(datlen);
	s->i = i;
	strcpy(s->s, d);

	memset(&key, 0, sizeof(key));
	key.data = k;
	key.size = strlen(k) + 1;
	key.flags = DB_DBT_USERMEM;

	memset(&data, 0, sizeof(data));
	data.data = s;
	data.size = datlen;
	data.flags = DB_DBT_USERMEM;

	return (db->put(db, NULL, &key, &data, 0));
}

static void
dump(DB *db)
{
	DBC *cursor;
	DBT key, data;
	char *keybuf = NULL, *databuf = NULL;

	if (db->cursor(db, NULL, &cursor, 0) != 0) {
		perror("db_cursor");
		return;
	}

	memset(&key, 0, sizeof(key));
	memset(&data, 0, sizeof(data));

	key.data = keybuf;
	key.flags = DB_DBT_REALLOC;

	data.data = databuf;
	data.flags = DB_DBT_REALLOC;

	while (cursor->get(cursor, &key, &data, DB_NEXT) == 0) {
		printf("%s (%d) %s\n", (char *)key.data, 
			((struct S *)data.data)->i,
			((struct S *)data.data)->s);
	}
	free(key.data);
	free(data.data);

	cursor->close(cursor);
}

int
main()
{
	DB *db;
	int rc;

	if (db_create(&db, NULL, 0) != 0) {
		perror("db_create");
		return EXIT_FAILURE;
	}

	rc = db->open(db,
		NULL,      /* transaction id */
		NULL,      /* file */
		NULL,      /* database */
		DB_HASH,   /* type */
		DB_CREATE, /* flags */
		0);        /* mode */

	if (rc != 0) {
		perror("db_open");
		return EXIT_FAILURE;
	}

	put(db, "one", 1, "cat");
	put(db, "two", 2, "dogs");
	put(db, "three", 3, "cows");

	dump(db);

	db->close(db, 0);
	return EXIT_SUCCESS;
}

Но это более лучший аналог. Легким движением руки можно держать эти элементы на диске (и все будет работать даже если данных станет больше RAM) или сменить хэш на btree и сортировать своим компаратором

==4951== All heap blocks were freed -- no leaks are possible
vmx ★★ ()
Ответ на: комментарий от RazrFalcon

Многие готовы пожертвовать 10-20% производительности

Ты не опускай того факта, что эти уроды еще и совершенно наплевательски к расходу памяти относятся.

Вот так плюсофилы и рождают угребища вроде огнелиса, хромоногой быдлоподелки и прочих фекалий!

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

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

Да... вот был бы браузер на Си - жрал бы меньше ОЗУ. Продолжайте верить в сказки.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от asaw
    std::unordered_map<std::string, S> m;
    
    m.emplace(std::make_pair<std::string, S>("one", {1, "cat"}));
    m.emplace(std::make_pair<std::string, S>("two", {2, "dogs"}));
    m.emplace(std::make_pair<std::string, S>("three", {3, "cows"}));

Зачем тебе make_pair с emplace? Зачем тебе emplace, если есть initalizer_list?

#include <iostream>
#include <unordered_map>
using namespace std;

struct S {
    int i;
    string s;
};

int main() {
    unordered_map<string, S> m {
        { "one"   , { 1, "cat"  } },
        { "two"   , { 2, "dogs" } },
        { "three" , { 3, "cows" } }
    };
    
    for( auto& p : m )
        cout << p.first << " (" << p.second.i << ") " << p.second.s<< endl;
}
anonymous ()
Ответ на: комментарий от anonymous

Плюсофилы пишут на добре мамонта, которое как пылесос собрало в себя все когда-то модные уберфичи, и даже автор языка это признаёт. То ли дело Rust, который написан сообществом, у которого даже есть code of conduct.

GoodRiddance ()

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

Miguel ★★★★★ ()

насколько убого-низкоуровневым является boost::asio в 2016 году

И что высокоуровнее нонче, шобы из си или си++ юзать?

migesok ()
Ответ на: комментарий от Miguel

что хорошей ниши для плюсов нет.

Серьезные приложения, игры? Все игры на плюсах, офисы, фотошопы и прочее тоже. Чем не ниша?

RazrFalcon ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.