Oberon space

General Category => Общий раздел => Тема начата: kemiisto от Март 30, 2011, 12:25:11 pm

Название: Динамические (открытые) массивы в Оберонах.
Отправлено: kemiisto от Март 30, 2011, 12:25:11 pm
Вот, нашёл Comment on a note on dynamic arrays in PASCAL от Отца-основателя. Мотивировочка для введения открытых массивов. Компромисс... Идея обрела реализацию в Oberon-2.

Внимание вопрос! А почему из Oberon-07 открытые массивы выпилили? Никто не встречал обоснования Самого?
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: Geniepro от Март 30, 2011, 12:44:52 pm
Вирт же как-то заявил, что он пытался в древности реализовать динамические массивы и за час с этим не справился, поэтому в его языках таких массивов не будет.
Однако в оберон всё таки добавил их (не знаю, как там с модулой-2).
А в обероне-07 ему такие массивы в микроконтроллерах, видимо, не понадобились, вот он их и выкинул за ненадобностью -- зуб-то у него на них давно уже...
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 30, 2011, 01:58:49 pm
Было бы интересно  узнать, зачем ЕМУ это все было нужно вообще... Однако , выдержка интересная - стоит обратить внимание на то, что Вирт индексирует  эти гипотетические (в те времена) массивы с 1 -т.е. в то время на эффективность реализации ему было пофиг.
Название: Re:Динамические (открытые) массивы в Оберона&
Отправлено: vlad от Март 30, 2011, 02:13:46 pm
Было бы интересно  узнать, зачем ЕМУ это все было нужно вообще... Однако , выдержка интересная - стоит обратить внимание на то, что Вирт индексирует  эти гипотетические (в те времена) массивы с 1 -т.е. в то время на эффективность реализации ему было пофиг.

Эффективность тут постольку поскольку. Ну вот смотрите, свежайший пример из задачки про электронные таблицы. Как перейти от буквенного индекса к целочисленному? "alpha - 'A'". Ну или на обероне: "alpha - ORD('A')". А если у вас индексирование с единицы, то начинает лезть "ненужная" 1: "alpha - ORD('A') + 1". И таких примеров - тыща. Можно индексировать с 1, но неудобно.
Название: Re:Динамические (открытые) массивы в Оберона&
Отправлено: DIzer от Март 30, 2011, 02:27:09 pm


Эффективность тут постольку поскольку. Ну вот смотрите, свежайший пример из задачки про электронные таблицы. Как перейти от буквенного индекса к целочисленному? "alpha - 'A'". Ну или на обероне: "alpha - ORD('A')". А если у вас индексирование с единицы, то начинает лезть "ненужная" 1: "alpha - ORD('A') + 1". И таких примеров - тыща. Можно индексировать с 1, но неудобно.
К сожалению , а что мешает буквенный индекс нумеровать с 1 - впрочем  ответ понятен- тяжелое наследие прошлого, но в конкретном замкнутом на себя  языке этого можно избежать . (vlad - я ПРЕКРАСНО понимаю про что вы говорите - просто подчеркиваю, что в те временя Вирт это не считал проблемой).
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: valexey от Март 30, 2011, 02:51:31 pm
Вот, нашёл Comment on a note on dynamic arrays in PASCAL от Отца-основателя. Мотивировочка для введения открытых массивов. Компромисс... Идея обрела реализацию в Oberon-2.
Следует учитывать, что к Оберону-2 Вирт имеет отношение постольку поскольку.
Чисто виртовские языки – это Оберон и Оберон-07.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 30, 2011, 03:15:10 pm
Следует учитывать, что к Оберону-2 Вирт имеет отношение постольку поскольку.
Чисто виртовские языки – это Оберон и Оберон-07.
Раз уж такой разговор, то следует учитывать что концепт открытых массивов (соглашений по которому в подпрограмму передаются массивы ОДИНАКОВЫХ типов РАЗЛИЧНЫХ размерностей) отличается от оного в случае динамических массивов  :)
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 30, 2011, 07:10:46 pm
Следует учитывать, что к Оберону-2 Вирт имеет отношение постольку поскольку.
Чисто виртовские языки – это Оберон и Оберон-07.
Раз уж такой разговор, то следует учитывать что концепт открытых массивов (соглашений по которому в подпрограмму передаются массивы ОДИНАКОВЫХ типов РАЗЛИЧНЫХ размерностей) отличается от оного в случае динамических массивов  :)
Ох , конечно же моя ляпа - я имел ввиду различные размеры (количество элементов массива ) а не размерности, сорри.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: Илья Ермаков от Март 30, 2011, 08:01:24 pm
2 Dizer:

