Article View: be.comp.programming
Article #10081Re: C, C++, C.NET (zeer lang antwoord)
From: Philip Paeps
Date: Sun, 31 Mar 2002 11:56
Date: Sun, 31 Mar 2002 11:56
291 lines
17136 bytes
17136 bytes
Lazarus Lang <lazaruslang@yahoo.com> wrote: > "Wim" <wim1@gEeNsPaMpandora.be> wrote in message > news:3ms8au0umst4jhqbt7mepgtio9mv3fdb2t@4ax.com... > > Kan er mij iemand kort uitleggen wat het verschil is tussen C, C++ en > > C.NET (als dat laatste al een taal is)? > Pfffff, waar te beginnen ??? :) C is de oudste van de drie en bestaat al > van in de jaren zeventig, alhoewel het pas echt populair geworden is tijdens > de jaren tachtig. Het is een zuiver functionele taal zoals Pascal en > Modula. Dat betekent dat je je programma niet opbouwt uit klassen maar > alleen met functies. Neen, C is altijd populair geweest, al van bij het begin. Alle UNIX varianten (zelfs van voor 1980) zijn in C geschreven en C was 'de' taal om te leren. C is ook een *procedural* taal, en niet enkel een *functionele* taal. Elke taal is functioneel (behalve VB); functioneel betekent dat je er iets mee kunt doen. Procedural betekent dat je in procedures moet denken, niet met objecten. En dat heeft soms ook zijn voordelen. > C++ is ontworpen in de jaren tachtig maar evolueert nog steeds (alhoewel > steeds minder en minder). Het is DE meest populaire taal op dit ogenblik > bij de implementatie van softwareprojecten van allerlei aard. Dat komt > omdat het een echte all-rounder is. Het is een volwaardige Object Oriented > taal die toch toelaat om de "bits te neuken" (zoals C). Je kan er snelle > spelletjes mee maken maar ook met een hoog abstractieniveau werken en er > b.v. complexe gedistribueerde softwaresystemen mee ontwerpen en > implementeren. C++ is zo ontworpen dat het syntactisch bijna volledig > backwards compatible met C, om de overgang van C naar C++ in de praktijk zo > gemakkelijk mogelijk te maken. Dat betekent echter ook dat het nog steeds > die onhandige header files hanteert voor de klasse-definities en aparte .cpp > (of .cc) files voor de klasse-implementaties ! Dat is niet alleen onhandig > maar ook traaaaag bij het compileren (preprocessen eigenlijk). En dat is echt belangrijk h�? Hoe lang een programma duurt om te compilen. Moest je modulair programmeren zou je de header files wel leren te respecteren en ervan te houden. Het is niet omdat het langer duurt om te compilen dat ze daardoor 'nutteloze overhead' zijn. Niet vergeten dat het ook soms belangrijk is om een programma te *maintainen* niet alleen te *compilen*. Als jij je hele programma in ��n immense source-file gaat gieten wordt het een soep. Als je verschillende source-files gaat gebruiken heb je header files nodig om je sources aan elkaar te linken. > Sinds 1995 is er Java, een van C++ afgeleide taal, die alle nuttige en > meestgebruikte features van C++ heeft (alhoewel) en de backward > compatibility met C bijna volledig overboord gooit zodat we nu geen last > meer hebben van header files en ons niet meer rechtstreeks moeten inlaten > met geheugenallocatie en -deallocatie. Dat betekent dat je je kan toeleggen > op de design en de logica van je software zonder uuuuuuren te zoeken naar > die obscure pointer in een van je datastructuren waarvan je het geheugen was > vergeten te dealloceren. Java doet dat allemaal voor jou omdat het zelf > bijhoudt wanneer een stuk geheugen niet meer gebruikt wordt en het dan zelf > vrijgeeft. Je hebt iets tegen header files. Je bent ook vergeten dat memory management ��n van de krachtigste features van een taal is. In Java kan je trouwens ook zelf je memory managen, maar je *moet* het niet zelf doen. Daar zit het verschil met C++ en C. Het correct gebruik van pointers en memory management zit volgens mij bij in het logisch denken en designen van je programma. Het zijn geen twee volledig onafhankelijke concepten. Memory management moet zeker in het design van je programma zitten, anders maak je er een onhandelbaar monster van. > Java zet nog een andere belangrijke stap (vooruit ?) door niet langer > processor-specifieke machinecode te produceren maar wel een soort > processor-onafhankelijke machinecode, die dan door de Java Virtual Machine > terplekke (tijdens het uitvoeren van het programma) wordt omgezet in de > processor-specifieke machinecode. Die extra stap zorgt er natuurlijk voor > dat Java programma's meestal een stuk trager zijn dan gelijkaardige > programma's die in C++ werden geschreven. Het is ook mogelijk Java > just-in-time te compileren naar native machinecode, maar om een of andere > reden wordt niet veel gedaan, behalve bij embedded systemen. Ik weet eerlijk > gezegd niet waarom. Java wordt tegenwoorig ook zeer veel gebruikt misschien > wel even veel als C++ maar dan typisch voor complexe (moeilijk in C++ te > ontwerpen) systemen waar performance niet van het allergrootste belang is, > zoals allerlei soorten serverside software (web servers, servlet containers, > Java 2 Enterprise Edition (J2EE) software, etc...) Complexe systemen zouden dus volgens jou moeilijk in C++ te implementeren zijn waardoor je ze beter in Java schrijft? Daar ben ik het niet mee eens. Als jij een programma moet schrijven voor een publiek/doel waarvan je niet zeker bent of er een Java compiler of runtime environment is, ga je het toch in C++ schrijven, complex of niet? Als een taak complex is om in C++ te implementeren zal die ook wel complex zijn om in Java te implementeren. Niet vergeten dat Java ook regelmatig 'C--' genoemd wordt, en dat het veel gemeen heeft met C++. > Dit brengt ons bij C# (en Managed C++). Qua syntax en structuur lijkt C# > zeer sterk op Java. Microsoft heeft er echter nog een paar aardigheidjes aan > toegevoegd (zoals delegates) en verschillende keywords van naam veranderd > zodat het niet al t� hard opvalt dat C# eigenlijk een doorontwikkeling is > van hun eigen Java-implementatie die ze niet langer op de markt brengen. Embrace, Extend, Extinguish. Verschillende keywords van naam veranderen is *de* ideale manier om een nieuwe taal te maken uit een oude die je niet langer op de markt brengt. Geniaal! Delegates zitten trouwens ook in Objective-C, als ik me niet vergis. Of wist je niet dat er ook andere OO varianten op C bestonden dan C++ en het o-zo-heilige C#? > Over de politieke achtergronden en de conflicten met Sun (de ontwerpers van > Java) laat ik me hier niet uit. Er is echter wel een groot technologisch > verschil : C# is (in de praktijk althans) niet cross-platform zoals Java. C# > draait alleen op x86 processors, alhoewel dat in theorie ook anders kan. In > theorie, want Microsoft controleert C# volledig en is natuurlijk niet > geneigd implementaties voor andere processors dan de x86 of zelfs operating > systemen dan Windows te maken. Ze hebben echter C# wel ter standaardisatie > voorgelegd aan de ECMA (een Europese standaarden- organisatie zoals de ISO, > ANSI en andere). In principe is het dus mogelijk C# en de onderliggende > runtime library (CLR) te implementeren op andere platformen. Dit is echter > een gigantische taak die niemand behalve MS zelf voor mekaar kunnen krijgen, > mijns inziens. En precies daarom zou je C# als *de pest* moeten vermijden! Microsoft heeft *volledige* controle over het runtime environment waardoor je *nooit* volledig algemene programma's zult kunnen schrijven zoals je dat in Java wel kunt. Het feit dat ze hun library aan de ECMA hebben voorgelegd betekent nog steeds niet dat je het als standaard mag beschouwen. Zo lang het niet 'universeel' implementeerbaar en bruikbaar is, is het volkomen waardeloos. Het werkt enkel onder wintendo, en het wordt door Microsoft gecontroleerd. Meer moet je niet zeggen om tot de conclusie te komen dat het waardeloos is. Of wil jij *echt* dat je programma's de monopolie mee versterken? [...] > maar het grote verschil is dat je programma's de eerste keer dat ze > uitgevoerd worden just-in-time (JIT) gepre-compileerd worden naar een voor > jouw x86 processor optimale vorm. De machinecode is dus verschillend voor > een Pentium, Pentium Pro, PII, PIII of PIV. Hierdoor valt het gebrek aan > performance dat Java heeft t.a.v. C++ voor C# helemaal weg. Je verwart JIT en at-first-execution en at-run-time. En hoe ga je machine-code produceren voor mijn Alpha? Of voor mijn Sparc II? Juist, Microsoft zal geen implementatie maken, waardoor je weer maar eens aan ��n platform vast zit. > Theoretisch is C#-code zelfs iets sneller dan C++-code, omdat je de de > processor-optimalisaties nu at run-time kunnen gebeuren en altijd pertinent > zijn voor jouw processor. Bij C++ dienen de programmeurs conservatieve > optimalisatiekeuzes te maken op voorhand bij de compilatie. Ze kunnen geen > PIII optimalisaties doorvoeren als hun software ook op een Pentium moet > kunnen draaien. Neen, de compiler optimalisaties liggen bij de gebruiker, niet bij de programmeur. Het is niet noodzakelijk de taak van de programmeur om zijn programma's te compilen. De gebruiker dient te weten wat voor compiler en wat voor platform hij heeft voor dat hij de source van de programmeur gaat compilen. De gebruiker kan dan zelf instellen welke compile-time optimalisaties hij wil uitvoeren. Als de programmeur binaries wil distribueren moet hij kijken naar zijn target platforms. Hij kan bijvoorbeeld verschillende ge-optimaliseerde binaries distribueren voor verschillende hardware en software platforms. > Het leuke aan de .net architectuur is echter dat C# maar 1 van de vele > mogelijke talen is ! VB.NET is nu een bijna volwaardig alternatief voor C#, > zowel op het gebied van object oriented language features als op het gebied > van performance. De tijd dat VB geen volwaardige taal was, is voorbij ! Neen. VB is nog steeds geen volwaardige taal. VB laat je toe om wat op Wintendo te klooien en te denken dat je aan het programmeren bent. Dat is ook het geval met .NET. > Het is eerder een kwestie van syntax-voorkeur/kennis die je ertoe brengt een > bepaalde taal te kiezen bij de implementatie van een .net-gebaseerd project. > Ik geloof dat er intussen meer dan twintig verschillende compilers zijn voor > .net waaronder de bekendste namen zijn: J# (Java for .net !!!!) Pascal.net, > Cobol.net, SmallTalk.net, Eiffel.net. Bovendien kan je perfect de talen > mengen! Alles wordt toch nog naar 1 gemeenschappelijke "taal" gecompileerd: > MSIL. Geniaal, en al deze talen werken op mijn Sun Blade waarop ik Solaris staan heb? Niet dus. Conclusie: perfectly worthless. De Microsoft monopolie breidt zich nogmaals uit. Fantastisch gewoon! > C# wordt nog niet zo heel veel gebruikt maar dat is omdat het nog zo jong > is. De eerste finale versie van de .net framework sdk is immers nog maar een > dikke twee maand oud. Toch zijn er al tienduizenden mensen overal ter > wereld bezig met .net voor hun nieuwe projecten, omdat ze over- tuigd zijn > van de technische kwaliteiten van dit nieuwe platform (EN omdat er een grote > vis als Microsoft achter staat :) ). En hun aantal groeit met de dag. De > meesten gebruiken uiteraard C# voor projecten, maar ver- geet die miljoenen > VB-programmeurs niet die uiteraard (in eerste instantie ?) Verder zijn er ook honderduizende *programmeurs* die .NET nog met geen six-foot pole zullen aanraken precies omdat MS erachter zit. De technische kwaliteiten zijn nihil: je zit er gewoon mee vast aan wintel. Waardeloos. > VB.NET zullen gebruiken en voor de eerste keer zullen ze zich daar niet voor > moeten schamen !!! Ik ben er zelf zo eentje. Hoewel ik intussen ook met C, > C++ en (recentelijk) Java vertrouwd ben, heb ik toch nog altijd een > nostalgisch zwak voor die ietwat rare VB syntax, alhoewel ik moet toegeven > dat C# de cleanste syntax heeft. Ik schakel ooit nog wel eens over naar C# > en het leuke is: ik moet niks van mijn VB.NET code weggooien of converteren > want die kan ik gewoon blijven verder gebruiken. Het leven is toch makkelijk als je je volledig van de echte wereld afschermt en enkel bij ��n platform op ��n architectuur blijft. Moest je nu 'ooit eens' overschakelen naar een echte programmeertaal waar je �cht iets mee kunt doen, zou je bijvoorbeeld ooit eens kunnen overschakelen naar een �cht platform waar je �cht mee kunt werken. Zo lang je met MS rommel blijft knoeien blijf je terplaatse trappelen en kom je geen millimeter vooruit op de evolutionaire ladder. > Laat ik vooral Managed C++ niet vergeten ! Dit is de enige taal die je > toelaat ook je "oude" C++ code te hergebruiken in .net projecten. Je kan dus > klassieke .cpp en .h files in hetzelfde project samenzetten met .net .cpp > files en ze elkaar laten aanroepen! Dit wordt de eerstkomende jaren ook een > zeer populaire .net taal. :) Ook een manier om de monopolie te versterken. > Mijn advies (niet bindend en zonder garanties !!!!): Gelukkig maar. > Begin met Java, C# of C++. Alledrie zijn zeer gelijkaardig qua syntax en OO > mogelijkheden maar kies afhankelijk van je voorkeuren/interesses/ > professionele vooruitzichten: Laat C# maar uit dat lijstje vallen. > 1. C++ is het krachtigst (zowel OO-wise als qua performance) maar juist > daardoor niet zo toegankelijk, zeker als je nog geen C kende. C++ is het meest flexible. Je kunt er mee doen wat je wil. Je *moet* niet OO programmeren en je *mag* procedural programmeren. Je mag ook mengen. C++ is ook op de meeste platformen ondersteund, en is dus een zeer goede keuze. Verder zegt Stroustrup zelf in _The C++ Programming Language_ dat je zelf geen C moet kennen om C++ te leren. > 2. Java is overal inzetbaar (Unix, Linux, Windows, MacOS, ...) maar wel > relatief traag en de developer tools zijn verschrikkelijk rommelig en > onbetrouwbaar, zeker als je al verwend bent door MS Visual Studio. Wat heeft MS Visual Studio met programmeren te maken? Java laat je toe om ��n binary te maken die bruikbaar is onder alle platforms en even performant draait onder alle platforms. De developer tools voor Java zijn dezelfde als de developer tools voor om het even welke andere taal: editor, compiler, debugger. Met als verschil dat de compiler by default niet naar machine-code gaat compileren maar naar een tussentaal die door het Java runtime ge�nterpreteerd wordt. > 3. C# is nieuw, unproven en MS-specifiek maar wel super-sexy, snel en je > hebt Visual Studio.net dat je lekker verwent ! En juist omdat het MS specifiek is, moet je er gewoon van wegblijven. Je versterkt er een monopolie mee, en je verplicht je gebruikers om ook de monopolie te versterken. Verder verplicht je je gebruikers ook hetzelfde waardeloze platform te gebruiken dat jij gebruikt. Afvoeren. > Eens je 1 van de 3 goed kent, is het (relatief) gemakkelijk om over te > stappen naar de andere, tenminste zo ondervind ik het toch. Van C++ kun je zonder problemen Java leren, met een basiskennis van Java is het niet moeilijk om C++ te leren. C# moet je niet leren. > Hehe, "kort uitleggen" is een beetje mislukt, vrees ik Ik hoop toch dat je > er iets aan hebt. Als er iemand mijn eventuele vergissingen wil corrigeren, > graaaaaaaaag ! Bij deze. > L2 > PS: ik ben niet geinteresseerd in "religieuze" oorlogen zoals die typisch in > programming newsgroups durven woeden. Ik reageer dus niet op "Awoe windows, > viva linux" of omgekeerde opmerkingen. Al wat ik hier schrijf is (voor zover > ik weet) technisch correct en is dus geen propaganda voor Microsoft, Java, > Linux of wat dan ook! De lezer maakt zelf zijn eigen beslissingen en trekt > zijn eigen conclusies. Tiens. Ik las toch redelijk veel Microsoft Propaganda. Als je al C# aanraadt. is er ook iets technisch mis, en weer maar wat MS propaganda. Verschrikkelijk vind ik dat. - Philip -- Philip Paeps philip@paeps.cx If a situation requires undivided attention, it will occur simultaneously with a compelling distraction.
Technical Details
Message-ID:
<7QCp8.41335$DE4.5593@afrodite.telenet-ops.be>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-03!supernews.com!skynet.be!skynet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mailReferences:
<3ms8au0umst4jhqbt7mepgtio9mv3fdb2t@4ax.com> <hz5p8.39326$DE4.4987@afrodite.telenet-ops.be>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII
X-Google-Thread: fcea4,3cfcb2e94692f21f
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2002-03-31 03:56:54 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-03!supernews.com!skynet.be!skynet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail
From: Philip Paeps <philip@paeps.cx>
Subject: Re: C, C++, C.NET (zeer lang antwoord)
Newsgroups: be.comp.programming
References: <3ms8au0umst4jhqbt7mepgtio9mv3fdb2t@4ax.com> <hz5p8.39326$DE4.4987@afrodite.telenet-ops.be>
User-Agent: tin/1.5.12-20020323 ("Sugar") (UNIX) (FreeBSD/4.5-STABLE (i386))
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 8bit
Lines: 291
Message-ID: <7QCp8.41335$DE4.5593@afrodite.telenet-ops.be>
Date: Sun, 31 Mar 2002 11:56:51 GMT
NNTP-Posting-Host: 213.118.135.125
X-Complaints-To: abuse@telenet.be
X-Trace: afrodite.telenet-ops.be 1017575811 213.118.135.125 (Sun, 31 Mar 2002 13:56:51 MET DST)
NNTP-Posting-Date: Sun, 31 Mar 2002 13:56:51 MET DST
Organization: Telenet Internet