Автор Тема: Oberon-07M  (Прочитано 52375 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #90 : Март 25, 2011, 12:31:08 pm »
набор различных коллекций, как в Яве, типа хэш массив, еще какой-нибудь массив и т.д., а как они устроены внутри нас это не должно волновать. Допустим, мы решили идти по этому пути, реализовали коллекцию массив, которая внутри себя представляет какой-нибудь VList. Но при этом, у нас будет много избыточной вычислительной работы, которая будет скрыта внутри этого контейнера.
Товарищ лукавит: в яве есть массивы. Кроме того, в яве есть дженерики (которые конечно убоги по сравнению с плюсатыми шаблонами, но тем не менее). Массив, как встроенный тип данных, в Обероне, это тип с двумя параметрами – тип элемента, и число элементов. Либо одним параметром – тип элементов. Свои, не встроенные типы данных мы не можем сделать параметризуемыми. Поэтому, очевидно, мы воссоздать на уровне библиотеки массив (и любую другую коллекцию) просто не сможем. Получится только ущербное поделие, оно будет либо недостаточно гибко, либо небезопасно.

Тип пораметризуемый одним аргументом получается посредством свертки типа с двумя аргумантами по одному из них. Что я и предлагаю сделать. Для этого в компиляторе что-либо менять не нужно.

В Обероне-07 ЕСТЬ массивы длины неизвестной на момент компиляции. Система типов его существованию таких массивов никак не припятствует, достаточно свернуть ARRAY x OF y по первому аргументу, причем так, чтобы первый аргумент был не валиден для непосредственного обычного применения этого самого ARRAY x OF y (то есть чтобы его можно было создать только через функцию-процедуру NEW, но нельзя было создать его экзепляр просто так). Поэтому я и предлагаю использовать x=0.

Так вот меня интересует мнение общественности, как они считают, динамический массив должен быть отнесен к разряду родных для языка или же статических массивов и указателей на записи вполне хватает для большинства применений, а в некоторых случаях можно просто запросить блок памяти у модуля SYSTEM и вручную с ним работать, но при этом естественно не будет контроля границ, а при работе с динамическим массивом будет.
А почему это не будет? Работа с этим куском памяти любого размера может быть инкапсулирована в соответствующий модуль с соответствующим opaque типом данных. И все. И все там будет, и проверка границ, и что угодно еще. Быстродействие будет практически такое же, а при оптимизирующем компиляторе в точности такое же как и при встроенных массивах в язык.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:Oberon-07M
« Ответ #91 : Март 25, 2011, 12:40:06 pm »
В Обероне-07 ЕСТЬ массивы длины неизвестной на момент компиляции. Система типов его существованию таких массивов никак не припятствует, достаточно свернуть ARRAY x OF y по первому аргументу, причем так, чтобы первый аргумент был не валиден для непосредственного обычного применения этого самого ARRAY x OF y (то есть чтобы его можно было создать только через функцию-процедуру NEW, но нельзя было создать его экзепляр просто так). Поэтому я и предлагаю использовать x=0.
Думаю, что только вы так считаете, что в Oberon-07 есть массивы неизвестной длины. Если использовать 0 для обозначения массивов неизвестной длины, то будут появляться странности, например:
rec1 = RECORD a: ARRAY 2 OF INTEGER END; размер rec1 = 8 байт
rec2 = RECORD a: ARRAY 1 OF INTEGER END; размер rec2 = 4 байта
rec3 = RECORD a: ARRAY 0 OF INTEGER END; размер rec3 = 8 байт.

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:Oberon-07M
« Ответ #92 : Март 25, 2011, 12:44:02 pm »
Про динамические массивы: http://patrasyen.livejournal.com/10928.html

DIzer

  • Гость
Re:Oberon-07M
« Ответ #93 : Март 25, 2011, 12:45:03 pm »
.... Поэтому я и предлагаю использовать x=0.

Хак ? Серьезно (предлагаете)? или стеб...
« Последнее редактирование: Март 25, 2011, 12:46:35 pm от DIzer »

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #94 : Март 25, 2011, 12:47:35 pm »
Думаю, что только вы так считаете, что в Oberon-07 есть массивы неизвестной длины. Если использовать 0 для обозначения массивов неизвестной длины, то будут появляться странности, например:
rec1 = RECORD a: ARRAY 2 OF INTEGER END; размер rec1 = 8 байт
rec2 = RECORD a: ARRAY 1 OF INTEGER END; размер rec2 = 4 байта
rec3 = RECORD a: ARRAY 0 OF INTEGER END; размер rec3 = 8 байт.
А откуда эти странности берутся? И где это проверялось? Просто по спеке на язык, никаких странностей быть не должно.

Гм. А что будет если:
rec3 = RECORD a: ARRAY -1 OF INTEGER END;
:-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #95 : Март 25, 2011, 12:52:53 pm »
.... Поэтому я и предлагаю использовать x=0.

Хак ? Серьезно (предлагаете)? или стеб...
Я серьезно предлагаю сделать вначале хороший компилятор именно Оберона-07, использовть его, а потом, на базе уже этого опыта использования, думать в какую сторону пилить язык.

Поддержка на уровне компилятора динамических массивов не нужна, таким образом это никак не усложняет язык и компилятор. Единственное уточнение: при попытке создать нечто вроде такого:
a : ARRAY 0 OF SomeType;
должена быть ошибка компиляции. Естественно вот такая конструкция полностью валидна:
p : POINTER TO ARRAY 0 OF SomeType;

Создание этого в хипе экземпляра массива ARRAY 0 OF SomeType легко делается на уровне библиотеки, если вдруг кому-то понадобится. Вот использование то и покажет насколько оно нужно именно в языке.

Эдакое ленивое добавление фич в язык :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:Oberon-07M
« Ответ #96 : Март 25, 2011, 02:02:26 pm »
ARRAY 0 OF SomeType;
Если у нас ARRAY 1 OF SomeType, то компилятор должен разрешать обращение только к нулевому элементу массива arr[0].
А если ARRAY 0 OF SomeType, то ни к какому. И хотя вы выделите в библиотеке память для этого массива, обратиться к нему все равно нельзя будет.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #97 : Март 25, 2011, 02:08:31 pm »
ARRAY 0 OF SomeType;
Если у нас ARRAY 1 OF SomeType, то компилятор должен разрешать обращение только к нулевому элементу массива arr[0].
А если ARRAY 0 OF SomeType, то ни к какому. И хотя вы выделите в библиотеке память для этого массива, обратиться к нему все равно нельзя будет.
Где это сказано в спеке на язык?

Кроме того, компилятор не имеет возможности контролировать доступ к элементам массива в общем случае.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:Oberon-07M
« Ответ #98 : Март 25, 2011, 02:11:35 pm »
Если добавить динамические массивы, то в моем понимании будет бОльшая симметрия:
1) Есть обычные записи и обычные массивы
2) Есть указатели на записи и указатели на фиксированные массивы
3) Указатель на запись может указывать на запись расширенного типа и указатель на массив может указывать на массивы разных размеров. :)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #99 : Март 25, 2011, 02:26:18 pm »
Если добавить динамические массивы, то в моем понимании будет бОльшая симметрия:
1) Есть обычные записи и обычные массивы
2) Есть указатели на записи и указатели на фиксированные массивы
3) Указатель на запись может указывать на запись расширенного типа и указатель на массив может указывать на массивы разных размеров. :)
Стоп. В отличае от КП в Обероне нет AnyRec'a, то есть нет универсального указателя на запись, на сколько я помню. То же и с массивами. Так что аналогии не получается.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:Oberon-07M
« Ответ #100 : Март 25, 2011, 02:40:36 pm »
А при чем здесь AnyRec, я его не упоминал?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #101 : Март 25, 2011, 02:41:24 pm »
Вообще, такими темпами мы сейчас тут систему типов Ады изобретем :-) Поэтому, прежде чем изобретать, я таки и предлагаю попробовать Оберон-07 как он есть. И да, преобразование куска памяти к
ARRAY 0 OF SomeType это не безопасная операция, и без SYSTEM'а тут никак. Но этот SYSTEM будет сидеть в либе, а не в прикладном коде. И да, такие геморрои заставят использовать динамические массивы только тогда, когда это реально необходимо, а не когда просто лень подумать и решить сколько памяти надо.

Я думаю что это хороший, годный эксперимент.

Между прочим, в соседнем топике как раз задачка есть, на которой это дело можно было бы обкатать :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:Oberon-07M
« Ответ #102 : Март 25, 2011, 02:50:16 pm »
Я уже писал, что те кто не хочет чтобы в компиляторе были динамические массивы, могут просто их не использовать и считать что их просто нет. И использовать только те средства, которые были в описании языка Oberon-07.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #103 : Март 25, 2011, 03:04:46 pm »
Я уже писал, что те кто не хочет чтобы в компиляторе были динамические массивы, могут просто их не использовать и считать что их просто нет. И использовать только те средства, которые были в описании языка Oberon-07.
C тем же успехом можно сказать, что в С++ нет адресной арифметики, нет множественного наследования, исключений и многого иного, что мешает иногда жить.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #104 : Март 25, 2011, 03:13:44 pm »
Впрочем, наличие этой фичи аукнется потом, когда и если народ начнет активно использовать язык (не компилятор, а именно язык).
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"