LINUX.ORG.RU

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

 ,


1

2

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

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

а в каких обычных достаточно

Ни в каких. В современном коде на C++ вообще не должно быть ручных вызовов delete/free.

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

Чтобы понять умные указатели, нужно сначала попользоваться обычными

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

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

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

Ладно, уговорил. Разрешаю тебе писать на «более лучшем» C++.

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

Плохо смотрели, выше есть ScopedSpinLock lock(m_lock);. На Си это превратится в лапшу из goto потому что там нет RAII. Не говоря о том что этот код внутри метода класса.

На Си это превратится всего лишь в

SpinLock m_lock;
lock(m_lock);

unlock(m_lock);
return;

А лапша из goto - она совсем про другое, а вовсе не про разлочку.

Serenity быстро компилируется. Haiku тоже с нуля около 20 минут компилируется.

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

Наоборот написанные руками vtable в Си (пример) создают оверхед и компилятор не может их оптимизировать и проверять типы.

Да неужели.

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

Это не я сказала, а Страуструп. Он прямо так и написал, что С оказался непригоден для сложных системных задач.

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

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

Пыль запартная.
Побежал показать свой плибейский код.

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

А ничего, что нет никаких гарантий что unlock(m_lock) будет вызван? Ты дядя похоже вообще не въезжаешь в тему про RAII.

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

Это не я сказала, а Страуструп. Он прямо так и написал, что С оказался непригоден для сложных системных задач.

А если завтра Страуструп скажет «Ты больше не Лиза, отныне будешь зваться Хулией», то ты понурив голову повинуешься «Да, мой Господин» или скажешь «У меня своя голова на плечах! Я – сильная и независимая женщина!» ?

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

Посмотрел.

Я тоже.

void E1000NetworkAdapter::initialize_rx_descriptors()
{
    auto* rx_descriptors = (e1000_tx_desc*)m_rx_descriptors_region->vaddr().as_ptr();
    for (size_t i = 0; i < number_of_rx_descriptors; ++i) {
        auto& descriptor = rx_descriptors[i];
        auto region = MM.allocate_contiguous_kernel_region(8192, "E1000 RX buffer", Region::Access::Read | Region::Access::Write);
        ASSERT(region);
        m_rx_buffers_regions.append(region.release_nonnull());
        descriptor.addr = m_rx_buffers_regions[i].physical_page(0)->paddr().get();
        descriptor.status = 0;
    }

    out32(REG_RXDESCLO, m_rx_descriptors_region->physical_page(0)->paddr().get());
    out32(REG_RXDESCHI, 0);
    out32(REG_RXDESCLEN, number_of_rx_descriptors * sizeof(e1000_rx_desc));
    out32(REG_RXDESCHEAD, 0);
    out32(REG_RXDESCTAIL, number_of_rx_descriptors - 1);

    out32(REG_RCTRL, RCTL_EN | RCTL_SBP | RCTL_UPE | RCTL_MPE | RCTL_LBM_NONE | RTCL_RDMTS_HALF | RCTL_BAM | RCTL_SECRC | RCTL_BSIZE_8192);
}

Ну, несколько auto, да. Но по-моему это практически C.

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

Это не я сказала, а Страуструп. Он прямо так и написал, что С оказался непригоден для сложных системных задач.

Бухой был?
Linux не ругал?

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

Ну, несколько auto, да. Но по-моему это практически C

В данном случае auto «не нужно»

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

На Си это превратится всего лишь в

Нет:

SpinLock m_lock;
lock(m_lock);

if (!Do1()) return B_ERROR; // долго ищем почему всё зависло

unlock(m_lock);
return B_OK;

Ну да, дольше чем линукс

В Haiku и Serenity ещё и весь userland собирается. Сколько времени всякие Gentoo собираются?

в котором на несколько порядков больше поддерживаемого железа.

Некоторое железо поддерживается на стороне userland, например Mesa.

Да неужели.

Да, компилятор умеет не обращаться к vtable если метод известен во время компиляции. При наследовании выполняется проверка типов и ничего не надо кастовать как в Си, пример.

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

А ничего, что нет никаких гарантий что unlock(m_lock) будет вызван?

Если return в конце единственный, то он гарантированно будет вызван.

А если у тебя в драйвере случается exception, то смысла ни в unlock, ни в таком драйвере, ни в таком гуру С++ который это говно написал нет вообще никакого, потому что это нифига не гуй какой, а ядро и железо.

Stanson ★★★★★
()

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

сомнительные

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

потому что это нифига не гуй какой, а ядро и железо.

При работе с железом особенно актуальна обработка ошибок. В Си она превращается в лапшу из goto, а в C++ можно просто написать return error; и ни за что не переживать.

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

В Си она превращается в лапшу из goto, а в C++ можно просто написать return error; и ни за что не переживать.

Если в Си использовать хороший allocate к примеру, то тоже все будет ok.

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

компилятор не может их оптимизировать

Может.

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

Нет:

Нелюбители сишечки во всей красе.

Это выглядит так:

int ret = B_OK;
SpinLock m_lock;
lock(m_lock);

if (!Do1()) ret = B_ERROR; // тут виснет только у упоротых любителей определённого язычка, которые суют его туда куда не следует вместе со своими убогими навыками пригодными только в сфере применения язычка.

