OberonCore
https://forum.oberoncore.ru/

Разработка IDE для Оберон/Оберон-2
https://forum.oberoncore.ru/viewtopic.php?f=30&t=1709
Страница 5 из 7

Автор:  Александр Ильин [ Среда, 22 Июль, 2009 13:42 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Это вам нужно, что ли?
Код:
procedure RealToBytes (const val: Double; out arr: array of Byte);
begin
  Move (val, arr, SizeOf (val));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  d: Double;
  a: array [0..SizeOf (Double) - 1] of Byte;
begin
  d := 123.456789;
  RealToBytes (d, a);
end;
sa_t_an писал(а):
Ну как сказать? Для любого компилера 33.12345678 не совсем двоичное - для начала его надо перевести в IEEE-754 float point формат (что бы сохранять допустим в файл)
А при вызове наоборот конвертнуть назад...
Ерунду какую-то напридумывали себе. Прошу же разобраться в проблеме, подробно описать. Нет времени сесть подумать?
sa_t_an писал(а):
Единственное что я не понимаю, так что я тут ваще делаю то?
Тут вы себе льстите. : )

Автор:  sa_t_an [ Среда, 22 Июль, 2009 14:16 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Код:
Тут вы себе льстите


Ну тут скорее вам, если б себе я бы уже давно свалил... Мне просто интересен уровень ваш (вернее отсутствие)

Итак в сотый раз пишу...
Я делаю компилятор(вернее сделал уж почти) на делфи(пишу на русском) совместимый с компилятором оберон...
Совместимость включает в себя создание символьных файлов ПОЛНОСТЬЮ совместимых с символьными файлами оберон компилятора POW! Так вот функция двумя постами выше(моя) дает точное представление числа в формате IEEE как в оберон компиляторе.

Теперь вопрос к мозговому центру профессорского уровня...
Вы вообще представляете ЧТО ДЕЛАЕТ ВАША функция, или вам просто интересно писать лишь бы показать свой уровень?

Для танкистов попробуйте сделать аналог var x: system.byte на дельфи и сравните результат в обероне и в вашей функции, после этого (и только после этого) прошу отписываться и показывать величину своей образованности!!!

Автор:  sdimitry85 [ Среда, 22 Июль, 2009 14:45 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

sa_t_an писал(а):
Для танкистов попробуйте сделать аналог var x: system.byte на дельфи и сравните результат в обероне и в вашей функции, после этого (и только после этого) прошу отписываться и показывать величину своей образованности!!!

разница действительна имеется, ввидимо из-за потери точности при преобразовании из строки в вещественное число...
но это не смертельно, вы же перетаскиваете компилятор на паскаль и дальше развитие будит происходить на паскале и в данном случае полная бинарная совместимость в вещественных числах не нужна...

вот что у меня получилось на дельфи и pow

код на обероне
Код:
MODULE test;

IMPORT File;

VAR
   f1   : LONGINT;
   lr   : LONGREAL;
BEGIN
   f1 := File.Create("oberon");
   lr := 12345.123456789;
   File.Write(f1, lr, 8);
   File.Close(f1);
END test.


код на дельфи
Код:
{$apptype console}
var
  f1      : file of byte;
  lr, lr2 : double;
begin
  lr:= 12345.123456789;

  assignfile(f1, 'delfi');
  rewrite(f1);

  blockwrite(f1, lr, 8);

  closefile(f1);

  assignfile(f1, 'oberon');
  reset(f1);

  blockread(f1, lr2, 8);

  closefile(f1);

  Writeln('delfi lr = ', lr, #10#13'pow oberon lr = ', lr2);
  Writeln;
  Writeln('delfi lr = ', lr:0:20, #10#13'pow oberon lr = ', lr2:0:20);
end.


содержание файлов
Код:
oberon:
00 00 00 C0 8F 1C C8 40
delfi:
9D 9B 6E CD 8F 1C C8 40


результат работы программы на дельфи:
Код:
H:\Pow!\op3>delfi.exe
delfi lr      =  1.23451234567890E+0004
pow oberon lr =  1.23451230468750E+0004

delfi lr      = 12345.12345678900056000000
pow oberon lr = 12345.12304687500000000000


видно что у pow точность хуже, а у дельфи лучше
поэтому при переписи компиля на дельфи точность повысится

Автор:  Александр Ильин [ Среда, 22 Июль, 2009 14:53 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

sa_t_an писал(а):
попробуйте сделать аналог var x: system.byte на дельфи и сравните результат в обероне и в вашей функции
Именно так я и поступил. Реализовал на XDS Oberon, реализовал на Delphi 7, сравнил, и после этого написал.
sa_t_an писал(а):
Для танкистов ... после этого (и только после этого) прошу отписываться и показывать величину своей образованности!!!
Если вас не устраивает результат, значит вы неправильно поставили задачу. А вообще, с таким отношением отправляйтесь-ка вы в игнор.

Автор:  Александр Ильин [ Среда, 22 Июль, 2009 14:55 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

sdimitry85 писал(а):
delfi lr = 12345.12345678900056000000
pow oberon lr = 12345.12304687500000000000
имхо разницей в точности можно пренебречь
Ничего себе, можно пренебречь четвёртым знаком после запятой? Скорее уж, можно пренебречь реализацей POW!

Автор:  sdimitry85 [ Среда, 22 Июль, 2009 14:58 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Александр Ильин писал(а):
sdimitry85 писал(а):
delfi lr = 12345.12345678900056000000
pow oberon lr = 12345.12304687500000000000
имхо разницей в точности можно пренебречь
Ничего себе, можно пренебречь четвёртым знаком после запятой? Скорее уж, можно пренебречь реализацей POW!

я хотел сказать что не нужно все ошибки pow повторять, оттого что компилятор на паскале будит давать более точные значения он только выйграет...

Автор:  sa_t_an [ Среда, 22 Июль, 2009 15:36 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Вот вот вот и я про то же...

В принципе если делать полную совместимость, то потянутся и ошибки...

Вот смотрим функцию IEEE

Код:
FUNCTION RealToIEEE(CONST r:Single): Integer;
VAR
  Overlay: Integer ABSOLUTE r;
BEGIN
  RESULT := Overlay;
END;

FUNCTION IEEEToReal(hex: integer): Single;
VAR
  d : Single;
  Overlay: ARRAY[1..2] OF word ABSOLUTE d;
BEGIN
  Overlay[1] := Hi(hex)*$100+Lo(hex);
  hex:= hex shr 16;
  Overlay[2] := Hi(hex)*$100+Lo(hex);
  RESULT := d;
END;


Вот это полное преобразование в стандарт и обратно...

Вот так оно выглядит в редакторе (HEX) для двух одинаковых SYM файлов но разнокомпилируемых.
Так выходит (там в один бит разница) все равно придется делать не совместимость???
Нораз так, значит во всех реализациях оберонов должна повторятся данная особенность, так как фронт-энд используется один.

ХМ... Странно... Ну да ладно... Вынес это все в отдельные функции, что бы потом повышать точность...

Вложения:
-2.jpg
-2.jpg [ 85.71 КБ | Просмотров: 9857 ]

Автор:  Comdiv [ Среда, 22 Июль, 2009 16:37 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Вы очень путано изъясняетесь, поэтому и возникает такое недопонимание с участниками форума.

Судя по результатам вывода программы, представленной sdimitry85, между представлением REAL в Pow и в Delphi нет разницы. Зато есть разница перевода десятичного представления числа в стандарт IEEE - Pow делает это значительно менее точно, чем Delphi.

Устранение такой неточности на совместимость не повлияет.

Автор:  sa_t_an [ Среда, 22 Июль, 2009 17:03 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Оч хорошо, теперь о вопросах

Цитирую 2 страничную давность

Цитата:
PROCEDURE SymWBytes(VAR x: ARRAY OF SYSTEM.BYTE; len: INTEGER);
VAR i: INTEGER;
BEGIN i:=0;
WHILE i < len DO SYSTEM.VAL(CHAR, x[i]); INC(i) END
END SymWBytes;


Так вот что будет в -> х после вызова таким образом
lr:= 12345.123456789;


Ответ

Цитата:
Я что-то вообще не вижу, чтобы эта процедура что-то делала с x


Куда проще??? Я <удалено модератором> не спрашиваю что делает ФУНКЦИЯ а спрашиваю что будет в х.
Мне еще тогда хотелось тыкнуть для лучей видимости, но я сдержался
PROCEDURE SymWBytes(VAR x: ARRAY OF SYSTEM.BYTE; len: INTEGER);
Типа это приблуда так просто, для красоты что ли?

Но потом
Цитата:
Ещё раз для прапорщиков: ничего конвертировать не надо

Цитата:
Вам на Delphi перевести его?


Потом куча бреда с подтверждением своей значимости
Цитата:
Нет времени сесть подумать?


И только после этого адекватный ответ sdimitry85

Так вот у меня и появляются сомнения, когда я почти в каждом топике пишу, что перевожу код на PASCAL
и через 5 страниц глубокомысленных завсегдатаев форума вдруг осеняет - вроде
- Ааааааа :D , <удалено модератором>, да ты на PASCALе пишишь, а чо ж сразу не сказал???--

<удалено модератором>как я могу серьезно относиться к ответам???

Ну довайте я буду начинать топики с фразы

Я ПИШУ КОМПИЛЯТОР ОБЕРОНА НА PASCAL-е ...

Автор:  slava [ Среда, 22 Июль, 2009 18:17 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Александр Ильин писал(а):
sdimitry85 писал(а):
delfi lr = 12345.12345678900056000000
pow oberon lr = 12345.12304687500000000000
имхо разницей в точности можно пренебречь
Ничего себе, можно пренебречь четвёртым знаком после запятой? Скорее уж, можно пренебречь реализацей POW!
Вообще то это ошибка в 9-ом знаке.
Тип (LONG)REAL работает с вещественными с плавающей запятой, а не с фиксированной.
И да, во многих задачах 9-ым знаком можно пренебречь.
Хотя странно, что простейшее преобразование в LONGREAL приводит к такой ошибке.
Для LONGREAL нормальным является удерживать знаков 15.

Автор:  Евгений Темиргалеев [ Среда, 22 Июль, 2009 21:57 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Обсуждение аватар перенесено: viewtopic.php?p=32366#p32366

Автор:  Иван Горячев [ Четверг, 23 Июль, 2009 01:35 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

sa_t_an писал(а):
Цитирую 2 страничную давность
Код:
  PROCEDURE SymWBytes(VAR x: ARRAY OF SYSTEM.BYTE; len: INTEGER);
    VAR i: INTEGER;
  BEGIN i:=0;
    WHILE i < len DO SYSTEM.VAL(CHAR, x[i]); INC(i) END
  END SymWBytes;

Ответ
Цитата:
Я что-то вообще не вижу, чтобы эта процедура что-то делала с x

Мне еще тогда хотелось тыкнуть для лучей видимости, но я сдержался
PROCEDURE SymWBytes(VAR x: ARRAY OF SYSTEM.BYTE; len: INTEGER);
Типа это приблуда так просто, для красоты что ли?

Satan, если Вы спрашиваете - приводите хотя бы корректные примеры, а не наезжайте на тех, кто Вам отвечает. Приведённый код действительно ничего не делает с x. Он вообще ничего не делает! По одной простой причине - в оригинале он выглядит так:
Код:
PROCEDURE SymWBytes(VAR x: ARRAY OF SYSTEM.BYTE; len: INTEGER);
    VAR i: INTEGER;
  BEGIN i:=0;
    WHILE i < len DO SymWCh(SYSTEM.VAL(CHAR, x[i])); INC(i) END
  END SymWBytes;

Разницу видите? А VAR стоит там исключительно для того, чтобы не копировать весь массив x при вызове функции. Поскольку в стандартном Обероне IN нету ;)

Автор:  Александр Ильин [ Четверг, 23 Июль, 2009 03:45 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Иван Горячев писал(а):
Satan, если Вы спрашиваете - приводите хотя бы корректные примеры, а не наезжайте на тех, кто Вам отвечает. Приведённый код действительно ничего не делает с x. Он вообще ничего не делает!
Спасибо, Иван. Он спросил "Так вот что будет в -> х после вызова таким образом..." (выделено мной), что на редкость двусмысленно. Я его вопрос прочитал так: "Как изменится содержимое переменной x после завершения работы процедуры". А он, как выяснилось лишь через страницу уточнений, хотел спросить, "что будет передано в процедуру с таким паметром при её вызове". Тонкость, как видно, в использовании правильного предлога. Выводы пусть каждый сделает сам.

Всем привет из Швейцарии, кстати! : )

Автор:  sa_t_an [ Четверг, 23 Июль, 2009 04:04 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Вот именно, я спросил что будет в х....

Теперь покажу ход моих мыслей, если бы я отвечал на вопрос...
Первое - отмотал бы на 2 странички назад 5-2=3 и почитал бы топик.

увидел бы такое
Цитата:
lr:= 12345.123456789;
SymWBytes(lr, 8 );


и подумал бы... Ага, раз lr передается по ссылке а не по значению значит в х будет область памяти где расположена lr, но так как она в представлении МАШКОДА+IEEE стандарт, то в x окажется кусок памяти длинной REAL(или LONGREAL) числа, то есть по просту то, что мы видим в HEX редакторе.

Значит ARRAY OF SYSTEM.BYTE это простой массив в который и передается побайтно это значение...
плюс добавил бы функцию которая это же делает на Delphi...

Но это если бы отвечал я...

А у нас получилось что я тупой, дибил, не пойму что хочу и т.д. Ладно хоть как сишники мануалы долбить не отослали (хотя хрен редьки не слаще)
И по моему для вопроса абсолютно не нужна функция, а достаточно заголовка что бы дотюмкать...

Так что это не наезд, а вполне нормальная защитная реакция.

Автор:  Иван Горячев [ Четверг, 23 Июль, 2009 04:19 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

sa_t_an писал(а):
И по моему для вопроса абсолютно не нужна функция, а достаточно заголовка что бы дотюмкать...
Так что это не наезд, а вполне нормальная защитная реакция.

Вот именно, сама функция не нужна. Но Вы её привели, причём зачем-то немножко поправили. Ну да ладно, проехали.

А что касается точности REALов, то я сравнил процедуры OPS.Number из Pow! и DevCPS.Number из ББ. В ББ как раз при чтении вещественных происходят некие дополнительные телодвижения, отсутствующие в Pow. Может быть точность теряется именно здесь, ещё до компиляции?

Александр Ильин писал(а):
Всем привет из Швейцарии, кстати! : )

Ночные бдения? :roll:

Автор:  sa_t_an [ Четверг, 23 Июль, 2009 04:53 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Там скорее всего неверная реализация стандарта IEEE(она ведь закрытая до времени была)... У меня на проверке некоторые биты не совпадали, я промучился часа два, потом взял исходные проверенные данные и по ним понял, что что то не то, поэтому и закрались кой какие сомнения, но во общем это дело уже прошлое, просто на будущее вдруг кто столкнется с неточностями в расчетах и т.д...

Автор:  Иван Горячев [ Четверг, 23 Июль, 2009 05:54 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

sa_t_an писал(а):
Вот смотрим функцию IEEE
Код:
FUNCTION RealToIEEE(CONST r:Single): Integer;
VAR
  Overlay: Integer ABSOLUTE r;
BEGIN
  RESULT := Overlay;
END;

FUNCTION IEEEToReal(hex: integer): Single;
VAR
  d : Single;
  Overlay: ARRAY[1..2] OF word ABSOLUTE d;
BEGIN
  Overlay[1] := Hi(hex)*$100+Lo(hex);
  hex:= hex shr 16;
  Overlay[2] := Hi(hex)*$100+Lo(hex);
  RESULT := d;
END;

Вот это полное преобразование в стандарт и обратно...


Кстати, я не понял. Если мы из reala в integer перегоняем простым проецированием, то зачем нам в обратную сторону пляски с бубном? На мой любительский взгляд либо оба преобразования должны идти через absolute, либо оба - через вот эти вот сложения и умножения.

Автор:  Geniepro [ Четверг, 23 Июль, 2009 07:28 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Александр Ильин писал(а):
sdimitry85 писал(а):
delfi lr = 12345.12345678900056000000
pow oberon lr = 12345.12304687500000000000
имхо разницей в точности можно пренебречь
Ничего себе, можно пренебречь четвёртым знаком после запятой? Скорее уж, можно пренебречь реализацей POW!

Похоже, в POW! LONGREAL на самом деле занимает 4 байта, а не 8...

Автор:  sa_t_an [ Четверг, 23 Июль, 2009 15:00 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Цитата:
либо оба - через вот эти вот сложения и умножения


Это я просто по байтно проверял что там происходит и сравнивал с POW да так в тесте и оставил...

И выходит что в POW длинна
INTEGER - 2
LONGINT - 4
а SHORTINT - как бы соответствует байту...
ну и т.д.

А в других оберонах так же или несколько иначе?

Автор:  sa_t_an [ Суббота, 25 Июль, 2009 00:59 ]
Заголовок сообщения:  Re: Разработка IDE для Оберон/Оберон-2

Ну что, вижу интерес к теме все больше и больше со стороны обероновцев. Оно и понятно, получить Delphi Rad с синтаксисом Оберона кому ж не охото? Разве токма тому, кто жить не может без XDS среды разработки... Ну еще может быть БлэкБоксерам, завидую я им. Куда уж VS Studio или CodeGear RAD до ББ в плане удобства, юзабилити да и вообще в плане компиляции. Сравнивать их и ББ это равнозначно сравнению Notepad.exe и MS Word... Ну да речь не об этом.

Осталься предпоследний вопрос и последний.

Первый - а что же такое все таки SET с точки зрения Delphi. Тоесть на что он похож в представлении Делфийца.
Луче в по байтном виде. Или кучу примеров на Обероне с типом SET (просто заголовки)
И каким аналогом возможно его заменить (например массивом... и т.д.)

И последний вопрос (тоже по байтный) что же все таки происходит с числом(типом) от функции SHORT
Вроде если для LONGINT то было AABBCCDD а стало AABB или стало CCDD или стало BBCC
Функцию (желательно битовую) живую для обозрения.

После решения этих двух вопросов фронт-энд компилер будет готов.
Вернее он уже готов и компилирует модули, экспортирует их (если в них не используются массивы(как вариант SET))

И останется уже вопрос эффективности компилирования модулей и их загрузка. То есть как лучше сделать список импорта рекурсивно, или сразу открыть все модули и распарсить секцию IMPORT, или отслеживать изменение исходного файла и записывать время изменения в него же....

Страница 5 из 7 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/