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

здесь можно обсудить кошечек и ёжиков
Аватара пользователя
Vit Nhoc
Сообщения: 1142
Зарегистрирован: Сб июн 06, 2015 12:28 pm

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

Сообщение Vit Nhoc » Чт янв 10, 2019 11:05 am

Я полагаю, на этом форуме должно быть довольно много программистов, хотя бы “полу-профессиональных”. Я в последнее время пишу разные идеи по подходам в программировании, вот одна из них.
Я пишу на Delphi, и раньше у меня было много проблем из-за багов с утечкой памяти (когда я в коде создал объект или динамический массив, а потом забыл его освободить). Из-за этой проблемы утилита “Set point group” в моей программе иногда вылетала с ошибкой Out of memory. Теперь я решил эту проблему так: написал объект “сборщик мусора”, который запоминает все создаваемые программой классы и динамические массивы, и в конце работы подсчитывает, какие из них не были уничтожены, и выводит отчёт в текстовом файле. Выглядит код примерно так:
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# она не нужна, так как в них есть свой собственный сборщик мусора (но за это приходится платить скоростью работы программы).

chemigor
Сообщения: 704
Зарегистрирован: Вс июн 21, 2015 5:29 pm
Контактная информация:

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

Сообщение chemigor » Чт янв 10, 2019 6:25 pm

Vit Nhoc писал(а):
Чт янв 10, 2019 11:05 am
Как я понимаю, для C++ можно написать такую же штуку, а для более "продвинутых" языков вроде C# она не нужна, так как в них есть свой собственный сборщик мусора (но за это приходится платить скоростью работы программы).
так сами же на вопрос ответили. Да, действительно, если у программиста нет жесткого стержня, то он на С/С++ и схожих языках будет писать абы как, и софт долговременно и при большом числе строк будет глючным. Для таких "программеров" и придуман С#, и, как оказалось, современные программеры в большинстве своем только его и пользуют, ибо стержня-то нет :)

На эту же тему полуофф: попробуйте без такого внутреннего стержня написать что-нибудь большое и развесистое с использованием полного функционала на 14 или 17 стандарте С++, а потом отдать без документации другому программеру. Будет неописуемый опыт!

Аватара пользователя
Vit Nhoc
Сообщения: 1142
Зарегистрирован: Сб июн 06, 2015 12:28 pm

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

Сообщение Vit Nhoc » Сб янв 12, 2019 11:44 am

так сами же на вопрос ответили. Да, действительно, если у программиста нет жесткого стержня, то он на С/С++ и схожих языках будет писать абы как, и софт долговременно и при большом числе строк будет глючным. Для таких "программеров" и придуман С#, и, как оказалось, современные программеры в большинстве своем только его и пользуют, ибо стержня-то нет
А какие в C# есть ещё фичи для отлова багов, кроме сборщика мусора?

chemigor
Сообщения: 704
Зарегистрирован: Вс июн 21, 2015 5:29 pm
Контактная информация:

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

Сообщение chemigor » Сб янв 12, 2019 2:18 pm

Vit Nhoc писал(а):
Сб янв 12, 2019 11:44 am
А какие в C# есть ещё фичи для отлова багов, кроме сборщика мусора?
хз, не пользуюсь, но вижу кучу любителей оного. Также видел каким было неописуемое мучение моего знакомого, когда ему приспичило прикрутить сингулярное разложение в C#.

Sartorius84
Сообщения: 1157
Зарегистрирован: Ср фев 26, 2014 11:22 am

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

Сообщение Sartorius84 » Ср янв 16, 2019 5:35 pm

@Vit Nhoc, это не "сборщик мусора" :) Это что-то вроде профилировщика для поиска утечек, коих (профайлеров) готовых хватает https://stackoverflow.com/questions/416 ... -in-delphi.
Если вы для науки что-то пишете, я б посоветовал python взять: простой синтаксис, полно библиотек, большое активное сообщество в том числе и в науке. Посмотрите где Python и где Delphi - https://www.tiobe.com/tiobe-index/.

Аватара пользователя
Vit Nhoc
Сообщения: 1142
Зарегистрирован: Сб июн 06, 2015 12:28 pm

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

Сообщение Vit Nhoc » Чт янв 17, 2019 10:44 am

Sartorius84

Я считаю, что Delphi это очень хороший ЯП и среда разработки, который пал жертвой нерациональной моды (так сказать, фишеровское убегание в программировании).
Хотя я мало знаю про такие языки как Python. Он компилируемый или интерпретируемый? Если второе, естественно квантовохимический код на нём писать не будут.

Аватара пользователя
Гесс
Сообщения: 13062
Зарегистрирован: Ср фев 15, 2012 11:19 pm

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

