MSElang : обсуждение фишек

Вопросы программирования и использования MSEide + MSEgui.

Модератор: Модераторы

Kemet
постоялец
Сообщения: 241
Зарегистрирован: 10.02.2010 18:28:32
Откуда: Временно оккупированная территория
Контактная информация:

Сообщение Kemet »

Mikhail писал(а):
Kemet писал(а): компиляторе я оперирую лишь одной сущностью - целое.


Вам кажется. На самом деле это не так. Вот если есть только Integer, то действительно сущность будет одна.

ИМХО, Вы усложняете. Излишнее обобщение тоже плохо.
С чего бы мне казалось, если я этот компилятор пишу?
В смысле пишу не компилятор zonnon'а, а языка, где типы обозначаются так же.
alexey38
долгожитель
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Сообщение alexey38 »

Mikhail писал(а):Нет не чушь. если бы после Integer могло стоять любое число, то сущность была бы одна.

Вы себя реально ведете странно.
Вы говорите "если бы после Integer могло стоять любое число, то сущность была бы одна", например, "int{17}". Вопрос, а для того, чтобы int был сущностью сам по себе, обязательно ли нужно поддерживать дробные числа "int{17.3123124}"? А нужно ли поддерживать буквы "int{аываы}"?
Как содержимое в скобках, и ограничения на содержимое в скобках влияет на сущность слова "int" ???

Mikhail писал(а):Явное указание размера операндов очень слабо вяжется с кроссплатформенным программированием.

Явное указание размера операндов для языка высокого уровня ни как не является ограничением на кроссплатформенность. Собственно это уже задача компилятора рождать машинный код под нужную платформу.
В тоже время должны быть типы без модификатора, указывающего на размер операдна, для того бы на конкретной платформе под этим понимался "родной тип" этой платформы.
Mikhail писал(а):а если у вас 8-ми битный контроллер?

И что? Вы, что ли никогда не программировали на таких (8-ми битный контроллере)?
Там 64 битная арифметика реализуется точно также, как и на 32-битном процессоре. Учите ассемблер, и затем уже давайте советы. А то реально какой-то малограмотный бред несете.
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

Kemet писал(а): чего бы мне казалось, если я этот компилятор пишу?
В смысле пишу не компилятор zonnon'а, а языка, где типы обозначаются так же.


Ну тогда Вам следующее рацпредложение, по "сокращению сущностей".

Код: Выделить всё

var r: Number{32}; //целое 32 бита
      d: Number{32.}; //вещественное с плавающей точкой 32 бита
      d: Number{32.4}; //вещественное с фиксированной точкой 32 бита 4 бита на дробную часть
Kemet
постоялец
Сообщения: 241
Зарегистрирован: 10.02.2010 18:28:32
Откуда: Временно оккупированная территория
Контактная информация:

Сообщение Kemet »

debi12345 писал(а):Зачем ?
Для опоры.
debi12345 писал(а):А если напрмер хотим ограничить значение до 31 :
Это уже диапазонные типы, размероность которых определяется компилятором.
Последний раз редактировалось Kemet 08.11.2013 20:15:38, всего редактировалось 1 раз.
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

alexey38 писал(а):И что? Вы, что ли никогда не программировали на таких (8-ми битный контроллере)?
Там 64 битная арифметика реализуется точно также, как и на 32-битном процессоре. Учите ассемблер, и затем уже давайте советы. А то реально какой-то малограмотный бред несете.


:D :D :D

Алексей, умоляю, больше не пишите мне.
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

Mikhail я вижу тебе не нравятся классы, но ведь все кто применяют объектно-ориентированный дизайн не могут ошибаться, и не зря наверное классы вделали во все нормальные языки, в том числе, в те, в которых классов изначально не было. В Pascal приделали классы, в C приделали классы, получился C++. В Java, C#, Python, Perl, PHP - везде классы. Если кто-то не осилил классы, это не значит, что надо их выбросить
Kemet
постоялец
Сообщения: 241
Зарегистрирован: 10.02.2010 18:28:32
Откуда: Временно оккупированная территория
Контактная информация:

Сообщение Kemet »

Mikhail писал(а):
Kemet писал(а): чего бы мне казалось, если я этот компилятор пишу?
В смысле пишу не компилятор zonnon'а, а языка, где типы обозначаются так же.


Ну тогда Вам следующее рацпредложение, по "сокращению сущностей".

Код: Выделить всё

var r: Number{32}; //целое 32 бита
      d: Number{32.}; //вещественное с плавающей точкой 32 бита
      d: Number{32.4}; //вещественное с фиксированной точкой 32 бита 4 бита на дробную часть

Очередное обострение?
i: integer{16};
u: cardinal{16}
r: real{32};
x: real{32, IEEE-LE}
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

hinst писал(а):Mikhail я вижу тебе не нравятся классы, но ведь все кто применяют объектно-ориентированный дизайн не могут ошибаться, и не зря наверное классы вделали во все нормальные языки, в том числе, в те, в которых классов изначально не было. В Pascal приделали классы, в C приделали классы, получился C++. В Java, C#, Python, Perl, PHP - везде классы. Если кто-то не осилил классы, это не значит, что надо их выбросить

Я не считаю их панацеей, но в данной теме это оффтоп.

Добавлено спустя 2 минуты 10 секунд:
Kemet писал(а):Очередное обострение?
i: integer{16};
u: cardinal{16}
r: real{32};
x: real{32, IEEE-LE}


Вы меня не переубедите, я категорически против введения лишних сущностей в грамматику языка.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

а если у вас 8-ми битный контроллер?

АФАЙК, под них производитель выкладывает свои SDK - пока что на "С". Чтобы выкладывали на PASCAL-е, реально нужно чтобы было:

Код: Выделить всё

i1: integer as MIN_FIT;
i2: integer as MAX_FIT;
i3: integer as HUGE;
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

debi12345 писал(а):АФАЙК, под них производитель выкладывает свои SDK - пока что на "С". Чтобы выкладывали на PASCAL-е, реально нужно чтобы было:


Любите Вы все усложнять. :D
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Нет не чушь. если бы после Integer могло стоять любое число, то сущность была бы одна.

100%.
Если не любое, а фиксированный (пусть даже расширяемый) набор значений - то это ничем не отличается от набора "int8..in64".

Добавлено спустя 8 минут 57 секунд:
Это уже диапазонные типы, размероность которых определяется компилятором.

Для IA32 все что не равно 32 - диапазонные (неотлавливемые аппаратными прерываниями), АФАЙК. 8 бит в это случает ничуть не оптимизированне чем 5 бит.
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

debi12345 писал(а):Для IA32 все что не равно 32 - диапазонные (неотлавливемые аппаратными прерываниями), АФАЙК. 8 бит в это случает ничуть не оптимизированне чем 5 бит.


Кстати, сложение int32 + int32 будет быстрее чем int32 + int8
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Кстати, сложение int32 + int32 будет быстрее чем int32 + int8

Может потому, что компилятор генерит код проверки диапазона для INT8 перед каждой операцией ?
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

debi12345 писал(а):Может потому, что компилятор генерит код проверки диапазона для INT8 перед каждой операцией ?


AI32 не умеет складывать операнды разных размеров. Хотя насчет быстрее, я может погорячился, но команд больше нужно будет.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Рантайм-проверка на диапазон отнимает примерно 10% быстродейсвия молотильных операций. Но обычных операциях все не так страшно. INT32+INT32 на 2..3% быстрее чем INT32+INT8
из-за более "movl %ebx,%eax" чем "movzbl %bl,%eax".

Код: Выделить всё

program addspeed;
{$mode objfpc}

uses
  sysutils,dateutils;

var
  i2: longint;
  i3: longint;
  i1: byte;
  i: longint;
  dt: tdatetime;
begin
  i1:= 1;
  i2:= 0;
  dt:= now;
  for i:=0 to 100000000 do i2:= i2 + i1;
  writeln('longint + byte: ',millisecondof(now - dt),' ms');
  i3:= 1;
  i2:= 0;
  dt:= now;
  for i:=0 to 100000000 do i2:= i2 + i3;
  writeln('longint + longint: ',millisecondof(now - dt),' ms');
end.


fpc -O3 -a <file>

Код: Выделить всё

int32 + int8
   incl   %edx
   movzbl   %bl,%eax
   addl   %esi,%eax
   movl   %eax,%esi
   cmpl   $100000000,%edx
   jl   .Lj11

int32 + int32
   incl   %edx
   movl   %ebx,%eax
   addl   %esi,%eax
   movl   %eax,%esi
   cmpl   $100000000,%edx
   jl   .Lj46


fpc -O3 -a -Cr - Co <file> // range & overflow checks

Код: Выделить всё

int32 + int8
       .Lj11:
   addl   $1,%edx
   movzbl   %bl,%eax
   addl   %esi,%eax
   jno   .Lj14
   call   FPC_OVERFLOW
.Lj14:
   movl   %eax,%esi
   cmpl   $100000000,%edx
   jl   .Lj11

int32 + int32
.Lj47:
   addl   $1,%edx
   movl   %ebx,%eax
   addl   %esi,%eax
   jno   .Lj50
   call   FPC_OVERFLOW
.Lj50:
   movl   %eax,%esi
   cmpl   $100000000,%edx
   jl   .Lj47


Добавлено спустя 14 минут 3 секунды:
Самопальная проверка на диапазон

Код: Выделить всё

  for i:=0 to 100000000 do begin
    if i2 > -1 then i2:= i2 + i1;
  end;


Приводит к 20..25% замедлению на молотильных операциях :

Код: Выделить всё

.Lj11:
   incl   %edx
   cmpl   $-1,%esi
   jng   .Lj13
   movzbl   %bl,%eax
   addl   %esi,%eax
   movl   %eax,%esi
.Lj13:
   cmpl   $100000000,%edx
   jl   .Lj11


Код: Выделить всё

.Lj48:
   incl   %edx
   cmpl   $-1,%esi
   jng   .Lj50
   movl   %ebx,%eax
   addl   %esi,%eax
   movl   %eax,%esi
.Lj50:
   cmpl   $100000000,%edx
   jl   .Lj48

хотя занимает совсем мало инструкций. Но на молочении даже это "совсем мало" заметно.

Добавлено спустя 4 минуты 24 секунды:
При дефолтной оптимизации самопальная проверка диапазона снижает скорость молочения на 5..6%.
Ответить