Oberon space
General Category => Общий раздел => Тема начата: kemiisto от Март 30, 2011, 12:25:11 pm
-
Вот, нашёл Comment on a note on dynamic arrays in PASCAL от Отца-основателя. Мотивировочка для введения открытых массивов. Компромисс... Идея обрела реализацию в Oberon-2.
Внимание вопрос! А почему из Oberon-07 открытые массивы выпилили? Никто не встречал обоснования Самого?
-
Вирт же как-то заявил, что он пытался в древности реализовать динамические массивы и за час с этим не справился, поэтому в его языках таких массивов не будет.
Однако в оберон всё таки добавил их (не знаю, как там с модулой-2).
А в обероне-07 ему такие массивы в микроконтроллерах, видимо, не понадобились, вот он их и выкинул за ненадобностью -- зуб-то у него на них давно уже...
-
Было бы интересно узнать, зачем ЕМУ это все было нужно вообще... Однако , выдержка интересная - стоит обратить внимание на то, что Вирт индексирует эти гипотетические (в те времена) массивы с 1 -т.е. в то время на эффективность реализации ему было пофиг.
-
Было бы интересно узнать, зачем ЕМУ это все было нужно вообще... Однако , выдержка интересная - стоит обратить внимание на то, что Вирт индексирует эти гипотетические (в те времена) массивы с 1 -т.е. в то время на эффективность реализации ему было пофиг.
Эффективность тут постольку поскольку. Ну вот смотрите, свежайший пример из задачки про электронные таблицы. Как перейти от буквенного индекса к целочисленному? "alpha - 'A'". Ну или на обероне: "alpha - ORD('A')". А если у вас индексирование с единицы, то начинает лезть "ненужная" 1: "alpha - ORD('A') + 1". И таких примеров - тыща. Можно индексировать с 1, но неудобно.
-
Эффективность тут постольку поскольку. Ну вот смотрите, свежайший пример из задачки про электронные таблицы. Как перейти от буквенного индекса к целочисленному? "alpha - 'A'". Ну или на обероне: "alpha - ORD('A')". А если у вас индексирование с единицы, то начинает лезть "ненужная" 1: "alpha - ORD('A') + 1". И таких примеров - тыща. Можно индексировать с 1, но неудобно.
К сожалению , а что мешает буквенный индекс нумеровать с 1 - впрочем ответ понятен- тяжелое наследие прошлого, но в конкретном замкнутом на себя языке этого можно избежать . (vlad - я ПРЕКРАСНО понимаю про что вы говорите - просто подчеркиваю, что в те временя Вирт это не считал проблемой).
-
Вот, нашёл Comment on a note on dynamic arrays in PASCAL от Отца-основателя. Мотивировочка для введения открытых массивов. Компромисс... Идея обрела реализацию в Oberon-2.
Следует учитывать, что к Оберону-2 Вирт имеет отношение постольку поскольку.
Чисто виртовские языки – это Оберон и Оберон-07.
-
Следует учитывать, что к Оберону-2 Вирт имеет отношение постольку поскольку.
Чисто виртовские языки – это Оберон и Оберон-07.
Раз уж такой разговор, то следует учитывать что концепт открытых массивов (соглашений по которому в подпрограмму передаются массивы ОДИНАКОВЫХ типов РАЗЛИЧНЫХ размерностей) отличается от оного в случае динамических массивов :)
-
Следует учитывать, что к Оберону-2 Вирт имеет отношение постольку поскольку.
Чисто виртовские языки – это Оберон и Оберон-07.
Раз уж такой разговор, то следует учитывать что концепт открытых массивов (соглашений по которому в подпрограмму передаются массивы ОДИНАКОВЫХ типов РАЗЛИЧНЫХ размерностей) отличается от оного в случае динамических массивов :)
Ох , конечно же моя ляпа - я имел ввиду различные размеры (количество элементов массива ) а не размерности, сорри.
-
2 Dizer:
Вы же математик - вот Вам пояснение, почему нумерация с нуля соответствует "природе задач". Арифметика вычетов по какому-то модулю включает числа от 0 до этого числа - 1. Любая n-ричная система счисления включает знаки от 0 до n-1. Как следствие, во многих случаях арифметика с массивами от 0 выполняется естественным образом. Пример я приводил, например, - кольцевой буфер.
-
2 Dizer:
Вы же математик - вот Вам пояснение, почему нумерация с нуля соответствует "природе задач". Арифметика вычетов по какому-то модулю включает числа от 0 до этого числа - 1. Любая n-ричная система счисления включает знаки от 0 до n-1. Как следствие, во многих случаях арифметика с массивами от 0 выполняется естественным образом. Пример я приводил, например, - кольцевой буфер.
Как "математик" я это прекрасно знаю (не заставляйте меня повторятся). Арифметика арифметикой, но я говорю про сущности вещей - в данном случае о массиве - как о наборе одинаковых контейнеров - индивидуальное обращение к которому производится по номеру (только не надо здесь уточнять это определение (эти уточнения я тоже знаю)). Я веду речь о том, что ЧЕЛОВЕКУ естественно отсчитывать сущности с 1 (одно яблоко, два яблока) - 0 яблок означает у него отсутствие оных. Насчет буфера - не вижу проблемы , заменяйте везде a mod b на
а mod b +1 - и будет вам счастье...И ваш идол Вирт судя по этой статье прекрасно об этом знал.
-
массивы ОДИНАКОВЫХ типов
Массивы РАЗЛИЧНЫХ типов - это и не массивы вовсе, а записи. Так что в Вашем выражении слова "ОДИНАКОВЫХ типов" не несут полезной информации. ;)
-
массивы ОДИНАКОВЫХ типов
Массивы РАЗЛИЧНЫХ типов - это и не массивы вовсе, а записи. Так что в Вашем выражении слова "ОДИНАКОВЫХ типов" не несут полезной информации. ;)
массивы ОДИНАКОВЫХ типов:
ARRAY 10 OF INTEGER
ARRAY 10 OF INTEGER
Массивы РАЗЛИЧНЫХ типов:
ARRAY 10 OF INTEGER
ARRAY 11 OF INTEGER
-
ЧЕЛОВЕКУ естественно отсчитывать сущности с 1 (одно яблоко, два яблока) - 0 яблок означает у него отсутствие оных.
В данном случае уместнее было бы сказать "первое яблоко", "второе яблоко".
"Нулевое яблоко" - не означает отсутствие оных. (Означает "яблоко с индексом ноль").
Я вижу неприятность только в одном. В том, что математики индексируют элементы матрицы начиная с единицы. Таким образом, "ихние" индексы элементов матрицы и "правильные" индексы элементов числового массива, в котором хранится эта матрица, не совпадают.
-
Массивы РАЗЛИЧНЫХ типов - это и не массивы вовсе, а записи.
массивы ОДИНАКОВЫХ типов: ...
Массивы РАЗЛИЧНЫХ типов: ...
Всё, расклинило мозги. :D
-
Я вижу неприятность только в одном. В том, что математики индексируют элементы матрицы начиная с единицы. Таким образом, "ихние" индексы элементов матрицы и "правильные" индексы элементов числового массива, в котором хранится эта матрица, не совпадают.
К сожалению, таковыми являются ВСЕ люди после школы. Да и Вирт как ни странно ;)
-
Всё, расклинило мозги. :D
Без проблем -щас "расклиним" -окончательно :D если вы этого хотите (а не просто побздеть). Оригинально, открытые массивы были предназначены для того, чтобы передавать в одну и тy же процедуру массивы обьявленные.
как (например)
VAR a:ARRAY 10 OF INTEGER; b:ARRAY 11 OF INTEGER;
т.е у этих массивов (переменные a и b) , тип один (INTEGER) , а размер (количество элементов различается 10 и 11 cоответственно).
-
Всё, расклинило мозги. :D
Без проблем -щас "расклиним" -окончательно :D если вы этого хотите (а не просто побздеть). Оригинально, открытые массивы были предназначены для того, чтобы передавать в одну и тy же процедуру массивы обьявленные.
как (например)
VAR a:ARRAY 10 OF INTEGER; b:ARRAY 11 OF INTEGER;
т.е у этих массивов (переменные a и b) , тип один (INTEGER) , а размер (количество элементов различается 10 и 11 cоответственно).
Переводя на ООПшный язык, открытый массив типа INTEGER является базовым классом для всех массивов INTEGER вне зависимости от их реальной длины.
То есть имеем таки иерархию.
-
Всё, расклинило мозги. :D
Без проблем -щас "расклиним" -окончательно :D если вы этого хотите (а не просто побздеть). Оригинально, открытые массивы были предназначены для того, чтобы передавать в одну и тy же процедуру массивы обьявленные.
как (например)
VAR a:ARRAY 10 OF INTEGER; b:ARRAY 11 OF INTEGER;
т.е у этих массивов (переменные a и b) , тип один (INTEGER) , а размер (количество элементов различается 10 и 11 cоответственно).
Переводя на ООПшный язык, открытый массив типа INTEGER является базовым классом для всех массивов INTEGER вне зависимости от их реальной длины.
То есть имеем таки иерархию.
Не совсем так , дело в том, что не существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.
-
Не совсем так , дело в том, что не существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.
Это интерфейс, абстрактный класс. Назвать можно как угодно. Интерфейс суть частный случай класса.
-
Не совсем так , дело в том, что не существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.
Это интерфейс, абстрактный класс. Назвать можно как угодно. Интерфейс суть частный случай класса.
Тоже не то, здесь речь идет об интерпретации (специальной) формы вызова а не о форме самой- в классическом определении интерфейса речь идет именно о количестве переменных и их типах (которые вместе образуют форму) -интерфейс являющийся общим для подпрограмм , реализующих разные (в общем случае) алгоритмы.
-
Переводя на ООПшный язык, открытый массив типа INTEGER является базовым классом для всех массивов INTEGER вне зависимости от их реальной длины.
Не совсем так , дело в том, что не существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.
И ещё одна формулировочка:
Открытый массив - это массив, задание длин размерностей которого откладывается до момента создания массива.
-
Переводя на ООПшный язык, открытый массив типа INTEGER является базовым классом для всех массивов INTEGER вне зависимости от их реальной длины.
Не совсем так , дело в том, что не существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.
И ещё одна формулировочка:
Открытый массив - это массив, задание длин размерностей которого откладывается до момента создания массива.
Не проходит, в примере который я привел выше - количество элементов вполне определено, более того эти переменные (массивы) существуют на момент выполнения первой инструкции программы.
-
Гм. Чем же вот это:
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);
-
Гм. Чем же вот это:
VAR a:ARRAY 10 OF INTEGER; b:ARRAY 11 OF INTEGER;
PROCEDURE Proc (c : ARRAY OF INTEGER);
Proc(a);
Proc(b);
Как минимум тем, что 1 вариант свободен от всяких "намеков" на возможную реализацию, и является сущностью фундаментальной (т.е., например, в паскале в те времена это была не конструкция не воспроизводимая с помощью других (конструкций ЯП) -т.е. не являлась просто языковым сахаром).Во втором варианте вы моделируете эту сущность с помощью другого понятия (шаблон).
-
Как минимум тем, что 1 вариант свободен от всяких "намеков" на возможную реализацию, и является сущностью фундаментальной (т.е., например, в паскале в те времена это была не конструкция не воспроизводимая с помощью других (конструкций ЯП) -т.е. не являлась просто языковым сахаром).Во втором варианте вы моделируете эту сущность с помощью другого понятия (шаблон).
То есть различие только в том, что в первом случае эти конструкции вшиты в синтаксис языка. Это минимальное и не интересное отличие. Ну например хотя бы из за того, что вся стандартная библиотека плюсов, по стандарту языка, может быть вшита в компилятор (то есть отдельных файликов iostream, string и так далее может в природе вообще не существовать). Так что и этот Array точно также может быть туда вшит.
Гм. Пример: dynamic_cast<A>(b); -- явно шаблонная плюсовая функция, однако её объявления и определения в заголовочных файлах не найти. Она вшита, согласно стандарту, в компилятор.
В любом случае, это отличие в реализации сущности, а не в её сути.
-
Как минимум тем, что 1 вариант свободен от всяких "намеков" на возможную реализацию, и является сущностью фундаментальной (т.е., например, в паскале в те времена это была не конструкция не воспроизводимая с помощью других (конструкций ЯП) -т.е. не являлась просто языковым сахаром).Во втором варианте вы моделируете эту сущность с помощью другого понятия (шаблон).
То есть различие только в том, что в первом случае эти конструкции вшиты в синтаксис языка. Это минимальное и не интересное отличие. Ну например хотя бы из за того, что вся стандартная библиотека плюсов, по стандарту языка, может быть вшита в компилятор (то есть отдельных файликов iostream, string и так далее может в природе вообще не существовать). Так что и этот Array точно также может быть туда вшит.
Гм. Пример: dynamic_cast<A>(b); -- явно шаблонная плюсовая функция, однако её объявления и определения в заголовочных файлах не найти. Она вшита, согласно стандарту, в компилятор.
В любом случае, это отличие в реализации сущности, а не в её сути.
Плюсы -отдельная тема для "базара", шаблоны тоже, какую систему "понятий" взять в качестве "базы" третий вопрос, как назвать сущностьи и записать их - четвертый, интересно это или нет - пятый... Я всего лишь говорю о понятии "открытый массив" в ЯВУ -Паскаль (в других ЯП оно может быть просто невостребовано).
-
Я всего лишь говорю о понятии "открытый массив" в ЯВУ -Паскаль (в других ЯП оно может быть просто невостребовано).
Ну, тогда все ясно. Консенсус, так сказать.
-
Вот, нашёл Comment on a note on dynamic arrays in PASCAL от Отца-основателя. Мотивировочка для введения открытых массивов. Компромисс... Идея обрела реализацию в Oberon-2.
Внимание вопрос! А почему из Oberon-07 открытые массивы выпилили? Никто не встречал обоснования Самого?
Обоснования САМОГО не встречал... Но весьма правдоподобной выглядит гипотеза - создание DSL. Обычно такого рода языки делаются путем добавления сущностей родственных специализированной области использования ЯП. Вирт посчитал, что специфика задач области для которой он создавал DSL с ИЗБЫТКОМ описывается с помощью Оберона - а то что не влазит - пустил под нож (за ненадобностью, для упрощения компилятора, в целях оптимизации создаваемого кода.... - а может просто, что бы народ поломал над этим голову :D ). Но гипотез может быть много... от разумных, до .... веселых :)
-
Не совсем так , дело в том, что не существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.
Но тип открытого массива можно объявлять отдельно.
-
Не совсем так , дело в том, что не существует переменной типа- "открытый массив" - это всего лишь соглашение об интерпретации конкретного массива (точнее конкретного "экземпляра") "запуляемого" в подпрограмму.
Но тип открытого массива можно объявлять отдельно.
Не понял, о чем вы и где (в Паскале или 07)?
-
Не знаю про Паскаль и Оберон-07, в КП можно ввести
TYPE
IntArray = ARRAY OF INTEGER
и употребить его при объявлении параметров процедур.
Правда, нужды не видно.
-
Не знаю про Паскаль и Оберон-07, в КП можно ввести
TYPE
IntArray = ARRAY OF INTEGER
и употребить его при объявлении параметров процедур.
Правда, нужды не видно.
Дело вкуса = я такие вещи в паскале ( который обжект) очень люблю :), но в оберонах есть четкая модель массива (его внутреннего устройства , как в си , там действительно понятие ОТКРЫТЫЙ МАССИВ избыточно (семерка стоит отдельным пунктом)).Что касается того что вы отписали = то такого рода конструкции были введены борландами в 99 (с 4 версией Делфи).А с понятием открытого массива на практике я столкнулся в 89...