OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 26 Апрель, 2024 21:08

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Можно обойтись без дин. массивов?
СообщениеДобавлено: Понедельник, 19 Июль, 2010 09:04 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Выделено: viewtopic.php?p=49746#p49746

Здравствуйте, Сергей.
Вы писали, что хорошо бы удалить из Оберона указатели, кроме указателей на записи, и добавили бы тип STRING.
Чем плохи указатели на массивы? Мне кажется что это очень полезный инструмент во многих случаях, когда размер массива изначально не известен. А если выделять сразу максимальный размер для каждого элемента, то может не хватить памяти. К тому же в массиве можно быстро искать с помощью бинарного поиска, а в записях поиск можно делать только последовательно.
Насчет типа STRING. Почему интересно Вирт не добавил такой тип в язык, веть он и компилятор писал, где используются строки, и операционную систему, где тоже тескстовые строки используются?
К тому же строки можно реализовать без добавления новой функциональности в язык, используя процедуры, например:
Concat(str1, str2); Append(str1, str2)
Единственное с чем я согласен, что когда надо конкатенировать много членов, например,
str = str1 + str2 + str3 + str4, то
не удобно писать Concat(Concat(Concat(str1, str2), str3), str4).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Понедельник, 19 Июль, 2010 09:59 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Rifat писал(а):
Насчет типа STRING. Почему интересно Вирт не добавил такой тип в язык, ... ?
Рискну предположить, что для того, чтобы не "множить сущности". Ведь строка по сути является массивом символов, а массивы в языке и так уже есть. Буду благодарен, если кто-нибудь подкинет ссылочку на то как сам Вирт комментирует это.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Понедельник, 19 Июль, 2010 11:25 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Rifat писал(а):
Здравствуйте, Сергей.
Вы писали, что хорошо бы удалить из Оберона указатели, кроме указателей на записи, и добавили бы тип STRING.
Чем плохи указатели на массивы? Мне кажется что это очень полезный инструмент во многих случаях, когда размер массива изначально не известен. А если выделять сразу максимальный размер для каждого элемента, то может не хватить памяти. К тому же в массиве можно быстро искать с помощью бинарного поиска, а в записях поиск можно делать только последовательно.


Как-то ведь Вирт обошелся без указателей на массив в Обероне-07.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Понедельник, 19 Июль, 2010 13:46 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Так Вирт для специфических нужд может и обходится без указателей на массивы, но по мне так это полный перегиб палки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Понедельник, 19 Июль, 2010 16:50 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Сергей Прохоренко писал(а):
Как-то ведь Вирт обошелся без указателей на массив в Обероне-07.

При написании компилятора можно обойтись только указателями на записи. Для массива ключевых слов, например, размер можно задать заранее. Но ведь это не говорит о том, что всегда можно обойтись без динамических массивов.
Можно конечно в записи создать фиксированный массив на 1000 элементов, а если требуется добавить 1001-й элемент в массив, то создать еще одну запись. Но это усложнит алгоритмы для работы с такой структурой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Понедельник, 19 Июль, 2010 18:59 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Rifat писал(а):
Сергей Прохоренко писал(а):
Как-то ведь Вирт обошелся без указателей на массив в Обероне-07.
При написании компилятора можно обойтись только указателями на записи. Для массива ключевых слов, например, размер можно задать заранее. Но ведь это не говорит о том, что всегда можно обойтись без динамических массивов.
Можно конечно в записи создать фиксированный массив на 1000 элементов, а если требуется добавить 1001-й элемент в массив, то создать еще одну запись. Но это усложнит алгоритмы для работы с такой структурой.
Совсем нельзя. Но насколько часто надо?
А: достаточно массивов статич. размера
Б: подойдут линейные дин. массивы. Альтернатива - список записей со статич. массивом - чуть сложнее
В: необходимы сложные дин. структуры

P.S. 1) Эта тема уже обсуждалась где-то здесь viewtopic.php?p=20297#p20297
2) В качестве иллюстрации замены Б на В, думаю, подойдет пример Александра Ильина
viewtopic.php?p=22775#p22775
viewtopic.php?p=23103#p23103
Александр Ильин писал(а):
Чем дальше занимаюсь строками, тем больше понимаю, что подсистема Text (BlackBox) и модуль Texts (Oberon System) - это и есть те самые библиотеки для работы с динамическими строками. Что-то более простое реализовать сложно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Вторник, 20 Июль, 2010 09:37 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Евгений Темиргалеев писал(а):
Rifat писал(а):
...Но ведь это не говорит о том, что всегда можно обойтись без динамических массивов...
Совсем нельзя. Но насколько часто надо?

