OberonCore https://forum.oberoncore.ru/ |
|
INC/DEC(var, 0) https://forum.oberoncore.ru/viewtopic.php?f=29&t=6434 |
Страница 1 из 1 |
Автор: | Oleg N. Cher [ Суббота, 07 Сентябрь, 2019 01:02 ] |
Заголовок сообщения: | INC/DEC(var, 0) |
Я обнаружил, что компилятор BlackBox разрешает запись INC/DEC(var, 0), которая может быть допущена в таком виде, по-моему, только по недосмотру. В Ofront'е+ я это залатал, теперь при константе 0 он выводит ошибку 63 "Illegal value of constant". Предлагаю внедрить обработку данного случая и в BlackBox. Если по каким-то причинам не согласны, было бы интересно услышать контраргументы. |
Автор: | Info21 [ Суббота, 07 Сентябрь, 2019 11:09 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Поясните, пожалуйста, почему это нужно запретить. |
Автор: | Пётр Кушнир [ Суббота, 07 Сентябрь, 2019 14:18 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Семантика INC/DEC должна быть полностью совместима с +/-, разве нет? |
Автор: | Oleg N. Cher [ Суббота, 07 Сентябрь, 2019 15:25 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Вообще конечно тогда надо с оглядкой прибавлять ноль и множить на ноль, да? Вот почему и спросил. Прибавление нулевой константы тоже может иметь место быть. Но хотя бы может ворнинговать? |
Автор: | Artyemov [ Суббота, 07 Сентябрь, 2019 16:33 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
А смысл, вообще, в INC\DEC какой? Только чтоб пальцы об клавиатуру меньше стирались ? var := var + const; (* у всех архитектур - команда процесора *) INC (var, const); (* вызов в стеке не формируется? выглядит как вызов подпрограммы, а на самом деле та же команда процессора? "Несистематичненько" *) |
Автор: | Пётр Кушнир [ Суббота, 07 Сентябрь, 2019 20:52 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Это как бы процедура модуля, который импортирован всеми модулями по дефолту (встроенные процедуры от компилятора/рантайма). Можно не пользоваться, но как-то так в медиаполе принято считать, что A:=A+B через арифметику без оптимизаций выполняется медленнее, чем INC(A, B) через компилятор (возможно даже в обход ALU на некоторых процессорах, но об этом думать не надо). Как мы недавно выяснили, оптимизации в процессорах важнее оптимизаций в компиляторах. Поэтому INC/DEC имеет право на существование. |
Автор: | Oleg N. Cher [ Воскресенье, 08 Сентябрь, 2019 01:12 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Про INC/DEC(var, 0) вопрос снят. Просто уберу для приращения 0 генерацию кода var += 0; и var -= 0; |
Автор: | Александр Ильин [ Воскресенье, 08 Сентябрь, 2019 22:27 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Я предпочитаю писать INC(A, B), чтобы не дублировать в тексте идентификатор A. Не пальцы берегу, а глаза. При чтении длинных идентификаторов напрягает проверять, одно и то же с двух сторон ":=" написано или не очень. В INC() очень однозначно выражается намерение увеличить значение некоторой переменной, а не присвоить ей что-то новое. По этой же причине иногда жалею, что нету "*=" и - совсем редко - "/=". |
Автор: | Info21 [ Воскресенье, 08 Сентябрь, 2019 23:26 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Александр Ильин писал(а): Я предпочитаю писать INC(A, B), чтобы не дублировать в тексте идентификатор A. Эта проблема была ощутимой при подготовке "Алгоритмов и ..."
|
Автор: | Иван Денисов [ Понедельник, 09 Сентябрь, 2019 06:57 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Код: PROCEDURE P1; VAR a: INTEGER; BEGIN a := a + 3; END P1; PROCEDURE P2; VAR a: INTEGER; BEGIN INC(a, 3); END P2; Код для процедур и правда одинаковый получается. Код: PROCEDURE P1 00000001H: 55 push ebp 00000002H: 8B EC mov ebp, esp 00000004H: 83 C4 FC add esp, -4 00000007H: 83 45 FC 03 add -4[ebp], 3 0000000BH: 8B E5 mov esp, ebp 0000000DH: 5D pop ebp 0000000EH: C3 ret Код: PROCEDURE P2
0000000FH: 55 push ebp 00000010H: 8B EC mov ebp, esp 00000012H: 83 C4 FC add esp, -4 00000015H: 83 45 FC 03 add -4[ebp], 3 00000019H: 8B E5 mov esp, ebp 0000001BH: 5D pop ebp 0000001CH: C3 ret |
Автор: | Борис Рюмшин [ Понедельник, 09 Сентябрь, 2019 13:48 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Иван Денисов писал(а): Код для процедур и правда одинаковый получается. А ты в обоих случая поставь 0 и подивись на результат. |
Автор: | Иван Денисов [ Понедельник, 09 Сентябрь, 2019 18:00 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Получилось так Код: PROCEDURE P1 00000001H: 55 push ebp 00000002H: 8B EC mov ebp, esp 00000004H: 83 C4 FC add esp, -4 00000007H: 8B 45 FC mov eax, -4[ebp] 0000000AH: 89 45 FC mov -4[ebp], eax 0000000DH: 8B E5 mov esp, ebp 0000000FH: 5D pop ebp 00000010H: C3 ret Код: PROCEDURE P2
00000011H: 55 push ebp 00000012H: 8B EC mov ebp, esp 00000014H: 83 C4 FC add esp, -4 00000017H: 8B E5 mov esp, ebp 00000019H: 5D pop ebp 0000001AH: C3 ret |
Автор: | Artyemov [ Понедельник, 09 Сентябрь, 2019 19:04 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
О глазах мне нужно было задуматься перед обзаведнием контупером Александр Ильин писал(а): ...В INC() очень однозначно выражается намерение увеличить значение некоторой переменной, а не присвоить ей что-то новое... А вот это - АРГУМЕНТ! |
Автор: | Oleg N. Cher [ Понедельник, 09 Сентябрь, 2019 21:41 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Иван, а если на единицу? Может будет inc, а не add? |
Автор: | Иван Денисов [ Вторник, 10 Сентябрь, 2019 07:01 ] |
Заголовок сообщения: | Re: INC/DEC(var, 0) |
Oleg N. Cher писал(а): Иван, а если на единицу? Может будет inc, а не add? Да, тогда inc в обоих случаях. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |