Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako napraviti program koji ce biti prosiriv ?

[es] :: Art of Programming :: Kako napraviti program koji ce biti prosiriv ?
(TOP topic, by X Files)
Strane: 1 2

[ Pregleda: 14007 | Odgovora: 34 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.static.sbb.rs.



+395 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?04.09.2012. u 14:20 - pre 140 meseci
Citat:

Hehe, da, krajnji korisnik onda raspali debugger i ulovi bug i kaze "da, nije aplikacija kriva vec plugin" Sve i da izbacis zadnje dodati plugin to ipak ne znaci da je plugin lose uradjen, mozda je aplikacija lose uredjena i ima unhandled ponasanje u odnosu na plugin.

Ko je to rekao ? Svaki plug-in treba da ima svoj opis (verzija i autor ) ako se radi o 3rd party developerima, i zna se kako to treba da izgleda i kakav test i kontrolu prolaze
Evo ti primer : http://www.mozilla.org/en-US/plugincheck/ pa hoce nestabilnu ili sumnjivu verziju ili plug in samo izvol'te mi ne odgovaramo.
Ako plug-in razvija samo autor onda nema ni potrebe za tim .


Citat:

Slazem se, ali svet je pun svacega. Plugin arhitektura ima malo smisla ako sve pluginove pise autor aplikacije, cemu smaranje onda. A ako ce eksterne sile da pisu pluginove onda moras da racunas na gomilu problema koje doticni mogu da izazovu, bilo da ti vrate pointer na interne strukure, bilo da ti preje*u tvoj buffer i obrisu pola data segmenta. Plugin arhitektura je najnezahvalnija od svih.

Nista onda , lepo pisi mejl Mozzili i objasni im da treba da predju na nesto drugo...


Citat:

Da vam odgovorim obojci odjednom, to je sve bila problematika 90ih zbog koje je napravljen COM/DCOM, typelibs i COM type safety

I sta hoces da kazes sa ovim ? Da smo zaostali u vremenu i prostoru i da je .NET lek za sve to

Viva lollapalooza
 
Odgovor na temu

Chobicus
Pancevo

Član broj: 28286
Poruke: 135
77.247.200.*

ICQ: 31049018


+12 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?04.09.2012. u 14:26 - pre 140 meseci
Citat:
2paca.zwaka:
Interesuje me kako da napravim program koji ce moci da se prosiri nekim plugin-ovima (npr. Eclipse IDE, neke verzije Visual Studia i mnogo drugih programa...)
Radio sam dosta stvari, ali posto sada planiram razviti Open source aplikaciju za Linux i Windows (Qt ili Gtkmm sa raznim bibliotekama) zanima me kako se postize ovakva funkcionalnost.

Hvala :)


Eclipse je zasnovan na OSGI platformi. Deluje da je to ono što tražiš.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?04.09.2012. u 14:26 - pre 140 meseci
mmix

Ne kažem da ne postoje i takva rešenja (koja te ne spasavaju od *((int*)0)=5;), ali postoje i druga (koja rešavaju i taj problem).

Napišeš glavni program koji ne učitava nikakve plaginove i PluginManager kao zaseban program koji učitava jedan plagin koji se prosledi kao parametar komandne linije (putanja do dll-a). Glavni program nađe šta sve ima u plugin folderu i za svaki dll pokrene po jedan primerak PluginManager-a kao svoje dete sa kojim komunicira po roditelj/dete arhitekturi (dakle, ne prenose se nikakve strukture i pokazivači). Roditelj se povremeno javlja svoj svojoj deci da je živ. Svako od dece se gasi kada primeti da se roditelj ne javlja (to garantuje PluginManager). Isto tako, deca se povremeno javljaju roditelju da su živa, tako da roditelj kada primeti da se neko dete ne javlja prijavljuje korisniku koji plagin je pukao.

E, onda pucanje jednog plagina ne ruši ništa drugo i tačno se zna ko je zveknuo, tako da će i nestručnom korisniku biti jasno koga da okrivi.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.dynamic.sbb.rs.



+7 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?04.09.2012. u 23:05 - pre 140 meseci
kkedacic je pitao za c jezik. Zato mu nisam pisao o klasama itd.
U principu na windowsima koliko znam dinamicka biblioteka se samo jednom ucitava u adresni prostor procesa. Svaki sledeci poziv LoadLibrary vratice adresu prvog (i jedinog) ucitanog primerka biblioteke i inkrementirace brojac za FreeLibrary.
Tom logikom i adrese funkcija ostaju iste sve dok je biblioteka ucitana.
Problem kad hocemo vise instanci.
Qt npr. ima PluginLoader klasu za ucitavanje, Pluginovi moraju da se implemetiraju po odredjenom sablonu. Svaki je u sustini interface klasa koja se interno implementira u biblioteci. Program zna samo za taj eksportovani interfejs.
Jednom mi je trebalo za potrebe programa da se ucitavaju vise instanci istog plugina i da se to uredno evidentira i dealocira.
Posto je morala da se ispostuje Qt arhtektura napravio sam metod u toj interfejs klasi koji pravi novu instancu te klase.(klase koja je nasledjuje pa kastujem u interfejs)
Tako da kad loader ucita pluginove dobijem jednu instancu od svakog plugina a sve ostale sam pravio sa tom prvom instancom ...
Znaci plugin je bio klasa u biblioteci a ne cela biblioteka.
Ne znam kako bi ovo sve moglo da se napravi u c. Mi u c++ mozemo da odvojimo objekat u klasu , svaka ima svoje promenljive itd ...
A vise instanci iste biblioteke ne mogu da se ucitaju
Isto opet ne znam ni kako to sve radi na Linuxu i dali uopste postoji neko opste resenje u c jeziku osim da imitira ovo strukturama itd.
Mozda neko zna kako je reseno u FireFoxu
 
