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: 14011 | Odgovora: 34 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

2paca.zwaka
Nikola Ninkovic
Web Developer
BTGPort
Trebinje, RS/BiH

Član broj: 277023
Poruke: 126
*.teol.net.



+7 Profil

icon Kako napraviti program koji ce biti prosiriv ?31.08.2012. u 13:25 - pre 140 meseci
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
while(I->AmAlive()){
I->DoSomeProgramming();
}
 
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 ?31.08.2012. u 14:47 - pre 140 meseci
Voleo bih da ti odgovorim, ali danas definitivno nemam vremena. Potrudiću se čim stignem da odgovorim, a ti dotle smisli neki što prostiji primer aplikacija sa plaginovima.
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 ?01.09.2012. u 01:07 - pre 140 meseci
Prouci Qt dokumentaciju. Qt ima razradjen framework za pravljenje pluginova, za ucitavanje itd.
Imas i primer
 
Odgovor na temu

kkedacic
Extropia

Član broj: 261437
Poruke: 31
*.adsl.net.t-com.hr.



+41 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?03.09.2012. u 11:53 - pre 140 meseci
Nesto slicno je i mene zanimalo prije par mjeseci, samo mene zanima kako se to inace radi od nicega?
Zanima me kako napraviti program da moze biti prosiren koristeci binary kao plugin? Ako je to uopce moguce? A ako je moguce, kako organizirati kod i na sta paziti u kodu da bi sve sljakalo? Mogu i neki primjeri u C-u, al da se radi o ELF failovima.

 
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 ?03.09.2012. u 20:15 - pre 140 meseci
Formuliši neki jednostavan primer (zadatak), pa da ti na njemu pokažem.
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 ?03.09.2012. u 21:39 - pre 140 meseci
Citat:
kkedacic:
Nesto slicno je i mene zanimalo prije par mjeseci, samo mene zanima kako se to inace radi od nicega?
Zanima me kako napraviti program da moze biti prosiren koristeci binary kao plugin? Ako je to uopce moguce? A ako je moguce, kako organizirati kod i na sta paziti u kodu da bi sve sljakalo? Mogu i neki primjeri u C-u, al da se radi o ELF failovima.


Pluginovi su dinamicke biblioteke. Ucitavaju se u runtime-u , program nije linkovan sa njima.
Ucitavaju se na windowsu sa LoadLibrary. Za Linux ne znam tacno.
Dobro je imati klasu koja ih ucitava. Qt ima klasu PluginLoader.
Svaki plugin treba da ima isti set eksportovanih funkcija ili ako je c++ dobro je da se eksportuje interface klasa koju interno svaki plugin implementira.
Znaci princip je da svaki plugin za taj program ima isti set funkcija koji je eksportovan (vidljiv spolja) ali u svakom pluginu te funkcije sa istim imenom rade drugu stvar. npr neki matematicki pluginovi , stavimo im fn calc() npr. plugin plus ce tu da sabere a plugin minus u toj funkciji da oduzme nesto.
Ili pluginovi za dekompresiju raznih vrsta fajlova. Za svaku vrstu jedan plugin i funkcija decompress()
Pluginovi mogu da se naknadno dodaju a da se program uopste ne menja.
Evo uopsteno neka arhitektura.
Deklarises strukturu PLUGIN npr.
Clanovi strukture neka su pointeri u koje ces moci da zapamtis adrese api funkcija jednog plugina.
Api treba da sadrzi i jednu funkciju koja vraca opis plugina u obliku teksta ili neki slican nacin da klasifikujes kakav je plugin jer to ti je jedini nacin da saznas sta neki buduci plugin radi. Recimo plugin tom funkcijom vrati "zip" i program kaze aha ovaj dekompresuje zip, sledeci plugin vrati "rar" itd.
A pritom svaki plugin ima i svoju funkciju decompress()
Zatim
Odvojis jedan c fajl za funkcije koje ucitavaju pluginove. Npr pretrazuju neki direktorijum cija je adresa relativna u odnosu na direktorijum u kome je program i pokusavaju da ucitaju sve dinamicke biblioteke iz njega.
Kada ucitaju biblioteku odvoje jednu strukturu PLUGIN i provere sve eksportovane funkcije iz ucitane biblioteke. Na windowsu kad se ucita dll mozemo da koristimo GetProcAddress da nadjemo adresu funkcije sa odredjenim imenom u ucitanoj biblioteci. Za Linux ne znam. Ako ne nadjes jednu ignorises plugin i ides dalje predhodnu petlju jer plugin ocigledno nije ok ili nije plugin. Zapamtis sve adresse u strukturi i pozoves funkciju koja vraca opis i zapamtis i to u strukturi. Predjes na sledeci plugin iz direktorijuma. Jedna struktura jedan plugin.
Ucitavanje se obicno radi samo jednom na pocetku programa.
Zato se radi ono restartovanje programa kad se doda novi plugin.
Funkcije plugina mozes kasnije da pozivas iz programa po njihovim adresama.
Sad ako pratimo ovu analogiju sa dekompresijom ... kad korisnik odabere fajl koji hoce da dekompresuje ti prvo proveris nastavak fajla i prodjes kroz sve strukture (pluginove) da vidis dali polje koje opisuje plugin sadrzi trazenu ekstenziju, drugim recima da vidis dali imas dekompresor za tu vrstu fajla. Ako imas pozoves mu funkciju decompress sa putanjom fajla kao argumentom, ako ne obavestis ...
Po ovoj arhitekturi kao sto vidis pluginovi mogu i naknadno da se dodaju a da progam ne mora da se menja niti da se kompajluje ...
U principu ovo je uobicajen nacin implementacije pluginova ...


[Ovu poruku je menjao Eurora3D Team dana 03.09.2012. u 22:49 GMT+1]
 
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 01:18 - pre 140 meseci
Evo u prilogu primera, kako je to Eudora3D Team zamislio.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Prikačeni fajlovi
 
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 ?04.09.2012. u 09:46 - pre 140 meseci
Vazna stvar koju zaborave svi koji se zalete u implementaciju je da kad proces ucita modul, taj modul ostaje u adresnom prostoru procesa do njegovog gasenja. Ne postoji UnloadLibrary. U zavisnosti od osmisljene arhitekture pluginova to moze ali i ne mora biti problem. Za load-once i ne toliko ali moze biti problem npr ako aplikacija podrzava samo jedan modul nekog tipa a hoces da dinamicki mozes da ucitas drugi umesto njega, onda moras da imas mehanizam "smene", sto obicno provlaci neki "proxy" da bi se sprecilo setanje pointera u plugin svuda po aplikaciji
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

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?04.09.2012. u 10:00 - pre 140 meseci
Ne postoji UnloadLibrary, ali postoji FreeLibrary.
 
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 ?04.09.2012. u 10:37 - pre 140 meseci
Da, srecno sa tim dangling pointers problemi daleko prevazilaze potrebu za oslobadjanjem malog parceta memorije. Jedna je stvar paziti na pointere funkcija i wrapovati ih u neki proxy, potpuno druga paziti na sve ostale pointere koji pucaju u DLLov adresni prostor. Posledice variraju od brljanja do toga da ti DEP obori ceo proces.
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

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 10:52 - pre 140 meseci
^ Sve sto se kreira u DLL adresnom prostoru sa new , malloc i ostalo tamo se i unistava delete , free itd ..
sto ce reci ako u interfejsu plugina imas create rutine potrebno je imati takodje i destroy/delete rutine ..
Pravilo je jako jednostavno samo ga se programeri nekad tesko pridrzavaju. :)
Viva lollapalooza
 
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 11:33 - pre 140 meseci
mmix

Postoji vrlo jednostavno rešenje za to - enkapsulacija.

Modul je dizajniran kao klasa izvedena iz neke apstraktne. Funkcije koje bi išle kao promenljive su čiste virtuelne u osnovnoj klasi. Sa GetProcAddress dohvataš funkciju koja ti vraća primerak klase. Klasa može da bude singlton. Kada ti više ne treba, delete objekat, FreeLibrary modul, a onda na isti način učitaj drugi. Sve te pointere ne treba ni da vidiš, već da ti klasa obezbeđuje kompletan API, veza sa modulima je npr. globalan pokazivač na klasu koji je uvek jedan itd.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
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 ?04.09.2012. u 11:54 - pre 140 meseci
sve to vrlo brzo postane neodrzivo i sklono greskama. Dovoljno je da neki od metoda vrati char* na literal iz text segmenta u DLLu koji se negde iskopira (ptr) i vec imas nekontrolisani pointer koji ce izazvati ipf ili slicni fault kad se DLL ukloni. Potrebna je striktna disciplina, ne samo u koriscenju vec i pisanju takvih pluginova koja bas i nema neku svrhu sem "cistote" uz dalji rizik da ce neki 3rd prty da zabralja nesto svojim pluginom a da ce korisnik kriviti autora programa :).
Cak i kad je RAM problem i kad plugin napises "cisto" pritisak na RAM ce unloadovati DLLove stranice iz Working Set-a u VM usled nekoriscenja, tako da opet nista paemetno ne dobijas.
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

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?04.09.2012. u 12:10 - pre 140 meseci
Ako metoda ne vraća char* nego kopira sadržaj u bafer koji joj je dat onda opet nema problema.
 
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 ?04.09.2012. u 12:12 - pre 140 meseci
Ili, ali pazi sad ovaj novelty, mozes da ne koristis freelibrary i da nemas nista od tih problema
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

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Kako napraviti program koji ce biti prosiriv ?04.09.2012. u 12:22 - pre 140 meseci
Prosleđivanje char* preko granica biblioteke mi se čini kao loša ideja bez obzira na FreeLibrary.
 
