Ambayo ni bora Java au C Sharp. Maneno muhimu maalum. Alama na sifa maalum

Sintaksia

Lugha zote mbili hutumia lugha ya programu C kama msingi wa kisintaksia. Hasa, walirithi kutoka kwayo bila mabadiliko:

  • kuashiria mwanzo / mwisho wa block ya kificho na braces curly;
  • nukuu, ushirika na utangulizi wa shughuli nyingi zilizojengwa ndani (mgawo, hesabu, mantiki, kidogo, shughuli za kuongeza/punguza, opereta wa masharti ya mwisho " ?: »);
  • syntax ya kuelezea na kutumia vigezo na kazi (kuagiza "jina la aina", matumizi ya marekebisho, mabano ya lazima kwa kazi, maelezo ya vigezo rasmi);
  • syntax ya miundo yote ya msingi: operator wa masharti, loops, operator nyingi za uchaguzi;
  • ukosefu wa taratibu (zinabadilishwa na kazi za aina ya utupu);
  • majina ya aina za msingi zilizojengwa (isipokuwa kwa bool, katika Java aina hii inaitwa boolean);
  • kwa kutumia semicolon
  • ... na vipengele vingi vidogo.

Yote hii inaongoza kwa ukweli kwamba programu katika Java na C # mwanzoni zinaonekana sawa na programu za C. Lugha zote mbili zimeongeza upanuzi na nyongeza sawa kwa C (au C++), haswa, alfabeti imepanuliwa na syntax yao wenyewe imeanzishwa ambayo inasaidia vifurushi, kuagiza maelezo, na kufafanua vitengo vya ujumuishaji.

Pia kuna tofauti nyingi za kisintaksia.

Sintaksia Java C#
Inaleta majina tuli
(kuagiza tuli)
hukuruhusu kuagiza kando baadhi au njia zote tuli na anuwai za darasa na kutumia majina yao bila sifa katika moduli ya kuagiza. Kikusanyiko pekee ndicho kinacholetwa na kila wakati unapotumia majina tuli yaliyoingizwa lazima ubainishe darasa
Mara kwa mara katika kubadili kauli lazima iwe nambari kamili au aina ya enum (katika 1.7, maandishi ya mfuatano yaliongezwa kwenye orodha ya aina) unaweza kutumia mistari ya maandishi
goto operator waliachana na matumizi ya goto kimakusudi, hata hivyo, kuna utaratibu unaokuruhusu kutoka kwa kitanzi cha nje kutoka kwa kiota kwa kuiweka alama kwa lebo na kutumia mapumziko na kuendelea na waendeshaji pamoja na lebo (endelea<метка>;) goto imesalia, matumizi yake ya kawaida ni kupitisha udhibiti kwa lebo tofauti za kesi katika taarifa ya kubadili na kuondoka kwenye kitanzi kilichowekwa.
Mara kwa mara Hakuna viboreshaji kama hivyo; badala yake, anuwai za darasa tuli na kirekebishaji cha mwisho hutumiwa - athari ya matumizi yao ni sawa. dhana tofauti ya jina lililochapishwa mara kwa mara na neno kuu la const
Usahihi wa sehemu ya kuelea Java inajumuisha muundo mkali wa fp ambao unahakikisha matokeo sawa ya sehemu zinazoelea kwenye mifumo yote. C # inategemea utekelezaji; hakuna hakikisho la matokeo sawa ya hesabu.
Inalemaza hundi Katika Java, ukaguzi wote unaobadilika huwashwa/kuzimwa tu katika kiwango cha kifurushi C# ina miundo iliyochaguliwa na ambayo haijachaguliwa ambayo inakuruhusu kuwezesha au kuzima ukaguzi wa hesabu unaobadilika.

Kwa ujumla, syntax ya C # ni pana zaidi na tajiri zaidi kuliko Java; haswa, ina sifa kama vile uwezo wa kugawa maelezo ya darasa moja katika moduli kadhaa, maelezo ya mali, na uwezo wa kudhibiti ukweli. mbinu.

Utaratibu wa kufanya kazi na data ya nguvu na ukusanyaji wa takataka

Lugha zote mbili hutumia modeli sawa ya kufanya kazi na data inayobadilika: vitu huundwa kwa nguvu kwa kutumia muundo mpya, wakati wa kukimbia hufuatilia uwepo wa marejeleo kwao, na mtoza takataka mara kwa mara husafisha kumbukumbu ya vitu ambavyo havina marejeleo. Ili kuongeza mkusanyiko wa takataka, maelezo ya lugha na mazingira ya wakati wa kukimbia hayana vizuizi juu ya maisha ya kitu baada ya kumbukumbu ya mwisho kufutwa - mtoza hufanya kazi kwa uhuru wa utekelezaji wa programu, kwa hivyo uharibifu halisi wa kifaa. kitu kinaweza kutokea wakati wowote baada ya rejeleo la mwisho kufutwa hadi programu ikome. Kwa kweli, watoza takataka huongeza utekelezaji ili kuhakikisha utumiaji wa kumbukumbu unaokubalika huku wakipunguza kasi ya programu.

C# (kwa usahihi zaidi, muda wa matumizi wa lugha ya kawaida) hukuruhusu kukandamiza utekelezaji wa kikamilishaji kwenye kitu fulani kwa kutumia mbinu ya GC.SuppressFinalize(obj) (kwa mfano, muunganisho wa SQL kwenye mkondo wa faili). Hii inaweza kuwa muhimu kwa sababu ukamilishaji unachukuliwa kuwa operesheni ya gharama kubwa katika ukusanyaji wa takataka, na kitu kilicho na kikamilisha kitaishi muda mrefu zaidi.

Zana za Kitu

Aina za Enum

Katika Java, kwa kusema madhubuti, safu za sura moja tu zinaweza kutangazwa. Safu ya multidimensional katika Java ni safu ya safu. C# ina safu za kweli za pande nyingi na safu za safu, ambazo kwa kawaida huitwa "jagged" katika C #. Mipangilio ya multidimensional daima ni "mstatili" (ikizungumza katika istilahi ya pande mbili), wakati safu za safu zinaweza kuhifadhi nyuzi za urefu tofauti (tena katika kesi ya pande mbili, sawa katika kesi ya pande nyingi). Mipangilio ya mielekeo mingi huharakisha ufikiaji wa kumbukumbu (ambayo kielekezi hakirejelewi mara moja tu), ilhali safu nyororo ni polepole lakini huhifadhi kumbukumbu wakati si safu mlalo zote zimejaa. Safu nyingi zinahitaji simu moja tu kuunda mwendeshaji mpya, na zilizolegea zinahitaji kugawa kumbukumbu kwa uwazi katika kitanzi kwa kila mstari.

Aina za parameterized (generic).

Katika lugha zote mbili, aina zinaweza kuainishwa, ambayo inasaidia dhana ya utayarishaji wa kawaida. Kwa kweli, ufafanuzi wa aina ni karibu kabisa - katika lugha zote mbili hurithiwa kutoka kwa templeti za C ++, ingawa na marekebisho kadhaa.

Jeni za aina katika Java ni muundo wa lugha na hutekelezwa tu kwenye mkusanyaji. Mkusanyaji hubadilisha aina zote za kawaida na mipaka yao ya juu na kuingiza aina zinazofaa popote aina ya vigezo inatumiwa. Matokeo yake ni bytecode ambayo haina marejeleo ya aina za jumla na vigezo vyake. Mbinu hii ya kutekeleza aina za generic inaitwa aina ya kufuta(aina ya ufutaji). Hii ina maana kwamba maelezo kuhusu aina asilia hayapatikani wakati wa utekelezaji, na inaweka vikwazo fulani, kama vile kutokuwa na uwezo wa kuunda matukio mapya ya mkusanyiko kutoka kwa hoja za aina za jumla. Jumatano Utekelezaji wa Java Sijui mfumo wa aina ya kawaida, ndiyo sababu utekelezaji mpya wa JVM ulihitaji sasisho ndogo tu ili kufanya kazi na muundo mpya wa darasa.

C# ilipitia njia tofauti. Usaidizi wa jumla umeunganishwa katika mazingira virtual utekelezaji, ikionekana kwanza katika .NET 2.0. Lugha hapa imekuwa kiolesura cha nje tu cha kufikia uwezo huu wa mazingira. Kama ilivyo kwa Java, mkusanyaji hufanya ukaguzi wa aina tuli, lakini kwa kuongezea hii, JIT hufanya ukaguzi wa usahihi wa wakati wa mzigo. Taarifa kuhusu aina za jenereta zinapatikana kikamilifu wakati wa utekelezaji na inaruhusu usaidizi kamili wa kuakisi aina za jumla na kuunda utekelezaji mpya wa aina hizo.

Mbinu ya Java inahitaji hundi za ziada wakati wa utekelezaji, haihakikishi kuwa mteja wa msimbo atafuata mawasiliano ya aina, na haitoi tafakari ya aina za jumla. Java hairuhusu aina za generic kuwa maalum na aina za zamani (hii inaweza tu kufanywa kwa kuifunga aina za zamani katika madarasa), wakati C # hutoa jumla kwa aina zote mbili za kumbukumbu na thamani, pamoja na za kwanza. Badala yake, Java inapendekeza kutumia aina za primitive kama vigezo (mfano List badala ya Orodha ), lakini hii inakuja kwa gharama ya ugawaji wa kumbukumbu ya nguvu. Katika Java na C #, utaalam wa aina ya jumla juu ya aina tofauti za marejeleo hutoa nambari sawa, lakini kwa C #, wakati wa kukimbia hutoa nambari iliyoboreshwa wakati wa utaalam wa aina za thamani (kwa mfano, Orodha. ), ambayo huwawezesha kuhifadhiwa na kuondolewa kwenye vyombo bila kupakia na kufungua shughuli.

Ushughulikiaji wa Tukio

Java inahitaji mpangaji programu kutekeleza kiolezo muundo wa mwangalizi, ingawa hutoa sukari ya kisintaksia katika mfumo wa madarasa yaliyowekwa kiota, ambayo hukuruhusu kufafanua mwili wa darasa na kuisisitiza mara moja katika sehemu moja ya msimbo.

C# hutoa usaidizi wa kina wa kiwango cha lugha kwa upangaji wa hafla, ikijumuisha wajumbe wa .NET, utumaji anuwai, sintaksia maalum ya kuweka matukio katika madarasa, shughuli za kusajili na kubatilisha usajili wa vidhibiti vya matukio, uwasilishaji wa majukumu, na mbinu zisizojulikana zenye semantiki kamili za kufungwa.

Kufungwa kunapendekezwa kujumuishwa katika Java SE 8. Kufungwa huku, kama wajumbe katika C#, kungekuwa ufikiaji kamili kwa anuwai zote za ndani katika wigo fulani, badala ya kusoma tu ufikiaji wa vigeu vilivyowekwa alama ya mwisho (kama ilivyo kwa madarasa yasiyojulikana).

Upakiaji mwingi wa operesheni

Mali

C# inasaidia dhana ya "sifa" - nyanja za uwongo za darasa zinazofikiwa kwa njia inayodhibitiwa kikamilifu kwa kuunda mbinu za kupata na kuandika thamani ya uga. Matangazo ya mali hufanywa kwa kutumia get and set constructs.

C # pia inajumuisha kitu kinachoitwa indexers, ambayo inaweza kuchukuliwa kuwa kesi maalum ya overloading operator (sawa na overloading operator katika C ++), au mali parameterized. Kielezo ni sifa inayoitwa hii ambayo inaweza kuwa na vigezo moja au zaidi (faharisi), na faharisi zinaweza kuwa za aina yoyote. Hii hukuruhusu kuunda madarasa ambayo hali zao zinafanya kama safu:

Orodha Yangu[ 4] = 5; jina la kamba = xmlNode. Sifa["jina"]; orders = customerMap[ theCustomer] ;

Utumiaji wa mali haukubaliki na watengenezaji programu wengine mashuhuri. Hasa, Jeffrey Richter anaandika:

"Binafsi, sipendi sifa na ningefurahi kuona usaidizi kwao ukiondolewa kwenye Mfumo wa Microsoft .NET na lugha zinazohusiana za programu. Sababu ni kwamba mali inaonekana kama uwanja lakini ni njia.

Kufuatia mtindo wa kawaida wa kumtaja C#, majina ya mali yanatofautishwa kimuonekano na majina ya sehemu kwa kuwa huanza na herufi kubwa.

Mkusanyiko wa masharti

C#, tofauti na Java, inasaidia ujumuishaji wa masharti kwa kutumia maagizo ya kichakataji awali. Pia ina sifa ya Masharti, ambayo ina maana kwamba njia maalum inaitwa tu wakati mkusanyiko uliotolewa wa mara kwa mara umefafanuliwa. Kwa njia hii, unaweza kuingiza kwenye msimbo, kwa mfano, hundi za uthibitisho, ambazo zitafanya kazi tu katika toleo la utatuzi wakati DEBUG mara kwa mara inafafanuliwa. Katika maktaba ya kawaida ya NET, hii ndiyo mbinu ya Debug.Assert().

Matoleo ya Java 1.4 na baadaye hujumuisha uwezo wa wakati wa utekelezaji wa kukagua kwa kukisia katika lugha. Kwa kuongeza, ikiwa miundo yenye hali ya mara kwa mara inaweza kupanuliwa kwa wakati wa kukusanya. Kuna utekelezwaji wa wahusika wengine wa wasindikaji wa awali wa Java, hutumiwa kimsingi wakati wa kuunda programu za vifaa vya rununu.

Nafasi za majina, mikusanyiko, vifurushi

C # hutumia nafasi za majina(nafasi ya jina), kukumbusha utaratibu wa C++ wa jina moja. Kila darasa ni la nafasi ya majina; madarasa yale ambayo nafasi ya majina haijabainishwa wazi ni ya nafasi ya majina isiyo na jina kwa chaguomsingi. Nafasi za majina zinaweza kuwekwa ndani ya kila moja.

Java ina vifurushi, kwa kiasi fulani sawa na C# nafasi za majina. Vifurushi vinaweza kupangwa, kila darasa lililoelezewa ni la kifurushi fulani; kwa kukosekana kwa dalili wazi ya kifurushi, darasa ni la kifurushi cha kimataifa kisicho na jina.

Katika lugha zote mbili, ili kufikia kipengee kilichotangazwa katika nafasi ya jina au kifurushi kingine, lazima utangaze kifurushi kinachohitajika (nafasi ya jina) katika programu kuwa kinatumika. Kitu kinapatikana kupitia jina linalostahiki; jina la kifurushi (nafasi ya jina) hutumiwa kama mhitimu. Ikiwa ufikiaji wa kitu bila kufuzu unahitajika, moduli ya programu lazima iwe na maagizo ya kukataa: kutumia katika C # na kuagiza katika Java.

Katika C #, nafasi za majina hazihusiani kwa njia yoyote na moduli zilizokusanywa (mikusanyiko, au mkusanyiko katika istilahi za Microsoft). Mikusanyiko mingi inaweza kuwa na nafasi sawa ya majina, na kusanyiko moja linaweza kutangaza nafasi nyingi za majina, si lazima ziwekwe. Marekebisho ya wigo ya C # hayana uhusiano wowote na nafasi za majina. Katika Java, madarasa yaliyotangazwa kwenye kifurushi sawa na chaguo-msingi huunda moduli moja iliyokusanywa. Kirekebishaji cha wigo chaguo-msingi (hakuna vipimo wazi) huweka mipaka ya upeo wa sehemu na mbinu za darasa kwa mipaka ya kifurushi.

Katika Java, muundo wa faili na saraka za msimbo wa chanzo wa kifurushi ni kwa msingi unaohusishwa na muundo wa kifurushi - kifurushi kinalingana na saraka, vifurushi vidogo vilivyojumuishwa ndani yake - subdirectories za saraka hii, faili za chanzo ziko kwenye saraka. sambamba na kifurushi au kifurushi kidogo ambamo zimejumuishwa. Kwa hivyo, mti wa chanzo hufuata muundo wa kifurushi. Katika C #, eneo la faili na maandishi asilia haina uhusiano wowote na nafasi yake ya majina.

Mahali pa maandishi chanzo katika faili

Katika C #, madarasa yanaweza kupatikana katika faili kwa njia yoyote. Jina la faili ya msimbo wa chanzo halihusiani na majina ya madarasa yaliyofafanuliwa ndani yake. Inaruhusiwa kuweka madarasa kadhaa ya umma katika faili moja. Tangu toleo la 2.0, C # pia hukuruhusu kugawa darasa katika faili mbili au zaidi (neno kuu la sehemu). Kipengele cha mwisho kinatumiwa kikamilifu na zana za kuona za kuunda kiolesura: sehemu ya darasa ambayo ina uwanja na njia zinazodhibitiwa na mjenzi wa kiolesura imeangaziwa ndani. faili tofauti, ili usichanganye faili iliyohaririwa moja kwa moja na programu na nambari inayozalishwa kiotomatiki.

Katika Java, kila faili inaweza kuwa na darasa moja tu la umma, na Java inahitaji jina la faili kuwa sawa na jina la darasa hilo, kuondoa mkanganyiko kati ya faili na majina ya darasa. Zaidi ya hayo, kwa mujibu wa mkataba wa usimbaji uliopendekezwa na Sun, saizi ya faili ya msimbo wa chanzo haipaswi kuzidi mistari 2000 ya msimbo, kwani faili kubwa ni ngumu zaidi kuchanganua. Ukubwa mkubwa faili pia inachukuliwa kuwa ishara ya uamuzi mbaya wa muundo.

Vighairi

Lugha zote mbili zinaunga mkono utaratibu wa utunzaji wa kipekee, iliyoundwa kisintaksia kwa njia ile ile: lugha ina opereta wa kizazi cha kipekee. kutupa na kizuizi cha ushughulikiaji cha ubaguzi jaribu()kamata()()mwishowe(), ambayo inahakikisha kuzuiliwa kwa vighairi vinavyotokea ndani ya kizuizi, usindikaji wao, na utekelezaji uliohakikishwa wa vitendo vya mwisho.

Java inaauni vighairi vilivyoangaliwa: kipanga programu lazima kibainishe kwa kila njia aina za vighairi ambavyo mbinu inaweza kutupa, aina hizi zimeorodheshwa katika tamko la mbinu baada ya neno kuu la kutupa. Iwapo njia itatumia mbinu ambazo hutupa vighairi vilivyoangaliwa, ni lazima iguse kando hizo zote au iwe nazo katika tamko lake yenyewe. Kwa hivyo, msimbo una orodha ya tofauti ambazo zinaweza kutupwa kwa kila njia. Daraja la aina zisizofuata kanuni pia lina aina mbili (RuntimeException na Error), ambazo vizazi vyao hazijaangaziwa na hazifai kuelezewa. Zimehifadhiwa kwa vighairi vya wakati wa utekelezaji ambavyo vinaweza kutokea popote au kwa kawaida haviwezi kushughulikiwa na kitengeneza programu (kama vile hitilafu za wakati wa kutekeleza), na haipaswi kubainishwa katika tamko la kutupa.

C# haitumii vighairi vilivyoteuliwa. Kutokuwepo kwao ni chaguo la makusudi la watengenezaji. Anders Hejlsberg, mbunifu mkuu wa C #, anaamini kwamba katika Java walikuwa kwa kiasi fulani majaribio na hawakujihalalisha wenyewe.

Programu sambamba

Kwa ujumla, mifumo ya programu sambamba katika C # ni sawa na ile iliyotolewa na Java, tofauti iko katika maelezo ya utekelezaji. Katika visa vyote viwili, kuna Thread ya darasa la maktaba inayotekelezea wazo la "nyuzi". Java hutoa njia mbili za kuunda nyuzi zako mwenyewe: ama kwa kupanua darasa la Thread au kwa kutekeleza kiolesura cha Runnable. Katika visa vyote viwili, mpangaji programu lazima afafanue njia iliyorithiwa (iliyojumuishwa kwenye kiolesura) run() iliyo na mwili wa uzi - msimbo ambao utatekelezwa ndani yake. C # badala yake hutumia utaratibu wa mjumbe: kuunda uzi, mfano wa darasa la kawaida la Thread huundwa, ambalo mjumbe aliye na njia - mwili wa uzi - hupitishwa kama parameta ya mjenzi.

Lugha zote mbili zina uwezo wa kuunda kizuizi cha msimbo kilichotekelezwa kwa usawa; katika Java hii inafanywa kwa kutumia synchronized() operator, katika C # - na lock() operator. Java pia hukuruhusu kutangaza njia zinazolandanishwa kwa kutumia kirekebishaji kilichosawazishwa katika kichwa cha tamko la mbinu. Njia kama hizo, wakati wa kutekelezwa, huzuia kitu cha mmiliki wao (kwa hivyo, kwa njia zilizosawazishwa za darasa, kwa mfano huo huo, moja tu inaweza kutekelezwa kwa wakati mmoja, wengine watasubiri). Kipengele sawa katika .NET kinatolewa na sifa ya utekelezaji ya MethodImplAttribute MethodImplOptions.Synchronized, lakini tofauti na Java, kipengele hiki si sehemu rasmi ya lugha ya C#.

Lugha zote mbili pia hutoa vifaa vya usawazishaji vinavyofanana kulingana na kutuma na kusubiri ishara kutoka kwa nyuzi moja hadi nyingine. Katika Java hizi ni njia za arifa (), notifyAll() na wait() , katika C # hizi ni njia za Pulse(), PulseAll(), Wait() (njia hizo tatu zinafanya kazi sawa katika jozi). Tofauti pekee ni kwamba katika Java njia hizi (na, ipasavyo, utendaji wa mfuatiliaji) hutekelezwa katika darasa la Kitu, kwa hivyo hakuna maktaba za ziada zinazohitajika kwa maingiliano, na katika C # njia hizi zinatekelezwa kama njia za tuli katika Monitor ya darasa tofauti ya maktaba. . Katika C #, maktaba ya kawaida pia ina primitives ya ziada ya ulandanishi kwa ajili ya utekelezaji sambamba wa nyuzi: bubu, semaphores, saa za kusawazisha. Tangu toleo la 1.5, JDK SE imejumuisha vifurushi vya java.util.concurrent, java.util.concurrent.atomic na java.util.concurrent.locks vilivyo na seti ya kina ya zana za kutekeleza kompyuta sambamba.

Msimbo wa kiwango cha chini

Hadi sasa, hakuna sehemu Mazingira ya Java haijasawazishwa na Ecma, ISO, ANSI au nyingine yoyote mhusika wa tatu viwango. Wakati Sun Microsystems inabakiza haki zisizo na kikomo, za kipekee za kisheria za kurekebisha na kutoa leseni kwa chapa za biashara za Java, Sun kwa hiari yake hushiriki katika mchakato unaoitwa Java Community Process (JCP), ambao unaruhusu wahusika kupendekeza mabadiliko kwa teknolojia yoyote ya Sun Java (lugha, zana) , API) kupitia mashauriano na vikundi vya wataalam. Kwa sheria za JCP, pendekezo lolote la mabadiliko ya JDK, Java Runtime, au vipimo Lugha ya Java inaweza kukataliwa kwa upande mmoja na Sun kwa sababu inahitaji kura ya "ndiyo" kutoka kwa Sun ili kuidhinishwa. JCP inahitaji ada ya uanachama kutoka kwa wanachama wa kibiashara, wakati mashirika yasiyo ya faida na watu binafsi wanaweza kushiriki bila malipo.

Leseni

Ingawa "Java" ni chapa ya biashara ya Sun, na Sun pekee ndiye anayeweza kutoa leseni kwa jina "Java", kuna miradi mingi isiyolipishwa ambayo inaafikiana kwa kiasi na Sun Java. Kwa mfano, GNU Classpath na GNU Compiler ya Java (GCJ) hutoa maktaba ya darasa lisilolipishwa na mkusanyaji ambao kwa kiasi fulani unaweza kuendana na toleo la sasa Jua Java. Mwishoni mwa 2006, Sun ilitangaza kwamba msimbo wote wa chanzo cha Java, ukiondoa msimbo wa umiliki ambao hawana haki, ungetolewa kama programu isiyolipishwa chini ya leseni ya GPL iliyorekebishwa kufikia Machi 2007. Sun kwa sasa inasambaza Mashine yake ya Mtandaoni ya HotSpot na mkusanyaji wa Java chini ya Leseni ya GPL, lakini kwa sasa hakuna leseni isiyolipishwa ya muda wa kawaida wa utekelezaji wa Java . Kwa sababu Sun itahifadhi umiliki wa msimbo wake wa chanzo cha Java, kuitoa chini ya GPL hakutazuia Sun kusambaza matoleo ya Java yanayomilikiwa au ambayo hayajafunguliwa, au kuwapa wengine leseni.

C#, muda wa utekelezaji wa CLI, na maktaba nyingi za darasa husika zimesawazishwa na zinaweza kutekelezwa bila malipo bila leseni. Mifumo kadhaa ya bure ya C# tayari imetekelezwa, ikijumuisha Mono na DotGNU. Mradi wa Mono pia hutekeleza maktaba nyingi zisizo za kawaida za Microsoft kwa kujifunza kutoka kwa nyenzo za Microsoft, sawa na GNU Classpath na Java. Mradi wa Mono unalenga kuepuka kuingilia hataza au hakimiliki zozote, na mradi unaweza kusambazwa kwa uhuru na kutumiwa chini ya leseni ya GPL. Microsoft kwa sasa inasambaza -toleo la wakati wake wa NET kwa matumizi yasiyo ya kibiashara.

Matumizi

Jumuiya

Java imejengwa juu ya utamaduni wazi zaidi na makampuni yenye ushindani mkubwa katika maeneo mbalimbali ya utendaji. Maktaba nyingi za ziada zinapatikana chini ya leseni za chanzo huria bila malipo. msimbo wa chanzo. Sun pia inahimiza mazoezi ya kuelezea baadhi ya utendaji kama vipimo (angalia mchakato wa JCP), kuacha utekelezaji. watengenezaji wa chama cha tatu(ikiwezekana kutoa utekelezaji wa kumbukumbu). Kwa hivyo, suala la uhuru kutoka kwa mtengenezaji wa programu linatatuliwa.

Licha ya uwepo wa Mono, C # inawaunganisha kwa ukali watengenezaji kwenye jukwaa la Microsoft (pamoja na OS, suluhisho za ofisi). Kwa hivyo, mtumiaji wa programu iliyoandikwa katika NET mara nyingi hana chaguo katika kutumia vipengele mbalimbali vya mfumo. Hii inasababisha kinachojulikana kama muuzaji-locking, ambayo mtengenezaji wa programu ya tatu inaweza kuamuru karibu masharti yoyote kwa mnunuzi kwa ajili ya kusaidia mradi kutekelezwa. Wakati mtumiaji wa programu ya Java, kama sheria, anaweza kuchagua mtoaji wa programu ya ziada (kama vile hifadhidata, OS, seva ya programu, n.k.).

Umaarufu na maendeleo

Java ni kongwe kuliko C# na imejengwa kwa msingi mkubwa wa watumiaji, kuwa lugha ya kifaransa Katika nyingi maeneo ya kisasa sayansi ya kompyuta, hasa zile zinazohusisha mitandao. Java inatawala kozi za programu katika vyuo vikuu na vyuo vikuu vya Amerika, na sasa kuna fasihi nyingi zaidi kwenye Java kuliko kwenye C#. Ukomavu na umaarufu wa Java umesababisha maktaba na API nyingi zaidi katika Java (nyingi ambazo ni chanzo wazi) kuliko katika C #.

Tofauti na Java, C# ni lugha mpya. Microsoft ilisoma lugha zilizopo kama vile Java, Delphi, na Visual Basic, na kubadilisha baadhi ya vipengele vya lugha ili kukidhi mahitaji ya aina fulani za programu.