В случае строк согласен, можно обойтись без динамических массивов.
Но без динамических массивов нельзя обойтись когда, имеется большой объем данных, в которых требуется быстро находить требуемый элемент. Одно из очевидных решений, отсортировать массив, и затем бинарным поиском искать требуемый элемент много раз. Можно конечно и здесь обойтись без динамических массивов, если реализовать сбалансированное дерево, в котором также можно искать с помощью бинарного поиска. Но сбалансированное дерево требует больше памяти, чем массив, за счет того, что требуется хранить ссылки на левого и правого потомков. К тому же алгорит балансировки дерева в несколько раз сложнее алгоритма сортировки, например.
Поэтому я считаю, что если мы отбрасываем динамические массивы, то мы также отбрасываем большой пласт эффективных по времени и памяти алгоритмов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Вторник, 20 Июль, 2010 20:08 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Rifat писал(а):
Евгений Темиргалеев писал(а):
Rifat писал(а):
...Но ведь это не говорит о том, что всегда можно обойтись без динамических массивов...
Совсем нельзя. Но насколько часто надо?

В случае строк согласен, можно обойтись без динамических массивов.
Но без динамических массивов нельзя обойтись когда, имеется большой объем данных, в которых требуется быстро находить требуемый элемент. Одно из очевидных решений, отсортировать массив, и затем бинарным поиском искать требуемый элемент много раз. Можно конечно и здесь обойтись без динамических массивов, если реализовать сбалансированное дерево, в котором также можно искать с помощью бинарного поиска. Но сбалансированное дерево требует больше памяти, чем массив, за счет того, что требуется хранить ссылки на левого и правого потомков. К тому же алгорит балансировки дерева в несколько раз сложнее алгоритма сортировки, например.
Поэтому я считаю, что если мы отбрасываем динамические массивы, то мы также отбрасываем большой пласт эффективных по времени и памяти алгоритмов.

Мне это очень напомнило ситуацию с (чистыми)функциональными языками. Вначале мы отпиливает (насовсем) изменяемость (mutable types), как лишнее. Как то, без чело проще жить. А затем, как возникает алгоритмическая задача плохо ложащаяся на неизменяемые типы данных, мы начинаем выдумывать обходные пути, городить костыли, вводить понятия типа "аммортизиацинная сложность алгоритма", сильно отдающие маркетингом и т.п. Ну и вообще, аммортизационная сложность O(1), а то что оно работает в 10-20 раз медленнее чем то же на простом Си или ином языке с mutable data, это уже мелочь.


Последний раз редактировалось Alexey Veselovsky Вторник, 20 Июль, 2010 20:19, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Вторник, 20 Июль, 2010 20:12 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Угу. Это потому, что если некое разделение, которое есть "от природы задач" (например, на операторы и выражения) попытаться убрать, то оно непременно вылезет выше - и потребует всё равно своего проведения в жизнь. Так же, как с однородными языками, где оставлена только одна форма записи - базовая абстракция. Разнообразие всё равно приходится имитировать выше, только это перекладывается на плечи программистов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Вторник, 20 Июль, 2010 20:23 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Илья Ермаков писал(а):
Угу. Это потому, что если некое разделение, которое есть "от природы задач" (например, на операторы и выражения) попытаться убрать, то оно непременно вылезет выше - и потребует всё равно своего проведения в жизнь. Так же, как с однородными языками, где оставлена только одна форма записи - базовая абстракция. Разнообразие всё равно приходится имитировать выше, только это перекладывается на плечи программистов.

Пожалуй, это и есть то самое "... но не проще".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Вторник, 20 Июль, 2010 22:14 

Зарегистрирован: Вторник, 29 Ноябрь, 2005 21:41
Сообщения: 1030
Rifat писал(а):
Поэтому я считаю, что если мы отбрасываем динамические массивы, то мы также отбрасываем большой пласт эффективных по времени и памяти алгоритмов.
Не всё так просто, по-моему. Если речь о массивной задаче - всегда есть возможность задуматься об организации иного механизма доступа кроме динамического массива. По ключевой информации, например.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Вторник, 20 Июль, 2010 22:30 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ещё Files.File.

