?

Log in

No account? Create an account
Читая обсуждение http://ivan-gandhi.livejournal.com/3329246.html и… - Cyril Pertsev
September 13th, 2015
02:21 pm

[Link]

Previous Entry Share Next Entry

(91 comments | Leave a comment)

Comments
 
[User Picture]
From:rblaze
Date:September 14th, 2015 05:38 pm (UTC)
(Link)
А почему, кстати, у вас исключения не работают с DLL? С .so они отлично работают, даже если один модуль собран gcc, а другой clang. Это же стандартный ABI, ничего особенного.

Edited at 2015-09-14 05:39 pm (UTC)
[User Picture]
From:soonts
Date:September 14th, 2015 08:06 pm (UTC)
(Link)
>С .so они отлично работают, даже если один модуль собран gcc, а другой clang.
Короткий ответ — вам просто повезло.

>Это же стандартный ABI
By its nature, exception handling is very platform specific, and not surprisingly, different compilers use very different implementations. Some compilers use what is known as the Zero-Cost Strategy where exception records are kept in side tables. DWARF debugging information is then used to unwind the stack when an exception is thrown. The advantage here is that entering try/catch blocks are fast, but executing a throw is very slow. GCC and LLVM implement this strategy.

Microsoft’s compilers on the other hand use Structured Exception Handling (SEH) to implement C++ exceptions by managing a chain of EXCEPTION_REGISTRATION_RECORDs embedded on the stack and then calling the operating system RaiseException() function with “special” arguments. SEH is an operating system feature that Microsoft’s compilers use to implement C++ exception handing.

Given an executable compiled with GCC and a shared library compiled with MSVC, if the shared library were to throw a C++ exception that it did not handle, the different implementations would prevent it from working and the program would likely crash. This would happen even if the GCC compiled executable had the correct C++ exception handling to catch the exception.


Копипаста вот отсюда, почитайте — как видно, у C++ вообще практически нет стандартного ABI.
Кстати к исключениям ещё в полной мере относятся разделы той статьи “Object Layout” и “Memory Allocation”.
[User Picture]
From:rblaze
Date:September 14th, 2015 08:17 pm (UTC)
(Link)
ABI есть, вот даже документ имеется: https://mentorembedded.github.io/cxx-abi/. То, что MSVC в силу исторических и коммерческих причин ему не следует, это очень грустно, но что поделаешь, как говорят у красноглазиков, виндопроблемы.
[User Picture]
From:soonts
Date:September 14th, 2015 09:36 pm (UTC)
(Link)
>в силу исторических и коммерческих причин ему не следует, это очень грустно
А мне норм.
На венде не нужен этот стандарт. Уже многие десятилетия есть прекрасный ABI, который называется COM.

В отличие от того, что теоретически возможно со стандартным C++ ABI, COM позволяет использовать DLL из любого языка, из дот нета, из петона, и если приспичит, то можно даже из PHP. Там и многопоточность, и исключения, и ещё куча всего, и производительности хватает даже для очень performance critical штук (если оно in-process, конечно).

Если бы в красноглазом мире было нечто подобное, я уверен, что им бы тоже не упёрся этот C++ ABI.
А так у них выбора в общем-то не было, кроме как стандартизировать C++ ABI, и программировать на 30-летней давности C++.
[User Picture]
From:permea_kra
Date:September 14th, 2015 09:53 pm (UTC)
(Link)
>Уже многие десятилетия есть прекрасный ABI, который называется COM.
Это, гм, п-ц а не abi.

>Если бы в красноглазом мире было нечто подобное,
CORBA. Особой популярностью не пользуется.
[User Picture]
From:soonts
Date:September 14th, 2015 10:26 pm (UTC)
(Link)
>п-ц а не abi
Не умеете его готовить.

>CORBA
Это никакой не ABI.
CORBA это стандарт взаимодействия распределённых систем.
В случае in-process COM, используемого из C++, накладные расходы — единственный виртуальный вызов. Так работают Direct3D, Media Foundation, и другие очень требовательные к производительности штуки.
В случае CORBA вы anyway попадаете на сериализацию\десериализацию, что очевидно ставит крест на производительности.
[User Picture]
From:permea_kra
Date:September 16th, 2015 06:45 am (UTC)
(Link)
>Не умеете его готовить.
Что характерно, никогда не стремился. С п-цом дел стараюсь не иметь.

>Это никакой не ABI.
>CORBA это стандарт взаимодействия распределённых систем.

И то, и другое - стандарт доступа к (возможно, удаленному) менеджеру/хранилищу объектов. Разумеется, ни то, ни другое стандартов ABI не являются.

>В случае in-process COM, используемого из C++, накладные расходы — единственный виртуальный вызов. Так работают Direct3D,

Чё-чё-чё?
С каких это пор DirectX стал работать через виртуальные вызовы?
[User Picture]
From:soonts
Date:September 16th, 2015 07:23 am (UTC)
(Link)
>С п-цом дел стараюсь не иметь.
Прекрасная проверенная временем технология.
Очень удачная.
Например весь новый WinAPI (который Windows Runtime) целиком построен на COM-интерфейсах.

