wizzard: (Default)
[personal profile] wizzard

binary versions of win-psycopg2 are built against latest DEBUG version of MSVCRT that ships ONLY with VS2005 SP1 ATL Security Update 2

and they don’t have sources readily buildable on Windows, either – only the Linux ones :\

Date: 2009-09-10 06:01 am (UTC)
From: [identity profile] kunaifusu.livejournal.com
При статической линковке остаются только используемые функции, я сильно сомневаюсь, что у Миранды каждый плагин использует все функции CRT. Проблем с динамической линковкой куча, со статической - только религиозные. Но если религия не позволяет статически линковать функции, то тогда по той же религии нельзя использовать темплейтные библиотеки вроде stl или boost.

Date: 2009-09-10 05:11 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
Вы недальновидно предлагаете ради выигрыша в полмегабайта (именно столько занимает запакованная последняя CRT, распакованная - 1.4 метра) пожертвовать переносимостью и положиться на undefined behaviour.

Проблемы со статической компоновкой именно CRT заключаются в том, что:

- она (CRT) реализует кучу
- она реализует исключения

Как именно она делает - стандарт не оговаривает. Скажем, она может использовать GetProcessHeap(), HeapCreate() или же реализовать кучу самостоятельно.

И вот если CRT реализовывает кучу скажем, через CreateHeap(), то ей нужно этот хендл где-то хранить, и он понятно у каждого инстанса CRT получается разный. И в результате память, выделенная malloc() в одной длл, невозможно _переносимо_ освободить в другой ДЛЛ.

То же самое и с бросанием исключений через границы DLL, и так далее.

Шаблонные библиотеки либо написаны так, чтобы не использовать глобальные данные, либо полагаются на наличие лишь одной копии этих глобальных данных путём всё того же механизма DLL. Та же STL полагается для этого на свою DLL. А то что функции в нескольких копиях (чего не избежать при специализации шаблона, используемого внутри ДЛЛ) - так это не страшно, код не меняется в ходе выполнения и поэтому все инстансы одинаковые и проблем нет.

Вот поменяет завтра майкрософт что-нибудь в undefined behaviour, и софт, на это полагающийся, поломается.

Скажем, сделают в системе новый файловый АПИ, и получится что fopen и fread внутри для ускорения будут использовать некие глобальные таблицы - и всё, нельзя будет и FILE * передавать между ДЛЛ.

И крики начнутся - дескать, какая Майкрософт плохая, ломает на ровном месте такие незыблемые вещи, как CRT.

Прецеденты уже есть - возьмите ту же безопасность. Система с самого начала (NT 3) была формально многопользовательской с разделением доступа, а де факто - однопользовательской с одним суперпользователем. Так понаписали же софта, пишущего куда не попадя, по принципу "работает ну и хуй с ним - зачем нам читать какие-то религиозные бумажки о том где хранить настройки и пользовательские данные".

А потом бац - развился интернет, а в месте с ним и черви, и сразу же необходимость работы под нерутом. А хуй там - проклятые вендоры понаписывали софта, который упорно и в 2009 году продолжает считать, что в системе ровно один пользователь, притом с административными привилегиями - тот, под которым ставился софт. И снова начались крики о том, какой майкрософт плохой - сделал нам UAC, чтобы софт, написанный через зад, меньше вредил грамотно написанному софту.

Причем у этих писателей говнософта, ругающих Майкрософт, двойные стандарты - я уже вижу аргументы, что дескать система была плохой. Так сами же эти критики пишут сознательно на работе пишут из рук вон плохой софт, признают это. А на вопрос "вы делаете плохой софт, почему ты не уйдешь в другое место, чтобы не участвовать в этом?" отвечают "не бывает оптимальных решений сложных задач" и пускают другие подобные отмазки. И при этом требуют чтобы майкрософт играл по другим правилам.

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

Date: 2009-09-10 06:29 pm (UTC)
From: [identity profile] kunaifusu.livejournal.com
Не путайте undefined behavior, который есть свойство языка и глюки API. Передавать память выделеную в одной DLL для освобождения в другой - просто идиотский стиль. Это никогда не будет переносимо и кто так делает - сам себе злобный баклан.

Date: 2009-09-10 07:26 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
Почему это "никогда не будет переносимо"? Религия не позволяет? Это официально поддерживаемый сценарий - как раз путем динамической компоновки с одной копией CRT. Вдобавок не только память - но и другие объекты, пример с FILE* я ж не случайно привел.

Использование многих копий CRT требует особой осторожности при построении межмодульных интерфейсов, накладывает дополнительные ограничения на ровном месте.

Понятно, что для того, чтобы оправдать передачу memory ownership между модулями, нужны веские причины. Но если проект такой, что передавать ownership проще, чем не передавать - то желание экономить 500 кбайт на одной из поддерживаемых ОС не должно вставлять палки в колеса и ухудшать дизайн.

Передача ownership используется довольно часто - в интерфейсе zlib, скажем, есть функции zalloc и zfree, специально для того, чтобы избежать проблем с разными кучами. Кроме того, есть функции gzopen, которые принимают хендлы, возвращаемые CRT. Т.е. библиотека построена с расчетом на то, что c одной стороны, могут использоваться несколько копий CRT с разными кучами, а с другой стороны, что все вызовы open во всех копиях CRT не используют глобальных данных.

Если, скажем, делать библиотеку абсолютно портабельной, то надо либо делать и вызовы zopen, zsocket и т д, либо ограничивать способы использования CRT клиентами. В случае zlib оказалось лучше сделать так, как сделали, а в случае, когда все модули пишутся одним вендором, отказ от статической компоновки упростит дизайн и соответственно, сократит себестоимость разработки.

Грубо говоря, если в нашем приложении 150 вариантов zlib, то не надо будет копипейстить 150 функций zalloc/zfree или придумывать хитрые способы обойти проблему без копипейста.

Date: 2009-09-10 07:47 pm (UTC)
From: [identity profile] kunaifusu.livejournal.com
Почему это "никогда не будет переносимо"?
Потому, что стандарт языка ничего не знает о DLL и прочих системных заморочках. Вы с таким же успехом можете создать процесс и передавать ему адреса памяти через пайп - где-то это может и будет работать и, может быть, кто-то будет считать это "официальным поддерживаемым сценарием", но переносимым это никогда не будет.

Profile

wizzard: (Default)
wizzard

January 2019

S M T W T F S
  12 345
6789101112
1314 1516171819
202122 23242526
2728293031  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 07:23 pm
Powered by Dreamwidth Studios