Opmerkingen
- Zoals geschreven was de vraag een schoolvoorbeeld van niet constructief " welke taal is beter? " vragen die hier niet over het onderwerp gaan. Ik ' heb geprobeerd het constructiever te maken met een bewerking, aangezien het eigenlijk goede, goed doordachte antwoorden kreeg. Houd echter rekening met de Veelgestelde vragen en deze blogpost wanneer u dergelijke vragen stelt .
- Ik zal wat scherpere items toevoegen. .NET heeft een goed gedefinieerde DOM ( bijv.CodeDOM ) voor zijn taal en bijgevolg is het dynamisch genereren van dingen tijdens runtime een stuk eenvoudiger en efficiënter. Dit kan ook nuttig zijn als infrastructurele mogelijkheid. Ook heeft het typesysteem een 1-op-1 match met alle native W3-types. In wezen waren W3 en andere interops vanaf het begin in de taal ingebakken. Voor andere talen waren deze zorgen gewoon vastgelopen, en ze stellen hen voor veel uitdagingen. En als je ' interopereert met veel talen en / of protocollen, dan is .NET ook erg sterk
- Hey, JoeGeeky, voeg je commentaar toe als een antwoord op de vraag.
- De echte vraag is: om welke redenen moet ik Nemerle, F * en F # boven C # kiezen? (dwz alle drie de talen zijn van MS en alle drie zijn beter)
- Ik denk echt niet dat ' enige uitspraak van het genre " taal / platform X vergeleken met taal / platform Y is ALTIJD beter " is geldig en ik denk ook dat het voor elke X en Y gemakkelijk ongeldig kan worden gemaakt voor bepaalde contexten. Wat is ' is het punt van deze vraag?
Antwoord
De vraag moet zijn " Welke taal is beter geschikt voor moderne, typische applicatie-ontwikkeling? ".
Bewerken : Ik heb enkele van de onderstaande opmerkingen aangepakt. Een kleine opmerking: bedenk dat als je veel dingen native hebt, als idioom, het “een groot verschil is met het elke keer opnieuw implementeren of downloaden en gebruiken. Bijna alles kan in elk van deze talen worden geïmplementeerd. De vraag is – wat de talen voorzien je van nature.
Dus uit mijn hoofd (sommige argumenten zijn van toepassing op beide talen) …
C # is beter dan C ++ in dat:
- Het heeft native garbage-collection.
- Het stelt je in staat om class-method-handtekeningen te behandelen als gratis functies (dwz het negeren van het statisch getypte
this
pointer argument), en daardoor meer dynamische en flexibele relaties tussen klassen creëren. bewerk als je niet weet wat dit betekent, probeer dan een ledenmethode toe te wijzen die leegte retourneert en leegte accepteert aan eenvoid (*ptr)()
variabele. C # gedelegeerden dragen dethis
aanwijzer bij zich, maar de gebruiker hoeft zich daar niet altijd druk om te maken. Ze kunnen gewoon eenvoid()
methode van een willekeurige klasse toewijzen aan een anderevoid()
gedelegeerde. - Het heeft een enorme standaard bibliotheek met zoveel nuttige dingen die goed geïmplementeerd en gemakkelijk te gebruiken zijn.
- Het staat zowel beheerde als native codeblokken toe.
- Assembly-versiebeheer verhelpt gemakkelijk DLL-helproblemen.
- Je kunt klassen, methoden en velden instellen om assembly-intern te zijn (wat betekent dat ze toegankelijk zijn vanaf elke plek in de DLL waarin ze zijn gedeclareerd, maar niet vanuit andere assemblys).
C # is beter dan Java omdat:
- In plaats van veel ruis (EJB, implementaties van private statische klassen, enz.) krijg je elegante en vriendelijke native constructies zoals Eigenschappen en Gebeurtenissen .
- Je hebt echte generieke geneesmiddelen (niet de slechte casting-grap die Java generieke geneesmiddelen noemt), en je kunt erover nadenken.
- Het ondersteunt native resource-management idiomen (de
using
instructie). Java 7 gaat dit ook ondersteunen, maar C # heeft het al een veel langere tijd gehad. - Het heeft geen gecontroleerde uitzonderingen 🙂 (twijfelachtig of dit goed of slecht is)
- Het is diep geïntegreerd met Windows, als je dat wilt.
- Het heeft Lambdas en LINQ, en ondersteunt daarom een kleine hoeveelheid functioneel programmeren.
- Het maakt expliciet zowel generieke covariantie als contravariantie.
- Het heeft dynamische variabelen, als je ze wilt.
- Betere opsommingsondersteuning, met de
yield
instructie. - Hiermee kunt u nieuwe waardetypes (of niet-verwijzingen) definiëren.
Bewerken – Opmerkingen aanpakken
- Ik zei niet dat C ++ native RAII niet ondersteunt. Ik zei dat Java het niet heeft (je moet het expliciet proberen / eindelijk). C ++ heeft auto-pointers die geweldig zijn voor RAII, en (als je weet wat je doet) kan ook garbage-collection vervangen.
- Ik heb niets gezegd over het emuleren gratis functies. Maar bijvoorbeeld als je een veld moet openen met een
this
aanwijzer, en bind de methode die het doet aan een generieke functie pointer (dus niet in dezelfde klasse), dan is er gewoon geen native manier om het te doen. In C # krijg je het gratis. U hoeft niet eens te weten hoe het werkt. - Door " ledenmethoden te behandelen als gratis functies " Ik bedoelde dat je bijvoorbeeld “een lidmethode standaard kunt binden aan een vrije functiehandtekening, omdat de lidmethode " heimelijk " heeft de
this
pointer nodig. - De
using
instructie, uiteraard samen met IDisposable wrappers, is een goed voorbeeld van RAII. Zie deze link . Bedenk dat je RAII niet zo vaak nodig hebt in C # als in C ++, omdat je de GC hebt. Voor de specifieke tijden dat je het nodig hebt, kun je expliciet deusing
gebruiken Nog een kleine herinnering: geheugen vrijmaken is een dure procedure. GC heeft in veel gevallen hun prestatievoordeel (vooral als u veel geheugen heeft). Geheugen lekt niet en u zult niet veel geld uitgeven tijd bij het ongedaan maken van de toewijzing. Bovendien is de toewijzing ook sneller, omdat u niet elke keer geheugen toewijst, maar slechts af en toe. Doornew
te bellen, wordt gewoon een laatste object-pointer. - " C # is slechter omdat het garbage collection " heeft. Dit is inderdaad subjectief, maar zoals ik bovenaan heb aangegeven, is garbage collection voor de meeste moderne, typische applicatie-ontwikkeling een geweldig voordeel.
In C ++ zijn uw keuzes om uw geheugen handmatig te beheren metnew
een nddelete
, wat empirisch altijd tot fouten hier en daar leidt, of (met C ++ 11) je kunt autopointers native gebruiken, maar onthoud dat ze lots toevoegen en veel ruis naar de code. GC heeft daar dus nog steeds een voorsprong. - " Generieke gegevens zijn veel zwakker dan sjablonen " – ik doe het gewoon niet ” Ik weet niet waar je dat vandaan hebt. Sjablonen hebben misschien hun voordelen, maar in mijn ervaring zijn beperkingen, algemene parametercontrole, contravariantie en covariantie veel sterkere en elegantere tools. De kracht van sjablonen is dat ze je laten spelen met de taal a bit, wat misschien cool is, maar ook veel hoofdpijn veroorzaakt als je iets wilt debuggen. Al met al hebben sjablonen hun aardige eigenschappen, maar ik vind generieke geneesmiddelen praktischer en overzichtelijker.
Opmerkingen
- En als je nog steeds een Garbage Collector voor C ++ wilt, kun je er een downloaden .
- laten we deze discussie voortzetten in de chat
- Een andere belangrijke functie in C # vergeleken met Java, om prestatieredenen, is de " struct ", een type object dat kan worden opgeslagen op de stapel (of in CPU-registers, in speciale gevallen) of ingebed in andere heap-objecten. Ze worden vaak gebruikt voor kleine objecten met 1-4 velden, zoals X-, Y-coördinatenparen.
- @LokiAstari Heeft u uitleg? Zolang je eraan denkt om event-handlers uit te schrijven en het Dispose-patroon te gebruiken voor klassen die native wrappers bevatten, komt het goed met je '. Dat ' is veel minder om te weten en te onthouden dan geheugenbeheer in C ++.
- -1 aangezien ik de secties " C ++ is beter dan C # omdat … " en " Java is beter dan C # … ". Ik denk niet dat C # op alle gebieden superieur is, dus een antwoord zonder deze twee secties mist waarschijnlijk enige belangrijke informatie.
Antwoord
De omgeving
.NET Framework- en Windows-clients
Windows is het dominerende besturingssysteem op clientcomputers. De beste GUI-frameworks voor Windows-applicaties zijn Winforms en WPF samen met .NET Framework . De beste programmeertaal om te werken met het .NET Framework en zijn APIs zijn C # . Java is hiervoor geen alternatief.En C ++ is een oudere taal zonder automatisch geheugenbeheer. C # is vergelijkbaar met C ++ maar heeft automatisch geheugenbeheer en u hoeft niet met verwijzingen te werken, waardoor u productiever wordt. C ++ kan in sommige gevallen nog steeds de beste optie zijn, maar niet voor formulierintensieve databasetoepassingen die veel voorkomen in zaken.
IIS en Windows Server
Als u gewend bent om in de Windows-omgeving en met C # te werken, heeft u de minste investering nodig om IIS te leren voor serverprogrammering en Windows Server voor basisbeheer.
Active Directory en Windows Server
Als u software ontwikkelt die in bedrijfsnetwerken zal worden geïmplementeerd, is de kans groot dat ze een Windows-gecentreerde omgeving gebruiken met een Windows Server met Active Directory. In zon omgeving is het gemakkelijk om een oplossing te integreren en te implementeren die is gemaakt in C # en .NET Framework .
Persoonlijk ben ik “een Java-ontwikkelaar, geen C # -ontwikkelaar, maar ik werk met het web. Ik zou overschakelen naar C # als ik netwerktoepassingen voor Windows-netwerken zou ontwikkelen. Maar ik geef de voorkeur aan Java voor op Linux gebaseerde webservers. Ik zou C ++ kiezen voor embedded systemen als ik niet veel afhankelijkheden zou willen.
Ja, C # is een betere taal met modernere functies dan C ++ en Java, maar dat is en niet het belangrijkste bij het kiezen van C # .
Samenvatting
De omgeving voor uw software is het belangrijkst om te kiezen C # . Als u in een omgeving werkt met Windows-clients, Windows-servers, Active Directory, IIS en misschien SQL Server dan C # is verreweg de beste taal met het .NET Framework .
Als u in een Unix-omgeving werkt met bijv. webservices, Java zou mijn keuze zijn. En als u met embedded systemen werkt of moet integreren met hardwareapparaten, is C ++ een goede keuze.
Reacties
- Absoluut – dit is waarom ik C # gebruik, niet echt een andere reden
- Je kunt .NET zeker op andere platforms gebruiken via Mono, MonoTouch en MonoDroid, maar volgens mijn benchmarks is Mono aanzienlijk langzamer dan .NET voor Windows, en het eigen Compact Framework van Microsoft ' is extreem traag op Windows CE: codeproject.com/KB/cross-platform/BenchmarkCppVsDotNet.aspx … natuurlijk is WPF alleen beschikbaar op Windows (maar ik heb geen ' vind het toch niet leuk.)
- Welke afhankelijkheden bedoel je, welke " zou ik C ++ kiezen voor embedded systemen als ik niet ' t won ' t veel afhankelijkheden. " Bedoel je de Java-bibliotheken?
- @Puckl ja, maar meestal de jvm / jre.
- " Als je in een Unix-omgeving werkt met bijv. webservices " er zijn enkele andere talen & frameworks die kunnen worden overwogen: ruby, Python, node.js enz.
Antwoord
C # en Java
C # is een zeer goede taal als:
- U objectgeoriënteerde ontwikkeling voor algemene doeleinden wilt doen. Het is een klassieke, statisch getypeerde OOP-taal.
- U richt zich alleen op Microsoft-platforms (het is de moeite waard eraan te denken dat Microsoft effectief Java heeft gekloond om C # te maken, omdat ze een Java-achtige taal wilden die mensen Windows. Ze hadden Java kunnen gebruiken, maar dat zou mensen in staat hebben gesteld om gemakkelijk applicaties op andere platforms te draaien …)
C # als taal is op verschillende manieren mooier dan Java (beter syntaxis voor eigenschappen, waardetypes, reified generics etc.). Ik geef de voorkeur aan C # als taal boven Java, maar in het algemeen zijn het redelijk vergelijkbare talen en geschikt voor vergelijkbare toepassingen.
Aan de andere kant heeft Java ook enkele grote voordelen:
- Enorm open source ecosysteem – de bibliotheken voor Java die je gratis kunt krijgen zijn door ver het beste van elke taal. Het is moeilijk om het belang hiervan te overschatten – vanaf het punt om dingen gedaan te krijgen, is Java erg effectief.
- Tools – de Java-tools zijn naar mijn mening beter dan wat je in de .Net-wereld kunt krijgen . bijv. Maven (als je het eenmaal onder de knie hebt!) Is bijzonder indrukwekkend.
- Onderhoudbaarheid – Java bestaat al een tijdje en is succesvol geweest in grote bedrijven, juist omdat het relatief stabiel is en er veel moeite is gestoken in achterwaartse compatibiliteit. De eenvoudige en enigszins uitgebreide syntaxis helpt Java hier ook – het is gemakkelijker om code te lezen en te onderhouden als de code erg duidelijk en expliciet is.
- Nieuwe talen – De JVM heeft een aantal fantastische nieuwe talen (Scala, Clojure , Groovy etc.) die de toekomst zijn van het Java-platform. Dit is waar veel van de taalinnovatie plaatsvindt, en het gebeurt veel sneller dan in Java of C #.
Dus Java versus C # is redelijk dichtbij en het komt er echt op aan of je in het Microsoft-kamp of het Open Source / platformonafhankelijke kamp wilt zijn.
Persoonlijk geef ik de voorkeur aan Java omdat:
- Het bibliotheekecosysteem is naar mijn mening veel belangrijker dan het feit dat C # een mooiere syntaxis heeft dan Java
- Op de lange termijn wil ik dat al mijn code correct wordt gekruist -platform en kan draaien op grote clusters van goedkope Linux-machines in de cloud.
- Clojure is IMHO de meest veelbelovende taal ter wereld op dit moment, en als ik bij het JVM-platform blijf, zal ik in staat zijn tran plaats mijn code en vaardigheden gemakkelijk in Clojure na verloop van tijd.
C / C ++
C / C ++ is eigenlijk een heel ander beest. Ik zou het tegenwoordig niet aanbevelen voor algemene applicatie-ontwikkeling om de volgende redenen:
- Geheugenbeheer – voor de meeste programmering voor algemene doeleinden tegenwoordig, wil je dat niet beheer van uw eigen geheugen. Garbage collection in C # of Java is veel beter voor uw productiviteit en gezond verstand dan alle expliciete geheugenbeheertechnieken die u zult moeten gebruiken in C / C ++
- Complexiteit – C ++ in het bijzonder is een extreem complexe taal. Het kost veel tijd om onder de knie te krijgen en de code zelf kan ook duivels complex zijn. (C ++ -sjablonen zijn bijvoorbeeld bijzonder harig …)
- Productiviteit – meestal en al het andere als je gelijk bent, duurt het langer voordat je dingen gedaan krijgt in C / C ++.
Het is echter ongetwijfeld een goede keuze in een bepaald beperkt aantal speciale domeinen, in het bijzonder:
- Besturingssystemen – u wilt waarschijnlijk C / C ++ gebruiken als u een besturingssysteem schrijft.
- Ontwikkeling van games – bijna allemaal De beste commerciële game-engines zijn C / C ++. Het is nog steeds de beste keuze als u een veeleisende AAA-titel ontwikkelt (C # en Java zijn prima voor minder veeleisende / casual games)
- Computergebruik met hoge prestaties – geoptimaliseerde C / C ++ is waarschijnlijk de beste manier om zeer krachtige code maken. Voor de meeste toepassingen is dit optimalisatieniveau niet de moeite waard, maar in bepaalde domeinen kan het buitengewoon waardevol zijn (bijvoorbeeld hoogfrequente handel).
- Hardwaretoegang – u hebt directe toegang tot de hardware (bijv. voor een embedded systeem)
Dus eigenlijk is C / C ++ een goede keuze als en alleen als je gefocust bent op een van de domeinen waar het bijzonder geschikt is .
Reacties
- Je noemt maven als een voorbeeld van betere tools voor java. Ik ' ben er niet bepaald bekend mee, maar als ik naar de documentatie kijk, ziet Maven er ongeveer hetzelfde uit als de native .Net-buildtool MSBuild. Wat maakt Maven beter dan MSBuild?
- +! (alleen omdat ik maar één stem heb): je hebt heel goed uitgelegd waarom het Java-ecosysteem beter is en waarom je niet alleen de syntaxis van C # versus Java moet vergelijken. Java heeft meer en betere bibliotheken en tools. Er gebeurt niet veel in de Java-taal zelf, maar er verschijnen nieuwe zeer interessante talen voor de JVM die (IMO) veel interessanter zijn dan C #. Ik ken Clojure niet, maar ik vind Scala erg interessant: ontworpen om vanaf het begin OOP + FP te zijn.
- waarom denkt iedereen dat C ++ code vol zit met handmatig geheugenbeheer. Het is niet C, weet je, RAII betekent dat je bijna nooit handmatig geheugen moet toewijzen / vrijmaken (de keren dat je dat doet, zijn de tijden waarin een taal als C # nutteloos voor je zou zijn).
- @gbjbaanb – waarschijnlijk omdat RAII is ontoereikend voor geheugenbeheer voor algemene doeleinden. Het is op geen enkele manier hetzelfde in flexibiliteit als een volledig GC-systeem zoals je ziet in Java of C #. Zodra je de grenzen van RAII overschrijdt, ben je terug in het gebied van handmatig geheugenbeheer.
- @mikera Ik wil er alleen op wijzen dat er ook nogal wat taalontwikkeling is op .NET-platform. Bijv. F # is een nette functionele taal die soepel de rest van .NET integreert, en Python is onlangs geport naar .NET als Iron Python (en kreeg ook een mooie IDE ! ).
Antwoord
I heard that syntactically they are almost the same.
Syntactisch? Wie geeft een vliegende apen over syntaxis? Syntaxis is slechts goed voor één ding: snellere migratie mogelijk maken van syntactisch vergelijkbare talen. Dat is het.
C # is veel beter dan Java. Overweeg hun generieke en functionele programmeerondersteuning – C # loopt ver voor op Java. Om nog maar te zwijgen van overbelastingen door de operator en andere goede dingen – C # is veel beter uitgerust. Java kan onmogelijk als beter worden beschouwd dan C #.
C ++ en C # zijn meer een wedstrijd. C ++ heeft een ongelooflijk irritant archaïsch compilatiemodel en een heleboel oude ziekten van C, maar de sjablonen zijn veel krachtiger dan de generieke, en de benaderingen voor het beheer van bronnen zijn in het algemeen veel flexibeler en krachtiger, aangezien using
een complete mislukking is , en het wordt sneller uitgevoerd.
Reacties
- Ik denk dat je zowel taalkenmerken als de beschikbaarheid van een taal op verschillende platforms moet vergelijken. Met C # one zit opgesloten met Microsoft, met Java is dat niet: dat ' een groot voordeel is, in ieder geval voor UNIX / Linux-ontwikkelaars. OOP + FP zijn coole functies, maar waarom zou je je druk maken over C # als je kan Scala gebruiken, dat op de JVM draait en kan communiceren met oude Java-code? Ik zou nooit een platformspecifieke taal leren tenzij ik daartoe gedwongen word.
- @Giorgio: Het Mono-project bestaatMaar ten tweede zorgt Microsoft eigenlijk voor hun platform: ze geven het regelmatig grote upgrades. Java heeft nauwelijks iets nieuws gehad. De vraag gaat ook over C # versus Java, niet over CLR versus JVM.
- @DeadMG: Voor zover ik weet, kan ik geen enkel C # -programma nemen dat is ontwikkeld op Windows en het met Mono bouwen. Niet CLR versus JVM? De vraag is waarom mensen C # of Java gebruiken. Om mensen een taal te laten gebruiken, hebben ze een runtime en een besturingssysteem nodig. Ik bespreek niet het feit dat C # meer functies heeft dan Java, maar Java is veel draagbaarder: dit is een factor die de acceptatie van een taal kan beïnvloeden. In feite wordt Java nog steeds veel vaker gebruikt dan C #, zelfs als het bepaalde geavanceerde functies mist.
- @Giorgio, je kunt elk C # -programma nemen en het met Mono bouwen. U kunt bepaalde bibliotheken niet gebruiken (die sowieso geen deel uitmaken van de C # -taal). En java is niet " veel draagbaarder ". Je kunt voor iOS coderen in C #, maar niet in Java, bijvoorbeeld.
- @Giogio, Mono is minstens zo draagbaar als JVM.
Antwoord
Nou, C#
heeft een aantal leuke ingebouwde functies zoals LINQ
en afgevaardigden. Het haalt het beste uit twee werelden – Java
en C++
. Kijk hier voor een volledige vergelijking.
Maar ik vind de Java
wereld beter – veel meer open source frameworks en het draait op elk platform. En vertel me niet over Mono
– het is geen betrouwbare optie.
Opmerkingen
- +1: " Maar ik vind de Java-wereld leuker – veel meer open source frameworks en het werkt op elk platform. " Laat ' s hoop dat Oracle dit niet verandert!
- Let goed op, wat ' s niet " betrouwbaar " in Mono?
- @Petar Minchev, Het is niets anders dan je eigen schuld. Je moet de richtlijnen voor draagbaarheid volgen en dat mag je niet gebruik niet-draagbare bibliotheken – en op deze manier zou elke complexe applicatie betrouwbaar werken met Mono. Dingen zoals WPF zullen nooit worden geport.
- @Petar Minchev, er zijn veel niet-draagbare Java-bibliotheken die er zijn. Je moet altijd voorzichtig zijn met draagbaarheid, ongeacht welke taal je ' gebruikt. En hoe dan ook, de vraag gaat over de talen, niet de e bibliotheken van derden.
- @Petar Minchev, GTK # is draagbaar. Gebruik het in plaats daarvan.
Antwoord
Volgens sommige bronnen (zie bijv. http://www.indeed.com/jobtrends ) C # is nog steeds minder populair dan Java, en net zo populair als C ++.
C # biedt functies die Java mist, bijv directe ondersteuning voor bepaalde programmeer-idiomen zoals eigenschappen, functionele programmeerstijl, enzovoort. C # heeft een hoger abstractieniveau dan C ++, wat een voordeel is wanneer ontwikkeltijd belangrijker is dan programmasnelheid.
Persoonlijk geef ik nog steeds de voorkeur aan de Java / C ++ -werelden. Zoals Petar Minchev zei, Java heeft meer open-source frameworks en applicaties, het draait overal en is minder gebonden aan een bepaalde leverancier en besturingssysteem. C ++ heeft vergelijkbare voordelen, ook al heeft code vaak aanpassingen nodig om van het ene platform naar het andere te gaan. Omdat ik het liefst ontwikkel op Linux en, voor zover ik weet, ik C # niet volledig onder Linux kan zijn, heb ik nooit een echte interesse in C # gekregen omdat mijn programmeerbehoeften worden gedekt door C, C ++, Java, Scala.
Aan de andere kant is het voor veel ontwikkelaars geen probleem om aan een bepaalde leverancier te zijn gebonden: Microsoft heeft een dominante positie op de markt voor besturingssystemen en C # biedt veel kansen op werk. Daarom adopteren IMO veel ontwikkelaars C # omdat het, naast een taal met veel functies, ook een goede investering is.
Reacties
- " Ik kan geen volwaardige C # hebben op Linux " – Kun je hier wat meer over zeggen? Bedoel je dat het volledige .Net-framework niet ' t beschikbaar is omdat ik ' geen problemen met de C # -taal zelf ( of F # trouwens) op Linux?
- @wawa: Voor zover ik weet komt het .Net-framework overeen met de JDK, en het .Net-framework is alleen beschikbaar voor Windows, terwijl de JDK beschikbaar is voor verschillende besturingssystemen ' s. Als dit niet correct is, kan ik mijn antwoord bewerken (en ook mijn mening veranderen).
- Ik denk dat een nauwere analogie de Base Class Library naar de JDK zou zijn. De BCL heeft gestandaardiseerde en niet-gestandaardiseerde onderdelen. Het monoproject implementeert zowel de gestandaardiseerde als veel van de niet-gestandaardiseerde stukken.
- @wawa: Bedankt voor de informatie. Ik overweeg om C # eens te proberen met Mono. Toch heb ik nog steeds het sterke gevoel dat C # veel sterker verbonden is met Microsoft dan Java met Oracle (of in het verleden met Sun).
Antwoord
Hoe zit het met " Welk Software Development Framework, dat een programmeertaal bevat " zijn beter?
Je bent vergeten andere dingen toe te voegen, zoals de " omgeving " waarmee je gaat werken.
-
Gaat u alleen voor Windows OS werken, maar hoeft “geen laag niveau te zijn en veel geheugen en andere bronnen te hebben?
Kies .NET als framework over Windows, en gebruik C #.
-
Ga je alleen voor Windows werken, maar het hoeft niet “low-level” te zijn, MAAR niet veel bronnen hebben?
Kies het Delphi Framework (en Object Pascal Delphi programmeertaal of Lazarus Object Pascal programmeertaal)
-
Is uw app vereist ter ondersteuning van seve ral-platforms, zoals een game, in verschillende mobiele telefoons?
Kies het Java Framework en de programmeertaal Java.
-
Is het Linux met KDE als grafische interface?
Kies QT framework, met C ++
-
Is het Linux met Gnome als grafische interface?
Kies GObject / GLib framework , met C ++
-
Gaat u werken met veel bewerkingen op laag niveau, zoals het ontwikkelen van stuurprogrammas?
Gewone C of C ++ wordt gebruikt voor verschillende besturingssystemen Systemen, met standaardbibliotheken, als raamwerk.
Slechts mijn 2 cent.
Opmerkingen
- Ik ' ben niet zeker van 3. Smartphones zijn tegenwoordig erg populair en AFAIK, ze ondersteunen allemaal C # in een of andere vorm, maar alleen Android ondersteunt Java.
- Is niet ' t Delphi dood? 🙂
- @ šljaker Nee, maar, is niet ' t erg populaire thesedagen.
- @svick: Dat is een leugen. Afgezien van Android bestaat Java ook in een of andere vorm op iOS, Symbian, WinMo, Blackberry, Maemo en WebOS (dwz alles wat er toe doet of nog steeds telt; laat ' me niet aan de slag zelfs kleinere platforms). Android, Blackberry en Symbian ondersteunen officieel Java als ontwikkelingsoptie; Sun ondersteunde Java op iOS, zelfs als Apple er geen zin in heeft. Java is de primaire ontwikkeltaal in Android- en Blackberry-telefoons. Ik kan ' niet hetzelfde zeggen met C #, AFAICT het ' wordt alleen officieel ondersteund op WinMo.
Antwoord
Als u een zoekopdracht uitvoert, zult u waarschijnlijk struikelen over discussies over de beste programmeertalen. Hier is een van de zoekresultaten – http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html – Java lijkt nog steeds de meest populaire taal te zijn.
Java probeerde enkele van de tekortkomingen van C ++ weg te nemen (en het leven van de programmeurs eenvoudiger te maken voor niet-realtime en niet-kritieke applicaties). Omdat C # de laatkomer van de partij was, werden enkele tekortkomingen van de Java-taal vermeden. C # heeft veel vooruitgang geboekt (aangezien Microsoft er veel controle over heeft), terwijl de vooruitgang in Java gedurende een aanzienlijke periode werd geblokkeerd vanwege conflicten tussen de belanghebbenden.
Antwoord
Een paar dingen die nog niet zijn genoemd:
C # is beter dan C ++ omdat:
Het verwijdert met header-bestanden, wat zich vertaalt naar grote eenvoud.
C # is beter dan Java omdat:
Het ondersteunt zowel reference-type (class) als value-type (struct) door de gebruiker gedefinieerde typen, die, als u weet wat u doet, aanzienlijke prestatievoordelen kunnen opleveren.
Het ondersteunt gedelegeerden, die net als single-method interfaces zijn, waardoor het coderen van vaak voorkomende constructies waarbij single-method objecten betrokken zijn aanzienlijk wordt vereenvoudigd.
Opmerkingen
- Kunt u uitleggen op welke manier het hebben van zowel referentietype als waardetype prestatievoordelen kan opleveren in C #?
- Als u bijvoorbeeld een reeks records wilt hebben , in Java heeft u geen andere keus dan uw record te beschrijven met behulp van een klasse, dus uw array zal een reeks verwijzingen zijn naar een veelvoud aan afzonderlijk toegewezen objecten. In C # kunt u uw record beschrijven met behulp van een struct, zodat uw array slechts één aaneengesloten geheugengebied is dat uw structuren achter elkaar bevat, net als in C.
- Als een ander voorbeeld, als u wilt om een klein nieuw type te definiëren (een type dat in een machinewoord zou passen), hoeft u er geen nieuwe klasse voor te definiëren; je kunt er eenvoudig een struct van maken, dus het zal waardensemantiek gehoorzamen. Het doorgeven van dergelijke constructies zal niet duurder zijn dan het doorgeven van verwijzingen naar objecten, maar je zult het voordeel hebben dat je geen objecten toewijst, construeert en afval verzamelt.
- Ik begrijp het. Dus klassen worden geïnstantieerd op de heap en benaderd via referenties, terwijl structs worden geïnstantieerd op de stapel (?)
- Bijna correct. De enige onnauwkeurigheid in deze verklaring is dat een struct op de heap wordt gevonden als deze is ingesloten in een ander object, of als deze zich in een array van structs bevindt. En het zal ook op de heap worden gevonden als het ooit wordt ingekapseld, op precies dezelfde manier als waardetypes worden ingekaderd in Java.
Answer
U moet de taal kiezen die het beste bij uw verwachte omgeving en uw expertise past.
Kies C # als u in een omgeving met alleen Microsoft werkt. Hoewel C # is gestandaardiseerd onder ISO / IEC 23270: 2003, blijft de versie van Microsoft de enige volledige implementatie. Verschillende sleutelonderdelen van de taal vallen niet onder de standaard en zijn dus onderworpen aan de patenten van Microsoft. Niemand anders implementeert een volledig compatibele versie van de taal voor andere systemen, dus in feite bent u als leverancier gebonden aan Microsoft Windows en .Net zolang u de taal gebruikt. Als u op zoek bent naar vaardigheden die u op de mobiele markt kunt gebruiken, kunt u het beste naar een andere taal kijken.
Java werkt, maar heeft veel overhead, deels dankzij functies als garbage collection. Java is ook niet gestandaardiseerd door ISO / IEC, dus je hebt geen garanties als je van platform en versie van Java verandert, alleen de beste bedoelingen van Sun / Oracle. Als je uiteindelijk van plan bent om met Android te gaan werken, is dit zeker de juiste keuze . De programmering van Android is in feite Java, met een paar wijzigingen.
C ++ is gestandaardiseerd en bijna alle compilers volgen de internationale standaard, dus je hebt gegarandeerd gedrag MAAR de taal beschermt je niet tegen jezelf. U moet zelf een opruim- en overloopcontrole uitvoeren. Dit is niet moeilijk. C / C ++ programmeurs doen dit al jaren. Apple gebruikt Objective C voor alles, dus als je op Apple wilt mikken, raad ik je aan dit in plaats daarvan te proberen.
Als je merkt dat je Windows op een gegeven moment achter je laat, raad ik je aan om zowel C / C ++ als Java te leren – die beide op dit moment verhandelbaar zijn.
Antwoord
Met betrekking tot C ++ vs C # (aangezien ik niet bekwaam genoeg ben in Java), wat ik hier mis, is de mogelijkheid om toegang te krijgen tot dingen op laag niveau op Windows. Je kunt bijvoorbeeld (nog) geen native beeldschermstuurprogramma ontwikkelen in C #, maar wel met C ++. Dit maakt C ++ niet beter. Ik zie C ++ versus C # als Assembly versus C.
C # staat in mijn weergave veel efficiënter als je kijkt naar de tijd die nodig is om een functie daadwerkelijk te implementeren. De prestatieverbinding van de .Net-runtime is verwaarloosbaar voor 99% van de ontwikkelde applicaties. Het kan van belang zijn als je een strakke lus hebt, ja in ieder geval, maar meestal is een applicatie inactief, wachtend op elke vorm van invoer, signaal of onderbreking (schijf IO, knopklik, netwerk, voltooiing animatie).
De CLR-bibliotheek met al zijn functies heeft nog een groot voordeel. Toen ik C # aan het trainen was voor junior-ontwikkelaars, zeiden de meesten dat ze de logische naamgevingsconventie van klassen, leden en naamruimten leuk vonden. Het vinden van een kenmerk van de methode was logisch in de SDK, iets waar Visual Basic 5 ernstig tekortschoot. Dit heeft hen enorm geholpen bij het adopteren van de bibliotheek. Na het leren van de syntaxis van een taal, is het belangrijk om een nieuwe bibliotheek te leren kennen om een goed begrip te krijgen van een SDK. Het bespaart u het wiel opnieuw uit te vinden.