Вы же математик - вот Вам пояснение, почему нумерация с нуля соответствует "природе задач". Арифметика вычетов по какому-то модулю включает числа от 0 до этого числа - 1. Любая n-ричная система счисления включает знаки от 0 до n-1. Как следствие, во многих случаях арифметика с массивами от 0 выполняется естественным образом. Пример я приводил, например, - кольцевой буфер.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 30, 2011, 08:14:24 pm
2 Dizer:

Вы же математик - вот Вам пояснение, почему нумерация с нуля соответствует "природе задач". Арифметика вычетов по какому-то модулю включает числа от 0 до этого числа - 1. Любая n-ричная система счисления включает знаки от 0 до n-1. Как следствие, во многих случаях арифметика с массивами от 0 выполняется естественным образом. Пример я приводил, например, - кольцевой буфер.
Как "математик" я это прекрасно знаю (не заставляйте меня повторятся). Арифметика арифметикой, но  я говорю про сущности вещей - в данном случае о массиве - как о наборе одинаковых контейнеров - индивидуальное обращение к которому производится по номеру (только не надо здесь уточнять это определение (эти уточнения я тоже знаю)). Я веду речь о том, что ЧЕЛОВЕКУ естественно отсчитывать сущности с 1 (одно яблоко, два яблока) - 0 яблок означает у него отсутствие оных. Насчет буфера - не вижу проблемы , заменяйте везде a mod b на
а mod b +1 - и будет вам счастье...И  ваш идол Вирт судя по этой статье прекрасно об этом знал.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: igor от Март 31, 2011, 08:00:49 am
массивы ОДИНАКОВЫХ типов
Массивы РАЗЛИЧНЫХ типов - это и не массивы вовсе, а записи. Так что в Вашем выражении слова "ОДИНАКОВЫХ типов" не несут полезной информации.  ;)
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: Geniepro от Март 31, 2011, 08:08:50 am
массивы ОДИНАКОВЫХ типов
Массивы РАЗЛИЧНЫХ типов - это и не массивы вовсе, а записи. Так что в Вашем выражении слова "ОДИНАКОВЫХ типов" не несут полезной информации.  ;)

массивы ОДИНАКОВЫХ типов:
ARRAY 10 OF INTEGER
ARRAY 10 OF INTEGER

Массивы РАЗЛИЧНЫХ типов:
ARRAY 10 OF INTEGER
ARRAY 11 OF INTEGER
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: igor от Март 31, 2011, 08:10:13 am
ЧЕЛОВЕКУ естественно отсчитывать сущности с 1 (одно яблоко, два яблока) - 0 яблок означает у него отсутствие оных.
В данном случае уместнее было бы сказать "первое яблоко", "второе яблоко".
"Нулевое яблоко" - не означает отсутствие оных. (Означает "яблоко с индексом ноль").

Я вижу неприятность только в одном. В том, что математики индексируют элементы матрицы начиная с единицы. Таким образом, "ихние" индексы элементов матрицы и "правильные" индексы элементов числового массива, в котором хранится эта матрица, не совпадают.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: igor от Март 31, 2011, 08:14:28 am
Массивы РАЗЛИЧНЫХ типов - это и не массивы вовсе, а записи.

массивы ОДИНАКОВЫХ типов: ...

Массивы РАЗЛИЧНЫХ типов: ...


Всё, расклинило мозги.  :D
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 31, 2011, 08:57:43 am
Я вижу неприятность только в одном. В том, что математики индексируют элементы матрицы начиная с единицы. Таким образом, "ихние" индексы элементов матрицы и "правильные" индексы элементов числового массива, в котором хранится эта матрица, не совпадают.
К сожалению, таковыми  являются ВСЕ люди после школы. Да и Вирт как ни странно  ;)
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 31, 2011, 09:03:25 am
Всё, расклинило мозги.  :D
Без проблем -щас "расклиним" -окончательно  :D если вы этого хотите (а не просто побздеть). Оригинально, открытые массивы были предназначены для того, чтобы передавать в одну и тy же процедуру массивы обьявленные.
как (например)
VAR a:ARRAY 10 OF INTEGER;  b:ARRAY 11 OF INTEGER;
 т.е у этих массивов (переменные a и b) , тип один (INTEGER) , а размер (количество элементов различается 10 и 11 cоответственно).
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: valexey от Март 31, 2011, 09:37:54 am
Всё, расклинило мозги.  :D
Без проблем -щас "расклиним" -окончательно  :D если вы этого хотите (а не просто побздеть). Оригинально, открытые массивы были предназначены для того, чтобы передавать в одну и тy же процедуру массивы обьявленные.
как (например)
VAR a:ARRAY 10 OF INTEGER;  b:ARRAY 11 OF INTEGER;
 т.е у этих массивов (переменные a и b) , тип один (INTEGER) , а размер (количество элементов различается 10 и 11 cоответственно).

