OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 29 Июнь, 2017 00:02

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




Начать новую тему Ответить на тему  [ Сообщений: 46 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Вторник, 05 Февраль, 2013 18:14 

Зарегистрирован: Суббота, 02 Февраль, 2013 16:19
Сообщения: 16
Раньше программисты сортировали так:
Код:

for i := 0 to len(items) - 2 do
  for j := i + 1 to len(items) - 1 do
    if items[j] < items[i] then
      swap(items[i], items[j]);



Сейчас сортируют вот так:

Код:
items.sort();


В большинстве мейнстримовых языков есть стандартные средства для организации контейнеров: вектора-массивы, списки, отображения (хеш-таблицы либо деревья), а также некоторые алгоритмы, применимые для работы с ними: сортировка, удаление дубликатов, двоичный поиск и т.д. Где-то эти механизмы встроены в язык (Python), где-то поставляются с библиотекой. Обобщённые контейнеры могут быть реализованными либо как контейнеры объектов корневого типа Object (ранняя Java), либо как generic’и (C++, поздняя Java, C#). В отличии от Ады (и от поздних извращений стандартной Модулы), в Обероне/КП дженериков нет, значит, по идее, должна быть какая-нибудь библиотека контейнеров, основанная на корневом типе (ANYREC).

Я некоторое время изучал встроенную документацию BlackBox, таковую не нашёл. Не нашёл даже библиотечной функции сортировки (хотя таковая есть даже в C89). Я плохо искал или таковая библиотека, по замыслу создателей, действительно не нужна?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 05 Февраль, 2013 18:30 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2354
Откуда: Россия, Ярославль
Надо у разработчиков спрашивать ;)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 05 Февраль, 2013 18:51 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2354
Откуда: Россия, Ярославль
Вообще, если принять за данность, что разработчики не дали нам списков, есть два варианта.
Сказать, что Blackbox не нужен.
Создать библиотеки списков, и использовать их везде, в своих проектах, а так же предоставить их сообществу.
Сказать, что такие библиотеки не нужны, а списки правильно будет располагать в каждой подсистеме свои (пусть даже и копии модулей, но исчезает зависимость).

У каждого варианта есть свои преимущества, но я, например, сторонник второго пути, поэтому появилась библиотека Lists.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 05 Февраль, 2013 20:09 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7562
Откуда: Троицк, Москва
Надо доказывать, и доказательство должно быть очень весомым, почему в язык и компилятор встраивается то, что может быть вынесено в библиотеки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 05 Февраль, 2013 20:10 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4388
Откуда: Россия, Орёл
Любой программист должен знать "Алгоритмы и структуры данных" (например, http://oberoncore.ru/library/algorithms ... structures). Чтобы:
а) уметь адекватно применять готовые средства.
б) уметь сочетать стандартные приёмы, реализуя ориентированные на задачу решения (которые могут в разы повышать эффективность в сравнении комбинированием отдельно взятых стандартных решений).

Готовые компоненты по означенной тематике есть. См. http://oberoncore.ru/bbcc/ и http://oberoncore.ru/projects/cpc


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 06 Февраль, 2013 15:49 

Зарегистрирован: Суббота, 02 Февраль, 2013 16:19
Сообщения: 16
Info21 писал(а):
Надо доказывать, и доказательство должно быть очень весомым, почему в язык и компилятор встраивается то, что может быть вынесено в библиотеки.
Я говорил про скриптовые языки вроде Python’а, JavaScript. Встраивание тех средств, которые могут быть вынесены в библиотеки, я нахожу допустимым только для скриптовых языков или языков предметной области. Для компилируемых языков общего назначения подобные средства должны быть по максимуму вынесены в отдельные библиотеки. Когда-то, когда я ещё только делал первые шаги в программировании, мне именно этим и понравился язык Си (Си++) — ввод-вывод был независим от языка, в отличие от Паскаля или Бейсика, где для ввода-вывода используются особые синтаксические конструкции: Write(x:10:5), PRINT A$ и т.д.

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

Пётр Кушнир писал(а):
У каждого варианта есть свои преимущества, но я, например, сторонник второго пути, поэтому появилась библиотека Lists.
Евгений Темиргалеев писал(а):
Готовые компоненты по означенной тематике есть. См. http://oberoncore.ru/bbcc/ и http://oberoncore.ru/projects/cpc

Спасибо за ссылки.

В общем, стандартной библиотеки с такими средствами в Компонентном Паскале нет, есть несколько библиотек от сторонних разработчиков. Можно использовать либо их (тогда нужно тащить соответствующую стороннюю подсистему), либо самому изобретать велосипед.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 06 Февраль, 2013 19:02 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7562
Откуда: Троицк, Москва
Маздайщик писал(а):
либо самому изобретать велосипед.
Да ладно.

У меня много динамических данных в самых разных задачах, но списки почему-то создаются добавлением в голову, а используются -- снятием с головы :)

Тут любая библиотека сложнее будет.

А если что-то более сложное, то там столько вариантом, что легче учесть конкретную специфику напрямую, чем бороться с библиотекой на все случаи жизни.

Это много раз обсуждалось.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 07 Февраль, 2013 09:59 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 2846
Откуда: Астрахань
Маздайщик писал(а):
В общем, стандартной библиотеки с такими средствами в Компонентном Паскале нет, есть несколько библиотек от сторонних разработчиков. Можно использовать либо их (тогда нужно тащить соответствующую стороннюю подсистему), либо самому изобретать велосипед.

Дело в том, что и стандарта нет. :) Поэтому и стандартной библиотеки не наблюдается... :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 07 Февраль, 2013 12:40 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2281
Откуда: Россия, Санкт-Петербург
Есть In, Out и т.п. См. Oakwood Guidelines. Это и есть стандарт.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 07 Февраль, 2013 18:19 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7562
Откуда: Троицк, Москва
Александр Ильин писал(а):
Есть In, Out и т.п. См. Oakwood Guidelines. Это и есть стандарт.
Oakwood Guidelines это не стандарт.

Реальный стандарт -- библиотеки ББ.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Февраль, 2013 13:52 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 974
Откуда: Украина, Киев
Кстати, Клеменс Шиперский предлагал (в книге "Component Software: Beyond Object-Oriented Programming") добавить дженерики (параметрическим полиморфизмом кажется называлось) в КП, но идея почему-то не получила развития.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Февраль, 2013 20:49 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7562
Откуда: Троицк, Москва
Ярослав Романченко писал(а):
но идея почему-то не получила развития.
"Почему-то"?

Потому что избыточная сложность.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Февраль, 2013 21:26 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2354
Откуда: Россия, Ярославль
А в каждый значимый модуль совать новый самодельный итератор/стек не сложно?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Февраль, 2013 22:40 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 974
Откуда: Украина, Киев
"Избыточная сложность" говорите?
А сколько кода придётся налабать на КП/Обероне, что-бы описать подобную структуру данных?
Код:
TElement = class;
TDictionaryKey = TPair<string, string>;
TDictionaryEntry = TPair<TDictionaryKey, TElement>
TElementsDictionary = TDictionary<TDictionaryEntry>;
TItemsList = TList<TElementsDictionary>;
И ведь есть языки в которых это можно, и работает весьма эффективно, тот-же ObjectPascal/Delphi...
ЗЫ. И что-бы структура заработала как надо, нужно переопределить всего две простейших функции в TElementsDictionary.
Подсчитаем количество кода? :lol:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Февраль, 2013 23:31 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 1825
Откуда: Красноярск
Душевные мучения по поводу отсутствия списков и хеш-таблиц закончились после чтения "Алгоритмов и структур данных" и написания маленького примера для сравнения производительности дефолтной хеш-функции в python и, выбранной мной для конкретной задачи на КП. Универсальной хеш-функции не может быть, и манипуляции со списками также иногда лучше делать нетривиально. ИМХО, использование "дорогих" по производительности алгоритмов должно обходится "дороже" по времени для программиста, чтобы не забивать микроскопом гвозди, разрабатывать сбалансированные приложения.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Февраль, 2013 23:37 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 974
Откуда: Украина, Киев
Никто Вам не мешает подставить свои хеш-функции в стандартные контейнеры. Фактически, в этом случае, только хеш-функцию Вам и нужно будет написать, всё остальное сделает скрытый от глаз библиотечный код.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Февраль, 2013 23:55 

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7562
Откуда: Троицк, Москва
Лучше последовать примеру И.Д. и научиться программировать по хорошей книжке.
Окупится мультикратно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 09 Февраль, 2013 00:11 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2354
Откуда: Россия, Ярославль
Ну, в современном мире принято дорого платить за время кодера, и соответственно, кодеру выгоднее меньше делать движений за это время, а собственнику выгоднее это учитывать и повышать норму выработки, а кодеру в ответ на это приходится повышать уровень абстракции, но в итоге, всё это выливается в потогонную систему, которая никакого отношения не имеет к значимости объема исходного кода.

Ну, написали там тридцать строк, а тут сто, всё равно написание строк не занимает столько мозговых ресурсов, параметр строки/время важен в основном заказчику. Ну, динамичный мир, быстрые бизнесы и прочее.

Ведь подумайте, не важно, на самом деле, когда русские запустили бы человека в космос, в 1961-м или 2001-м, для истории это смешные сроки, это было важно сделать быстро только в условиях конкуренции внутри популяции Хомо.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 09 Февраль, 2013 00:25 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 974
Откуда: Украина, Киев
Info21 писал(а):
Лучше последовать примеру И.Д. и научиться программировать по хорошей книжке.
Окупится мультикратно.
Конечно можно, и нужно. Никто не отрицает.
Только вот, отрицание параметрического задания класса сродни отрицанию третьего измерения :lol:
Можно так и пыхтеть в двух измерениях, а можно признать существование третьего и получить дополнительную степень свободы.
Ведь параметрический полиморфизм по-сути просто устраняет рутинные операции.
Допустим, нам нужны три списка: список целых, список строк и список вещественных элементов.
В традиционном подходе, описываем+кодируем три разных структуры, реализующих списки - TIntegerList, TStringList и TFloatList.
А параметрический полиморфизм избавляет от этой рутины.
Написали: TIntegerList = TList<Integer>, TStringList = TList<String> и TFloatList = TList<Float>. И... компилятор генерирует готовые классы со всем необходимым функционалом. И строгим статическим контролем типов!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 09 Февраль, 2013 00:30 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2354
Откуда: Россия, Ярославль
А возможна ли реализация подобного механизма на каком-то приближённом к идеалу уровне, но в виде компонента? Ведь можно допустить, что раз не включено в язык, пусть будет включено в компонент, как составляющая.


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

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


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

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


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

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