[программирование] Штуковина 1.0

Уже сегодня ученые мира удивляют нас новыми открытиями и техникой, которую мы не ждали ближайшие десятилетия. Насколько будущее приблизилось к нам?

Модератор: модераторы

Аватара пользователя

Автор темы
Bitman
Сообщений: 974
Зарегистрирован: 25.03.2014, 09:50
Желаемая форма обращения: Как хотите к себе
Благодарил (а): 37 раз
Поблагодарили: 42 раза

[программирование] Штуковина 1.0

Сообщение Bitman » 23.01.2019, 10:47

Я полагаю, на этом форуме должны быть программисты, хотя бы “полу-профессиональные”. Я в последнее время пишу разные идеи по подходам в программировании, вот одна из них.
Я пишу на Delphi, и раньше у меня было много проблем из-за багов с утечкой памяти (когда я в коде создал объект или динамический массив, а потом забыл его освободить). Теперь я решил эту проблему так: написал объект “сборщик мусора”, который запоминает все создаваемые программой классы и динамические массивы, и в конце работы подсчитывает, какие из них не были уничтожены, и выводит отчёт в текстовом файле. Выглядит код примерно так:

Код: Выделить всё

    type
    TSafeObject=class
    public
    constructor Create;
    destructor Destroy; override;
    procedure SetThisObjectAsDebugging;//Не будет выводиться сообщение об ошибке
    end;


    TGarbageFinder=class
    private
    FObjectsCount:integer;
    FObjectsCapacity:integer;

    FObjects:array of record
    obj:tobject;
    CreationTime:tdatetime;
    CreationTimeTicks:longword;
    Tag:integer;
    PosInFullLog:integer;
    FirstNum:integer;//Под каким номером был этот объект в самом начале
    RandTag:integer;
    Debugging:boolean;//Для таких не надо выдавать сообщение об ошибке
    end;

    FMemoryBlocks:array of record
    MemMos:pointer;
    BytesCount:integer;
    CreationTime:tdatetime;
    CreationTimeTicks:longword;
    end;

    FMemoryBlocksCount:integer;
    FMemoryBlocksCapacity:integer;

    FLogMessages:tstringlist;
    FFullLogCount:integer;
    FFullLogCapacity:integer;
    FFullLog:array of record
    LogMesType:integer;
    PostTimeTicks:cardinal;
    PostTime:tdatetime;
    end;
    FObjectsSaved:tlist;
    FSaveRepFileName:tfilename;
    FReport:tstringlist;
    FSectionStarted:boolean;
    FSectionsCount:integer;
    FTwiceDestroyedObjectsCount:integer;
    FTotalObjectsNotDestroyedCount:integer;
    FTotalMemoryBlocksNotDestroyedCount:integer;
    FTotalTwiceDestroyedObjectsCount:integer;
    procedure Grow;
    procedure GrowFullLog;
    procedure GrowMemBlocksArray;
    procedure DeleteObject(objnum:integer);
    procedure DeleteMemoryBlock(blocknum:integer);
    procedure AddObject(obj:tobject; crtime:tdatetime; crtimeticks:longword);
    procedure AddMemoryBlock(pos:pointer; bytescount:integer);
    function AddMessageToLogMessagesList(str:string):integer;//Возвращает индекс этой строки в FLogMessages;
    procedure AddItemToFullLog(messtypenum:integer);
    procedure SetObjectsCapacity(newcapacity:integer);
    procedure SetFullLogCapacity(newcapacity:integer);
    procedure SetMemoryBlocksCapacity(newcapacity:integer);
    function NotDebuggingObjectsCount:integer;//Количество объектов за исключением debugging
    public
    FReportFileTooBig:boolean;
    function SomeGarbageRemaining:boolean;
    function FindObject(obj:tobject; direction:tdirection):integer;//-1 если нет
    function FindMemoryBlock(pos:pointer; direction:tdirection):integer;
    procedure SetObjectTag(obj:tsafeobject; newtag:integer);
    procedure AddStringToFullLog(str:string);
    procedure StartSection;
    procedure FinishSection;
    procedure AddToReport(str:string);
    procedure ObjectCreated(obj:tobject); overload;
    //procedure ObjectCreated(obj:tobject; logstr:string); overload;
    procedure ObjectDestroyed(obj:tobject);
    procedure MemoryBlockCreated(pos:pointer; bytescount:integer);
    procedure MemoryBlockDestroyed(pos:pointer);
    procedure PlaceTag(tag:integer);
    constructor Create(repfilename:tfilename);
    procedure FinalizeReport;
    procedure WriteReportToFile;
    destructor Destroy; override;
    end;

    var
    ProjectGarbageFinder:TGarbageFinder;
    …
    constructor TSafeObject.Create;
    begin
    inherited;

    if poGarbageFinderActive then begin
    ProjecTGarbageFinder.ObjectCreated(self);
    end;
    end;

    destructor TSafeObject.Destroy;
    begin
    if poGarbageFinderActive then begin
    ProjecTGarbageFinder.ObjectDestroyed(self);
    end;

    inherited;
    end; 
