debi12345 писал(а):хотя занимает совсем мало инструкций. Но на молочении даже это "совсем мало" заметно.
зато тут есть лишняя команда сравнения
- Код: Выделить всё
- cmpl $-1,%esi
А вообще это здесь оффтоп, я думаю.
Модератор: Модераторы
debi12345 писал(а):хотя занимает совсем мало инструкций. Но на молочении даже это "совсем мало" заметно.
cmpl   $-1,%esiА вообще это здесь оффтоп, я думаю.


Mikhail писал(а):Алексей, умоляю, больше не пишите мне.
debi12345 писал(а):Оценка цены проверки диапазона если таковую реализовать в рантайме для типов вроде "integer from 0 to 10" или integer{5}. Если задаешь точный диапазон, то подразумевается что будешь его проверять не только на этапе компиляции
Мне кажется, что оценка на вхождение в диапазон, как на этапе компиляции, так в runtime, если и нужна, то очень и очень редко.

type
  thebooleantype = $ff; //8bit
  thecardinaltype = $00000000..$ffffffff; //32bit
  theintegertype = -$8000..$7fff; //16 bit
  thecharactertype = #$00..#$ff; //8bit
  thenotbyteboundarytype = $0..$f; 
  //4bit if bitpacked, 8bit otherwise, helpful as bitfields in controllerregisters for
  // bitpacked records
  thesubrangetype = 5..10; //4bit if bitpacked, 8bit otherwise
unit systypes;
type
//same on all architectures
  bool1= $1; //1bit
  bool8= $ff;
  bool16= $ffff;
  bool32= $ffffffff;
  card8 = $00..$ff;
  card16 = $0000..$ffff;
  card32 = $00000000..$ffffffff;
  card64 = $0000000000000000..$ffffffffffffffff;
  int8 = -$80..$70;
  int16 = -$8000..$7fff;
  int32 = -$80000000..$7fffffff;
  int64 = -$8000000000000000..$7fffffffffffffff;
  char8 = #$00..#$ff; 
  char16 = #$0000..#$ffff; 
  char32 = #$00000000..#$ffffffff:
//achitecture dependent, there can be more diferentation for
//different operating systems 
//boolean, cardinal and integer are the "recommended" types
//card and int have the size of the CPU registers
  boolean = bool8;
{$if REGISTERSIZE = 16}
  cardinal = card16;
  integer = int16;
  card = card16;
  int = int16;
{$else}
  cardinal = card32;
  integer = int32;
{$endif}
{$if REGISTERSIZE = 32}
  card = card32;
  int = int32;
{$else}
  {$if REGISTERSIZE = 64}
  card = card64;
  int = int64;
  {$endif}
{$endif}
debi12345 писал(а): Если задаешь точный диапазон, то подразумевается что будешь его проверять не только на этапе компиляции
if (xmin <= x) and (xmax >= x) then...Собственно переполнение контролируется только для целых равных размеру регистра
jno <label>; // если нет переполнения операнда то продолжать на эту метку
call FPC_OVERFLOW; // сгенерировать исключение по переполнению    if (i2 > -1) and (i2 < 100000000) then movl   %ebx,%eax
cmpl   $-1,%eax
jng   .Lj53
cmpl   $100000000,%eax
jnl   .Lj53
movzbl   %bl,%eax; // приведение типа int8->int32
movsbl   %bl,%eax; // приведение типа int16->int32
movl    %ebx,%eax; // int32->int32 без приведения

debi12345 писал(а):Не автоматом, а на каждом доступе к контроллируемым переменным вызывается специнструкция JNO (ловящая флаг CPU о переполнении) :
 
 xor eax, eax
mov al, [x]
add ebx //второй операнд в ebx


debi12345 писал(а):Кстати, с этими приведениями типов контроль диапазона входных переменных на рантайме не работает, контроллируется только результат математических операций. Хмм..
var x:1..100;
readln(a);
проверка для них, по сути, эквивалентна "ручной" проверке.
Если я введу 101 ошибки не будет?
//achitecture dependent, there can be more diferentation for
//different operating systems
integer as TINY; // shortest for arch (current "byte")
integer as COMPACT; // smth like current int16
integer as FASTEST; // smth like current int32
integer as BIG; // smth like current int64
integer as HUGE; // maximal emulated size

debi12345 писал(а):Это значит что "широкая" типизация вроде "INTEGER FROM <min> [TO <max>]" имеет смысл (проверка диапазона только на этапе компиляции - как происходит сейчас), так как не приведет к падению перформанса в ран-тайме относительно нынешней реализации.
debi12345 писал(а):Чтобы ловила на ран-тайме - нужно вставлять (опциональный) код проверки - он слегка замедлит прогу. Можно придумать спецфлаг для переменных, управляющий рантайм-проверками.
Ну сгенирируется исключение, и что с ним делать


debi12345 писал(а):Выносить код проверки и обработки в отдельное от рабочего кода место - очень удобно, во многом поэтому пипл обожает исключения
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0