Переводя на ООПшный язык, открытый массив типа INTEGER является базовым классом для всех массивов INTEGER вне зависимости от их реальной длины.

То есть имеем таки иерархию.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 31, 2011, 09:51:42 am
Всё, расклинило мозги.  :D
Без проблем -щас "расклиним" -окончательно  :D если вы этого хотите (а не просто побздеть). Оригинально, открытые массивы были предназначены для того, чтобы передавать в одну и тy же процедуру массивы обьявленные.
как (например)
VAR a:ARRAY 10 OF INTEGER;  b:ARRAY 11 OF INTEGER;
 т.е у этих массивов (переменные a и b) , тип один (INTEGER) , а размер (количество элементов различается 10 и 11 cоответственно).

Переводя на ООПшный язык, открытый массив типа INTEGER является базовым классом для всех массивов INTEGER вне зависимости от их реальной длины.

То есть имеем таки иерархию.
Не совсем так , дело в том, что не  существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: valexey от Март 31, 2011, 10:38:12 am
Не совсем так , дело в том, что не  существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.
Это интерфейс, абстрактный класс. Назвать можно как угодно. Интерфейс суть частный случай класса.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 31, 2011, 10:52:17 am
Не совсем так , дело в том, что не  существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.
Это интерфейс, абстрактный класс. Назвать можно как угодно. Интерфейс суть частный случай класса.
Тоже не то, здесь речь идет об интерпретации (специальной) формы  вызова а не о форме самой- в классическом определении интерфейса  речь идет именно о количестве  переменных и их типах (которые  вместе образуют форму)  -интерфейс являющийся общим для подпрограмм , реализующих разные (в общем случае) алгоритмы.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: igor от Март 31, 2011, 11:13:06 am
Переводя на ООПшный язык, открытый массив типа INTEGER является базовым классом для всех массивов INTEGER вне зависимости от их реальной длины.
Не совсем так , дело в том, что не  существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.

И ещё одна формулировочка:
Открытый массив - это массив, задание длин размерностей которого откладывается до момента создания массива.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 31, 2011, 11:17:50 am
Переводя на ООПшный язык, открытый массив типа INTEGER является базовым классом для всех массивов INTEGER вне зависимости от их реальной длины.
Не совсем так , дело в том, что не  существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.

И ещё одна формулировочка:
Открытый массив - это массив, задание длин размерностей которого откладывается до момента создания массива.
Не проходит, в примере который я привел выше  - количество элементов вполне определено, более того эти переменные (массивы) существуют на момент выполнения первой инструкции программы.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: valexey от Март 31, 2011, 12:18:57 pm
Гм. Чем же вот это:

VAR a:ARRAY 10 OF INTEGER;  b:ARRAY 11 OF INTEGER;

PROCEDURE Proc (c : ARRAY OF INTEGER);

Proc(a);
Proc(b);

Принципиально отличается от этого:

template <typename T>
struct IArray {
    virtual T at(size_t n) = 0;
    virtual size_t size() = 0;
};

template <typename T, int s>
struct Array : IArray<T> {
    T _arr[s];
    T at(size_t n) {return arr[n];}
    size_t size() {return s;}
};

Array<int, 10> a; Array<int, 11> b;

void Proc(IArray<int> c);
Proc(a);
Proc(b);
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 31, 2011, 12:31:32 pm
Гм. Чем же вот это:

VAR a:ARRAY 10 OF INTEGER;  b:ARRAY 11 OF INTEGER;

PROCEDURE Proc (c : ARRAY OF INTEGER);

Proc(a);
Proc(b);


Как минимум тем, что 1 вариант свободен от всяких "намеков" на возможную реализацию, и является сущностью фундаментальной (т.е., например, в паскале в те времена это была не конструкция не воспроизводимая с помощью других (конструкций ЯП) -т.е. не являлась просто языковым сахаром).Во втором варианте вы моделируете эту сущность с помощью другого понятия (шаблон).
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: valexey от Март 31, 2011, 12:36:49 pm
Как минимум тем, что 1 вариант свободен от всяких "намеков" на возможную реализацию, и является сущностью фундаментальной (т.е., например, в паскале в те времена это была не конструкция не воспроизводимая с помощью других (конструкций ЯП) -т.е. не являлась просто языковым сахаром).Во втором варианте вы моделируете эту сущность с помощью другого понятия (шаблон).
То есть различие только в том, что в первом случае эти конструкции вшиты в синтаксис языка. Это минимальное и не интересное отличие. Ну например хотя бы из за того, что вся стандартная библиотека плюсов, по стандарту языка, может быть вшита в компилятор (то есть отдельных файликов iostream, string и так далее может в природе вообще не существовать). Так что и этот Array точно также может быть туда вшит.