Ukosoaji mmoja unaoweza kusikika kuhusu Java ni kwamba ni polepole kukuza na haina baadhi ya vipengele vinavyorahisisha mifumo na mbinu za utayarishaji za mtindo. Ukosoaji wa lugha ya C# ni kwamba wasanidi programu wake wanaweza kuwa na hamu sana ya kushughulikia mitindo ya sasa ya utayarishaji kwa gharama ya umakini na urahisi wa lugha. Ni wazi kwamba wabunifu wa Java wamechukua mbinu ya kihafidhina zaidi ya kuongeza vipengele vipya kwenye sintaksia ya lugha kuliko lugha nyinginezo za kisasa—labda kutotaka kuelekeza lugha hiyo kwa mienendo ambayo inaweza kusababisha matokeo yasiyofaa baadaye. Pamoja na kutolewa kwa Java 5.0, hali hii ilivunjwa kwa kiasi kikubwa, kwani ilileta vipengele vipya vipya vya lugha: kitanzi cha mbele, ufungaji otomatiki, mbinu na nambari inayobadilika vigezo, aina zilizoorodheshwa, aina za jumla, na maelezo (yote yapo katika C#).

C#, kwa upande wake, hukua haraka, ikijiwekea kikomo kidogo sana katika kuongeza vipengele vipya vya matatizo mahususi. Mwelekeo huu ulionekana hasa katika toleo la C # 3.0, ambalo, kwa mfano, maswali kama SQL yalionekana. (Vipengele vipya hujengwa kwa njia ambayo lugha inabaki kuwa lugha madhumuni ya jumla. Kwa habari zaidi kuhusu C # 3.0, angalia nakala kwenye C #). Nyongeza zinazolengwa na tatizo kwenye Java zimezingatiwa lakini, angalau hadi sasa, zimekataliwa.

Soko

Tangu kuanzishwa kwake, C # imekuwa ikilinganishwa kila mara na Java. Hakuna kukataa kuwa C # na CLR yake iliyosimamiwa ina deni kubwa kwa Java na JRE yake (Mazingira ya Runtime ya Java).

Inaweza kujadiliwa ikiwa ukuzaji wa C # kwa njia fulani ni matokeo ya utambuzi wa Microsoft kwamba mazingira ya nambari iliyosimamiwa, na Java inayoongoza, ina faida nyingi katika ukuaji. ulimwengu wa mtandaoni, haswa kwa ujio wa Mtandao kwenye vifaa vingine isipokuwa kompyuta za kibinafsi, na kwa kuongezeka kwa umuhimu wa usalama wa mtandao. Kabla ya C# kuundwa, Microsoft ilirekebisha Java (kuunda J++) ili kuongeza vipengele vilivyotumika kwenye Windows pekee, na hivyo kukiuka makubaliano ya leseni ya Sun Microsystems. Wakati Microsoft ilikuwa katika awamu ya pili ya mkakati wake wa biashara, unaojulikana kama "Kumbatia, Kuongeza, na Kuzima", uundaji wa J++ ulisimamishwa na kesi iliyowasilishwa na Sun. Haikuweza kuunda mshirika wa Java na vipengele ilivyotaka, Microsoft iliunda mbadala ambayo inafaa zaidi mahitaji na maono yao ya siku zijazo.

Licha ya mwanzo huu wa misukosuko, inazidi kuwa wazi kuwa lugha mbili hazishindani sokoni. Java inatawala sekta ya simu na ina wafuasi wengi kwenye soko la programu za wavuti. C# imepata kukubalika vizuri katika soko la programu za kompyuta za mezani za Windows na shukrani kwa ASP.NET, C# pia ni mchezaji katika soko la programu za wavuti.

Programu za Kompyuta ya Mezani

Lugha zote mbili zina seti ya maktaba ambayo hutoa uwezo wa kiolesura cha programu za kompyuta ya mezani. Kwa upande wa Java, hizi ni maktaba za majukwaa mengi Swing na SWT, pamoja na idadi ya zisizo za kawaida. Kimsingi, yoyote kati yao hukuruhusu kuunda programu-tumizi za eneo-kazi kwenye Java.

Kwa C # kwenye jukwaa la Windows, maktaba kuu inayotekelezea GUI mtumiaji katika programu za kompyuta ya mezani ni Windows.Forms, inayomilikiwa na Microsoft na kutekelezwa kwa Windows pekee, na kwa majukwaa mengine - gtk#, inayotekelezwa kama sehemu ya mradi wa Mono. Majaribio ya kutekeleza kwa uhuru Windows.Fomu zimefanywa na zinafanywa (kwa mfano, katika mradi wa DotGNU), hata hivyo, kutokana na hali ya kufungwa ya awali, wao huteseka kutokana na kuwa wa pili na wasio kamili, hawawezi kushindana na utekelezaji kutoka. Microsoft na kwa hivyo inaweza kutumika tu kwa kucheleweshwa kwa uhamishaji wa programu za Windows kwenye mifumo mingine. Maendeleo ambayo yanatokana na Windows kwa kawaida hujengwa kwenye Windows.Fomu, na kuyahamisha hadi kwenye jukwaa lingine inakuwa vigumu. Ukuzaji wa C # huko Mono kwa kutumia gtk# unaweza kubebeka, lakini kuna wachache sana.

Kwa sababu ya asili ya lugha, matumizi ya mwongozo ya maktaba ya michoro ya Java ni ngumu zaidi. Usanifu wa maktaba ya graphics ya Java ni vigumu zaidi kwa msanidi wa novice kuelewa, lakini wakati huo huo, inamlazimisha kuendeleza kitaaluma. C#, kwa sababu ya uwepo wa zana za utayarishaji wa hafla zilizojumuishwa, huficha maelezo ya uchakataji wa hafla na vipengele vingine kutoka kwa msanidi, kuwezesha maendeleo ya kiolesura. Jukwaa la NET mwanzoni lilitumia sana viunda kiolesura cha kuona. Yote hii inatoa fursa kwa maendeleo ya haraka kiolesura cha programu ya desktop na sifa za chini za kiprogramu.

Katika miaka michache iliyopita, Sun Microsystems imejikita katika kuanzisha Java hata kwa upana zaidi katika soko la programu za kompyuta za mezani. Katika toleo la jukwaa la JRE 6 (2006), mkazo unawekwa katika kuboresha mwingiliano na mazingira ya picha ya mtumiaji. Toleo jipya zaidi la Sun's JVM (sasisho la 10 la JDK 6) linajumuisha maboresho mengi ya kiolesura cha mtumiaji. Hasa, fomu za uwazi na madirisha yasiyo ya mstatili. Matoleo ya hivi majuzi ya Java IDE (km NetBeans) pia yanajumuisha vijenzi vya kiolesura cha mchoro vilivyoboreshwa sana.

C #, pamoja na Java, polepole inakuwa maarufu katika kadhaa mifumo ya uendeshaji kulingana na Linux na BSD. Utekelezaji wa mradi wa Mono ulikuwa mchakato usio na uchungu kisheria kwa sababu lugha ya CLR na C# imesawazishwa na Ecma na ISO, na mtu yeyote anaweza kuzitekeleza bila kuwa na wasiwasi kuhusu masuala ya kisheria. Wakati huo huo, ni lazima ieleweke kwamba maombi yaliyoandikwa chini Mazingira ya Windows inaweza kuwa na matatizo makubwa yanayoendeshwa chini ya OS nyingine.

Maombi ya seva

Katika uwanja huu, labda lugha hizi mbili zinakaribia kuzingatiwa kama washindani. Java iliyo na jukwaa lake la J2EE (Toleo la Biashara la Java(2) na C# pamoja na ASP.NET yake hushindana katika uga wa kuunda maudhui na programu zinazobadilika za wavuti.

Lugha zote mbili hutumiwa sana na kuungwa mkono katika soko hili, pamoja na zana na bidhaa zinazosaidia zinazopatikana kwa JavaEE na .NET.

Programu za simu

J2ME (JavaME, Java(2) Micro Edition) ina msingi mpana sana wa soko simu za mkononi na PDA, ambapo ni vifaa vya bei rahisi pekee ambavyo havina KVM (Mashine ya Java Virtual iliyovuliwa kwa vifaa vilivyo na rasilimali chache) Programu za Java, pamoja na michezo mingi, zinapatikana kila mahali.

Ingawa karibu simu zote zinajumuisha KVM, uwezo huu hautumiwi sana na watumiaji wengi. Programu za Java kwenye simu nyingi huwa na mifumo ya menyu, michezo midogo, n.k. Maombi kamili ya simu za rununu ni nadra.

Teknolojia ya hali ya juu

C Mkali- Neno hili lina maana zingine, angalia C. Kichwa sahihi makala hii ya C#. Inaonyeshwa vibaya kwa sababu ya mapungufu ya kiufundi. Semantiki ya C#: Darasa la lugha muhimu: dhana nyingi: yenye mwelekeo wa kitu,... ... Wikipedia

Visual J Sharp- Kichwa sahihi cha makala haya ya Visual J#. Inaonyeshwa vibaya kwa sababu ya mapungufu ya kiufundi. Visual J# ni mazingira jumuishi ya maendeleo yaliyoundwa na Microsoft kwa .NET Framework katika lugha inayofanana na Java. Hasa... ... Wikipedia

F Mkali- Neno hili lina maana zingine, angalia F (maana). Kichwa sahihi cha makala haya ya F#. Inaonyeshwa vibaya kwa sababu ya mapungufu ya kiufundi. F# Darasa la lugha: dhana nyingi: kazi, yenye mwelekeo wa kitu, ... ... Wikipedia

Imba Mkali- Jina sahihi la makala haya ni Sing#. Inaonyeshwa vibaya kwa sababu ya mapungufu ya kiufundi. Sing# Darasa la lugha: dhana nyingi: kimuundo, sharti, zenye mwelekeo wa kitu, zenye mwelekeo wa matukio, kazi, ... ... Wikipedia

M.C. Mkali- MC# (soma kama "MC Sharp", mcsharp), Multiprocessor C# lugha ya programu. MC# ni lugha ya kiwango cha juu ya programu inayolengwa na kitu kwa jukwaa la .NET ambalo linaauni uundaji wa programu zinazoendeshwa katika ... ... Wikipedia

Visual C Sharp

Visual C Sharp .NET-Microsoft Studio ya Visual Mwonekano Visual Studio 2008 SP1 iliyo na programu ya C # ndani Windows Vista Chapa mazingira ya ukuzaji wa Programu... Wikipedia

Hati ya ECMA- Darasa la lugha: dhana nyingi: yenye mwelekeo wa kitu, generic, kazi, sharti, yenye mwelekeo, yenye mwelekeo wa matukio, upangaji wa prototype Ilionekana katika: 1995 Mwandishi(wa) ... Wikipedia

Na haijabainishwa wazi kutolewa kwa kumbukumbu. Zote zinajumuisha mifumo ya ulandanishi katika sintaksia yao.

Java na C # zote zina marejeleo yenye nguvu na dhaifu ya kitu. Java hukuruhusu kusajili msikilizaji ambaye atapokea ujumbe wakati kiungo kinakusanywa taka, ambayo inaboresha utendaji. WeakHashMap, ambayo haipo katika C#. Lugha zote mbili huruhusu msimbo wa mtumiaji kutekelezwa wakati kitu kinakusanywa taka. Katika C #, utaratibu wa hii ni njia maalum ya kumalizia, iliyoonyeshwa kupitia syntax ya uharibifu ya C++ inayojulikana. Katika Java, hii inafanikiwa kwa kupitisha njia ya kukamilisha, ambayo imetangazwa katika darasa la Kitu.

Aina za data

Lugha zote mbili zinaunga mkono wazo (inayojulikana katika C # kama aina za thamani - aina za thamani), na zote mbili kwa ajili ya kutafsiri aina za awali katika aina za kitu hutoa "ufungaji" wao otomatiki katika vitu (ndondi) na "kufunua" (kufungua). C# ina aina nyingi za awali kuliko Java, na aina kamili ambazo hazijasainiwa zinapatikana katika jozi na zote zilizotiwa sahihi, na aina maalum ya desimali kwa hesabu za uhakika wa juu za pointi zinazoelea. Java imeacha aina nyingi ambazo hazijasainiwa kwa ajili ya urahisi. Hasa, Java haina aina ya awali ambayo haijasainiwa.

Alama na sifa maalum

Java ina syntax maalum ya kuagiza ambayo hukuruhusu kutumia majina yaliyofupishwa kwa baadhi au njia zote tuli za darasa na anuwai. C # ina syntax ya darasa tuli ambayo inazuia darasa kwa njia tuli tu, lakini hakuna njia ya kutaja njia hizo tu bila kubainisha darasa kila wakati.

Maneno Maalum

Neno muhimu Fursa, mfano wa matumizi
pata, weka C# syntax inasaidia .
nje, kumb C # inasaidia vigezo vya matokeo ya njia, hukuruhusu kurudisha maadili mengi.
kubadili Katika C #, taarifa ya kubadili pia inafanya kazi kwenye kamba.
kalifp Java hutumia strictfp kuhakikisha kuwa matokeo ya utendakazi wa sehemu zinazoelea hayabadiliki kwenye mifumo yote.
imeangaliwa, haijachunguzwa Katika C#, misemo au vizuizi vilivyowekwa alama vinaweza kujumuisha ukaguzi wa hesabu za kufurika kwa wakati.
kutumia Neno kuu la kutumia katika C#" huhakikisha kuwa kitu kilichoundwa kinatupwa au kufungwa wakati wa kuondoka: kwa kutumia (StreamWriter file = new StreamWriter("test.txt")) ( file.Write("test"); )
enda kwa C # inasaidia opereta wa kuruka. Wakati mwingine inaweza kuwa muhimu, ingawa njia zilizoundwa zaidi za uhamishaji wa udhibiti kawaida hupendekezwa (ndiyo sababu iliachwa katika Java). Matumizi ya Kawaida goto neno kuu katika C # - uhamishaji wa udhibiti kwa lebo za kesi tofauti katika taarifa ya kubadili. swichi(rangi) ( kipochi Rangi.Blue: Console.WriteLine("Rangi ni bluu"); vunja; kipochi Rangi.DarkBlue: Console.WriteLine("Rangi ni giza"); goto case Color.Blue; // ... )

Ushughulikiaji wa Tukio

Java inahitaji mpangaji programu kutekeleza kiolezo cha mwangalizi, ingawa hutoa baadhi katika mfumo wa watu wasiojulikana, ambayo hukuruhusu kufafanua mwili wa darasa na kuunda mfano wake mara moja katika hatua moja kwenye nambari. Kipengele hiki kwa kawaida hutumiwa kuunda waangalizi.

C# hutoa usaidizi wa kina wa kiwango cha lugha kwa upangaji wa hafla, ikijumuisha wajumbe wa .NET, utumaji anuwai, sintaksia maalum ya kuweka matukio katika madarasa, shughuli za kusajili na kubatilisha usajili wa vidhibiti vya matukio, uwasilishaji wa majukumu, na mbinu zisizojulikana zenye semantiki kamili.

Kufungwa kunapendekezwa kujumuishwa katika Java SE 7. Kufungwa huku, kama wajumbe katika C#, kungekuwa na ufikiaji kamili wa anuwai zote za ndani katika wigo fulani, badala ya kusoma tu ufikiaji wa vigeu vilivyowekwa alama ya mwisho (kama ilivyo kwa madarasa yasiyojulikana).

Upakiaji mwingi wa operesheni

C# inajumuisha seti kubwa ya manufaa ya nukuu, ambayo mengi, kama vile upakiaji wa waendeshaji kupita kiasi na user-defined , yanajulikana kwa watayarishaji programu wa C++. Pia ina utekelezaji wazi wa mbinu za kiolesura, ambacho huruhusu darasa kutekeleza mbinu za kiolesura kando na mbinu zake au kutoa utekelezaji tofauti wa mbinu za jina moja la miingiliano miwili tofauti.

Java haijumuishi upakiaji wa waendeshaji kupita kiasi kwa sababu matumizi mabaya yake yanaweza kusababisha msimbo ambao ni vigumu kusoma na ni vigumu kutatua. Wakati huo huo, ukosefu wa overload katika Java hufanya kuwa ya matumizi kidogo kwa baadhi ya programu za hisabati.

Mbinu

Katika C#, mbinu sio chaguo-msingi na lazima zitangazwe wazi kwa neno kuu la mtandaoni ili kufanya hivyo. Katika Java, kinyume chake, kila kitu mbinu za umma, isipokuwa zile tuli, ni za mtandaoni. Ufunguo neno java final ni analog iliyotiwa muhuri katika C # na hukuruhusu kukataza uundaji wa njia iliyo na saini sawa katika madarasa yanayotokana. Upekee huhakikisha muingiliano unaotaka wa mbinu inayoitwa, lakini hulazimisha utekelezaji fulani kwenye simu, kwa kuwa simu hizi kwa kawaida haziingizwi badala ya mstari na huhitaji simu ya ziada kwa . Walakini, baadhi ya utekelezaji wa JVM, ikijumuisha ya Sun, hutekeleza uingizwaji wa ndani wa njia zinazojulikana sana kama njia dhahania.

C# inahitaji tamko wazi la nia ya kubatilisha njia ya mtandaoni katika darasa linalotokana. Nia hii inaelezewa na neno kuu la kubatilisha. Ikiwa kubatilisha sio nia ya mtayarishaji programu, na mtu anataka tu kutambulisha mbinu mpya ya mtandaoni iliyo na jina sawa na sahihi ili kuweka kivuli cha zamani, basi neno kuu lingine, new , linahitajika. Ikiwa hakuna neno moja kati ya haya limebainishwa, hii inasababisha hitilafu ya utungaji. Katika Java, njia yoyote huwa inabatilisha njia ya darasa la msingi yenye jina sawa na saini, ikiwa ipo. Tabia hii inaweza kuwa hatari ikiwa darasa la msingi liliundwa na msanidi mwingine, na toleo jipya litaleta njia ile ile ambayo tayari ipo katika darasa linalotokana; katika kesi hii, njia iliyopo kutoka kwa darasa inayotokana itaondoa njia mpya iliyoletwa katika darasa la msingi, ambayo sio nia ya watengenezaji wote wawili.

Mkusanyiko wa masharti

C#, tofauti na Java, inasaidia ujumuishaji wa masharti kwa kutumia . Pia ina sifa ya Masharti, ambayo ina maana kwamba njia maalum inaitwa tu wakati mkusanyiko uliotolewa wa mara kwa mara umefafanuliwa. Kwa njia hii, unaweza kuingiza kwenye msimbo, kwa mfano, hundi za uthibitisho, ambazo zitafanya kazi tu katika toleo la utatuzi wakati DEBUG mara kwa mara inafafanuliwa. Katika Maktaba ya Kawaida ya NET, hii ndiyo mbinu ya Debug.Assert(). Matoleo ya Java 1.4 na baadaye yanajumuisha kipengele cha kukagua dhana ya wakati wa kukimbia katika lugha.

Nafasi za majina na faili chanzo

C# nafasi za majina zinakumbusha zaidi C++. Tofauti na Java, eneo la faili ya chanzo halihusiani na nafasi yake ya jina. Ingawa, kwa kusema madhubuti, eneo la faili za chanzo katika Java halionyeshi muundo wa saraka ya kifurushi, ni tabia chaguo-msingi.

Java inahitaji jina faili ya chanzo inalingana haswa na jina la darasa pekee la umma lililofafanuliwa ndani yake, wakati C # hukuruhusu kufafanua madarasa kadhaa ya umma katika faili moja na haitoi vizuizi vyovyote kwa jina la faili, na pia (katika toleo la 2.0 na la juu) hukuruhusu kugawanyika. darasa katika faili mbili au zaidi (sehemu ya neno kuu).

Vighairi

Java inasaidia kukaguliwa kwa kutekeleza kunasa kamili na kushughulikia isipokuwa zote. Vighairi vyote ambavyo mbinu inaweza kutupa lazima ziorodheshwe katika tamko lake kwa kutumia neno kuu la kutupa. C# haitumii vighairi vilivyoteuliwa. Wasanidi wengine wanaona vighairi vilivyowekwa alama kuwa muhimu sana kwa kuhakikisha mtindo mzuri kupanga programu. Wengine, ikiwa ni pamoja na mbunifu mkuu wa C #, wanasema kwamba katika Java walikuwa kwa kiasi fulani majaribio na hawakujihesabia haki.

Moja ya hoja dhidi ya vighairi vilivyoangaliwa ni kwamba zinapotumiwa, kubadilisha msimbo wa ndani wa chaguo za kukokotoa kunaweza kusababisha kutupwa kwa tofauti mpya, ambayo inahitaji mabadiliko katika tamko la chaguo la kukokotoa na wengine wote wanaoiita. Hatimaye, ili kudumisha uoanifu wa kiolesura, ilikuwa ni kawaida kutangaza tu vitendakazi kama throws Exception , hivyo basi kupuuza wazo zima la vighairi vilivyoangaliwa. Njia nyingine ya kudumisha utangamano wa kiolesura katika Java ni kukamata ubaguzi mpya ulioanzishwa, kuifunga kwa ile ya zamani iliyotangazwa, na kuitupa tena. Kwa mfano, ikiwa njia imebadilishwa ili ianze kupata hifadhidata badala ya mfumo wa faili, basi inaweza kukamata SQLException yenyewe na kutupa IOException mpya badala yake, kwani mtumiaji wa njia hiyo hapaswi kufahamu maelezo ya utekelezaji wake wa ndani.

Msimbo wa kiwango cha chini

Utekelezaji

JVM na CLR

Java inapatikana katika kila aina ya mifumo ya uendeshaji na mazingira. Utekelezaji mwingi upo, wakati mwingine chanzo wazi.

Teknolojia ya ClickOnce inatoa utendakazi sawa na Java Webstart, lakini inapatikana tu kwa Wateja wa Windows. Internet Explorer kwenye Windows pia inaweza kuonyesha . NET Windows Fomu, ambazo hutoa utendakazi kama applet lakini ni mdogo kwa kivinjari mahususi.

Kuweka viwango

Lugha ya C# haijafafanuliwa na Microsoft, lakini na kamati za viwango na . Ingawa Sun inahifadhi hakimiliki na nguvu ya kura ya turufu juu ya jukwaa la Java, mfumo wa pili unatawaliwa kwa kiasi kikubwa kupitia Mchakato wa Jumuiya ya Java (JCP), ambao unaruhusu wahusika kuhusika katika kufafanua matoleo mapya na vipengele vya vipimo vya teknolojia ya Java.

Viwango vya ECMA na ISO vya C# na .NET vinafafanua lugha, mfumo wa CLI, na madarasa ya msingi(Maktaba ya Hatari ya Msingi, au BCL). Viwango havijumuishi maktaba nyingi mpya ambazo Microsoft imetekeleza juu ya mfumo wa kawaida, kama vile maktaba za hifadhidata, GUI na programu za wavuti ( , na ). Hata hivyo, Microsoft imekubali rasmi kutoshtaki miradi ya jamii kwa kutekeleza maktaba hizi.

Matumizi

Jumuiya

Java imejengwa juu ya utamaduni wazi zaidi na makampuni yenye ushindani mkubwa katika maeneo mbalimbali ya utendaji. Ingawa hii inasuluhisha kabisa shida ya uhuru wa muuzaji wa programu, inaongeza ugumu zaidi kwa lugha. Ili kutumia kwa mafanikio maktaba na vifaa, unahitaji kujua sio Java tu, bali pia makombora na mifumo yote inayoshindana na "hila" kadhaa za utekelezaji.

Umaarufu na maendeleo

Java ni kongwe kuliko C# na imejengwa kwa msingi mkubwa wa watumiaji, kuwa katika nyanja nyingi za kisasa za sayansi ya kompyuta, haswa zile ambazo . Java inatawala kozi za programu katika vyuo vikuu na vyuo vikuu vya Amerika, na kuna fasihi nyingi zaidi kwenye Java leo kuliko kwenye C#. Ukomavu na umaarufu wa Java umesababisha maktaba na API nyingi zaidi katika Java (nyingi ambazo ni chanzo wazi) kuliko katika C #.

Tofauti na Java, C# ni lugha mpya. Microsoft ilisoma lugha zilizopo kama vile Java na , na kubadilisha baadhi ya vipengele vya lugha ili kukidhi mahitaji ya aina fulani za programu. Baada ya muda, faida ya muda ya Java inakuwa ndogo.

Ukosoaji mmoja unaoweza kusikika kuhusu Java ni kwamba ni polepole kukuza na haina baadhi ya vipengele vinavyowezeshwa na mifumo na mbinu za utayarishaji za mtindo. Ukosoaji wa lugha ya C# ni kwamba wasanidi programu wake wanaweza kuwa na hamu sana ya kuafiki mitindo ya sasa ya upangaji programu kwa gharama ya umakini na urahisi wa lugha. Inaonekana kwamba wabunifu wa Java walichukua mbinu ya kihafidhina ya kuongeza vipengele vipya kwenye sintaksia ya lugha kuliko lugha nyinginezo za kisasa—labda hawakutaka kuelekeza lugha hiyo kwa mienendo ambayo inaweza kusababisha matokeo yasiyofaa baadaye. Java 5.0 ilishinda mwelekeo huu kwa njia nyingi, kwani ilileta vipengele vipya kadhaa vya lugha: kitanzi cha mbele, ufungaji otomatiki, mbinu tofauti, aina zilizoorodheshwa, jenetiki, na ufafanuzi (zote ziko katika C#) .

C#, kwa upande wake, hukua haraka, ikijiwekea kikomo kidogo sana katika kuongeza vipengele vipya vya matatizo mahususi. Mwelekeo huu ulionekana hasa katika toleo lijalo la C # 3.0, ambalo, kwa mfano, -kama maswali yalionekana. (Vipengele vipya vimeundwa ili kuweka lugha kama lugha ya kusudi la jumla. Kwa maelezo zaidi kuhusu C# 3.0, ona

Inaweza kujadiliwa ikiwa maendeleo ya C# ni matokeo ya njia fulani ya utambuzi wa Microsoft kwamba mazingira ya msimbo unaoongozwa na Java yana faida nyingi katika ulimwengu unaozidi kuwa wa mtandao, haswa kwa ujio wa Mtandao kwenye vifaa vingine isipokuwa kompyuta za kibinafsi na kuongezeka kwa kasi. umuhimu wa usalama wa mtandao. Kabla ya C# kuundwa, Microsoft ilirekebisha Java (kwa kuunda ) ili kuongeza vipengele vilivyofanya kazi kwenye OS pekee, hivyo kukiuka makubaliano ya leseni. Wakati Microsoft ilikuwa katika awamu ya pili ya mkakati wake wa biashara, unaojulikana kama , uundaji wa J++ ulisimamishwa na kesi iliyowasilishwa na Sun. Kunyimwa fursa ya kuunda clone ya Java yenye vipengele ilivyotaka, Microsoft iliunda mbadala ambayo ilifaa zaidi mahitaji yao na maono ya siku zijazo.

Licha ya mwanzo huu wa misukosuko, inazidi kuwa wazi kuwa lugha mbili hazishindani sokoni. Java inatawala sekta ya simu na ina wafuasi wengi kwenye soko la programu za wavuti. C# imepokea kukubalika vizuri katika soko la programu za kompyuta ya mezani ya Windows na inasukumwa na Microsoft kama lugha ya msingi kwa programu za Windows. Shukrani kwa , C# pia ni mchezaji katika soko la programu za wavuti.

Programu za Kompyuta ya Mezani

Java wakati mwingine inashutumiwa kwa kutoa ahadi nyingi na kutowasilisha inapokuja kwa programu za eneo-kazi. Ingawa maktaba zake za dirisha za AWT (Abstract Windowing Toolkit) zinajivunia uwezo mwingi, Java imelazimika kuhangaika kujiimarisha katika soko la programu za eneo-kazi. Kuzingatia kwake madhubuti kwa kanuni<пишем один раз, используем везде>hufanya iwe vigumu kutumia vyema uwezo na njia mahususi za uendeshaji katika kila mfumo mahususi wa eneo-kazi. Kama matokeo, programu za kompyuta zilizoandikwa kwenye Java mara nyingi huonekana kama<чужие>kwenye jukwaa ambalo wananyongwa.

Jua Microsystems, wengine wanasema, pia imekuwa polepole kukuza Java kwa watengenezaji na watumiaji kwa njia inayoifanya kuvutia kwa programu za eneo-kazi. Hata teknolojia kama Java Web Start, ambazo zina washindani wachache kati ya lugha na majukwaa, zimekuzwa vibaya.

Kutolewa kwa toleo la 6.0 la Java, linalotarajiwa mwaka wa 2006, linalenga tena soko la eneo-kazi - na seti kubwa ya zana mpya na za kuvutia za ushirikiano bora na mkali na mazingira ya eneo-kazi.

Teknolojia ya hali ya juu

Java imekubaliwa kama programu rasmi ya matumizi katika kizazi kijacho cha kiwango cha DVD, kupitia jukwaa la mwingiliano la BD-J. Hii inamaanisha kuwa maudhui wasilianifu kama vile menyu, michezo, vipakuliwa, n.k. yako kwenye hifadhi zote DVD Blu-ray itaundwa kwenye jukwaa la Java.

Java dhidi ya C#... Ni nini kinachoweza kuwa bora kuliko mabishano ya milele? Hapana, nakala hii haijajitolea kwa alama nyingine, na hata sio vita takatifu, hakuna hata swali: "nani baridi zaidi".

Kuna chombo kwa kila kazi. Kulinganisha C # na Ruby, kwa mfano, haina maana, kwa sababu kusudi lao lililokusudiwa ni tofauti kabisa, na vile vile asili yao. Walakini, ni C # na Java ambazo ziko karibu zaidi katika falsafa yao.

Mara nyingi, wenzake wanaoandika katika Java hawajui hata vitu vingi (!!!) ambavyo C # hutoa (au, kinyume chake, haitoi).

Ikiwa una nia ya kuangalia C # na Java bila subjectivity na pia kujua shirika la ndani uwezekano huu au ule, basi endelea.

▌ Historia kidogo

Lugha ya C # ilionekana mnamo 2001, na ukuzaji wake ulianza mnamo 1999. Wakati huo ilikuwa sawa na Java 1.4. Walakini, C # ya kisasa kama tunavyoijua inapaswa kuanza na toleo la 2.0 (ambalo linalingana na kutolewa kwa Java 5).

Kuna maoni kwamba C # hukopa mengi kutoka kwa Java. Hata hivyo, sikubaliani sana na hili. Kwa maoni yangu, C# iko kwa njia nyingi C "na vitu," au C++ "na uso wa mwanadamu."

Natumaini kwamba makala na hoja ndani yake zitathibitisha taarifa hii.
Sitasimulia tena Wikipedia. Kwa hivyo, wacha tuendelee mara moja na tupitie tofauti muhimu na faida.

Kwanza, tutaangalia uwezo wa JVM na CLR (Common Language Runtime) wenyewe, kisha tutaangalia sukari ya kisintaksia ya C #.

▌ Kipindi cha I: Bytecode

NET na Java hutumia bytecode. Kwa kweli, kando na muundo yenyewe, kuna tofauti moja muhimu sana - polymorphism.

CIL (Lugha ya Kawaida ya Kati, pia inajulikana kama MSIL, pia inajulikana kama IL) ni bytecode yenye maagizo ya polymorphic (ya jumla).

Kwa hivyo, ikiwa Java hutumia maagizo tofauti kwa kila aina ya operesheni na aina mbalimbali(Kwa mfano: fadhila- nyongeza ya 2 ya kuelea, iadd- nyongeza ya nambari 2), basi katika CIL kwa kila aina ya operesheni kuna maagizo moja tu na vigezo vya polymorphic (kwa mfano, kuna maagizo moja tu - ongeza, ambayo inaongeza kuelea na nambari kamili). Uamuzi wa kutoa maagizo sahihi ya x86 unaangukia kwenye JIT.

Idadi ya maagizo ya majukwaa yote mawili ni takriban sawa. Kwa kulinganisha orodha ya Java na amri za bytecode za CIL, unaweza kuona kwamba 206 ni za Java, na 232 ni za CIL, lakini usisahau kwamba katika Java amri nyingi zinarudia tu utendaji wa kila mmoja.

▌ Kipindi cha III: Jenerali (aina zilizoainishwa || upolimishaji kigezo)

Kama unavyojua, Java hutumia utaratibu wa kufuta aina, i.e. usaidizi wa jenetiki hutolewa tu na mkusanyaji, lakini si kwa wakati wa kukimbia, na baada ya mkusanyiko, habari kuhusu aina yenyewe haitapatikana.

Kwa mfano, kanuni:

Orodha strList = ArrayList mpya (); Orodha intList = ArrayList mpya (); bool areSame = strList.getClass() == intList.getClass(); System.out.println(areSame);
Itaonyeshwa kweli.

Aidha, badala ya aina ya jumla T mfano wa kitu cha aina huundwa Kitu.Java.lang.

Orodha strList = ArrayList mpya (); strList.add("stringValue"); Kamba str = strList.get(0);
Itabadilishwa kuwa:

Orodha ya orodha = ArrayList mpya (); list.add("stringValue"); Kamba x = (Kamba) orodha.pata (0);
Kwa hivyo sera ya usalama ya aina nzima inaharibiwa papo hapo.

NET, kinyume chake, ina msaada kamili Jeniriki zote mbili hukusanya wakati na wakati wa kukimbia.

Kwa hivyo ni nini kinachohitaji kutekelezwa ili kusaidia kikamilifu jenetiki katika Java? Badala yake, hebu tuangalie kile timu ya maendeleo ya NET ilifanya:

  • Usaidizi wa jenetiki katika kiwango cha Mfumo wa Aina ya Kawaida kwa mwingiliano wa lugha mtambuka
  • Usaidizi kamili kutoka kwa API ya Tafakari
  • Kuongeza madarasa/mbinu mpya kwa madarasa ya msingi (Maktaba ya Darasa la Msingi)
  • Mabadiliko katika umbizo lenyewe na jedwali la metadata
  • Mabadiliko katika algorithm ya ugawaji wa kumbukumbu wakati wa utekelezaji
  • Kuongeza miundo mpya ya data
  • Usaidizi wa jenetiki kutoka kwa JIT (kushiriki msimbo)
  • Mabadiliko katika umbizo la CIL (maagizo mapya ya bytecode)
  • Usaidizi wa kithibitishaji cha msimbo wa CIL
Wale. Jeni zinapatikana sio tu wakati wa kukusanya, lakini pia wakati wa kukimbia bila kupoteza au kubadilisha habari ya aina. Haja ya ndondi/unboxing pia inatoweka.

▌ Kipindi cha IV: Aina

Java ni lugha ya OO kabisa. Hili linaweza kujadiliwa. Hii ndiyo sababu: aina za awali (jumla, kuelea, n.k.) hazirithi kutoka kwa java.lang.Object. Kwa hivyo, jenetiki katika Java hazitumii aina za zamani.

Lakini kwa lugha ya OO kweli kila kitu ni kitu.

Hii sio kizuizi pekee. Pia haiwezekani kuunda aina zako za zamani.

C # hukuruhusu kufanya hivi. Jina la miundo hii ni muundo.

Kwa mfano:

Muundo wa umma Quad ( int X1; int X2; int Y1; int Y2; )
Pia, jenetiki katika C # hukuruhusu kutumia aina za thamani (int, kuelea, nk)

Ikiwa katika Java unahitaji kuandika kama hii:

Orodha intList = ArrayList mpya ();
Lakini huwezi kufanya hivi:

Orodha intList = ArrayList mpya ();
C # inaruhusu matumizi ya aina za zamani.

Sasa tunakuja kwenye mada ya aina ya uongozi katika NET.

Kuna aina 3 za aina katika NET: thamani, marejeleo na aina za vielelezo.

Kwa hiyo, aina ya thamani- analog ya aina ya primitive kutoka Java. Hata hivyo, ni kurithi kutoka Kitu.Mfumo, haiishi kwenye lundo, lakini kwenye fungu (na sasa kanusho: eneo la aina ya thamani inategemea mzunguko wa maisha, kwa mfano, wakati wa kushiriki katika kufungwa, ndondi hutokea moja kwa moja).

Aina ya marejeleo- ni sawa na aina za kumbukumbu katika Java.

Aina ya pointer- ni mali isiyo ya kawaida zaidi ya .NET. Ukweli ni kwamba CLR hukuruhusu kufanya kazi na viashiria moja kwa moja!

Kwa mfano:

Pointi ya Muundo ( int x ya umma; int y; ya umma int y; ) utupu tuli usio salama PointerMethod() ( Pointi; Pointi* p = p->x = 100; p->y = 200; Pointi2; Pointi* p2 = (*p2 ).x = 100; (*p2).y = 200; )
Inaonekana kama nambari ya C++, sivyo?

▌ Kipindi cha V: Vipengele vya C#

Kwanza, hebu tufafanue nini C # inaweza kufanya:
  • Sifa (pamoja na otomatiki)
  • Wajumbe
  • Matukio
  • Mbinu zisizojulikana
  • Maneno ya Lambda
  • Miti ya Kujieleza
  • Madarasa yasiyojulikana
  • Uelewa wa aina yenye nguvu
  • Opereta inapakia kupita kiasi
  • Viashiria
  • ...mengi zaidi
Mali katika C # wanawakilisha sukari ya kisintaksia, kwa sababu zinapokusanywa, zinageuka kuwa njia za aina PataXXX, WekaXXX. Walakini, habari kuhusu mali ya dhana yenyewe huhifadhiwa katika metadata, kwa hivyo kutoka kwa sifa nyingine yoyote ya lugha tunaweza kuipata kama tu. kitu.MaliX, lakini sivyo object.GetPropertyX.

Kwa mfano:

TestClass ya umma ( int TotalSum ya umma ( pata ( return Hesabu * Bei; ) ) // mali otomatiki - mkusanyaji atatoa sehemu zenyewe za umma int Hesabu ( get; set; ) public int Price ( pata ( rudisha 50; ) ) )
Itabadilishwa kuwa:

TestClass ya darasa la umma ( /* *misimbo mingine yote */ int ya kibinafsi k__BackingField; // mali otomatiki - mkusanyaji atatoa uwanja yenyewe int Count ( get ( return k__BackingField; ) seti ( k__BackingField = thamani; )))
Wajumbe ni analogi za viashiria kwa njia katika C/C++. Hata hivyo, wao ni aina salama. Kusudi lao kuu ni kazi za kurudi nyuma, pamoja na kufanya kazi na hafla.

Wakati huo huo, wajumbe katika .NET wako vifaa kamili.

Mbinu hii kimsingi ni tofauti na mradi wa Da Vinci wa Java, kwa sababu mwisho wanajaribu kupanua VM yenyewe.

Wacha tuangalie mfano katika C #:

TestClass ya darasa la umma ( mjumbe wa umma int BinaryOp(int arg1, int arg2); public int Add(int a, int b) ( return a + b; ) public int Multiply(int first, int second) ( rudisha kwanza * pili; ) Utupu wa umma TestDelegates() ( BinaryOp op = BinaryOp mpya(Ongeza); int result = op(1, 2); Console.WriteLine(matokeo); //itatoa: 3 op = BinaryOp mpya(Zidisha); tokeo = op( 2 , 5); Console.WriteLine(matokeo); //itatoa: 10 ) )
Na pia katika C:

Int Add(int arg1, int arg2) ( return arg1 + arg2; ) batili TestFP() ( int (*fpAdd)(int, int); fpAdd = //function pointer int three = fpAdd(1, 2); // piga kazi kupitia pointer)
Kwa hiyo tunaona nini? Ikiwa katika C tunaweza kupitisha pointer kwa kazi na aina nyingine za vigezo (sema float arg1, float arg2), basi katika C # hii haiwezekani. Katika C#, wajumbe hutiwa saini na kuandika tu ukaguzi katika hatua ya ujumuishaji, lakini pia wakati wa utekelezaji.

Matukio muhimu kutekeleza programu inayoendeshwa na hafla. Bila shaka, unaweza kupata na EventDispatcher au muundo wa Mchapishaji/Mteja. Walakini, usaidizi wa lugha asili hutoa faida kubwa. Mojawapo ni aina ya usalama.

Kwa mfano:

Darasa la umma la MyClass ( kamba ya kibinafsi _value; utupu wa mwakilishi wa umma ChangingEventhandler(string oldValue); tukio la umma ChangingEventhandler Changing; utupu wa umma OnChanging(string oldvalue) (ChangingEventhandler handler = Changing; ikiwa (kishikizi != null) kidhibiti(thamani ya zamani); ) Mfuatano wa umma Thamani ( pata ( return _value; ) weka ( OnChanging(_value); _value = value; ) ) utupu wa umma TestEvent() ( Mfano wa MyClass = MyClass mpya(); mfano.Changing += new ChangingEventhandler(instance_Changing); mfano. Thamani = "thamani mpya ya mfuatano"; //будет вызван метод instance_Changing } void instance_Changing(string oldValue) { Console.WriteLine(oldValue); } } !}
Mbinu zisizojulikana kwa kiasi kikubwa kurahisisha maisha - muundo wa darasa unabaki safi, i.e. hakuna haja ya kuunda njia tofauti za ziada katika darasa lenyewe.

Wacha turekebishe mfano hapo juu na shughuli za binary kwa kutumia njia zisizojulikana:

TestClass ya umma ( mjumbe wa umma int BinaryOp(int arg1, int arg2); TestDelegates zisizo na umma() ( BinaryOp op = BinaryOp mpya (mjumbe(int a, int b) ( rudisha + b; )); int result = op( 1, 2); Console.WriteLine(matokeo); //itatoa: 3 ) )
Je, si fupi na safi zaidi?

Hebu sasa tufikirie maneno ya lambda.

Usemi wa lambda ni chaguo la kukokotoa lisilojulikana ambalo lina vielezi na waendeshaji na linaweza pia kutumiwa kuunda wajumbe au mti wa kujieleza.

TestClass ya umma ( mjumbe wa umma int BinaryOp(int arg1, int arg2); TestDelegates zisizo na umma() ( BinaryOp op = BinaryOp mpya((a, b) => a + b); int result = op(1, 2); Console.WriteLine(matokeo); //itatoa: 3 ) )
Je, mfano na matukio ungeonekanaje? Rahisi sana:

Darasa la umma la MyClass ( /* * misimbo mingine yote */ public void TestEvent() ( mfano wa MyClass = MyClass mpya(); mfano.Kubadilisha += (o) => Console.WriteLine(o); example.Value = "(! LANG: thamani mpya ya mfuatano"; //будет вызван Console.WriteLine } } !}
Kweli, tumepunguza nambari zaidi na inaanza kuonekana kama mtindo wa kufanya kazi (!!!). Ndio, C # pia ni lugha inayofanya kazi, kwa sababu... kazi ni vitu vya daraja la kwanza.

Maneno ya Lambda, na nayo miti ya kujieleza, iliundwa na LINQ(Hoja Iliyounganishwa kwa Lugha).

Bado hujui LINQ? Unataka kuona MapReduce maarufu kwenye LINQ itakuwaje?

Darasa tuli la umma la MyClass ( public void MapReduceTest() ( var words = new ("... maandishi mengine huenda hapa..."); var wordOccurrences = maneno .GroupBy(w => w). Chagua(intermediate => mpya ( Neno = kati.Ufunguo, Frequency = kati.Jumla(w => 1) ) .Wapi(w => w.Frequency > 10) .OrderBy(w => w.Frequency); ) )
Au tumia syntax kama SQL:

Utupu wa umma MapReduceTest() ( maneno ya mfuatano = mfuatano mpya ( "... maandishi mengine huenda hapa..." ); var wordOccurrences = kutoka kwa kikundi cha maneno w kwa w hadi kati chagua mpya ( Word = intermediate.Key, Frequency = intermediate.Sm((string w) => 1) ) kuwa w ambapo w.Frequency > 10 orderby w.Frequency select w; )
Katika mfano huu tunaona LINQ (GroupBy().Chagua ().Wapi(), n.k.) na darasa zisizojulikana -

Mpya (Neno = kati.Ufunguo, Mzunguko = kati.Jumla(w => 1))
Hmm...ni nini kingine kinatumika hapa? Jibu ni rahisi - mfumo wa uelekezaji wa aina yenye nguvu.

Neno kuu hapa lina jukumu kubwa var. C++11 ina muundo sawa kiotomatiki.

Kwa hivyo bila uelekezaji wa aina tutalazimika kuandika kama hii:

Utupu wa umma MapReduceTest() ( maneno ya mfuatano = mfuatano mpya ( "...baadhi ya maandishi huenda hapa..." ); var wordOccurrences = Enumerable.OrderBy(Enumerable.Where(Enumerable.Select(Enumerable.GroupBy) (maneno, mjumbe (kamba w) ( return w; )), mjumbe (IGrouping kati) ( rudisha mpya ( Neno = intermediate.Key, Frequency = Enumerable.Sm (wa kati, (Fun ) (w => 1))); )), mjumbe (<>f__Aina isiyojulikana0 w) ( kurudi w.Frequency > 10; )), mjumbe (<>f__Aina isiyojulikana0 w) ( kurudi w.Frequency; )); )
[Mbinu hii mkusanyaji iliyoundwa kwa ajili yetu]

Ili kuelezea vipengele vingine vyote vya C #, mipangilio yake ya mkusanyaji, nk. Inahitajika kutoa nakala zaidi ya moja.

Wakati huo huo, C # 5 - ambayo tayari inapatikana na hivi karibuni itatolewa rasmi, inaongeza programu ya asynchronous, ambayo pia ilionekana katika C++11!

▌ Hitimisho

C # na Java ni lugha zenye nguvu, pamoja na majukwaa yenye nguvu (.NET na Java). Kama nilivyoandika tayari mwanzoni mwa kifungu, kuna zana kwa kila kazi.

C # sio mwendelezo au nakala ya Java. Hata ilipokuwa ikitengenezwa huko Microsoft, jina lake la msimbo lilikuwa COOL (Lugha Iliyoelekezwa na Kitu kama C). Je, mlinganisho wa C/C++ umetajwa mara ngapi katika makala haya? Kiasi cha kutosha.

Natumai nakala yangu ilisaidia kutatua (angalau kidogo) suala la tofauti kati ya lugha na majukwaa.

Asante kwa umakini wako!