Сообщение Гесс » Чт янв 17, 2019 11:21 am

https://ru.wikipedia.org/wiki/Python
Тип исполнения интерпретируемый, компилируемый в байт-код, компилируемый в MSIL, компилируемый в байт-код Java
На питоне пишут. На перле кстати тоже, правда на перле потом не читают :mrgreen:
На питоне написаны PySCF, QuTiP, GPAW, PyQuante, а в DFTB+ он используется для автотеста бинарников. Впрочем каждый :003: программирует как хочет.

Sartorius84
Сообщения: 1157
Зарегистрирован: Ср фев 26, 2014 11:22 am

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

Сообщение Sartorius84 » Чт янв 17, 2019 11:39 am

@Гесс, да, там байт-машина Но все рассчетно-числодробительные библиотеки python-а нативные как правило. Есть поддержка CUDA/OpenCl. OpenMM например имеет API на питоне, а в бэкенде CUDA/OpenCL. Gromacs с CUDA у меня под виндой завести не удалось, а OpenMM - пожалуйста. Потом есть Cython, PyPy,Numba или Psyco с JIT для питона. Да и узкие места своих поделок можно просто на C/FORTRAN прописывать.
Всегда есть смысл соблюдать баланс между скоростью разработки, чатабильностью и временем выполнения кода :). На преждевременную оптимизацию ( в том числе из-за ошибочного выбора инструментария ) можно бессмысленно потратить слишком много времени не получив стоящего результата.

Вот например Python+Numba дает такую же производительность как C+OpenMP : https://habr.com/en/post/336684/

Аватара пользователя
Vit Nhoc
Сообщения: 1142
Зарегистрирован: Сб июн 06, 2015 12:28 pm

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

Сообщение Vit Nhoc » Чт янв 17, 2019 12:39 pm

Мне всё-таки хочется чтобы мне рассказали, какие конкретно преимущества у "высокоуровневых" языков вроже питона или шарпа по сравнению с C++/Delphi. Про одно из них - сборщик мусора - я уже написал, как обойтись более простыми средствами.
Если в этих языках есть фичи, позволяющие делать меньша багов, я могу попробовать придумать программные альтернативы этим фичам в Delphi, или написать некую программу для эвристического анализа наличия багов. Также я думаю о том, чтобы написать программу, которая будет переписывать мой собственный Delphi-код (получится временный код, очень неудобный для отладки, зато более быстрый, и это будет полезно для финального выпуска программы).

Sartorius84
Сообщения: 1157
Зарегистрирован: Ср фев 26, 2014 11:22 am

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

Сообщение Sartorius84 » Чт янв 17, 2019 2:33 pm

@Vit Nhoc, может Вам просто Delphi .NET использовать? Там тот-же managed код, что и в C#.
По поводу течи памяти в нативном Delphi, есть смысл умные указатели попробовать: https://delphisorcery.blogspot.com/2015 ... elphi.html.
А среди преимуществ современных ЯВУ, которые позволяют уменьшить количество багов, я б слудующие отметил:
- Автоматическое управление памятью(GC, ARC и тд)
- Контроль типов во время выполнения
- Элементы функционального программирования (защита от побочных эффектов методов)
- Явная декларация генерируемых исключений (кроме Java в других не помню такого)

Аватара пользователя
Shorku
Сообщения: 1075
Зарегистрирован: Вт дек 13, 2011 2:17 pm

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

Сообщение Shorku » Чт янв 17, 2019 4:18 pm

Не путайте топик-стартера, не нужен ему питон =)
Make quantum chemistry, not war

Sartorius84
Сообщения: 1157
Зарегистрирован: Ср фев 26, 2014 11:22 am

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

Сообщение Sartorius84 » Чт янв 17, 2019 5:06 pm

Shorku писал(а):
Чт янв 17, 2019 4:18 pm
Не путайте топик-стартера, не нужен ему питон =)
Этого мы знать не можем :) А вдруг нужен? : :dontknow:

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8531
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

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

Сообщение ИСН » Сб янв 19, 2019 11:57 pm

Питон - зло!

Sartorius84
Сообщения: 1157
Зарегистрирован: Ср фев 26, 2014 11:22 am

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

Сообщение Sartorius84 » Вс янв 20, 2019 4:43 pm

ИСН писал(а):
Сб янв 19, 2019 11:57 pm
Питон - зло!
Молоток - зло! :down: Как-то я пытался закрутить гайку молотком. Потратил кучу времени, в итоге ничего не получилось, еще и по лбу себе попал. Кто еще пользуется этими молотками? :roll: Вот разводной ключ - это тема. :!:

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8531
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

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

