LINUX.ORG.RU

Какие преимущества я получу, перейдя с Python на C?

 ,


1

2

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

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

Так он до сих пор в зачатке, так что утверждение верное.

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

и использование goto даёт наиболее простой код из возможных вариантов

Что из этого проще и понятнее?

CObjectDeleter<Object1, void, DeleteObject1> obj1(NewObject1());
if (obj1 == NULL) return ERROR_OBJECT1;

CObjectDeleter<Object2, void, DeleteObject2> obj2(NewObject2());
if (obj2 == NULL) return ERROR_OBJECT2;

CObjectDeleter<Object3, void, DeleteObject3> obj3(NewObject3());
if (obj3 == NULL) return ERROR_OBJECT3;

return Setup(obj1.Detach(), obj2.Detach(), obj3.Detach());
statut_t err;

Object1 *obj1 = NewObject1();
if (obj1 == NULL) {err = ERROR_OBJECT1; goto err1;}

Object2 *obj2 = NewObject2();
if (obj2 == NULL) {err = ERROR_OBJECT2; goto err2;}

Object3 *obj3 = NewObject3();
if (obj3 == NULL) {err = ERROR_OBJECT3; goto err3;}

return Setup(obj1, obj2, obj3);

err3:
DeleteObject2(obj2);

err2:
DeleteObject1(obj1);

err1:
return err;

Исходник CObjectDeleter.

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

приведённые куски не эквивалентны по поведению, в первом случае созданные объекты не уничтожаются при ошибке

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

в первом случае созданные объекты не уничтожаются при ошибке

Ещё как уничтожаются. Для чего CObjectDeleter?

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

Код на C намного понятнее, а приплюснутый писался для каких-то рептилоидов. Заметь, красивей != лучше. C++ страдает от типичного проклятья лиспа.

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

все ОС написанные на С++ более убоги чем линукс

многопоточность, микроядерность, поддержку многопроцессорных архитектур, 64-битная журналируемая файловая система - это BeOS в 90 годах, когда линукс был не то что убог, он был в зачаточном состянии. Если бы в него IBM не вложила денег он в нем бы и остался. С точки зрения архитектуры линукс легаси-говно, так писали в 80 годах, и все осталось.

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

Для чего CObjectDeleter?

какая-то неочевидная портянка на 292 строчки, из-за которой нужно лезть в другой файл и долго втыкать на тему, что же она делает :)

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

Если бы в него IBM не вложила денег он в нем бы и остался.

Если бы у Лизы был член, то она был бы… Постойте, постойте, он ведь у Лизы и так есть.

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

Ну и где эта BeOS? А сдохла она. Если бы не гайка, про неё вспоминали бы не чаще чем про OS/2 в которую IBM вложила тогда гораздо больше денег чем в линукс.

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

Средний растолюб или плюсист не напишет компилятор раста или плюсов, а средний сишник напишет компилятор С.

По этому критерию лучший язык это Forth а не Си.

anonymous
()

Можно на чем угодно писать. Тебе для чего? Цель какая, что хочешь сделать?

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

долго втыкать на тему, что же она делает :)

Она вызывает функцию - третий аргумент шаблона когда указатель выходит из области видимости и он != NULL. Примерно тоже что и std::unique_ptr, но с функцией в качестве деструктора.

Это в основном нужно для взаимодействия с кодом на Си, если всё на C++, то можно использовать обычный std::unique_ptr.

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

Там же где остальные Sun, Dec со своими системами. Но это никакого отношения к тому, что на C++ написали полноценную систему не имеет.

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

Там же где остальные Sun, Dec со своими системами. Но это никакого отношения к тому, что на C++ написали полноценную систему не имеет.

Но в долгосрочной перспективе C в этой сфере оказался более живучим, что и требовалось доказать.

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

и эту наркоманию ты называешь легко читаемой

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

Я до сих пор не понимаю почему их так бомбит от if и goto.

Если бы ты писал или хотя бы видел код на старом бейсике, еще с номерами строк, тебя бы тоже бомбило.

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

я бы на С всегда к goto добавлял бы Pool, который бы владел всеми ресурсами.

Плюс в том, что у нас всегда одна метка. И в том что при рефакторинге сохраняется порядок уничтожения объектов в обратном порядке создания. С несколькими метками, метки тоже придётся менять местами при рефакторинге…

statut_t err;

Pool p = PoolInit();
Object1 *obj1 = (Object1 *)PoolPush(&p, NewObject1(), DeleteObject1);
if (obj1 == NULL) {err = ERROR_OBJECT1; goto error;}

Object2 *obj2 = (Object2 *)PoolPush(&p, NewObject2(), DeleteObject2);
if (obj2 == NULL) {err = ERROR_OBJECT2; goto error;}