Но дин. массивы представляются всё равно нужными. Мелкий пример - вот хранить неизменяемую, но дополняемую структуру со строками разных длин; удобно эти "хвосты" переменной длины динамически порождать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Вторник, 20 Июль, 2010 22:56 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
C другой стороны, получается, что мы на этапе компиляции будем знать все возможные размеры выделяемых блоков, что, по идее, может облегчить жизнь менеджеру памяти. Быть может удастся уменьшить фрагментацию памяти.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Вторник, 20 Июль, 2010 23:38 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Если я не ошибаюсь, то в Обероне-07, который сделан с учётом опыта Оберона-SA, это как-то связано с особенностями целевой платформы StrongARM. Было такое предположение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Среда, 21 Июль, 2010 00:36 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Илья Ермаков писал(а):
Если я не ошибаюсь, то в Обероне-07, который сделан с учётом опыта Оберона-SA, это как-то связано с особенностями целевой платформы StrongARM. Было такое предположение.

Откровенно говоря, не помню в АРМах ничего такого.
Помню что да, переменные должны располагаться по адресам кратным своим размерам.
Т.е. простой и нивинный код сишный навроде:
Код:
void unpack(char* buf) { // buf -- это буфер который приехал по сети например.
    // таки знаем что первые 4ре байта у нас int
    int* id = (int*)buf;
    (*id)++; /* с большой вероятностью будет ошибка в момент исполнения на ARM'e, на x86 ошибки не будет никогда. */
    // собственно на чтение тоже будет ошибка
    int some = *id;
}

является пакостью.

Но как это связано с обероновскими массивами, если связано вообще?


Последний раз редактировалось Alexey Veselovsky Среда, 21 Июль, 2010 13:53, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Что бы вы удалили из Оберона?
СообщениеДобавлено: Среда, 21 Июль, 2010 12:00 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Илья Ермаков писал(а):
Ещё Files.File.

Но дин. массивы представляются всё равно нужными. Мелкий пример - вот хранить неизменяемую, но дополняемую структуру со строками разных длин; удобно эти "хвосты" переменной длины динамически порождать.
Можно обойтись блоками фиксированной длины:
Код:
TYPE
Chunk = ARRAY ChunkSize OF BYTE;
Stream = POINTER TO RECORD (Chunk)
   data: Chunk;
   len: INTEGER;
   (* etc. *)
   next: Stream;
END;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Июль, 2010 14:13 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Вообще-то Фортран много лет обходился без динамических массивов... :)
Кроме того, на базе фиксированного массива большого размера можно построить систему распределения памяти. Например, см. Холл "Вычислительные структуры"... :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Июль, 2010 16:49 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Валерий Лаптев писал(а):
Вообще-то Фортран много лет обходился без динамических массивов... :)
Кроме того, на базе фиксированного массива большого размера можно построить систему распределения памяти. Например, см. Холл "Вычислительные структуры"... :)

Угу. Менеджер памяти написать для своей виртуальной машины :-)
Это называется -- эмуляция.

Кроме того, речь идет не о динамических массивах (размер которых можно менять ПОСЛЕ создания), а о обычных массивах просто размер которых не известен на момент компиляции. Скажите лучше, что в них плохого?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Июль, 2010 17:55 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Alexey Veselovsky писал(а):
Скажите лучше, что в них плохого?
Такая формулировка вопроса в контексте темы некорректна. Думаю, все согласятся, что Вирт не руководствуется разделением средств ЯП на плохие и хорошие.

Вирт выпустил новую ревизию Оберона (http://oberoncore.ru/wiki/lang/oberon-07) на основании 20 летнего опыта работы. Врят ли среди нас, ведущих обсуждение, найдётся кто-то, имеющий подобный опыт.

Я думаю, что более полезным было бы вместо умозрительного поиска причины 'Почему Вирт решил исключить "дин. массивы" из фундаментальных, обязательных в языке средств' - на базе нашего богатого опыта использования ЯП с дин. массивами, обзавестись опытом работы без дин. массивов. На своих реальных задачах. И, через некоторое время, обсудить этот опыт.

Самое простая замена "дин. масс." - список записей со статич. массивами: viewtopic.php?p=49936#p49936

Потребность в упомянутом тов. Лаптевым решении тоже, думаю, никуда не исчесла. В критичных по времени задачах задействуют ручную сборку мусора, переиспользование ставших ненужными объектов (тов. Губанов приводил примеры для C#). Мне кажется, это есть частный случай ручного распределения памяти.

P.S. Касательно предложенного подхода у меня опыт наработался. Уже давно пишу на КП без FOR, RETURN-в из середины. Привык. Последнее сделало код более структурным и понятным. Не жалею, проблем не испытываю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 21 Июль, 2010 18:07 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Что-то не могу у себя найти report Вирта на Oberon-SA. Помнится мне, что в нём по поводу убранных массивов было пояснение.

P.S.: вот он: http://www.oberoncore.ru/wiki/lang/oberon_sa
Сейчас поглядим.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB