Автор Тема: Строки в О7  (Прочитано 33524 раз)

DddIzer

  • Гость
Re: Строки в О7
« Ответ #15 : Март 29, 2013, 07:42:42 pm »


Такое работать вообще будет? Или это ошибка компиляции? Или ошибка исполнения? Или что вообще?
решайте  сами... если Вирт  явно это не прописал... - значит  этот вопрос  не важен с точки зрения его видения Оберона.. т.е.  как реализатор вы можете выбрать любой путь..
я, например, бы выбрал следующий вариант - ошибка компиляции (предпочтительно), или  ошибка времени выполнения..

Проблема в том, что такое решение приведет к созданию диалекта языка. Причем диалекта не совместимого с другими "реализациями". Выходит язык Оберон описан так, что невозможно просто взять и реализовать его, любая реализация автоматически порождает несовместимый диалект в плане даже самых базовых вещей.
Так я над этим делом и посмеялся в теме про UB... но с другой стороны может в этом и идея Вирта.. заложить основу для родственных DSL...своя реализация под определенные классы микроконтроллеров... - почему бы и нет ?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #16 : Март 29, 2013, 07:52:18 pm »
Так я над этим делом и посмеялся в теме про UB... но с другой стороны может в этом и идея Вирта.. заложить основу для родственных DSL...своя реализация под определенные классы микроконтроллеров... - почему бы и нет ?
Откровенно говоря, не вижу тут особого профита с точки зрения микроконтроллеров... Вот именно что в части этих заморочек с типами и строками.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #17 : Март 29, 2013, 07:55:17 pm »
Так. У меня ощущение складывается, что проблема есть и просто с массивами:

MODULE TestModule;

VAR intArray : ARRAY 8 OF INTEGER;

PROCEDURE Test(VAR arg : ARRAY OF INTEGER);
VAR localArray : ARRAY 100500 OF INTEGER
BEGIN
   arg := localArray
END Test

BEGIN
   Test(intArray)
END TestModule.

Что будет? Так можно вообще? Если да, то почему? Если нет, то тоже почему?
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Строки в О7
« Ответ #18 : Март 29, 2013, 07:56:31 pm »
Откровенно говоря, не вижу тут особого профита с точки зрения микроконтроллеров... Вот именно что в части этих заморочек с типами и строками.

Точно. Такие недосказанности никак не помогают оптимизациям под конкретную железку. Они помогают только уложиться в 16 страниц ;)

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Строки в О7
« Ответ #19 : Март 29, 2013, 08:00:28 pm »
Так. У меня ощущение складывается, что проблема есть и просто с массивами:

MODULE TestModule;

VAR intArray : ARRAY 8 OF INTEGER;

PROCEDURE Test(VAR arg : ARRAY OF INTEGER);
VAR localArray : ARRAY 100500 OF INTEGER
BEGIN
   arg := localArray
END Test

BEGIN
   Test(intArray)
END TestModule.

Что будет? Так можно вообще? Если да, то почему? Если нет, то тоже почему?

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

DddIzer

  • Гость
Re: Строки в О7
« Ответ #20 : Март 29, 2013, 08:01:18 pm »
Так я над этим делом и посмеялся в теме про UB... но с другой стороны может в этом и идея Вирта.. заложить основу для родственных DSL...своя реализация под определенные классы микроконтроллеров... - почему бы и нет ?
Откровенно говоря, не вижу тут особого профита с точки зрения микроконтроллеров... Вот именно что в части этих заморочек с типами и строками.
как гипотеза, профит для разработчиков микроконтроллеров - в том, чтобы быстро забацать DSL на  основе оберонных идей, с учетом специфики железа...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #21 : Март 29, 2013, 08:06:30 pm »
Так. У меня ощущение складывается, что проблема есть и просто с массивами:

MODULE TestModule;

VAR intArray : ARRAY 8 OF INTEGER;

PROCEDURE Test(VAR arg : ARRAY OF INTEGER);
VAR localArray : ARRAY 100500 OF INTEGER
BEGIN
   arg := localArray
END Test

BEGIN
   Test(intArray)
END TestModule.

Что будет? Так можно вообще? Если да, то почему? Если нет, то тоже почему?

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

OK. Сделаю одного типа:
MODULE TestModule;

VAR
   arr1 : ARRAY 8 OF INTEGER;
   arr2 : ARRAY 100500 OF INTEGER;