После этого я сделал все классы своей программы наследниками TSafeObject (вместо TObject), и старые баги стали легко обнаруживаться. Объект ProjectGarbageFinder пишет репорт в текстовой файл, из которого обычно сразу понятно где был баг.
Должен сказать, что такой подход у меня во многом от моего непрофессионализма – если бы я раньше знал про переменную ReportMemoryLeaksOnShutdown в Delphi, мне бы изначально, возможно, всё это писать не потребовалось бы. Хотя я думаю, что всё равно мой сборщик мусора полезен как дополнение к этой опции.
Как я понимаю, для C++ можно написать такую же штуку, а для более "продвинутых" языков вроде C# или Питона она не нужна, так как в них есть свой собственный сборщик мусора (но за это приходится платить скоростью работы программы).
Мне хотелось бы больше узнать про эти “высокоуровневые” языки. Хотелось бы почитать книги, где кратко изложена “философская суть” этих языков, их принципы. Вот здесь, например, кратко изложены принципы Python:
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Кто знает Питон – согласны с этим текстом? Хотя я без примеров, конечно, пока ничего всё равно не понимаю.

У меня такая идея: придумать решения для Delphi и C++, которые смогут помогать реализовать эти же принципы. Это могут быть объекты вроде этого сборщика мусора, или программа, переписывающая мой собственный код, или программа, проверяющая код на определённые правила и выполняющая эвристический анализ багов. С правилами это будет выглядеть, наверно, так: программист принимает решение соблюдать определённые правила при написании кода, программа это проверяет, и проверяет ещё что-нибудь, и благодаря этому баги делаются гораздо реже.
Ещё раз, мой вопрос – правильно ли я понимаю, что эти высокоуровневые языки предлагают средства, с которыми совершаешь меньше ошибок, чем на старых языках; что это за средства, и нельзя ли их реализовать в рамках старых языков.
Может быть, то, о чём я думаю, давно реализовано — Pascal Analyser, Code Healer. Я сходу посмотрел сайт Code Healer, и поскольку не увидел галереи с достаточно удобным описанием сути фич программы, уже думаю что смогу сделать как минимум не хуже.


Кот Матроскин
Сообщений: 994
Зарегистрирован: 25.04.2006, 19:01
Желаемая форма обращения: Всё равно
Откуда: Бесконечное лето, Совёнок
Благодарил (а): 111 раз
Поблагодарили: 203 раза
Возраст: 37

[программирование] Штуковина 1.0

Сообщение Кот Матроскин » 23.01.2019, 16:08

Питон-скриптовая бяка, вроде ВБА. Отучает программиста понимать КАК работает его программа. Низкопроизводителен, неуниверсален. Любим новичками за очень низкий порог вхождения.

Дельфи-я не знаю кто на нём ещё пишет, это либо поддержка старья, либо какой нибудь АСУ где старожилы категорически не желают перейти на .NET. Многие ВУЗы по инерции используют его для обучения.

С и С++ вполне себе жив. Имеет достаточно высокий порог вхождения. Незаменим в разработке микроконтроллеров, близок к железу. Все низкоуровневые и высокопроизводительные вещи( а так же ресурсоёмкие программы и игры) пишутся как правило на нём, зачастую с фрагментами на Ассемблере. По прежнему популярен в среде Линукс.

С# и платформа .NET, в настоящее время весьма популярны, имеют солидное количесво улучшений и доработок по сравнению с предками(С++, JAVA). Весьма удобный синтаксис, многочисленные виды защита от дурака и выстрела в ногу . Солидное количество встроенных классов для различных задач. Имеют лучшую в своём роде интегрированную среду разработки - Visual Studio. Весьма производительная вещь, в некоторых случаях код может работать быстрее написанного на С++.
Bitman писал(а): 23.01.2019, 10:47 У меня такая идея
Костылей за десятки лет пользования этими языками напридумывано немало, вероятно есть и те что вы хотите вновь создать.
Если вам нужен язык программирования писать что то полезное, настоятельно рекомендую изучить C#. Начните с консольных приложений, потом WinForms, а далее если очень захотите то WPF но это для эстетов. *CRAZY*


ПереГиБ
Сообщений: 3964
Зарегистрирован: 14.09.2009, 10:38
Желаемая форма обращения: Как хотите к себе
Благодарил (а): 240 раз
Поблагодарили: 744 раза