>И то, и другое - стандарт доступа к (возможно, удаленному) менеджеру/хранилищу объектов.
На самом высоком уровне абстракции да.
Однако COM включает в себя и ABI тоже, который с определёнными оговорками можно использовать отдельно от его более высокоуровневых фич.

>С каких это пор DirectX стал работать через виртуальные вызовы?
DirectX работает через виртуальные вызовы всю свою историю.
Он весь построен на COM интерфейсах, наследующих от IUnknown (ID3D11Device, IXAudio2, etc).
С точки зрения языка C++, COM интерфейс это pure abstract class c таблицей виртуальных методов, которые можно вызывать.
[User Picture]
From:permea_kra
Date:September 16th, 2015 08:54 am (UTC)
(Link)
>Например весь новый WinAPI (который Windows Runtime) целиком построен на COM-интерфейсах.

Ничего хорошего в этом нет, в общем-то. ООП головного мозга теперь совсем зохавает мир.

>DirectX работает через виртуальные вызовы всю свою историю.

Мда. Я-то помню времена, когда это был чисто сишный АПИ, без всякого COM на поверхности. А тут вы рассказываете про ком.

Все-таки не зря винду считают гнилой платформой того же уровня, что и кофемолки.
[User Picture]
From:soonts
Date:September 16th, 2015 11:01 am (UTC)
(Link)
>ООП головного мозга теперь совсем зохавает мир
Ничего лучше человечество не придумало.
Интерфейс всех современных ОС задизайнен в ООП стиле, даже если он на чистом C с хэндлами, как в Win32 или линупсе.

>Я-то помню времена, когда это был чисто сишный АПИ, без всякого COM на поверхности
У вас значит с памятью что-то. Вот например статья эпохи DirectX 5, из текста которой видно, что COM на поверхности был ещё в DirectX 3:
https://www.microsoft.com/msj/0298/primitive.aspx
[User Picture]
From:permea_kra
Date:September 16th, 2015 11:49 am (UTC)
(Link)
>Интерфейс всех современных ОС задизайнен в ООП стиле, даже если он на чистом C с хэндлами, как в Win32 или линупсе.


Эээ, ненене. ООП там нет. Объекты - есть, ООП точно нет. И слава богу.


>У вас значит с памятью что-то.

*внимательно поглядел матчасть* Действительно. Ну, от майкрософта ничего хорошего ждать и не следовало...
[User Picture]
From:soonts
Date:September 16th, 2015 12:30 pm (UTC)
(Link)
>Объекты - есть, ООП точно нет
Взаимоисключающие параграфы детектед.

>от майкрософта ничего хорошего ждать и не следовало
Тем не менее «ничего хороший» Direct3D почему-то выиграл в конкурентной борьбе у OpenGL:
http://programmers.stackexchange.com/a/88055/25371
[User Picture]
From:permea_kra
Date:September 16th, 2015 02:32 pm (UTC)
(Link)
>Взаимоисключающие параграфы детектед.

Безграмотность детектед.

>Тем не менее «ничего хороший» Direct3D почему-то выиграл в конкурентной борьбе у OpenGL:

Ничего там не выиграно, даже в играх. Афаик ключевые движки (id tech, unreal engine) opengl как минимум поддерживают если на нем не живут.

На мобильном рынке (андроид, ios) directX малозаметен.
[User Picture]
From:soonts
Date:September 17th, 2015 03:40 am (UTC)
(Link)
Хорошо, объясню подробнее.
Первая строчка из википедии:
Object-oriented programming (OOP) is a programming paradigm based on the concept of "objects"
Если вы на чём-то программируете и у вас там есть какие угодно объекты, поздравляю, у вас есть ООП. Все остальные фичи ООП вроде композиции, полиморфизма и ключевого слова class в языке — опциональны.
Поэтому ваше утверждение «Объекты - есть, ООП точно нет» таки взаимоисключающие параграфы.

>ключевые движки (id tech, unreal engine) opengl как минимум поддерживают
Поддерживают на OSX и playstation.
На венде почти 100% современных игр (кроме казуальных вроде майнкрафта и angry birds, которым не нужна производительность) рендерят при помощи Direct3D.
[User Picture]
From:permea_kra
Date:September 17th, 2015 03:58 am (UTC)
(Link)
Ну я ж говорю - безграмотность детектед.

Есть объектное, объектно-ориентированное и прототипное программирование (и языки, их поддерживающие). Во всех трех есть объекты, но парадигмы принципиально разные. Объектное базируется на объектах и сообщениях, объектно-ориентированное - на объектах, интерфейсах и наследовании, прототипное - на объектах и расширении существующих объектов. Примеры языков - smalltalk, java, ecmascript соотвтвенно.

И нет, не надо мне пытаться объяснить, что объектная и прототипные парадикгмы - подвариант объектно-ориентированной. Это не так.


>На венде почти 100% современных игр (кроме казуальных вроде майнкрафта и angry birds, которым не нужна производительность) рендерят при помощи Direct3D.

id Tech 6 is an upcoming OpenGL based game engine under preliminary development by id Software, which will tentatively follow id Tech 5.[1]

id Tech 5 [...] the demo used only a single core with single-threaded OpenGL implementation [...].

Кармак как сидел на opengl, так и сидит (правда, юзает directX для неграфических нужд)
My Website Powered by LiveJournal.com