LINUX.ORG.RU
ФорумTalks

Почему жабисты и растаманы лучше С++ников

 , ,


5

12

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

Показываю на примере undefined результата в случае переполнения int в С в компиляторе здорового человека и в компиляторе курильщика.

В компиляторе здорового человека под undefined behavior в случае переполнения int подразумевается, что человек напишет программу так, что переполнения int не будет потому что он предупреждён. Поэтому компилятор может применить к выражениям оптимизации, которые небезопасны в случае переполнения.

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

А это не одно и то же. Оптимизации здорового человека не предполагают нарушения логики работы программы. Если у вас написано x&y то операция И должна быть выполнена. Там нет переполнения. Её надо выполнить, даже если по отдельности икс и игрек переполнились. Вы не можете убрать операцию только потому, что у вас int в качестве аргумента. Выражение должно давать правильный результат при допустимых аргументах, вот что означает undefined behavior у int при недопустимы аргументах.

Оптимизации курильщика же предполагают что выражение может дать непредсказуемый результат всегда. Они просто не понимают, почему так нельзя. «в стандарте написано». Ученым до сих пор непонятно, почему компиляторы курильщика не заменяют все выражения, содержащие int, на вызов random(). Возможно, курильщики просто не знают о существовавнии этой функции и генерят рандом руками на лету.

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

А что касается исключений в деструкторах и прочей байды. Так это то же самое. Они просто не понимают почему нельзя. Не запрещено же. Они реально не понимают, зачем существует та или иная штука. Поэтому кстати у них и шаблоны атакуют и bloatят код. Люди просто не могут не «шаблонить». Зомбачи.

Поэтому жабакодеры и растаманы лучше С++ников. С++ гавно а жаба рулит и раст рулит. GC в каждый дом. Исключения в каждый деструктор. Потому что надо жить не по лжи.

Перемещено tailgunner из development

☆☆☆

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

Интересно, почему? В Minecraft-е с высотой мира 256 кубиков тормозит, а в minetest-е с астрономической высотой не тормозит?

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

в кубаче вообще изначально был говнокод. его потом декомпилировали и заменили. вся история установки модов в кубач - это «распакуйте жар и замените такие-то классы на такие-то».

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

ckotinko ☆☆☆
() автор топика
Ответ на: комментарий от ckotinko

Я думаю можно составить похожий пример где компилятор удалит не умножение а операцию &. И там тоже будет какое-нибудь опасное число при котором на выходе получится -1.

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

Это как с маленькими детьми, если на них кричать и нервничать то они почуют твою слабость, а если спокойно все рассказать и обьяснить, то может чему-то и научатся.

pftBest ★★★★
()

ха, оказывается я что-то сделал, что заставляет gcc генерить железобетонно кривой код.

unsigned from = ...
unsigned to     = ...
unsigned i;
for(i = from & 8191u; i != to; i = 8191u&(i+delta)) {
    ...
}

не работает если delta = int, а её значения четко +1 или -1. но если взять unsigned tmp = delta и прибавлять его вместо дельты, то все работает. вот такой интересный эффект от результатов atan2, домноженных на коцифиент и приведенных к целому.

что ж они там такое оптимизируют, что неявное приведение к unsigned дает результат отличный от явного?

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

ckotinko ☆☆☆
() автор топика
Ответ на: комментарий от ckotinko

какое слово должны написать в стандарт и в компилятор, чтобы оно давало возможность оптимизировать? ;) Ты расскажи компиляторщикам, может они добавят. Типа RUB - Really Undefined Behavior. RRU - Really Really Undefined.

stevejobs ★★★★☆
()
29 сентября 2017 г.
Ответ на: комментарий от ckotinko

Дай компилируемый код, чтобы можно было воспроизвести баг :\

Pentium02 ★★
()

А что касается исключений в деструкторах и прочей байды. Так это то же самое. Они просто не понимают почему нельзя. Не запрещено же. Они реально не понимают, зачем существует та или иная штука.

Деструкторы без исключений не могут заниматься полноценной обработкой ошибок. А почему в них такие ограничения на выброс исключений - вполне себе понятно. Но это не делает идиому RAII применимой для корректной работы с ресурсами, освобождение которых может упасть.

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

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

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

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

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

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

люди в принципе не понимают, а что не так. они не понимают, что оптимизации != право на генерацию говнокода. это пизец. всех в раст, и чтоб не возвращались.

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

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

В программе отражено то, что что написал я.

int i = -1;

std::cout << (i & 0x7FFFFFFF) << " is always >= 0" << std::endl;

В программе отражено то, что написал я? Или это убогий говнокод, рассчитанный на то, что int = это 32 бита в 2's-complement формате?

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

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

оптимизации не могут нарушать логику программы. оптимизации не >> могут нарушать логику программы. оптимизации не могут нарушать >> логику программы. оптимизации не могут нарушать логику программы. оптимизации не могут нарушать логику программы.

Всё просто - научись выражать логику своей программы на языке C++, а не на диалекте C++ страны розовых пони.

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

Казалось бы, такая простая тема. Вася сказал пети «делай как хочешь» - Петя сделал дерьмо. Алёша спросил у Пети «почему ты сделал дерьмо?» - на что петя ему отвечает «но Вася мне сказал „делай как хочешь“».

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

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

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

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

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

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