[программирование] Штуковина 1.0

Сообщение ПереГиБ » 24.01.2019, 00:33

Кот, зачем так грубо?
Не только на Дельфи сейчас пишут, но (не побоюсь этого слова) даже на эмуляторе Турбо-Паскаля.
В учебных целях.
Я и сам своего старшего ребенка на нём учу.
А Си и его производные лучше в процессе программирования безделушек на Arduino учить

Аватара пользователя

Автор темы
Bitman
Сообщений: 974
Зарегистрирован: 25.03.2014, 09:50
Желаемая форма обращения: Как хотите к себе
Благодарил (а): 37 раз
Поблагодарили: 42 раза

[программирование] Штуковина 1.0

Сообщение Bitman » 24.01.2019, 18:49

Кот Матроскин писал(а): 23.01.2019, 16:08 Питон-скриптовая бяка, вроде ВБА. Отучает программиста понимать КАК работает его программа. Низкопроизводителен, неуниверсален. Любим новичками за очень низкий порог вхождения.
Интересно. Вообще у меня всё сильнее ощущение, что на таких форумах (не-программистов) чаще можно узнать более толковую информацию о программировании, чем на форумах "профессиональных" программистов. Специалист подобен флюсу...
А вот на такой вопрос не сможет ли здесь кто-нибудь ответить. Мне для моего сборщика мусора очень не хватает особой фичи - нестандартная обработка исключения или ассерта. Нужен примерно такой код:

Код: Выделить всё

procedure TmpAssertProc(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);
var
  str:string;
  strprogname:string;
begin
  str:=filename+' line '+inttostr(linenumber);
  str:=str+message;
  ProjectGarbageCollector.LastConstructorWasFromSource(str);
end;


{ TSafeObject }

constructor TSafeObject.Create;
var
  oldassertproc:TAssertErrorProc;
begin
  inherited;

  if GarbageCollectorActive then
  begin
    ProjectGarbageCollector.ObjectCreated(self);
    oldassertproc:=AssertErrorProc;
    AssertErrorProc := TmpAssertProc;
    assert(false);
    AssertErrorProc:=oldassertproc;
  end;
end;
Мой текущий сборщик пишет в текстовом файле список классов, которые не были уничтожены, но всё равно это ещё недостаточная информация, чтобы легко найти баги. Я хочу встроить в обработчик TSafeObject.Create нестандартное использование исключения – анализ стека с целью узнать место в коде, откуда был вызван этот конструктор. Пример выше - это похожее использование ассерта (но этот конкретный пример, конечно, не будет работать - я получу только информацию где находится TmpAssertProc).
Вроде для этого можно использовать библиотеку JclDebug: пишут, что если её подключить к проекту, обработчик исключения будет в переменной e.StackTrace выдавать в текстовом виде много информации, которая мне и нужна.
Я пробовал подключить JclDebug к моему проекту, но во-первых это не получается из-за какой-то несовместимости: библиотеке нужны некие ModuleInfo.EntryPoint, EnumProcessModules и ещё много того, что нет в этой самой библиотеке. Во-вторых, я не хочу подключать к проекту всю эту библиотеку – она сильно большая, мне нужен только класс TJclStackInfoList чтобы внедрить его в обработчик исключения (если и это вообще нужно). Если кто-нибудь работал с JclDebug – подскажите, как проще всего решить мою задачу?
Как я уже сказал, мне вроде нужно только одно – чтобы мой собственный обработчик Application.OnException получал в e.StackTrace не пустую строку, как по умолчанию, а то, что есть в других ЯП (в .NET есть Exception.StackTrace и в Java есть Exception.getStackTrace).


Кот Матроскин
Сообщений: 994
Зарегистрирован: 25.04.2006, 19:01
Желаемая форма обращения: Всё равно
Откуда: Бесконечное лето, Совёнок
Благодарил (а): 111 раз
Поблагодарили: 203 раза
Возраст: 37

[программирование] Штуковина 1.0

Сообщение Кот Матроскин » 24.01.2019, 19:45

Bitman писал(а): 24.01.2019, 18:49 мне вроде нужно
Ежели у вас древнейший борланд делфи 7, может имеет смысл поюзать хотя бы RAD2010 или ещё эмбаркадерру какую нибудь? Насчёт средств отладки не в курсе, но её поведение и возможности всё же ближе к Визуал Студио.
Bitman писал(а): 24.01.2019, 18:49список классов
Эм может список объектов (экземпляров класса) всё же? Хотя класс конечно может быть и статическим, если эта магия применима к дельфину.
Bitman писал(а): 24.01.2019, 18:49 она сильно большая, мне нужен только класс TJclStackInfoList
Ну если у класса мешок зависимостей отделить его будет непросто, особенно если нет исходника. Или тащить библиотеку если так необходимо вам.