Object3 *obj3 = (Object3 *)PoolPush(&p, NewObject3(), DeleteObject3);
if (obj3 == NULL) {err = ERROR_OBJECT3; goto error;}

err = Setup(obj1, obj2, obj3);
PoolPop(&p, obj1);
PoolPop(&p, obj2);
PoolPop(&p, obj3);

error:
PoolDestroy(&p);
return err;
fsb4000 ★★★★★
()
Ответ на: комментарий от anonymous

Ну статистика такова - на сишечке выжило систем 5. На С++ ни одной. Даже EPOC32/Symbian умудрился сдохнуть.

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

Нужны для освобождения ресурсов в том же порядке, что и выделение, и использование goto даёт наиболее простой код из возможных вариантов

Присваивание пустых объектов (или обнуление unique_ptr как предлагали выше) в нужном порядке перед выходом из функции еще проще.

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

я бы на С всегда к goto добавлял бы Pool

И получить runtime overhead на пустом месте. CObjectDeleter полностью инлайнится и после компиляции вообще невозможно узнать что он использовался.

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

Просто виндовс и юникс уже тогда разделили рынок. А С++ как язык системного программирования сейчас используют очень крупные компании типа амазона.

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

Да ну.

IncludeOS is a minimal, open source, unikernel operating system for cloud services and IoT. IncludeOS allows users to run C++ applications in the cloud without an operating system. IncludeOS adds operating system functionality to an application allowing oneself to create a ‘virtual machine’ for an application.

IncludeOS applications boot in tens of milliseconds and require only a few megabytes of disk and memory.

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

Так что деды учите матчасть.

https://www.ubuntupit.com/best-cloud-os-the-experts-recommendation/

anonymous
()

Если говорить именно про C++, то Вы получите особое мазохистско-эстетическое удовольствие, что заставит Вас навсегда полюбить этот прекрасный язык. Начните с версии, которая была до c++11, без лямбд, замыканий, auto и for each. Когда был один убогий и бесполезный умный указатель. Без всех этих вещей окунитесь в мир алгоритмов STL с функторами и итераторами, создаваемыми при помощи хитроумных шаблонов. Примените многоэтажные иерархии абстрактных классов, держа в памяти всякие конструкторы копирования и виртуальные деструкторы…

Привыкли к тому, что всегда можете перехватить исключение, к стэк-трейсу, который подробно расскажет о Ваших ошибках? В C++ никогда не знаешь что тебе вернётся, откуда и почему оно всё молча падает. Настоящий экстрим! Красота!

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

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

А при чём тут приложения? Неважно где они там запускаются, железу по-любому нужна ОС чтобы этим приложениям давать ввод-вывод. А чтобы это делать нужны драйвера. А драйвера на цепепе и других «правильных» язычках, увы, не пишутся. В той же IncludeOS всё что относится к железу - по сути обычная сишечная лапша с байтолюбством по полной программе в файле *.cpp.

Stanson ★★★★★
()

А какие преимущества получу я, как питонист, если перейду на эту вашу сишку?

Если будешь собирать код с отладочной информацией, то вместо невнятного трейса в питоне, будешь получать няшную корочку, по которой можно будет пошастать в gdb по фреймам и тоже ничего не понять.

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

А драйвера на цепепе и других «правильных» язычках, увы, не пишут

В Windows драйвера в основном только на С++ и пишутся.

Уровень экспертов лора пробивает очередное дно. Они кроме линукса ничего не видели, да и тот одним глазом…

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

В Windows драйвера в основном только на С++ и пишутся.

[https://github.com/microsoft/Windows-driver-samples/blob/master/audio/sysvad/adapter.cpp](Официальный пример). Чёт кроме static_cast я ничего от плюсов не увидел. Замени их на сишные касты и ничего по сути не изменится. Сплошная сишная лапша.

anonymous
()
Ответ на: комментарий от sniper21
Переход на более эффективный язык программирования уже кардинально повышает скорость выполнения кода.   
Например, программа на Java будет выполняться в 10,8 раз быстрее, а программа на С — ещё в 4,4 раза быстрее, чем на Java.  
Таким образом, переход с Python на C означает повышение скорости выполнения программы в 47 раз.

ТС, дерзай!

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

Никаких в 4.4 раза быстрей давно нет. Скорость java и С отличаются на проценты. А иногда java быстрей.

anonymous
()
Ответ на: комментарий от anonymous
И это только начало оптимизации. Если писать код с учётом особенностей аппаратного обеспечения, на котором он будет выполняться, то можно повысить скорость ещё в 1300 раз. В данном эксперименте код сначала запустили параллельно на всех 18 ядрах CPU (версия 4), затем использовали иерархию кэшей процессора (версия 5), добавили векторизацию (версия 6) и применили специфические инструкции Advanced Vector Extensions (AVX) в версии 7. Последняя оптимизированная версия кода выполняется уже не 7 часов, а всего 0,41 секунды, то есть более чем в 60 000 раз быстрее оригинального кода на Python.
anonymous
()
Ответ на: комментарий от anonymous

Чёт кроме static_cast я ничего от плюсов не увидел.

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

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

то есть более чем в 60 000 раз быстрее оригинального кода на Python.

А нам все равно, а нам все равно.  
Пусть работает хоть 700 часов.   
Зарплату платят нам, зарплату платят нам.  
Каждую среду.
anonymous
()
Ответ на: комментарий от anonymous

ТС хотел, чтобы мы поняли, что код Python можно ускорить в 60000 раз.
А мы дураки посмеивались …

anonymous
()
Ответ на: комментарий от anonymous
Более того, на графической карте AMD FirePro S9150 тот же код выполняется всего за 70 мс, то  
есть в 5,4 раза быстрее, чем самая оптимизированная версия 7 на процессоре общего назначения, и в  
360 000 раз быстрее, чем версия 1.
anonymous
()
Ответ на: комментарий от Crocodoom

На питоне говнякается быстро, но работает медленно. На си наоборот

Удваиваю, лучше и не сказать

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от X512

Она вызывает функцию - третий аргумент шаблона когда указатель выходит из области видимости и он != NULL. Примерно тоже что и std::unique_ptr, но с функцией в качестве деструктора.

Столько телодвижений. Лол. Вместо просто явного вызова того что нужно.

если всё на C++, то можно использовать обычный std::unique_ptr.

Нельзя если память выдаётся блоком от одной аллокации и живи с этим как хочешь.

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

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

DDK и WDK используют Си . Уровень экспертов оценивающих экспертов убог и позорен. От плюсов там одно название.

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

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

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

А иногда java быстрей.

А JavaScript ещё быстрей!

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

*.cpp отнюдь не значит цепепе. Внутри обычная лапша и байтолюбство. Сырцы же есть, загляни хоть, иксперд. :)

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

Это и есть ос управляющая виртуальными ресурсами облака.

А мышь с клавой, память локальную, GPU, подсветку и звук тебе тоже облако организует?

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

Но классы с деструкторами и шаблонами можно использовать для написания драйверов…

Ну покажи мне классы для хоть какой-нибудь работы с железкой. Чтобы с самого начала, с регистров железки объектнутых, с конструкторами/деструкторами, с наследованием, шаблонами, переопределением арифметических и битовых операторов, чтоб нигде никаких кастов адреса из интов и адресной арифметики, без всяких там #define и малейшего байтолюбства. Чтоб прям ООП и чтоб было однозначно понятно, что это ООП даёт хоть какой-то профит в смысле читаемости, понятности и пр. по сравнению с линейной сишной лапшой

Вот честно, абдурина и то приличней выглядит в смысле цепепе чем все ваши «драйвера на C++» вместе взятые, в которых от C++ вообще ничего нет.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 2)
Ответ на: комментарий от X512

Линукс оказался кому-то нужен только после поддержки корпорациями чтобы не платить за UNIX.

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

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

но в реальном мире C приносит результат здесь и сейчас

Потому что код на Си написан в дремучие годы когда C++ ещё не было или был только в зачатке.

Неправда. Есть фирмы, которые пишут вполне себе новый код без легаси исключительно на си без крестов, и это принципиальная позиция. Си проще, а значит и труднообнаружимых ошибок там меньше, и отлаживать легче. Можно написать библиотеку, хорошо её протестировать, и быть уверенным на 99%, что багов в ней нет. И в случае их появления сосредоточиться на отладке нового кода. А вот в крестах с их шаблонами и множественным наследованием, а также перегрузкой, ни в чём никогда нельзя быть уверенным даже на 99%. И для надёжного кода это важно.

Линукс оказался кому-то нужен только после поддержки корпорациями чтобы не платить за UNIX.

BSD UNIX уже существовал и всегда был бесплатным. А ещё был бесплатный Minix.

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

Чтоб прям ООП и чтоб было однозначно понятно, что это ООП

Современный C++ это далеко не «прям ООП» скорее даже он от ООП как раз уходит.

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

Поэтому он и не нужен ибо постоянно от чего то уходит. Сначала от Си с сомнительными лол плюсами, теперь от самого себя в сторону и так уже монструозной каши. Вместо остановиться и спроектировать тупо впихивают «прикольные» штуки. Си это язык управления числами основа его стабильная, проста и понятна, чрезвычайно гибка и в меру сахаронизирована. Всё есть данные, все данные есть числа и инструмент управления ими. Стройно и красиво.А абстракции ради абстракций вызывают только снисходительную улыбку при взгляде на войну с мельницами.

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