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/