Аватара пользователя

Автор темы
Bitman
Сообщений: 974
Зарегистрирован: 25.03.2014, 09:50
Желаемая форма обращения: Как хотите к себе
Благодарил (а): 37 раз
Поблагодарили: 42 раза

[программирование] Штуковина 1.0

Сообщение Bitman » 24.01.2019, 20:34

Кот Матроскин писал(а): 24.01.2019, 19:45 Ежели у вас древнейший борланд делфи 7, может имеет смысл поюзать хотя бы RAD2010 или ещё эмбаркадерру какую нибудь? Насчёт средств отладки не в курсе, но её поведение и возможности всё же ближе к Визуал Студио.
На данный момент Delphi XE8.
Кот Матроскин писал(а): 24.01.2019, 19:45 Эм может список объектов (экземпляров класса) всё же? Хотя класс конечно может быть и статическим, если эта магия применима к дельфину.
В отчёте пишутся названия классов.
Вместо статических классов в Delphi XE есть рекорды с процедурами и функциями.
Кот Матроскин писал(а): 24.01.2019, 19:45 Ну если у класса мешок зависимостей отделить его будет непросто, особенно если нет исходника. Или тащить библиотеку если так необходимо вам.
Библиотека уж очень большая, у меня екзешник станет в два раза больше(


Олег К
Сообщений: 813
Зарегистрирован: 31.10.2009, 21:05
Желаемая форма обращения: Как хотите к себе
Благодарил (а): 186 раз
Поблагодарили: 220 раз

[программирование] Штуковина 1.0

Сообщение Олег К » 10.02.2019, 21:35

Мне кажется, язык программирования который идеально подойдет автору темы - это Haskell.

Аватара пользователя

Автор темы
Bitman
Сообщений: 974
Зарегистрирован: 25.03.2014, 09:50
Желаемая форма обращения: Как хотите к себе
Благодарил (а): 37 раз
Поблагодарили: 42 раза

[программирование] Штуковина 1.0

Сообщение Bitman » 10.02.2019, 21:56

Олег К писал(а): 10.02.2019, 21:35 Мне кажется, язык программирования который идеально подойдет автору темы - это Haskell.
Почему?
Я мало знаю про хаскель, мне показалось это перенавороченный скриптовый язык - может быть, для очень умных, но тем не менее бедных)

http://lurkmore.to/Haskell
Как и положено в таких вещах, ярость отдельных сторонников языка обратно пропорциональна его востребованности на рынке. Согласно проведенным с участием авторитетных анонимусов исследованиям, в мире на данный момент насчитывается около 8 реальных вакансий для программистов на хаскеле. В остальных случаях знание хаскеля рассматривается, как правило, как незначительный плюс.
Я возможно слишком уж часто говорю какие-либо предположения, не имея никаких фактов (хотя имея интуицию), но мне кажется, главная проблема хаскеля - ннеуниверсальность, поэтому для серьёзных приложений он не годится. А то что код меньше в десять раз - это ещё не значит что код проще, легче отлаживается и понимается.


Олег К
Сообщений: 813
Зарегистрирован: 31.10.2009, 21:05
Желаемая форма обращения: Как хотите к себе
Благодарил (а): 186 раз
Поблагодарили: 220 раз

[программирование] Штуковина 1.0

Сообщение Олег К » 11.02.2019, 19:28

Bitman писал(а): 10.02.2019, 21:56Почему?
По совокупности постов)) Если человек хочет освоить новый ЯП, и его не пугает, а скорее привлекает лютый IT-матан, то сразу подумалось о Хаскеле. По поводу того, что это скриптовый язык, на котором нельзя писать серьезные приложения, то это мягко говоря устаревшая информация. Компиляторы в наличии имеются: https://ru.wikipedia.org/wiki/Glasgow_Haskell_Compiler. На вики, есть список более чем серьезных приложений написанных на Хаскель, в том числе компиляторы других языков, СУБД, программы для работы с графикой и. т. д.
А строки на Лурке про 8 вакансий я читал еще лет десять назад. С тех времен в этом плане тоже могло что-то измениться). Ну и кроме того я так понял, что мотив не сиюминутное трудоустройство, а желание загрузить свободные мозговые мощности и в процессе обучиться чему-нибудь новому на перспективу? Питон это не тот язык, которым можно что-то загрузить и вообще попса(в том смысле что питонщиков развелось как...), а Хаскель самое оно)). Если, конечно мотив именно такой.

Новая тема Ответить

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

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