Здравствуйте! Я до недавнего времени полагал, что знание ассемблера хотя бы для одной платформы является в некотором смысле достаточным для того, чтобы заниматься созданием привязок. Отчасти это было так потому что в Windows, стереотипами которой я по–прежнему оцениваю разработку в других OS, это получается верным. Я упускаю такой важный момент, как исключительные ситуации, которые в Windows просто работает, а вот в Linux, BSD, Solaris — нет. В Mac OS X не знаю. В Windows, если произошло что–то, что должен обработать рантайм языка программирования, благодаря общему для всех стандарту SEH, обработка случится там, где надо, почти само собой. И исключения воспринимаются чем–то органично прикрученным к машинному коду. Лови их на границе вызовов — и остаётся только поддерживать стабильный ABI всего остального. А вот под Linux, если взять динамические библиотеки, собранные разными версиями GNAT, то для их нормальной работы недостаточно везде применять соглашение C, и недостаточно сделать барьер исключений, который бы перехватывал исключения и преобразовывал в код ошибки или другой определённый на уровне ABI способ передавать ошибки. Как я понимаю, кроме этого для полной корректности ещё понадобится переключать обработчики сигналов. Странно, но я не помню, чтобы в привязках делалось что–то подобное. С уважением, Левашев Иван -- If you want to get to the top, you have to start at the bottom
07.09.2014 20:31, Иван Левашев octagram@... [ada ru] пишет: > если взять динамические библиотеки, собранные разными > версиями GNAT, то для их нормальной работы недостаточно [дальше по тексту] Смешивания библиотек, построенными разными версиями компиляторов не применяется даже в С++: https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html Some features in the C++ language make versioning especially difficult. In particular, compiler generated constructs such as implicit instantiations for templates, typeinfo information, and virtual tables all may cause ABI leakage across shared library boundaries. Because of this, mixing C++ ABIs is not recommended at this time. Что касается GNAT, я сомневаюсь, что кто-то даст гарантию, что два рантайма (от двух разных версий GNAT) уживутся в рамках одного процесса без последствий. Даже под Windows. Надеюсь, я правильно понял вопрос :) -- Maxim Reznik Слава Украине!
08.09.2014 17:45, Maxim Reznik reznikmm@... [ada_ru] пишет: > > Надеюсь, я правильно понял вопрос :) > Нет, неправильно. Предполагается применять бинарно–стабильный API (также известный как C API, хотя ни одна из сторон может не быть на C), и никаких там шаблонов или RAII в компиляторо–специфичном виде наблюдаться не должно. Предположим, что мы работаем на платформе VirtualBox XPCOM, один компонент на FreePascal, другой — на Ada. Хоть деление на 0, хоть разъименование NULL должны приводить к исключению такого формата, который данный участок кода в состоянии понять. У меня в уме SOM, но там то же самое, есть регламентированные способы просигналить об ошибке, но системные исключения в число этих способов не входят. С уважением, Левашев Иван -- If you want to get to the top, you have to start at the bottom
С этой точки зрения в Linux все чисто. Генерация и обработка исключений определяется в ABI, см. например System V Application Binary Interface AMD64 Architecture Processor Supplemen http://www.x86-64.org/documentation/abi.pdf GNAT, C++ и пр. следуют этим соглашениям, никаких обработчиков переключать не нужно.
Здравствуйте! 22.09.2014 16:16, Maxim Reznik reznikmm@... [ada_ru] пишет: > > GNAT, C++ и пр. следуют этим соглашениям, никаких обработчиков переключать не нужно. > Ну, вопрос широкий. Вот код, работающий под Wine, мне кажется, может не следовать, хотя Wine может как–то помечать всю память, выделенную средствами WinAPI каким–то образом, совместимым с нативными GNAT, C++. Надо будет, как будет время, провести эксперименты. -- If you want to get to the top, you have to start at the bottom
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти