← All posts tagged com

lovesan

Такое написал: github.com

Вобщем, библиотечка, основанная на DirectShow, которая позволяет проигрывать аудио. В т.ч. не только из файлов, а скажем и по http.

Библиотечка имеет COM-интерфейс, соответственно, ее можно использовать из разных языков — включены, в частности, CLI-интерфейс на чистом Си, интерфейсы для .NET и для Common Lisp.

love5an.livejournal.com

lovesan

Если опять же продолжать тему того, какие бывают ссаные и дерьмовые языки программирования.

Вот C++

Блять, C++ можно использовать чтобы векторы-матрицы на стеке перемножать(хотя и то, тут лучше на GPGPU что-нибудь). А вот блять для чего-то большего — это получается пиздец.

Вот например, все знают, есть таки штуки как коллбэки, анонимные функции и замыкания. Ну, где-то есть, а в C++ нету. Потому что язык говно и автоматизированного управления памятью в нем нет. И пиздец, полный пиздец выходит, когда надо писать что-то, связанное с концепцией "событий", ну и вообще, асинхронного оповещения чего-либо о чем-либо.
Полный, блять, пиздец.

Самую лучшую вариацию на тему обработки этого острого угла в C++, я видел в COM(Ага, в COM, не в Qt — в Qt совсем говно сраное). Там есть такой концепт как Outgoing interfaces. Это когда мы реализуем какой-то интерфейс, и поставляем указатель на реализацию этого интерфейса нашим объектом какому-нибудь другому объекту, который будет дергать методы нашего интерфейса, типа, когда возникнут какие-либо события.

Но, мало того что вместо одного, блять, ссаного замыкания, мы городим реализацию outgoing COM-интерфейса, так рантайм COM требует вдобавок реализовать кучу сраных обвесок на тему аггрегации и управления памятью(в основном для обхода циклических ссылок — потому что подсчет ссылок, на котором основано управление временем жизни объектов в COM, с ними понятное дело, не справляется) и самому объекту "с событиями", и нам. Короче, пиздец, ад и содомия.

А вообще, когда у меня дело доходит до "событий" в C++, я стараюсь пользоваться старыми добрыми виндовыми очередями сообщений(кстати, обработка событий в DirectShow много где основана именно на них, а не на исходящих интерфейсах, что интересно).

Ну типа, LRESULT CALLBACK HandleMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) ... }

Гораздо проще и приятнее, чем городить нормальную ОО-архитектуру на C++(последнее все-равно ведь не выйдет, как ни старайся).

lovesan

Рационализация моей работы с COM. Необходимая, наверное, вещь, раз тут один долбоеб уже заикнулся об этом.

Да, может OLE и протухло. Может, на чистом COM/OLE уже никто не пишет.
Но, чуваки, без интерфейса к COM на винде делать вообще нехуй. Совершенно.
Десктопные приложения, игрушки, или даже сервисы, без COM/OLE на винде не написать.

Любой язык, платформа или рантайм, который не принимает в расчет COM, у которого нет качественного интерфейса к этому — на винде нежизнеспособен и является как максимум академической игрушкой, а обычно же — студенческой поделкой.

lovesan

Полтора месяца я ебался с кривым Clozure CL, который поддерживает метаобъектный протокол CLOS через задницу, и то кое-как.

Но, я таки его одолел, и по этому случаю закоммитил в Doors: github.com
Теперь на CCL тоже можно писать COM-компоненты, и дергать COM-интерфейсы и даже целые COM-классы.
Еще я тестировал на clisp и SBCL, там тоже все хорошо работает.

Пример тут, например: github.com
Ясно видна сила MOP — класс hello-world-object является инстансом класса factory-class, а последний является инстансом и одновременно наследником com-class. А все три метаобъекта классов, и все их экземпляры, являются инстансами com-object.
com-обжекты можно дичайше круто передавать в чужой код, и чужой код, на каком-нибудь C++ или C#, будет дергать через виртуальные функции интерфейсов родные лисповые обобщенные фунцкции, которые мы писали на лиспе.

Метаклассы это вообще круто, они дичайше абстрагируют и очень сильно помогают писать меньше кода.