PROCEDURE Test(VAR a, b : ARRAY OF INTEGER);
BEGIN
   a := b
END Test

BEGIN
   Test(arr1, arr2)
END TestModule.

Лучше? :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #22 : Март 29, 2013, 08:14:26 pm »
Да, а чтобы не было соблазна просто поменять "указатели" местами, вот уточненный пример:

MODULE TestModule;

VAR arr1 : ARRAY 8 OF INTEGER;

PROCEDURE Test1 (VAR a : ARRAY OF INTEGER);
VAR  arr2 : ARRAY 100500 OF INTEGER;
BEGIN
   Test2(a, arr2)
END Test1

PROCEDURE Test2 (VAR a, b : ARRAY OF INTEGER);
BEGIN
   a:=b
END Test2

BEGIN
   Test1(arr1)
END TestModule.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: Строки в О7
« Ответ #23 : Март 29, 2013, 08:16:08 pm »

Лучше? :-)
а в чем проблемы? - размеры массивов не совпадают, значит присваивание (копирование содержимого) невозможно (строки  - исключение)- решение см. выше (ошибка времени компиляции или времени выполнения)
« Последнее редактирование: Март 29, 2013, 08:17:58 pm от DddIzer »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #24 : Март 29, 2013, 08:18:00 pm »

Лучше? :-)
а в чем проблемы? - размеры массивов не совпадают, значит присваивание невозможно (строки  - исключение)- решение см. выше (ошибка времени компиляции или времени выполнения)
Типы совпадают 1 в 1. На этапе компиляции (особенно раздельной независимой компиляции модулей, как это любят в Обероне) это в принципе не ловится.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: Строки в О7
« Ответ #25 : Март 29, 2013, 08:19:36 pm »

Лучше? :-)
а в чем проблемы? - размеры массивов не совпадают, значит присваивание невозможно (строки  - исключение)- решение см. выше (ошибка времени компиляции или времени выполнения)
Типы совпадают 1 в 1. На этапе компиляции (особенно раздельной независимой компиляции модулей, как это любят в Обероне) это в принципе не ловится.
значит остается второй вариант. (ошибка времени выполнения)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Строки в О7
« Ответ #26 : Март 29, 2013, 08:22:02 pm »

Лучше? :-)
а в чем проблемы? - размеры массивов не совпадают, значит присваивание невозможно (строки  - исключение)- решение см. выше (ошибка времени компиляции или времени выполнения)
Типы совпадают 1 в 1. На этапе компиляции (особенно раздельной независимой компиляции модулей, как это любят в Обероне) это в принципе не ловится.
значит остается второй вариант. (ошибка времени выполнения)
Ошибки времени исполнения не прописаны в репорте практически никак.

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

Ну и вообще, не понятно зачем тогда в язык вообще ввели открытые массивы.
Y = λf.(λx.f (x x)) (λx.f (x x))

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Строки в О7
« Ответ #27 : Март 29, 2013, 08:31:42 pm »
Открытый массив — это указатель + размер. Размер проверяется во время выполнения. Присваивание a:=b при b большего размера вызовет UB. Правильные программы такого не допустят.

IF LEN(b) <= LEN(a) THEN ... END

DddIzer

  • Гость
Re: Строки в О7
« Ответ #28 : Март 29, 2013, 08:35:50 pm »

Лучше? :-)
а в чем проблемы? - размеры массивов не совпадают, значит присваивание невозможно (строки  - исключение)- решение см. выше (ошибка времени компиляции или времени выполнения)
Типы совпадают 1 в 1. На этапе компиляции (особенно раздельной независимой компиляции модулей, как это любят в Обероне) это в принципе не ловится.
значит остается второй вариант. (ошибка времени выполнения)
Ошибки времени исполнения не прописаны в репорте практически никак.

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

Ну и вообще, не понятно зачем тогда в язык вообще ввели открытые массивы.
а что нельзя разве с статическими массивами связать неявные переменные (размеры) - и анализировать их?

DddIzer

  • Гость
Re: Строки в О7
« Ответ #29 : Март 29, 2013, 08:38:12 pm »
Открытый массив — это указатель + размер. Размер проверяется во время выполнения. Присваивание a:=b при b большего размера вызовет UB. Правильные программы такого не допустят.

IF LEN(b) <= LEN(a) THEN ... END
необязательно  (языком реализация не декларируется)