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

Koriscenje dva jezika u jednom projektu???

[es] :: Art of Programming :: Koriscenje dva jezika u jednom projektu???

Strane: 1 2

[ Pregleda: 5893 | Odgovora: 20 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Boyka
BPS

Član broj: 287185
Poruke: 338
*.dynamic.isp.telekom.rs.



+33 Profil

icon Koriscenje dva jezika u jednom projektu???28.10.2012. u 17:53 - pre 138 meseci
Pozdrav, kako mogu dva jezika da komuniciraju u jednom projektu?

Recimo da hoću da mi C radi neke delove gde mi treba brzina, a C# ili Java tamo gde mi treba GUI?

Kako sada da povežem C i C#, da li je potrebno znanje Asemblera, da bukvalno pri "silaženju" oba jezika na nivo 'lima', ja ih uhvatim na Asemblerskom nivou i povežem?

Ili je to moguće putem DLL-a, a da pritom ne dođe do gubljenja podataka?
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Koriscenje dva jezika u jednom projektu???28.10.2012. u 18:59 - pre 138 meseci
Ako je brzina jedini razlog za korišćenje C-a, slobodno radi sve u C#-u/Javi.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

del-boy
Bojan Delić
Beograd

Član broj: 9330
Poruke: 1089

Sajt: www.delic.in.rs


+21 Profil

icon Re: Koriscenje dva jezika u jednom projektu???28.10.2012. u 19:46 - pre 138 meseci
Moguće je, i to ni nije neki bauk. Kad je java u pitanju proguglaj native pozive (native je i ključna reč u javi, ako se dobro sećam). Za c# pogledaj pInvoke i DllImport atribut.

Mada, kao što Nedeljko kaže - nemoj se zamajavati sa ovim zbog brzine. Radi sve u odabranom jeziku, pa ako je nakon merenja brzina izvršavanja nedovoljna nađi gde je usko grlo i samo to prepiši u C i pogledaj da li si dobio neko unapređenje u performansama. Ako jesi tek onda ima smisla zezati se sa svim ovim. Meni su ovi mehanizmi bili zgodni za pozivanje postojećeg koda i WinApi funkcija, a ne zbog performansi.
 
Odgovor na temu

Boyka
BPS

Član broj: 287185
Poruke: 338
*.dynamic.isp.telekom.rs.



+33 Profil

icon Re: Koriscenje dva jezika u jednom projektu???28.10.2012. u 19:56 - pre 138 meseci
Dao sam samo primer C jezika i brzine aplikacije, nisam mislio sada da pravim nesto sto ce povezivati vise jezika, samo bih hteo da znam da li je to moguce na neki jednostavniji nacin izvesti...

Da li je moguce kada bih recimo u C#-u napravio DLL gde bih stavio sve klase kao javne, onda lepo otvorio >eclipse< okruzenje za javu, importovao u eclipse dll c#-a i iskoristio te njegove javne klase i override-ovo ih javom?
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Koriscenje dva jezika u jednom projektu???28.10.2012. u 20:01 - pre 138 meseci
Neke kombinacije su moguce i jednostavne (c# + vb.net na primer), neke malo komplikovanije (pozivanje c/c++ f-ja iz c#-a ili Jave) a neke nezgodne (C# + Java).

Tako da, ako hoces opsti odgovor, onda je on - "zavisi".
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Koriscenje dva jezika u jednom projektu???28.10.2012. u 20:59 - pre 138 meseci
Android okruzenje je klasican primer u kojem su zadaci podeljeni izmedju modula pisana u dva jezika.

GUI i svi zadaci koji ne zahtevaju veliku efikasnost pisu se u Javi (Android Java je po sintaksi izuzetno
slicna originalnoj Java-i, virtuelna masina nije ista).

Zadaci koji zahtevaju veliku efikasnost (obrada slike, zvuka, kompleksnije enkripcije, enkodovanja, cak i
dekodovanja nekih kompleksnijih multimedijalnih formata) se 'spustaju' na embedded Linux deo Androida
(sistem biblioteka pisanih u C-u, dugotrajno u upotrebi, skoro potpuno bug-free, pristojno optimizovanih)
ili cak nize (u firmware kojeg isporucuje chip vendor, tipicno u vidu OpenMAX multimedijskih komponenti,
ili raznih DSP modula vezanih za WiFi, BlueTooth, GPS, echo cancellation itd) koji nemaju ni najmanje sanse
da rade efikasno u Java-i.

Interfejs izmedju Java i C (pa odatle u C++) postoji odavno, zove se JNI (Java Native Interface), i u
neizmenjenom obliku se koristi i na Androidu.



Ostaje, naravno, otvoreno pitanje - 'sta ce to tebi ?' - tj. da li je za to sto radis potrebno ili ne.



Ako si u fazi ucenja/studiranja i imas dalekosezniju viziju koja ne odbacuje mogucnost da ces jednog dana
raditi na necemu cemu bas treba velika efikasnost i brzina, ne bi bilo lose da napravis par vezbica na temu
povezivanja Java-e i C/C++-a, cisto radi prosirivanja licnih vidika, nikad se ne zna kad moze da zatreba kao
ni gde ce te putevi karijere odvesti.

Ako se ne kreces u tom nekom pravcu, postupio bi prema savetima - probaj da li ti je to sto pises dovoljno
brzo, a ako ne tek onda lupaj glavu sta da radis dalje. U vecini slucajeva, bolje faktorisanje koda, pametnija
podela poslova po nitima i slicne tehnike mogu da pomognu da program radi elegantnije, da se ne zaglavljuje
dugo u cekanju da neko 'usko grlo' izvrsi zadatak, itd.
 
Odgovor na temu

Boyka
BPS

Član broj: 287185
Poruke: 338
*.dynamic.isp.telekom.rs.



+33 Profil

icon Re: Koriscenje dva jezika u jednom projektu???28.10.2012. u 22:14 - pre 138 meseci
Citat:
milanche:



Ostaje, naravno, otvoreno pitanje - 'sta ce to tebi ?' - tj. da li je za to sto radis potrebno ili ne.



Ako si u fazi ucenja/studiranja i imas dalekosezniju viziju koja ne odbacuje mogucnost da ces jednog dana
raditi na necemu cemu bas treba velika efikasnost i brzina, ne bi bilo lose da napravis par vezbica na temu
povezivanja Java-e i C/C++-a, cisto radi prosirivanja licnih vidika, nikad se ne zna kad moze da zatreba kao
ni gde ce te putevi karijere odvesti.

Ako se ne kreces u tom nekom pravcu, postupio bi prema savetima - probaj da li ti je to sto pises dovoljno
brzo, a ako ne tek onda lupaj glavu sta da radis dalje. U vecini slucajeva, bolje faktorisanje koda, pametnija
podela poslova po nitima i slicne tehnike mogu da pomognu da program radi elegantnije, da se ne zaglavljuje
dugo u cekanju da neko 'usko grlo' izvrsi zadatak, itd.


U fazi sam studiranja, učenja, tako da me interesuju one stvari koje se teško nalaze u bilo kojoj literaturi, a to znanje kasnije kada i ako se skupi neki tim više nas koji će raditi na nečemu ozbiljnom to znanje da krunišem nekim ozbiljnim projektom, ali polako opvo je najviše radoznalost...
Ima još jedna stvar koja me interesuje, ali je verovatno na forumu zabranjeno pisati o tome kako ući u kod drugog programa, pretpostavljam da Asembler tu ima ulogu, ali nebitno...

P.S lepo si pojasnio za Android...
 
Odgovor na temu

mkaras
Marko Karas
Beograd

Član broj: 66087
Poruke: 427



+19 Profil

icon Re: Koriscenje dva jezika u jednom projektu???29.10.2012. u 00:28 - pre 138 meseci
Pokušaj u Google-u sa: c# call dll,java call dll, bilo šta call dll i
dobićeš gomilu stranica. Čak je clipper mogao da se poveže sa funkcijama
pisanim u C-u, pa i u asembleru.
Tako da tvoja tvrdnja kako su to stvari koje se teško nalaze u bilo
kojoj literaturi je samo odraz tvoje lenjosti da barem pokušaš da
potražiš odgovor ili baš loše razumevanje materije.
Kao da si postavio pitanje da li ima neka pijaca na kojoj se prodaju
paprike za ajvar.
 
Odgovor na temu

Boyka
BPS

Član broj: 287185
Poruke: 338
*.dynamic.isp.telekom.rs.



+33 Profil

icon Re: Koriscenje dva jezika u jednom projektu???29.10.2012. u 09:12 - pre 138 meseci
Citat:
mkaras: Pokušaj u Google-u sa: c# call dll,java call dll, bilo šta call dll i
dobićeš gomilu stranica. Čak je clipper mogao da se poveže sa funkcijama
pisanim u C-u, pa i u asembleru.
Tako da tvoja tvrdnja kako su to stvari koje se teško nalaze u bilo
kojoj literaturi je samo odraz tvoje lenjosti da barem pokušaš da
potražiš odgovor ili baš loše razumevanje materije.
Kao da si postavio pitanje da li ima neka pijaca na kojoj se prodaju
paprike za ajvar.


A pa lako je sada kada znam da je dll odgovoran za komunikaciju vise jezika...
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

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



+7 Profil

icon Re: Koriscenje dva jezika u jednom projektu???31.10.2012. u 19:12 - pre 138 meseci
Ako te bas interesuje NET sa koriscenjem c/c++ googlaj koriscenje win api a u NET applikacijama (na engleskom) zato sto je win api c kod smestem u systemskim dll-ovima.
A slicno tome mogu da se naprave i svoje c/c++ biblioteke i da se koriste sa NETom.
Samo se ne nadaj nekoj velikoj lakoci i importovanju, verovatno ces sve da svedes na rucno definisanje u svom jeziku funkcija exportovanih iz dlla da bi mogao da ih pozivas i moraces da definises i memoriske strukture koje su potrebne itd... mozda ne skoz rucno ali otprilike tako nesto.
Ovo vazi za eksportovane fukcije a za exportovane c++ klase nije mi poznato dali mogu da se koriste i kako.

 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
2607:fb10:2:236:a432:e422:7c..



+1001 Profil

icon Re: Koriscenje dva jezika u jednom projektu???31.10.2012. u 20:59 - pre 138 meseci
Citat:
Ovo vazi za eksportovane fukcije a za exportovane c++ klase nije mi poznato dali mogu da se koriste i kako.


Mogu, ali ne jednostavno. Koren problema je u tome sto je za linker (pa odatle iza run-time loader) imenovanje
C++ simbola znatno komplikovanije nego imenovanje C simbola. Dok je u slucaju C funkcija puko ime funkcije
dovoljno da jednoznacno oznaci simbol, u C++ slucaju to nije dovoljno, a razloga ima vise. Prvo, moguce je da
postoje dve funkcije istog imena koje pripadaju dvema razlicitim klasama (da ne idemo dalje na namespaces i/ili
template koji dodaju tezinu na isti tas). Zatim, C++ jezik dozvoljava da u okviru klase postoje metode istog imena
a razlicite liste ulaznih podataka (overloading).

Ocito, linker mora da upotrebi neku od sema (name mangling) koja ce da ime simbola obrazuje koristeci sve bitne
podatke vezane za metod (ime klase, lista argumenata, itd). Da stvari budu gore, ove konvencije su compiler-specific.
(http://en.wikipedia.org/wiki/N...lers_mangle_the_same_functions)

Da bi se olaksalo eksportovanje, najcesce se koristi resenje bazirano na tzv. class factory - funkcija deklarisana kao
obicna C funkcija (na Win32 se zahteva da bude _cdecl calling konvencije), cross-platform resenje koje uvek radi je
da se deklarise kao extern "C". Takodje, posao moze da odradi i staticka funkcija klase (class static). Kao ulazni argument
class factory prima (by reference) pokazivac (pointer) na interface koji C++ klasa podrzava i za koji je korisnik dll-a
(.so) zainteresovan. Prilikom poziva, class factory kreira instancu C++ klase, i ukoliko klasa implementira interface,
cast-ovanje v-tabele na v-tabelu interface-a je elegantno, i pokazivac vraca (by reference) pozivnoj funkciji.

(...obicno se unutar dll-a mora odrzavati neka lista kreiranih instanci, i potrebno je implementirati i neku varijantu
cleanup() poziva kojom ce se sve instance iz liste uredno dealocirati...)

U teoriji, moguce je eksportovati ne samo interfejs, nego i celu klasu (svi metodi i svi member podaci), ali je u tom
slucaju potrebno eksportovati i sve klase od kojih doticna klasa nasledjuje (sto bas nije jednostavno ako klasa nasledjuje
recimo neki od STL templata). Na Windows-ima postoje i jos strozi zahtevi (da su i dll i app linkovani sa istom verzijom
run-time biblioteka).

Dobar clanak na ovu temu:

http://www.codeproject.com/Art...To-Export-C-classes-from-a-DLL

[Ovu poruku je menjao milanche dana 31.10.2012. u 22:12 GMT+1]
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

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



+7 Profil

icon Re: Koriscenje dva jezika u jednom projektu???03.11.2012. u 22:22 - pre 138 meseci
Mislio sam na koriscenje exportovanih c++ clasa iz c++ biblioteke u programu koji nije pisan u c++. Kako je i pitao.
U c++ koristim exportovanje klasa.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Koriscenje dva jezika u jednom projektu???04.11.2012. u 03:58 - pre 138 meseci
Postoje dobri razlozi zasto se stvari rade kako se rade (uspostavljanje veze sa deljenom bibliotekom
prebacivanjem pokazivaca na interface).

Rezon #1:

jedan od glavnih razloga zasto se uopste pravi deljena biblioteka je enkapsulacija (u najklasicnijem
OO znacenju) - zelja da se izoluje i zastiti unutrasnje funkcionisanje minimizovanjem 'povrsine preseka'
sa spoljnim svetom. Za razliku od klasicnih 'jezickih' razloga (C++, Java) tu su i razni drugi sistemski
razlozi (kontrola pristupa konkretnim sistemskim modulima, device driverima, itd). Kao najmanja
zajednicka dodirna tacke se tipicno uzima interface (struktura pokazivaca na delove programske
memorije).

Rezon #2:

Bez obzira koliko se programski jezici razlikuju, njihove razlike postaju sve minimalnije sto se ide blize
hardveru (CPU, memorija, registri). Layout strukture (struct) u memoriji je vrlo verovatno sasvim isti,
takodje layout pokazivaca na rutinu u programskoj memoriji, odatle i na interface (sto je struktura
pokazivaca).

Poniranjem na najmanji zajednicki sadrzalac cela prica se svodi na najsigurniju i najbezbedniju varijantu,
koju je jezickim konstrukcijama C podrzao skoro potpuno.

Citat:
U c++ koristim exportovanje klasa.


Nije nemoguce, medjutim, postoji dosta potencijalnih problema, nekoliko prvih dolazi iz relativno labave
standardizacije C++ implementacija.

Kao najveci potencijalni problem u ovom pogledu stoji dijapazon mogucih shema za formiranje imena simbola
(name mangling) koji nije standardizovan, nego zavisi od kompajlera.

Export-ovanje klase obicno nije problem kad su i korisnik (onaj koji load-uje) i deljena biblioteka pisani po istoj
shemi (-> kreirani istim kompajlerom + istom verzijom run time biblioteka). Na Linux-u su svi simboli deljene
biblioteke po default-u vidljivi i dostupni. Na Windows-ima par makroa obavlja celu pricu bez problema.

Drugi problem je implementacija v-tabela (klasicna dilema: per object/per class je samo jedan od problema). Posle
toga nadire klasa problema vezanih za RTTI (real time type identification).

Treci problem je brzina load-ovanja.

Hajde da zazmurimo pa da kazemo da je sve 'podmazano' - isti kompajler, ista name-mangling konvencija, iste run
time biblioteke. Radi cistoce primera, izostavicu slucaj dobro utabanih sistema (Windows, Mac) recimo, gde je cela
hijerarhija klasa vecim delom uglavnom poznata unapred. Uzecemo primer custom C++ projekta sa bogatom hijerarhijom
klasa, slabo poznatom siroj javnosti, nema sanse da se na target masini nalazi u nekom .dll/.so fajlu, stize jedino
i samo preko jedne jedine deljene biblioteke, custom dizajnirane u firmi XYZ.

Ako se kod korisnika deljene biblioteke napise tako da zahteva instancijaciju bas C++ klase, linker ce morati da pred
loader stavi zadatak da at run-time pronadje i ucita v-tabele svih predaka zeljene C++ klase,...sto moze da traje vremena.

Daleko krace ce da traje loadovanje ako naznacis da ti at run-time treba iz biblioteke nista vise nego prosta struktura koja
sadrzi pokazivace na funkcije. Time nije nista zrtvovano - instanca C++ klase ce se odigrati svoju ulogu u procesu, samo ce
loader da 'posluzenje' njene funkcionalnosti izvede brze i elegantnije, bez potrebe da 'gost restorana onjusi lonce u kuhinji'.

Citat:
Mislio sam na koriscenje exportovanih c++ clasa iz c++ biblioteke u programu koji nije pisan u c++


Ovo do sada najbrojano su bili problemi u okviru istog jezika (C/C++). Verovatno je intuitivno jasno da razlike izmedju
implementacija klasa izmedju razlicitih programskih jezika rastu eksponencijalno:
- kod nekih je memory alignment probleme potpuno zbrinuo kompajler, kod drugih nije. Zaboravis (ili ne potrefis tacno) #pragma align,
problemi su neminovni, crash vrlo verovatan.
- calling konvencije mogu da budu znatno razlicite
- tipovi podataka nespojivi (pokazivaci u Javi = ?, unsigned short u Javi = ?,...da ne pominjem genijalne objective-C seme
gde se 'potpis' funkcije formira kao 'red slanine-red sunke-red slanine-red sunke')
- exceptions handling (izuzeci) se tretiraju vrlo raznoliko (Java finally = ? u C++)

Ono sto se moze uraditi su razni 'bindings'. Puko loadovanje u proces je nepotrebno komplikovana disciplina.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Koriscenje dva jezika u jednom projektu???04.11.2012. u 09:20 - pre 138 meseci
@milanche

Ne vidim svrhu ove tvoje poruke. Čovek je napisao da ne zna za način da izveze C++ klase koje bi koristio u npr. C#-u, a da mu izvoz C++ klasa za upotrebu u C++ kodu nije problem - čak ga radi svakodnevno. Pritom nije pitao kako da reši uvoz C++ klasa u C#-u. Dakle, zašto si ovo uopšte pisao? Sve je tačno, ali šta je poenta?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Koriscenje dva jezika u jednom projektu???04.11.2012. u 16:15 - pre 138 meseci
Citat:
Čovek je napisao da ne zna za način da izveze C++ klase koje bi koristio u npr. C#


Procitaj pazljivije.

Poslednji pasus koji sam napisao

Citat:
Verovatno je intuitivno jasno da razlike izmedju implementacija klasa izmedju razlicitih programskih jezika rastu eksponencijalno:
- kod nekih je memory alignment probleme potpuno zbrinuo kompajler, kod drugih nije. Zaboravis (ili ne potrefis tacno) #pragma align,
problemi su neminovni, crash vrlo verovatan.
- calling konvencije mogu da budu znatno razlicite
- tipovi podataka nespojivi (pokazivaci u Javi = ?, unsigned short u Javi = ?,...da ne pominjem genijalne objective-C seme
gde se 'potpis' funkcije formira kao 'red slanine-red sunke-red slanine-red sunke')
- exceptions handling (izuzeci) se tretiraju vrlo raznoliko (Java finally = ? u C++)


navodi listu problema sa kojim bi se suocio neko ko bi medju-operativnost izmedju programskih jezika trebalo da resi u loader-u.
Nije nemoguce resiti ih teorijski, ali bi se onda sa brzinom pozdravili do mere da bi mogao da komotno popije kafu ili se obrije dok
se podigne neka veca aplikacija. Obicno se te zelje resavaju pisanjem nekih 'binding'-a za odredjeni programski jezik, ali to resenje
zivi nekoliko spratova iznad nivoa linkera i loadera (koji mora da bude brz).

Citat:
npr. C#-u


Od primera do primera, od jezika do jezika, resenja mogu biti razlicita, problemi su ti koji su. BTW, @Eurora3D nije precizirao C#.


Citat:
a da mu izvoz C++ klasa za upotrebu u C++ kodu nije problem - čak ga radi svakodnevno


Radi ga svakodnevno, sto je poznato i moguce ali uz ogranicenja vezana za udobnost jednog okruzenja. Pokusao sam da ukazem
sta se moze desiti kad se iskoraci iz tih ogranicenja i u kom pravcu, i zasto je sigurnije osloniti se na jednostavan eksport pokazivaca
na interface (radi brzo, izbegnute su mnoge zamke).
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Koriscenje dva jezika u jednom projektu???04.11.2012. u 16:37 - pre 138 meseci
Da, svakome je jasno da C++ i Java nisu isto i da ne može Java tek tako da pije C++ klasu. Međutim, Eudora3DTema to nije pitao. Štaviše, nije ništa pitao. A što se tiče C++ klasa u C++ kodu, lično mi je poznato da on to radi između VC++ i GNU C++ prevodioca iz MinGW paketa, tako da nemoj da brineš za njega.

Kažem ja da stoji apsolutno sve što si napisao, samo mi nije jasno čemu odgovaranje ako ništa nije pitano.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Koriscenje dva jezika u jednom projektu???04.11.2012. u 17:31 - pre 138 meseci
Kratki size diskusije koja se krece u sasvim logicnom redosledu, uz povremene korekcije pitanja i dopunjavanja odgovora:

@Boyka
Citat:
c#-a i iskoristio te njegove javne klase i override-ovo ih javom?


@Shadowed:
Citat:

Neke kombinacije su moguce i jednostavne (c# + vb.net na primer), neke malo komplikovanije (pozivanje c/c++ f-ja iz c#-a ili Jave) a neke nezgodne (C# + Java).
Tako da, ako hoces opsti odgovor, onda je on - "zavisi".


@Eurora3D:
Citat:

a za exportovane c++ klase nije mi poznato dali mogu da se koriste i kako.


milanche:
Citat:

Mogu, ali ne jednostavno.


Eurora3D:
Citat:

Mislio sam na koriscenje exportovanih c++ clasa iz c++ biblioteke u programu koji nije pisan u c++. Kako je i pitao.


milanche:
Citat:

Verovatno je intuitivno jasno da razlike izmedju implementacija klasa izmedju razlicitih programskih jezika rastu eksponencijalno...


 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

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



+2789 Profil

icon Re: Koriscenje dva jezika u jednom projektu???04.11.2012. u 17:46 - pre 138 meseci
Ako sam te dobro razumeo, odgovor je bio upućen Boyki.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Koriscenje dva jezika u jednom projektu???04.11.2012. u 17:55 - pre 138 meseci
Citat:
on to radi između VC++ i GNU C++ prevodioca iz MinGW paketa


Nije receno da ne moze, receno je samo da postoje ogranicenja.

Ako postoje ogranicenja, treba ih biti svestan, i ne smatrati da ako postoji slucaj gde C++ klasa kompajlirana sa MinGW
biva uspesno upotrebljena u MSVC okruzenju da je to 100% bezbedan i uvek primenjiv slucaj, i da treba da bude promovisan
u solidno pravilo dizajna.

Uostalom, na sajtu mingw-a kazu :

http://www.mingw.org/wiki/Inte...d_by_Different_Compiler_Brands

Citat:
Introduction
Object files and static libraries created with different compilers, or even with significantly different releases of the same compiler, often cannot be linked together. This issue is not specific to MinGW: many other compilers are mutually incompatible. Build everything from source with the same version of the same compiler if you can.

Dll's are slightly different. Sometimes you can link a DLL built with one compiler to an application compiled with another. This works well if the DLL is written in C, even if the application is written in C++. For example, MinGW C++ programs commonly link to the C runtime library provided with Windows. DLLs that are written in C++ work too, as long as you communicate with them only through a C interface declared with extern "C". If you do otherwise, you will probably get linker errors because different compilers mangle C++ names differently.

Why Different Compilers may not Interoperate
Sometimes people wonder why compiler writers don't just use the same name-mangling scheme. That might make linking succeed, but would most likely give you a program that crashes when you call into the DLL. Real link compatibility requires a common Application Binary Interface, and name-mangling is just one consideration among many. Here's a partial list:--

http://ou800doc.caldera.com/SD...g/binary_cplusplus_compat.html
One compiler offers 3200 different ABIs according to this page: http://www.boost.org/libs/config/config.htm#source
According to Stroustrup (ARM, 7.2.1c, page 122):
If two C++ implementations for the same system use different calling sequences,
or in other ways are not link compatible, it would be unwise to use identical encodings
of type signatures.

Implementors have traditionally used deliberately different name-mangling schemes, figuring it's better to 'just say no' at link time than to make some simple code work and let the issues emerge at run time.

Even though GNU g++ can link MSVC C++ libraries now, and can produce MSVC++ compatible libraries/DLLs, this does not mean that they will be able to work at run-time due to the dynamic nature of C++. Some possible reasons for this are:--

The simple name mangling issue which it may be possible to circumvent with an explicit .def file.
Different structure alignment issues which need the correct compiler options (-mms-bitfields, ...).
A fundamental conflict of underlying exception and memory models:--
A new/delete or malloc/free in a MSVC DLL will not co-operate with a Cygwin newlib new/delete or malloc/free. One cannot free space which was allocated in a function using a different new/malloc at all.
An exception raised by an MSVC DLL will not be caught by a Cygwin executable, and vice versa.
The slow GNU SJLJ exception model, (used in GCC-3.x and earlier), is compatible with the MSVC++ model, but the new DWARF2 model, (which will be used by GCC-4.x), will be incompatible.



Zatim, na dnu stranice ("Circumventing the Issues") navode jednu tehniku kojom se problem moze resiti,

http://aegisknight.org/cppinterface.html

koja se svodi na zaobilazenje svih mogucih problema koje sam nabrojao primenom mera kao sto su upotreba
C funkcija, completely abstract klasa (= interface), izbegavanje exceptions...

Citat:
Summary

- All interface classes should be completely abstract. Every method should be pure virtual. (Or inline... you could safely write inline convenience methods that call other methods.)
- All global functions should be extern "C" to prevent incompatible name mangling. Also, exported functions and methods should use the __stdcall calling convention, as DLL functions and COM traditionally use that calling convention. This way, if a user of the library is compiling with __cdecl by default, the calls into the DLL will still use the correct convention.
- Don't use the standard C++ library.
- Don't use exception handling.
- Don't use virtual destructors. Instead, create a destroy() method and an overloaded operator delete that calls destroy().
- Don't allocate memory on one side of the DLL boundary and free it on the other. Different DLLs and executables can be built with different heaps, and using different heaps to allocate and free chunks of memory is a sure recipe for a crash. For example, don't inline your memory allocation functions so that they could be built differently in the executable and DLL.
- Don't use overloaded methods in your interface. Different compilers order them within the vtable differently.


Prema tome, ne izgleda bas da je diskusija bila sasvim bespotrebna.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Koriscenje dva jezika u jednom projektu???04.11.2012. u 18:01 - pre 138 meseci
Citat:
Ako sam te dobro razumeo, odgovor je bio upućen Boyki.


Pokusavam da pratim niz pitanja na temi, i gledam da dobacim po neki komad informacije na gomilu,
osvetlim problem iz jos nekog ugla, dosmirglam neku ivicu, nisam fokusiran na pojedine likove.

Kad polemisem sa nekim (tj. imam drasticno suprotno misljenje), obicno pocnem sa "@<neko>",
sto ovde nije bio slucaj.

P.S. Unapred se izvinjavam sto me tokom ostatka dana verovatno nece biti na temi.
 
Odgovor na temu

[es] :: Art of Programming :: Koriscenje dva jezika u jednom projektu???

Strane: 1 2

[ Pregleda: 5893 | Odgovora: 20 ] > FB > Twit

Postavi temu Odgovori

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