сообщили в Ассоциации туроператоров России (АТОР).
Это та ассоциация, члены которой дальше Турции с Египтом не дотягиваются уже года 4 как? С тем же успехом можно было рекомендации ассоциации больных находящихся в коме перепостить.
Стоило указать версию дельфей и параметры компиляции, а то знаете ли:
From RAD Studio Athens (R120), all of the floating-point-related exception masks will be turned ON. The applications will no longer raise Floating Point exceptions on all platforms as default.
Дельфю такие альтернативно одарённые гении развивают, что волосы дыбом.
Результат будет 2.
Такое поведение гарантировано вам спецификацией языка. Присвоение происходит только в случае, когда правая часть выражения вычислена полностью и без ошибок времени исполнения.
О выделении или не выделении памяти это не говорит ровным счётом ничего.
Если бы память под правую часть строке 6 не выделялась, то было 15 — результат сложения до возникновения ошибки при вычислении ln(0). А так получается, что выделена память под новое значение x. Начались расчеты, 5 записали, 10 прибавили, а потом — бах! — исключение.
Вам стоит ознакомиться с тем, во что транслируется конструкции используемого вами языка, какие оптимизации применяются в современных компиляторах, про стек и то, как реализован вызов функций на уровне ассемблера.
Вычисления в вещественных числах на уровне ассемблера не очень читаемы, поэтому заменим код примера на его функциональный аналог:
{$OVERFLOWCHECKS OFF}
program HABR935234;
uses
System.SysUtils,
System.Math,
Vcl.Dialogs;
function RaiseDivByZero(): Integer;
var
Zero: Integer;
begin
Zero := 0;
Result := 1337 div Zero;
end;
procedure Foo();
var
X: Integer;
begin
X := 2;
try
X := 5 + 10 + RaiseDivByZero() + 1;
except
on E: Exception do
ShowMessage(IntToStr(X));
end;
end;
begin
Foo();
end.
Посмотрим, во что скомпилировалось наше выражение (View > Debug Windows > CPU Windows > Entire CPU во время отладки):
Как видите, вызов RaiseDivByZero() в виде call $00c42ab4 происходит до того, как будут вычислены 5 + 10 + (add eax, $0f) и + 1 (inc eax).
Временное значение хранится в регистре eax и записывается в память (mov [ebp-$04], eax) только в самом конце, после всех вычислений.
«Э» вместо «з», «выюбросы», я видел подобного стиля тексты на сферических китайских товарах в вакууме ещё много лет тому назад. Получается, у китайских трудящихся были нейросети задолго до шумихи на западе. )
Такое впечатление, что обработкой текста вы не занимались никогда. Однобайтовые кодировки это боль и страдания, юникод это благо. Из-за суррогатных пар благо не идеальное, но всё же благо.
Когда закончили миграцию на Delphi XE и получили юникодный VCL и RTL, код стал значительно чище.
Замечу, что WideString и UnicodeString не эквивалентны, хоть и там и там UTF-16 внутри.
Что же до неявных преобразований, то у Delphi тут тоже рыльце в пушку. Когда вводили UnicodeString в язык впилили неявные преобразования между UnicodeString, UTF8String и AnsiString и при миграции нужно было быть весьма внимательным.
Приходилось патчить в рантайме функции конвертации и после прогонов разгребать логи в поисках неучтённых конвертаций.
David is an Australian developer, currently living in far-north Europe. He a former senior product manager for C++ at Idera where he looked after C++Builder and Visual Assist.
Работник Идеры-Эмбаркадеры завёл тикет и описал там то, с каким синтаксисом эту конструкцию решили делать. Это ничего не говорит о предпочтениях большинства желавших эту конструкцию.
Это та ассоциация, члены которой дальше Турции с Египтом не дотягиваются уже года 4 как?
С тем же успехом можно было рекомендации ассоциации больных находящихся в коме перепостить.
Команда «К ноге!»
Это лекция для колхозников. Не мешайте, товарищ дачник!
Будучи вырванным из контекста, это звучит прекрасно:
«Булат» — к нам хрен пробьёшься!
Потом появляется Нео, выходит из Матрицы и уничтожает эту тюрьму народов. Если пассажиры, конечно же, раньше от пролежней не перемрут.
Хаб «Java» вижу, ни единой строчки на жабе не вижу. Оффтоп, однако!
Какой-то неправильный виндовс, в правильном для кириллицы кодировка 1251. 866 это для DOS.
Зато название оправдывает полностью! )
Мне вспоминается ещё минимум один эпизод, когда совместимость сломали.
В какой-то момент в
record
добавили поддержку свойств. Заодно покорёжили некоторые старые типы,TRect
в частности.И работавший раньше код вида
Превратился в тыкву.
Из более нового вот это тоже прекрасно: https://docwiki.embarcadero.com/RADStudio/Athens/en/Floating_Point_Operation_Exception_Masks
Стоило указать версию дельфей и параметры компиляции, а то знаете ли:
Дельфю такие альтернативно одарённые гении развивают, что волосы дыбом.
Такое поведение гарантировано вам спецификацией языка. Присвоение происходит только в случае, когда правая часть выражения вычислена полностью и без ошибок времени исполнения.
О выделении или не выделении памяти это не говорит ровным счётом ничего.
Вам стоит ознакомиться с тем, во что транслируется конструкции используемого вами языка, какие оптимизации применяются в современных компиляторах, про стек и то, как реализован вызов функций на уровне ассемблера.
Вычисления в вещественных числах на уровне ассемблера не очень читаемы, поэтому заменим код примера на его функциональный аналог:
Посмотрим, во что скомпилировалось наше выражение (View > Debug Windows > CPU Windows > Entire CPU во время отладки):
Как видите, вызов
RaiseDivByZero()
в видеcall $00c42ab4
происходит до того, как будут вычислены5 + 10 +
(add eax, $0f
) и+ 1
(inc eax
).Временное значение хранится в регистре
eax
и записывается в память (mov [ebp-$04], eax
) только в самом конце, после всех вычислений.Никаких дополнительных выделений памяти.
Я ведь даже отдельно подчеркнул, что не
WideString
.«Э» вместо «з», «выюбросы», я видел подобного стиля тексты на сферических китайских товарах в вакууме ещё много лет тому назад. Получается, у китайских трудящихся были нейросети задолго до шумихи на западе. )
Сразу в печь, не читая.
Предлагаете добавить в Delphi на уровне языка ограничение в одно присвоение на переменную? )
Экономия на спичках, локальные/временные переменные обычно в регистрах.
И
Result
в том числе.Такое впечатление, что обработкой текста вы не занимались никогда.
Однобайтовые кодировки это боль и страдания, юникод это благо. Из-за суррогатных пар благо не идеальное, но всё же благо.
Когда закончили миграцию на Delphi XE и получили юникодный VCL и RTL, код стал значительно чище.
Замечу, что
WideString
иUnicodeString
не эквивалентны, хоть и там и там UTF-16 внутри.Осталось только уговорить индусов тратить время на язык, доля которого на рынке сильно меньше C# и Java и за который дают меньше денег.
Чем вам объекты не нормальный тип?
Что же до неявных преобразований, то у Delphi тут тоже рыльце в пушку.
Когда вводили
UnicodeString
в язык впилили неявные преобразования междуUnicodeString
,UTF8String
иAnsiString
и при миграции нужно было быть весьма внимательным.Приходилось патчить в рантайме функции конвертации и после прогонов разгребать логи в поисках неучтённых конвертаций.
И?
Работник Идеры-Эмбаркадеры завёл тикет и описал там то, с каким синтаксисом эту конструкцию решили делать. Это ничего не говорит о предпочтениях большинства желавших эту конструкцию.
Подозреваю, что большинство просило
(A > B) ? GetStr1() : GetStr2()
, а не вот эти вот простыни с if-then.