2013-11-22 13 views
5

Ho letto uno interview con Bjarne Stroustrup su C++ e il suo design. Ero confuso dalla terminologia che usava lì, quindi speravo di chiarire alcuni di questi momenti.Intervista a Bjarne Stroustrup - astrazione e codice artigianale

ho documentato i miei obiettivi di progettazione e dei vincoli sulla progettazione nel mio libro “la progettazione e realizzazione di C++” e nella mia due Storia di atti di convegni Linguaggi di Programmazione, ma per breve tempo, io lo scopo per

  • nullo testa rispetto al codice artigianale utilizzando astrazioni,
  • modello di macchina, molto simile a quella di C,
  • un insieme estremamente flessibile meccanismo di astrazione, e
  • ty statico pe sicurezza.
  1. Che cosa significa "lavorato a mano il codice" significa in questo caso? .. Vuol dire Stroustrup qualche strumento artigianale per un concetto di astrazione di un programmatore potrebbe creare?
  2. Che cosa significa "modello macchina" in questo caso? Un modo in cui una lingua interagisce con l'hardware?

ho preso uno sguardo sul libro ha citato (che in realtà è “La progettazione e Evoluzione di C++”, credo) ma non sono ancora veramente sicuro. Anche questi due termini non vengono trattati bene.

+2

Potrebbe essere più adatto per il sito del programmatore stackExchange, l'overflow riguarda in particolare * problemi relativi al codice *. Buona domanda anche se si spera possa ancora essere data una risposta qui. –

+0

@ Gmercer015 Spiacenti. OK, scusa, non lo sapevo. – kazarey

+0

@remyabel Ho letto questo. Capisco il significato di "hand-crafted" di iteslf, ciò che non capisco è ciò che viene realizzato a mano qui. – kazarey

risposta

7

"Modello di macchina" indica il modo in cui il computer si manifesta nella lingua. Ad esempio, C e C++ trattano i byte, le posizioni di memoria, i puntatori, i tipi interi in più o meno allo stesso modo.

"Hand-crafted" qui significa codice equivalente che non utilizza l'astrazione fornita in C++ ed è scritto in modo efficiente in C o assembly (o C++, escludendo tale astrazione). Questo è un "obiettivo", non un "vincolo": il C++ non lo raggiunge esattamente in tutti i casi.

Quindi, tanto per fare un esempio, vector<int> non sempre ottenere esattamente le stesse prestazioni come un array ridimensionabile simile scritto utilizzando malloc e free, perché questo codice potrebbe (e naturalmente sarebbe) utilizzare realloc per ridimensionare l'archiviazione quando necessario. realloc non ti salva molto spesso in qualsiasi momento, ma quando lo fa salva un chunk. vector non può farlo, perché l'interfaccia di allocatore non ha nulla di equivalente a realloc, e quindi ha introdotto un piccolo overhead. Ma lo vector ha all'incirca le stesse prestazioni, quasi sempre, quindi l'obiettivo di zero-overhead è quasi raggiunto.

Per un altro esempio: con un compilatore C++ decente in modalità di rilascio, la scrittura di myvector_of_int[3] ha effettivamente zero overhead rispetto alla scrittura my_int_pointer[3]. Potrebbe non essere immediatamente evidente il motivo per cui l'accesso a un membro dati di una variabile locale (il puntatore dati memorizzato in myvector_of_int) non ha sovraccarico rispetto all'accesso a una variabile locale di tipo puntatore(), ma non deve costare nulla in più.

+0

Quindi stai dicendo che Bjarne intende ** non ** usare l'astrazione fornita da C++? –

+2

No, sto dicendo che mira a che ci sia zero overhead se usi l'astrazione. Sovraccarico rispetto al codice "fatto a mano", vale a dire codice che fa la stessa cosa del codice che usa l'astrazione, ma esplicitamente in C, invece di lasciare che il compilatore/le librerie C++ lo faccia per te. –

+0

* ooohhhh * gotcha. –

6

Per codice "fatto a mano", Stroustrup indica un'implementazione scritta a mano dell'astrazione; ad esempio, un ciclo for creato a mano sarebbe N copie del corpo del ciclo. (Vedere Duff's Device per un'implementazione non banale.)

E con "modello macchina", Stroustrup indica la vista del compilatore della macchina. Ad esempio, C e C++ forniscono viste approssimativamente equivalenti di byte, posizioni di memoria, ordinamento di accesso alla memoria e così via; Fortran, al contrario, non ha alcun concetto di "byte", e le posizioni di memoria (o l'accesso all'array, peraltro) non corrispondono affatto alla vista C/C++.

+0

"un ciclo creato a mano per il ciclo sarebbe N copie del corpo del ciclo" - o a seconda di come lo si guarda, un ciclo 'for' creato a mano implicherebbe un' se' e ​​un 'goto' in C o C++ o un ramo condizionale in assembly. È una questione di ciò che consideri l'importante proprietà dell'astrazione e che potrebbe variare a seconda del contesto. –