Odgovor na temu

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 12:24 - pre 140 meseci
Citat:
mmix: sve to vrlo brzo postane neodrzivo i sklono greskama. Dovoljno je da neki od metoda vrati char* na literal iz text segmenta u DLLu koji se negde iskopira (ptr) i vec imas nekontrolisani pointer koji ce izazvati ipf ili slicni fault kad se DLL ukloni. Potrebna je striktna disciplina, ne samo u koriscenju vec i pisanju takvih pluginova koja bas i nema neku svrhu sem "cistote" uz dalji rizik da ce neki 3rd prty da zabralja nesto svojim pluginom a da ce korisnik kriviti autora programa :).
Cak i kad je RAM problem i kad plugin napises "cisto" pritisak na RAM ce unloadovati DLLove stranice iz Working Set-a u VM usled nekoriscenja, tako da opet nista paemetno ne dobijas.

Ukoliko je interfejs plugina napravljen kako treba ne bi trebalo da se pojavi takva greska , tj. vrlo lako se ustanovi ko je zacrao (autor programa i li 3rd party developer) tako sto ce da izbaci zadnje instalirani modul
i proveriti da li se bug i dalje pojavljuje ili neka nestabilnost u radu...
Npr ako plug-in ima metode .

Code:

Object* Create () ; 
.. / neke metode 
.. / neke metode .. 
..
void Delete (Object* obj) ; // objekat se predaje plug-inu na brisanje 

Onda problema tesko moze da bude ukoliko implementor ne zacere debelo .. recimo . ako u Create-u napravi objekat sa 'new' a u Delete ga obrise sa 'free' ...
Enkapsulacija promenljivih tj., objekata koje se prenose od plugina do exe-a i obratno je pozeljna i takvi objekti bi trebalo da kroz konstuktor/destruktor da kreiraju i brisu svoje interne pointere ukoliko ih imaju ,
i sve to u kao sto sam naveo u adresnom prostoru gde su i kreirani...

Viva lollapalooza
 
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 12:51 - pre 140 meseci
mmix

Ti mu daj apstraktnu klasu koju treba samo da nasledi, a ako treba modul da vraća char*, neka klasa ima metodu koja popunjava bafer koji si mu dao zajedno sa dužinom.

Naravno, pucanje programa zbog plagina se ne može sprečiti tek tako, jer autor plagina uvek može da napiše nešto ovako:
Code (cpp):

int *p = 0;
*p = 5;

Ako ćeš da se braniš od toga, onda lepo pluginove pokreći kao zasebne procese sa kojima tvoj program komunicira.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
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 13:47 - pre 140 meseci
Uzgred, da priložim novu verziju programa PluginCalc sa sitnim izmenama.

On na početku učitava plaginove AddPlugin, SubPlugin i MulPlugin za vršenje računskih operacija sabiranja, oduzimanja i množenja tim redom. Zatim očekuje ulaz u obliku
arg1 operation arg2

na primer
1.4 + 2.1

i ispisuje rezultat (u pretodnom primeru 3.5).
Zatim očekuje nov ulaz, sve dok ne naiđe na operaciju koju nijedan od učitanih plaginova ne podržava, kada završava rad.

API modula se sastoji od dve funkcije, jedne za dobijanje simbola kojim se data operacija obeležava, a druge za vršenje same operacije.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Prikačeni fajlovi
 
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 ?04.09.2012. u 14:03 - pre 140 meseci
Citat:
Mihajlo Cvetanović: Prosleđivanje char* preko granica biblioteke mi se čini kao loša ideja bez obzira na FreeLibrary.

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.

Citat:
deerbeer: Ukoliko je interfejs plugina napravljen kako treba ne bi trebalo da se pojavi takva greska , tj. vrlo lako se ustanovi ko je zacrao (autor programa i li 3rd party developer) tako sto ce da izbaci zadnje instalirani modul
i proveriti da li se bug i dalje pojavljuje ili neka nestabilnost u radu...

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.


Citat:
Nedeljko: Ako ćeš da se braniš od toga, onda lepo pluginove pokreći kao zasebne procese sa kojima tvoj program komunicira.

Citat:
deerbeer: Enkapsulacija promenljivih tj., objekata koje se prenose od plugina do exe-a i obratno je pozeljna i takvi objekti bi trebalo da kroz konstuktor/destruktor da kreiraju i brisu svoje interne pointere ukoliko ih imaju ,
i sve to u kao sto sam naveo u adresnom prostoru gde su i kreirani...


Da vam odgovorim obojci odjednom, to je sve bila problematika 90ih zbog koje je napravljen COM/DCOM, typelibs i COM type safety
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

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

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

Postavi temu Odgovori

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