2009-06-06 5 views
9

Byłem zakochany w programowaniu opartym na komponentach (czy to z COM, innym systemem, czy po prostu używając paradygmatu w prostym C++). To wymaga trochę przyzwyczajenia się, jeśli jest się zwykle przyzwyczajonym do "tradycyjnego" modelu OOP, ale zdecydowanie warto. Dzięki temu mój kod jest łatwiejszy w utrzymaniu i łatwiejszy w rozbudowie.Wieloplatformowa alternatywa dla COM

Projekt, nad którym obecnie pracuję, korzysta z paradygmatu, ale nie ma ustawionego systemu. Jednak naprawdę chciałbym znaleźć jakiś system, którego mógłbym użyć z następującymi wymaganiami. Przejście z tego, co mam teraz do nowego systemu, zajęłoby trochę czasu, ale później zaoszczędziłbym wielokrotność tego czasu.

Wymagania:

  1. Cross-platform
  2. Szybka
  3. dobrze współpracuje z C++
  4. Obsługuje Krzyż proces marshalling

Pozwól mi rozwinąć te wymogi:

Wieloplatformowe

Zasadniczo potrzebuję go do pracy na systemach Windows i Mac. Linux byłby miły, ale nie jest w żaden sposób niezbędny. Poza tym naprawdę musi spełniać inne wymagania dla wszystkich platform. Jest COM dla Maca, który byłby idealny, ale nie obsługuje wymagania 4. Dodatkowo musi obsługiwać zarówno GCC, jak i MSVC.

Szybka

To gdzie CORBA niestety traci, mimo że spełnia trzy inne wymagania. Wywołania metod w procesie muszą być tak szybkie, jak to możliwe (najlepiej, jak COM), ponieważ niektóre z procedur mogą być również wywoływane z przerwania audio.

Działa dobrze z C++

... Chyba ten jest w większości oczywiste. Nie mam nic przeciwko temu, aby nie używać klas C++ do implementowania komponentów, ale z pewnością byłaby pomocna, a alternatywa musi być nadal łatwa w użyciu, szczególnie, że ostatecznie zamierzam udostępnić interfejs API dla rozszerzeń zewnętrznych.

Obsługuje Krzyż proces rozrządowych

Mam tu na myśli przynajmniej mogąc szeregować połączenia. Jeśli odbywa się to za pomocą kodu wygenerowanego z IDL, to jest to dla mnie całkowicie w porządku, a także nie mam nic przeciwko implementacji komunikacji między procesami.

COM byłby świetny, ale nie spełnia wymagań 1 w pełni. CORBA również byłaby świetna, ale nie spełnia wymagań 2 (nawet przy najszybszym ORB). XPCOM może nie spełniać wymagań 2 i nie działa z MSVC, więc nie spełnia wymagań 1.

Wszelkie pomysły, co jeszcze tam jest? Moim następnym krokiem byłoby przetasowanie własnego przy pomocy protobufów lub czegoś podobnego, ale oczywiście chciałbym tego uniknąć.

Aktualizacja

Aby opracować - przerwanie dźwięku w tym kontekście może być tak niskie, jak 2-3ms. Ten czas nie jest nawet w pełni dostępny dla mnie, ponieważ inne komponenty muszą być przetwarzane w tym czasie, a moje oprogramowanie samo owija inny program, który musi zostać przetworzony w tym czasie. Dlatego zarówno procesowe, jak i międzysektorowe procesy muszą być niezwykle szybkie.

+0

XPCOM powinien współpracować z MSVC, AFAIK. Ponadto, jeśli nie, nie możesz po prostu użyć MinGW? – Zifre

+0

Mogę używać MinGW, ale dla jednego, mój cały toolchain jest zintegrowany z MSVC, a jednocześnie mogę zintegrować MinGW do tego również, nie mogę użyć wspaniałego debuggera w MSVC. – arke

+0

Myślę, że jeśli to zbudujesz, zarobisz dużo pieniędzy. W procesie, poza procesem, PC, Mac, Linux, płonący szybko. Dużo pieniędzy. :) –

Odpowiedz

2

CORBA z pewnością będzie odpowiedzią - powinieneś przetestować go, zanim odrzucisz go na podstawie prędkości.

Zdecydowana alternatywą byłoby XPCOM http://en.wikipedia.org/wiki/XPCOM - brak MSVC nie znaczy, nie krzyż platformy.

Powodzenia

+1

Czy możesz polecić wdrożenie ORB? Próbowałem znaleźć stronę porównującą różne ORB w oparciu o szybkość, aby sprawdzić, czy jest wystarczająco szybki, ale nie miałem z tym szczęścia. – arke

+1

Naprawdę nie chcesz używać CORBA, jeśli możesz tego uniknąć - zaufaj mi. –

+1

TAO, "Kula ACE" http://www.cs.wustl.edu/~schmidt/TAO.html jest jedną z bardzo szanowanych implementacji. – sdg

3