Сообщение ИСН » Пн янв 21, 2019 12:11 am

Вот три простые вещи:
i++
range(1,10)
",".join(array)

Аватара пользователя
madschumacher
Сообщения: 883
Зарегистрирован: Ср авг 05, 2015 4:30 pm

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

Сообщение madschumacher » Пн янв 21, 2019 9:49 am

Shorku писал(а):
Чт янв 17, 2019 4:18 pm
Не путайте топик-стартера, не нужен ему питон =)
Ага, учитывая, что PyMOL уже есть.
ИСН писал(а):
Пн янв 21, 2019 12:11 am
Вот три простые вещи:
i++
range(1,10)
",".join(array)
Ой, к особенностям синтаксиса прикапываться -- это последнее дело (кст, почему в range Вы от 1, а не от 0 поставили, Python -- не Matlab). Да, у Python правила оформления кода не похожи на C/C++/Fortran-ные. Но от этого менее мощным он не становится. Простой и короткий синтаксис + мощные библиотеки позволяет за 15 минут писать то, на что в C/C++/Fortran уйдут дни работы.
Python -- мощный инструмент, но незнакомых с программированием, он быстро развращает и приучивает к легкому стилю написания кода. Имхо, это плохой язык для начинающих.

Кст, к списку Гесса. Ещё DFTBaby на Питоне написан.
Vit Nhoc писал(а):
Чт янв 17, 2019 10:44 am
Я считаю, что Delphi это очень хороший ЯП и среда разработки, который пал жертвой нерациональной моды (так сказать, фишеровское убегание в программировании).
Ну, учитывая, что нормальных компилляторов на *nix для Delphi нет, назвать хорошим языком его -- это сильно. Кст, стабильной работы Chemcraft на Linux я так и не наблюдал пока (хотя это в другой топик). А покупать нерабочий софт -- желания не возникает.

P.S. Сборщики мусора, сборщики мусора... Нет чтобы сразу код писать нормально, чтоб утечек не было... :roll:
И да узрел Охламон, что сие есть круть несусветная!

Аватара пользователя
Ольга Панфилова
Сообщения: 4
Зарегистрирован: Пн янв 21, 2019 10:32 am

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

Сообщение Ольга Панфилова » Пн янв 21, 2019 10:37 am

А как ответить на нужное сообщение?

Аватара пользователя
ИСН
Робин Гуд
Сообщения: 8531
Зарегистрирован: Пт окт 10, 2003 5:32 pm
Контактная информация:

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

Сообщение ИСН » Пн янв 21, 2019 10:50 am

Особенности синтаксиса my ass! Да к чему же ещё прикапываться, кроме этого? Мощный? Все языки одинаково мощны (Тьюринг-полны), в смысле что на всех можно написать всё. Синтаксис простой? У многих простой. Библиотек много? Да, но это у всех распространённых языков так. Разработка быстрее сишечной? Это у всех высокоуровневых языков так.

Aequilibris
Сообщения: 213
Зарегистрирован: Вт окт 16, 2018 9:12 pm
Контактная информация:

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

Сообщение Aequilibris » Пн янв 21, 2019 11:16 am

Я так и не понял, ИСН, - если речь не о сравнении с С/C++, то Вы синтаксис Perl-а рекламируете ?
Вот именно по причинам приведенным выше Вами же говорить о том, что какой-то язык - "зло" не особенно содержательно. У Python есть свои преимущества/недостатки. Он исповедует путь "doing things one way" и пытается максимально исключать ошибки разработчика в зародыше. Где зло ?

Аватара пользователя
Shorku
Сообщения: 1075
Зарегистрирован: Вт дек 13, 2011 2:17 pm

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

Сообщение Shorku » Пн янв 21, 2019 11:29 am

Aequilibris писал(а):
Пн янв 21, 2019 11:16 am
Он исповедует путь "doing things one way" и пытается максимально исключать ошибки разработчика в зародыше.
как минимум сто раз обсуждавшееся наличие map, filter и reduce при живых и более понятных list comprehensions. И в принципе одни и те же вещи можно писать очень по-разному. Вы, кажется, с чем-то путаете.
madschumacher писал(а):
Пн янв 21, 2019 9:49 am
Ага, учитывая, что PyMOL уже есть.
Бесплатный. У топикстартера же уже написанное платное приложение
Последний раз редактировалось Shorku Пн янв 21, 2019 11:36 am, всего редактировалось 1 раз.
Make quantum chemistry, not war

Ответить

Вернуться в «лицом к лицу»

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

Сейчас этот форум просматривают: Bing [Bot] и 28 гостей