Автор Тема: Online компилятор Oberon-07/11.  (Прочитано 165075 раз)

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #330 : Январь 09, 2014, 07:37:15 am »
Хотя кажется не для вложенных процедур, тоже всегда указывает на 1ую строку (по крайней мере ошибка попадалась). Если надо, попробую более точно определить (может я чего не догрузил из репозитария)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #331 : Январь 10, 2014, 04:32:44 pm »
Хотя кажется не для вложенных процедур, тоже всегда указывает на 1ую строку (по крайней мере ошибка попадалась). Если надо, попробую более точно определить (может я чего не догрузил из репозитария)

Да, я видел такое не одни раз. Все руки не дошли. Если наткнешься на конкретный пример - запиши в issue плз.

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #332 : Январь 22, 2014, 11:35:52 am »
Такой код, компилится и выполняется.

MODULE test;
IMPORT JS;
VAR
M: ARRAY 10 OF INTEGER;
I : INTEGER;
J : INTEGER;
 
BEGIN
 
J := 500;
I := J + 3;
M[I] := 5;
 JS.alert(M[I]);
END test.

Выводит 5. JS увеличивает сам массив?

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #333 : Январь 22, 2014, 11:39:51 am »
Ещё забавнее.

MODULE test;
IMPORT JS;
VAR
M: ARRAY 10 OF INTEGER;
I : INTEGER;
J : INTEGER;
 
BEGIN
 
J := 500;
I := J + 999999999999999999999999999999999999999999999999999999;
M[I] := 5;
 JS.alert(M[I]);
END test.


Всё работает, ответ 5.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #334 : Январь 22, 2014, 12:08:31 pm »
Ещё забавнее.

MODULE test;
IMPORT JS;
VAR
M: ARRAY 10 OF INTEGER;
I : INTEGER;
J : INTEGER;
 
BEGIN
 
J := 500;
I := J + 999999999999999999999999999999999999999999999999999999;
M[I] := 5;
 JS.alert(M[I]);
END test.


Всё работает, ответ 5.
В этом случае I почему-то принимает значение 0, хотя в предыдущем -- 503...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #335 : Январь 22, 2014, 12:13:33 pm »
Ещё забавнее.

MODULE test;
IMPORT JS;
VAR
M: ARRAY 10 OF INTEGER;
I : INTEGER;
J : INTEGER;
 
BEGIN
 
J := 500;
I := J + 999999999999999999999999999999999999999999999999999999;
M[I] := 5;
 JS.alert(M[I]);
END test.


Всё работает, ответ 5.
В этом случае I почему-то принимает значение 0, хотя в предыдущем -- 503...

Происходит переполнение, потому и сбрасывается в ноль, предположение. Возможно проверка есть в динамике. Но лучше такое ловить на стадии компиляции. Так как такое значение, нереально для диапазона INTEGER. Ну и выдавать сообщение об ошибке.

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #336 : Январь 22, 2014, 12:27:34 pm »

var test = function (JS){
var M = RTL$.makeArray(10, 0);
var I = 0;
var J = 0;
J = 500;
I = J + 1e+54 | 0;
M = 5;
JS.alert(M);
}(this);


JS динамический язык, странно, что сам интерпритатор JS не сообщает об ошибке. Или в JS  это нормально?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #337 : Январь 22, 2014, 12:42:38 pm »

var test = function (JS){
var M = RTL$.makeArray(10, 0);
var I = 0;
var J = 0;
J = 500;
I = J + 1e+54 | 0;
M = 5;
JS.alert(M);
}(this);


JS динамический язык, странно, что сам интерпритатор JS не сообщает об ошибке. Или в JS  это нормально?
Эмм.. Какой ошибки?
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #338 : Январь 22, 2014, 02:07:54 pm »
JS динамический язык, странно, что сам интерпритатор JS не сообщает об ошибке. Или в JS  это нормально?

Да, это нормально для JS. Думал об этой проблеме, но пока не знаю что делать. Проверку на уровне JS не врубить, делать вручную - будет крайне неэффективно.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #339 : Январь 22, 2014, 02:10:29 pm »
Происходит переполнение, потому и сбрасывается в ноль, предположение. Возможно проверка есть в динамике. Но лучше такое ловить на стадии компиляции. Так как такое значение, нереально для диапазона INTEGER. Ну и выдавать сообщение об ошибке.