Dla maksymalnej szerokości, ja po prostu korzystać z usług internetowych. Podejście zorientowane na usługi jest bardzo zbliżone do podejścia zorientowanego na komponenty, ponieważ ujawniane są tylko umowy o świadczenie usług (interfejsy), a klienci nie znają szczegółów wewnętrznych aspektów usługi.

+0

Jego wymagania dotyczące wydajności prawdopodobnie wykluczają to jako opcję (chociaż zgadzam się, każda usługa bazująca na HTTP jest dobrym początkiem). – Tom

+1

Rzeczywiście, chociaż brzmi to w zasadzie dobrze, wymóg uruchomienia tego w przerwaniu audio niestety nie czyni tego możliwym, niestety. – arke

+0

Nie widziałem wymagania dotyczącego przerwania. Zaskoczony, słysząc, że istnieje implementacja COM, która poradzi sobie z tym. –

0

Spójrz na AF Architecture:

. „Af-Arch to kompletny zestaw bibliotek i narzędzi, które pozwala na opracowanie systemu distribuited specjalnie zaprojektowany, aby stawić czoła problemom o aplikacjach firmy rodzinnej”

Wiem, że działa z linuxem i oknami. Wiem też, że ma bardzo szybkie C API i C# dla tego wiązania.

+0

Wyglądało to na początku atrakcyjnie, ale to nieco mnie zniechęciło: "Model programowania Af-Arch opiera się na systemie klient-serwer TCP w wymianie komunikatów w formacie XML na szczycie protokołu BEEP Core. ". Obawiam się, że to nie spełni moich wymagań dotyczących prędkości. : / – arke

1

Dlaczego uważasz, że CORBA nie jest wystarczająco szybki? Czy ostatnio mierzyłeś rzeczy?

Nowoczesne implementacje CORBA mogą wykonywać połączenia zdalne w mniej niż 150 usecs. Poniżej twojego budżetu na 2 milisekundy. Nowoczesne implementacje CORBA mogą zoptymalizować wywołania wewnątrz procesowe do dwóch wirtualnych wywołań funkcji, chociaż zazwyczaj wymaga to rezygnacji z niektórych funkcji (np. Przechwytujących). Nawet w pełni wykorzystany w najgorszym przypadku lokalne połączenia telefoniczne to kilka wyszukiwań + niektóre połączenia wirtualne, nie mam numerów pod ręką, ale jestem pewien, że jest poniżej 50 usecs.

Sprawdź to dla niektórych numerów wydajności:

http://www.dre.vanderbilt.edu/Stats/performance.shtml

1

Mówisz CORBA byłoby świetnie. Mogę tylko założyć, że nigdy z niego nie korzystałeś. To sprogramowanie nightmnare i nie oferuje przenośności, którą twierdzi. Używałbym go tylko wtedy, gdy istniejąca aplikacja już go zaimplementowała. Jednak nie wyrzuciłbym go na podstawie wydajności - nigdy nie doświadczyłem żadnych problemów z wydajnością w żadnej z zastosowanych przez CORBĘ implementacji.

3

ICE od ZeroC http://www.zeroc.com/ to kolejna alternatywa.

Michi Henning była dla grona tych, którzy zajmowali się dawnymi czasami, jednym z guru dnia. Jest teraz z ZeroC. Jest to open-source, między platformami, w tym wszystkie twoje cele (w tym Linux), system.

C++ jest tylko jednym z języków, i lód w C++ Wiązania są znacznie lepsze niż CORBA C++ powiązania są.

1

Spójrz na D-Bus (tak, dla windows too), który jest współczesnym duchowym spadkobiercą różnych frameworków komponentów (CORBA, Gnome Bonobo, DCOM KDE).

Jeśli przekierowanie między procesami okazuje się być problemem z wydajnością, należy przejrzeć przenoszenie ciężkich ładunków do pamięci współdzielonej (boost.interprocess pomoże to w utrzymaniu wieloplatformowości).

0

Myślę, że powinieneś rzucić okiem na VortexLibrary.

Jest to kompletna implementacja BEEP, która stanowi dobrą podstawę do opracowania dowolnego protokołu aplikacji peer to peer. To już integruje uwierzytelnianie (używając SASL) i bezpieczne połączenia (przy użyciu TLS), oba opcje.

Vortex zawiera również implementację profilu XML-RPC z kompilatorem IDL, który powinien zapewnić wystarczającą podstawę do porządkowania rzeczy ... a najlepsze jest to, że można później dostarczyć bardziej szczegółowy protokół, w górnej części tej samej sesji, aby wykonać transfer binarny bez ograniczenia przez XML-RPC.

Programuje się za pomocą C, ale działa również z C++. Obecnie jest uruchomiony, z testami regresyjnymi zapewniającymi jego działanie pod Linuxem, Windows i MAC.

Pozdrawiam!

2

Czy Qt nie powinno być alternatywą?

http://qt.io

AFAIKT można go używać na co najmniej: systemu Windows | Mac | Linux/X11 | Solaris | Embedded Linux | Windows Embedded | Oprogramowanie Green Hills INTEGRITY | QNX | VxWorks

To dość dużo IMHO.