C vs Java
46 отговора
1985 прегледа
C vs Java
Начинаещ програмист съм и се интересувам какви са предимствата и недостатъците на Java спрямо C.
Също така някой би ли ме светнал за идеята на object oriented програмиране?
Също така някой би ли ме светнал за идеята на object oriented програмиране?
Re: C vs Java
Neznam mnogo Java - samo malki neshta moga da pisha,
C:
Predimstwa: Kompilatori ima za wsjaka platforma ili operacionna sistema. Naj-razpostranenia ezik za programirane. Sushtestwuwat kupishta biblioteki, materiali, knigi, uchebnitzi za ezika C. Standartiziran e. Ima preprocesor za C sus golemi wuzmozhnosti - no nared s tova vurwjat i problemi... wizh nedosttatuzi. C ima prost i jasen ABI (Application Binary Interface) - programi ili moduli pisani na C lesno mogat da se izwikat ot drugi ezitzi ili scriptopodobni takiva. Naprimer TCL, Perl, Java, Python sa chesti "izpolzwachi" na C napisan kod.
Nedostatutzi: Preprocesor - wupreki che tova e goljamo predimstwo, preprocesora sus wuzmozhnostta si da wkljuchwa (#include) drugi failove stava goljama prechka pri golemi proekti i sledene na modifikaciite (koj fail da se prekompilira - i koj ne). Tova vazhi za wsichki podobni ezitzi (C++ naprimer). W srawnie Borland Pascal generira .TPU failove ili .DCU w koito w dvoichen wid e zapisano, ot kakuv drug modul ili sors dadenia fail zawisi - i dali ima nuzhda ot prekompilatzia.
C++:
Predimstwa: Obektno orientirano programirane, shabloni (templates), modifikatori za tipa. STL - lesno i shablonno izpolzwane na chesto izpolzwani algorithmi (mapove, setove, hashove, list, arrays i prochie).
Nedostatutzi: sushtite kato predimstwata. Obektno orientiranoto programirane kutza sus wuzmozhnostta si da nasledjawash s multiple-inheritance, shablonite puk sus nerazbiraemostta na koda, a modifikatorite sus izcherpwaneto na wariantite (const func, ne-const func) za razlichni tipove funkcii. STL wupreki che e dobra na pruw pogled biblioteka e neudobna kogato se stigne do trasirane (debugwane) na programata, suvmestimost (ima 4-5 versii na STL) i lesna razbiraemost (koj metod, funckia trjabwa da se wika postojanno, koj ne) - osven tova chesto razlichnite versii na STL-a imat i razlichna slozhnost na njakoi ot algoritmite si. Naj-goljam nedostatuk na C++ e nejasnotata pri initializiraneto na modulite, i sushto ABI interfejsa (kak ot drug ezik, sreda da se izwika C++ funckia).
tirulirutatuutuu
C:
Predimstwa: Kompilatori ima za wsjaka platforma ili operacionna sistema. Naj-razpostranenia ezik za programirane. Sushtestwuwat kupishta biblioteki, materiali, knigi, uchebnitzi za ezika C. Standartiziran e. Ima preprocesor za C sus golemi wuzmozhnosti - no nared s tova vurwjat i problemi... wizh nedosttatuzi. C ima prost i jasen ABI (Application Binary Interface) - programi ili moduli pisani na C lesno mogat da se izwikat ot drugi ezitzi ili scriptopodobni takiva. Naprimer TCL, Perl, Java, Python sa chesti "izpolzwachi" na C napisan kod.
Nedostatutzi: Preprocesor - wupreki che tova e goljamo predimstwo, preprocesora sus wuzmozhnostta si da wkljuchwa (#include) drugi failove stava goljama prechka pri golemi proekti i sledene na modifikaciite (koj fail da se prekompilira - i koj ne). Tova vazhi za wsichki podobni ezitzi (C++ naprimer). W srawnie Borland Pascal generira .TPU failove ili .DCU w koito w dvoichen wid e zapisano, ot kakuv drug modul ili sors dadenia fail zawisi - i dali ima nuzhda ot prekompilatzia.
C++:
Predimstwa: Obektno orientirano programirane, shabloni (templates), modifikatori za tipa. STL - lesno i shablonno izpolzwane na chesto izpolzwani algorithmi (mapove, setove, hashove, list, arrays i prochie).
Nedostatutzi: sushtite kato predimstwata. Obektno orientiranoto programirane kutza sus wuzmozhnostta si da nasledjawash s multiple-inheritance, shablonite puk sus nerazbiraemostta na koda, a modifikatorite sus izcherpwaneto na wariantite (const func, ne-const func) za razlichni tipove funkcii. STL wupreki che e dobra na pruw pogled biblioteka e neudobna kogato se stigne do trasirane (debugwane) na programata, suvmestimost (ima 4-5 versii na STL) i lesna razbiraemost (koj metod, funckia trjabwa da se wika postojanno, koj ne) - osven tova chesto razlichnite versii na STL-a imat i razlichna slozhnost na njakoi ot algoritmite si. Naj-goljam nedostatuk na C++ e nejasnotata pri initializiraneto na modulite, i sushto ABI interfejsa (kak ot drug ezik, sreda da se izwika C++ funckia).
tirulirutatuutuu
Re: C vs Java
Java има малко общо със C, повече общо със C++.
Най-съществената разлика между Java и C/C++ е липсата на пойнтери, т.е. в Java не можеш да вземеш адреса на променлива. Това е едно от местата, където възникват най-много грешки при програмиране - излизане извън рамките на масив, използване на памет, която още не е алокирана, или вече е освободена. Идеята на Java е, че ако това не може да стане, програмите ще се пишат по-бързо, понеже по-малко време ще се налага да се отделя за debugging. За това обаче се заплаща с по-бавно време за изпълнение.
Друга разлика е наличието в Java на Garbage Collector(GC) - помагало за тези, които не знаят да броят. GC също спомага за по-бавното изпълнение, понеже при всяко включване обхожда всичката памет на програмата и избива кеша на процесора.
Трето, Java няма templates, които присъстват в C++ и които са може би най-голямото предимство на C++ пред C.
Четвърто, Java обикновено се компилира до т.нар. bytecode, който е машинно независим, вместо до обектен (машинен) код, макар че има и компилатори, които създават native код.
Пето, както malkia вече спомена, C и C++ са стандартизирани от не само от ANSI, но и от ISO, докато Sun се отказаха от първоначалната си идея да дадат Java за стандартизиране от ECMA. Това допълнително ги поставя в неизгодна позиция.
Най-съществената разлика между Java и C/C++ е липсата на пойнтери, т.е. в Java не можеш да вземеш адреса на променлива. Това е едно от местата, където възникват най-много грешки при програмиране - излизане извън рамките на масив, използване на памет, която още не е алокирана, или вече е освободена. Идеята на Java е, че ако това не може да стане, програмите ще се пишат по-бързо, понеже по-малко време ще се налага да се отделя за debugging. За това обаче се заплаща с по-бавно време за изпълнение.
Друга разлика е наличието в Java на Garbage Collector(GC) - помагало за тези, които не знаят да броят. GC също спомага за по-бавното изпълнение, понеже при всяко включване обхожда всичката памет на програмата и избива кеша на процесора.
Трето, Java няма templates, които присъстват в C++ и които са може би най-голямото предимство на C++ пред C.
Четвърто, Java обикновено се компилира до т.нар. bytecode, който е машинно независим, вместо до обектен (машинен) код, макар че има и компилатори, които създават native код.
Пето, както malkia вече спомена, C и C++ са стандартизирани от не само от ANSI, но и от ISO, докато Sun се отказаха от първоначалната си идея да дадат Java за стандартизиране от ECMA. Това допълнително ги поставя в неизгодна позиция.
Re: C vs Java
> preprocesora sus wuzmozhnostta si da wkljuchwa (#include) drugi failove stava goljama prechka pri golemi proekti i sledene na modifikaciite (koj fail da se prekompilira - i koj ne).
Da, bavno e, no vse pak stava. A na Java hich ne moje.
Da, bavno e, no vse pak stava. A na Java hich ne moje.
Re: C vs Java
tova naprimer e spunka za nashia proekt - pulna rekompilatzia na proekta ni e 45 minuti....
smjana na local_user.h (kojto se includwa ot wsjakude) samo za drebni neshta i gledaj kvo stava....
no ot druga strana - ima problemi koito bez preprocesora se reshawat mnogo tromavo...
Naprimer ASSERT(), CHECK(), PRINT() i raznite tam podobni helperski macrosi - wuw Release w nikakuw sluchai ne trjabwa i da ima pomen ot tjah - purwo che mozhe da ne uspee prilozhenieto ti da mine dadeni Technical Requirments, wtoro che shte wurshi izlizshna rabota, koda shte e po-goljam i posledno - dosta po-baven.
Sushto e dobre che mozhe specialno per user da si ima specifichen koda (naprimer #ifdef USER_MALKIA... blah blah.... #endif)....
Wsichko tova e prekrasno, a za ostanalite kenefa e vdjasno... kakto peeshe edin rapar... obache....
Tova zabavja kompilatziata strashno mnogo - che dazhe dosadno...
hmmm.... i osven wsichko tova e nekaksi trudno i nevinagi tochno kogato stava duma za "buildwane na dependancitata" (mallee kak zwuchi - ako ma chue Petur Berona - takava drasnipaliklechica she me upari zad ushite)...
tirulirutatuutuu
smjana na local_user.h (kojto se includwa ot wsjakude) samo za drebni neshta i gledaj kvo stava....
no ot druga strana - ima problemi koito bez preprocesora se reshawat mnogo tromavo...
Naprimer ASSERT(), CHECK(), PRINT() i raznite tam podobni helperski macrosi - wuw Release w nikakuw sluchai ne trjabwa i da ima pomen ot tjah - purwo che mozhe da ne uspee prilozhenieto ti da mine dadeni Technical Requirments, wtoro che shte wurshi izlizshna rabota, koda shte e po-goljam i posledno - dosta po-baven.
Sushto e dobre che mozhe specialno per user da si ima specifichen koda (naprimer #ifdef USER_MALKIA... blah blah.... #endif)....
Wsichko tova e prekrasno, a za ostanalite kenefa e vdjasno... kakto peeshe edin rapar... obache....
Tova zabavja kompilatziata strashno mnogo - che dazhe dosadno...
hmmm.... i osven wsichko tova e nekaksi trudno i nevinagi tochno kogato stava duma za "buildwane na dependancitata" (mallee kak zwuchi - ako ma chue Petur Berona - takava drasnipaliklechica she me upari zad ushite)...
tirulirutatuutuu
Re: C vs Java
V Java nyama kak da se build-nat dependency-tata. Na po-golyam proekt (razbiray - poveche ot 1 chovek i sled merge na promenite ot kolegite) si e meko kazano nevyzmojno da precenish dali shte minesh samo s rebuild na promenenite faylove. I zatova - yako pylen rebuild, inache riskuvash razni psevdobugcheta da ti izkochat, i da se chudish otde sa, a to ot izostanali class faylove, problemi s run-time svyrzvaneto i etc.
Predpochitam ideologiyata na C s headerite - tam pone moje da se preceni tochno kakvo tryabva da se rebuild-ne, i da si spokoyn - shtesh/ne shtesh - tfa e :-))) I build-time svyrzvaneto e edna dopylnitelna proverka. A Java - shtesh/ne shtesh - pylen rebuild.
Predpochitam ideologiyata na C s headerite - tam pone moje da se preceni tochno kakvo tryabva da se rebuild-ne, i da si spokoyn - shtesh/ne shtesh - tfa e :-))) I build-time svyrzvaneto e edna dopylnitelna proverka. A Java - shtesh/ne shtesh - pylen rebuild.
Re: C vs Java
hmm.. ne go znaeh tova - az predpolagah che problema tam e reshen. Taka li e sus C#-a? sushto - az samo ot integriranata sreda sum kompiliral i malki sorscheta pod linux - no bez da stupwam po-nadulboko....
tirulirutatuutuu
tirulirutatuutuu
Re: C vs Java
какво точно се счита обектно програмиране? готови класове и templates?
в такъв случай не е ли възможно да се прилагат подобни неща и в C като се дефинират библиотеки?
в такъв случай не е ли възможно да се прилагат подобни неща и в C като се дефинират библиотеки?
Редактирано от radobg на
Re: C vs Java
Klasovete sa obektno orientirano programirane. Teplates kato takiva niamat nishto obshto s obektite, mojesh da imash template i na funkcia. To templates sa konceptualno po-blizki do preprocesor.
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
Re: C vs Java
Ami nali v CLR uj ima palna informacia za dependency na klasovete - tia ne e li dostatachna da se opredeli koe da se rebuildne?
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
Re: C vs Java
imenno - no nali sushtata ja ima i w javata - kogato zadawash "import"... ta za tova se chudih... w C# using
tirulirutatuutuu
tirulirutatuutuu
Re: C vs Java
OOP se swezhda do tam - che potrebitelja ne znae za wutreshnata implementatzia na daden obekt, no znae aparat za suzdawaneto, upravlenieto i unishtozhawaneto mu (new, function members, delete). Po tozi nachin wmesto da wikash funckii i da im podawash obekt - ti prosto izpolzwash obekt, kato wikash negovi funckii...
No tova ne e wsichko, ponjakoga ti se nalaga da wikash edni i sushti funckii, no na razlichni obekti - OOP ti dawa wuzmozhnost tova da go realizirash elegantno bez da pishesh mnogo kod. Naprimer - po wreme na voina - predstawi si che komandwashtia dava "PULEN NAPRED" kato komanda - kum wsichki obekti (tankove, pehotinci, motoristi, sekwi tam). Wseki ot tjah ima "funckia" PULEN_NAPRED - no e s razlichna wutreshna realizatzia - wazhnoto e che ima edin obsht metod razbiraem za wsichki obekti.
C++ ti dawa wuzmozhnost sushto da postrojawash hierarchia i nasledjawane na klasovete ot koito sa obektite ti. Naprimer PEHOTINETZ, RPG9, SWURZOCHNIK, KARTECHAR wsichki mogat da se nasledjat ot edin klas - t.e. kogato sa bili w armiata - te wsichkite sa hodili na edni i sushti zanimania kak da hodjat NAPRED - dokato TANKISTITE, BRONETRANSPORTJORITE sa gi uchili kak da hodjat NAPRED upravljavajki mashinata... T.e. purwite mozhe da gi prichislish kum obsht klas "PEHOTNI", wtorite "MOBILNI" - i funckiata realizirashtat ti PULEN_NAPRED e nuzhno da ja realizirash samo za klasa PEHOTNI, ne za wseki PEHOTINETZ, RPG9, SWURZOCHNIK, KARTECHAR... Po-kusno poslednite chetiri prosto shte nasledjat PEHOTNI, i eventualno shte realizirat drugi specifichni funckii.
Ima dosta po-dobri primeri w knigite.... tam sus cvetja, zhivotni, zool gradini, shapki...
Cheti cheti :) :)
tirulirutatuutuu
No tova ne e wsichko, ponjakoga ti se nalaga da wikash edni i sushti funckii, no na razlichni obekti - OOP ti dawa wuzmozhnost tova da go realizirash elegantno bez da pishesh mnogo kod. Naprimer - po wreme na voina - predstawi si che komandwashtia dava "PULEN NAPRED" kato komanda - kum wsichki obekti (tankove, pehotinci, motoristi, sekwi tam). Wseki ot tjah ima "funckia" PULEN_NAPRED - no e s razlichna wutreshna realizatzia - wazhnoto e che ima edin obsht metod razbiraem za wsichki obekti.
C++ ti dawa wuzmozhnost sushto da postrojawash hierarchia i nasledjawane na klasovete ot koito sa obektite ti. Naprimer PEHOTINETZ, RPG9, SWURZOCHNIK, KARTECHAR wsichki mogat da se nasledjat ot edin klas - t.e. kogato sa bili w armiata - te wsichkite sa hodili na edni i sushti zanimania kak da hodjat NAPRED - dokato TANKISTITE, BRONETRANSPORTJORITE sa gi uchili kak da hodjat NAPRED upravljavajki mashinata... T.e. purwite mozhe da gi prichislish kum obsht klas "PEHOTNI", wtorite "MOBILNI" - i funckiata realizirashtat ti PULEN_NAPRED e nuzhno da ja realizirash samo za klasa PEHOTNI, ne za wseki PEHOTINETZ, RPG9, SWURZOCHNIK, KARTECHAR... Po-kusno poslednite chetiri prosto shte nasledjat PEHOTNI, i eventualno shte realizirat drugi specifichni funckii.
Ima dosta po-dobri primeri w knigite.... tam sus cvetja, zhivotni, zool gradini, shapki...
Cheti cheti :) :)
tirulirutatuutuu
Re: C vs Java
> какво точно се счита обектно програмиране? готови класове и templates?
Не ми се повтарят дефинициите от книгите, нито мога да дам по-добри.
> в такъв случай не е ли възможно да се прилагат подобни неща и в C като се дефинират библиотеки?
Напълно е възможно (и често се прави) да програмираш обектно-ориентирано, без това да е предвидено в езика. Gtk+ библиотеката (написана на C) е един добър пример. ОО езиците просто улесняват (а в случая с Java и принуждават) ООП, понеже имат вградени средства за това. В C не можеш истински да скриеш променливите от дадена структура - от програмиста, който ги ползва зависи да спазва самодисциплина и да използва интерфейсните функции, които си предоставил, вместо директно да манипулира данните.
Не ми се повтарят дефинициите от книгите, нито мога да дам по-добри.
> в такъв случай не е ли възможно да се прилагат подобни неща и в C като се дефинират библиотеки?
Напълно е възможно (и често се прави) да програмираш обектно-ориентирано, без това да е предвидено в езика. Gtk+ библиотеката (написана на C) е един добър пример. ОО езиците просто улесняват (а в случая с Java и принуждават) ООП, понеже имат вградени средства за това. В C не можеш истински да скриеш променливите от дадена структура - от програмиста, който ги ползва зависи да спазва самодисциплина и да използва интерфейсните функции, които си предоставил, вместо директно да манипулира данните.
Re: C vs Java
Osven tova za da programirash obektno na neobekten ezik triabva da si presazdadesh strukturata na virtualnite tablici (izpolzvani za virtualnite funkcii), da mislish za takiva neshta kato mnojestveno naslediavane i t.n. ... i da si gi pishesh sam. To che mogat da se pootdeliat v biblioteka mogat, ama tvoia kod pak shte e po-goliam. Mojesh da si igraesh s makrosi da napodobiavash neshtata ... no mai niama smisal.
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
НЕ МЕ ЕБЕ КАК Е ВУТЕ, АЗ ГЛЕДАМ ДА СЪМ ДОБРЕ
Re: C vs Java
Toz import gleda class faylovete, a ne source-a. Tam e problemyt. Da rechem, build-nal si proekta. Kolegata ti e mahnal veche nyakakyv klas (kato source). Ti obache go izpolzvash nyakyde v tvoyte source-ove. Update-vash (ot CVS, sys VSS malko tochno ne stava taka :-). Build-vash (no ne re-) i vsichko e... OK, shtoto class faylyt za tozi klas si ti stoi ot predishen build. Dokato ne commit-nesh, i kolegata ti posle ne update-ne. Tova e nay-malkiya primer.
Dependency-tata tryabva da se opredelyat vyz osnova na source-a, no v Java tova e ekvivalentno na pylen rebuild.
Dependency-tata tryabva da se opredelyat vyz osnova na source-a, no v Java tova e ekvivalentno na pylen rebuild.
Re: C vs Java
Щом си начинаещ по-добре почни с ПАСКАЛ. Създаден е точно за тази цел, а откакто излезе Delphi се доближава по полезност до С/С++.
Между другото С/С++ са на по-ниско ниво от JAVA, тоест ако не ти е ясно какво става при изпълнението на програмата, по-лесно ще програмираш на JAVA.
Е това си е мое мнение.....
Аз съм!
Между другото С/С++ са на по-ниско ниво от JAVA, тоест ако не ти е ясно какво става при изпълнението на програмата, по-лесно ще програмираш на JAVA.
Е това си е мое мнение.....
Аз съм!
Re: C vs Java
Не програмирам на C/C++ и затова едва ли моето мнение ще ти помогне много, ноимам много познати, които досега са се занимавали основно със C и вече работят доста и с Java. Java е подходяща програмиране от страна на сървъра, а както някой беше казал във форумите - C/C++ - waste of time for web development. Иначе излезе на хоризонта се появява нещо ново - .Net платформата на Microsoft. За нея можеш да програмираш и на C#. Колкото за desktop програмиране, по-добре ще е да те упъти някой друг в този форум, който се занимава с това, но определено за начинаещ е по-добре да започнеш с Java, отколкото със C++. И Паскал е добра идея, но само доколкото да навлезеш в материята.
Успех.



Успех.
Re: C vs Java
Opredeleno Java e mnogo po dobre ot kolkoto C - az naprimer tyrsia veche tri dni che i poveche i niama edin server ili pone edin client rabotesht pod windows - i da e prost che da razbera kak se pishe takova neshto - i kato gledam mnogo ot programistite ne znaiat kak se pravi taqkova neshto - a to stava sys WinSock biblioteka ama tova koeto namerih e za Linux i za windows ne uspiah da go podkaram vypreki che avtora beshe obiasnil koe kakvo - prosto C i C++ si umriaha ne stavat za rabota novoto vreme iziskva zhertvi.
Re: C vs Java
> prosto C i C++ si umriaha ne stavat za rabota novoto vreme iziskva zhertvi.
Да бе, те на Microsoft сървърите все на Java са писани. Ти пък намери един пример...
Да бе, те на Microsoft сървърите все на Java са писани. Ти пък намери един пример...
Re: C vs Java
Baba ti iska jertvi :-)))
I moeto pyrvo zapoznanstvo s BSD sockets beshe pod Windows, i az polzvah primer za UNIX. Ama za 1-2 chasa si podkarah daje elementarno FTP klientche. Na drugiya den absolyutno syshtiya source se kompilirashe (che i vyrveshe :-) i pod Linux s gcc - 1-2 #ifdef-a samo.
Kaji mi druga prichina da se prisyedniya kym t.nar. "novo vreme" (tozi izraz mi namirisva na izkufyal starec :-), s tova ne me ubedi :-)
I moeto pyrvo zapoznanstvo s BSD sockets beshe pod Windows, i az polzvah primer za UNIX. Ama za 1-2 chasa si podkarah daje elementarno FTP klientche. Na drugiya den absolyutno syshtiya source se kompilirashe (che i vyrveshe :-) i pod Linux s gcc - 1-2 #ifdef-a samo.
Kaji mi druga prichina da se prisyedniya kym t.nar. "novo vreme" (tozi izraz mi namirisva na izkufyal starec :-), s tova ne me ubedi :-)