OberonCore https://forum.oberoncore.ru/ |
|
Можно обойтись без дин. массивов? https://forum.oberoncore.ru/viewtopic.php?f=30&t=2743 |
Страница 1 из 2 |
Автор: | Rifat [ Понедельник, 19 Июль, 2010 09:04 ] |
Заголовок сообщения: | Можно обойтись без дин. массивов? |
Выделено: 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). |
Автор: | igor [ Понедельник, 19 Июль, 2010 09:59 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Rifat писал(а): Насчет типа STRING. Почему интересно Вирт не добавил такой тип в язык, ... ? Рискну предположить, что для того, чтобы не "множить сущности". Ведь строка по сути является массивом символов, а массивы в языке и так уже есть. Буду благодарен, если кто-нибудь подкинет ссылочку на то как сам Вирт комментирует это.Кстати, сам я считаю, что строковый тип в языке должен быть. |
Автор: | Сергей Прохоренко [ Понедельник, 19 Июль, 2010 11:25 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Rifat писал(а): Здравствуйте, Сергей. Вы писали, что хорошо бы удалить из Оберона указатели, кроме указателей на записи, и добавили бы тип STRING. Чем плохи указатели на массивы? Мне кажется что это очень полезный инструмент во многих случаях, когда размер массива изначально не известен. А если выделять сразу максимальный размер для каждого элемента, то может не хватить памяти. К тому же в массиве можно быстро искать с помощью бинарного поиска, а в записях поиск можно делать только последовательно. Как-то ведь Вирт обошелся без указателей на массив в Обероне-07. |
Автор: | Александр Шостак [ Понедельник, 19 Июль, 2010 13:46 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Так Вирт для специфических нужд может и обходится без указателей на массивы, но по мне так это полный перегиб палки. |
Автор: | Rifat [ Понедельник, 19 Июль, 2010 16:50 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Сергей Прохоренко писал(а): Как-то ведь Вирт обошелся без указателей на массив в Обероне-07. При написании компилятора можно обойтись только указателями на записи. Для массива ключевых слов, например, размер можно задать заранее. Но ведь это не говорит о том, что всегда можно обойтись без динамических массивов. Можно конечно в записи создать фиксированный массив на 1000 элементов, а если требуется добавить 1001-й элемент в массив, то создать еще одну запись. Но это усложнит алгоритмы для работы с такой структурой. |
Автор: | Евгений Темиргалеев [ Понедельник, 19 Июль, 2010 18:59 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
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) - это и есть те самые библиотеки для работы с динамическими строками. Что-то более простое реализовать сложно.
|
Автор: | Rifat [ Вторник, 20 Июль, 2010 09:37 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Евгений Темиргалеев писал(а): Rifat писал(а): ...Но ведь это не говорит о том, что всегда можно обойтись без динамических массивов... Совсем нельзя. Но насколько часто надо?В случае строк согласен, можно обойтись без динамических массивов. Но без динамических массивов нельзя обойтись когда, имеется большой объем данных, в которых требуется быстро находить требуемый элемент. Одно из очевидных решений, отсортировать массив, и затем бинарным поиском искать требуемый элемент много раз. Можно конечно и здесь обойтись без динамических массивов, если реализовать сбалансированное дерево, в котором также можно искать с помощью бинарного поиска. Но сбалансированное дерево требует больше памяти, чем массив, за счет того, что требуется хранить ссылки на левого и правого потомков. К тому же алгорит балансировки дерева в несколько раз сложнее алгоритма сортировки, например. Поэтому я считаю, что если мы отбрасываем динамические массивы, то мы также отбрасываем большой пласт эффективных по времени и памяти алгоритмов. |
Автор: | Alexey Veselovsky [ Вторник, 20 Июль, 2010 20:08 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Rifat писал(а): Евгений Темиргалеев писал(а): Rifat писал(а): ...Но ведь это не говорит о том, что всегда можно обойтись без динамических массивов... Совсем нельзя. Но насколько часто надо?В случае строк согласен, можно обойтись без динамических массивов. Но без динамических массивов нельзя обойтись когда, имеется большой объем данных, в которых требуется быстро находить требуемый элемент. Одно из очевидных решений, отсортировать массив, и затем бинарным поиском искать требуемый элемент много раз. Можно конечно и здесь обойтись без динамических массивов, если реализовать сбалансированное дерево, в котором также можно искать с помощью бинарного поиска. Но сбалансированное дерево требует больше памяти, чем массив, за счет того, что требуется хранить ссылки на левого и правого потомков. К тому же алгорит балансировки дерева в несколько раз сложнее алгоритма сортировки, например. Поэтому я считаю, что если мы отбрасываем динамические массивы, то мы также отбрасываем большой пласт эффективных по времени и памяти алгоритмов. Мне это очень напомнило ситуацию с (чистыми)функциональными языками. Вначале мы отпиливает (насовсем) изменяемость (mutable types), как лишнее. Как то, без чело проще жить. А затем, как возникает алгоритмическая задача плохо ложащаяся на неизменяемые типы данных, мы начинаем выдумывать обходные пути, городить костыли, вводить понятия типа "аммортизиацинная сложность алгоритма", сильно отдающие маркетингом и т.п. Ну и вообще, аммортизационная сложность O(1), а то что оно работает в 10-20 раз медленнее чем то же на простом Си или ином языке с mutable data, это уже мелочь. |
Автор: | Илья Ермаков [ Вторник, 20 Июль, 2010 20:12 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Угу. Это потому, что если некое разделение, которое есть "от природы задач" (например, на операторы и выражения) попытаться убрать, то оно непременно вылезет выше - и потребует всё равно своего проведения в жизнь. Так же, как с однородными языками, где оставлена только одна форма записи - базовая абстракция. Разнообразие всё равно приходится имитировать выше, только это перекладывается на плечи программистов. |
Автор: | Alexey Veselovsky [ Вторник, 20 Июль, 2010 20:23 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Илья Ермаков писал(а): Угу. Это потому, что если некое разделение, которое есть "от природы задач" (например, на операторы и выражения) попытаться убрать, то оно непременно вылезет выше - и потребует всё равно своего проведения в жизнь. Так же, как с однородными языками, где оставлена только одна форма записи - базовая абстракция. Разнообразие всё равно приходится имитировать выше, только это перекладывается на плечи программистов. Пожалуй, это и есть то самое "... но не проще". |
Автор: | Сергей Оборотов [ Вторник, 20 Июль, 2010 22:14 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Rifat писал(а): Поэтому я считаю, что если мы отбрасываем динамические массивы, то мы также отбрасываем большой пласт эффективных по времени и памяти алгоритмов. Не всё так просто, по-моему. Если речь о массивной задаче - всегда есть возможность задуматься об организации иного механизма доступа кроме динамического массива. По ключевой информации, например.
|
Автор: | Илья Ермаков [ Вторник, 20 Июль, 2010 22:30 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Ещё Files.File. Но дин. массивы представляются всё равно нужными. Мелкий пример - вот хранить неизменяемую, но дополняемую структуру со строками разных длин; удобно эти "хвосты" переменной длины динамически порождать. |
Автор: | Alexey Veselovsky [ Вторник, 20 Июль, 2010 22:56 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
C другой стороны, получается, что мы на этапе компиляции будем знать все возможные размеры выделяемых блоков, что, по идее, может облегчить жизнь менеджеру памяти. Быть может удастся уменьшить фрагментацию памяти. Тут как обычно -- чем больше ограничений на то что мы можем делать в программе, тем проще живется рантайму. |
Автор: | Илья Ермаков [ Вторник, 20 Июль, 2010 23:38 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Если я не ошибаюсь, то в Обероне-07, который сделан с учётом опыта Оберона-SA, это как-то связано с особенностями целевой платформы StrongARM. Было такое предположение. |
Автор: | Alexey Veselovsky [ Среда, 21 Июль, 2010 00:36 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Илья Ермаков писал(а): Если я не ошибаюсь, то в Обероне-07, который сделан с учётом опыта Оберона-SA, это как-то связано с особенностями целевой платформы StrongARM. Было такое предположение. Откровенно говоря, не помню в АРМах ничего такого. Помню что да, переменные должны располагаться по адресам кратным своим размерам. Т.е. простой и нивинный код сишный навроде: Код: void unpack(char* buf) { // buf -- это буфер который приехал по сети например. // таки знаем что первые 4ре байта у нас int int* id = (int*)buf; (*id)++; /* с большой вероятностью будет ошибка в момент исполнения на ARM'e, на x86 ошибки не будет никогда. */ // собственно на чтение тоже будет ошибка int some = *id; } является пакостью. Но как это связано с обероновскими массивами, если связано вообще? |
Автор: | Александр Ильин [ Среда, 21 Июль, 2010 12:00 ] |
Заголовок сообщения: | Re: Что бы вы удалили из Оберона? |
Илья Ермаков писал(а): Ещё 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 ] |
Заголовок сообщения: | Re: Можно обойтись без дин. массивов? |
Вообще-то Фортран много лет обходился без динамических массивов... ![]() Кроме того, на базе фиксированного массива большого размера можно построить систему распределения памяти. Например, см. Холл "Вычислительные структуры"... ![]() |
Автор: | Alexey Veselovsky [ Среда, 21 Июль, 2010 16:49 ] |
Заголовок сообщения: | Re: Можно обойтись без дин. массивов? |
Валерий Лаптев писал(а): Вообще-то Фортран много лет обходился без динамических массивов... ![]() Кроме того, на базе фиксированного массива большого размера можно построить систему распределения памяти. Например, см. Холл "Вычислительные структуры"... ![]() Угу. Менеджер памяти написать для своей виртуальной машины ![]() Это называется -- эмуляция. Кроме того, речь идет не о динамических массивах (размер которых можно менять ПОСЛЕ создания), а о обычных массивах просто размер которых не известен на момент компиляции. Скажите лучше, что в них плохого? |
Автор: | Евгений Темиргалеев [ Среда, 21 Июль, 2010 17:55 ] |
Заголовок сообщения: | Re: Можно обойтись без дин. массивов? |
Alexey Veselovsky писал(а): Скажите лучше, что в них плохого? Такая формулировка вопроса в контексте темы некорректна. Думаю, все согласятся, что Вирт не руководствуется разделением средств ЯП на плохие и хорошие.Вирт выпустил новую ревизию Оберона (http://oberoncore.ru/wiki/lang/oberon-07) на основании 20 летнего опыта работы. Врят ли среди нас, ведущих обсуждение, найдётся кто-то, имеющий подобный опыт. Я думаю, что более полезным было бы вместо умозрительного поиска причины 'Почему Вирт решил исключить "дин. массивы" из фундаментальных, обязательных в языке средств' - на базе нашего богатого опыта использования ЯП с дин. массивами, обзавестись опытом работы без дин. массивов. На своих реальных задачах. И, через некоторое время, обсудить этот опыт. Самое простая замена "дин. масс." - список записей со статич. массивами: viewtopic.php?p=49936#p49936 Потребность в упомянутом тов. Лаптевым решении тоже, думаю, никуда не исчесла. В критичных по времени задачах задействуют ручную сборку мусора, переиспользование ставших ненужными объектов (тов. Губанов приводил примеры для C#). Мне кажется, это есть частный случай ручного распределения памяти. P.S. Касательно предложенного подхода у меня опыт наработался. Уже давно пишу на КП без FOR, RETURN-в из середины. Привык. Последнее сделало код более структурным и понятным. Не жалею, проблем не испытываю. |
Автор: | Илья Ермаков [ Среда, 21 Июль, 2010 18:07 ] |
Заголовок сообщения: | Re: Можно обойтись без дин. массивов? |
Что-то не могу у себя найти report Вирта на Oberon-SA. Помнится мне, что в нём по поводу убранных массивов было пояснение. P.S.: вот он: http://www.oberoncore.ru/wiki/lang/oberon_sa Сейчас поглядим. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |