Kumpi on parempi Java vai C Sharp. Erityiset avainsanat. Symbolit ja erikoisominaisuudet

Syntaksi

Molemmat kielet käyttävät C-ohjelmointikieltä syntaktisena perustana. Erityisesti he perivät siitä ilman muutoksia:

  • koodilohkon alun/lopun merkitseminen aaltosulkeilla;
  • useimpien sisäänrakennettujen operaatioiden merkintä, assosiaatio ja ensisijaisuus (osoitus, aritmeettinen, looginen, bittikohtainen, lisäys/vähennysoperaatiot, kolmiosainen ehdollinen operaattori " ?: »);
  • syntaksi muuttujien ja funktioiden kuvaamiseen ja käyttämiseen (järjestys "tyypin nimi", modifikaatioiden käyttö, funktioiden pakolliset sulkeet, muodollisten parametrien kuvaus);
  • kaikkien perusrakenteiden syntaksi: ehdollinen operaattori, silmukat, monivalintaoperaattori;
  • menettelyjen puute (ne korvataan tyhjiötyyppisillä toiminnoilla);
  • sisäänrakennettujen perustyyppien nimet (paitsi bool, Javassa tätä tyyppiä kutsutaan booleaniksi);
  • käyttämällä puolipistettä
  • ...ja monia pienempiä ominaisuuksia.

Kaikki tämä johtaa siihen, että Java- ja C#-ohjelmat näyttävät ensi silmäyksellä erittäin samanlaisilta kuin C-ohjelmat. Molemmilla kielillä on tehty samanlaisia ​​laajennuksia ja lisäyksiä C:n (tai C++:n) suhteen, erityisesti aakkostoa on laajennettu ja käyttöön on otettu oma syntaksi, joka tukee paketteja, kuvausten tuontia ja käännösyksiköiden määrittelyä.

Myös syntaktisia eroja on runsaasti.

Syntaksi Java C#
Staattisten nimien tuonti
(tuo staattista)
voit tuoda erikseen osan tai kaikki luokan staattiset menetelmät ja muuttujat ja käyttää niiden nimiä ilman tarkistuksia tuontimoduulissa Vain kokoonpano tuodaan, ja aina kun käytät tuotuja staattisia nimiä, sinun on määritettävä luokka
Vakiot sisään vaihtaa lausunto on oltava joko kokonaisluku tai enum-tyyppi (1.7:ssä merkkijonoliteraaleja lisättiin tyyppiluetteloon) voit käyttää tekstiä
goto operaattori he luopuivat tarkoituksella goton käytöstä, mutta on olemassa mekanismi, jonka avulla voit poistua sisäkkäisestä silmukasta merkitsemällä se etiketillä ja käyttämällä katkeamis- ja jatka-operaattoreita yhdessä etiketin kanssa (jatka<метка>;) goto on säilynyt, sen yleinen käyttö on ohjauksen siirtäminen eri tapaustunnisteille kytkinkäskyssä ja sisäkkäisestä silmukasta poistuminen
Vakiot Varsinaisia ​​vakioita ei ole, vaan käytetään staattisia luokkamuuttujia lopullisen modifikaattorin kanssa - niiden käytön vaikutus on täsmälleen sama nimetyn kirjoitetun vakion ja const-avainsanan erillinen käsite
Liukulukutarkkuus Java sisältää strictfp-rakenteen, joka takaa samat liukulukutulokset kaikilla alustoilla. C# luottaa toteutukseen, ei ole takeita täysin identtisistä laskentatuloksista.
Sekkien poistaminen käytöstä Javassa kaikki dynaamiset tarkistukset otetaan käyttöön/poistetaan käytöstä vain pakettitasolla C# sisältää tarkistettuja ja valitsemattomia rakenteita, joiden avulla voit paikallisesti ottaa käyttöön tai poistaa käytöstä dynaamisen aritmeettisen ylivuototarkistuksen.

Yleisesti ottaen C#:n syntaksi on hieman laajempi ja rikkaampi kuin Java, se sisältää sellaisia ​​ominaisuuksia kuin kyky jakaa yhden luokan kuvaus useisiin moduuleihin, ominaisuuksien kuvaus ja kyky hallita ohjelman virtuaalisuutta; menetelmiä.

Mekanismi dynaamisen tiedon ja roskien keräämiseen

Molemmat kielet toteuttavat saman mallin työskennelläkseen dynaamisen tiedon kanssa: objektit luodaan dynaamisesti käyttämällä uutta rakennetta, ajonaika tarkkailee viittausten olemassaoloa niihin ja roskankerääjä ajoittain tyhjentää muistin objekteista, joilla ei ole viittauksia. Roskienkeruun optimoimiseksi kielten ja ajonaikaisten ympäristöjen määritykset eivät sisällä rajoituksia objektin käyttöikään sen jälkeen, kun viimeinen viittaus siihen on poistettu - keräilijä toimii ohjelman suorituksesta riippumatta, joten varsinainen tuhoutuminen tapahtuu objekti voi esiintyä milloin tahansa viimeisen viittauksen poistamisen jälkeen, kunnes ohjelma päättyy. Todellisuudessa jätteenkerääjät optimoivat suorituksen varmistaakseen hyväksyttävän muistin kulutuksen ja minimoivat ohjelman hidastumisen.

C# (tarkemmin sanottuna yleisen kielen ajonaika) mahdollistaa viimeistelyn suorittamisen estämisen tietyssä objektissa käyttämällä GC.SuppressFinalize(obj)-metodia (esim. SQL-yhteys tiedostovirrassa). Tämä voi olla hyödyllistä, koska viimeistelyä pidetään suhteellisen kalliina toimenpiteenä jätteenkeräyksessä ja viimeistelyllä varustettu esine kestää pidempään.

Objektityökalut

Enum tyypit

Javalla vain yksiulotteiset taulukot voidaan ilmoittaa tarkasti. Javan moniulotteinen taulukko on joukko taulukoita. C#:ssa on sekä todellisia moniulotteisia taulukoita että taulukoiden taulukoita, joita C#:ssa kutsutaan yleisesti "sahalaisiksi" taulukoiksi. Moniulotteiset taulukot ovat aina "suorakulmaisia" (kaksiulotteisen terminologian mukaan), kun taas taulukoiden taulukot voivat tallentaa eripituisia merkkijonoja (taas kaksiulotteisessa tapauksessa, samoin moniulotteisessa tapauksessa). Moniulotteiset taulukot nopeuttavat muistin käyttöä (jossa osoitin poistetaan vain kerran), kun taas rosoiset taulukot ovat hitaampia, mutta säästävät muistia, kun kaikki rivit eivät ole täynnä. Moniulotteisten taulukoiden luomiseen tarvitaan vain yksi kutsu operaattori uusi, ja porrastetut vaativat nimenomaisen muistin varaamisen silmukassa kullekin riville.

Parametriset (yleiset) tyypit

Molemmilla kielillä tyyppejä voidaan parametroida, mikä tukee yleistä ohjelmointiparadigmaa. Syntaktisesti tyyppien määritelmä on melko lähellä - molemmilla kielillä se on peritty C++-malleista, vaikkakin tietyin muokkauksin.

Javan tyyppigeneraatit ovat puhtaasti kielirakennelmia, ja ne toteutetaan vain kääntäjässä. Kääntäjä korvaa kaikki yleiset tyypit niiden ylärajoilla ja lisää asianmukaiset tyypit aina kun parametroitua tyyppiä käytetään. Tuloksena on tavukoodi, joka ei sisällä viittauksia yleisiin tyyppeihin ja niiden parametreihin. Tätä tekniikkaa yleisten tyyppien toteuttamiseksi kutsutaan tyypin poisto(tyypin poisto). Tämä tarkoittaa, että tietoja alkuperäisistä yleisistä tyypeistä ei ole saatavilla ajon aikana, ja se asettaa joitain rajoituksia, kuten kyvyttömyyden luoda uusia taulukko-ilmentymiä yleisen tyypin argumenteista. keskiviikko Java-suoritus En tunne yleistyyppistä järjestelmää, minkä vuoksi uudet JVM-toteutukset vaativat vain vähän päivityksiä toimiakseen uuden luokkamuodon kanssa.

C# meni eri reittiä. Yleistuki on integroitu virtuaalinen ympäristö suoritus, joka ilmestyi ensimmäisen kerran .NET 2.0:ssa. Tässä olevasta kielestä on tullut vain ulkoinen käyttöliittymä ympäristön näihin ominaisuuksiin pääsemiseksi. Kuten Javassa, kääntäjä suorittaa staattisen tyyppitarkistuksen, mutta tämän lisäksi JIT suorittaa latausajan oikeellisuuden tarkistuksen. Yleisiä tyyppejä koskevat tiedot ovat täysin läsnä ajon aikana ja mahdollistavat täyden tuen yleisten tyyppien pohtimiseen ja niiden uusien toteutusten luomiseen.

Java-lähestymistapa vaatii lisätarkastuksia ajon aikana ei takaa, että koodiasiakasohjelma seuraa tyyppivastaavuutta, eikä anna heijastusta yleisille tyypeille. Java ei salli yleistyyppien erikoistumista primitiivisiin tyyppeihin (tämä voidaan tehdä vain käärimällä primitiiviset tyypit luokkiin), kun taas C# tarjoaa yleistyksen sekä viite- että arvotyypeille, mukaan lukien primitiivit. Sen sijaan Java ehdottaa käärittyjen primitiivityyppien käyttöä parametreina (esim Listan sijaan ), mutta tämä maksaa dynaamisen lisämuistin varauksen. Sekä Javassa että C#:ssa eri viitetyyppien yleiset erikoisalat tuottavat saman koodin, mutta C#:ssa ajonaika luo dynaamisesti optimoitua koodia erikoistuessaan arvotyyppeihin (esim. List ), jonka avulla ne voidaan varastoida ja poistaa konteista ilman lastaamista ja purkamista.

Tapahtumankäsittely

Java edellyttää, että ohjelmoija toteuttaa tarkkailijakuvion manuaalisesti, vaikka se tarjoaakin jonkin verran syntaktista sokeria nimettömien sisäkkäisten luokkien muodossa, jonka avulla voit määrittää luokan rungon ja ilmentää sen välittömästi yhdessä koodin kohdassa.

C# tarjoaa laajan kielitason tuen tapahtumien ohjelmointiin, mukaan lukien .NET-delegaatit, monilähetys, erityinen syntaksi tapahtumien asettamiseen luokissa, toiminnot tapahtumakäsittelijöiden rekisteröintiä ja rekisteröinnin poistamista varten, delegaattikovarianssi ja anonyymit menetelmät täydellä sulkemissemantiikalla.

Sulkemisia ehdotetaan sisällytettäväksi Java SE 8:aan. Nämä sulkemiset, kuten C#:n edustajat, olisivat täysi pääsy kaikkiin paikallisiin muuttujiin tietyssä laajuudessa sen sijaan, että pääset lukemaan vain lopullisiksi merkittyjä muuttujia (kuten anonyymien sisäkkäisten luokkien kohdalla).

Toiminnan ylikuormitus

Ominaisuudet

C# tukee käsitettä "ominaisuudet" - luokan pseudokenttiä, joihin päästään täysin kontrolloidusti luomalla menetelmiä kentän arvon hakemiseen ja kirjoittamiseen. Kiinteistöilmoitukset tehdään get- ja set-konstrukteilla.

C# sisältää myös jotain ns indeksoijat, jota voidaan pitää operaattorin ylikuormituksen erikoistapauksena (samanlainen kuin operaattorin ylikuormituksessa C++:ssa), tai parametroidut ominaisuudet. Indeksoija on tämä ominaisuus, jolla voi olla yksi tai useampi parametri (indeksi), ja indeksit voivat olla mitä tahansa tyyppiä. Tämän avulla voit luoda luokkia, joiden esiintymät toimivat taulukoiden tavoin:

OmaLista[4] = 5;

merkkijonon nimi = xmlNode. Attribuutit["nimi"];

”Henkilökohtaisesti en pidä ominaisuuksista ja olisin iloinen, jos niiden tuki poistetaan Microsoft .NET Frameworkista ja siihen liittyvistä ohjelmointikielistä. Syynä on se, että ominaisuudet näyttävät kentiltä, ​​mutta ovat itse asiassa menetelmiä."

Yleisen C#-nimeämistyylin mukaisesti ominaisuuksien nimet erotetaan visuaalisesti kenttien nimistä siten, että ne alkavat isolla kirjaimella.

Ehdollinen kokoelma

C#, toisin kuin Java, tukee ehdollista kääntämistä esiprosessoriohjeiden avulla. Siinä on myös Conditional-attribuutti, mikä tarkoittaa, että määritettyä menetelmää kutsutaan vain, kun annettu käännösvakio on määritelty. Tällä tavalla voit lisätä koodiin esimerkiksi vahvistustarkistuksia, jotka toimivat vain debug-versiossa, kun DEBUG-vakio on määritelty. NET-standardikirjastossa tämä on Debug.Assert()-metodi.

Java-versiot 1.4 ja uudemmat sisältävät ajonaikaisen ominaisuuden oletuksen tarkistamista varten kielellä. Lisäksi, jos konstrukteja, joilla on vakioehdot, voidaan laajentaa käännösaikana. Javalle on olemassa kolmansien osapuolien esiprosessoreiden toteutuksia, joita käytetään ensisijaisesti kehitettäessä sovelluksia mobiililaitteille.

Nimitilat, kokoonpanot, paketit

C# käyttää nimitilat(nimiavaruus), joka muistuttaa samannimistä C++-mekanismia. Jokainen luokka kuuluu nimiavaruuteen ne luokat, joille nimiavaruutta ei ole erikseen määritetty, kuuluvat oletusarvoisesti nimettömään nimiavaruuteen. Nimiavaruudet voidaan upottaa toistensa sisään.

Javalla on paketteja, hieman samanlainen kuin C#-nimiavaruudet. Paketit voivat olla sisäkkäisiä, jokainen kuvattu luokka kuuluu tiettyyn pakettiin, jos paketista ei ole nimenomaista merkintää, luokka kuuluu globaaliin nimettömään pakettiin.

Molemmilla kielillä, jotta voit käyttää toisessa nimiavaruudessa tai paketissa ilmoitettua objektia, sinun on ilmoitettava vaadittu paketti (nimiavaruus) ohjelmassa käytetyksi. Objektiin päästään tarkennetun nimen kautta. Paketin (nimitilan) nimeä käytetään tarkenteena. Jos objektiin pääsyä vaaditaan ilman pätevyyttä, ohjelmamoduulin tulee sisältää viittauksenpoistokäsky: käyttäen C#:ssa ja tuonti Javassa.

C#:ssa nimiavaruuksia ei liitetä millään tavalla käännettyihin moduuleihin (kokoonpanoihin tai kokoonpanoon Microsoftin terminologiassa). Useat kokoonpanot voivat sisältää saman nimiavaruuden, ja yksi kokoonpano voi ilmoittaa useita nimiavaruuksia, jotka eivät välttämättä ole sisäkkäisiä. C#-laajuusmuutoksilla ei ole mitään tekemistä nimiavaruuksien kanssa. Javassa samassa paketissa oletusarvoisesti ilmoitetut luokat muodostavat yhden käännetyn moduulin. Oletuslaajuusmuuttaja (ei nimenomaista määritystä) rajoittaa luokan kenttien ja menetelmien laajuuden paketin rajoihin.

Javassa paketin lähdekoodin tiedostojen ja hakemistojen rakenne liittyy oletusarvoisesti paketin rakenteeseen - paketti vastaa hakemistoa, siihen sisältyvät alipaketit - tämän hakemiston alihakemistot, lähdetiedostot sijaitsevat hakemistoissa vastaavat pakettia tai alapakettia, johon ne sisältyvät. Siten lähdepuu noudattaa paketin rakennetta. C#:ssa tiedoston sijainti alkuperäinen teksti sillä ei ole mitään tekemistä sen nimiavaruuden kanssa.

Lähdetekstin sijainti tiedostoissa

C#:ssa luokat voivat sijaita tiedostoissa millä tahansa tavalla. Lähdekooditiedoston nimellä ei ole mitään tekemistä siinä määriteltyjen luokkien nimien kanssa. Yhteen tiedostoon saa sijoittaa useita julkisia luokkia. Versiosta 2.0 lähtien C# mahdollistaa myös luokan jakamisen kahdeksi tai useammaksi tiedostoksi (osittainen avainsana). Viimeistä ominaisuutta käyttävät aktiivisesti visuaaliset työkalut rajapinnan rakentamiseen: luokan osa, joka sisältää rajapintakonstruktorin ohjaamat kentät ja menetelmät, on korostettuna erillinen tiedosto, jotta ohjelmoijan suoraan muokkaama tiedosto ei sotkeutuisi automaattisesti luodulla koodilla.

Javassa jokainen tiedosto voi sisältää vain yhden julkisen luokan, ja Java edellyttää, että tiedoston nimi on sama kuin kyseisen luokan nimi, mikä poistaa sekaannusta tiedostojen ja luokkanimien välillä. Lisäksi Sunin suositteleman koodauskäytännön mukaan lähdekooditiedoston koko ei saa ylittää 2000 koodiriviä, koska suurempi tiedosto on vaikeampi jäsentää. Suuri koko tiedostoa pidetään myös merkkinä huonosta suunnittelupäätöksestä.

Poikkeukset

Molemmat kielet tukevat poikkeusten käsittelymekanismia, joka on syntaktisesti suunniteltu täsmälleen samalla tavalla: kielellä on poikkeusten luontioperaattori heittää ja poikkeusten käsittelylohko yritä()saappaa()()vihdoin(), joka varmistaa lohkon sisällä tapahtuvien poikkeusten sieppaamisen, niiden käsittelyn ja lopullisten toimien taatun suorittamisen.

Java tukee tarkistettuja poikkeuksia: ohjelmoijan on erikseen määritettävä kullekin menetelmälle poikkeukset, jotka menetelmä voi heittää. Nämä tyypit luetellaan metodin määrittelyssä throws-avainsanan jälkeen. Jos menetelmä käyttää menetelmiä, jotka heittävät tarkistettuja poikkeuksia, sen on joko tunnistettava eksplisiittisesti kaikki nämä poikkeukset tai sisällytettävä ne omaan ilmoitukseensa. Siten koodi sisältää nimenomaisesti luettelon poikkeuksista, jotka kukin menetelmä voi heittää. Poikkeustyyppien hierarkia sisältää myös kaksi tyyppiä (RuntimeException ja Error), joiden jälkeläisiä ei tarkisteta eikä niitä pidä kuvata. Ne on varattu ajonaikaisille poikkeuksille, joita voi esiintyä missä tahansa tai joita ohjelmoija ei normaalisti voi käsitellä (kuten ajonaikaiset virheet), eikä niitä tule määrittää heittoilmoituksessa.

C# ei tue tarkistettuja poikkeuksia. Niiden puuttuminen on kehittäjien tietoinen valinta. C#:n pääarkkitehti Anders Hejlsberg uskoo, että Javalla ne olivat jossain määrin kokeilua eivätkä oikeuttaneet itseään.

Rinnakkaisohjelmointi

Yleisesti ottaen C#:n rinnakkaisohjelmointimekanismit ovat samanlaisia ​​kuin Javan tarjoamat, ero on toteutuksen yksityiskohdissa. Molemmissa tapauksissa on olemassa kirjastoluokka Thread, joka toteuttaa "säikeen" käsitteen. Java tarjoaa kaksi tapaa luoda omia säikeitä: joko laajentamalla Thread-luokkaa tai toteuttamalla Runnable-käyttöliittymä. Molemmissa tapauksissa ohjelmoijan on määriteltävä peritty (sisältyy käyttöliittymään) menetelmä run(), joka sisältää säikeen rungon - siinä suoritettavan koodin. C# käyttää sen sijaan delegaatin mekanismia: säikeen luomiseksi luodaan tavallisen Thread-luokan esiintymä, jolle menetelmän sisältävä delegaatti - säikeen runko - välitetään konstruktoriparametrina.

Molemmilla kielillä on kyky luoda synkronisesti suoritettu koodilohko; Javassa tämä tehdään synchronized()-operaattorilla, C#:ssa - lock()-operaattorilla. Java mahdollistaa myös synkronisten menetelmien ilmoittamisen menetelmän ilmoituksen otsikossa olevalla synkronoidulla modifikaattorilla. Tällaiset menetelmät estävät suoritettuaan omistajaobjektinsa (siis luokan synkronoiduista menetelmistä samalle ilmentymälle voidaan suorittaa vain yksi kerrallaan, loput odottavat). Samanlainen ominaisuus on tarjolla .NET:ssä MethodImplAttribute MethodImplOptions.Synchronized -metodin toteutusmääritteen avulla, mutta toisin kuin Java, tämä ominaisuus ei ole muodollisesti osa C#-kieltä.

Molemmat kielet tarjoavat myös identtiset synkronointimahdollisuudet, jotka perustuvat signaalin lähettämiseen ja odottamiseen yhdestä säikeestä toiseen. Javassa nämä ovat notify(), notifyAll() ja wait(), C#:ssa nämä ovat Pulse(), PulseAll(), Wait()-metodit (kolme menetelmää ovat toiminnallisesti samanlaisia ​​pareittain). Ainoa ero on, että Javassa nämä menetelmät (ja vastaavasti monitoritoiminnallisuus) on toteutettu Object-luokassa, joten synkronointiin ei tarvita lisäkirjastoja ja C#:ssa nämä menetelmät toteutetaan staattisina menetelminä erillisessä kirjastoluokassa Monitor. . C#:ssa vakiokirjasto sisältää myös useita ylimääräisiä synkronointiprimitiivejä säikeiden rinnakkaiseen suorittamiseen: mutexit, semaforit, synkronointiajastimet. Versiosta 1.5 lähtien JDK SE on sisältänyt paketit java.util.concurrent, java.util.concurrent.atomic ja java.util.concurrent.locks, jotka sisältävät kattavan joukon työkaluja rinnakkaislaskennan toteuttamiseen.

Matalan tason koodi

Toistaiseksi ei komponentteja Java-ympäristöt ei ole Ecman, ISO:n, ANSI:n tai muiden standardien mukainen kolmannen osapuolen organisaatio standardit. Vaikka Sun Microsystems pidättää itsellään rajoittamattomat, yksinomaiset lailliset oikeudet Java-tavaramerkkiensä muokkaamiseen ja lisensoimiseen, Sun osallistuu vapaaehtoisesti Java Community Process (JCP) -nimiseen prosessiin, jonka avulla kiinnostuneet osapuolet voivat ehdottaa muutoksia mihin tahansa Sun Java -teknologiaan (kieli, työkalupakki). API) konsulttien ja asiantuntijaryhmiä. JCP-sääntöjen mukaan kaikki ehdotukset JDK:n, Java-ajonaikaisen tai -määrityksen muuttamiseksi Java kieli Sun voi yksipuolisesti hylätä sen, koska sen hyväksyminen edellyttää Sunin "kyllä"-ääntä. JCP vaatii jäsenmaksun kaupallisilta jäseniltä, ​​kun taas voittoa tavoittelemattomat järjestöt ja yksityishenkilöt voivat osallistua ilmaiseksi.

Lisenssi

Vaikka "Java" on Sunin tavaramerkki, ja vain Sun voi lisensoida nimeä "Java", on lukuisia ilmaisia ​​projekteja, jotka ovat osittain yhteensopivia Sun Javan kanssa. Esimerkiksi GNU Classpath ja GNU Compiler for Java (GCJ) tarjoavat ilmaisen luokkakirjaston ja kääntäjän, jotka ovat osittain yhteensopivia nykyinen versio Sun Java. Vuoden 2006 lopulla Sun ilmoitti, että kaikki Java-lähdekoodi, lukuun ottamatta omaa koodia, johon he eivät pidä oikeuksia, julkaistaan ​​ilmaisina ohjelmistoina muokatun GPL-lisenssin alaisena maaliskuuhun 2007 mennessä. Sun jakaa tällä hetkellä HotSpot Virtual Machine- ja Java-kääntäjänsä alla GPL-lisenssi, mutta tällä hetkellä ei ole ilmaista lisenssiä Java-standardille. Koska Sun säilyttää Java-lähdekoodinsa omistusoikeuden, sen julkaiseminen GPL:n alaisena ei estä Sunia jakamasta omaa tai avaamatonta Java-versiota tai lisensoimasta sitä muille.

C#, CLI-ajonaika ja suurin osa siihen liittyvästä luokkakirjastosta ovat standardoituja ja ne voidaan toteuttaa vapaasti ilman lisenssiä. Useita ilmaisia ​​C#-järjestelmiä on jo toteutettu, mukaan lukien Mono ja DotGNU. Mono-projekti toteuttaa myös monia epätyypillisiä Microsoft-kirjastoja oppimalla Microsoftin materiaaleista, kuten GNU Classpath ja Java. Mono-projekti pyrkii välttämään patenttien tai tekijänoikeuksien loukkaamista, ja projektia voidaan levittää ja käyttää vapaasti GPL-lisenssillä. Microsoft jakelee tällä hetkellä -versiota .NET-ajoaikastaan ​​ei-kaupalliseen käyttöön.

Käyttö

yhteisössä

Java on rakennettu avoimempaan kulttuuriin, jossa on erittäin kilpailukykyisiä yrityksiä eri toiminnallisilla alueilla. Useimmat lisäkirjastot ovat saatavilla ilmaisilla avoimen lähdekoodin lisensseillä. lähdekoodi. Sun kannustaa myös kuvaamaan joitakin toimintoja spesifikaatioina (katso JCP-prosessi), jolloin toteutus jätetään. kolmannen osapuolen kehittäjät(mahdollisesti viitetoteutus). Siten ongelma riippumattomuudesta ohjelmiston valmistajasta on ratkaistu.

Monon olemassaolosta huolimatta C# sitoo kehittäjät tiukasti Microsoft-alustaan ​​(mukaan lukien käyttöjärjestelmä, toimistoratkaisut). Näin ollen .NET:ssä kirjoitetun ohjelmiston käyttäjällä ei useinkaan ole vaihtoehtoa käyttää erilaisia ​​järjestelmäkomponentteja. Tämä johtaa ns. toimittajalukitukseen, jossa kolmannen osapuolen ohjelmistojen valmistaja voi sanella ostajalle lähes mitä tahansa ehtoja toteutetun projektin tukemiseksi. Vaikka Java-sovelluksen käyttäjä voi pääsääntöisesti valita lisäohjelmistojen toimittajan (kuten tietokanta, käyttöjärjestelmä, sovelluspalvelin jne.).

Suosio ja kehitys

Java on vanhempi kuin C# ja on rakennettu suurelle ja aktiiviselle käyttäjäkunnalle, tulossa lingua franca monissa modernit alueet tietojenkäsittelytiede, erityisesti ne, jotka sisältävät verkkoja. Java hallitsee ohjelmointikursseja amerikkalaisissa yliopistoissa ja korkeakouluissa, ja Java-kirjallisuutta on nykyään paljon enemmän kuin C#:sta. Javan kypsyys ja suosio on johtanut siihen, että Javassa on enemmän kirjastoja ja API:ita (joista monet ovat avoimen lähdekoodin) kuin C#:ssa.

Toisin kuin Java, C# on suhteellisen uusi kieli. Microsoft tutki olemassa olevia kieliä, kuten Java, Delphi ja Visual Basic, ja muutti joitain kielen ominaisuuksia vastaamaan paremmin tietyntyyppisten sovellusten tarpeita.

Yksi Javaa koskeva kritiikki on, että se kehittyy hitaasti ja siitä puuttuu joitakin ominaisuuksia, jotka helpottavat muodikkaita ohjelmointimalleja ja -menetelmiä. C#-kielen kritiikki on se, että sen kehittäjät saattavat olla liian innokkaita mukautumaan nykyisiin ohjelmointitrendeihin kielen keskittymisen ja yksinkertaisuuden kustannuksella. On selvää, että Java-suunnittelijat ovat omaksuneet konservatiivisemman lähestymistavan lisätäkseen merkittäviä uusia ominaisuuksia kielen syntaksiin kuin muut modernit kielet – ehkä he eivät ole halukkaita sitomaan kieltä trendeihin, jotka voivat johtaa umpikujaan pitkällä aikavälillä. Java 5.0:n julkaisun myötä tämä suuntaus murtui suurelta osin, sillä se toi kieleen useita merkittäviä uusia ominaisuuksia: foreach-silmukan, automaattisen rivityksen, menetelmät muuttuva numero parametrit, luetellut tyypit, yleiset tyypit ja huomautukset (jotka kaikki ovat C#:ssa).

C# puolestaan ​​kehittyy nopeammin ja rajoittuu paljon vähemmän uusien ongelmakohtaisten ominaisuuksien lisäämiseen. Tämä trendi näkyi erityisesti versiossa C# 3.0, jossa esiintyi esimerkiksi SQL:n kaltaisia ​​kyselyitä. (Uusia ominaisuuksia rakennetaan siten, että kieli pysyy kielenä yleiseen tarkoitukseen. Lisätietoja C# 3.0:sta on artikkelissa C#). Ongelmalähtöisiä lisäyksiä Javaan on harkittu, mutta ne on ainakin toistaiseksi hylätty.

Markkinoida

C#:a on sen alusta lähtien verrattu jatkuvasti Javaan. Ei voida kiistää, että C# ja sen hallittu CLR ovat paljon velkaa Javalle ja sen JRE:lle (Java Runtime Environment).

On kyseenalaista, onko C#:n kehitys jollain tavalla seurausta Microsoftin tiedosta, että hallitulla koodiympäristöllä, jossa Java on edelläkävijä, on monia etuja online-maailma, varsinkin Internetin tullessa muihin laitteisiin kuin henkilökohtaiset tietokoneet ja verkkoturvallisuuden kasvava merkitys. Ennen C#:n luomista Microsoft muokkasi Javaa (luomalla J++) lisätäkseen ominaisuuksia, jotka toimivat vain Windowsissa, mikä rikkoi Sun Microsystemsin lisenssisopimusta. Microsoftin ollessa liiketoimintastrategiansa toisessa vaiheessa, joka tunnetaan nimellä "Ole, laajenna ja sammuta", J++:n kehitys pysäytettiin Sunin nostaman kanteen johdosta. Microsoft ei pystynyt kehittämään Java-kloonia haluamillaan ominaisuuksilla, vaan loi vaihtoehdon, joka sopi paremmin heidän tarpeisiinsa ja tulevaisuuden visioonsa.

Tästä myrskyisästä alusta huolimatta käy yhä selvemmäksi, että kaksi kieltä harvoin kilpailevat keskenään markkinoilla. Java hallitsee mobiilialaa ja sillä on monia seuraajia verkkosovellusmarkkinoilla. C# on saavuttanut hyvän hyväksynnän Windows-työpöytäsovellusmarkkinoilla ja ASP.NETin ansiosta C# on toimija myös verkkosovellusmarkkinoilla.

Työpöytäsovellukset

Molemmilla kielillä on joukko kirjastoja, jotka tarjoavat käyttöliittymäominaisuudet työpöytäsovelluksille. Java:n tapauksessa nämä ovat usean alustan kirjastot Swing ja SWT sekä joukko vähemmän yleisiä. Periaatteessa mikä tahansa niistä antaa sinun luoda monialustaisia ​​työpöytäsovelluksia Javassa.

C#:lle Windows-alustalla, pääkirjasto, joka toteuttaa GUI käyttäjä työpöytäsovelluksissa on Windows.Forms, jonka omistaa Microsoft ja joka on toteutettu vain Windowsille, ja muille alustoille - gtk#, toteutettu osana Mono-projektia. Lomakkeita on yritetty toteuttaa vapaasti. Lomakkeita on tehty ja tehdään (esimerkiksi DotGNU-projektissa), mutta alkuperäisen suljetun luonteen vuoksi ne kärsivät väistämättä toissijaisuudesta ja epätäydellisyydestä, tuskin kilpailevat toteutuksen kanssa. Microsoft ja siksi sitä voidaan käyttää vain Windows-sovellusten viivästettyyn siirtoon muihin alustoihin. Kehitykset, jotka perustuvat natiivisti Windowsiin, on yleensä rakennettu Windows.Formsille, ja niiden siirtäminen toiselle alustalle tulee vaikeaksi. C#-kehitys Monossa gtk#:lla on kannettava, mutta niitä on huomattavasti vähemmän.

Java-grafiikkakirjastojen manuaalinen käyttö on kielen luonteesta johtuen hieman vaikeampaa. Java-grafiikkakirjastojen arkkitehtuuri on aloittelevan kehittäjän vaikeampi ymmärtää, mutta samalla se pakottaa hänet kehittymään ammattimaisesti. Sisäänrakennettujen tapahtumaohjelmointityökalujen ansiosta C# piilottaa tapahtuman käsittelyn yksityiskohdat ja joitain muita näkökohtia kehittäjältä, mikä helpottaa käyttöliittymän kehittämistä. .NET-alustalla käytettiin aluksi laajasti visuaalisen käyttöliittymän rakentajia. Kaikki tämä tarjoaa mahdollisuuksia nopea kehitys työpöytäsovellusliittymä matalalla ohjelmoijan pätevyydellä.

Viime vuosina Sun Microsystems on keskittynyt tuomaan Javaa entistä laajemmin työpöytäsovellusmarkkinoille. JRE 6 -alustan versiossa (2006) painopiste on vuorovaikutuksen parantamisessa käyttäjän graafisen ympäristön kanssa. Sunin JVM:n uusin versio (JDK 6 -päivitys 10) sisältää monia parannuksia käyttöliittymään. Erityisesti läpinäkyvät muodot ja ei-suorakulmaiset ikkunat. Java IDE:iden uusimmat versiot (esim. NetBeans) sisältävät myös merkittävästi parannettuja graafisen käyttöliittymän rakentajia.

C# ja Java ovat vähitellen tulossa suosituiksi useissa maissa käyttöjärjestelmät perustuu Linuxiin ja BSD:hen. Mono-projektin toteuttaminen oli juridisesti kivuton prosessi, koska CLR- ja C#-kielet ovat Ecman ja ISO:n standardoimia, ja kuka tahansa voi ottaa ne käyttöön ilman huolta juridisista ongelmista. Samalla on huomioitava, että alla kirjoitettu hakemus Windows-ympäristö voi olla merkittäviä ongelmia toisessa käyttöjärjestelmässä.

Palvelinsovellukset

Tällä areenalla nämä kaksi kieltä ovat ehkä lähinnä kilpailijoita. Java J2EE-alustalla (Java(2) Enterprise Edition) ja C# ASP.NETillä kilpailevat dynaamisen verkkosisällön ja -sovellusten luomisen alalla.

Molempia kieliä käytetään ja tuetaan laajasti näillä markkinoilla, samoin kuin JavaEE:lle ja .NET:lle saatavilla olevat työkalut ja tukituotteet.

Mobiilisovellukset

J2ME:llä (JavaME, Java(2) Micro Edition) on erittäin laaja markkinapohja matkapuhelimia ja PDA:t, joissa vain halvimmista laitteista puuttuu KVM (riistetty Java-virtuaalikone laitteille, joissa on rajalliset resurssit). Java-ohjelmia, mukaan lukien monet pelit, löytyy kaikkialta.

Vaikka lähes kaikissa puhelimissa on KVM, useimmat käyttäjät eivät käytä näitä ominaisuuksia kovinkaan paljon. Java-sovellukset useimmissa puhelimissa koostuvat yleensä valikkojärjestelmistä, pienistä peleistä jne. Täydelliset sovellukset matkapuhelimiin ovat harvinaisia.

Kehittyneet tekniikat

C Terävä- Tällä termillä on muita merkityksiä, katso C. Oikea otsikko tämä C#-artikkeli. Se on esitetty väärin teknisten rajoitusten vuoksi. C# Semantiikka: pakollinen Kieliluokka: moniparadigma: oliosuuntautunut,... ... Wikipedia

Visuaalinen J Sharp- Tämän Visual J# -artikkelin oikea otsikko. Se on esitetty väärin teknisten rajoitusten vuoksi. Visual J# on integroitu kehitysympäristö, jonka Microsoft on luonut .NET Frameworkille Java-kaltaisella kielellä. Varsinkin... ... Wikipedia

Fis- Tällä termillä on muita merkityksiä, katso F (merkityksiä). Oikea otsikko tälle F#-artikkelille. Se on esitetty väärin teknisten rajoitusten vuoksi. F# Kieliluokka: moniparadigma: toimiva, oliosuuntautunut, ... ... Wikipedia

Laula Sharp- Tämän artikkelin oikea otsikko on Sing#. Se on esitetty väärin teknisten rajoitusten vuoksi. Sing# Kieliluokka: moniparadigma: rakenteellinen, pakottava, oliosuuntautunut, tapahtumalähtöinen, toiminnallinen, ... ... Wikipedia

M.C. Sharp- MC# (luettu nimellä "MC Sharp", mcsharp), moniprosessori C# -ohjelmointikieli. MC# on korkean tason oliosuuntautunut rinnakkaisohjelmointikieli .NET-alustalle, joka tukee ohjelmien luomista, jotka toimivat ... ... Wikipediassa

Visual C Sharp

Visual C Sharp .NET- Microsoft Visual Studio Ulkonäkö Visual Studio 2008 SP1, jossa on C#-ohjelma Windows Vista Tyyppi Ohjelmistojen kehitysympäristö... Wikipedia

ECMAScript- Kieliluokka: moniparadigma: oliosuuntautunut, yleinen, toiminnallinen, pakottava, aspektisuuntautunut, tapahtumakeskeinen, prototyyppiohjelmointi Ilmestynyt: 1995 Tekijä(t) ... Wikipedia

Eikä nimenomaisesti määritelty muistin vapautusta. Molemmat sisältävät syntaksissaan synkronointimekanismit.

Sekä Javalla että C#:lla on vahvat ja heikot objektiviitteet. Java antaa sinun rekisteröidä kuuntelijan, joka vastaanottaa viestejä, kun linkki on kerätty roskat, mikä parantaa suorituskykyä WeakHashMap, jota ei ole C#:ssa. Molemmat kielet sallivat käyttäjäkoodin suorittamisen, kun objekti kerätään roskat. C#:ssa tämän mekanismi on erityinen viimeistelymenetelmä, joka ilmaistaan ​​tutun C++-destruktorisyntaksin kautta. Javassa tämä saavutetaan ohittamalla finalize-menetelmä, joka on ilmoitettu Object-luokassa.

Tietotyypit

Molemmat kielet tukevat ideaa (tunnetaan C#:ssa nimellä arvotyypit - arvotyypit), ja molemmat primitiivityyppien muuntamiseksi objektityypeiksi tarjoavat niiden automaattisen "käärimisen" objekteiksi (boxing) ja "unboxing". C#:ssa on primitiivisempiä tyyppejä kuin Java, etumerkittömät kokonaisluvut on yhdistetty kaikkien etumerkkien kanssa ja erityinen desimaalityyppi erittäin tarkkoja liukulukulaskutoimituksia varten. Java on hylännyt useimmat allekirjoittamattomat tyypit yksinkertaisuuden vuoksi. Erityisesti Javalla ei ole primitiivistä etumerkitöntä tavutyyppiä.

Symbolit ja erikoisominaisuudet

Javalla on erityinen syntaksi staattisten nimien tuontiin, jonka avulla voit käyttää lyhennettyjä nimiä joillekin tai kaikille luokan staattisille menetelmille ja muuttujille. C#:ssa on staattinen luokkasyntaksi, joka rajoittaa luokan vain staattisiin menetelmiin, mutta ei ole mahdollista määrittää vain näitä menetelmiä määrittelemättä luokkaa joka kerta erikseen.

Erityiset avainsanat

avainsana Mahdollisuus, esimerkki käyttöstä
saada, asettaa C#-syntaksi tukee .
ulos, ref C# tukee menetelmän lähtöparametreja, jolloin voit palauttaa useita arvoja.
kytkin C#:ssa switch-käsky toimii myös merkkijonoilla.
strictfp Java käyttää strictfp:tä varmistaakseen, että liukulukuoperaatioiden tulokset ovat muuttumattomia kaikilla alustoilla.
tarkastettu, tarkistamaton C#:ssa tarkistetut lausekkeet tai lohkot voivat sisältää aritmeettisen ylivuototarkistuksen ajon aikana.
käyttämällä C#:n use-avainsana varmistaa, että luotu objekti poistetaan tai suljetaan poistuttaessa: using (StreamWriter-tiedosto = uusi StreamWriter("test.txt")) ( file.Write("test"); )
mennään C# tukee hyppy-operaattoria. Se voi joskus olla hyödyllinen, vaikka yleensä suositellaan jäsennellympiä menetelmiä ohjauksen siirtoon (siksi se hylättiin Javassa). Yhteinen käyttö goto-avainsana C#:ssa - ohjauksen siirto eri tapaustunnisteisiin switch-lauseessa.

Tapahtumankäsittely

kytkin(väri) ( kotelo Color.Blue: Console.WriteLine("Väri on sininen"); tauko; kotelo Color.DarkBlue: Console.WriteLine("Väri on tumma"); goto case Color.Blue; // ... )

Java edellyttää, että ohjelmoija toteuttaa tarkkailijakuvion manuaalisesti, vaikka se tarjoaakin joitakin anonyymeinä, joiden avulla voit määrittää luokan rungon ja luoda siitä välittömästi ilmentymän johonkin koodin kohtaan. Tätä ominaisuutta käytetään yleensä tarkkailijoiden luomiseen.

C# tarjoaa laajan kielitason tuen tapahtumien ohjelmointiin, mukaan lukien .NET-delegaatit, ryhmälähetys, erityinen syntaksi tapahtumien asettamiseen luokissa, toiminnot tapahtumakäsittelijöiden rekisteröintiin ja rekisteröinnin poistamiseen, delegaattikovarianssi ja anonyymit menetelmät täydellä semantiikkalla.

Toiminnan ylikuormitus

Sulkemisia ehdotetaan sisällytettäväksi Java SE 7:ään. Näillä sulkejilla, kuten C#:n edustajilla, olisi täysi pääsy kaikkiin paikallisiin muuttujiin tietyssä laajuudessa sen sijaan, että ne voisivat vain lukea lopullisiksi merkittyjä muuttujia (kuten anonyymeillä sisäkkäisillä luokilla).

C# sisältää suuren joukon merkintäominaisuuksia, joista monet, kuten operaattorin ylikuormitus ja käyttäjän määrittämät ominaisuudet, ovat tuttuja C++-ohjelmoijille. Siinä on myös eksplisiittinen rajapintamenetelmien toteutus, jonka avulla luokka voi toteuttaa rajapintamenetelmiä erillään omista menetelmistään tai tarjota erilaisia ​​toteutuksia samannimistä menetelmistä, jotka kuuluvat kahteen eri rajapintaan.

Java ei sisällä operaattorin ylikuormitusta, koska sen väärinkäyttö voi johtaa vaikeasti luettavaan ja vaikeasti korjattavaan koodiin. Samaan aikaan Java:n ylikuormituksen puute tekee siitä vain vähän hyötyä joillekin matemaattisille ohjelmille.

menetelmät C#:ssa menetelmät eivät ole oletusarvoisia, ja ne on ilmoitettava erikseen virtuaalisen avainsanan kanssa. Javalla päinvastoin kaikki julkisia menetelmiä staattisia lukuun ottamatta ovat virtuaalisia. Avain final on analoginen sinetöidylle C#-kielellä, ja sen avulla voit estää menetelmän luomisen samalla allekirjoituksella johdetuissa luokissa. Virtuaalisuus takaa halutun päällekkäisyyden kutsutulle menetelmälle, mutta asettaa puheluille jonkin verran suorituksen lisäkustannuksia, koska nämä puhelut eivät yleensä käy läpi inline-korvausta ja vaativat lisäkutsun . Jotkut JVM-toteutukset, mukaan lukien Sunin, toteuttavat kuitenkin useimmin kutsuttujen virtuaalisten menetelmien korvaamisen.

C# vaatii nimenomaisen ilmoituksen aikomuksesta ohittaa virtuaalinen menetelmä johdetussa luokassa. Tätä tarkoitusta kuvaa ohitusavainsana. Jos ohittaminen ei ole ohjelmoijan tarkoitus ja halutaan vain ottaa käyttöön uusi virtuaalinen menetelmä samalla nimellä ja allekirjoituksella varjostaa vanhaa, tarvitaan toinen avainsana, uusi . Jos mitään näistä sanoista ei ole määritetty, seurauksena on käännösvirhe. Javassa mikä tahansa menetelmä ohittaa aina perusluokan menetelmän, jolla on sama nimi ja allekirjoitus, jos sellainen on. Tämä käyttäytyminen on mahdollisesti vaarallista, jos perusluokan on luonut toinen kehittäjä ja uusi versio ottaa käyttöön saman menetelmän, joka on jo olemassa johdetussa luokassa; tässä tapauksessa johdetun luokan olemassa oleva menetelmä ohittaa perusluokassa juuri käyttöönotetun menetelmän, mikä ei ole kummankaan kehittäjän tarkoitus.

Ehdollinen kokoelma

C#, toisin kuin Java, tukee ehdollista kääntämistä käyttämällä . Siinä on myös Conditional-attribuutti, mikä tarkoittaa, että määritettyä menetelmää kutsutaan vain, kun annettu käännösvakio on määritelty. Tällä tavalla voit lisätä koodiin esimerkiksi vahvistustarkistuksia, jotka toimivat vain debug-versiossa, kun DEBUG-vakio on määritelty. .NET-standardikirjastossa tämä on Debug.Assert()-menetelmä. Java-versiot 1.4 ja uudemmat sisältävät kielellä ajonaikaisen oletuksen tarkistusominaisuuden.

Nimiavaruudet ja lähdetiedostot

C#-nimiavaruudet muistuttavat enemmän C++:aa. Toisin kuin Java, lähdetiedoston sijainnilla ei ole mitään tekemistä sen nimitilan kanssa. Vaikka tarkalleen ottaen lähdetiedostojen sijainti Javassa ei välttämättä vastaa paketin hakemistorakennetta, se on oletuskäyttäytyminen.

Java vaatii nimen lähdetiedosto vastasi täsmälleen ainoan siinä määritellyn julkisen luokan nimeä, kun taas C# mahdollistaa useiden julkisten luokkien määrittämisen yhdessä tiedostossa eikä aseta rajoituksia tiedoston nimelle, ja lisäksi (versiossa 2.0 ja uudemmissa) voit jakaa luokka kahteen tai useampaan tiedostoon (avainsana osittainen).

Poikkeukset

Java-tuet tarkistetaan pakottamalla kaikkien poikkeusten täydellinen sieppaus ja käsittely. Kaikki poikkeukset, jotka menetelmä voi heittää, on lueteltava sen ilmoituksessa throws-avainsanalla. C# ei tue tarkistettuja poikkeuksia. Joidenkin kehittäjien mielestä tarkistetut poikkeukset ovat erittäin hyödyllisiä varmistamisen kannalta hyvä tyyli ohjelmointi. Toiset, mukaan lukien C#:n pääarkkitehti, väittävät, että Javassa ne olivat jossain määrin kokeilua eivätkä perustelleet itseään.

Yksi argumentti tarkistettuja poikkeuksia vastaan ​​on, että niitä käytettäessä funktion sisäisen koodin muuttaminen voi johtaa uusien poikkeusten heittämiseen, mikä edellyttää tämän funktion ja kaikkien muiden sitä kutsuvien funktion ilmoitusta. Lopulta käyttöliittymän yhteensopivuuden ylläpitämiseksi oli yleistä yksinkertaisesti ilmoittaa toiminnot heittopoikkeuksiksi, mikä kumosi koko idean tarkastetuista poikkeuksista. Toinen tapa ylläpitää käyttöliittymän yhteensopivuutta Javassa on ottaa kiinni äskettäin käyttöön otettu poikkeus, kääriä se vanhaan ilmoitettuun ja heittää se uudelleen. Esimerkiksi jos menetelmää muutetaan niin, että se alkaa käyttää tietokantaa sen sijaan, että se alkaa tiedostojärjestelmä, se voi napata itse SQLExceptionin ja heittää sen sijaan uuden IOExceptionin, koska menetelmän käyttäjän ei pitäisi olla tietoinen sen sisäisen toteutuksen yksityiskohdista.

Matalan tason koodi

Toteutukset

JVM ja CLR

Java on läsnä kaikenlaisissa käyttöjärjestelmissä ja ympäristöissä. On olemassa lukuisia toteutuksia, joskus avoimen lähdekoodin.

ClickOnce-tekniikka tarjoaa samanlaisia ​​toimintoja kuin Java Webstart, mutta se on saatavilla vain Windows-asiakkaat. Internet Explorer Windowsissa voi myös näyttää . NET Windows Forms, joka tarjoaa sovelman kaltaisia ​​toimintoja, mutta on rajoitettu tiettyyn selaimeen.

Standardointi

C#-kieltä ei ole määritellyt Microsoft, vaan standardikomiteat ja . Vaikka Sun säilyttää tekijänoikeudet ja veto-oikeudet Java-alustaan, jälkimmäistä hallitsee suurelta osin Java Community Process (JCP), jonka avulla asianosaiset voivat osallistua Java-teknologian uusien versioiden ja ominaisuuksien määrittelyyn.

C#:n ja .NETin ECMA- ja ISO-standardit määrittelevät kielen, CLI-kehyksen ja perusluokat(Perusluokan kirjasto tai BCL). Standardit eivät sisällä monia uusia kirjastoja, jotka Microsoft on toteuttanut vakiokehyksen lisäksi, kuten tietokantakirjastoja, graafisia käyttöliittymiä ja verkkosovelluksia ( , ja ). Microsoft on kuitenkin virallisesti suostunut olemaan asettamatta syytteeseen yhteisöprojekteja näiden kirjastojen toteuttamisesta.

Käyttö

yhteisössä

Java on rakennettu avoimempaan kulttuuriin, jossa on erittäin kilpailukykyisiä yrityksiä eri toiminnallisilla alueilla. Vaikka tämä ratkaisee täysin ohjelmistotoimittajan riippumattomuuden ongelman, se lisää kielen monimutkaisuutta. Kirjastojen ja komponenttien menestyksekäs käyttäminen edellyttää, että tiedät paitsi Javan, myös kaikki erilaiset kilpailevat kuoret ja puitteet sekä erilaiset toteutusten "temput".

Suosio ja kehitys

Java on vanhempi kuin C# ja on rakennettu suurelle ja aktiiviselle käyttäjäkunnalle, tulossa monilla nykyaikaisilla tietojenkäsittelytieteen aloilla, erityisesti niillä, joissa . Java hallitsee ohjelmointikursseja amerikkalaisissa yliopistoissa ja korkeakouluissa, ja Java-kirjallisuutta on nykyään paljon enemmän kuin C#:sta. Javan kypsyys ja suosio on johtanut siihen, että Javassa on enemmän kirjastoja ja API:ita (joista monet ovat avoimen lähdekoodin) kuin C#:ssa.

Toisin kuin Java, C# on suhteellisen uusi kieli. Microsoft tutki olemassa olevia kieliä, kuten Java ja , ja muutti joitain kielen ominaisuuksia vastaamaan paremmin tietyntyyppisten sovellusten tarpeita. Ajan myötä Javan väliaikainen etu vähenee.

Yksi Javaa koskeva kritiikki on se, että se kehittyy hitaasti ja siitä puuttuu joitain ominaisuuksia, joita muodikkaat ohjelmointimallit ja menetelmät helpottavat. C#-kielen kritiikki on se, että sen kehittäjät saattavat olla liian innokkaita mukautumaan ohjelmoinnin nykyisiin trendeihin kielen keskittymisen ja yksinkertaisuuden kustannuksella. Java-suunnittelijat ilmeisesti omaksuivat konservatiivisemman lähestymistavan lisätäkseen merkittäviä uusia ominaisuuksia kielen syntaksiin kuin muut modernit kielet – ehkäpä haluttomia sitomaan kieltä trendeihin, jotka voivat johtaa umpikujaan pitkällä aikavälillä. Java 5.0 torjui tämän suuntauksen monin tavoin, koska se esitteli useita merkittäviä uusia kielen ominaisuuksia: foreach-silmukan, automaattisen rivityksen, variadic-menetelmät, luetellut tyypit, yleiset ja huomautukset (jotka kaikki ovat C#:ssa).

C# puolestaan ​​kehittyy nopeammin ja rajoittaa itseään paljon vähemmän uusien ongelmakohtaisten ominaisuuksien lisäämisessä. Tämä trendi näkyi erityisen selvästi tulevassa C# 3.0:n versiossa, jossa esiintyi esimerkiksi -kaltaisia ​​kyselyitä. (Uudet ominaisuudet on suunniteltu pitämään kieli yleiskäyttöisenä kielenä. Lisätietoja C# 3.0:sta, katso

On kyseenalaista, onko C#:n kehitys jollain tavalla seurausta Microsoftin toteamuksesta, että Java-johtoisella hallitulla koodiympäristöllä on monia etuja yhä verkottuneemmassa maailmassa, varsinkin kun Internet on tullut muihin laitteisiin kuin henkilökohtaisiin tietokoneisiin ja tärkeä verkkoturvallisuus. Ennen C#:n luomista Microsoft muokkasi Javaa (luomalla ) lisätäkseen ominaisuuksia, jotka toimivat vain käyttöjärjestelmässä, mikä rikkoi käyttöoikeussopimusta. Kun Microsoft oli liiketoimintastrategiansa toisessa vaiheessa, joka tunnetaan nimellä , J++:n kehitys pysäytettiin Sunin nostaman kanteen johdosta. Microsoft loi vaihtoehdon, joka sopi paremmin heidän tarpeisiinsa ja tulevaisuuden visioon.

Tästä myrskyisästä alusta huolimatta käy yhä selvemmäksi, että kaksi kieltä harvoin kilpailevat keskenään markkinoilla. Java hallitsee mobiilialaa ja sillä on monia seuraajia verkkosovellusmarkkinoilla. C# on saanut hyvän hyväksynnän Windows-työpöytäsovellusmarkkinoilla, ja Microsoft on ajanut sen Windows-sovellusten ensisijaiseksi kieleksi. Kiitos , C# on myös toimija verkkosovellusmarkkinoilla.

Työpöytäsovellukset

Javaa syytetään toisinaan ylilupaamisesta ja alitoimituksesta työpöytäsovellusten suhteen. Vaikka sen AWT (Abstract Windowing Toolkit) -ikkunakirjastot tarjoavat runsaasti ominaisuuksia, Java on joutunut kamppailemaan vakiinnuttaakseen asemansa työpöytäsovellusten markkinoilla. Hänen tiukka noudattaminen periaatteessa<пишем один раз, используем везде>vaikeuttaa kunkin tietyn työpöytäjärjestelmän erityisominaisuuksien ja toimintatapojen hyödyntämistä. Tämän seurauksena Java-kielellä kirjoitetut työpöytäsovellukset näyttävät usein tältä<чужие>alustalla, jolla ne toteutetaan.

Jotkut sanovat, että Sun Microsystems on myös ollut hidas mainostamassa Javaa kehittäjille ja käyttäjille tavalla, joka tekee siitä houkuttelevan työpöytäsovelluksille. Jopa Java Web Startin kaltaisia ​​teknologioita, joilla on vähän kilpailijoita kielten ja alustojen joukossa, on mainostettu huonosti.

Java-version 6.0 julkaisu, joka on odotettu vuonna 2006, keskittyy uudelleen pöytäkonemarkkinoihin – laajalla valikoimalla uusia ja mielenkiintoisia työkaluja parempaan ja tiiviimpään integrointiin työpöytäympäristöön.

Kehittyneet tekniikat

Java on hyväksytty viralliseksi ohjelmistoksi käytettäväksi seuraavan sukupolven DVD-standardissa interaktiivisen BD-J-alustan kautta. Tämä tarkoittaa, että interaktiivinen sisältö, kuten valikot, pelit, lataukset jne., on kaikilla asemilla DVD Blu-ray luodaan Java-alustalle.

Java vs. C#... Mikä voisi olla parempaa kuin ikuinen kiista? Ei, tätä artikkelia ei ole omistettu toiselle vertailuarvolle, eikä se ole edes pyhää sotaa, ei ole edes kysymystä: "kumpi on siistimpi".

Jokaiseen tehtävään löytyy työkalu. Esimerkiksi C#:n ja Rubyn vertailussa ei ole mitään järkeä, koska niiden käyttötarkoitus on täysin erilainen, samoin niiden luonne. C# ja Java ovat kuitenkin filosofiltaan lähimmät.

Hyvin usein Java-kielellä kirjoittavat kollegat eivät edes ole tietoisia monista (!!!) asioista, joita C# tarjoaa (tai päinvastoin ei tarjoa).

Jos olet kiinnostunut katsomaan C#:a ja Javaa ilman subjektiivisuutta ja ota myös selvää sisäinen rakenne tämä tai tuo mahdollisuus, niin mene eteenpäin.

▌ Hieman historiaa

C#-kieli ilmestyi vuonna 2001, ja sen kehitys alkoi vuonna 1999. Tuolloin se oli hyvin samanlainen kuin Java 1.4. Nykyaikaisen C#:n, sellaisena kuin sen tiedämme, pitäisi kuitenkin alkaa versiosta 2.0 (joka vastaa Java 5:n julkaisua).

On olemassa mielipide, että C# lainaa paljon Javalta. Tästä olen kuitenkin vahvasti eri mieltä. Mielestäni C# on monella tapaa C objektien kanssa tai C++ ihmisen kasvoilla.

Toivon, että artikkeli ja sen perustelut vahvistavat tämän väitteen.
En kerro Wikipediaa uudelleen. Siksi siirrytään heti eteenpäin ja kävelemme läpi tärkeimmät erot ja etuja.

Ensin tarkastelemme itse JVM:n ja CLR:n (Common Language Runtime) ominaisuuksia, sitten tarkastelemme C#:n syntaktista sokeria.

▌ Episodi I: Bytecode

Sekä .NET että Java käyttävät tavukoodia. Tietysti itse muodon lisäksi on yksi erittäin tärkeä ero - polymorfismi.

CIL (Common Intermediate Language, joka tunnetaan myös nimellä MSIL, joka tunnetaan myös nimellä IL) on tavukoodi, jossa on polymorfisia (yleistettyjä) ohjeita.

Joten, jos Java käyttää erillistä ohjetta jokaiselle toiminnolle erilaisia ​​tyyppejä(Esimerkiksi: fadd- lisätty 2 kelluketta, iadd– 2 kokonaisluvun yhteenlasku), niin CIL:ssä jokaiselle operaatiotyypille on vain yksi käsky polymorfisilla parametreilla (esimerkiksi käskyä on vain yksi - lisätä, joka lisää sekä kelluvat että kokonaisluvut). Päätös sopivien x86-käskyjen luomisesta kuuluu JIT:lle.

Ohjeiden määrä molemmille alustoille on suunnilleen sama. Vertaamalla Java- ja CIL-tavukoodikomentojen luetteloa voit nähdä, että 206 ovat Javaa ja 232 ovat CIL:iä, mutta älä unohda, että Javassa monet komennot vain toistavat toistensa toimintoja.

▌ Episodi III: Generics (parametriset tyypit || parametrinen polymorfismi)

Kuten tiedät, Java käyttää tyyppipoistomekanismia, ts. geneeristen tuotteiden tuen tarjoaa vain kääntäjä, mutta ei ajonaikaisesti, ja kääntämisen jälkeen tietoja itse tyypistä ei ole saatavilla.

Esimerkiksi koodi:

Lista strList = uusi ArrayList (); Lista intList = uusi ArrayList (); bool areSame = strList.getClass() == intList.getClass(); System.out.println(areSame);
Näkyy totta.

Lisäksi yleisen tyypin sijaan T tyyppisen objektin esiintymä luodaan java.lang.Object.

Lista strList = uusi ArrayList (); strList.add("merkkijonoarvo"); Merkkijono str = strList.get(0);
Muunnetaan muotoon:

Listalista = new ArrayList(); list.add("merkkijonoarvo"); Merkkijono x = (merkkijono) list.get(0);
Siis koko tyyppinen turvallisuuspolitiikka on tuhottu välittömästi.

NETillä on päinvastoin täysi tuki geneeriset sekä käännös- että suoritusaikaiset.

Mitä tulee siis toteuttaa, jotta geneeriset tuotteet tukevat täysin Javaa? Katsotaanpa sen sijaan, mitä .NET-kehitystiimi teki:

  • Generics-tuki Common Type System -tasolla eri kielten yhteentoimivuuteen
  • Täysi tuki Reflection API:lta
  • Uusien luokkien/menetelmien lisääminen perusluokkiin (Perusluokan kirjasto)
  • Muutokset itse muodossa ja metatietotaulukoissa
  • Muutokset ajonaikaisen muistin varausalgoritmissa
  • Uusien tietorakenteiden lisääminen
  • Generics tuki JIT:ltä (koodinjako)
  • Muutokset CIL-muodossa (uuden tavukoodin ohjeet)
  • CIL-koodin vahvistajan tuki
Ne. geneeriset tuotteet ovat saatavilla paitsi käännös-, myös ajon aikana menettämättä tai muuttamatta tyyppitietoja. Myös nyrkkeilyn/pakkausten purkamisen tarve katoaa.

▌ Jakso IV: Tyypit

Java on täysin OO-kieli. Tämä on kiistanalaista. Tästä syystä: primitiiviset tyypit (kokonaisluku, float jne.) eivät peri java.lang.Objectista. Siksi Java-versiot eivät tue primitiivisiä tyyppejä.

Mutta todella OO-kielellä kaikki on objektia.

Tämä ei ole ainoa rajoitus. Ei ole myöskään mahdollista luoda omia primitiivisiä tyyppejä.

C# antaa sinun tehdä tämän. Näiden rakenteiden nimi on struct.

Esimerkiksi:

Julkinen rakenne Quad ( int X1; int X2; int Y1; int Y2; )
Myös C#:n yleiset ominaisuudet mahdollistavat arvotyyppien käytön (int, float jne.)

Jos Javassa sinun on kirjoitettava näin:

Lista intList = uusi ArrayList ();
Mutta et voi tehdä tätä:

Lista intList = uusi ArrayList ();
C# sallii primitiivisten tyyppien käytön.

Nyt tulemme aiheeseen tyyppihierarkiasta .NET:ssä.

NET:ssä on 3 tyyppiä: arvo-, viite- ja osoitintyypit.

Niin, arvotyyppi– primitiivisen tyypin analogi Javasta. Se on kuitenkin peritty System.Object, ei asu kasassa, vaan pinossa (ja nyt vastuuvapauslauseke: arvotyypin sijainti riippuu sen elinkaaren aikana esimerkiksi kun osallistut sulkemiseen, nyrkkeily tapahtuu automaattisesti).

Viitetyyppi– on sama kuin Java-viitetyypit.

Osoittimen tyyppi– on .NET:n epätavallisin ominaisuus. Tosiasia on, että CLR:n avulla voit työskennellä suoraan osoittimien kanssa!

Esimerkiksi:

Rakennepiste ( julkinen int x; julkinen int y; ) vaarallinen staattinen void PointerMethod() ( Pistepiste; Piste* p = p->x = 100; p->y = 200; Piste piste2; Piste* p2 = (*p2 ).x = 100; (*p2).y = 200;
Näyttää paljon C++-koodilta, eikö niin?

▌ Episodi V: C#-ominaisuudet

Ensin määritellään, mitä C# voi tehdä:
  • Ominaisuudet (mukaan lukien automaattinen)
  • Edustajat
  • Tapahtumat
  • Anonyymit menetelmät
  • Lambda-ilmaisut
  • Ilmaisupuut
  • Anonyymit luokat
  • Tehokas tyyppipäätelmä
  • Kuljettajan ylikuormitus
  • Indeksoijat
  • ...paljon enemmän
Ominaisuudet C#:ssa ne edustavat syntaktista sokeria, koska Käännettäessä ne muuttuvat tyyppimenetelmiksi Hanki XXX, AsetaXXX. Tieto itse käsiteominaisuudesta on kuitenkin tallennettu metatietoihin, joten mistä tahansa muusta tukikieliomaisuudesta voimme käyttää sitä vain objekti.OminaisuusX, ei object.GetPropertyX.

Esimerkiksi:

Public class TestClass ( public int TotalSum ( get ( return Count * Price; ) ) //automaattinen ominaisuus - kääntäjä luo itse kentät public int Count ( get; set; ) public int Hinta ( get ( paluu 50; ) ) )
Se muunnetaan muotoon:

Julkinen luokka TestClass ( /* *kaikki muu koodi */ yksityinen int k__BackingField; //automaattinen ominaisuus - kääntäjä luo itse kentät public int Count ( get ( return k__BackingField; ) asettaa (
k__BackingField = arvo; ) ) ) Edustajat

ovat analogeja osoittimille menetelmiin C/C++:ssa. Ne ovat kuitenkin tyyppiturvallisia. Niiden päätarkoituksena ovat takaisinsoittotoiminnot sekä työskentely tapahtumien kanssa. Samaan aikaan .NET:n edustajat ovat.

Tämä lähestymistapa eroaa olennaisesti Da Vinci -projektista Javalle, koska jälkimmäisessä he yrittävät laajentaa itse virtuaalikonetta.

Katsotaanpa esimerkkiä C#:ssa:

Julkinen luokka TestClass ( julkinen delegaatti int BinaryOp(int arg1, int arg2); julkinen int Lisää(int a, int b) ( return a + b; ) public int Kerro (int ensimmäinen, int toinen) ( paluu ensimmäinen * toinen; ) public void TestDelegates() ( BinaryOp op = new BinaryOp(Lisää); int tulos = op(1, 2); Console.WriteLine(result); //tulostaa: 3 op = new BinaryOp(Multiply); tulos = op( 2 , 5);
Ja myös C:ssä:

Int Add(int arg1, int arg2) ( return arg1 + arg2; ) void TestFP() ( int (*fpAdd)(int, int); fpAdd = //funktioosoitin int three = fpAdd(1, 2); / / kutsu funktiota osoittimen kautta)
Joten mitä me näemme? Jos C:ssä voimme siirtää osoittimen funktioon muun tyyppisillä parametreilla (esim. float arg1, float arg2), niin C#:ssa tämä on mahdotonta. C#:ssa edustajat käyvät läpi paitsi allekirjoituksen ja tyypin tarkistuksen käännösvaiheessa, myös ajon aikana.

Tapahtumat tarpeen tapahtumalähtöisen ohjelmoinnin toteuttamiseksi. Tietysti voit pärjätä EventDispatcher- tai Publisher/Subscriber-mallilla. Äidinkielen tuki tarjoaa kuitenkin merkittäviä etuja. Joista yksi on tyyppinen turvallisuus.

Esimerkiksi:

Julkinen luokka MyClass ( yksityinen merkkijono _arvo; julkinen delegaatti void ChangingEventhandler(merkkijono oldValue); julkinen tapahtuma ChangingEventhandler Changing; public void OnChanging(merkkijono oldvalue) (ChangingEventhandler handler = Vaihtuva; if (käsittelijä != null) käsittelijä(vanha arvo); ) public string Arvo ( get ( return _value; ) set ( OnChanging(_value); _value = arvo; ) ) public void TestEvent() ( MyClass instance = new MyClass(); instance.Changing += new ChangingEventhandler(instance_Changing); ilmentymä. Value = "uusi merkkijonoarvo"; //будет вызван метод instance_Changing } void instance_Changing(string oldValue) { Console.WriteLine(oldValue); } } !}
Anonyymit menetelmät yksinkertaistaa elämää merkittävästi - luokkarakenne pysyy puhtaana, ts. itse luokassa ei tarvitse luoda erillisiä ylimääräisiä menetelmiä.

Muokataan yllä olevaa esimerkkiä binäärioperaatioilla anonyymeillä menetelmillä:

Julkinen luokka TestClass ( public delegate int BinaryOp(int arg1, int arg2); public void TestDelegates() ( BinaryOp op = new BinaryOp(delegate(int a, int b) ( return a + b; )); int tulos = op( 1, 2); Console.WriteLine(tulos: 3 ) )
Eikö se ole lyhyempi ja puhtaampi?

Mietitäänpä nyt lambda-lausekkeet.

Lambda-lauseke on anonyymi funktio, joka sisältää lausekkeita ja operaattoreita ja jota voidaan käyttää myös edustajien tai lausekepuun luomiseen.

Julkinen luokka TestClass ( julkinen delegaatti int BinaryOp(int arg1, int arg2); public void TestDelegates() ( BinaryOp op = new BinaryOp((a, b) => a + b); int tulos = op(1, 2); Console.WriteLine(tulos); //tulostaa: 3 ) )
Miltä näyttäisi esimerkki tapahtumista? Hyvin yksinkertainen:

Julkinen luokka MyClass ( /* * kaikki muu koodi */ public void TestEvent() ( OmaLuokan ilmentymä = new MyClass(); ilmentymä.Muuttuva += (o) => Console.WriteLine(o); instance.Value = "(! LANG:uusi merkkijonoarvo"; //будет вызван Console.WriteLine } } !}
No, olemme vähentäneet koodia entisestään ja se alkaa näyttää toimivalta tyyliltä (!!!). Kyllä, C# on myös toiminnallinen kieli, koska... funktiot ovat ensiluokkaisia ​​objekteja.

Lambda-lausekkeet ja niiden kanssa lausekepuut luotiin LINQ(Kieli integroitu kysely).

Etkö vieläkään tunne LINQ:ta? Haluatko nähdä, miltä kuuluisa MapReduce LINQ:ssa näyttää?

Julkinen staattinen luokka MyClass ( public void MapReduceTest() ( var words = new ("...jotain tekstiä menee tänne..."); var wordOccurrences = sanat .GroupBy(w => w). Select(intermediate => new ( Sana = väli.Avain, Taajuus = väli.Sum(w => 1) ) .Missä(w => w.Taajuus > 10) .Järjestys(w => w.Frequency ) )
Tai käytä SQL:n kaltaista syntaksia:

Public void MapReduceTest() ( merkkijono sanat = uusi merkkijono ( "...jotain tekstiä menee tänne..." ); var wordOccurrences = w:stä sanoissa ryhmä w:llä väliin valitse uusi ( Word = väli.Avain, Taajuus = väli.Sum((merkkijono w) => 1) ) osaksi w jossa w.Taajuus > 10 järjestys w.Frequency valitse w )
Tässä esimerkissä näemme sekä LINQ (GroupBy().Select().Where() jne.) että anonyymit luokat -

Uusi ( Sana = väli.Avain, Taajuus = väli.Sum(w => 1) )
Hmm... mitä muuta tässä käytetään? Vastaus on yksinkertainen - tehokas tyyppinen päättelyjärjestelmä.

Avainsanalla on tässä tärkeä rooli var. C++11:llä on samanlainen muotoilu auto.

Joten ilman tyyppipäätelmää meidän pitäisi kirjoittaa näin:

Public void MapReduceTest() ( merkkijono sanat = uusi merkkijono ( "...jotain tekstiä menee tänne..." ); var wordOccurrences = Enumerable.OrderBy(Enumerable.Where(Enumerable.Select(Enumerable.GroupBy (sanat, delegoi (merkkijono w) ( return w; )), delegoi (IGRyhmitys välitaso) ( palauta uusi ( Sana = väli.Avain, Taajuus = Luettelo.Summa (keskitason, (Func ) (w => 1)) );<>f__AnonymousType0 w) ( paluu w.Frequency > 10; )), delegoi (<>f__AnonymousType0 w) ( paluu w.taajuus; )); )
[Tämä menetelmä meille luotu kääntäjä]

Kuvataksesi kaikkia muita C#:n ominaisuuksia, sen kääntäjäasetuksia jne. On tarpeen omistaa useampi kuin yksi artikkeli.

Sillä välin C# 5 - joka on jo saatavilla ja julkaistaan ​​pian virallisesti, lisää asynkroninen ohjelmointi, joka ilmestyi myös C++11:ssä!

▌ Johtopäätös

C# ja Java ovat voimakkaita kieliä, sekä tehokkaat alustat (.NET ja Java). Kuten jo kirjoitin artikkelin alussa, jokaista tehtävää varten on työkalu.

C# ei ole Javan jatko tai kopio. Jo silloin, kun sitä kehitettiin Microsoftissa, sen koodinimi oli COOL (C-like Object Oriented Language). Kuinka monta kertaa C/C++-analogia on mainittu tässä artikkelissa? Riittävä määrä.

Toivon, että artikkelini auttoi ratkaisemaan (ainakin hieman) kielten ja alustojen välisten erojen ongelman.

Kiitos huomiostasi!