Гм. Пример: dynamic_cast<A>(b); -- явно шаблонная плюсовая функция, однако её объявления и определения в заголовочных файлах не найти. Она вшита, согласно стандарту, в компилятор.

В любом случае, это отличие в реализации сущности, а не в её сути.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 31, 2011, 12:44:42 pm
Как минимум тем, что 1 вариант свободен от всяких "намеков" на возможную реализацию, и является сущностью фундаментальной (т.е., например, в паскале в те времена это была не конструкция не воспроизводимая с помощью других (конструкций ЯП) -т.е. не являлась просто языковым сахаром).Во втором варианте вы моделируете эту сущность с помощью другого понятия (шаблон).
То есть различие только в том, что в первом случае эти конструкции вшиты в синтаксис языка. Это минимальное и не интересное отличие. Ну например хотя бы из за того, что вся стандартная библиотека плюсов, по стандарту языка, может быть вшита в компилятор (то есть отдельных файликов iostream, string и так далее может в природе вообще не существовать). Так что и этот Array точно также может быть туда вшит.

Гм. Пример: dynamic_cast<A>(b); -- явно шаблонная плюсовая функция, однако её объявления и определения в заголовочных файлах не найти. Она вшита, согласно стандарту, в компилятор.

В любом случае, это отличие в реализации сущности, а не в её сути.
Плюсы  -отдельная тема для "базара", шаблоны тоже, какую систему "понятий" взять в качестве "базы" третий вопрос, как назвать сущностьи и записать их - четвертый, интересно это или нет - пятый... Я всего лишь говорю о понятии "открытый массив" в  ЯВУ -Паскаль (в других ЯП оно может быть просто невостребовано).
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: valexey от Март 31, 2011, 12:58:50 pm
Я всего лишь говорю о понятии "открытый массив" в  ЯВУ -Паскаль (в других ЯП оно может быть просто невостребовано).
Ну, тогда все ясно. Консенсус, так сказать.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 31, 2011, 06:45:55 pm
Вот, нашёл Comment on a note on dynamic arrays in PASCAL от Отца-основателя. Мотивировочка для введения открытых массивов. Компромисс... Идея обрела реализацию в Oberon-2.

Внимание вопрос! А почему из Oberon-07 открытые массивы выпилили? Никто не встречал обоснования Самого?
Обоснования  САМОГО не встречал... Но весьма правдоподобной выглядит гипотеза - создание DSL. Обычно такого рода языки делаются путем добавления сущностей родственных специализированной области  использования ЯП. Вирт посчитал, что специфика задач области для которой он создавал DSL  с ИЗБЫТКОМ описывается с помощью Оберона - а то что не влазит - пустил под нож (за ненадобностью, для упрощения компилятора, в целях оптимизации создаваемого кода.... - а может просто, что бы народ поломал над этим голову  :D ). Но гипотез может быть много... от разумных, до .... веселых  :)
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: Илья Ермаков от Март 31, 2011, 07:25:11 pm
Не совсем так , дело в том, что не  существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.

Но тип открытого массива можно объявлять отдельно.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Март 31, 2011, 07:29:18 pm
Не совсем так , дело в том, что не  существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.

Но тип открытого массива можно объявлять отдельно.
Не понял, о чем вы и где (в Паскале или 07)?
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: Илья Ермаков от Апрель 01, 2011, 04:55:42 pm
Не знаю про Паскаль и Оберон-07, в КП можно ввести
TYPE
  IntArray = ARRAY OF INTEGER
и употребить его при объявлении параметров процедур.

Правда, нужды не видно.
Название: Re:Динамические (открытые) массивы в Оберонах.
Отправлено: DIzer от Апрель 01, 2011, 10:55:23 pm
Не знаю про Паскаль и Оберон-07, в КП можно ввести
TYPE
  IntArray = ARRAY OF INTEGER
и употребить его при объявлении параметров процедур.

Правда, нужды не видно.
Дело вкуса = я такие вещи в паскале ( который обжект) очень люблю   :), но в оберонах есть четкая модель массива (его внутреннего устройства , как в си , там действительно понятие ОТКРЫТЫЙ МАССИВ избыточно (семерка стоит отдельным пунктом)).Что касается того что вы отписали = то такого рода конструкции были введены борландами в 99 (с 4 версией Делфи).А с понятием открытого массива на практике я столкнулся в 89...