LINUX.ORG.RU

C++20 и 2D Graphics

 ,


0

10

Исходник: https://isocpp.org/files/img/wg21-timeline-2017-11.png

Оказывается, все проблемы C++ уже решены, и теперь можно приступать к самой важной части системного языка - 2D графике.

Вопрос: что за безумие происходит в комитете C++? Зачем системному языку, да и вообще любому языку, 2D графика в std? Тем более, по слухам, они собираются использовать убогий cairo.

Из подобных языков приходит в голову только tcl/tk и red.

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

Какой «вывод типов», алло?

Тот, из-за отсутствия которого приходится писать больше кода.

Ты чтобы мусор вынести на мусорку в 15 метрах от подъезда, на машине ездишь?

Нет. Но я еду на лифте. Причем 2 раза.

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

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

Нет виляй. Речь шла о многословности.

devzero> Вся «многословность» Си здесь исключительно в невозможности использовать сахар «вызов метода».

Так вот, не вся.

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

Если не задумываться об обработке паники и бросить ее — да, не будет. Какая от этого практическая польза?

Похоже мы о чём-то разном говорим. Что мешает панику ловить и обрабатывать? Или ты о том Result, который catch_unwind вернёт? Но он в сигнатуре функции не фигурирует.

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

Если мы пишем всё свое - да, можно сделать исключения на паниках, но какой смысл?

Смысла мало (с этим я и не спорил), но можно ведь.

Просто считаю, что заявления о том, что в Rust (Go) «нет исключений» не совсем честные.

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

Просто считаю, что заявления о том, что в Rust (Go) «нет исключений» не совсем честные.

Они вполне честные - исключений нет. Их можно сделать, но их даже в Си можно сделать. Наверное, правильно говорить «в Rust нет исключений, но есть всё необходимое для реализации исключений, которые буду ломать программу в зависимости от опций сборки».

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

Они вполне честные - исключений нет.

Ага, только есть (практически) аналогичная сущность с другим названием. Ничего реализовывать не надо, разве что catch более громоздкий получается.

буду ломать программу в зависимости от опций сборки

Передёргиваешь, добавляй, в таком случае, «с версии 1.10». Ну да ладно.

Безотносительно этого: какой по твоему процент приложений на расте будет использовать «abort» стратегию обработки паники? Интересен прямой ответ. Так-то я (тоже?) считаю, что возможная фрагментация библиотек по данному признаку - это плохо.

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

Ничего реализовывать не надо

Что, вообще ничего? Окей, покажи мне, как поймать Ex1 и игнорировать (передавать дальше) все остальные исключения.

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

Передёргиваешь, добавляй, в таком случае, «с версии 1.10»

Зачем? Если время не указано, имеется в виду настоящее время.

Безотносительно этого: какой по твоему процент приложений на расте будет использовать «abort» стратегию обработки паники?

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

Так-то я (тоже?) считаю, что возможная фрагментация библиотек по данному признаку - это плохо.

" - Мне плохо? Мне плохо? ДА МНЕ П*Ц!!!11" (ц) анекдот

Вообще, со стратегией обработки ошибок у Rust сейчас всё плохо.

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

Как тебе такая наркомания?

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

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

Окей, покажи мне, как поймать Ex1 и игнорировать (передавать дальше) все остальные исключения.

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

Просто я считаю, что отсутствием исключений можно было бы назвать отсутствие функций catch_unwind, resume_unwind, ну и/или «abort», как единственную стратегию «обработки» паники.

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

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

~$ cat ./test.c
#include <setjmp.h>
#include <stdio.h>
#include <string.h>

jmp_buf try_blocks__[256];
jmp_buf *try_blocks_end__ = try_blocks__;
void pop_try_block(int* p) { --try_blocks_end__; }
void* thrown_value() { static char r[1024]; return r; }

#define try for(int pop__ __attribute__ ((__cleanup__(pop_try_block))) = 0 ; pop__ < 1 ; ++pop__) if(!setjmp(*try_blocks_end__++))
#define catch else
#define throw(x) { __auto_type tmp = (x); memcpy(thrown_value(), &tmp, sizeof(tmp)); longjmp(*(try_blocks_end__ - 1), 1); }
#define rethrow longjmp(*(try_blocks_end__ - 2), 1)


int main(int argc, char** argv) {
    try {
        printf("Ok, let's begin.\n");

        try {
            printf("Nested try block.\n");
            throw(1.5);
            printf("I do not appear.\n");
        }
        catch {
            printf("Got Exception: %f\n", *(double*) thrown_value());
            rethrow;
        }

        printf("I do not appear.\n");
    }
    catch {
        printf("Got Exception again: %f\n", *(double*) thrown_value());
    }

    return 0;
}

~$ clang ./test.c
~$ ./a.out 
Ok, let's begin.
Nested try block.
Got Exception: 1.500000
Got Exception again: 1.500000

В С есть исключения! Можно еще прикрутить, например, GVariant и С11 и сделать такое:

try {
    printf("Ok, let's begin.\n");

    try {
        printf("Nested try block.\n");
        throw(1.5);
        printf("I do not appear.\n");
    }
    catch(double d) {
        printf("Got Exception: %f\n", d);
        rethrow;
    }
    catch(int n) {
        printf("Got Exception: %d\n", n);
    }
    finally {
    }

    printf("I do not appear.\n");
}
catch(double d) {
    printf("Got Exception again: %f\n", d);
}

Как минимум я сходу не вижу, что может этому помешать. Но по факту в С исключений нет и не будет. Так же и в Rust, если авторы языка захотят добавить языковые конструкции, то в Rust будут исключения, иначе - только костыли, которыми будут пользоваться единицы. И тут я с tailgunner'ом полностью согласен.

// CAPTCHA: Toilets LOVERS

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

В С есть исключения

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

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

Деструкторов или их аналогов нет,

Ну это уже проблема С, а не «исключений».

барьера на catch нет - локальный контекст поломается

Подробней?

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

Ну это уже проблема С, а не «исключений»

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

можно же finally запилить, и в нем чистить все что надо

Половина удобства исключений теряется, придется в каждой функции с ресурсами писать try/catch/finally.

Подробней

Локальные non-volatile переменные ломаются при выходе из longjmp - могут кэшироваться на регистрах.

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

Можно еще прикрутить, например, GVariant и С11 и сделать такое:

Я бы с интересом посмотрел.

...которыми будут пользоваться единицы. И тут я с tailgunner'ом полностью согласен.

Так тут и я не спорю.

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

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

Эта проблема не только с исключениями, но и с goto, break, continue, return etc. Такой уж C - надо постоянно следить за ресурсами.

Половина удобства исключений теряется, придется в каждой функции с ресурсами писать try/catch/finally.

Да, но опять же такой уж С.

Локальные non-volatile переменные ломаются при выходе из longjmp - могут кэшироваться на регистрах.

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

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

Я бы с интересом посмотрел.

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

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

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

Давая уточним: ты считаешь, что если на реализацию такого перехвата придётся каждый раз писать условные 100 строк кода, то это означает «отсутствие исключений», так?

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

Т.е. нужен не только механизм, но и стандартная поддержка. В Rust даже механизм не гарантируется.

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