Odgovor na temu

tosa
上海, 中国

Član broj: 1811
Poruke: 1342
118.131.136.*

ICQ: 14293955
Sajt: https://github.com/milost..


+48 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?05.09.2012. u 01:02 - pre 140 meseci
Nema razlike izmedju C i C++, samo sto C++ sakriva sta se zapravo desava:
Code:

typedef struct bla {
   void (*nekafunkcija)(int nekiargument);
} nekiplugin;

Pa onda svaki DLL ima nesto tipa:
Code:

nekiplugin* createPluginInstance();

 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.dynamic.sbb.rs.



+7 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?05.09.2012. u 11:19 - pre 140 meseci
Da u c to moze da se resi strukturama.
I ono sto bi bili clanovi klase ovde trebaju da budu clanovi strukture da bi instance imale smisla ...
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.adsl.net.t-com.hr.



+7169 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?05.09.2012. u 20:36 - pre 140 meseci
Najbolji nacin za plug-in mehanizam je koriscenje COM-a ili COM-olikog programianja.

Dakle, nikakva razmena C++ klasa ili C-style "hendlova" (kroz dllexport-e) vec iskljucivo virtuelnih interfejsa. Memorijski menadzment resen kroz reference-counting (AddRef/Release) i "pametne" pointere.

Mucna stvar je sto se mora raspisati dosta koda "peske" - pogotovu ako pravite neki SDK za javnu upotrebu, posto umesto koriscenja STL klasa u razmeni podataka morate koristiti vase COM ili COM-olike virtuelne interfejse ali to je one-time posao.

Sve ostalo je onda lakse.

Na kraju se moze uraditi i eksplicitno unload-ovanje DLL-ova, ako ne zelite "pravi" COM vec nesto vase, kada sve reference koje DLL pruza padnu na nulu. Za ovo ce vam biti potrebno malo glue koda koji inace COM pruza, ali to je isto one-time job, posle sve mozete da izvodite na isti nacin.

Ako je kod 100% vas i svi pluginovi ce biti 100% vasi - onda mozete ostati pri starom C-style programiranju sa razmenom hendlova tj. prikrivenih pointera na interne strukture/objekte (ala Win32 API) - ovo zahteva disciplinu i jasnu memorijsku semantiku (ko alocira / ko dealocira itd...) - ali sve dok je kod 100% vas i nemate nameru da ga delite sa drugim ovo ne mora biti problem.

Medjutim onog momenta kada taj vas plug-in mehanizam pocne da se koristi za 3rd party kod - COM ili COM-style programiranje ce vam ustedeti eone vremena u lupanju glave sta se desilo kada stvari krenu da pucaju.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

tosa
上海, 中国

Član broj: 1811
Poruke: 1342
118.131.136.*

ICQ: 14293955
Sajt: https://github.com/milost..


+48 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?06.09.2012. u 08:21 - pre 140 meseci
^^ overengineering warning! :)
Evo jednog clanka o pisanju plugin-ova u C-u: http://eli.thegreenplace.net/2012/08/24/plugins-in-c/
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.static.sbb.rs.



+395 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?06.09.2012. u 09:29 - pre 140 meseci
@Ivan Dimkovic
Da , COM jeste dobro resenje, ali je vezan za Windows a cini mi se da je tema pocela oko Linux/ open source resenja ...
Moj odgovor na ovo je bio neko multiplatformsko resenje gde je programski interferjs plug-ina po standardu c/c++ -a .
Dakle , ne moze se dobiti i jare i pare :)

Viva lollapalooza
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?06.09.2012. u 09:38 - pre 140 meseci
D-Bus?
http://www.freedesktop.org/wiki/Software/dbus

Iako je zamisljen kao RPC, ne vidim zasto ne bi mogao da se koristi kao alternativa COMu za komunikaciju unutar procesa preko session bus-a.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?06.09.2012. u 10:32 - pre 140 meseci
Ispravite me ako grešim (COM ne poznajem), ali ukoliko u toj arhitekturi plagin pukne, npr. zbog ovakvog namerno napisanog koda
Code (cpp):

int *p = 0;
*p = 5;

šta se dešava sa aplikacijom? Ako je isti proces u pitanju, puče sve.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.adsl.net.t-com.hr.



+7169 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?06.09.2012. u 10:49 - pre 140 meseci
Citat:
tosa: ^^ overengineering warning! :)
Evo jednog clanka o pisanju plugin-ova u C-u: http://eli.thegreenplace.net/2012/08/24/plugins-in-c/