unlock(m_lock);
return ret;

В Haiku и Serenity ещё и весь userland собирается.

Неужто Chromium/Firefox внезапно начинает собираться за десятки минут?

Некоторое железо поддерживается на стороне userland

Ну так делали бы модный microkernel тогда. Чтоб драйвера хоть на жабоскрипте вебмакаки писали.

При наследовании выполняется проверка типов и ничего не надо кастовать как в Си,

Каст в Си не занимает ни единого лишнего такта. Это совершенно обычный и нормальный трюк.

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

Если в Си использовать хороший allocate к примеру, то тоже все будет ok.

Проще говоря - плохой код можно написать в любом компиляторе

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

Это выглядит так:

Опять нет. Если возникла ошибка, то нужно прекратить исполнение кода после. Предлагаете делать лестницу из if или лапшу из goto?

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

и ни за что не переживать.

Вот поэтому крайне маловероятно, что в обозримом будущем станет популярной какая-нибудь ОС написанная на С++. Потому что у тех кто пишет на С++ вот именно такое отношение. Лишь бы не переживать.

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

Зачем? Зачет мне будешь ставить? Все свои зачеты по плюсам я сдала, и вспоминаю про него только когда сюда развлечься захожу :)

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

Кому нужно? Компилятор кстати оптимизирует все эти переходы и скачки наверх.

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

Лишь бы не переживать.

Человеческое внимание физиологически ограничено и ничего с этим не сделаешь. В любом большом коде на Си будет уйма уязвимостей, buffer overflow, use after free, memory leak и т.п.. В коде на C++ большинство этих проблем можно исключить.

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

Зачем? Зачет мне будешь ставить? Все свои зачеты по плюсам я сдала, и вспоминаю про него только когда сюда развлечься захожу :)

«По телевизору показывают жуликов».

Ну чем я хуже?
anonymous
()
Ответ на: комментарий от Stanson

Вот поэтому крайне маловероятно, что в обозримом будущем станет популярной какая-нибудь ОС написанная на С++.

Fuschia и Zircon на C++ могут получить популярность.

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

Опять нет. После ошибки нужно прекратить исполнение кода после.

И где там код?

Предлагаете делать лестницу из if или лапшу из goto?

Я вот никак не пойму, чем goto-то не устраивает? Отличная и очень удобная вещь. В некотрых случаях без него всё сильно усложняется.

Автоматическая деструкция по return, кстати, это ещё та засада. Есть немалое количество железа, которое должно деинициализироваться в определённом порядке, сильно отличающемся от порядка инициализации. Так что return в произвольном месте процесса общения с железкой приведёт только к массе геморроя, а вовсе не к отсутствию переживаний.

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

Если return в конце единственный, то он гарантированно будет вызван.

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

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

Fuschia и Zircon на C++ могут получить популярность.

Гарантированную.
И понятно почему …

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

В коде на C++ большинство этих проблем можно исключить.

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

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

А если нет? А если мне нужно выйти из середины цикла или функции?

goto кому придумали?

Говорю, что ты нихрена в этом не разбираешься.

Ну да, это говорит человек забывший про goto.

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

Я вот никак не пойму, чем goto-то не устраивает?

Edgar Dijkstra: Go To Statement Considered Harmful. Код с goto должен сразу отсекаться на code review.

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

C++ всё это умеет из коробки.

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

Ты правда такой тупой? Понимаешь разницу гарантии разлочки, которую дает компилятор и твое ручное рукоблудие, которое рано или поздно приведет к пропущенной разлочке.

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

Ну да, это говорит человек забывший про goto.

Вы еще не поняли с кем разговариваете?
Объясню - фанатом.

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

Я не фанатка, но плюсы, в отличие от вас я учила :). И код бывает на сотни тысяч строк, где пропустить этот goto в ручном режиме как нефиг делать.

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

Код с goto должен сразу отсекаться на code review.

Теоретики такие теоретики.

C++ всё это умеет из коробки.

Да неужели.

В каком порядке деинициализируются объекты при return?

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

Я не фанатка, но плюсы, в отличие от вас я учила :). И код бывает на сотни тысяч строк, где пропустить этот goto в ручном режиме как нефиг делать.

Вот, уже похоже на Лизу /но автор пока еще узнаваем/ …

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

А если мне нужно выйти из середины цикла или функции?

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

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

В обратном инициализации.

И что делать если железка требует иного порядка? :) И там ещё надо кое-что сделать, но только если в неё было заслано определённое значение в определённый регистр.

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

Cargo cult и hero worship намного более harmful, чем стандартная часть ЯП.

Посмотрел на аватар и со всем согласился.

X512 ★★★★★
()

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

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

Если ты привык жрать что дали, то С тебе не нужен. По фичам много всего лучше чем С. D, C++, Rust, Go и т.д. Но есть проблема. Средний растолюб или плюсист не напишет компилятор раста или плюсов, а средний сишник напишет компилятор С.

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

Вы еще не поняли с кем разговариваете? Объясню - фанатом.

Так это с первых слов очевидно же. :) Просто прикольно же.

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

И что делать если железка требует иного порядка? :)

На помойку её можно указать зависимости в деструкторах.

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

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

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