Там используется какая-то стандартная JS функция для парсинга числа. Вот ей пофиг на переполнения (как обычно в JS). Надо переписывать на свою реализацию.

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #340 : Январь 22, 2014, 02:47:14 pm »
JS динамический язык, странно, что сам интерпритатор JS не сообщает об ошибке. Или в JS  это нормально?

Да, это нормально для JS. Думал об этой проблеме, но пока не знаю что делать. Проверку на уровне JS не врубить, делать вручную - будет крайне неэффективно.

По умолчанию, компилировать со всеми проверками. Добавить флаг, компилировать без проверок. Написал потестил, и скомпилировал без проверок. Особенно когда циклов много, ищи где там, что переполнилось.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #341 : Январь 22, 2014, 04:05:39 pm »
По умолчанию, компилировать со всеми проверками. Добавить флаг, компилировать без проверок. Написал потестил, и скомпилировал без проверок. Особенно когда циклов много, ищи где там, что переполнилось.

Да, есть такая проблема. Просто она не приоритетная. Потому что:
1. Сам репорт ничего не говорит про проверки. Т.е., текущая реализация никак не противоречит оригинальному репорту. Так что вообще говоря лучше начинать с убеждения Вирта в важности таких проверок и необходимости включения их в репорт.
2. В случае компиляции в JS получаемый undefined behavior конечно неприятен, но не настолько фатален как в случае native кода - память не портится (пресловутая герметичность сохраняется).
3. Решение этой проблемы сильно зависит от того, к чему придет компилятор в плане генерации кода. И от того к чему придут браузеры. В JS уже есть типизированные массивы, возможно добавят и возможность проверки индексов - в этом случае проблема решится автоматически.

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #342 : Январь 22, 2014, 04:25:20 pm »
Цитата: vlad
Да, есть такая проблема. Просто она не приоритетная. Потому что:
1. Сам репорт ничего не говорит про проверки. Т.е., текущая реализация никак не противоречит оригинальному репорту. Так что вообще говоря лучше начинать с убеждения Вирта в важности таких проверок и необходимости включения их в репорт.

Опыт си языков, доказал, что данные проверки необходимы. Всегда можно добавить флаг компиляции. Убеждать Вирта, смешно... Данные проверки не меняют язык, потому их наличие ни как не противоречит репорту.

Цитата: vlad
2. В случае компиляции в JS получаемый undefined behavior конечно неприятен, но не настолько фатален как в случае native кода - память не портится (пресловутая герметичность сохраняется).

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

Цитата: vlad
3. Решение этой проблемы сильно зависит от того, к чему придет компилятор в плане генерации кода. И от того к чему придут браузеры. В JS уже есть типизированные массивы, возможно добавят и возможность проверки индексов - в этом случае проблема решится автоматически.

Идею понял. С тем же успехом можно ждать пока в браузеры встроят поддержку оберон.
Неужели данная проверка сложнее, чем уже написанный компилятор, или это личное убеждение?

Самое главное, данные ошибки отлавливаются в рунтайме. Программист при ошибке, получает вменяемое сообщение. Упрощается поиск ошибки, не нужно лопатить код.

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #343 : Январь 22, 2014, 04:34:35 pm »
MODULE test;
IMPORT JS;
VAR
M: ARRAY 10 OF INTEGER;
I : INTEGER;
J : INTEGER;
 
BEGIN
 
J := 500;
I := J + 999999999999999999999999999999999999999999999999999999;
M[I] := 5;
 JS.alert(M[I]);
END test.

Возможность компиляции такого кода, явно не соответствует рапорту. :)

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Online компилятор Oberon-07/11.
« Ответ #344 : Январь 22, 2014, 04:48:28 pm »
Статья Вирта в переводе.

Хорошие идеи: взгляд из Зазеркалья

Цитировать
Аналогичным примером является инструкция проверки границ массива. Она сравнивала индекс массива с нижней и верхней границами массива и вызывала системное прерывание, если значение индекса не находилось в этом диапазоне, объединяя, тем самым, две инструкции сравнения и две инструкции ветвления.