OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 14:45

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




Начать новую тему Ответить на тему  [ Сообщений: 94 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
СообщениеДобавлено: Понедельник, 18 Ноябрь, 2019 23:00 
Модератор
Аватара пользователя

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


Часть из этих задач, действительно, можно бы решать на этапе трансляции, имея доступ через стандартный API к дереву компилятора и отработав режим compile-time-алгоритмов. Вот оцифруется видео с последней конференции-дня-Оберона моё по расширяемому синтаксису - можно будет обсудить.

Но вот что уж точно плохо, так это введение навороченной compile-time декларативной семантики аля шаблоны C++, аля Haskell и т.п.

Метапрограммирование в том объёме, в каком он есть в ББ, реально, самое оптимальное сочетание статически типизированного языка и динамических возможностей.

Ну, не говоря про то, что на compile-time можно получить только дубовый Qt, а не гибкий BlackBox без границы между runtime и devtime.

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

Если делать на монструозной Java монструозную ORM типа Hybernate и опирать её на рефлексию, то ясен фиг, вылезет столько граблей и уязвимостей, что мало не покажется.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 00:21 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
budden писал(а):
Если цель иная, то было бы неплохо бы, чтобы автор темы её сформулировал.
Так нет автора темы. Я не люблю когда люди валят все сообщения в одну кучу в единый поток сознания. Поэтому, если успеваю, то интересующие меня темы, зародившиеся в неподходящем месте, отделяю в отдельный поток. Что до рефлексии, то отношение к ней формируется через общие инженерные соображения. Но это ещё одна большая тема.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 00:27 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Илья Ермаков писал(а):
Так статистика известна. Для системного уровня >95% (как бы не 98?) - атака на переполнение буфера.

Или аналог для динамических скриптов: всякие атаки на инъекцию.
А если обобщить, то проблема в протекающих абстракциях.

Цитата:
Чтобы лезть по пришедшему из сети имени тупо "рефлексировать" - ну это, во-первых, редко сама по себе такая мысль придёт, во-вторых, и проверить в таком случае можно.
Это не редкость, а рутина при сериализации-десериализации через рефлексию. Кроме того, далеко не всегда очевидно, что данные пришли из ненадёжного источника, так как могут проходить цепочку преобразований и на том уровне, на котором применили рефлексию, может быть неясно, что однажды здесь окажутся небезопасные данные.


Последний раз редактировалось Comdiv Вторник, 19 Ноябрь, 2019 00:32, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 00:32 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Илья Ермаков писал(а):
Короче, в мейнстриме всё экспоненциально раздуто - в итоге наблюдается эффект такого же усиления каждых потенциальных граблей.
Да, сложность это именно усилитель. До пересечения определённого порога объёма и сложности ни динамическая типизация, ни неструктурность кода, ни отсутствие контроля за памятью, ни рефлексия не представляют никакой опасности, а наоборот, дают сплошные ништяки и дарят "красивый" код. Рефлексия как и модуль SYSTEM - полезные вещи, которые лучше не использовать без особой нужды.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 10:39 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
В общем, как я понял, рефлексия не очень-то и нужна.
Если её применяют для целей логирования, то и без нее можно обойтись, если проверять тип логируемого объекта и явно сохранять его значения.
Для целей сериализации и десериализации тоже не обязательно, во-первых, не обязательно все уметь сериализовать, а то, что надо сериализовать, можно явно реализовать, чтобы объект сам себя сериализовал.
Для целей реализации подсказок в редакторе кода тоже можно обойтись без рефлексии, если разрабатывать редактор не отдельно от компилятора, а использовать части компилятора для поиска по таблице символов.
Для посмертных отладчиков рефлексия не нужна, так как посмертный отладчик "сам знает" где что лежит и как что надо отобразить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 11:44 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Rifat писал(а):
В общем, как я понял, рефлексия не очень-то и нужна.
Если её применяют для целей логирования, то и без нее можно обойтись, если проверять тип логируемого объекта и явно сохранять его значения.
Ну, вот, опять люди что-то пишут ничего не понимая в том, о чём пишут. Замучаетесь пыль глотать, как говорил мой шеф.
Вот, есть, предположим, такая структура. Залогируйте её быстренько, и безошибочно, да ещё и так, что-бы не гонять порожняк, выводите лишь непустые значения (числа не равные 0, непустые строки):
Код:
  public struct structSTIOrderUpdate
  {
    public short bMoc;
    public short bMoo;
    public short bOpportunisticTrade;
    public string bstrAccount;
    public string bstrAction;
    public string bstrBatchId;
    public string bstrClOrderId;
    public string bstrCoverUncover;
    public string bstrCurrency;
    public string bstrDestination;
    public string bstrEndTime;
    public string bstrExchClOrderId;
    public string bstrExchOrderId;
    public string bstrExchOrderId2;
    public string bstrExecBroker;
    public string bstrExecInst;
    public string bstrFutSettDate;
    public string bstrInstrument;
    public string bstrLogMessage;
    public string bstrMaturity;
    public string bstrOpenClose;
    public string bstrOrderTime;
    public string bstrPairId;
    public string bstrPriceType;
    public string bstrPutCall;
    public string bstrSettCurrency;
    public string bstrSettleDate;
    public string bstrSide;
    public string bstrSorPreference;
    public string bstrStartTime;
    public string bstrStrategy;
    public string bstrSymbol;
    public string bstrTif;
    public string bstrUnderlying;
    public string bstrUpdateTime;
    public string bstrUser;
    public string bstrUserId;
    public short bSvrStpReleased;
    public short bTakeLiquidity;
    public double fAvgExecPrice;
    public double fAvgPriceLmt;
    public double fCashComponent;
    public double fDiscretion;
    public double fExecPriceLmt;
    public double fLmtPrice;
    public double fMaxHighPctDeviation;
    public double fMaxLowPctDeviation;
    public double fPctPerSlice;
    public double fPegDiff;
    public double fPremium;
    public double fRatio;
    public double fReactPrice;
    public double fStpPrice;
    public double fStrikePrice;
    public double fTargetPctVolume;
    public double fTargetPrice;
    public double fTilt;
    public double fTrailAmt;
    public double fTrailInc;
    public double fUrStpdPrice;
    public int nAuction;
    public int nCumExecQuantity;
    public int nDbsNo;
    public int nDisplay;
    public int nDuration;
    public int nExecAggression;
    public int nLvsQuantity;
    public int nMarketStructure;
    public int nMaxPctVolume;
    public int nMinPctVolume;
    public int nMinQuantity;
    public int nOrderCompletion;
    public int nOrderRecordId;
    public int nOrderStatus;
    public int nPingInterval;
    public int nPriceTolerance;
    public int nPriceType;
    public int nQtyTolerancePct;
    public int nQtyToleranceSize;
    public int nQuantity;
    public int nRefreshInterval;
    public int nRefreshQty;
    public int nSeqNo;
    public int nSizeLow;
    public int nSizeMax;
    public int nTrailId;
  }
И структур таких десятки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 12:19 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
И что? Это что-то доказывает, что у вас большие структуры?
Да, надо будет написать немного кода для каждого поля, чтобы явно его вывести. Зато есть преимущество того, что все поля можно отследить, где какое поле как используется. И не будет неожиданностей, если, например, кто-то добавит в структуру еще одно строковое поле, в котором хранятся большие строки, и если эта структура, допустим, много раз пишется в лог, то можно переполнить диск таким большим логом, при этом это будет довольно неожиданно, что поле добавили в одном месте, а из-за этого переполнилась память в другом месте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 12:25 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Что можно доказать в детском саду ясельной группы...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 12:32 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Rifat писал(а):
И не будет неожиданностей, если, например, кто-то добавит в структуру еще одно строковое поле, в котором хранятся большие строки, и если эта структура, допустим, много раз пишется в лог, то можно переполнить диск таким большим логом, при этом это будет довольно неожиданно, что поле добавили в одном месте, а из-за этого переполнилась память в другом месте.
Конечно, а то, что всякий раз как кто-то будет добавлять какие-то поля, вам придётся переписывать места кода, которые давно исправно работали... только из-за того, что кто-то добавил поля. Это конечно не неожиданность, а приятное времяпрепровождение :lol:
А возможность переполнения диска логом как-то тоже принято предусматривать заранее. Нет? Может лучше больше времени посвятить совершенствованию кода приложения, чем неустанно исправлять логирование структур, из-за того, что кто-то что-то там добавил? :lol:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 12:44 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Ярослав Романченко писал(а):
Код:
  public struct structSTIOrderUpdate
  {
    public short bMoc;
    ...
    public int nTrailId;
  }
И структур таких десятки.
Эмбеддер: "Ааааа!.." [ с лицом, искажённым удивлением и ужасом, убегает... ]

Ярослав Романченко писал(а):
Замучаетесь пыль глотать, как говорил мой шеф.
Вы - того, не сильно в нонешних реалиях цитатствуйте! А то ведь, не ровён час, кто-то из особо сознательных захочет узнать, кто там у Вас шефом... ( https://www.youtube.com/watch?v=Mn3TN_sf8LE ) :)

На счёт рефлексии...
У меня - двоякое отношение.
С одной стороны, в "жирных" системах, когда работаешь с кучей кода, где происходит параметрическое порождение объектов разных типов, или сериализация - часть задачи, вроде бы, вещь полезная.
С другой, в тех системах, где ресурсов - с гулькин нос, приходится изобретать нечто подобное, но - без избыточности. Больше - для отладки собственными средствами и ведения протоколов. Больше - к задаче логгирования сводится...


Последний раз редактировалось Wlad Вторник, 19 Ноябрь, 2019 12:46, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 12:46 
Аватара пользователя

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

Код:
    private object GetDefault(Type type)
    {
      if (type.IsValueType) { return Activator.CreateInstance(type); }
      return null;
    }

    private void AppendValue(string name, object value, StringBuilder builder)
    {
      if (value != null)
      {
        if (!value.Equals(GetDefault(value.GetType())))
        {
          if (builder.Length != 0)
            builder.Append(", ");
          builder.AppendFormat("{0}: {1}", name, value);
        }
      }
    }

    private string PrintObject(object obj)
    {
      Type type = obj.GetType();
      StringBuilder builder = new StringBuilder();
      foreach (var prop in type.GetProperties())
        AppendValue(prop.Name, prop.GetValue(obj), builder);
      foreach (var field in type.GetFields())
        AppendValue(field.Name, field.GetValue(obj), builder);
      return builder.ToString();
    }


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 12:49 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Wlad писал(а):
ведь, не ровён час, кто-то из особо сознательных захочет узнать, кто там у Вас шефом...
Будете смеяться, но это любил говорить мой шеф лет так 20 назад и звали его не так как Вас, а Димой :lol:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 13:21 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Мне кажется (IMHO), что в современном программировании очень много избыточности и опасностей из-за того, что мало кто пытается делать формальную верификацию кода, а оперируют субъективными понятиями нравится/не нравится, удобно/не удобно. Если же задуматься о том, как формально верифицировать различные конструкции языка, то выяснится, что многие конструкции практически невозможно (или очень сложно) формально верифицировать. Сейчас мы обсуждаем рефлексию и возникает вопрос, а как можно формально верифицировать код, который использует рефлексию?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 13:34 
Модератор
Аватара пользователя

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


Да не так это.
Весь Блэкбокс, как среда, - на рефлексии стоит. Иначе - прибитое гвоздями в коде типа QT.

Это как отказаться от выхода в поле комплексных чисел.
Метапереход - он и есть метапереход.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 13:47 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Rifat писал(а):
Для целей сериализации и десериализации тоже не обязательно, во-первых, не обязательно все уметь сериализовать, а то, что надо сериализовать, можно явно реализовать, чтобы объект сам себя сериализовал
Java, кстати, движется в этом направлении после десятилетий неявной, "бесплатной" сериализации на рефлексии.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 13:54 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Comdiv писал(а):
Java, кстати, движется в этом направлении после десятилетий неявной, "бесплатной" сериализации на рефлексии.
Опять со своей Жабой :mrgreen:
Да, есть языки и среды которые не сделаны так по-дурацки, как ваши Жабы!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 13:59 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 14:06 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 14:07 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Для меня пока не понятно, как можно формально верифицировать использование рефлексии. Если есть желание формально доказать корректность всей программы, то при использовании рефлексии это может быть невозможно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 19 Ноябрь, 2019 14:16 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Rifat писал(а):
Для меня пока не понятно, как можно формально верифицировать использование рефлексии. Если есть желание формально доказать корректность всей программы, то при использовании рефлексии это может быть невозможно.
А что не понятно? У вас есть для каждого типа блок мета-информации, вы можете обращаться к нему только для чтения, так как он порождён в момент компиляции. Любая структура в памяти - просто поток байтов. Блок мета-информации содержит сведения о том, по какому смещению в этом байтовом массиве лежит какое-либо значение, какого оно типа и сколько занимает байт. Всё. Это тяжело формализовать и верифицировать? Вы же доверяете исполняемому коду, который порождён компилятором?


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

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


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

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


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

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