Veelgestelde vragen over Bjarne Stroustrup
Dit zijn vragen
die mensen me vaak stellen. Als u betere vragen of opmerkingen over de antwoorden
heeft, kunt u me e-mailen. Houd er rekening mee dat ik niet al mijn tijd kan
besteden aan het verbeteren van mijn startpagina's.
Deze pagina
concentreert zich op persoonlijke meningen en algemene vragen met betrekking
tot filosofie. Voor vragen die meer direct betrekking hebben op taalfuncties van C ++ en
het gebruik van C ++, raadpleeg de Veelgestelde vragen over de FAQ
van de C ++ Foundation of mijn Veelgestelde vragen over C ++ -stijl en -techniek . Zie C ++ -woordenlijst voor C ++ -terminologie en
-concepten. Zie mijn C ++ -pagina en mijn veelgestelde vragen over C ++
11 voor
koppelingen naar nuttige bronnen van C ++ -informatie. Zie mijn
boekenlijst voor informatie over mijn boeken (inclusief recensies en
ondersteuningsinformatie). Zie mijn publicatielijst voor papieren en ISBN-nummers voor vertalingen
van mijn boeken.
Inhoudsopgave
- Algemeen
- C
++ leren
- normalisering
- Boeken
- Andere
talen
- C
en C ++
- Geschiedenis
van C ++
- Enz.
C ++ vragen
- persoonlijk
- Algemeen :
- Wat is er zo geweldig aan
lessen?
- Wat is "OOP" en wat
is er zo geweldig aan?
- Wat is "generieke
programmering" en wat is er zo geweldig aan?
- Wat
is C ++?
- Waarom staat C ++ onveilige
code toe?
- Wat
is "multiparadigm programming"?
- Wordt
C ++ geweigerd?
- Wat wordt er gedaan om C ++ te
verbeteren?
- Is
het waar dat ...?
- C ++ leren :
- Wat is het beste boek om C ++
van te leren?
- Hoe lang duurt het om C ++ te
leren?
- C kennen is een vereiste om C
++ te leren, toch?
- Moet ik een pure OO-taal leren
voordat C ++ een echte OO-programmeur wordt?
- Hoe begin ik C ++ te leren?
- Wil je me helpen met mijn
huiswerk?
- Waar kan ik een gratis C ++
-compiler krijgen?
- Wat is de beste manier om mijn
C ++ -programma's te verbeteren?
- Maakt het uit welke
programmeertaal ik gebruik?
- Waar kan ik de achtergrond van
C ++ leren kennen?
- Standaardisatie :
- Heeft de ANSI /
ISO-normcommissie C ++ bedorven?
- Wanneer hebben we een C ++
-standaard?
- Waar kan ik een
machineleesbare versie van de standaard krijgen?
- Zijn er functies die u wilt
verwijderen uit C ++?
- Waarom heeft C ++ garbage
collection niet?
- Waarom heeft C ++ geen GUI?
- Waarom ondersteunt C ++ geen
threads?
- Wat is het verschil tussen C
++ 98 en C ++ 14?
- Hoe ziet de volgende standaard
eruit?
- Boeken :
- Wanneer publiceert u een 4e
editie van "The C ++ Programming Language"?
- Houd je van e-books?
- Waar vind ik gratis, machinaal
leesbare exemplaren van uw boeken?
- Wat is het verschil tussen de
boeken "TC ++ PL" en "Programming"?
- Andere talen :
- Is Java de taal die je zou
hebben ontworpen als je niet compatibel met C zou moeten zijn?
- Wat denk je van C #?
- Wat denk je van C ++ / CLI?
- Wat vind je van EC ++?
- C ++ kreeg zijn
object-georiënteerde concepten van Smalltalk?
- Raad je Ada echt aan voor
grotere projecten via C ++?
- Zou je C ++ kunnen vergelijken
met "enige taal"?
- Anderen vergelijken hun talen
met C ++; vind je dat niet erg?
- U vergelijkt C ++ niet met
andere talen, maar u schrijft scheldwoorden over C ++?
- Hoe kan een legacy-taal zoals
C ++ concurreren met moderne, geavanceerde talen?
- Waarom ben je zo dol op
portabiliteit?
- C en C ++ :
- C is beter dan C ++ voor
kleine projecten, toch?
- Is C een subset van C ++?
- Wat is het verschil tussen C
en C ++?
- Denk je echt dat C en C ++ in
één taal kunnen worden samengevoegd?
- Wat denk je van C / C ++?
- Waarom is de code die is
gegenereerd voor het programma 'Hallo wereld' tien keer groter voor C ++
dan voor C?
- Waarom heb je C ++ (bijna)
compatibel gemaakt met C?
- Geschiedenis van C ++ :
- Wanneer
werd C ++ uitgevonden?
- Waarom heb je C ++
uitgevonden?
- Waarom ondersteunde AT & T
de ontwikkeling van C ++?
- Bezit
je C ++?
- Waar komt de naam "C
++" vandaan?
- Welke taal heb je gebruikt om
C ++ te schrijven?
- Heb je echt niet begrepen wat
je aan het doen was?
- Enz. C ++ vragen :
- Waarom is C ++ zo GROOT?
- Is C ++ een
object-georiënteerde taal?
- Wat
is "oude code"?
- Verdubbelt het aantal C ++
-gebruikers elk jaar nog steeds?
- Gebruikt
iemand tegenwoordig C ++?
- Waarom wordt C ++ niet
gebruikt voor besturingssystemen?
- Wat denk je van Boost?
- Wat denk je van template
metaprogramming?
- Had je verwacht dat C ++ zo'n
succes zou worden?
- Wat is een goede certificering
voor C ++ -programmeurs?
- Welke C ++ -compiler raadt u
aan? Welke
bibliotheken?
- Zijn
lijsten slecht?
- Persoonlijk :
- Hoe spreek je "Bjarne
Stroustrup" uit?
- Mag ik je een vraag stellen?
- Waarom beantwoord je je e-mail
niet?
- Waarom laat je je website er
niet modern uitzien?
- Is
"bjarne" een bedrieger?
- Jij
bent Zweeds?
- Heb je dat echt gezegd?
- Heb je echt een interview
gegeven aan IEEE?
- Waarom ben je bij Morgan
Stanley gaan werken?
- Waarom ben je gaan werken bij
Texas A & M University?
- Waarom ben je in Bell Labs
gaan werken?
- Waar werk je nu aan?
Hoe spreek je "Bjarne Stroustrup?" Uit
Het kan moeilijk
zijn voor niet-Scandinaviërs. De beste suggestie
die ik heb gehoord was "begin het een paar keer in het Noors te zeggen,
stop dan een aardappel in je keel en doe het opnieuw :-)" Hier is
een wav-bestand .
Voor mensen die
geen geluid kunnen ontvangen, is hier een suggestie: mijn beide namen worden
uitgesproken met twee lettergrepen: Bjar-ne Strou-strup. Noch de B noch de J in mijn voornaam zijn gestrest en de NE is nogal zwak,
dus misschien zou Be-ar-neh of By-ar-ne een idee geven. De eerste U in
mijn tweede naam had eigenlijk een V moeten zijn waardoor de eerste lettergreep
tot ver in de keel kwam: Strov-strup. De tweede U is een beetje zoals de OO in OOP, maar nog
steeds kort; misschien zal Strov-stroop een idee geven.
Ja, dit is
waarschijnlijk de meest gestelde vraag :-)
PS Mijn voornaam
is Bjarne - niet Bjorn (geen naam), Bjørn (een verwante maar andere
naam) en Barney (een niet-verwante naam). Mijn tweede naam
is Stroustrup - niet Stroustroup, Stroustrop, Strustrup, Strustrop, Strustroup,
Straustrup of Straustroup (documenten met elk van deze spelfouten zijn te
vinden via google).
Zeker. Ik probeer mijn e-mail te beantwoorden. Probeer echter te voorkomen dat u een vraag stelt die
wordt beantwoord op mijn startpagina. Vertrouw ook niet
op een snel antwoord. Ik krijg veel e-mail.
Hier zijn links naar
- biografische
informatie
- C
++ informatie en links
- papieren (inclusief een paar
die kunnen worden gedownload)
- boeken (incl. recensies,
errata en enkele hoofdstukken die kunnen worden gedownload)
- interviews
Waarom beantwoord je je e-mail niet?
Ik wel, maar ik
krijg veel e-mail. Ik schat dat ik antwoord op meer dan 95% van de
(niet-spam) berichten die ik ontvang. Soms word ik
echter overweldigd. Sommige berichten gaan verloren in mijn mailbox,
sommige zijn vertraagd totdat ik tijd kan vinden, sommige worden uitgesteld
totdat ik in de buurt ben om een reeks gerelateerde berichten te
beantwoorden (dit gebeurt vaak met opmerkingen over mogelijke fouten in mijn
boeken). Helaas lopen langere en meer doordachte berichten meer
vertraging op dan eenvoudige berichten met eenvoudige antwoorden.
Als je me mailt,
probeer dan alsjeblieft ook dat ik je kan antwoorden. Ik haat het echt
als ik een antwoord heb geschreven en verzonden, alleen maar om te ontdekken
dat het retouradres ongeldig of ontoegankelijk is.
Twee soorten
berichten hebben een relatief grote kans om te verdwalen: huiswerkvragen en
vragen over de vorm "hoe gebruik ik deze eigen bibliotheek?". Ik ben een beetje bedroefd dat ik deze laatste vragen niet beantwoord,
omdat de persoon die vraagt vaak niet begrijpt dat de DOS,
Windows of wat voor interface dan ook van C ++ geen deel uitmaakt van de C ++
-standaard (en ik kan het enorme aantal C ++ -bibliotheken ). Als u geen antwoord ontvangt, moet u overwegen of uw
vraag van een van deze soorten was.
Bovendien zal ik
het bericht waarschijnlijk ongelezen verwijderen, tenzij u uw naam opgeeft. Dit is een nieuw beleid. Ik was nooit een grote fan van pseudoniemen, maar ik
vind dat de kans op een beleefd technisch gesprek met het soort persoon dat
denkt dat het cool is om zich te verschuilen achter een naam als suuupergeeek
of coolGuy3, te laag wordt voor mij om te proberen.
Waarom laat je je website er niet modern uitzien?
Ik ben een
'content provider' en geen websiteontwerper. Ik kan mijn tijd gebruiken om de inhoud of het uiterlijk te verbeteren,
maar niet beide.
Wat er 'cool en
modern' uitziet, wordt door iemand anders vaak als slechte smaak beschouwd en
de manier van veranderen snel. Ook downloaden en weergeven zeer eenvoudige
html-downloads sneller dan wat dan ook, en veel mensen hebben nog steeds last
van trage webverbindingen.
Waarschijnlijk
niet. De meeste nieuwsgroeppostings, interviews, enz. Die
beweren van mij te komen, komen van mij. De voor de hand liggende uitzondering is het beruchte IEEE "interview" , dat ik nogal ongeschikt vind. Het is mij bekend dat ik post naar nieuwsgroepen van
mijn gmail-account, waar mijn gebruikersnaam "Bjarne" is; op de een of andere manier lijkt dat sommige mensen te
verwarren. Houd bij twijfel rekening met de stijl en inhoud van
het verdachte bericht, controleer op andere berichten op het forum of vraag
het.
Wat is er zo geweldig aan lessen?
Klassen zijn er om
je te helpen je code te organiseren en te redeneren over je programma's. Je zou grofweg kunnen zeggen dat er klassen zijn om fouten te voorkomen en
om je te helpen bij het vinden van fouten nadat je een fout hebt gemaakt. Op deze manier helpen lessen aanzienlijk bij het onderhoud.
Een klasse is de
weergave van een idee, een concept, in de code. Een object van een
klasse vertegenwoordigt een bepaald voorbeeld van het idee in de code. Zonder klassen zou een lezer van de code moeten raden over de relaties
tussen gegevensitems en functies - klassen maken dergelijke relaties expliciet
en "begrepen" door compilers. Met klassen wordt
meer van de structuur op hoog niveau van uw programma weerspiegeld in de code,
niet alleen in de opmerkingen.
Een goed ontworpen
klasse biedt een schone en eenvoudige interface voor zijn gebruikers, verbergt
zijn representatie en bespaart zijn gebruikers op het moeten weten van die
representatie. Als de representatie niet verborgen zou moeten zijn - bijvoorbeeld omdat
gebruikers elk lid van de data op elke gewenste manier moeten kunnen wijzigen -
kun je die class zien als "gewoon een eenvoudige oude datastructuur"; bijvoorbeeld:
struct Pair {
string naam, waarde;
};
Merk op dat zelfs
datastructuren kunnen profiteren van hulpfuncties, zoals constructeurs.
Bij het ontwerpen
van een klas is het vaak handig om te overwegen wat waar is voor elk object van
de klas en te allen tijde. Zo'n eigenschap wordt een invariant genoemd. De invariant van een vector zou bijvoorbeeld kunnen zijn dat de weergave
ervan bestaat uit een wijzer naar een aantal elementen en dat aantal elementen
wordt opgeslagen in een geheel getal. Het is de taak van elke constructor om de
klasse-invariant vast te stellen, zodat elke lidfunctie erop kan vertrouwen. Elke lidfunctie moet de invariant geldig laten bij het verlaten. Dit soort denken is vooral handig voor klassen die bronnen beheren, zoals
sloten, sockets en bestanden. Een bestandshandling-klasse heeft bijvoorbeeld de
invariant dat deze een pointer naar een geopend bestand bevat. De bestandsgreepconstructor opent het bestand. Destructors gratis
middelen verworven door constructeurs. De destructor voor een bestandsingang sluit
bijvoorbeeld het bestand dat is geopend door de constructor:
class File_handle {
openbaar:
File_handle (const char * n, const char * rw)
{f = fopen (n, rw); als (f == 0) Open_failure (n); }
~ File_handle () {fclose (f); } // destructor
// ...
privaat:
BESTAND * f;
};
Als u niet met
klassen hebt geprogrammeerd, zult u delen van deze verklaring onduidelijk
vinden en zult u het nut van klassen onderschatten. Zoek naar voorbeelden. Zoals alle goede
studieboeken heeft TC ++ PL veel voorbeelden. Voor een minder gedetailleerd en gemakkelijker te benaderen boek, zie A Tour of C ++ . De meeste moderne
C ++ -bibliotheken bestaan (onder andere) uit klassen en een
bibliotheek-tutorial is een van de beste plaatsen om te zoeken naar voorbeelden
van bruikbare klassen.
Wat is "OOP" en wat is er zo geweldig aan?
Er zijn veel
definities van "objectgeoriënteerd",
"objectgeoriënteerd programmeren" en
"objectgeoriënteerde programmeertalen". Zie Waarom C ++ niet zomaar een
objectgeoriënteerde programmeertaal is voor een langverwachte uitleg van wat ik
"objectgeoriënteerd" vind. Dat gezegd
hebbende, object-georiënteerd programmeren is een stijl van programmeren
die voortkomt uit Simula (meer dan 40 jaar geleden!) Met betrekking tot
inkapseling, overerving en polymorfisme. In de context van
C ++ (en vele andere talen met hun roots in Simula), betekent dit programmeren
met behulp van klassehiërarchieën en virtuele functies om objecten
van verschillende typen te manipuleren via goed gedefinieerde interfaces en om
een programma incrementeel te kunnen uitbreiden door afleiding.
Zie Wat is er zo geweldig aan lessen? voor een idee over wat geweldig is aan "gewone klassen". Het punt over het rangschikken van klassen in een klassenhiërarchie is
om hiërarchische relaties tussen klassen uit te drukken en die relaties te
gebruiken om code te vereenvoudigen.
Als u OOP echt
wilt begrijpen, zoekt u enkele voorbeelden. U hebt
bijvoorbeeld twee (of meer) apparaatstuurprogramma's met een gemeenschappelijke
interface:
class Driver {// algemene driverinterface
openbaar:
virtuele int-lees (char * p, int n) = 0; // lees max n tekens van apparaat naar p
// retourneer het aantal gelezen tekens
virtuele bool-reset () = 0; // reset het apparaat
virtueel Statuscontrole () = 0; // lees status
};
Dit stuurprogramma
is gewoon een interface. Het wordt
gedefinieerd zonder gegevensleden en een reeks pure virtuele functies. Een stuurprogramma kan via deze interface worden
gebruikt en veel verschillende soorten stuurprogramma's kunnen deze interface
implementeren:
class Driver1: public Driver {// een
stuurprogramma
openbaar:
Driver1 (Register); // constructor
int read (char *, int n);
bool-reset ();
Statuscontrole ();
privaat:
// implementatiedetails, incl. vertegenwoordiging
};
class Driver2: public Driver {// een andere
driver
openbaar:
Driver2 (Register);
int read (char *, int n);
bool-reset ();
Statuscontrole ();
privaat:
// implementatiedetails, incl.
vertegenwoordiging
};
Merk op dat deze
stuurprogramma's gegevens (status) bevatten en objecten ervan kunnen worden
gemaakt. Ze implementeren de functies die zijn gedefinieerd in
Driver. We kunnen ons voorstellen dat een stuurprogramma als
volgt wordt gebruikt:
void f (Driver & d) // gebruik
stuurprogramma
{
Status old_status = d.check ();
// ...
d.reset ();
char buf [512];
int x = d. lees (buf, 512);
// ...
}
Het belangrijkste
punt hier is dat f () niet hoeft te weten welk type stuurprogramma het gebruikt; alles wat het moet weten is dat het een bestuurder is
geslaagd; dat is, een interface voor veel verschillende soorten
stuurprogramma's. We kunnen f () als volgt aanroepen:
ongeldig g ()
{
Driver1 d1 (Registreren (0xf00)); // maak een Driver1 voor apparaat
// met apparaatregister op adres 0xf00
Driver2 d2 (Register (0xa00)); // maak een Driver2 voor apparaat
// met apparaatregister op adres 0xa00
// ...
int dev;
cin >> dev;
if (dev == 1)
f (d1); // gebruik d1
anders
f (d2); // gebruik d2
// ...
}
Merk op dat
wanneer f () een stuurprogramma gebruikt, de juiste soort bewerkingen impliciet
worden gekozen tijdens runtime. Als f ()
bijvoorbeeld d1 wordt doorgegeven, gebruikt d.read () Driver1 :: read (),
terwijl als f () met d2 wordt doorgegeven, d.read () Driver2 :: read ()
gebruikt. Dit wordt soms run-time verzending of dynamische
verzending genoemd. In dit geval is er geen manier waarop f () het soort
apparaat kan kennen waarmee het wordt gebruikt, omdat we het op basis van een
invoer kiezen.
Houd er rekening
mee dat objectgeoriënteerd programmeren geen wondermiddel is. "OOP" betekent niet alleen "goed" - als er geen inherente
hiërarchische relaties tussen de fundamentele concepten in uw probleem
bestaan, zal geen enkele hoeveelheid hiërarchie en virtuele functies uw
code verbeteren. De kracht van OOP is dat er veel problemen zijn die
handig kunnen worden uitgedrukt met behulp van klassehiërarchieën -
de belangrijkste zwakte van OOP is dat te veel mensen proberen om teveel
problemen in een hiërarchische vorm te forceren. Niet elk programma
moet objectgeoriënteerd zijn. Als alternatieven, beschouw eenvoudige klassen , generieke programmering en vrijstaande functies (zoals in wiskunde, C en
Fortran).
Wat is "generieke programmering" en wat is er zo geweldig aan?
Generieke
programmering is programmeren op basis van parametrering: u kunt een type
parametreren met een ander (zoals een vector met zijn elementtypen) en een
algoritme met een ander (zoals een sorteerfunctie met een
vergelijkingsfunctie). Het doel van generieke programmering is om een
nuttig algoritme of gegevensstructuur te generaliseren naar de
meest algemene en nuttige vorm. Een vector van gehele getallen is bijvoorbeeld prima
en dat geldt ook voor een functie die de grootste waarde vindt in een vector
van gehele getallen. Een generieke oplossing die een vector biedt van elk
type dat de gebruiker wil gebruiken en een functie die de grootste waarde in
een willekeurige vector vindt, is echter nog beter:
vector <string> :: iterator p = find
(vs.begin (), vs.end (), "Grail");
vector <int> :: iterator q = find
(vi.begin (), vi.end (), 42);
Deze voorbeelden
zijn van de STL (de containers en algoritmen deel van de ISO C ++
standaardbibliotheek); voor een korte
introductie, zie Een rondleiding door C ++ van TC ++ PL .
Generieke
programmering is in sommige opzichten flexibeler dan objectgeoriënteerd
programmeren. Het is met name niet afhankelijk van hiërarchieën. Er bestaat bijvoorbeeld geen hiërarchische relatie tussen een int en
een tekenreeks. Generieke programmering is over het algemeen meer
gestructureerd dan OOP; in feite is een algemene term die wordt gebruikt om
generieke programmering te beschrijven "parametrisch polymorfisme",
waarbij "ad hoc polymorfisme" de overeenkomstige term is voor objectgeoriënteerd
programmeren. In de context van C ++ worden alle namen bij het compileren met generieke
programmering opgelost; het gaat niet om een dynamische
(run-time) verzending. Dit heeft geleid tot generieke programmering om
dominant te worden in gebieden waar runtime-prestaties belangrijk zijn.
Merk op dat
generieke programmering geen wondermiddel is. Er zijn veel
onderdelen van een programma die geen parametrering behoeven en veel
voorbeelden waar ODP (run-time dispatch) nodig is.
Waarom staat C ++ onveilige code toe?
Dat wil zeggen,
waarom ondersteunt C ++ -bewerkingen die kunnen worden gebruikt om de regels
van statische (compileertijd) -typeveiligheid te schenden?
- voor directe toegang tot
hardware (bijvoorbeeld om een integer te behandelen als een
aanwijzer naar (adres van) een apparaatregister)
- om optimale run-time en
ruimtevaartprestaties te bereiken (bijv. ongecontroleerde toegang tot
elementen van een array en ongecontroleerde toegang tot een object via een
pointer)
- compatibel
zijn met C
Dat gezegd
hebbende, is het een goed idee om onveilige code zoals de pest te vermijden als
u niet echt een van deze drie functies nodig heeft:
- gebruik
geen casts
- houd arrays buiten
interfaces (verberg ze in de ingewanden van krachtige functies en klassen
waar ze nodig zijn en schrijf de rest van het programma op met de juiste
strings, vectoren, etc.)
- vermijd ongeldig *
(bewaar ze binnen low-level functies en datastructuren als je ze echt
nodig hebt en presenteer veilige interfaces van het type, meestal
templates, aan je gebruikers)
- vermijd
vakbonden
- als u twijfelt over de
geldigheid van een aanwijzer, gebruikt u in plaats daarvan een slimme
aanwijzer,
- gebruik geen
"naakt" nieuws en verwijderingen (gebruik in plaats daarvan
containers, middelenhandvatten, enz.)
- gebruik geen ...-
stijlvariadische functies ("printf-stijl")
- Voorkom dat macro's excuus zijn voor
bewakers
Bijna alle C ++
-codes kunnen deze eenvoudige regels volgen. Wees alsjeblieft niet in de war door het feit dat je deze regels niet kunt
volgen als je C-code of C-stijlcode schrijft in C ++.
Voor een ambitieus
project om C ++ gebruiksvriendelijker en veiliger te maken zonder de
efficiëntie of flexibiliteit ervan te schaden, raadpleegt u de Core C ++ -richtlijnen .
Wat is het beste boek om C ++ van te leren?
Er is geen enkel
boek dat het beste is voor elke persoon. Er kan er geen zijn. Mensen zijn te
verschillend in de manier waarop ze leren, in wat ze al weten, in wat ze nodig
hebben, in wat ze willen, en in wat voor soort inspanning ze bereid zijn te
maken. Er zijn nogal wat uitstekende boeken over C ++. Bekijk de website van ACCU (de vereniging
van C- en C ++ -gebruikers) . Dit is een van de
beste sites voor boekaanbevelingen door ervaren programmeurs die niet bang zijn
om hun gedachten te uiten (boekhandelaren geven meestal rooskleurige recensies
en beoordelingen van de vorm "Dit boek is perfect, ik vind het geweldig,
ik heb bijna drie hoofdstukken gelezen , en kan niet wachten om meer te lezen
"zijn slechter dan nutteloos - waarom zou iemand advies nemen over hoe C
++ te leren van iemand die helemaal geen C ++ ervaring heeft, verslaat mij). De ACCU beoordeelt boeken voor het vereiste
ervaringsniveau en de algehele kwaliteit.
Voor mensen die
nog niet eerder hebben geprogrammeerd of die uit een andere taal komen en een
relatief vriendelijke introductie tot de moderne C ++ willen, overweeg Programming: Principles and Practice
met C ++ . Dit is het boek dat ik schreef voor een eerstejaars (1ejaars universitaire
studenten) programmeercursus en het heeft geprofiteerd van drie jaar gebruik in
de klas.
Voor mensen die
programmeurs zijn en bereid zijn nieuwe concepten en technieken uit een
klassiek tekstboek te leren, raad ik The C ++ Programming Language aan
(4e editie) . Het boek is bedoeld voor programmeurs met enige ervaring en een wens om C
++ te beheersen. Het is niet bedoeld voor niet-programmeurs die hun
eerste programmeertaal willen leren of voor toevallige programmeurs die zo snel
mogelijk oppervlakkig inzicht in C ++ proberen te krijgen. Daarom concentreert dit boek zich op concepten en technieken en gaat het
tot op zekere hoogte compleet en precies zijn.Het beschrijft "pure C ++,
dat wil zeggen, de taal onafhankelijk van een bepaalde
software-ontwikkelomgeving of foundationbibliotheek (behalve de
standaardbibliotheek, natuurlijk). Het bevat een uitgebreide dekking van de
standaardbibliotheek.
Als je al een
ervaren programmeur bent en snel een overzicht wilt hebben van wat C ++ te
bieden heeft, overweeg dan A Tour of C ++ . Het presenteert de belangrijkste functies van C ++ en
de standaardbibliotheek in 180 pagina's.
Als je wilt weten
waarom C ++ is zoals het is, kijk dan eens naar het ontwerp en de evolutie van C ++ (D & E). Het begrijpen van
de ontwerpcriteria en -beperkingen helpt bij het schrijven van betere
programma's.
Hoe lang duurt het om C ++ te leren?
Dat hangt ervan af
wat je bedoelt met 'leren'. Als je een
C-programmeur bent, kun je genoeg C ++ leren om je effectiever te maken in
C-stijl programmeren op een dag.
Bij TAMU gebruiken we Programmeren: principes en oefenen
met C ++ om
eerstejaarsstudenten ( 1ejaars studenten) in een semester door de fundamenten
van C ++ en de programmeertechnieken die het ondersteunt (met name objectgeoriënteerde
programmering en generieke programmering ) te halen.
Als u daarentegen
volledig op uw gemak wilt zijn met alle belangrijke C ++ -taalconstructies, met
gegevensabstractie, objectgeoriënteerd programmeren, generieke
programmering, objectgeoriënteerd ontwerp, enz., Kunt u gemakkelijk een
jaar of twee doorbrengen - als je bent niet al bekend met die technieken
(bijvoorbeeld van Java of C #).
Is dat dan de tijd
die het kost om C ++ te leren? Misschien, maar nogmaals, dat is de tijdschaal die we
moeten overwegen om betere ontwerpers en programmeurs te worden. Als een ingrijpende verandering in de manier waarop we werken en nadenken
over het bouwen van systemen niet ons doel is, waarom dan de moeite nemen om
een nieuwe taal te leren? Vergeleken met de
tijd die nodig is om de piano goed te leren spelen of om vloeiend in een
vreemde (natuurlijke) taal te worden, is het gemakkelijk om een
nieuwe en andere programmeertaal en programmeerstijl te leren.
Voor meer
observaties over het leren van C ++ zie D & E of een notitie van comp.lang.c ++ die ik enige tijd geleden heb geschreven.
C kennen is een vereiste om C ++ te leren, toch?
Fout. De gemeenschappelijke subset van C en C ++ is
gemakkelijker te leren dan C. Er zullen minder typefouten zijn om handmatig te
vangen (het C ++ type systeem is strikter en expressiever), minder trucs om te
leren (C ++ stelt je in staat om meer dingen uit te drukken zonder circumlocution)
en betere bibliotheken beschikbaar. De beste
initiële subset van C ++ om te leren is niet "alles van C".
Zie Standaard C ++ leren als een nieuwe
taal voor een
discussie over de keuze van C ++ -constructies, -technieken en -bibliotheken
voor vroeg leren. Zie Stroustrup: Programming: Principles and Practice voor een voorbeeld van boeken dat deze
benadering systematisch benadert met C ++ en Koenig & Moo: "Accelerated C
++" uit de serie C ++ In Depth van Addison Wesley.
Moet ik een pure OO-taal leren voordat C ++ een echte OO-programmeur wordt?
Nee. Leren van
iets nieuws is bijna altijd een goed idee. Elke taal is echter anders en heeft zijn eigen stijlen en eigenaardigheden. Code geschreven in een zogenaamd "pure"
OO-stijl gemodelleerd op een andere taal (eigenaardigheden en al) is vaak niet
optimaal en frustrerend wanneer het te letterlijk in C ++ wordt
getranscribeerd. Ook, "het schrijven van alleen pure
object-georiënteerde code" is niet een van mijn idealen; zie mijn OOPSLA keynote Waarom C ++ niet zomaar een
object-georiënteerde programmeertaal is . Als je een goede C
++ -programmeur wilt worden en niet over een paar maanden te besteden hebt,
concentreer je je op C ++ en de concepten die het belichaamt.
Natuurlijk hangt
dat sterk af van wat je al weet en van je redenen om C ++ te leren. Als je een beginner bent in programmeren, raad ik je
ten zeerste aan een ervaren programmeur te zoeken die je kan helpen. Anders kunnen de onvermijdelijke fouten over
taalconcepten en praktische problemen met de implementatie die u gebruikt,
worden uitgebreid tot ernstige frustraties.
Je hebt een
leerboek nodig om C ++ te leren. Dit is het geval, zelfs wanneer uw implementatie wordt
geleverd met voldoende on-line documentatie. De reden is dat
taal- en bibliotheekdocumentatie samen met voorbeeldcode geen goede
conceptendocenten zijn. Typisch zwijgen dergelijke bronnen over de reden
waarom dingen zijn zoals ze zijn en welke voordelen je kunt verwachten (en die
je niet zou mogen verwachten) van een techniek. Concentreer u op
concepten en technieken in plaats van op taaltechnische details.
Wanneer u een boek
kiest, zoek er dan naar met Standard C ++ en gebruik vanaf het begin de
standaard bibliotheekfaciliteiten op een geïntegreerde manier. Het lezen van een string uit de invoer zou er bijvoorbeeld ongeveer zo uit
moeten zien
string s; // Standaard C ++ -stijl
cin >> s;
en niet zo
char s [MAX]; / * Standaard C-stijl * /
scanf ( "% s", s);
Zoek naar
boekaanbevelingen van programmeurs met een solide C ++ -ervaring.
Ik raad aan
om Programming: Principles and Practice
te gebruiken met C ++ , maar onthoud dat geen enkel boek het beste is voor
iedereen . Bekijk de boekbesprekingen op de website ACCU (de vereniging van C- en C ++
-gebruikers).
Richt op het
schrijven van idiomatische C ++: vermijd simpelweg het schrijven van code in de
stijl van je vorige taal met behulp van de C ++ syntaxis; er is weinig te winnen bij het veranderen van de syntaxis.
Wil je me helpen met mijn huiswerk?
Nee sorry. Ik doe geen (ander) huiswerk. Ik krijg te veel verzoeken om hulp bij huiswerk en help met het vinden van
fouten in studentenprogramma's om de tijd te vinden. Hoe dan ook, het is niet de beste manier om een verre expert
te leren kennen om je programma's te verbeteren. Probeer een lokale persoon met C ++ ervaring te vinden die u om begeleiding
kunt vragen. Een goede mentor is de beste hulp die een student kan
hebben; misschien zijn ze daarom niet gemakkelijk te vinden.
Ook nee, ik zal
niet voorstellen "een goed project voor een student om aan te
werken". Mijn ervaring is dat het voldoende tijd kost om voldoende te leren over een
student en zijn / haar cursus om te weten welke moeilijkheidsgraad vereist is
en welk soort project van belang is. Een goed project bedenken is dan niet-triviaal, en om
precies uit te leggen wat het project is en hoe het te benaderen kan
verschillende berichten en enkele uren duren. Ik heb gewoon niet
zoveel tijd. Vergeet niet dat deze aanvraag minstens wekelijks komt. Ten slotte lijken sommige studenten het idee te hebben dat als ik een
project voorstel, ik moreel verplicht ben om zeer gedetailleerde hulp te bieden
bij de voltooiing ervan.
Ideeën:
bekijk de oefeningen in TC ++ PL of andere goede studieboeken. Veel van die oefeningen zijn bedoeld om een student een
aantal dagen bezig te houden, en het lezen van die oefeningen kan een
ondernemende student inspireren om iets dergelijks te doen. Of kijk naar het niet-computerwetenschappelijke deel van uw wereld:
misschien zou een biologieproject ondersteuning kunnen gebruiken voor een nieuw
meetinstrument of zou een vriend die geschiedenis bestudeert een verbeterde
database-interface kunnen gebruiken. Veel van de beste projecten en het beste gebruik van
computers vallen buiten de traditionele informatica.
Zie ook mijn veelgestelde vragen over C ++
-stijl en -technieken . Echte nieuwelingen die voor het eerst worden geconfronteerd "lees wat
gegevens, doen er iets aan en produceren output", zijn wellicht
geïnteresseerd in een heel eenvoudig programma of een programma dat een string van
input leest .
Waar kan ik een gratis C ++ -compiler krijgen?
Van veel plaatsen; zie mijn C ++ compilerslijst .
Nee. Ik ben Deens. Bekijk mijn biografie .
Wat is de beste manier om mijn C ++ -programma's te
verbeteren?
Ik kon het niet
zeggen. Dat hangt ervan af hoe je het gebruikt. De meeste mensen onderschatten abstracte klassen en
sjablonen. Omgekeerd gebruiken de meeste mensen serieus misbruik
van afgietsels en macro's. Bekijk een van
mijn artikelen of boeken voor ideeën. Een manier om te denken aan abstracte klassen en sjablonen is als
interfaces die een meer heldere en logische presentatie van services mogelijk
maken dan eenvoudig te bieden is via functies of klassenhiërarchieën
met één root. Zie mijn Veelgestelde vragen over stijl en technieken voor enkele specifieke voorbeelden en
ideeën.
Maakt het uit welke programmeertaal ik gebruik?
Ja, maar verwacht
geen wonderen. Sommige mensen lijken te geloven dat een
programmeertaal de meeste van hun problemen met systeemopbouw kan of moet
oplossen. Ze zijn veroordeeld om voor eeuwig op zoek te gaan
naar de perfecte programmeertaal en worden herhaaldelijk teleurgesteld. Anderen verwerpen programmeertalen als onbelangrijke
'implementatiedetails' en stoppen hun geld in ontwikkelingsprocessen en
ontwerpmethoden. Ze zijn veroordeeld om voor altijd te programmeren in
COBOL-, C- en eigen ontwerptalen. Een goede taal -
zoals C ++ - kan veel betekenen voor een ontwerper en een programmeur, zolang
de sterke punten en beperkingen ervan duidelijk worden begrepen en
gerespecteerd.
Heeft de ANSI / ISO-normcommissie C ++ bedorven?
Nee. Ze / we
hebben goed werk geleverd. Je kunt met
details kibbelen (en dat doe ik, soms luid), maar ik ben blij met de taal en de
nieuwe standaardbibliotheek. ISO C ++ is een
betere en meer samenhangende taal dan eerdere versies van C ++. Je kunt tegenwoordig veel elegantere en beter te
onderhouden C ++ -programma's schrijven dan toen het standaardproces begon. De nieuwe standaardbibliotheek is ook een echte zegen. Het aanbieden van strings, lijsten, vectoren, kaarten
en basisalgoritmen voor dergelijke fundamentele typen maakt een groot verschil
in de manier waarop men C ++ kan benaderen. Zie de bibliotheekhoofdstukken van de C ++ Programming Language of A Tour of C ++ of een van mijn recente papers .
C
++ 14 is zelfs beter.
Wanneer hebben we een C ++ -standaard?
We hebben er
één gehad sinds 1998. De tweede standaard kwam in 2011.
De huidige
standaard, C ++ 14 , is in 2014 goedgekeurd en goede implementatie
wordt al verzonden . C ++ 11 / C ++ 14 wordt beschreven in de huidige edities van mijn boeken .
Waar kan ik een machineleesbare versie van de
standaard krijgen?
De C ++ -standaard
(ISO / IEC 14882) kan worden gedownload in de ANSI Electronic Store . Zoek naar "14882" om "INCITS / ISO /
IEC 14882-2003 Programmeer Talen - C ++" te vinden. De kosten hiervan zijn
(zoals ik dit schrijf) US $ 30,00, te betalen via creditcard. Het gedownloade document is in PDF-vorm, ongeveer 3Mb totale grootte.
Een laat werkdocument is gratis beschikbaar. Dit komt dicht in
de buurt van de definitieve internationale ontwerpnorm die formeel werd
aanvaard door een nationale 21-0-stem in augustus 2011.
Wees gewaarschuwd
dat de standaard geen zelfstudie is; zelfs deskundige programmeurs zullen beter leren over
C ++ en nieuwe C ++ -functies uit een studieboek.
Zie mijn veelgestelde vragen over C ++ 11 voor verwijzingen naar C ++ 11-materiaal.
Zijn er functies die u wilt verwijderen uit C ++?
Niet echt. Mensen die dit soort vragen stellen, denken meestal
aan een van de belangrijkste functies, zoals multiple inheritance, exceptions,
templates of run-time type-identificatie. C ++ zou zonder deze onvolledig zijn. Ik heb hun ontwerp in de loop van de jaren herzien en samen met de
normcommissie heb ik een aantal van hun details verbeterd, maar geen daarvan
kon worden verwijderd zonder schade aan te richten.
De meeste functies
die ik niet leuk vind vanuit een taalontwerpperspectief (bijvoorbeeld de
syntaxis van declarators en array-decay) maken deel uit van de C-subset van C
++ en kunnen niet worden verwijderd zonder de programmeurs die onder
realistische omstandigheden werken schade te berokkenen. De C-compatibiliteit van C ++ was een ontwerp van een belangrijk taalontwerp
in plaats van een marketinggimmick. Compatibiliteit was moeilijk te bereiken en te
behouden, maar echte voordelen voor echte programmeurs resulteerden en zijn nog
steeds het resultaat van vandaag.Inmiddels heeft C ++ functies waarmee een
programmeur de meest lastige C-functies niet kan gebruiken. Standaardbibliotheekcontainers zoals vector, lijst, kaart en tekenreeks
kunnen bijvoorbeeld worden gebruikt om de lastigste manipulatie van laag-niveau
aanwijzer te voorkomen.
Wat is het verschil tussen C ++ 98 en C ++ 11 en C ++ 14?
Dat is niet iets
dat gemakkelijk kan worden samengevat. Voor de meeste
praktische doeleinden is C ++ 14 achterwaarts compatibel met C ++ 11, dat
achterwaarts compatibel is met C ++ 98. Er is een compatibiliteitssectie aan de achterkant van de standaard die
compatibiliteitsproblemen beschrijft.
Er is een lange
lijst van C ++ 11-extensies voor C ++ 98 op de pagina C ++ 11 . C ++ 14 is een relatief kleine verbetering ten
opzichte van C ++ 11, bedoeld om C ++ 11 te voltooien, in plaats van nieuwe
programmeertechnieken mogelijk te maken.
Hoe ziet de volgende standaard eruit?
Dat is C ++ 17. Het is een beetje vroeg om zeker te zeggen wat C ++ 17
zal bieden, maar het is bedoeld als een belangrijke upgrade en ik presenteerde
enkele van mijn ideeën tijdens een 2015-normvergadering . Merk op dat het
onwaarschijnlijk is dat ik alles krijg wat ik wens. Zie de WG21-site voor een volledige lijst met voorstellen.
Wanneer publiceert u een 4e editie van "The C ++ Programming
Language"?
Het is in
druk: De programmeertaal C ++ (4de editie) . Addison-Wesley. ISBN 978-0321563842. Mei 2013.
Het wordt nu
verzonden vanuit Amazon, van de uitgever en elders.
Er zijn geen
lopende plannen voor een 5e editie.
Wat is het verschil tussen de boeken "TC ++
PL" en "Programming"?
De programmeertaal C ++ is voornamelijk geschreven voor ervaren
programmeurs die C ++ willen leren. De stijl is die
van een professioneel boek. Programmeren - Principes en praktijk
met C ++ is
voornamelijk geschreven voor mensen die willen leren programmeren met C ++. Het kan worden gebruikt / gelezen door mensen met geen
of slechts een zwakke programmeerachtergrond en mensen die moderne
programmeertechnieken willen leren, zoals objectgeoriënteerd programmeren
en generieke programmering, zoals ondersteund door C ++. De stijl is die van een tekstboek.
Een samenvatting:
- TC ++ PL4 : voor programmeurs
die moderne C ++ diepgaand willen leren kennen
- Tour ++ : voor programmeurs
die een overzicht van moderne C ++ willen
- PPP : voor beginners en
programmeurs met een zwak begrip van C ++
- D & E : voor mensen die
geïnteresseerd zijn in ontwerpprincipes en geschiedenis
- Anderen: lees ze niet; ze zijn verouderd
Ik hou van e-books
voor misdaadverhalen en SF. Ik denk niet dat
ze klaar zijn voor serieuze technische informatie. Daarvoor geef ik de voorkeur aan papier - zelfs als ik een paar dagen moet
wachten en wat extra gewicht moet dragen. Een goed leerboek, geopend op een tafel, zal twee pagina's tonen - een
gebied dat ongeveer drie keer groter is dan dat van een e-boeklezer. Lezen op een groot scherm van goede kwaliteit is OK,
gewoon OK.
Waar vind ik gratis, machinaal leesbare exemplaren van
uw boeken?
Er zijn geen
legale gratis machineleesbare kopieën van mijn boeken. Als u een kopie vrij beschikbaar ziet, moet dit een
schending van het auteursrecht zijn (dat wil zeggen, het is gestolen).
Addison-Wesley
biedt elektronische versies aan via Safari online boeken en elders.
Welke C ++ -compiler raadt u aan? Welke bibliotheken?
Ik raad het niet
aan. Het zou niet eerlijk zijn. Krijg echter een recente release. Uiteraard
benaderen nieuwere compilers de ISO-norm veel nauwer dan die van compilers van
een paar jaar geleden.
Zie mijn compilerslijst voor C ++ voor een onvolledige lijst van C ++ -implementaties.
Geef waar mogelijk
ook de voorkeur aan de standaardbibliotheek voor niet-standaard
'basisbibliotheken' en probeer het gebruik van eigen extensies tot een minimum
te beperken.
Volgens sommige
hoeken van het web heb ik de indruk dat vectoren altijd beter zijn dan
gekoppelde lijsten en dat ik niet weet over andere datastructuren, zoals bomen
(bijv. Std :: set ) en hash-tabellen (bijv. ::
ongeordende map ). Dat is natuurlijk
absurd.
Het probleem lijkt
een interessante kleine oefening te zijn die John Bentley me ooit heeft
voorgesteld: voeg een reeks willekeurige gehele getallen in een gesorteerde
reeks in, verwijder vervolgens die elementen één voor
één zoals bepaald door een willekeurig aantal posities: gebruikt
u een vector ( een opeenvolgend toegewezen reeks elementen) of een gekoppelde
lijst? Zie bijvoorbeeld Software Development for
Infrastructure . Ik gebruik dit voorbeeld om enkele punten te illustreren, het nadenken over
algoritmen, datastructuren en machine-architectuur aan te moedigen en te
besluiten:
- bewaar
gegevens niet onnodig,
- gegevens
compact houden, en
- toegang tot het geheugen
op een voorspelbare manier.
Let op de afwezigheid
van `` lijst '' en `` vector '' in de conclusie. Verwar een voorbeeld niet met wat het voorbeeld bedoeld is om te
illustreren.
Ik gebruikte dat
voorbeeld in verschillende gesprekken, met name:
Deze video was
populair: hij is meer dan 250.000 keer gedownload (plus nog eens 50.000 keer op
andere sites). Mijn indruk is dat veel kijkers niet begrepen dat het
doel van dat voorbeeld is om enkele algemene principes te illustreren en mensen
aan het denken te zetten. Aanvankelijk
zeggen de meeste mensen `` Lijst natuurlijk! '' (Ik heb die vraag vaak
geprobeerd) vanwege de vele invoegingen en verwijderingen `` in het midden ''
(lijsten zijn goed in dat). Dat antwoord is
volledig en dramatisch verkeerd, dus het is goed om te weten waarom.
Ik gebruik het
voorbeeld al jaren en liet afgestudeerde studenten tientallen varianten van
deze oefening en verschillende oefeningen uitvoeren en meten. Voorbeelden en metingen door anderen zijn te vinden op het internet. Natuurlijk,
- Ik heb kaarten geprobeerd
(ze zijn veel beter dan lijsten, maar nog steeds langzamer dan vectoren)
- Ik heb veel grotere
elementengroottes geprobeerd (uiteindelijk komen lijsten in hun eentje)
- Ik heb binair zoeken en
direct invoegen gebruikt voor vectoren (ja, ze versnellen nog verder)
- Ik controleerde mijn
theorie (nee, ik overtreed geen enkele grote-O-complexiteitsregel, het is
alleen dat sommige bewerkingen dramatisch duurder kunnen zijn voor de ene
gegevensstructuur dan de andere)
- Ik heb de links vooraf
gealloceerd (dat is beter dan de std :: lijst maar de
traversal doodt nog steeds de prestaties)
- Ik heb enkelvoudig
gelinkte lijsten gebruikt, forward_list s (dat maakt niet
zoveel uit, maar maakt het een beetje moeilijker om ervoor te zorgen dat
de gebruikerscode 100% equivalent is)
- Ik weet (en zeg) dat
500K-lijsten niet gebruikelijk zijn (maar dat maakt niet uit voor mijn
belangrijkste punt). We gebruiken veel
structuren (groot en klein) waar er een keuze is tussen gekoppelde en
aaneengesloten reprproductie.
- Ik weet dat push_front
() voor invoegen sneller is voor std :: list s
en push_back () s is sneller voor vector s. U kunt voorbeelden construeren om dat te
illustreren, maar dit voorbeeld is daar niet een van.
Mijn punt
gaat niet over lijsten als zodanig. Ze hebben hun gebruik, maar dit voorbeeld is niet een van hen. Verwar dit voorbeeld niet met wat het voorbeeld illustreert. Dit voorbeeld gaat over het gebruik van geheugen: we
creëren heel vaak een datastructuur, doen er een berekening op die toegang
vereist (vaak, traversal) en verwijderen die vervolgens. De geordende volgorde is slechts een voorbeeld van een
dergelijk gebruik en het voorbeeld wordt gepresenteerd om mensen te laten
nadenken over wat er in dergelijke gevallen van belang is. Mijn suggestie is:
- bewaar
gegevens niet onnodig,
- gegevens
compact houden, en
- toegang tot het geheugen
op een voorspelbare manier.
Ik benadruk het
belang van cache-effecten. In mijn ervaring
vergeten vrijwel alle echte experts die algoritmen die worden besproken.
En ja, mijn
aanbeveling is standaard std :: vector te gebruiken. Gebruik meer in het algemeen een aaneengesloten representatie tenzij er een
goede reden is om dat niet te doen. Net als C is C ++ ontworpen om dat standaard te doen.
Geef ook geen
uitspraken over prestaties zonder metingen. Ik heb een geval
gezien waarbij het veranderen van een nul-naar-twee-elementenlijst naar een
nul-naar-twee-elementenvector een factor-van-twee verschil maakte met een
algoritme. Dat had ik niet verwacht. Ook andere experts keken niet naar de code.
Is Java de taal die je zou hebben ontworpen als je niet compatibel met C
zou moeten zijn?
Nee. Java is niet
eens in de buurt. Als mensen erop staan C ++ en Java te
vergelijken - zoals ze lijken te doen - raad ik aan om het ontwerp en de evolutie van C ++ (D & E) te lezen om te zien waarom C ++ is
zoals het is, en beide talen te beschouwen in het licht van de ontwerpcriteria
I ingesteld voor C ++. Die criteria
zullen duidelijk verschillen van de criteria van Sun's Java-team. Ondanks de syntactische overeenkomsten zijn C ++ en
Java heel verschillende talen. In veel opzichten
lijkt Java dichter bij Smalltalk te zijn dan bij C ++.
Veel van de
relatieve eenvoud van Java is - zoals voor de meeste nieuwe talen - deels een
illusie en deels een functie van de incompleetheid ervan. Naarmate de tijd verstrijkt, zal Java aanzienlijk in omvang en complexiteit
groeien. Het zal in omvang verdubbelen of verdrievoudigen en
implementatieafhankelijke uitbreidingen of bibliotheken laten groeien. Dat is de manier waarop elke commercieel succesvolle taal zich heeft
ontwikkeld. Kijk gewoon naar elke taal die u op grote schaal als succesvol beschouwt. Ik ken geen uitzonderingen en er zijn goede redenen voor dit fenomeen. [Ik schreef dit vóór 2000; nu (2012) is het
taalgedeelte van de Java 7-specificatie iets langer in termen van het aantal
pagina's dan de ISO C ++ 11-taalspecificatie.]
Ik heb (negatief)
gereageerd op de Java-hype en heb veel succes van Java toegeschreven aan
marketing. Zie bijvoorbeeld mijn HOPL-3-document . Vandaag (2010) zijn de beweringen over Java meer
gebaseerd op de realiteit en minder onnodig afwijkend van alternatieven. Dit was niet altijd zo. Vergelijk bijvoorbeeld het originele Java-witboek uit 1995 met de versies die u op internet vindt (soms
aangeduid als "de originele Java-whitepaper"); pagina 69 zou een goede plaats zijn om te beginnen.
Java is niet
platformonafhankelijk; het is een platform. Net als Windows is
het een eigen commercieel platform. Dat wil zeggen, u kunt programma's schrijven voor
Windows / Intel of Java / JVM, en in beide gevallen schrijft u code voor een
platform dat eigendom is van een enkele onderneming en wordt getweaked voor het
commerciële voordeel van die onderneming. Er is op gewezen
dat u programma's in elke taal voor de JVM- en bijbehorende besturingssystemen
kunt schrijven. De JVM, enz., Zijn echter zwaar bevooroordeeld ten
gunste van Java. Het is lang niet altijd een algemene, redelijk
taalneutrale VM / OS.
Persoonlijk houd
ik me aan redelijk draagbare C ++ voor het meeste werk waarvan ik denk dat het
meest aan de hand is en voor de rest gebruik ik een verscheidenheid aan talen.
Ik heb geen
opmerkingen over C # als een taal. Het zal me veel
kosten om me ervan te overtuigen dat de wereld nog een andere eigen taal nodig
heeft. Het zal met name moeilijk zijn om mij ervan te
overtuigen dat het een taal nodig heeft die nauw is geïntegreerd met een
specifiek bedrijfseigen besturingssysteem.
Als je alleen voor
het .Net-platform wilt schrijven, is C # niet het slechtste alternatief, maar
onthoud dat C ++ een sterk ondersteund, hoewel minder sterk gehyped alternatief
is op dat platform.
C ++ / CLI is een
reeks uitbreidingen van ISO C ++ die een extreem volledige "binding"
van C ++ aan Microsoft's CLI (Common Language Infrastructure) biedt. Het is gestandaardiseerd door ECMA (ECMA-372). Ik ben blij dat alle functies van de CLI gemakkelijk
toegankelijk zijn vanuit C ++ en blij zijn dat C ++ / CLI een veel betere taal
is dan zijn voorganger "Managed C ++". Ik ben echter minder blij dat C ++ / CLI zijn doelen bereikt door in wezen
C ++ te vergroten met een aparte taalfunctie voor elk kenmerk van CLI
(interfaces, eigenschappen, generieken, verwijzingen, overerving, opsommingen
en nog veel, veel meer). Dit zal een grote
bron van verwarring zijn (wat iemand ook doet of zegt). De rijkdom aan nieuwe taalfaciliteiten in C ++ / CLI ten opzichte van ISO
Standard C ++ verleidt programmeurs tot het schrijven van niet-draagbare code
die (vaak onzichtbaar) intiem verbonden raakt met Microsoft Windows.
De CLI biedt een
reeks interfaces (naar systeemfaciliteiten) die sterk verschillen van
traditionele interfaces met de faciliteiten en applicaties van het
besturingssysteem. In het bijzonder hebben deze interfaces een semantiek
die niet volledig of gemakkelijk in conventionele programmeertalen kan worden
uitgedrukt. Een manier om CLI te beschrijven is als een (gedeeltelijk)
"platform" of "virtuele machine". Het bestaat uit
een groot aantal taalkenmerken (overerving, methoden, lusconstructies,
callback-mechanismen, enz.), Die een groot aantal basisbibliotheken
ondersteunen (de BCL), plus een uitgebreid systeem van metadata. De CLI wordt soms beschreven als "taalneutraal". Een taal die een groot deel van deze faciliteiten niet accepteert, kan
echter zelfs geen gebruik maken van de basis .Net-faciliteiten (of toekomstige
Microsoft Windows-faciliteiten, ervan uitgaande dat de plannen van Microsoft
niet veranderen) en een taal die niet al deze functies kan
uitdrukken kan niet worden gebruikt voor de implementatie van middelen die
bedoeld zijn om in andere talen bruikbaar te zijn. CLI is dus alleen
"taalneutraal" in die zin dat elke taal alle CLI-functies moet
ondersteunen om "eersteklas" te zijn op .Net.
Ik geef de
voorkeur aan een binding als een paar primitieven, die kunnen worden uitgedrukt
als eenvoudige functieaanroepen en eenvoudige gegevensstructuren in elke taal,
mogelijk ingekapseld in taalspecifieke bibliotheken. Voor de CLI kan dit
in het beste geval alleen voor klanten van CLI-faciliteiten worden gedaan. Een taal die wordt gebruikt om CLI-modules te produceren, moet alle
CLI-faciliteiten, inclusief de metadata, kunnen uitdrukken. Alleen een taal die dat kan doen kan worden beschouwd als een systeem
programmeertaal op .Net. Zo concludeerde het Microsoft C ++ -team dat alleen
ingebouwde taalfaciliteiten aanvaardbaar zijn voor hun klanten. Hun ontwerp weerspiegelt een weergave die absoluut geen beperkingen
accepteert op welk deel van CLI kan worden uitgedrukt in C ++ met de C ++ /
CLI-extensies, absoluut geen breedsprakigheid vergeleken met andere talen bij
gebruik van CLI-faciliteiten en absoluut geen overhead in vergelijking met
andere talen. Ze zijn erop gericht C ++ te behouden als de dominante
systeemprogrammeertaal voor Windows.
Zoals altijd leg ik de nadruk op draagbaarheid en raad ik mensen aan om applicaties te
ontwerpen, zodat toegang tot systeemspecifieke faciliteiten mogelijk is via
duidelijk gedefinieerde interfaces gespecificeerd in ISO C ++ (bv. Niet om C ++
/ CLI rechtstreeks te gebruiken). In Windows is dit soms lastig in vergelijking met het
rechtstreeks gebruiken van C ++ / CLI-faciliteiten, maar het is de enige manier
om draagbaarheid en een zekere mate van leveranciersonafhankelijkheid te
verkrijgen. Het is duidelijk dat die armlengte-benadering van de CLI niet kan worden
gehandhaafd als het doel van een stuk code erin bestaat een CLI-interface te
verschaffen die door andere code wordt verbruikt. Houd er rekening
mee dat ik de behoefte aan systeemspecifieke uitbreidingen erken en dat
Microsoft niet de enige C ++ -verkoper is met dergelijke extensies, ik geef er
alleen de voorkeur aan om met dergelijke extensies om te gaan via een
"dunne interface" gespecificeerd in ISO-standaard C ++.
Hoe om te gaan met
systeem-specifieke uitbreidingen is inherent een moeilijke vraag. Het Microsoft C ++ -team, met name Herb Sutter, heeft een actieve dialoog
onderhouden met (andere) leden van de ISO C ++ -standaardencommissie, zodat de
relatie tussen ISO C ++ en zijn superset C ++ / CLI uiteindelijk zal worden
uitgewerkt. We hebben een lange staat van dienst van constructief gezamenlijk werk in
de ISO C ++ -commissie. Om de verwarring tussen ISO C ++ en de C ++ /
CLI-uitbreidingen tot een minimum te beperken, herziet Microsoft nu hun Visual
C ++ -documentatie om te proberen C ++ / CLI duidelijk te onderscheiden van ISO
C ++ (gewoon niet-gekwalificeerd C ++ betekent ISO C ++). Ik hoop dat anderen die voorsprong zullen volgen.
Over de moeilijke
en controversiële vraag wat de CLI-binding / -extensies aan C ++ moet
worden genoemd, geef ik de voorkeur aan C ++ / CLI als een afkorting voor
"De CLI-uitbreidingen van ISO C ++". Het houden van C
++ als onderdeel van de naam herinnert mensen eraan wat de basistaal is en zal
helpen C ++ een goede subset van C ++ te houden met de C ++ / CLI-extensies. De compatibiliteitsproblemen met C / C
++ laten zien hoe
belangrijk het is om die subset-eigenschap te behouden.
Hier zijn enkele
documenten met betrekking tot C ++ / CLI:
- De ECMA C ++ / CLI-norm .
- Het bezwaar van het Britse ISO
C ++ -paneel (inclusief enkele codevoorbeelden).
- ECMA's antwoord op de Britse
(en andere) bezwaren .
- De ontwerpgedachte van Herb
Sutter voor C ++ / CLI
Waarom ben je zo dol op portabiliteit?
Succesvolle
software is langlevend; levensduren van
tientallen jaren zijn niet ongewoon. Een goede
applicatie / programma overleeft vaak de hardware waarvoor het is ontworpen,
het besturingssysteem waarvoor het is geschreven, het databasesysteem dat het
aanvankelijk gebruikte, enz. Vaak overleeft een goed stuk software de bedrijven
die de basistechnologieën hebben geleverd die zijn gebruikt om te bouwen
het.
Vaak hebben een
succesvolle applicatie / programma klanten / gebruikers die verschillende
platforms verkiezen. De set wenselijke platforms verandert als de
gebruikerspopulatie verandert. Als u bent gebonden aan een enkel platform of een
enkele leverancier, beperkt u het potentiële gebruik van de toepassing /
het programma.
Uiteraard is
volledige platformonafhankelijkheid onverenigbaar met het vermogen om alle
platformspecifieke faciliteiten te gebruiken. U kunt de
platformonafhankelijkheid van een toepassing echter vaak benaderen door toegang
te krijgen tot platformfaciliteiten via een "dunne interface" die het
beeld van de toepassing van zijn omgeving als bibliotheek weergeeft.
Raad je Ada echt aan voor grotere projecten via C ++?
Nee. Ik heb geen
idee wie dat gerucht begon, maar het moet een overenthousiaste of kwaadwillende
Ada-liefhebber zijn geweest.
Zou je C ++ kunnen vergelijken met "enige taal"?
Nee sorry, dat doe
ik niet. Je kunt de reden vinden in de inleidende opmerkingen
van The Design and Evolution of C ++ :
"Verschillende
reviewers vroegen mij om C ++ te vergelijken met andere talen, en dat heb ik
besloten om het niet te doen." Daarmee bevestigde ik een al lang bestaande
en sterk verdedigde opvatting: taalvergelijkingen zijn zelden zinvol en zelfs
minder vaak redelijk. talen vereist meer inspanning dan de meeste mensen bereid
zijn te besteden, ervaring in een breed scala van toepassingsgebieden, een
rigide onderhoud van een vrijstaand en onpartijdig oogpunt, en een gevoel van
eerlijkheid. Ik heb niet de tijd, en als de ontwerper van C ++, mijn
onpartijdigheid zou nooit volledig geloofwaardig zijn.
Ik maak me ook
zorgen over een fenomeen dat ik herhaaldelijk heb waargenomen bij eerlijke
pogingen tot taalvergelijkingen. De auteurs doen hun best om onpartijdig te zijn, maar
zijn hopeloos vooringenomen door zich te concentreren op een enkele applicatie,
een enkele programmeerstijl, of een enkele cultuur onder programmeurs. Erger nog, wanneer een taal significant beter bekend is dan andere, treedt
een subtiele verschuiving in perspectief op: gebreken in de bekende taal worden
als minder belangrijk beschouwd en eenvoudige oplossingen worden voorgesteld,
terwijl soortgelijke tekortkomingen in andere talen als fundamenteel worden
beschouwd. Vaak zijn de tijdelijke oplossingen die vaak worden gebruikt in de minder
bekende talen eenvoudigweg onbekend bij de mensen die de vergelijking maken of
als onbevredigend worden beschouwd, omdat ze in de meer vertrouwde taal
onwerkbaar zouden zijn.
Evenzo is informatie
over de bekende taal vaak volledig up-to-date, terwijl de auteurs voor de
minder bekende taal vertrouwen op informatie van een aantal jaar oud. Voor talen die het waard zijn om te vergelijken, is een vergelijking van
taal X zoals drie jaar geleden gedefinieerd versus taal Y zoals deze in de
nieuwste experimentele implementatie voorkomt, niet eerlijk en informatief. Dus beperk ik mijn opmerkingen over andere talen dan C ++ tot algemeenheden en tot zeer specifieke opmerkingen. "
Dat gezegd
hebbende, beschouw ik C ++ als de beste keuze in programmeertaal voor een breed
scala aan mensen en toepassingen.
Anderen
vergelijken hun talen met C ++; vind je dat niet
erg?
Het doet wanneer
het incompetent wordt gedaan of voor commercieel gewin. De meest verspreide vergelijkingen zijn meestal die van voorstanders van
een bepaalde taal, Z, om te bewijzen dat Z beter is dan andere talen. Gezien het brede gebruik ervan, staat C ++ vaak
bovenaan de lijst met talen die de voorstanders van Z inferieur willen
bewijzen. Dergelijke documenten worden vaak 'gepubliceerd' of
verspreid door een bedrijf dat Z verkoopt als onderdeel van een
marketingcampagne. Verrassend genoeg lijken velen een niet-gereviewed
document te hebben geschreven door mensen die werken voor een bedrijf dat Z
"bewijst" dat Z het beste serieus is. Een probleem is dat er altijd korrels van waarheid zijn in dergelijke
vergelijkingen. Tenslotte is geen enkele taal op alle mogelijke
manieren beter dan alle andere. C ++ is zeker niet
perfect, maar selectieve waarheid kan het meest verleidelijk en soms volledig
misleidend zijn.
Wanneer u naar een
taalvergelijking kijkt, overweeg wie het heeft geschreven, overweeg zorgvuldig
of de beschrijvingen feitelijk en eerlijk zijn en of de vergelijkingscriteria
zelf eerlijk zijn voor alle beschouwde talen. Dit is niet makkelijk.
U vergelijkt C ++ niet met andere talen, maar u schrijft scheldwoorden over
C ++?
Ik schrijf geen
tirades (dat is een vijandige karakterisering van een tekst), maar ik beschouw
het als redelijk - mogelijk zelfs als een plicht - voor iemand die een taal
heeft ontworpen om de deugden te verklaren en te verdedigen tegen vijandige
karaktertrekken. Zie mijn publicatielijst . Zie in het
bijzonder mijn uitgebreide en peer reviewed papers voor de ACM History of
Programming Conference:
- B. Stroustrup: A History of C ++: 1979-1991 . ACM
HOPL-ii. 1993.
- B. Stroustrup: Een taal ontwikkelen in en voor
de echte wereld: C ++ 1991-2006 . ACM
HOPL-III. 2007.
Vaak wijs ik ook
op de beperkingen van C ++ en de fundamentele aannames van het ontwerp van C ++
(zie bijvoorbeeld D & E ).
C is beter dan C ++ voor kleine projecten, toch?
Niet naar mijn
mening. Ik heb nooit een project gezien waarvoor C beter was
dan C ++ voor welke reden dan ook, maar het ontbreken van een goede C ++
-compiler.
In de strikte
mathematische zin is C geen subset van C ++. Er zijn programma's die geldig C zijn maar geen geldige C ++ en zelfs een
paar manieren om code te schrijven die een andere betekenis heeft in C en C ++. C ++ ondersteunt echter elke programmeertechniek die
door C. wordt ondersteund. Elk C-programma kan op vrijwel dezelfde manier
worden geschreven in C ++ met dezelfde runtime- en ruimtebesparing. Het is niet ongewoon om tienduizenden regels ANSI C
naar C-stijl C ++ binnen enkele uren te kunnen converteren. Dus is C ++ net zo goed een superset van ANSI C als
ANSI C is een superset van K & R C en veel als ISO C ++ is een superset van
C ++ zoals het in 1985 bestond.
Goed geschreven C
is ook legaal C ++. Bijvoorbeeld, elk voorbeeld in Kernighan &
Ritchie: "The C Programming Language (2nd Edition)" is ook een C ++
-programma.
Voorbeelden van
compatibiliteitsproblemen met C / C ++:
int main ()
{
dubbele sq2 = sqrt (2); / * Niet C ++: oproep niet-aangegeven functie
* /
int s = sizeof ('a'); / * stil verschil: 1 in C ++ sizeof (int) in C
* /
}
Het aanroepen van
een niet-aangegeven functie is een slechte stijl in C en illegaal in C ++. Dus is het doorgeven van argumenten aan een functie
met behulp van een declaratie die geen argumenttypes opsomt:
void f (); / * argumenttypes niet genoemd * /
ongeldig g ()
{
f (2); / * slechte stijl C. Niet C ++ * /
}
In C kan een
ongeldige * impliciet worden geconverteerd naar elk type aanwijzer, en de
toewijzing van vrije opslagplaatsen gebeurt meestal met behulp van malloc (),
die niet kan controleren of er "voldoende" geheugen is vereist:
void * malloc (size_t);
void f (int n)
{
int * p = malloc (n * sizeof (char)); / * niet C ++. In C ++ toewijzen met `nieuw '* /
char c;
ongeldig * pv = & c;
int * pi = pv; / * impliciete conversie van leegte * naar int
*. Niet in C ++ * /
}
Let op de
mogelijke uitlijnfout die wordt veroorzaakt door de impliciete conversie van de
leegte * in een int *. Zie het C ++ -alternatief voor ongeldig
* en malloc () .
Let er bij het
converteren van C naar C ++ op dat C ++ meer sleutelwoorden heeft dan C:
int klasse = 2; / * ok in C. Syntaxisfout in C ++ * /
int virtueel = 3; / * ok in C. Syntaxisfout in C ++ * /
Met uitzondering
van enkele voorbeelden, zoals de hierboven weergegeven voorbeelden (en in
detail vermeld in de C ++ -standaard en in Bijlage B van de C ++ Programming Language (3e
editie) ), is C ++
een superset van C. (Bijlage B is beschikbaar om te downloaden) .
Houd er rekening
mee dat "C" in de bovenstaande alinea's verwijst naar Classic C en
C89. C ++ is geen afstammeling van C99; C ++ en C99 zijn broers en zussen. C99 introduceert verschillende nieuwe
mogelijkheden voor C / C ++ incompatibiliteit .
Wat is het verschil tussen C en C ++?
C ++ is een
directe afstammeling van C die bijna alle C als een subset bevat. C ++ biedt een sterkere typecontrole dan C en ondersteunt rechtstreeks een
breder scala aan programmeerstijlen dan C. C ++ is "een betere C" in
die zin dat het de programmeerstijlen ondersteunt die met C zijn gedaan met
betere typecontrole en meer notatieve ondersteuning (zonder verlies) van
efficiëntie). In dezelfde zin is ANSI C een betere C dan K & R
C. Bovendien ondersteunt C ++ gegevensabstractie, objectgeoriënteerd
programmeren en generieke programmering (zie mijn boeken ).
Ik heb nog nooit
een programma gezien dat beter kon worden uitgedrukt in C dan in C ++ (en ik
denk niet dat een dergelijk programma zou kunnen bestaan - elk
construct in C heeft een voor de hand liggend C ++ -equivalent). Er bestaan echter nog steeds enkele omgevingen waar de
ondersteuning voor C ++ zo zwak is dat het een voordeel is om in plaats daarvan
C te gebruiken. Er zijn echter niet veel van die overgebleven; zie mijn (onvolledige) compilerslijst .
Voor een
bespreking van het ontwerp van C ++ inclusief een bespreking van zijn relatie
met C zie The Design and Evolution of C ++ .
Houd er rekening
mee dat "C" in de bovenstaande alinea's verwijst naar Classic C en
C89. C ++ is geen afstammeling van C99; C ++ en C99 zijn broers en zussen. C99 introduceert verschillende nieuwe mogelijkheden voor C / C ++
incompatibiliteit . Hier is een beschrijving van de verschillen tussen C ++ 98 en C99 .
Denk je echt dat C en C ++ in één taal kunnen worden
samengevoegd?
Ik denk dat het
heel goed zou zijn voor de C / C ++ -gemeenschap als ze dat waren. Dat wil zeggen, als de incompatibiliteit met C / C ++
systematisch en volledig werd geëlimineerd en de toekomstige evolutie werd
georganiseerd om te voorkomen dat nieuwe onverenigbaarheden zouden ontstaan. Of dat mogelijk is, is een andere zaak.
Mijn belangrijkste
punt is dat de huidige C / C ++ incompatibiliteiten "ongelukken van de
geschiedenis" zijn die geen fundamentele redenen achter hen hebben (hoewel
ze allemaal "op het moment als een goed idee leken" voor sommige bekwame
en goedbedoelende mensen). De incompatibiliteit met C / C ++ biedt geen voordelen
voor de gemeenschap in het algemeen, veroorzaakt ernstige problemen voor een
groot deel van de C / C ++ -gemeenschap en kan - met grote moeite - worden
geëlimineerd.
Zie voor een veel
gedetailleerdere weergave van mijn opvattingen over C / C ++ compatibiliteit de
serie artikelen die ik hierover heb geschreven:
- B. Stroustrup: C en C ++: casestudy's in
compatibiliteit . Het C /
C ++ gebruikersdagboek. September
2002.
- B. Stroustrup: C en C ++: een zaak voor
compatibiliteit . Het C /
C ++ gebruikersdagboek. Augustus
2002.
- B. Stroustrup: C en C ++: broers en zussen . Het C /
C ++ gebruikersdagboek. Juli
2002.
- B. Stroustrup: rivaliteit tussen broers en zussen: C en C ++ . AT
& T Labs - Onderzoek technisch rapport. TD-54MQZY. Januari
2002.
Ik stel me voor
dat als incompatibiliteiten werden geëlimineerd (door wijzigingen aan te
brengen in zowel C als C ++), er nog steeds entiteiten zouden zijn met de naam
C en C ++, maar dan zou C echt worden gedefinieerd als een
subset van C ++ .
Houd er rekening
mee dat deze papers eind 2001 en begin 2002 werden geschreven, toen het nog
steeds mogelijk was om gecoördineerde acties van de C en C ++
normcommissies voor te stellen die tot praktische resultaten leidden tegen het
einde van het decennium. Dit gebeurde niet.
Waarom heb je C ++ (bijna) compatibel gemaakt met C?
Ik wilde dat C ++
compatibel zou zijn met een volledige taal met voldoende prestaties en
flexibiliteit voor zelfs de meest veeleisende systeemprogrammering. Ik had een perfecte vrees voor het produceren van nog
een andere mooie taal met onbedoelde beperkingen. Zie Paragraaf 2.7 van Het ontwerp en de evolutie van C ++ voor historische details en lees de artikelen
in Denkt u echt ...? voor een (retrospectieve) technische bespreking van
compatibiliteitsproblemen met C / C ++.
Ik beschouwde C
destijds als de beste beschikbare programmeertaal. Dat was niet zo
vanzelfsprekend toen (1979) het later werd, maar ik had experts zoals Dennis Ritchie , Steve Johnson, Sandy Fraser , Greg Chesson, Doug McIlroy en Brian Kernighan in de gang van wie ik kon leren en feedback
krijgen. Zonder hun hulp en advies, en zonder C, zou C ++ doodgeboren zijn.
In tegenstelling
tot herhaalde geruchten, kreeg ik nooit te horen dat ik C moest gebruiken; ook werd mij nooit verteld om C. niet te gebruiken. In feite groeide de
eerste C ++ -handleiding uit de bron van de C-handleiding die Dennis mij gaf. Veel nieuwe talen zijn ontworpen in Bell Labs; in 'onderzoek'
waren er tenminste geen regels die de dweperij van de taal afdwongen.
Nee, dat is niet
echt een vraag die ik vaak krijg. In die zin is dit
de enige "nep-veelgestelde vraag" in deze FAQ. Het zou echter een veelgestelde vraag moeten zijn
omdat mensen "C / C ++" gebruiken alsof het iets specifieks betekent
en alsof ze wisten wat het betekende, wat leidde tot veel verwarring en
ellende. Mensen zouden moeten vragen: "Wat is C / C
++?" en stop dan bij reflectie met het gebruik van de term. Het doet schadelijk.
Er is geen taal
die "C / C ++" wordt genoemd. De zin wordt
meestal gebruikt door mensen die geen idee hebben van programmeren
(bijvoorbeeld HR-personeel en slechte managers). Als alternatief
wordt het gebruikt door mensen die C ++ niet kennen (en vaak ook C niet). Wanneer het door programmeurs wordt gebruikt, duidt het meestal op een
"C ++ is C met een paar nuttige en een heleboel nutteloze gecompliceerde
functies toegevoegd" houding. Dat is vaak het gezichtspunt van mensen die graag hun
eigen snaren en hashtabellen schrijven met weinig kennis van de
standaardbibliotheek voorbij printf en memcpy. Er zijn mensen die
zich om volkomen goede redenen aan een beperkte subset van C ++ houden, maar ze
zijn (voor zover ik heb opgemerkt) niet de mensen die 'C / C ++' zeggen.
Ik gebruik alleen
C / C ++ in uitdrukkingen als "C / C ++ -compatibiliteit" en "C
/ C ++ -community".
Wanneer werd C ++ uitgevonden?
Ik begon te werken
aan wat C ++ werd in 1979. De eerste versie heette "C with Classes". De eerste versie van C ++ werd intern gebruikt in AT
& T in augustus 1983. De naam "C ++" werd eind dat jaar gebruikt. De eerste commerciële implementatie werd in
oktober 1985 gelijktijdig met de publicatie van de 1e editie van The C ++
Programming Language uitgebracht . Sjablonen en
afhandeling van uitzonderingen zijn later in de jaren tachtig opgenomen en
gedocumenteerd in The Annotated C ++ Reference Manual en The C ++ Programming Language (2rd
Edition) . De eerste ISO C ++ -standaard was C ++ 98 zoals beschreven
in The C ++ Programming Language (3e
editie) .
De huidige
definitie van C ++ De ISO C ++ standaard uit 2011 die wordt beschreven in The C ++ Programming Language (4e
editie) .
Je vindt een meer
complete tijdlijn en meer gedetailleerde uitleg in The Design and Evolution van C ++ en A History of C ++: 1979-1991 en Evolving a language in and for the
real world: C ++ 19 .
Waarom heb je C ++ uitgevonden?
Ik wilde
efficiënte systeemprogramma's schrijven in de stijlen aangemoedigd door
Simula67. Om dat te doen, voegde ik faciliteiten toe voor een
betere typecontrole, gegevensabstractie en objectgeoriënteerd programmeren
naar C. Het meer algemene doel was om een taal te ontwerpen
waarin ik programma's kon schrijven die zowel efficiënt als elegant waren. Veel talen dwingen je om te kiezen tussen deze twee
alternatieven.
De specifieke
taken die me ertoe hebben aangezet om C ++ te ontwerpen en te implementeren
(aanvankelijk "C met klassen" genoemd) hadden te maken met het
distribueren van faciliteiten van het besturingssysteem over een netwerk.
U kunt meer
gedetailleerde uitleg vinden in Het ontwerp en de evolutie van C ++ . Zie ook A History of C ++: 1979-1991 en Evolueren van een taal in en voor de
echte wereld: C ++ 1991-2006 .
Waarom ondersteunde AT & T de ontwikkeling van C ++?
Toen ik voor het
eerst C ++ ontwikkelde, bouwde AT & T systemen van grotere complexiteit en
met hogere betrouwbaarheidseisen dan de meeste organisaties. Daarom moesten we de markt beïnvloeden en normen
opstellen die aan onze behoeften voldeden - anders hadden we niet de tools om
onze systemen te bouwen. Overgelaten aan
zichzelf "de industrie" zal talen en hulpmiddelen creëren voor
het omgaan met "gemiddelde" problemen. Op dezelfde manier hebben leraren de neiging zich te concentreren op talen
en hulpmiddelen die studenten en onderzoekers goed van pas komen - zelfs als ze
niet schalen naar de meest veeleisende taken.
Op het moment dat
ik C ++ ontwikkelde - en daarvoor, toen Ken Thompson en Dennis Ritchie Unix en
C ontwikkelden - was AT & T waarschijnlijk 's werelds grootste civiele
gebruiker van (en consumenten van) softwaretools. Vervolgens hebben
we waarschijnlijk een breder scala aan systemen gebruikt - van de kleinste
ingesloten processors tot de grootste supercomputers en
gegevensverwerkingssystemen. Dat betekende een premie op systemen die van
toepassing waren in veel technische culturen en op veel platforms. C en C ++ zijn ontworpen met dergelijke eisen in gedachten.
Generaliteit is
dus essentieel en eigendomskenmerken worden gezien als een beperking van de
keuze van platforms en leveranciers. Als gevolg hiervan was en is AT & T een
belangrijke voorstander van formele normen (bijvoorbeeld ISO C en ISO C ++).
AT & T heeft
eigenlijk genoeg geld verdiend aan Cfront, mijn oorspronkelijke C ++ -
compiler, om de ontwikkeling van C ++ meermaals te betalen.
Nee. Als iemand
'eigenaar is van C ++', moet dit de ISO zijn. AT & T gaf de rechten op de C ++ -handleiding die ik aan de ISO
schreef. De ISO C ++ -standaard is auteursrechtelijk beschermd door ISO.
Compilerververkopers
betalen geen royalty's aan mij of aan AT & T voor C ++, en ISO-normen zijn
specificaties die bedoeld zijn voor royalty-vrij gebruik door iedereen (nadat
zij de ISO of een nationaal normcomité hebben betaald voor hun exemplaar
van de norm). De afzonderlijke compilers zijn eigendom van hun respectieve leveranciers /
leveranciers.
"Maar iemand
van SCO beweerde dat ze eigenaar waren van C ++"; is dat niet waar? Het is complete onzin. Ik zag dat interview. De SCO-gozer had
duidelijk geen idee wat C ++ was, en noemde het "de C ++ -talen". Hoogstens kan SCO een 15-jarige en serieus verouderde versie van Cfront
bezitten - mijn oorspronkelijke C ++ -compiler. Ik heb ervoor
gezorgd dat ik geen patent of handelsmerk heb voor iets dat met C ++ te maken
heeft. Dat is een reden waarom we gewoon "C ++" en niet "C ++
(tm)" schrijven. De C ++ -standaard is niet belast met octrooien - de
commissie heeft dat ook zorgvuldig gecontroleerd.
Waar komt de naam "C ++" vandaan?
Hoofdstuk 3
van D & E : `` Ik koos voor C ++ omdat het kort was, mooie
interpretaties had en niet de vorm had van "bijvoeglijk naamwoord
C.". In C kan ++, afhankelijk van de context, worden gelezen als
"volgende" "opvolger" of "increment", hoewel het
altijd wordt uitgesproken als "plus plus." De naam C ++ en zijn tweede plaats ++ C zijn vruchtbare bronnen voor moppen
en woordspelingen - bijna allemaal bekend en gewaardeerd voordat de naam werd
gekozen. De naam C ++ is gesuggereerd door Rick Mascitti. Het werd voor het eerst gebruikt in december 1983 toen
het werd bewerkt tot de definitieve kopieën van [Stroustrup, 1984] en
[Stroustrup, 1984c].
Hoofdstuk 1
van TC ++ PL : `` De naam C ++ (uitgesproken als "zie
plus plus") werd bedacht door Rick Mascitti in de zomer van 1983. De naam
duidt de evolutionaire aard van de veranderingen van C aan; "++" is de C-verhogingsoperator. De iets kortere
naam "C +" is een syntaxisfout; het is ook
gebruikt als de naam van een niet-verwante taal. Kenners van
C-semantiek vinden C ++ minder dan ++ C. De taal wordt niet
D genoemd, omdat het een extensie van C is en het probeert geen problemen op te
lossen door functies te verwijderen. Zie voor nog een andere interpretatie van de naam C ++
de appendix van [Orwell, 1949]. ''
De `` C '' in C ++
heeft een lange geschiedenis. Natuurlijk is het de naam van de taal die Dennis
Ritchie ontwierp. De directe voorloper van C was een
geïnterpreteerde afstammeling van BCPL genaamd B, ontworpen door Ken
Thompson. BCPL is ontworpen en geïmplementeerd door Martin Richards van
Cambridge University tijdens een bezoek aan MIT in het andere Cambridge. BCPL was op zijn beurt Basic CPL, waarbij CPL de naam is van een vrij grote
(voor zijn tijd) en elegante programmeertaal die gezamenlijk is ontwikkeld door
de universiteiten van Cambridge en Londen. Voordat het
Londense volk zich aansloot bij het project stond "C" voor Cambridge. Later stond "C" officieel voor Gecombineerd. Officieus stond "C" voor Christopher omdat Christopher Strachey
de belangrijkste kracht achter CPL was. ''
Welke taal heb je gebruikt om C ++ te schrijven?
De eerste C ++
-compiler (Cfront) is geschreven in C ++. Om dat te bouwen, heb ik eerst C gebruikt om een `` C with
Classes '' - to-C preprocessor te schrijven. `` C met klassen '' was een C-dialect dat de directe voorouder van C ++
werd. Die preprocessor vertaalde "C met klassen"
-constructies (zoals klassen en constructors) naar C. Het was een traditionele
preprocessor die de taal niet helemaal begreep, de meeste typecontrole liet
voor de C-compiler om te doen en de individuele vertaling bouwt zonder volledige
kennis. Ik schreef toen de eerste versie van Cfront in "C
with Classes".
Cfront was een
traditionele compiler die de syntaxis en de semantische controle van de C ++
-bron volledig had voltooid. Daarvoor had het een complete parser, bouwde symbooltabellen
en bouwde het een volledige interne boomstructuur van elke klasse, functie,
etc. Het deed ook wat bronniveau-optimalisatie op zijn interne boomstructuur
van C ++ -constructies voordat C werd uitgevoerd. De versie die gegenereerde C,
vertrouwde niet op C voor het controleren van het type. Het gebruikte
eenvoudig C als assembler. De resulterende code was compromisloos snel. Zie D
& Evoor meer informatie.
Heb je echt niet begrepen wat je aan het doen was?
Deze lijkt erg
populair. Of liever gezegd, het lijkt populair om te beweren dat
ik geen idee had dat het succes van C ++ een soort ongeluk is. Ja, zulke uitspraken irriteren me, omdat ze mijn werk
decennialang afdanken en het harde werk van veel van mijn vrienden.
Laten we eerst
volkomen duidelijk zijn: nee, ik anticipeerde niet op het wegloop-succes van C
++ en nee, ik zag niet elke techniek die met C ++ of elke toepassing van C ++
werd gebruikt. Natuurlijk niet!
Verklaringen zoals deze zijn echter erg
misleidend:
- Bjarne
begrijpt C ++ niet!
- Bjarne anticipeerde RAII
en deterministische vernietiging niet!
- Bjarne anticipeerde niet
op sjabloon-metaprogrammering!
Deze veelgestelde
vraag werd ingegeven door het zien van deze en nog een aantal van hun ilk
vandaag.
Ik heb de criteria
voor het ontwerp en de implementatie van C ++ beschreven. Ik streefde expliciet naar algemeenheid: "Ik ben niet
geïnteresseerd in een taal die alleen kan doen wat ik kan bedenken"
en voor efficiëntie "een faciliteit moet niet alleen nuttig zijn,
maar ook betaalbaar." Ik stel voor dat twijfelaars lezen over het ontwerp en de evolutie van C ++ en mijn HOPL2- en HOPL3- documenten (dit zijn collegiaal getoetste
artikelen). Wat betreft deterministische vernietiging, was het in "C with
Classes" in de eerste week of twee (1979). Ik heb de
introductie van uitzonderingen een half jaar lang tegengehouden in C ++ totdat
ik RAII (1988) ontdekte. RAII is een integraal en noodzakelijk onderdeel van
het C ++ uitzonderingsmehanisme.
Ik was zeer
verbaasd toen Jeremy Siek voor het eerst liet zien wat de compileertijd
was als dat later std: voorwaardelijk werd ,
maar ik had mikt op algemene (en kreeg volledige modulo-vertaalgrenzen voor
Turing). Ik verzette me onmiddellijk tegen beperkingen voor C ++ toen Erwin Unruh
presenteerde wat naar men aanneemt het eerste sjabloonmetaprogramma is voor de
evolutiewerkgroep van het ISO-normcomité. Om
template-metaprogrammering te doden, hoefde ik alleen nog maar niets te zeggen. In plaats daarvan was mijn commentaar in de trant van: "Wauw, dat is
netjes, we mogen het niet schaden, het kan nuttig zijn." Net als bij alle krachtige ideeën kan sjabloon-metaprogrammering
worden misbruikt en overgebruikt, maar dat betekent niet dat het fundamentele
idee van compilatie-tijdrekening slecht is. En net als bij
alle krachtige ideeën kwamen de implicaties en technieken in de loop van
de tijd naar voren met bijdragen van veel mensen.
Scolarship biedt
meer dan een blik op de wikipedia, een snelle Google-zoekopdracht en een aantal
blogposts. Er is meer aan de uitvinding dan het geven van een eenvoudige lijst met
implicaties. Fundamentele principes en ontwerprichtlijnen zijn essentieel. Mijn deel van het C ++ -ontwerp opende de mogelijkheid voor velen om
bij te dragen, en als je naar mijn geschriften en posting kijkt, zie je dat ik
heel hard mijn best doe om credits te geven (zie bijvoorbeeld de
referentiedelen van mijn veelgestelde vragen over C ++
11 ) of de
geschiedenissecties van mijn boeken .
En nee, ik ben
geen wandelend C ++ -woordenboek. Ik bewaar niet altijd alle technische details in mijn
hoofd. Als ik dat zou doen, zou ik een veel slechtere programmeur zijn. Ik houd de hoofdzaken meestal recht in mijn hoofd en ik weet waar ik de
details kan vinden wanneer ik ze nodig heb.Bijvoorbeeld:
Waarom heeft C ++ garbage collection niet?
Als je
automatische garbage collection wilt, zijn er goede commerciële en
publieke domein garbage verzamelaars voor C ++. Voor toepassingen waar garbage collection geschikt is, is C ++ een
uitstekende garbagecollectie met een prestatie die gunstig afsteken bij andere
garbagecollecties. Zie De C ++ programmeertaal voor een bespreking van automatische garbage
collection in C ++. Zie ook, Hans-J. Boehm's site voor C en C ++ garbage
collection .
C ++ ondersteunt
ook programmeertechnieken waarmee geheugenbeheer veilig en impliciet kan zijn zonder
een garbage collector . Ik beschouw afvalophaling als een laatste keuze en een onvolmaakte manier
van omgaan met resourcebeheer. Dat betekent niet dat het nooit nuttig is, alleen als
er in veel situaties betere benaderingen zijn.
C ++ 11 biedt een GC ABI.
Ik hou niet van
afval. Ik hou niet van zwerfvuil. Mijn ideaal is om de behoefte aan een vuilnisbelt weg
te nemen door geen afval te produceren. Dat is nu
mogelijk. Hulpmiddelen die de programmeertechnieken ondersteunen en uitvoeren die
worden bereikt. Voor een overzicht, zie Een korte inleiding tot het C ++
-model voor type- en resource-veiligheid. .
C ++ heeft veel
commerciële en open source GUI's (bijv. Gtkmm , SmartWin ++ , V C ++ GUI , FLTK en Qt ). In het bijzonder
biedt elke platformleverancier een C ++ -bibliotheek voor toegang tot zijn GUI. Het probleem is dat het geen standaard GUI heeft en
dat is inderdaad een groot probleem.
Merk op dat het
verschaffen van een GUI zowel een technisch als een politiek probleem is. Er zijn veel GUI's met veel gebruikers en over het algemeen zouden ze niet
graag zien dat een andere GUI standaard wordt verklaard. Hoe dan ook, de normcommissie heeft niet de middelen om een
nieuwe en betere GUI te bouwen.
Waarom ondersteunt C ++ geen threads?
C
++ 11 biedt threads.
Nee, ik denk het
niet. C ++ -gebruik lijkt in sommige gebieden af
te nemen en in andere te zijn gestegen. Als ik moest raden, zou ik ergens in de periode 2002-2004 een netto daling
verwachten en een netto toename in 2005-2007 en opnieuw in 2010-2011, maar ik
betwijfel of iemand het echt weet. De meeste
populaire maatregelen meten in principe lawaai en zouden hun bevindingen in
decibel moeten rapporteren in plaats van 'populariteit'. Een professioneel onderzoek in 2015 schatte het aantal C ++ -programmeurs op 4,4 miljoen. Veel van de belangrijkste toepassingen van C ++ zijn in infrastructuur
(telecommunicatie, bankieren, embedded systemen, enz.) Waar programmeurs niet
naar conferenties gaan of hun code in het openbaar beschrijven. Veel van de meest interessante en belangrijke C ++
-toepassingen worden niet opgemerkt, ze zijn niet te koop aan het publiek als
programmeerproducten en hun implementatietaal wordt nooit genoemd. Voorbeelden zijn Google- en '800'-telefoonnummers. Als ik in 1985 aan een 'C ++ inside'-logo had gedacht,
zou de programmeerwereld er vandaag misschien anders uit kunnen zien.
Een eenvoudig ding
dat vele discussies over taalgebruik / populariteit verwart, is het onderscheid
tussen relatieve en absolute maatregelen. Ik zeg
bijvoorbeeld (in 2011) dat het gebruik van C ++ toeneemt wanneer ik de
gebruikerspopulatie zie groeien met 200.000 programmeurs van 3,1 miljoen naar
3,3 miljoen. Iemand anders kan echter beweren dat "C ++ doodgaat" omdat het
"populariteit" is gedaald van 16 procent naar 11 procent van het
totale aantal programmeurs. Beide beweringen zouden tegelijkertijd waar kunnen
zijn naarmate het aantal programmeurs blijft groeien en vooral omdat wat wordt
beschouwd als programmeren, blijft veranderen. Ik denk dat C ++
meer is dan zich staande te houden in zijn traditionele kerndomeinen, zoals
infrastructuur, systeemprogrammering, ingebedde systemen en toepassingen met
serieuze beperkingen qua tijd en / of ruimte en / of stroomverbruik. Zie ook mijn
DevX-interview .
Wat wordt er gedaan om C ++ te verbeteren?
Uitvoerders
verbeteren voortdurend hun compilers , bibliotheken en hulpmiddelen. In de afgelopen vijf jaar zijn de kwaliteit
aanzienlijk verbeterd. Dit is wat het
meest direct en het meest direct mensen helpt; dat, en de host van eigen en open source bibliotheken en tools die continu
worden geproduceerd door de C ++ community. Zie mijn C ++ -pagina voor voorbeelden.
De eerste ISO C ++ -norm werd in 1998 geratificeerd. De volgende
versie C ++ 11 is compleet en wordt verzonden. U kunt artikelen over C ++ 11 op mijn publicatiespagina en alle documenten met betrekking tot de nieuwe
norm op de homepages van de ISO C ++-commissie vinden . Mijn HOPL-iii-paper over de laatste 15 jaar van C ++ -evolutie is
misschien de beste verklaring voor wat er wordt gedaan en waarom. Een recent interview bevat lijsten met nieuwe taalfuncties en
standaardbibliotheken.
Bij het beschouwen
van de evolutie van C ++, is het de moeite waard eraan te denken dat het niet
de bedoeling is om het grootste aantal nieuwe functies toe te voegen, maar om C
++ te verbeteren voor de belangrijkste toepassingsdomeinen, inclusief
systeemprogrammering en bibliotheekopbouw, zonder oudere code te onderbreken
(er zijn miljarden van lijnen van C ++ "daar").
Het staat niet op
mijn computer en het hoort niet van jou te zijn. Ik heb zelfs de C ++ -versie van het "Hello World" -programma
kleiner gezien dan de C-versie. In 2004 heb ik
getest met behulp van gcc-O2 op een Unix en de twee versies (iostreams en
stdio) leverden identieke maten op. Er is geen
taalreden waarom de ene versie groter zou moeten zijn dan de andere. Het is allemaal een kwestie van hoe een
implementeerder de standaardbibliotheken organiseert (bijvoorbeeld statische
koppeling versus dynamische koppeling, locale ondersteuning standaard versus
locale ondersteuning ingeschakeld via en optie, etc.). Als de ene versie aanzienlijk groter is dan de andere, meldt u het probleem
aan de implementator van de grotere.
Hoe kan een legacy-taal zoals C ++ concurreren met moderne, geavanceerde
talen?
Het spreekt voor
zich dat het aanroepen van C ++ een oude taal is (zie oude code ). Afgezien daarvan
denken mensen meestal aan Java of C # als ze zo'n vraag stellen. Ik zal C ++ niet vergelijken met die talen , maar ik kan erop wijzen dat "modern"
niet noodzakelijk "beter" betekent, en dat zowel Java als C # in een
nog grotere mate geworteld zijn in de OOP uit de jaren 1980 dan het begin van C
++ is.
Sinds 1987 of zo
is de focus van de ontwikkeling van de C ++ -taal en de bijbehorende
programmeerstijlen het gebruik van sjablonen, statisch polymorfisme, generieke
programmering en multiparadigm-programmering geweest. Dit gaat ver
buiten het bereik van de veel-hyped gepatenteerde talen. Een ander belangrijk verschil is dat C ++ door de gebruiker gedefinieerde
typen in dezelfde mate ondersteunt als ingebouwde typen. Dit - vooral in combinatie met het gebruik van sjablonen, constructors en
destructors - maakt het de C ++ -programmeur mogelijk om programmeer- en
ontwerptechnieken te gebruiken die (IMO) geavanceerder zijn dan wat wordt
ondersteund in de talen waarmee C ++ het vaakst wordt vergeleken; zie bijvoorbeeld RAII .
Standaard C ++ en
de ontwerp- en programmeerstijlen die het ondersteunt zijn een schuld aan de
functionele talen verschuldigd, vooral aan ML. Vroege varianten
van ML's type deductiemechanismen waren (samen met veel andere) onderdeel van
de inspiratie van sjablonen. Enkele van de effectievere functionele
programmeertechnieken waren onderdeel van de inspiratie van de STL en het
gebruik van functieobjecten in C ++. Aan de andere kant miste de functionele gemeenschap de
boot met objectgeoriënteerd programmeren, en enkele talen en
gereedschappen uit die gemeenschap profiteerden van de volwassen ervaring van
grootschalig industrieel gebruik.
Het is duidelijk
dat ik denk dat garbage collection niet het enige bepalende kenmerk is van
'geavanceerd' in de context van programmeertalen. Merk in het
bijzonder op dat C ++ ondersteuning biedt voor effectieve en efficiënte
technieken voor geheugenbeheer die lekken van bronnen kunnen elimineren zonder
het gebruik van een afvalverzamelaar. Als u het niet eens bent, kunt u gewoon beginnen met
het gebruiken van een garbage collector voor C ++; er zijn goede
degenen beschikbaar.
Wat is "multiparadigm programming"?
Multiparadigm-programmering
is een mooie manier om `` programmeren te zeggen met behulp van meer dan
één programmeerstijl, elk op zijn best. '' Bijvoorbeeld door
objectgeoriënteerd programmeren te gebruiken wanneer runtime-resolutie
tussen verschillende objecttypen is vereist en generieke programmering wanneer
statisch type veiligheid en runtime-prestaties zijn van het allergrootste
belang. Natuurlijk is de belangrijkste kracht van
multiparadigm programmeren in programma's waarin meer dan één
paradigma (programmeerstijl) wordt gebruikt, zodat het moeilijk zou zijn om
hetzelfde effect te krijgen door een systeem samen te stellen uit delen die
zijn geschreven in talen die verschillende paradigma's ondersteunen. Ik vind de meest overtuigende cases voor
multiparadigm-programmering gevonden waarbij technieken uit verschillende paradigma's
in nauwe samenwerking worden gebruikt om code te schrijven die eleganter en
beter te onderhouden is dan mogelijk zou zijn binnen een enkel paradigma. Een eenvoudig voorbeeld is het doorlopen van een
statisch getypeerde container van objecten van een polymorf type:
void draw_all (vector <Shape *> &
vs) // teken elk element van een standaardvector
{
for_each (vs.begin (), vs.end (), [] (Shape *
p) {p-> draw ();});
}
Hier zal Shape een
abstracte basisklasse zijn die de interface definieert tot een hiërarchie
van geometrische vormen. Dit voorbeeld
wordt eenvoudig gegeneraliseerd naar elke standaard bibliotheekcontainer:
sjabloon <klasse C>
void draw_all (C & cs) // teken elk
element van een standaard container
{
for_each (cs.begin (), cs.end (), [] (Shape *
p) {p-> draw ();});
}
Jim Coplien's boek
"Multiparadigm Design for C ++" (Addison Wesley, 1998) onderzoekt het
gebruik van meerdere paradigma's in de context van ontwerp- en ontwerpmethoden.
We hebben een
betere - meer beschrijvende - term nodig om `` multi-paradigma '' te vervangen.
'
C ++ is niet zo
groot als sommige mensen zich voorstellen. Het is geen kleine taal die ontworpen is om een minimale taal
te zijn voor lesgeven, maar ook de talen waarmee mensen het meest vergelijken,
zoals C, Java en C #. Ook zij zijn enorm
vergeleken met zeggen, Pascal zoals Dr. Wirth het oorspronkelijk heeft
gedefinieerd - om goede redenen denk ik. De programmeerwereld is tegenwoordig veel complexer dan 30 jaar geleden, en
moderne programmeertalen weerspiegelen dat.
De C ++ -standaard
is 1151 pagina's; dat bevat 430 pagina's taaldefinitie en 770 pagina's
standaardbibliotheekbeschrijving. De grootte van de taaldefinitie ligt binnen 5% van de
taalbeschrijvingen van Java en C # (gemeten op paginatelling). Op dezelfde manier is TC ++ PL 1360 pagina's; van die 750 van
die zijn gewijd aan taalfaciliteiten en programmeertechnieken; de rest discussieert over bibliotheken, etc.
C ++ ondersteunt
direct (dwz in de taal) wat sommige andere talen ondersteunen via bibliotheken,
dus het taalgedeelte zal relatief groter zijn. Aan de andere
kant, als u een "typisch moderne toepassing" wilt schrijven, moet u
rekening houden met besturingssysteeminterfaces, GUI, databases, webinterfaces,
enz. De som van taalfuncties, bibliotheken en programmeerconventies en
-standaarden die u moet gebruiken vertrouwd raken met Dwar de programmeertaal. Hier kan de grootte van C ++ een voordeel zijn voor zover het betere
bibliotheken ondersteunt.
Ten slotte zijn de
dagen waarin een beginnende programmeur al een taal kent, weg, althans voor de
talen in wijdverbreid industrieel gebruik. Weinig mensen
kennen 'alles van C' of 'heel Java', en geen van die mensen zijn nieuwelingen. Hieruit volgt dat niemand zich moet verontschuldigen voor het feit dat
beginners niet alles van C ++ weten. Wat je moet doen - in welke taal dan ook - is om een
deelverzameling te kiezen, werkcode te schrijven en geleidelijk
meer te leren van de taal, zijn bibliotheken en zijn hulpmiddelen. Voor mijn suggestie over hoe beginners C ++ kunnen benaderen, zie Programmeren: principes en
oefeningen met C ++ .
EC ++ is een (bijna)
subset van C ++ zonder uitzonderingen, sjablonen, naamruimten,
RTTI-ondersteuning, meerdere overerving, enz. Die worden gedefinieerd door een
"industrieconsortium". Ik ben geen
voorstander van taalsubsets of dialecten. Ik ben vooral niet dol op subsets die de standaardbibliotheek niet kunnen
ondersteunen, zodat de gebruikers van die subset hun eigen incompatibele
basisbibliotheken moeten uitvinden. Ik vrees dat een
gedefinieerde subset van C ++ de gebruikerscommunity zou kunnen splitsen en
acrimony zou veroorzaken (31/03/1999: ik zag zojuist een advertentie met
levendige grafische afbeeldingen om aan te geven hoe EC ++ "vet" (dwz
geheugenruimte) verminderde door - onder andere dingen - naamruimten, sjablonen
en C ++ standaardstrings. Zucht!). Ik verkies sterk
dat werk op "standaarden" plaatsvindt in een open forum (zoals ISO of
een nationale standaardorganisatie).
Voor een
bespreking van hoe embedded systems-implementeerders prestatieproblemen kunnen
aanpakken met behulp van Standard C ++ (beter dan door dialecten te gebruiken),
raadpleegt u het rapport van de ISO C ++ -commissie over prestaties . Voor zover ik weet is EC ++ dood (2004) en als het
niet zo is, zou het moeten zijn.
Kijk voor de
manier waarop ISO C ++ kan worden gebruikt voor serieuze ingebedde
systeemprogrammering, zie de C ++ -coderingsnormen voor
JSF-luchtvaartuigen .
C ++ kreeg zijn object-georiënteerde concepten
van Smalltalk?
Nee. C ++ kreeg de
sleutelbegrippen van klassen, afgeleide klassen, virtuele functies (met andere
woorden, de begrippen inkapseling, overerving en polymorfisme) van Simula, net
zoals Smalltalk deed. In termen van
gezinsrelaties zijn C ++ en Smalltalk broers en zussen.
Is C ++ een object-georiënteerde taal?
C ++ is een programmeertaal met meerdere
paradigma's die objectgeoriënteerde en andere nuttige programmeerstijlen
ondersteunt. Als wat je zoekt iets is dat je dwingt om dingen op
precies dezelfde manier te doen, C ++ is het niet. Er is niemand een goede manier om elk programma te schrijven - en zelfs als
er waren, zou er geen mogelijkheid zijn om programmeurs te dwingen het te
gebruiken.
Dat gezegd
hebbende, het schrijven van C-style programma's in C ++ is voor de meeste
applicaties geen optimaal gebruik van C ++. Om een
echt effectieve C ++ -programmeur te zijn, moet je de
abstractiemechanismen en het type systeem gebruiken op een manier die redelijk
overeenkomt met hun intentie. Proberen het C ++ -typestelsel te negeren of te
verslaan, is een zeer frustrerende ervaring.
Het schrijven van
Java-stijl code in C ++ kan net zo frustrerend en suboptimaal zijn als het
schrijven van C-stijl code in C ++.
Zie voor een meer
gedetailleerde bespreking een van mijn overzichts- of stijlartikelen uit
mijn bibliografie . Zie met name mijn OOPSLA-document "Waarom C ++
niet zomaar een objectgerichte programmeertaal is".
"C maakt het
gemakkelijk om jezelf in de voet te schieten, C ++ maakt het moeilijker, maar
als je het doet, schiet je hele been eraf" . Ja, ik zei zoiets
(in 1986 of zo). Wat mensen vaak missen, is dat wat ik daar zei over C
++ in verschillende mate geldt voor alle krachtige talen. Omdat je mensen beschermt tegen simpele gevaren,
krijgen ze nieuwe en minder voor de hand liggende problemen. Iemand die de simpele problemen vermijdt, kan simpelweg
op weg zijn naar een niet-zo eenvoudig probleem. Een probleem met zeer ondersteunende en beschermende omgevingen is dat de
harde problemen mogelijk te laat worden ontdekt of te moeilijk zijn om te
verhelpen zodra ze zijn ontdekt. Ook is een zeldzaam
probleem moeilijker te vinden dan een frequent probleem, omdat je het niet
vermoedt.
"Binnen C ++
is er een veel kleinere en schonere taal die worstelt om eruit te komen" . Ja, dat citaat is te vinden op pagina 207 van The Design and Evolution of C ++ . En nee, die kleinere en schonere taal is geen Java of C # . Het citaat komt voor in een sectie getiteld
"Beyond Files and Syntax". Ik wees erop dat de C ++ -semantiek veel schoner is
dan de syntaxis ervan. Ik dacht aan programmeerstijlen, bibliotheken en
programmeeromgevingen die de nadruk legden op schonere en effectievere
praktijken over archaïsche toepassingen gericht op de low-level aspecten
van C.
"Ik heb
altijd gewild dat mijn computer net zo gemakkelijk te gebruiken was als mijn
telefoon, mijn wens is uitgekomen omdat ik niet meer weet hoe ik mijn telefoon
moet gebruiken" . Ik zei dat na een frustrerende poging om ergens in 1990 een
"feature-rijke" telefoon te gebruiken. Ik ben er zeker van dat het
sentiment niet origineel was en waarschijnlijk niet eens de algemene
formulering; daar moet iemand voor mij aan hebben gedacht.
"Er zijn
slechts twee soorten talen: die waarover mensen klagen en die niemand
gebruikt" . Ja. Nogmaals, ik betwijfel ten zeerste of het sentiment origineel is. Natuurlijk moeten alle "er zijn maar twee" citaten worden genomen
met een korrel zout.
"Bewijs door
analogie is fraude" . Ja; pagina 692 van TC ++ PL. Een goede analogie is een uitstekende manier om een
idee te illustreren, maar veel te vaak gaan dergelijke
analogieën niet gepaard met solide redenering, gegevens, enz.
"Mensen die
denken dat ze alles weten, irriteren echt degenen onder ons die weten dat we
dat niet doen" . Ja.
"C ++ Is mijn
favoriete garbagecollectie omdat het zo weinig afval genereert" . Ja; zie Waarom heeft C ++ geen garbage
collection? en Hoe ga ik om met geheugenlekken .
"Als je denkt
dat het eenvoudig is, dan heb je het probleem verkeerd begrepen" . Ja, maar nee, ik weet niet meer welke vraag dat
antwoord opriep.
"Er zijn meer
nuttige systemen ontwikkeld in talen die als vreselijk worden beschouwd dan in
talen die worden geprezen om mooi te zijn - veel meer" . Ja, in het MIT Technology Review-interview en elders. Daar zei ik ook:
- "Ik denk dat we
moeten zoeken naar elegantie in de ontwikkelde applicaties, in plaats van
in de talen zelf" . Ik had moeten zeggen
"meer dan" in plaats van "in plaats van".
- "Om C ++ goed te
kunnen gebruiken, moet je de ontwerp- en programmeertechniek
begrijpen" .
- "C ++ is ontworpen
om u ideeën te laten uiten, maar als u geen ideeën hebt of geen
idee hebt hoe u ze moet uitdrukken, biedt C ++ niet veel hulp" .
"De
<random> -bibliotheek is wat een willekeurige bibliotheek wil worden als
deze opgroeit, waardoor beginners rand () gebruiken" . Ja. In de openingstoespraak van CppCon 2017: The Learning and Teaching Modern C
++ .
"Het feit dat
'goto' alles kan, is precies waarom we het niet gebruiken" . Ja. In de openingstoespraak van CppCon 2017: The Learning and Teaching Modern C
++ . Ik heb / wijs erop dat 'goto' uitstekend is in machinegegenereerde code.
"Als de
opmerking en de code het oneens zijn, zijn beide waarschijnlijk verkeerd" . Ja, ik citeer Norm Schryer, denk ik. In de openingstoespraak van CppCon 2017: The Learning and Teaching Modern C
++ .
"Onderwijs
voor de toekomst, je moet erin leven" . Ja. In de openingstoespraak van CppCon 2017: The Learning and Teaching Modern C
++ . Ook in andere contexten: bouwen aan de toekomst; je moet erin leven .
"Wees niet
slim" . Ja. In de openingstoespraak van CppCon 2017: The Learning and Teaching Modern C
++ . De begeleidende dia zegt: "Wees niet (te) slim" maar ik kan geen
haakjes plaatsen :-). Mijn punt was om overdreven slimme code te
ontmoedigen, want "slimme code" is moeilijk te schrijven, gemakkelijk
om fout te raken, moeilijker te onderhouden, en vaak niet sneller dan
eenvoudigere alternatieven omdat het moeilijk kan zijn om te optimaliseren.
"Veel te vaak
is 'computerwetenschap' een vorm van wiskunde-afgunst" . Ja, maar vergeet alsjeblieft niet dat "veel te
vaak". Het citaat komt uit een context waarin ik me zorgen maak over onvoldoende
aandacht voor data (empirie) en onvoldoende aandacht voor de connectie met
computers. Het is geen frontale aanval op het idee dat computerwetenschap wetenschap
kan zijn (zie bijvoorbeeld Knuth over algoritmen en de analyse van algoritmen,
dat is wetenschap en het is geen andere wetenschap). En nee, ik ga geen
concrete voorbeelden of namen geven.
"Veel te vaak
is 'software engineering' geen techniek of software" . Ja, maar vergeet alsjeblieft niet dat "veel te
vaak". Het citaat komt uit een context waarin ik me zorgen maak over onvoldoende
aandacht voor data (empirie) en onvoldoende aandacht voor de connectie met
code. Ik ben bang dat de realiteit van het moeten leveren van nuttige en onderhoudbare
code kan worden verdronken in processen, bedrijfsstandaarden en
marketingstudies; dat softwareontwikkeling soms wordt bestuurd door
mensen die geen goede code herkennen als deze opspringt en ze op de neus slaat,
en daar trots op zijn. En nee, ik ga geen concrete voorbeelden of namen
geven. Goed ontwikkeld, is software-ontwikkeling een waardige technische
discipline, die resultaten oplevert die goed te vergelijken zijn met die van
oudere technische disciplines.
"Wanneer
(niet als) automatische garbage collection onderdeel wordt van C ++, is het
optioneel" . Ja in een 2000-interview met /. .
"Het is
gemakkelijk om vergeving te winnen omdat je ongelijk hebt, want gelijk krijgen
is wat je in de problemen brengt" . Ja.
"Elk probleem
in de informatica kan worden opgelost met een andere laag van indirecte
richting" , bekend als
de 1e wet van de informatica. Het volledige citaat is: "Elk probleem in
de informatica kan worden opgelost met een andere laag van indirectie, behalve
natuurlijk voor het probleem van te veel indirecte richtingen" . Ja, ik zei dat citaat (mijn thesis-adviseur) David J. Wheeler. Voeg het mij alsjeblieft niet toe.
"Ik moet nog
een programma zien dat beter in C geschreven kan worden dan in C ++" . Ja, vaak, inclusief mijn elektronische ontwerpinterview . Ik geloof niet dat zo'n programma kan bestaan. Met `` beter '' bedoel ik kleiner, efficiënter of beter onderhouden. Als er niets anders is, kun je het programma in C-stijl schrijven en
profiteren van de sterkere typecontrole van C ++ en betere notationele
ondersteuning, maar de meeste programma's kunnen baat hebben bij de
ondersteuning van C ++ voor generieke en objectgeoriënteerde programmering
zonder afbreuk te doen aan de grootte of prestaties. Vasthouden aan de
C-achtige subset van C ++ is meestal contraproductief.
"Test vroeg
en vaak" . Ja, vaak, inclusief hoofdstuk 22 van Programmeren: principes en praktijk
met C ++ .
"Ruimte is
tijd" . Ja, verwijzend naar het feit dat compacte gegevens sneller kunnen worden
overgestoken dan verspreide gegevens (een doorkruising van een vector kan
bijvoorbeeld aanzienlijk sneller zijn dan het doorlopen van een gekoppelde
lijst) en sneller naar invoer en uitvoer.
"Het enige
dat sneller groeit dan de prestaties van de computer is de menselijke
verwachting" . Ja, vaak sinds de late jaren tachtig. Het was mijn
standaardantwoord op suggesties dat we echt niet meer hoefden te werken aan het
efficiënter maken van software omdat hardware sneller wordt.Natuurlijk is
de single-core prestatie vandaag niet jarenlang verbeterd.
"vriendschap
is niet overgeërfd noch transitief" . Ja. Het is een C ++ -taalregel uit de vroegste dagen.
"Slechts de
helft van de C ++ -gemeenschap is bovengemiddeld" . Ja, in een WG21-avondsessie over toekomstige
richtingen. Het punt was om de commissieleden van de C ++ -normen eraan te herinneren
dat ze voor de C ++-gemeenschap in het algemeen moesten ontwerpen, in plaats
van alleen voor deskundigen zoals zijzelf.
"Iedereen die
beweert de perfecte programmeertaal te hebben, is een dwaas of een verkoper of
beide" . Ja; vele keren.
"Niemand zou
zichzelf een professional moeten noemen als ze maar één taal
kennen" . Betekenis professional als software-ontwikkelaar of directe manager van
softwareontwikkelaars. Ja. Vele keren.
"Het
belangrijkste aspect van softwareontwikkeling is om duidelijk te zijn over wat
u probeert te bouwen" . Ja, in TC ++ PL2 en TC ++ PL3.
"Onze
beschaving draait op software" . Ja, het voor de hand liggende vermelden. Het is een pleidooi voor meer betrouwbare en onderhoudbare code. Als onze geautomatiseerde systemen falen, zullen velen verhongeren.
"Voor veel
managers lijkt het verwijderen van de arrogante, ongedisciplineerde,
overbelaste, door technologie geobsedeerde, onjuist geklede etc. programmeurs
een aanzienlijk bijkomend voordeel" . Ja, in TC ++ PL2 en TC ++ PL3.
"Om oude code
te optimaliseren, moet je eerst van de mooie dingen af" . Ja, het punt is dat nieuwe C ++ -functies en betere
optimalisers vaak schonere, moderne code sneller laten werken dan uitvoerig met
de hand geoptimaliseerde code.
"Wanneer was
de laatste keer dat u de geretourneerde waarde van printf hebt
gecontroleerd?" Ja, het punt is dat zeldzame fouten vaak niet worden
gepakt, wat tot verrassende crashes leidt. Dit is een
argument voor het gebruik van uitzonderingen: ze kunnen niet worden genegeerd.
"Het probleem
met veel professoren is dat hun vorige functie student was" . Ja. Je hebt ervaring nodig die verder gaat dan het leren
van boeken om goed te leren.
"Ontwerpen en
programmeren zijn menselijke activiteiten, vergeet dat en alles is
verloren" . TC ++ PL3.
"Als je
mensen de keuze geeft om goede code of snelle code te schrijven, is er iets
mis: goede code moet snel zijn" . CppCon 2018-keynote.
"Ik haat het
om te kiezen tussen elegantie en efficiëntie" . Ja. Vaak.
"Iemand die
beweert een perfecte programmeertaal te hebben, is een verkoper of een dwaas,
of allebei" . Ja. Vaak.
"Als je nooit
faalt, probeer je niet hard genoeg" . Ja.
Heb je echt een interview gegeven aan IEEE?
waarin je bekende
dat C ++ opzettelijk is gemaakt als een vreselijke taal voor het schrijven van
niet-verdedigbare code om de salarissen van programmeurs te verhogen?
Natuurlijk niet. Lees het echte IEEE-interview .
"Legacy
code" is een term die vaak afwijkend wordt gebruikt om code te
karakteriseren die is geschreven in een taal of stijl die (1) de spreker /
schrijver als verouderd beschouwt en / of (2) concurreert met iets verkocht /
gepromoot door de spreker / schrijver. "Legacy-code"
verschilt vaak van het voorgestelde alternatief door daadwerkelijk te werken en
te schalen.
Verdubbelt het aantal C ++ -gebruikers elk jaar nog
steeds?
Nee. In de periode
1980-1991 verdubbelde het aantal gebruikers elke zeven en een halve maand
(zie Het ontwerp en de evolutie van C ++ ). Er zijn echter simpelweg
niet genoeg programmeurs om dat vol te houden. Van de weinige nummers die ik kan krijgen (compilerverkoop, boekverkoop,
werklast van consultants die ik toevallig ken, IDC, enz.), Schat ik dat de
groeisnelheid een paar procent is. Stabiel en zeker positief . IDC schatte dat in
1996 1,2 miljoen C ++ -implementaties werden verkocht. Hun schatting van het
aantal C ++ -programmeurs in 2001 bedroeg "ongeveer 3 miljoen"; hun nummer uit 2004 was "meer dan 3
miljoen". Een professionele enquête van 2015 vond 4,4 miljoen C ++ -programmeurs. Dat lijkt plausibel en duidt op een aanhoudende groei.
Gebruikt iemand tegenwoordig C ++?
Ja, veel doen. Er zijn te veel C
++ -gebruikers om ze effectief te tellen, maar het aantal is in de miljoenen. C ++ wordt ondersteund door alle grote leveranciers . Zie mijn application sampler voor voorbeelden van C ++ gebruik.
Waarom wordt C ++ niet gebruikt voor
besturingssystemen?
Het is, en het is
al meer dan een decennium; zie mijn lijst met C ++ -toepassingen . Een recent voorbeeld is Cloudius .
Had je verwacht dat C ++ zo'n succes zou worden?
Natuurlijk niet. Het slagingspercentage voor algemene programmeertalen
is vanishingly klein. Ik wist dat en ik
wist dat de kans op succes werd beïnvloed door de invloed van marketing,
die ik niet had.
C ++ is initieel
ontworpen en geïmplementeerd als een reeks algemene voorzieningen om een
aantal specifieke problemen aan te pakken waarmee ik en mijn
collega's werden geconfronteerd. De algemeenheid - en efficiëntie - van de
aangeboden faciliteiten bleken veel bredere behoeften te dienen dan ik had
verwacht. De nadruk op algemene voorzieningen - in tegenstelling tot het bieden van
specifieke oplossingen voor specifieke problemen - is bij C ++ gebleven en
heeft de gemeenschap goed gediend, aangezien de specifieke problemen waarmee de
gemeenschap wordt geconfronteerd in de loop van de jaren zijn veranderd.
Wat is een goede certificering voor C ++
-programmeurs?
Voor zover ik
weet, is er geen goed certificeringsprogramma voor C ++ -programmeurs. Dat is jammer. Een goed certificeringsprogramma zou het nuttigst zijn. C ++ mist echter de centrale organisatie die een
solide certificeringsprogramma zou produceren en een certificeringsprogramma
zonder autoriteit of gericht op syntaxis zou slechter zijn dan nutteloos.
Waarom ben je bij Morgan Stanley gaan werken?
Ik vond dat het
tijd was om terug te gaan naar de industrie. Ik miste de uitdagingen van real-world, grootschalige projecten met echte
gevolgen in het geval van succes en mislukking. Academia begon een beetje kushy en `` Ivory tower '' voor mij te voelen
(dat is niet de manier waarop academia is voor jongere
faculteit en adjunct faculteit - die hebben en verdienen veel meer steun dan ze
krijgen). De technologie-divisie van Morgan Stanley heeft een
enorm scala aan informatica-uitdagingen, en een hoop slim, goed opgeleid en
verrassend (gezien de popuarreputatie van mensen die voor `` Wall Street''
werken) aardige mensen. Morgan Stanley
heeft veel serieus C ++ -gebruik. Daarnaast zorg ik
voor C ++ -standaardisatie (C ++ 17 is onderweg) en doe ik wat onderzoek in
mijn hoedanigheid van professor aan Columbia University en Texas A & M University . Het was tijd om
terug te gaan naar het Noord-Oosten en naar mijn familie daar.
PS. Ik werk voor Morgan Stanley, niet voor JP Morgan. Morgan Stanley is een vrij zwaar gereguleerde bank ,
in plaats van een generieke `` financiële instelling '', en IMO een van de
meest ethisch beheerde financiële instellingen.
PPS. Je kunt eenvoudigweg geen moderne samenleving runnen zonder banken.
Waarom ben je gaan werken bij Texas A & M University?
De stoom was op
van Bell Labs en zijn opvolgers, AT & T Labs en Lucent Bell Labs. Het was gewoon niet meer wat het was. Ik had (en heb) vrienden bij TAMU en vond het een
goede plek om de verschillende vaardigheden van het academische leven te leren. Om te beginnen wijkt academisch onderzoek nogal af van
industrieel onderzoek dat ik gewend was. Smakelijk, het lesgeven aan eerstejaars en afgestudeerden is heel anders
dan onderwijsprofessionals. Ik heb ook
geholpen met het opbouwen van de afdeling Computer Science and
Engineering . Ik ben nog steeds geassocieerd met TAMU als een
universiteitskenmerkend hoogleraar.
PS. Texas A & M University! = University of Texas.
Waarom ben je in Bell Labs gaan werken?
Omdat ik het kon. In de jaren tachtig (en jaren daarvoor en daarna) was
er geen plaats op aarde zoals deze. Er is nog steeds
geen. Bell Labs was het belangrijkste toegepaste
wetenschappelijke en technische onderzoekscentrum ter wereld. Het was een zeer opwindende en uitdagende plek om te
werken, met buitengewone collega's. Ik maakte deel uit
van het Computer Science Research Center . Ik verliet AT
& T Labs (een van de twee opvolgers van AT & T Bell Labs) op goede
voorwaarden en werd nog een decennium lang geassocieerd met AT & T als AT
& T Fellow.
Een betere FAQ :-)
Serieus, ik ben op
zoek naar fundamentele manieren om de tools en technieken te verbeteren die we
gebruiken om grote real-world systemen te bouwen. Een deel van mijn werk is C
++ 11 .
C ++ is een
algemene programmeertaal met een voorkeur voor systeemprogrammering
- is een
betere C
- ondersteunt data
abstractie
- ondersteunt objectgeoriënteerd
programmeren
- ondersteunt generieke
programmering
Het wordt
gedefinieerd door een ISO-norm , biedt stabiliteit over decennia en heeft een
grote en levendige gebruikersgemeenschap. Zie ook De C ++ programmeertaal en Evolueren van een taal in en voor de
echte wereld: C ++ 1991-2006 .
Waar kan ik de achtergrond van C ++ leren kennen?
Over het ontwerp
van C ++? Over de geschiedenis van C ++?
Kijk naar mijn
papieren voor HOPL-2 en HOPL-3 ; HOPL staat voor 'History Of Programming Languages', de
belangrijkste conferentie over dat onderwerp, gesponsord door de ACM. Dit zijn zwaar collegiaal getoetste artikelen. Zie voor meer
informatie mijn boek Het ontwerp en de evolutie van C ++ en het voorwoord bij de Japanse vertaling
van D & E uit 2006, die de informatie tot 2006 brengt. Ook hebben veel van
mijn interviews betrekking op de achtergrond, het ontwerp en de
geschiedenis van C ++ .
Veel vragen komen
naar me toe in de vorm van beweringen
- C ++ is
low-level (?)
- C ++ is te traag voor
laag werk (?)
- C ++ is alleen nuttig als
je echt objectgeoriënteerde code schrijft (?)
- Modern C ++ is alle
generieke programmering en sjabloonmetaprogrammering (?)
- C ++ is ontworpen door
Microsoft (?)
Vaak beschouwt de
persoon die een van deze punten opvraagt de verklaring als een feit
(maar geen van deze beweringen is waar); soms is er een impliciet vraagteken. Zo,
- C ++ is laag niveau? Nee. C ++ biedt zowel functies op laag niveau als
op hoog niveau. C ++ heeft delen op laag
niveau, zoals verwijzingen, matrices en afgietsels. Deze faciliteiten zijn ( bijna identiek aan wat C biedt ) essentieel (in
welke vorm dan ook) voor nauwgezet hardware werk.Dus, als u laagwaardige
taalfaciliteiten wilt, biedt ja C ++ een beproefde reeks faciliteiten voor
u. Wanneer u echter geen functies op laag niveau
wilt gebruiken, hoeft u de C ++ -faciliteiten niet (rechtstreeks) te
gebruiken. In plaats daarvan kunt u
vertrouwen op hogere voorzieningen, waaronder bibliotheken. Als u bijvoorbeeld geen arrays en aanwijzers wilt
gebruiken, zijn standaardbibliotheekreeksen en -containers in veel
gevallen een (beter) alternatief. Als u alleen faciliteiten
op een laag niveau gebruikt, verspilt u vrijwel zeker tijd en maakt u het
onderhoud moeilijker zonder prestatievoordelen (zie Learning Standard C ++ als een
nieuwe taal ). Je kunt ook je systemen
blootstellen aan aanvallen (bijv. Buffer overflows).
- C ++ te traag voor laag
werk? Nee. Als u het zich kunt permitteren om C te
gebruiken, kunt u het zich veroorloven om C ++ te gebruiken, zelfs de
hogere voorzieningen van C ++ waar u hun functionaliteit nodig hebt. Zie Abstractie en het C ++
-machinemodel en het technisch rapport over
prestaties van de ISO C ++-normcommissie.
- C ++ is alleen nuttig als
je echt objectgeoriënteerde code schrijft? Nee. Dat is "nee" voor zowat elke
redelijke definitie van "objectgericht". C ++ biedt ondersteuning
voor een breed scala aan behoeften, niet alleen voor één
stijl of voor één soort toepassing. In feite biedt C ++, in
vergelijking met C, meer ondersteuning voor zeer eenvoudige
programmeeropdrachten. De standaardbibliotheek
en andere bibliotheken vereenvoudigen bijvoorbeeld radicaal veel anders
saaie en foutgevoelige taken. C ++ wordt veel gebruikt
voor grote toepassingen, maar biedt ook
voordelen voor zelfs maar kleine programmeertaken.
- Modern C ++ is alle
generieke programmering en sjabloonmetaprogrammering? Nee. C ++ ondersteunt verschillende nuttige
programmeertechnieken , waaronder traditionele procedurele
programmering, objectgeoriënteerd programmeren en generieke
programmering. Geen van deze is beter
dan alle andere voor alle toepassingen en de meest effectieve oplossing
voor een reëel probleem is meestal een combinatie van technieken.
- C ++ is ontworpen door
Microsoft? Nee. Oorspronkelijk heb ik C ++
ontworpen en geïmplementeerd en samen met de ISO C ++ norm
heeft de commissie haar definitie verfijnd . Microsoft heeft een actieve en grotendeels
positieve rol gespeeld in deze standaardisatie - evenals Apple, GNU, IBM,
Sun en vele anderen. Net als andere -
bijvoorbeeld Apple - probeert Microsoft hun gebruikers te helpen /
vergrendelen met eigen extensies (in het bijzonder Microsoft C ++ / CLI ).
Boost is een grote en groeiende verzameling bibliotheken die ontworpen is om goed te werken met de ISO C ++
standaardbibliotheek. Het bevat veel
uiterst nuttige en goed ontworpen bibliotheken, zoals asio, bestandssysteem,
regex en thread (excuses voor het niet proberen om meer bruikbare bibliotheken
te identificeren, er zijn er gewoon te veel). Eén bibliotheek, TR1, bevat een goede benadering van nieuwe
standaard C ++ 11-bibliotheekcomponenten.
De
Boost-bibliotheken hebben testsuites, documentatie, zijn getest op meerdere
systemen en zijn peer-reviewed.
Ik heb echter twee
problemen met Boost, waarvan ik hoop dat het uiteindelijk zal worden
afgehandeld:
- Het is te moeilijk om
slechts één Boost-bibliotheek te downloaden en te gebruiken; de bibliotheken lijken overdreven gekoppeld,
waardoor het moeilijk is om te kiezen en te kiezen.
- Sommige bibliotheken zijn
te slim voor mijn smaak. Soms vallen algemeenheid
en eenvoud samen; in Boost is de balans IMO
te vaak zo ver weg dat generieken en gemiddelde gebruikers verloren gaan.
Dat gezegd
hebbende, is het meestal een heel dom idee om een wiel opnieuw
uit te vinden dat al een boost biedt.
Wat denk je van template metaprogramming?
Sjabloon
metaprogrammering is een reeks krachtige programmeertechnieken, die bij gebruik
met zorg en smaak kunnen helpen bij het oplossen van vrij lastige problemen,
meestal met betrekking tot de architectuur van grotere systemen, de
draagbaarheid en het onderhoud ervan (zie Abrahams en Gurtovoy: C ++ Template Metaprogramming en sommige van de Boost-bibliotheken .
Zoals alle
krachtige technieken zijn ze gemakkelijk te veel gebruikt. Persoonlijk gebruik ik sjablonen voornamelijk voor generieke programmering
(bijvoorbeeld het definiëren van containers en algoritmen boven
containers) en voor sjablonen die redelijk voor de hand liggende code genereren
op basis van sjabloonargumenten (bijvoorbeeld het genereren van buffers en het
registreren van toegangscode); dat wordt soms generatief programmeren genoemd. Wees voorzichtig met de complexiteit van de sjablonen die u schrijft of
gebruikt; het is gemakkelijk om overenthousiast te raken en code te schrijven die te
slim is om bruikbaar te zijn als onderhoudbare productiecode.
Als je niet van
functionele programmeerstijlen houdt, kun je template-metaprogramma's moeilijk
te begrijpen vinden. Als je functionele programmering leuk vindt, vind je
de sjabloonversie misschien een beetje primitief, maar onthoud dat deze
sjablonen tijdens het compileren worden uitgevoerd.
De ondersteuning
van C ++ voor metaprogrammering verbetert. Concepten zullen generieke programmering drastisch
vereenvoudigen en een groot deel van de steigers voor sjabloonmetaprogramming
overbodig maken. Bovendien, als wat u wilt genereren een waarde (zeg en
integerwaarde) is, zijn constexpr-functies veel gemakkelijker te gebruiken (en sneller te
compileren).