Da li je overengineering zavisi od potreba i, IMHO, jos vaznije - ciljne grupe.

Ako ti je ciljna grupa poznata i ogranicena, predstavljaju dobre programere, nema nikakvih problema drzati se internih konvencija i koristiti jednostavan C-style plug-in sistem. Nista lakse od toga, je li.

Ako ti je ciljna grupa nepoznata (3rd party) i/ili imas komplikovan projekat za koji znas da ce evoluirati - iz nekog mog malog iskustva mogu da kazem da vredi uloziti vreme u taj "overengineering" koji ce ti smanjiti posao kasnije. Sve sto mozes da uradis sa COM-like programiranjem mozes i u cistom C-u ali ces imati vise eksplicitnih pravila kojih ce morati da se pridrzavaju svi. Koliko je to prakticno, to vrlo zavisi od okolnosti koje mozda nisu pod tvojom kontrolom :)

@Nedeljko, sve sto trci unutar istog procesa ce ti srusiti ceo proces kad pukne. Ako hoces da se stitis od toga, nema ti druge nego da napravis plug-in sistem koji plug-inove izoluje u sopstvenom procesu. Ali tada moras da resavas druge stvari - recimo IPC.

IPC k'o IPC moze da se uradi na milion nacina (pajpovi, shared-memory / virtuelni fajlovi, Win32 Window messages, DBUS, ....) ali svaki od njih nosi drugacije prednosti i mane u pogledu orgranicenja, performansi, itd...

@deerbeer - COM-style programiranje nije vezano za Windows. Koriscenje potpuno virtuelnih klasa (interfejsa) i RAII idioma se moze primeniti na svim OS-evima. Win32 COM ima glue-logiku za registraciju i ucitavanje interfejsa (i jos stosta) ali to se za tvoje potrebe moze raspisati lepo od nule tako da bude jednostavnije i verovatno brze od COM-a.

Najbolja stvar je sto onda neces morati da zavisis od kompajlera, tvoji klijenti mogu pisati pluginove u cemu hoce (bas kao sto mozes pisati COM interfejse u cemu hoces) - sve to moze i sa cistim C-om, kao sto rekoh, ali je onda onus na pridrzavanju pravila na programerima.

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?06.09.2012. u 11:12 - pre 140 meseci
paaa, ima tu i jadan mali problem sa metadata. COM glue logika se bazira na IID (GUID koji jednoznacno predstavlja interfejs) i standardizovanom IUnknown interfejsu i/ili kroz kroz typelibrary i/ili kroz IDispatch, sve to opet podrzavaju drugi alati i zbog toga imas mogucnost da koristis razne alate za pisanje COM objekata, ako pravis svoj metadata sistem onda je pitanje podrske u drugim alatima realan problem. U osnovi mozes da emuliras COM (mene zapravo cudi da niko na Linux platformi nije napravio nista slicno)


Citat:
Nedeljko: Ispravite me ako grešim (COM ne poznajem), ali ukoliko u toj arhitekturi plagin pukne, npr. zbog ovakvog namerno napisanog koda


Osnovni COM (in-proc) nema tu zastitu (niti je ista moguca), access fault u COM objektu ce oboriti aplikaciju, ali COM ima tzv OLE Automation protokol (implementiran preko IDispatch koji dobijes iz IUnknown) koji barata sa Variant tipovima koji su type-safe, tako da bar deo puta imas odradjen. Kao sto je rekao Ivan, zastita je out-of-proc instancijacija objekata koju COM takodje podrzava kroz svoj proxy objekat koji enkapsulira IPC sa hsot procesom koji aktivira objekat. Sa stanovista pisanja koda sve je transparentno, samo se povecava latency poziva.



Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.dynamic.sbb.rs.



+7 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?06.09.2012. u 19:47 - pre 140 meseci
Mislim da je ova prica o losim programerima plugina preterana ...
Koja bi to bila situacija u praksi da neko napravi los plugin, a pritom nije autor programa i da distribuira aplikaciju i plugin sirokom broju korisnika i to sve zajedno pocne da puca i puca ...
Svi mogu da prave pluginove za FireFox i da postave na Mozilinom sajtu ali to se sve testira. Oni nece da puste u download nesto sto ne valja.
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.dynamic.sbb.rs.



+7 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?06.09.2012. u 22:21 - pre 140 meseci
Citat:
tosa:
^^ overengineering warning! :)
Evo jednog clanka o pisanju plugin-ova u C-u: http://eli.thegreenplace.net/2012/08/24/plugins-in-c/

Ovo bi bile Linux verzije LoadLibrary i GetProcAddress
Code:
void* libhandle = dlopen(dstring_cstr(slashedpath), RTLD_NOW);
PluginInitFunc initfunc = (PluginInitFunc)
    (intptr_t) dlsym(libhandle, dstring_cstr(initfunc_name));


 
Odgovor na temu

[es] :: Art of Programming :: Kako napraviti program koji ce biti prosiriv ?
(TOP topic, by X Files)
Strane: 1 2

[ Pregleda: 14007 | Odgovora: 34 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.