OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 11 Ноябрь, 2019 22:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: INC/DEC(var, 0)
СообщениеДобавлено: Суббота, 07 Сентябрь, 2019 01:02 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 347
Откуда: Украина, Днепропетровская обл.
Я обнаружил, что компилятор BlackBox разрешает запись INC/DEC(var, 0), которая может быть допущена в таком виде, по-моему, только по недосмотру. В Ofront'е+ я это залатал, теперь при константе 0 он выводит ошибку 63 "Illegal value of constant". Предлагаю внедрить обработку данного случая и в BlackBox. Если по каким-то причинам не согласны, было бы интересно услышать контраргументы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Суббота, 07 Сентябрь, 2019 11:09 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Поясните, пожалуйста, почему это нужно запретить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Суббота, 07 Сентябрь, 2019 14:18 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2625
Откуда: Россия, Ярославль
Семантика INC/DEC должна быть полностью совместима с +/-, разве нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Суббота, 07 Сентябрь, 2019 15:25 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 347
Откуда: Украина, Днепропетровская обл.
Вообще конечно тогда надо с оглядкой прибавлять ноль и множить на ноль, да? Вот почему и спросил. Прибавление нулевой константы тоже может иметь место быть.

Но хотя бы может ворнинговать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Суббота, 07 Сентябрь, 2019 16:33 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 356
А смысл, вообще, в INC\DEC какой? Только чтоб пальцы об клавиатуру меньше стирались ;-) ?
var := var + const; (* у всех архитектур - команда процесора *)
INC (var, const); (* вызов в стеке не формируется? выглядит как вызов подпрограммы, а на самом деле та же команда процессора? "Несистематичненько" ;-) *)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Суббота, 07 Сентябрь, 2019 20:52 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2625
Откуда: Россия, Ярославль
Это как бы процедура модуля, который импортирован всеми модулями по дефолту (встроенные процедуры от компилятора/рантайма). Можно не пользоваться, но как-то так в медиаполе принято считать, что A:=A+B через арифметику без оптимизаций выполняется медленнее, чем INC(A, B) через компилятор (возможно даже в обход ALU на некоторых процессорах, но об этом думать не надо). Как мы недавно выяснили, оптимизации в процессорах важнее оптимизаций в компиляторах. Поэтому INC/DEC имеет право на существование.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Воскресенье, 08 Сентябрь, 2019 01:12 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 347
Откуда: Украина, Днепропетровская обл.
Про INC/DEC(var, 0) вопрос снят. Просто уберу для приращения 0 генерацию кода var += 0; и var -= 0;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Воскресенье, 08 Сентябрь, 2019 22:27 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2316
Откуда: Россия, Томск
Я предпочитаю писать INC(A, B), чтобы не дублировать в тексте идентификатор A. Не пальцы берегу, а глаза. При чтении длинных идентификаторов напрягает проверять, одно и то же с двух сторон ":=" написано или не очень. В INC() очень однозначно выражается намерение увеличить значение некоторой переменной, а не присвоить ей что-то новое.

По этой же причине иногда жалею, что нету "*=" и - совсем редко - "/=".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Воскресенье, 08 Сентябрь, 2019 23:26 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Александр Ильин писал(а):
Я предпочитаю писать INC(A, B), чтобы не дублировать в тексте идентификатор A.
Эта проблема была ощутимой при подготовке "Алгоритмов и ..."


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Понедельник, 09 Сентябрь, 2019 06:57 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2430
Код:
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 


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Понедельник, 09 Сентябрь, 2019 13:48 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4335
Откуда: Россия, Орёл
Иван Денисов писал(а):
Код для процедур и правда одинаковый получается.

А ты в обоих случая поставь 0 и подивись на результат.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Понедельник, 09 Сентябрь, 2019 18:00 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2430
Получилось так

Код:
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 


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Понедельник, 09 Сентябрь, 2019 19:04 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 356
О глазах мне нужно было задуматься перед обзаведнием контупером ;-)
Александр Ильин писал(а):
...В INC() очень однозначно выражается намерение увеличить значение некоторой переменной, а не присвоить ей что-то новое...

А вот это - АРГУМЕНТ!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Понедельник, 09 Сентябрь, 2019 21:41 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 347
Откуда: Украина, Днепропетровская обл.
Иван, а если на единицу? Может будет inc, а не add?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: INC/DEC(var, 0)
СообщениеДобавлено: Вторник, 10 Сентябрь, 2019 07:01 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2430
Oleg N. Cher писал(а):
Иван, а если на единицу? Может будет inc, а не add?

Да, тогда inc в обоих случаях.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB