
ciao, sono Walter Brite e questo
riguarda la programmazione dei componenti nel D
linguaggio di programmazione va bene a tutti dentro
chi è un programmatore di software professionale
parla di software riutilizzabile è un
assioma è scontato che tutti compriamo
in esso cerchiamo tutti di scrivere riutilizzabili
software bene che da queste parti cerca di
rendere i loro software riutilizzabili tutti
chi cerca di non fare il proprio software
ok ragionevole quindi ce ne sono alcuni così
voi ragazzi potete andarvene, ora si, va bene
c’è una specie di brutta realtà per
sto scrivendo software riutilizzabile
programmazione per 35 anni e I
ho scoperto qualcosa di terribile sul mio
codice come non lo riuso mai quasi mai
riutilizzalo
Credo nel software riutilizzabile, ma lo sono
sempre scrivendolo di nuovo copypasta
non funziona non conta
va bene copiarlo e modificarlo
questo non è un software riutilizzabile, quindi come
molti di voi hanno avuto questa esperienza
ripassa il tuo codice e basta
non è riutilizzabile nonostante i tuoi migliori sforzi
okay qualcosa è andato orribilmente
orribilmente sbagliato ok non è per mancanza di
provando ogni volta che faccio qualcosa che provo
per renderlo riutilizzabile perché sai che sono
un credente non è perché sono un migliore
programmatore di quanto lo fossi, quindi odio
quello che ho scritto prima e voglio
riscriverlo è solo per qualche motivo
non funziona e ho bisogno di guardare
più profondo per quello che diamine sta andando male
con il mio software perché non è riutilizzabile
okay, quindi lo guardo e tu ne conosci qualcuno
le cose sul mio codice mi turbano
le mie astrazioni sono sempre perfette
sembra che non ci siano limiti duri
i bordi e sembra sempre scorrere
fuori nel codice circostante e il
puzza dei tempi del codice circostante a
fluisco nella mia astrazione e alla fine
risultato è che posso riutilizzarlo
a volte anche i miei componenti lo sono
specifici funzionano per un tipo particolare
ma non per nessun altro tipo e così quando io
voglio riutilizzarli è tutto sbagliato
è per i tipi sbagliati, quindi ad alcuni
punto penso che ho bisogno di tornare al primo
principi sai quando le cose non lo sono
lavorando e non riesci a capire perché
a volte è il momento di fare il backup e iniziare
di nuovo ok, iniziamo con quello che è
un componente qualcuno vuole dire che a
componente è qualcuno coraggioso se si google
software componente che trovi un enorme
quantità di letteratura sull’argomento
di certo non potrei andare oltre
una breve presentazione come questa, quindi facciamolo
parla un po ‘ di quello che penso
come componente c’è molto, molto
codice riutilizzabile là fuori intendo C
librerie Librerie Java Librerie C ++
e sono riutilizzabili e funzionano ma
Non li chiamerei davvero componenti
okay direi che un componente
segue una determinata interfaccia predefinita
che è conforme e deve essere costruito così
che i componenti possono essere sostituiti uno
componente può essere estratto un altro
il componente può essere tirato nell’unico modo
funzionerà se le interfacce sono
aderito al problema con la maggior parte
librerie in particolare come le librerie C
Librerie C ++ in cui ogni libreria vive
suo
mondo inventano la propria API hanno
inventano le loro interfacce su cui stanno lavorando
tipi per esempio con C ++ per anni e
anni e anni fino a quando la STL ha preso piede
ognuno ha fatto il proprio tipo di stringa chi
sa di cosa sto parlando , sei tu
conosci la prima cosa che la gente ha fatto con il C ++
è stato creato il proprio tipo di stringa e
la loro biblioteca dipendeva da sola
tipo di stringa che significa nessuno dei
le librerie interagirebbero con ciascuna
altro senza qualche complicato
scaffolding per tradurre un tipo di stringa
al prossimo tipo di stringa del termine non lo è
componente software
quindi cosa fa un programma tipico o di base
Direi che lo legge
elabora l’input quindi scrive il
l’output non è d’accordo con nessuno
ricorda la maggior parte dei tuoi programmi in questo modo
leggono il loro input ne fanno alcuni
elaborazione scrivono così il loro output
anche se il tuo programma è interattivo
programma come un’applicazione GUI che non lo fa
seguire davvero quel modello ma lo sarà
sottosistemi in esso che lo fanno a
un mucchio di dati elaborati produce a
risultato una sorta di elaborazione batch Let’s
scrivilo in qualche pseudocodice abbiamo il
la fonte dei dati va a un algoritmo
va in un mare di dati e noi vogliamo essere
in grado di comporre i nostri componenti in modo sorgente
applica un algoritmo per il suo feed di output
nel prossimo algoritmo e il
risultato chiamiamo il nostro sink che è dove
va bene ovunque abbiamo visto prima
ovviamente risponde ovvio che è l’UNIX
file e i filtri da riga di comando
interfaccia a chi è familiare
file e filtri quasi tutti
in un modello di incredibile successo di
software snap-together Penso che sia il
motivo per cui UNIX è persistito per questo
lungo è entrato nella C
ecosistema o la visione C delle cose come il
i file di interfaccia file sono le fonti e
i sink affronta il ruolo degli algoritmi
di essere i tubi dei filtri li connettono
ed è così pervasivo e di successo
quella gente perfino
inventare pseudo filesystem per
lavora con quel software e qui c’è a
link a un esempio di pseudo file
sistemi per Linux quindi ci sono cose che
non ha mai colpito un file, ma ancora hanno un
l’interfaccia di file per loro bene non lo è
perfetto non ci raggiunge davvero
per una ragione si è evoluto era una specie di
scoperto e evoluto nel tempo e come
prova di essersi evoluto controlla il
Interfaccia di controllo AYGO che è quando
qualcosa non ha funzionato a destra perfettamente ragione
con loro la gente lo butterebbe in alcuni
Cluj nel controllo I / O e posso controllare Oh
come infame per essere un gigantesco Cluj
è solo una specie di borsa da viaggio okay
un altro problema con l’ interfaccia del file
i tuoi dati sono visti come un flusso di
byte non si può andare avanti in esso bene
puoi andare avanti mentre lo leggi ma
non puoi andare indietro che non hai
accesso casuale ad esso ed è un flusso di
byte non è un flusso strutturato
dati o altre forme di dati ma tu
sapere e che un flusso non è sempre il
migliore la migliore fonte di input per un
algoritmo per un esempio di un algoritmo
potrebbe essere necessario un array e un flusso non è un
array ma mostra quale componente
l’interfaccia può essere e quale componente
interfaccia può fornire per voi per
esempio con i file e filtri il
idea in Linux è la serie di
cose come grep e sort e top e
allora funzionano tutti come filtri e
chiunque scriva quei filtri no
parlare con chiunque altro che scrive filtri
ma sono tutti conformi all’interfaccia
così possono essere tutti
agganciare e collegare insieme
qualsiasi ordine separato con la verticale
barre o il simbolo della tuta, quindi andiamo
indietro e guarda una specie di canonico
esempio del codice tipico che scrivo
sembra che il suo input arrivi qui
stiamo leggendo un modello dal
argomenti mentre non siamo alla fine di
il file leggiamo una riga se corrisponde
il nostro modello scriviamo una riga okay chi
scrive codice come questo, fa loops loop loop
loop loop è questo che codificherò è
profondamente radicato nel mio cervello quando penso
di scrivere codice che penso sempre in termini
di loop come quello e Jude non guarda
davvero molto simile alla fonte che sta per
l’algoritmo sta per affondare in effetti sembra
come tipo di venire lentamente al
la consapevolezza che sembra così
sembra un vortice o un turbinio tuo
i dati arrivano nella parte superiore e inizia
andando in giro e intorno e intorno e
round and round e alla fine si ordina
di esce al centro o nel mezzo
quindi come si incapsula questa roba
disegnate un quadrato lì e dite bene che lo sono
andando a incapsulare quella parte del
sai che non funziona se disegno il
Square Ti piace questa ben sto nella cattura Sono
catturando i miei dati affondano lì e se io
vuoi un altro algoritmo da collegare
là in qualche modo devo inserito in
al centro di questo mulinello e io
davvero tipo di pensare questo è il motivo per cui il mio
i codici non riutilizzabili è davvero difficile
riusare i loop perché semplicemente non li hai
non posso tagliare pezzi fuori dal giro cosa io
voleva sembrare è la somma
linea questa è un’assemblea della seconda guerra mondiale
linea per un aereo bombardiere e cosa
succede che le parti iniziano da una parte
e l’assemblea viene spostata lungo la linea
e ad ogni stazione succede qualcosa a
che succede qualcosa a qualcosa
succede ad esso e poi alla fine del
linea di assemblaggio rulli di aerei completati
alla fine e questo è estremamente
efficace per la produzione Perché si può
lavoro per software sai che non lo fanno
mandali in cerchio
Vorrei che il mio codice assomigliasse a questo
le mie argomentazioni entrano, ottengo la mia stringa
sistema fuori e vado dallo standard in I
voglio leggerlo con le linee che voglio fare
alcune partite e voglio scrivere a
avviso standard no loop
qualcuno ha mai visto un codice come questo prima
si dove assedio sei funzionale?
programmazione awk va bene quello che non posso
ti capisco shell okay
okay, quindi abbiamo rinunciato al design C
che ha successo ma limitato e
diamo un’occhiata a quale sarà il prossimo aspetto del design
come e quello era C ++ ooh
programmazione orientata agli oggetti C ++ era
originariamente progettato come C con classi
ed era per abilitare orientato agli oggetti
programmazione ma per qualche ragione non lo è mai
ha portato a una migliore programmazione dei componenti
in effetti alla fine si sono inventati
con i flussi di I / O ha iniziato a cercare a
un po ‘come l’ algoritmo di origine
sincronizzazione e lo ha fatto sovraccaricando il
operatore di parentesi angolare ma per alcuni
motivo incomprensibile non è mai andato
oltre a leggere e scrivere file e
solo tipo di seduto lì era solo gentile
di un sostituto per il modo di leggere di C.
e scrivendo file non è andato davvero
oltre a ciò e ovviamente ci sono molti
di librerie C ++ di successo ma loro
ha mostrato i soliti problemi come me
menzionato prima di loro non si sono collegati
l’uno con l’ altro
tutti hanno inventato la propria classe di corda
ognuno ha inventato la propria memoria
schema di assegnazione e nessuno di loro lo farebbe
Connettiti davvero tra loro e poi
è arrivato Alexander Stepanov che
inventato il STL e con quello lui
C ++ rivitalizzato da solo, come sai
i pedali e rivoluzionarlo con
lo standard di luce temperato standard
libreria di modelli che finalmente abbiamo
più che semplici file abbiamo algoritmi
abbiamo un’interfaccia comune e la migliore di
tutto ha compilato un codice altamente efficiente
quindi questo è stato un grande passo avanti per noi nativi
linguaggio di programmazione ragazzi non del tutto
anche lì
stiamo ancora programmando con
cappi, cappi, cappi, cappi, cappi, ricordi
volevamo che ne abbiamo alcuni
componenti ora ma stiamo ancora scrivendo
loop alla fine ne conosci qualcuno
i loop sono stati convertiti in chiamate STD
ognuno e trasforma ma si scopre
non sono reali componibili perché
gli iteratori sono una generalizzazione di a
puntatore okay il problema con un e tu
incrementa un puntatore per passare al successivo
pezzo di dati il problema con quello è
dov’è la fine dei tuoi dati, no?
sai che hai bisogno di un altro pezzo di
informazioni e ti dirò quando fermarti
iterando in modo che ciò che interferisce con
ha qualsiasi tipo di venire qualsiasi tipo di
composizione di iteratori e algoritmi
non possiamo comporli perché c’è
questo pezzo extra di dati che è necessario
adattarsi lì da qualche parte che ci dice
dove l’inizio della nostra iterazione è
e dove la fine di esso è come facciamo noi
sapere quando avremo finito così torniamo a
di nuovo il tavolo da disegno abbiamo bisogno di un nuovo
progettare quali sono esempi di fonti
naturalmente, i flussi che sono è un
vecchia interfaccia di file un’altra fonte di
i dati potrebbero essere contenitori contenitore potrebbe
essere un array potrebbe essere un hash tabella esso
potrebbe essere una banca dati potrebbe essere una borsa
potrebbe essere un insieme di tutti i tipi di voi conoscono la
le classiche strutture dati sono tutte fonti
di algoritmi di dati ovviamente da
programmazione funzionale c’è un filtro
mappa e riduci e poi c’è una specie
che è interessante che otterrò
nei lavandini successivi
di nuovo i lavandini possono scrivere su file che possono
scrivi ad altri contenitori o loro possono
produrre un singolo valore come output
come un checksum potrebbe essere un lavandino perché
accetta tutti i suoi dati e alla fine
produce un singolo valore un checksum così
ecco una lista di alcune fonti tipiche
algoritmi e sink non puoi ottenere tutto
di questi dall’interfaccia di streaming
perché gli algoritmi affondano i lavandini
sono più che semplici file quindi l’idea
dovrei essere in grado di selezionare la fonte
dall’algoritmo colonna uno dalla colonna
due un lavandino dalla colonna tre e it
dovrebbe funzionare non solo quello che dovrei essere
in grado di selezionare un numero qualsiasi di questi
gli algoritmi li attaccano uno dopo il
altro e dovrebbe funzionare così è
dove vogliamo arrivare con i nostri
programmazione dei componenti quindi qualcuno di voi
fatto con successo in Java e C ++
e C non l’ho visto bene quindi andiamo
riassumere i requisiti del per il
design che stavamo cercando, vogliamo
loro per fare uno schiocco insieme non vogliamo
avere impalcature che collegano tutti
i nostri piccoli pezzi e componenti o componenti
insieme vogliamo un forte incapsulamento
sostenere così le nostre astrazioni non lo sono
perdite o sanguinamento e ci sono
il codice circostante e l’ambiente circostante
il codice sta conducendo nella nostra astrazione noi
voglio generare qualità industriale
codice efficiente se non generiamo
qualita industriale industriale
codice che l’ utente non utilizzerà
i componenti che stanno per tornare indietro
a usare i loop e tu hai fallito, così siamo
cercando di non creare un sistema giocattolo o un
qualcosa che funziona solo in
tutorial e vogliamo farlo funzionare bene noi
vuoi una sintassi naturale da cui scaturire
da sinistra a destra che è il modo in cui leggiamo
nel modo in cui pensiamo a cose noi
naturalmente pensate non in loop ma in a
modo seriale da sinistra a destra andiamo questo
fai questo passo come questo
catena di montaggio e vogliamo che il nostro codice di
in realtà assomigliano al nostro modo di pensare
su di esso e l’ultima cosa è che vogliamo
di lavorare con tipi che non conosciamo
in anticipo perché nessuno vuole
riscrivi il loro giusto tipo per
personaggi e scrivere un altro tipo per
interi e un altro tipo per il tuo
tipo di dati dipendente I dovrebbe funzionare
genericamente quindi dovremmo chiamare
loro affondano le nostre fonti ma siamo finiti
chiamandoli ingresso varia la sorgente D
componente è chiamato un intervallo di input e
cosa stiamo pensando di ciò che è a
l’interfaccia più semplice possibile che possiamo avere
prima dobbiamo sapere che ci sono dati
disponibile c’è più dati così
vuote restituisce un booleano che ti dice
ci sono più dati che leggono la corrente
il dato di input è chiamato front in quale ordinamento
di significa la parte anteriore dei dati che è
entrare in E è il nostro tipo di dati e vogliamo
per avanzare ai dati successivi che noi
call pop front non restituisce alcun valore
quindi queste due sono proprietà questo è un
metodo ed è difficile immaginarlo
più semplice di quello sì
quindi la domanda è: perché non avere pop
front return bool e sorta di combine
due operazioni in una abbiamo avuto un enorme
argomento a riguardo e finalmente noi
ha deciso che era meglio perché si scopre
che alcuni intervalli di input sono difficili da ottenere
loro per combinare questi due in quello
scopre che è più flessibile se noi
separare le operazioni in tre
cose separate e se abbiamo cercato di
combinali bene così il signore lì
detto che sai cercando di determinare se
hai più dati in là non dovrebbe
cambia lo stato bene, sì, puoi farlo
questi altri modi, ma abbiamo deciso di farlo
in questo modo siamo stati in questi argomenti
prima potremmo passare tutto il giorno a discutere
sui meriti ma non penso
compri davvero qualcosa provando a farlo
combinare queste cose perché è davvero
è tre operazioni separate che si desidera
fare e così si potrebbe anche solo fare
loro tre operazioni separate vanno bene
quindi la domanda è: vuoi una finestra?
sui tuoi dati che contengono forse alcuni
quantità prevedibile di dati allo stesso
il tempo è qualcosa che penso di poter fare
indirizzo in una diapositiva futura quindi penso
è un’ottima domanda va bene ecco un
cosa importante un intervallo di input non è un
stretto è a dal terreno C ++ è a
i concetti concettuali funzionano effettivamente in D e
sono in realtà abbastanza semplici tutto il
il tipo deve fare è avere questi tre
primitivi quindi non ne deriviamo
un certo tipo di interfaccia è è una sorta di se
ha questi tre primitivi è un
intervallo di input ed è riconosciuto come un
ingresso gamma va bene ecco una semplice di
Certo , è un po ‘ un codice
ma legge caratteri dallo standard
e per carattere e possiamo iniziare con
fronte che restituisce la corrente
il personaggio pop davanti imposta una bandiera dicendo I
leggi il mio personaggio e ho bisogno di leggere
più e poi bool o assegni vuoti a
vedere se bene se abbiamo un buffer o
personaggio già nel buffer se noi
non ne prendiamo uno se non possiamo ottenerne uno
perché eravamo noi un file hittin noi
vuoti restituisce vero non più altrimenti
abbiamo il nostro piccolo buffer di caratteri
abbiamo impostato la bandiera dicendo che abbiamo dati in
il buffer e restituisce il significato falso
abbiamo più dati quindi questo è uno di
i più semplici intervalli di input input
quindi ci arriveremo dallo standard in
e scrivere per standard e cosa sarebbe
che sembrano bene dove costruiamo
un esempio di ciò che è ed è qui
la nostra gamma è nostra e la nostra condizione del ciclo è
sai se non siamo vuoti e il nostro ciclo
la continuazione è che otteniamo il prossimo e
qui stiamo leggendo il fronte e la scrittura
è fuori standard, quindi questo è il nostro
primo passo verso la costruzione del nostro componente
programmazione e ovviamente non lo siamo
c’è ancora
con un piccolo compilatore magico il per
il ciclo diventa un per ogni ciclo e il
il compilatore sa di fronte vuoto e pop
davanti e può costruire un ciclo per te se
usi 4 ore e quindi stiamo ricevendo il
personaggi uno per uno e sono
scrivendoli allo standard e an
cosa interessante è guardare monotipi esso
tipizzato staticamente ma in realtà non lo facciamo
devo dire quali sono i tipi
compilatore o il linguaggio calcola il
tipi per te, così è la cosa in streaming
e ricordo che ho detto prima che
lo streaming non era adeguato al file il
interfaccia diretta per lo streaming dei file
non è abbastanza buono per i componenti così noi
introdotto un intervallo di input più avanzato
ha chiamato una gamma avanzata e quello che fa
aggiunge una proprietà un altro metodo
un raggio più lungo in realtà uno in più
proprietà non metodo e questo è sicuro e
quello che fa è che salva e ritorna
una nuova gamma che è una copia della
posizione dell’intervallo precedente così ora
il nostro originale e la nostra copia possono attraversare
la gamma indipendentemente l’una dall’altra
e l’esempio canonico è un elenco a
lista collegata singolarmente sta risparmiando solo
significa che conosci e
un puntatore alla al nodo successivo nella
elenco e un algoritmo come un ordinamento di fusione
userebbe una gamma diretta bidirezionale
Gamma di una gamma che possiamo se iniziamo
ogni fine possiamo andare così con questo
okay possiamo muoverci verso il centro e
aggiunge due proprietà analoghe a
davanti e davanti pop si torna e pop
indietro che fanno le cose ovvie e il
esempio canonico del bidirezionale
gamma è la lista doppiamente collegata voi
non può accedere al centro di un doppio
elenco collegato direttamente ma puoi iniziare
alle estremità e dirigiti verso
le liste centrali e doppiamente collegate
non l’ unico esempio di tale utf-8 e
utf-16 sono per de bid bidirezionale e
codifiche
uno più interessante è anche il
intervallo casuale di accesso casuale della gamma di accesso
ciò che fa è sovraccaricare le parentesi
operatore in modo da poter indicizzare e una volta
indicizzalo ti serve un altro paio
cose per rendere il lavoro di indicizzazione è necessario
conoscere la lunghezza del tuo accesso casuale
variare in modo che non abbiate intenzione di spegnersi
la fine della gamma o hai bisogno di a
portata avanti che è infinita e come
sa che cosa è in ordine
infinito vuoto restituisce sempre false per
una gamma infinita in modo che chi può dare un
esempio di una gamma infinita e ferite
sono una gamma infinita che è giusta
questo è il probabilmente l’esempio più semplice
ma tu sai qualcosa come le cifre
di pi sarebbe una gamma infinita
anche se è difficile indice che esso
è una gamma infinita
ok, i lavandini sono davvero semplici
tutto quello che faccio è che ho un metodo put dove
puoi attaccare qualcosa in quello è
abbastanza facile eh okay, quindi scriviamo
noi stessi un intervallo di produzione ricorda tutto
abbiamo bisogno di quella dannata cosa put qui
la nostra gamma che abbiamo incapsulato come a
colpito chiamato STD fuori da cura e mettere
scrive il nostro personaggio o def come C e se
colpiamo la fine del file che lanciamo
eccezione dicendo che c’è qualcosa
è andato storto con STD fuori tutto carina
semplice quindi richiamare il nostro precedente
loop esempio e ora lo sostituiamo con
un intervallo di uscita e diventa semplicemente
ecco il nostro dichiariamo la nostra gamma di produzione
e qui inseriamo solo caratteri
e già è migliorato rispetto al nostro
esempio precedente perché notiamo che noi
non fare alcun errore controllando qui come
molti strumenti scrivono il codice C senza errori
controllando vieni tutti a scrivere il codice C
scrive senza controllo degli errori quanti
la gente sa che printf restituisce un errore
codice che dice se è riuscito o è fallito
quante persone controllano quel codice di errore
nessuno sì nessuno controlla l’errore
i codici nella C puoi e lo puoi dire
questo se si riempie il disco quasi
verso l’alto e poi scrivere eseguirne alcuni
conosci il codice C di Canonical che scrive
per standardizzare e lasciar correre e vedere
quello che succede fa un errore e basta
silenziosamente fallisce, ma comunque
incapsulandolo abbiamo effettivamente siamo
scoprirai sempre quei capelli
non devi farlo o brutto brutto Phi
il tuo codice è stato controllato per questo è solo
controlla gli errori per te
quindi quello che fa è ovviamente copiato
è standard e lo standard e noi
potremmo chiamarlo copiare il nostro primo algoritmo
quindi il nostro algoritmo è una copia e richiede
la nostra gamma di input e il nostro range di output
e lo copia così penso che stiamo facendo
buoni progressi abbiamo il nostro primo
algoritmo e le nostre due gamme il problema
è è inchiodato a quelli specifici
digita così se vogliamo usarlo
diversi tipi in cui siamo tornati
copypasta dobbiamo copiare questo e
quindi modificare i tipi fino a cambiarli così
non siamo ancora arrivati
quindi è così che scrivi modelli in D
chiamiamo la nostra gamma di fonti una fonte o
tipo generico sorgente di tipo generico sincronizzazione
e noi parametrizziamo in base a questi tipi
e c’è il nostro algoritmo ma ora lo abbiamo
ha avuto il problema opposto il nostro primo
l’iterazione era troppo specifica su cosa
digita contemporaneamente anche la nostra prossima iterazione
generale ci vuole qualsiasi tipo in te
potrebbe passargli un int okay cosa sta per succedere
capita se si passa un tipo int come il tuo
fonte che le anime coraggiose mi dicono tutto ok
Programmatori di template C ++ ecco cosa
succede se hai passato il tipo sbagliato
a un modello ottieni un errore orribile
messaggio perché quello che succede è che muore
a volte da qualche parte nel profondo del tuo
implementazione dell’algoritmo e tu
finire con un messaggio di errore che
sembra non avere assolutamente nulla da fare
con quello che stai facendo peggio potrebbe
in realtà compila e sembra funzionare ma
ma non funziona
quindi quello che vogliamo fare è aggiungere dei vincoli
i vincoli sono queste idee di
implementare un concetto così qui sono a
i nostri due parametri di tipo di modello e noi
può questo è chiamato ace constraint e noi
andare se questo è un intervallo di input e il
sync è un intervallo di output e ha un
tipo di elemento che corrisponde all’elemento
tipo del nostro intervallo di input quindi il
il modello verrà istanziato e noi
lo accetterò quindi questo è un po ‘ come
rende gli intervalli di input e gli intervalli di output
concetti piuttosto che ereditarietà
quindi non stiamo dicendo che stiamo ereditando
da un tipo particolare quello che stiamo facendo
stiamo testando per vedere se il tipo ha
alcune proprietà e questo è ciò che questi
i tipi di libreria e come funzionano
in realtà una presentazione tutta nuova ma
questo non è rilevante qui al punto è
funzionano così la ragione per cui abbiamo il
sincronizzazione qui la sincronizzazione di C ++ STL restituisce il
intervallo di input come argomento ma non lo è
componibile perché hai ancora bisogno del
fine dei tuoi dati questo in realtà
restituire l’intervallo di input lo rende
componibile perché ora possiamo copiarne uno
nel prossimo quindi uno stato e un passo correnti
per passo stiamo cercando di incontrare i nostri
requisiti come abbiamo dichiarato
gamma di sorgenti la nostra gamma di sincronizzazione e lo facciamo
Copia e non siamo ancora arrivati siamo
avvicinandosi sta iniziando a sembrare
quello che vogliamo vogliamo aggiungere uniforme
funzione sintassi di chiamata di cosa si tratta
Nient’altro che prendi il primo
argomento e lo mettete di fronte
di questo è esattamente come membro
funzioni funzionano c’è un nascosto
parametro che è il primo parametro
chiamato il puntatore di dis o riferimento personale
o qualcosa del genere
e di solito puoi incollarlo sul
avanti bene questa idea UFC ha generalizzato
così funziona anche per altre funzioni
puoi estrarre il primo parametro e
attaccalo sul davanti è puramente
zucchero sintattico e cosa ti consente
da fare è scrivere in questo modo abbiamo
copia sink fonte
quindi anche se non sta usando il
le frecce almeno vanno da sinistra a destra
questo è quello che vogliamo assomigliare a posto
andiamo un po ‘di più su
algoritmi rispetto a oh boy, penso
stiamo andando in ritardo, quindi lo farò
Accelerare filtri okay tutti lo sanno
quali filtri sono funzionali
i filtri di programmazione leggono il loro input e
fare una selezione basata su un lambda e
quelli che passano la selezione vanno
attraverso così qui abbiamo una matrice noi
seleziona quelli meno di tre e
stampale che è una e due mappe
le mappe trasformano il suo input da uno a
avanti così uno due tre quattro cinque noi
li ho squadrati con tempi a e questo
piccolo programma stampa questo riduttore
produrre un singolo valore in questo caso noi
voglio riassumerli tutti così un plus B il
risultato di uno più due più tre più
quattro più cinque sono quindici quindi mettiamoci
questi cattivi ragazzi insieme e vedere cosa
sembra che quello che vogliamo fare è questo
piccolo programma legge dallo standard in noi
vogliamo mantenere i nostri terminatori di linea
così vogliamo leggere il nostro standard in
per linea e poi vogliamo mapparlo noi
voglio perché legge dallo standard in
utilizza un buffer e mantiene il suo riutilizzo
Buffer abbiamo bisogno di fare copie del
dati perché byline sta per reindirizzare
usa questo buffer così quest’uomo
ne fa solo una copia e la sua uscita
è alimentato in array che lo trasforma in un
array assembla tutte quelle linee in
una serie di loro poi li ordiniamo usando
quicksort e poi prendiamo il risultato
e lo copiamo con lo standard usando
blocco testo scrittore quale testo di blocco
lo scrittore fa è perché scrive a
lo standard out può essere fatto da qualsiasi thread
devi bloccare lo standard mentre tu
scrivici sopra altrimenti ottieni l’output
da tutti i tuoi fili tutti interfogliati
e modi imprevedibili quindi è quello che questo
fa le caratteristiche linguistiche di D che sono
necessario per far funzionare tutto questo
bisogno di gestione delle eccezioni per errori no
codici di errore non so davvero come
questo funzionerebbe come questo sembrerebbe
codici di errore perché sicuramente lo sarei
credo che sarebbe rivelarsi piuttosto
brutto hai bisogno di funzioni generiche di cui hai bisogno
vincoli di modello per implementare il
idea di concetto abbiamo bisogno di una funzione uniforme
chiama la sintassi per farlo sembrare
hai lasciato da sinistra a destra localmente
desiderio ho già parlato di loro essere
non concetti tipi di linguaggio ha bisogno di
supporto all’integrazione della personalizzazione e
ottimizzazione e tutto questo è necessario
per avere alte prestazioni
specializzazione dei risultati che puoi scrivere
versioni specializzate dei tuoi algoritmi
e il compilatore ne sceglierà uno
corrisponde ai tuoi tipi di dati, quindi se ne hai
tipi specializzati per vari diversi
tipi di dati questo funzionerà con quello
tipo di detrazione se non si notano tipi
compaiono ovunque nel compilatore
deduce i tipi in questo caso è carino
molto li deduce tutti perché sa
quello standard e restituisce i caratteri così
questo influenza tutto il resto
seguendo come trattare con i personaggi
entrare e tuple anche se non l’ho fatto
avere un esempio
algoritmi e filtri e roba possibile
in realtà Moulton fare più cose a
nello stesso tempo su un singolo passaggio sopra il
dati e quindi restituire un risultato come una tupla
quindi è bello avere delle tuple in
linguaggio per farlo
componenti di conclusione giuste sono un modo per
rendere il codice riutilizzabile cercando di farli
lavoro è una combinazione di convenzioni
e il supporto linguistico per loro molto
funzionalità avanzate di D si uniscono a
far funzionare i componenti che non conosco
un’altra lingua con questa combinazione
di caratteristiche quindi se avete voglia di
far funzionare i componenti li dentro non li faccio
pensare è andare a lavorare come bene e
si basa sul successo dei precedenti
modelli di componenti che sono file e
filtra i flussi e lo standard
libreria di modelli quindi ce ne sono altri due
modelli componenti in largo uso uno è il
idea di programmazione funzionale e il
il linguaggio di programmazione funzionale è
tipicamente come collegano il
fonti algoritmo i lavandini che ha
Idee che usano elenchi che hanno ragione loro
collegare ciò che fanno è che ce l’hanno
tutto è rappresentato come una lista e
è così che tutto si connette come
una lista e il problema arriva quando tu
avere algoritmi che non lo fanno davvero
si comportano molto bene su una lista come a
quicksort quindi un design dei componenti migliore
è quello che abilita il componente
costruttore per scrivere una struttura dati che
più appropriatamente corrisponde ai suoi dati di
sto solo cercando di forzare tutto dentro
essendo una lista l’altro modello di componente
in largo uso utilizza funzioni virtuali
sai come la programmazione della comunicazione e
cose del genere
e questo ha due gravi inconvenienti uno
è ogni iterazione attraverso di essa sei
chiamando funzioni virtuali che su
le moderne architetture sono lente ora lo è
possibile con un sufficientemente intelligente
ottimizzatore puoi foldare tutti quelli
funzioni virtuali o D virtualizzate e
li inline ma non molte lingue sono
sufficientemente intelligente per farlo e il
altra difficoltà con loro è la tua tendenza
non avere il controllo sui tuoi dati
layout e se stai scrivendo
codice ad alte prestazioni e oggi
processori che devono ottimizzare per
linee di memoria cache e cose del genere
vuoi davvero controllare da vicino come
i tuoi dati sono disposti e l’interfaccia
disegna generalmente i più grandi
si preclude dal farlo così
domande si signore oh vedo cosa è il
uscita del filtro allora l’uscita
il filtro è un altro intervallo di input ah
questo è un ottimo domanda al
ottima domanda è si sa che questo è un
gamma che esce ottieni un risultato
fuori dal filtro fino a quando non viene letto tutto
l’input o lo ottieni element by
elemento va bene e vorrei caratterizzare
questo è pigro o è desideroso e il
la risposta è che puoi farlo tu
in entrambi i casi quindi una delle cose belle
sulla programmazione dei componenti e B è I
può sostituire un algoritmo desideroso con a
pigro e viceversa tutto senza solo
cambiando il nome del componente I
collegare lì, infatti, ho spesso fatto
quella mia prima iterazione di un componente
in realtà di solito è desideroso perché lo è
più facile scrivere uno desideroso e più tardi
se trovo che lo sto usando molto, lo farò
migliorarlo rendendolo pigro e
una cosa interessante di quelli pigri è
quelli pigri aprono la possibilità di
fare le cose in parallelo, quindi anche se
quello non ha
fatto ancora con questa roba l’opportunità
è lì per paralizzare davvero le cose
riguarda la programmazione dei componenti nel D
linguaggio di programmazione va bene a tutti dentro
chi è un programmatore di software professionale
parla di software riutilizzabile è un
assioma è scontato che tutti compriamo
in esso cerchiamo tutti di scrivere riutilizzabili
software bene che da queste parti cerca di
rendere i loro software riutilizzabili tutti
chi cerca di non fare il proprio software
ok ragionevole quindi ce ne sono alcuni così
voi ragazzi potete andarvene, ora si, va bene
c’è una specie di brutta realtà per
sto scrivendo software riutilizzabile
programmazione per 35 anni e I
ho scoperto qualcosa di terribile sul mio
codice come non lo riuso mai quasi mai
riutilizzalo
Credo nel software riutilizzabile, ma lo sono
sempre scrivendolo di nuovo copypasta
non funziona non conta
va bene copiarlo e modificarlo
questo non è un software riutilizzabile, quindi come
molti di voi hanno avuto questa esperienza
ripassa il tuo codice e basta
non è riutilizzabile nonostante i tuoi migliori sforzi
okay qualcosa è andato orribilmente
orribilmente sbagliato ok non è per mancanza di
provando ogni volta che faccio qualcosa che provo
per renderlo riutilizzabile perché sai che sono
un credente non è perché sono un migliore
programmatore di quanto lo fossi, quindi odio
quello che ho scritto prima e voglio
riscriverlo è solo per qualche motivo
non funziona e ho bisogno di guardare
più profondo per quello che diamine sta andando male
con il mio software perché non è riutilizzabile
okay, quindi lo guardo e tu ne conosci qualcuno
le cose sul mio codice mi turbano
le mie astrazioni sono sempre perfette
sembra che non ci siano limiti duri
i bordi e sembra sempre scorrere
fuori nel codice circostante e il
puzza dei tempi del codice circostante a
fluisco nella mia astrazione e alla fine
risultato è che posso riutilizzarlo
a volte anche i miei componenti lo sono
specifici funzionano per un tipo particolare
ma non per nessun altro tipo e così quando io
voglio riutilizzarli è tutto sbagliato
è per i tipi sbagliati, quindi ad alcuni
punto penso che ho bisogno di tornare al primo
principi sai quando le cose non lo sono
lavorando e non riesci a capire perché
a volte è il momento di fare il backup e iniziare
di nuovo ok, iniziamo con quello che è
un componente qualcuno vuole dire che a
componente è qualcuno coraggioso se si google
software componente che trovi un enorme
quantità di letteratura sull’argomento
di certo non potrei andare oltre
una breve presentazione come questa, quindi facciamolo
parla un po ‘ di quello che penso
come componente c’è molto, molto
codice riutilizzabile là fuori intendo C
librerie Librerie Java Librerie C ++
e sono riutilizzabili e funzionano ma
Non li chiamerei davvero componenti
okay direi che un componente
segue una determinata interfaccia predefinita
che è conforme e deve essere costruito così
che i componenti possono essere sostituiti uno
componente può essere estratto un altro
il componente può essere tirato nell’unico modo
funzionerà se le interfacce sono
aderito al problema con la maggior parte
librerie in particolare come le librerie C
Librerie C ++ in cui ogni libreria vive
suo
mondo inventano la propria API hanno
inventano le loro interfacce su cui stanno lavorando
tipi per esempio con C ++ per anni e
anni e anni fino a quando la STL ha preso piede
ognuno ha fatto il proprio tipo di stringa chi
sa di cosa sto parlando , sei tu
conosci la prima cosa che la gente ha fatto con il C ++
è stato creato il proprio tipo di stringa e
la loro biblioteca dipendeva da sola
tipo di stringa che significa nessuno dei
le librerie interagirebbero con ciascuna
altro senza qualche complicato
scaffolding per tradurre un tipo di stringa
al prossimo tipo di stringa del termine non lo è
componente software
quindi cosa fa un programma tipico o di base
Direi che lo legge
elabora l’input quindi scrive il
l’output non è d’accordo con nessuno
ricorda la maggior parte dei tuoi programmi in questo modo
leggono il loro input ne fanno alcuni
elaborazione scrivono così il loro output
anche se il tuo programma è interattivo
programma come un’applicazione GUI che non lo fa
seguire davvero quel modello ma lo sarà
sottosistemi in esso che lo fanno a
un mucchio di dati elaborati produce a
risultato una sorta di elaborazione batch Let’s
scrivilo in qualche pseudocodice abbiamo il
la fonte dei dati va a un algoritmo
va in un mare di dati e noi vogliamo essere
in grado di comporre i nostri componenti in modo sorgente
applica un algoritmo per il suo feed di output
nel prossimo algoritmo e il
risultato chiamiamo il nostro sink che è dove
va bene ovunque abbiamo visto prima
ovviamente risponde ovvio che è l’UNIX
file e i filtri da riga di comando
interfaccia a chi è familiare
file e filtri quasi tutti
in un modello di incredibile successo di
software snap-together Penso che sia il
motivo per cui UNIX è persistito per questo
lungo è entrato nella C
ecosistema o la visione C delle cose come il
i file di interfaccia file sono le fonti e
i sink affronta il ruolo degli algoritmi
di essere i tubi dei filtri li connettono
ed è così pervasivo e di successo
quella gente perfino
inventare pseudo filesystem per
lavora con quel software e qui c’è a
link a un esempio di pseudo file
sistemi per Linux quindi ci sono cose che
non ha mai colpito un file, ma ancora hanno un
l’interfaccia di file per loro bene non lo è
perfetto non ci raggiunge davvero
per una ragione si è evoluto era una specie di
scoperto e evoluto nel tempo e come
prova di essersi evoluto controlla il
Interfaccia di controllo AYGO che è quando
qualcosa non ha funzionato a destra perfettamente ragione
con loro la gente lo butterebbe in alcuni
Cluj nel controllo I / O e posso controllare Oh
come infame per essere un gigantesco Cluj
è solo una specie di borsa da viaggio okay
un altro problema con l’ interfaccia del file
i tuoi dati sono visti come un flusso di
byte non si può andare avanti in esso bene
puoi andare avanti mentre lo leggi ma
non puoi andare indietro che non hai
accesso casuale ad esso ed è un flusso di
byte non è un flusso strutturato
dati o altre forme di dati ma tu
sapere e che un flusso non è sempre il
migliore la migliore fonte di input per un
algoritmo per un esempio di un algoritmo
potrebbe essere necessario un array e un flusso non è un
array ma mostra quale componente
l’interfaccia può essere e quale componente
interfaccia può fornire per voi per
esempio con i file e filtri il
idea in Linux è la serie di
cose come grep e sort e top e
allora funzionano tutti come filtri e
chiunque scriva quei filtri no
parlare con chiunque altro che scrive filtri
ma sono tutti conformi all’interfaccia
così possono essere tutti
agganciare e collegare insieme
qualsiasi ordine separato con la verticale
barre o il simbolo della tuta, quindi andiamo
indietro e guarda una specie di canonico
esempio del codice tipico che scrivo
sembra che il suo input arrivi qui
stiamo leggendo un modello dal
argomenti mentre non siamo alla fine di
il file leggiamo una riga se corrisponde
il nostro modello scriviamo una riga okay chi
scrive codice come questo, fa loops loop loop
loop loop è questo che codificherò è
profondamente radicato nel mio cervello quando penso
di scrivere codice che penso sempre in termini
di loop come quello e Jude non guarda
davvero molto simile alla fonte che sta per
l’algoritmo sta per affondare in effetti sembra
come tipo di venire lentamente al
la consapevolezza che sembra così
sembra un vortice o un turbinio tuo
i dati arrivano nella parte superiore e inizia
andando in giro e intorno e intorno e
round and round e alla fine si ordina
di esce al centro o nel mezzo
quindi come si incapsula questa roba
disegnate un quadrato lì e dite bene che lo sono
andando a incapsulare quella parte del
sai che non funziona se disegno il
Square Ti piace questa ben sto nella cattura Sono
catturando i miei dati affondano lì e se io
vuoi un altro algoritmo da collegare
là in qualche modo devo inserito in
al centro di questo mulinello e io
davvero tipo di pensare questo è il motivo per cui il mio
i codici non riutilizzabili è davvero difficile
riusare i loop perché semplicemente non li hai
non posso tagliare pezzi fuori dal giro cosa io
voleva sembrare è la somma
linea questa è un’assemblea della seconda guerra mondiale
linea per un aereo bombardiere e cosa
succede che le parti iniziano da una parte
e l’assemblea viene spostata lungo la linea
e ad ogni stazione succede qualcosa a
che succede qualcosa a qualcosa
succede ad esso e poi alla fine del
linea di assemblaggio rulli di aerei completati
alla fine e questo è estremamente
efficace per la produzione Perché si può
lavoro per software sai che non lo fanno
mandali in cerchio
Vorrei che il mio codice assomigliasse a questo
le mie argomentazioni entrano, ottengo la mia stringa
sistema fuori e vado dallo standard in I
voglio leggerlo con le linee che voglio fare
alcune partite e voglio scrivere a
avviso standard no loop
qualcuno ha mai visto un codice come questo prima
si dove assedio sei funzionale?
programmazione awk va bene quello che non posso
ti capisco shell okay
okay, quindi abbiamo rinunciato al design C
che ha successo ma limitato e
diamo un’occhiata a quale sarà il prossimo aspetto del design
come e quello era C ++ ooh
programmazione orientata agli oggetti C ++ era
originariamente progettato come C con classi
ed era per abilitare orientato agli oggetti
programmazione ma per qualche ragione non lo è mai
ha portato a una migliore programmazione dei componenti
in effetti alla fine si sono inventati
con i flussi di I / O ha iniziato a cercare a
un po ‘come l’ algoritmo di origine
sincronizzazione e lo ha fatto sovraccaricando il
operatore di parentesi angolare ma per alcuni
motivo incomprensibile non è mai andato
oltre a leggere e scrivere file e
solo tipo di seduto lì era solo gentile
di un sostituto per il modo di leggere di C.
e scrivendo file non è andato davvero
oltre a ciò e ovviamente ci sono molti
di librerie C ++ di successo ma loro
ha mostrato i soliti problemi come me
menzionato prima di loro non si sono collegati
l’uno con l’ altro
tutti hanno inventato la propria classe di corda
ognuno ha inventato la propria memoria
schema di assegnazione e nessuno di loro lo farebbe
Connettiti davvero tra loro e poi
è arrivato Alexander Stepanov che
inventato il STL e con quello lui
C ++ rivitalizzato da solo, come sai
i pedali e rivoluzionarlo con
lo standard di luce temperato standard
libreria di modelli che finalmente abbiamo
più che semplici file abbiamo algoritmi
abbiamo un’interfaccia comune e la migliore di
tutto ha compilato un codice altamente efficiente
quindi questo è stato un grande passo avanti per noi nativi
linguaggio di programmazione ragazzi non del tutto
anche lì
stiamo ancora programmando con
cappi, cappi, cappi, cappi, cappi, ricordi
volevamo che ne abbiamo alcuni
componenti ora ma stiamo ancora scrivendo
loop alla fine ne conosci qualcuno
i loop sono stati convertiti in chiamate STD
ognuno e trasforma ma si scopre
non sono reali componibili perché
gli iteratori sono una generalizzazione di a
puntatore okay il problema con un e tu
incrementa un puntatore per passare al successivo
pezzo di dati il problema con quello è
dov’è la fine dei tuoi dati, no?
sai che hai bisogno di un altro pezzo di
informazioni e ti dirò quando fermarti
iterando in modo che ciò che interferisce con
ha qualsiasi tipo di venire qualsiasi tipo di
composizione di iteratori e algoritmi
non possiamo comporli perché c’è
questo pezzo extra di dati che è necessario
adattarsi lì da qualche parte che ci dice
dove l’inizio della nostra iterazione è
e dove la fine di esso è come facciamo noi
sapere quando avremo finito così torniamo a
di nuovo il tavolo da disegno abbiamo bisogno di un nuovo
progettare quali sono esempi di fonti
naturalmente, i flussi che sono è un
vecchia interfaccia di file un’altra fonte di
i dati potrebbero essere contenitori contenitore potrebbe
essere un array potrebbe essere un hash tabella esso
potrebbe essere una banca dati potrebbe essere una borsa
potrebbe essere un insieme di tutti i tipi di voi conoscono la
le classiche strutture dati sono tutte fonti
di algoritmi di dati ovviamente da
programmazione funzionale c’è un filtro
mappa e riduci e poi c’è una specie
che è interessante che otterrò
nei lavandini successivi
di nuovo i lavandini possono scrivere su file che possono
scrivi ad altri contenitori o loro possono
produrre un singolo valore come output
come un checksum potrebbe essere un lavandino perché
accetta tutti i suoi dati e alla fine
produce un singolo valore un checksum così
ecco una lista di alcune fonti tipiche
algoritmi e sink non puoi ottenere tutto
di questi dall’interfaccia di streaming
perché gli algoritmi affondano i lavandini
sono più che semplici file quindi l’idea
dovrei essere in grado di selezionare la fonte
dall’algoritmo colonna uno dalla colonna
due un lavandino dalla colonna tre e it
dovrebbe funzionare non solo quello che dovrei essere
in grado di selezionare un numero qualsiasi di questi
gli algoritmi li attaccano uno dopo il
altro e dovrebbe funzionare così è
dove vogliamo arrivare con i nostri
programmazione dei componenti quindi qualcuno di voi
fatto con successo in Java e C ++
e C non l’ho visto bene quindi andiamo
riassumere i requisiti del per il
design che stavamo cercando, vogliamo
loro per fare uno schiocco insieme non vogliamo
avere impalcature che collegano tutti
i nostri piccoli pezzi e componenti o componenti
insieme vogliamo un forte incapsulamento
sostenere così le nostre astrazioni non lo sono
perdite o sanguinamento e ci sono
il codice circostante e l’ambiente circostante
il codice sta conducendo nella nostra astrazione noi
voglio generare qualità industriale
codice efficiente se non generiamo
qualita industriale industriale
codice che l’ utente non utilizzerà
i componenti che stanno per tornare indietro
a usare i loop e tu hai fallito, così siamo
cercando di non creare un sistema giocattolo o un
qualcosa che funziona solo in
tutorial e vogliamo farlo funzionare bene noi
vuoi una sintassi naturale da cui scaturire
da sinistra a destra che è il modo in cui leggiamo
nel modo in cui pensiamo a cose noi
naturalmente pensate non in loop ma in a
modo seriale da sinistra a destra andiamo questo
fai questo passo come questo
catena di montaggio e vogliamo che il nostro codice di
in realtà assomigliano al nostro modo di pensare
su di esso e l’ultima cosa è che vogliamo
di lavorare con tipi che non conosciamo
in anticipo perché nessuno vuole
riscrivi il loro giusto tipo per
personaggi e scrivere un altro tipo per
interi e un altro tipo per il tuo
tipo di dati dipendente I dovrebbe funzionare
genericamente quindi dovremmo chiamare
loro affondano le nostre fonti ma siamo finiti
chiamandoli ingresso varia la sorgente D
componente è chiamato un intervallo di input e
cosa stiamo pensando di ciò che è a
l’interfaccia più semplice possibile che possiamo avere
prima dobbiamo sapere che ci sono dati
disponibile c’è più dati così
vuote restituisce un booleano che ti dice
ci sono più dati che leggono la corrente
il dato di input è chiamato front in quale ordinamento
di significa la parte anteriore dei dati che è
entrare in E è il nostro tipo di dati e vogliamo
per avanzare ai dati successivi che noi
call pop front non restituisce alcun valore
quindi queste due sono proprietà questo è un
metodo ed è difficile immaginarlo
più semplice di quello sì
quindi la domanda è: perché non avere pop
front return bool e sorta di combine
due operazioni in una abbiamo avuto un enorme
argomento a riguardo e finalmente noi
ha deciso che era meglio perché si scopre
che alcuni intervalli di input sono difficili da ottenere
loro per combinare questi due in quello
scopre che è più flessibile se noi
separare le operazioni in tre
cose separate e se abbiamo cercato di
combinali bene così il signore lì
detto che sai cercando di determinare se
hai più dati in là non dovrebbe
cambia lo stato bene, sì, puoi farlo
questi altri modi, ma abbiamo deciso di farlo
in questo modo siamo stati in questi argomenti
prima potremmo passare tutto il giorno a discutere
sui meriti ma non penso
compri davvero qualcosa provando a farlo
combinare queste cose perché è davvero
è tre operazioni separate che si desidera
fare e così si potrebbe anche solo fare
loro tre operazioni separate vanno bene
quindi la domanda è: vuoi una finestra?
sui tuoi dati che contengono forse alcuni
quantità prevedibile di dati allo stesso
il tempo è qualcosa che penso di poter fare
indirizzo in una diapositiva futura quindi penso
è un’ottima domanda va bene ecco un
cosa importante un intervallo di input non è un
stretto è a dal terreno C ++ è a
i concetti concettuali funzionano effettivamente in D e
sono in realtà abbastanza semplici tutto il
il tipo deve fare è avere questi tre
primitivi quindi non ne deriviamo
un certo tipo di interfaccia è è una sorta di se
ha questi tre primitivi è un
intervallo di input ed è riconosciuto come un
ingresso gamma va bene ecco una semplice di
Certo , è un po ‘ un codice
ma legge caratteri dallo standard
e per carattere e possiamo iniziare con
fronte che restituisce la corrente
il personaggio pop davanti imposta una bandiera dicendo I
leggi il mio personaggio e ho bisogno di leggere
più e poi bool o assegni vuoti a
vedere se bene se abbiamo un buffer o
personaggio già nel buffer se noi
non ne prendiamo uno se non possiamo ottenerne uno
perché eravamo noi un file hittin noi
vuoti restituisce vero non più altrimenti
abbiamo il nostro piccolo buffer di caratteri
abbiamo impostato la bandiera dicendo che abbiamo dati in
il buffer e restituisce il significato falso
abbiamo più dati quindi questo è uno di
i più semplici intervalli di input input
quindi ci arriveremo dallo standard in
e scrivere per standard e cosa sarebbe
che sembrano bene dove costruiamo
un esempio di ciò che è ed è qui
la nostra gamma è nostra e la nostra condizione del ciclo è
sai se non siamo vuoti e il nostro ciclo
la continuazione è che otteniamo il prossimo e
qui stiamo leggendo il fronte e la scrittura
è fuori standard, quindi questo è il nostro
primo passo verso la costruzione del nostro componente
programmazione e ovviamente non lo siamo
c’è ancora
con un piccolo compilatore magico il per
il ciclo diventa un per ogni ciclo e il
il compilatore sa di fronte vuoto e pop
davanti e può costruire un ciclo per te se
usi 4 ore e quindi stiamo ricevendo il
personaggi uno per uno e sono
scrivendoli allo standard e an
cosa interessante è guardare monotipi esso
tipizzato staticamente ma in realtà non lo facciamo
devo dire quali sono i tipi
compilatore o il linguaggio calcola il
tipi per te, così è la cosa in streaming
e ricordo che ho detto prima che
lo streaming non era adeguato al file il
interfaccia diretta per lo streaming dei file
non è abbastanza buono per i componenti così noi
introdotto un intervallo di input più avanzato
ha chiamato una gamma avanzata e quello che fa
aggiunge una proprietà un altro metodo
un raggio più lungo in realtà uno in più
proprietà non metodo e questo è sicuro e
quello che fa è che salva e ritorna
una nuova gamma che è una copia della
posizione dell’intervallo precedente così ora
il nostro originale e la nostra copia possono attraversare
la gamma indipendentemente l’una dall’altra
e l’esempio canonico è un elenco a
lista collegata singolarmente sta risparmiando solo
significa che conosci e
un puntatore alla al nodo successivo nella
elenco e un algoritmo come un ordinamento di fusione
userebbe una gamma diretta bidirezionale
Gamma di una gamma che possiamo se iniziamo
ogni fine possiamo andare così con questo
okay possiamo muoverci verso il centro e
aggiunge due proprietà analoghe a
davanti e davanti pop si torna e pop
indietro che fanno le cose ovvie e il
esempio canonico del bidirezionale
gamma è la lista doppiamente collegata voi
non può accedere al centro di un doppio
elenco collegato direttamente ma puoi iniziare
alle estremità e dirigiti verso
le liste centrali e doppiamente collegate
non l’ unico esempio di tale utf-8 e
utf-16 sono per de bid bidirezionale e
codifiche
uno più interessante è anche il
intervallo casuale di accesso casuale della gamma di accesso
ciò che fa è sovraccaricare le parentesi
operatore in modo da poter indicizzare e una volta
indicizzalo ti serve un altro paio
cose per rendere il lavoro di indicizzazione è necessario
conoscere la lunghezza del tuo accesso casuale
variare in modo che non abbiate intenzione di spegnersi
la fine della gamma o hai bisogno di a
portata avanti che è infinita e come
sa che cosa è in ordine
infinito vuoto restituisce sempre false per
una gamma infinita in modo che chi può dare un
esempio di una gamma infinita e ferite
sono una gamma infinita che è giusta
questo è il probabilmente l’esempio più semplice
ma tu sai qualcosa come le cifre
di pi sarebbe una gamma infinita
anche se è difficile indice che esso
è una gamma infinita
ok, i lavandini sono davvero semplici
tutto quello che faccio è che ho un metodo put dove
puoi attaccare qualcosa in quello è
abbastanza facile eh okay, quindi scriviamo
noi stessi un intervallo di produzione ricorda tutto
abbiamo bisogno di quella dannata cosa put qui
la nostra gamma che abbiamo incapsulato come a
colpito chiamato STD fuori da cura e mettere
scrive il nostro personaggio o def come C e se
colpiamo la fine del file che lanciamo
eccezione dicendo che c’è qualcosa
è andato storto con STD fuori tutto carina
semplice quindi richiamare il nostro precedente
loop esempio e ora lo sostituiamo con
un intervallo di uscita e diventa semplicemente
ecco il nostro dichiariamo la nostra gamma di produzione
e qui inseriamo solo caratteri
e già è migliorato rispetto al nostro
esempio precedente perché notiamo che noi
non fare alcun errore controllando qui come
molti strumenti scrivono il codice C senza errori
controllando vieni tutti a scrivere il codice C
scrive senza controllo degli errori quanti
la gente sa che printf restituisce un errore
codice che dice se è riuscito o è fallito
quante persone controllano quel codice di errore
nessuno sì nessuno controlla l’errore
i codici nella C puoi e lo puoi dire
questo se si riempie il disco quasi
verso l’alto e poi scrivere eseguirne alcuni
conosci il codice C di Canonical che scrive
per standardizzare e lasciar correre e vedere
quello che succede fa un errore e basta
silenziosamente fallisce, ma comunque
incapsulandolo abbiamo effettivamente siamo
scoprirai sempre quei capelli
non devi farlo o brutto brutto Phi
il tuo codice è stato controllato per questo è solo
controlla gli errori per te
quindi quello che fa è ovviamente copiato
è standard e lo standard e noi
potremmo chiamarlo copiare il nostro primo algoritmo
quindi il nostro algoritmo è una copia e richiede
la nostra gamma di input e il nostro range di output
e lo copia così penso che stiamo facendo
buoni progressi abbiamo il nostro primo
algoritmo e le nostre due gamme il problema
è è inchiodato a quelli specifici
digita così se vogliamo usarlo
diversi tipi in cui siamo tornati
copypasta dobbiamo copiare questo e
quindi modificare i tipi fino a cambiarli così
non siamo ancora arrivati
quindi è così che scrivi modelli in D
chiamiamo la nostra gamma di fonti una fonte o
tipo generico sorgente di tipo generico sincronizzazione
e noi parametrizziamo in base a questi tipi
e c’è il nostro algoritmo ma ora lo abbiamo
ha avuto il problema opposto il nostro primo
l’iterazione era troppo specifica su cosa
digita contemporaneamente anche la nostra prossima iterazione
generale ci vuole qualsiasi tipo in te
potrebbe passargli un int okay cosa sta per succedere
capita se si passa un tipo int come il tuo
fonte che le anime coraggiose mi dicono tutto ok
Programmatori di template C ++ ecco cosa
succede se hai passato il tipo sbagliato
a un modello ottieni un errore orribile
messaggio perché quello che succede è che muore
a volte da qualche parte nel profondo del tuo
implementazione dell’algoritmo e tu
finire con un messaggio di errore che
sembra non avere assolutamente nulla da fare
con quello che stai facendo peggio potrebbe
in realtà compila e sembra funzionare ma
ma non funziona
quindi quello che vogliamo fare è aggiungere dei vincoli
i vincoli sono queste idee di
implementare un concetto così qui sono a
i nostri due parametri di tipo di modello e noi
può questo è chiamato ace constraint e noi
andare se questo è un intervallo di input e il
sync è un intervallo di output e ha un
tipo di elemento che corrisponde all’elemento
tipo del nostro intervallo di input quindi il
il modello verrà istanziato e noi
lo accetterò quindi questo è un po ‘ come
rende gli intervalli di input e gli intervalli di output
concetti piuttosto che ereditarietà
quindi non stiamo dicendo che stiamo ereditando
da un tipo particolare quello che stiamo facendo
stiamo testando per vedere se il tipo ha
alcune proprietà e questo è ciò che questi
i tipi di libreria e come funzionano
in realtà una presentazione tutta nuova ma
questo non è rilevante qui al punto è
funzionano così la ragione per cui abbiamo il
sincronizzazione qui la sincronizzazione di C ++ STL restituisce il
intervallo di input come argomento ma non lo è
componibile perché hai ancora bisogno del
fine dei tuoi dati questo in realtà
restituire l’intervallo di input lo rende
componibile perché ora possiamo copiarne uno
nel prossimo quindi uno stato e un passo correnti
per passo stiamo cercando di incontrare i nostri
requisiti come abbiamo dichiarato
gamma di sorgenti la nostra gamma di sincronizzazione e lo facciamo
Copia e non siamo ancora arrivati siamo
avvicinandosi sta iniziando a sembrare
quello che vogliamo vogliamo aggiungere uniforme
funzione sintassi di chiamata di cosa si tratta
Nient’altro che prendi il primo
argomento e lo mettete di fronte
di questo è esattamente come membro
funzioni funzionano c’è un nascosto
parametro che è il primo parametro
chiamato il puntatore di dis o riferimento personale
o qualcosa del genere
e di solito puoi incollarlo sul
avanti bene questa idea UFC ha generalizzato
così funziona anche per altre funzioni
puoi estrarre il primo parametro e
attaccalo sul davanti è puramente
zucchero sintattico e cosa ti consente
da fare è scrivere in questo modo abbiamo
copia sink fonte
quindi anche se non sta usando il
le frecce almeno vanno da sinistra a destra
questo è quello che vogliamo assomigliare a posto
andiamo un po ‘di più su
algoritmi rispetto a oh boy, penso
stiamo andando in ritardo, quindi lo farò
Accelerare filtri okay tutti lo sanno
quali filtri sono funzionali
i filtri di programmazione leggono il loro input e
fare una selezione basata su un lambda e
quelli che passano la selezione vanno
attraverso così qui abbiamo una matrice noi
seleziona quelli meno di tre e
stampale che è una e due mappe
le mappe trasformano il suo input da uno a
avanti così uno due tre quattro cinque noi
li ho squadrati con tempi a e questo
piccolo programma stampa questo riduttore
produrre un singolo valore in questo caso noi
voglio riassumerli tutti così un plus B il
risultato di uno più due più tre più
quattro più cinque sono quindici quindi mettiamoci
questi cattivi ragazzi insieme e vedere cosa
sembra che quello che vogliamo fare è questo
piccolo programma legge dallo standard in noi
vogliamo mantenere i nostri terminatori di linea
così vogliamo leggere il nostro standard in
per linea e poi vogliamo mapparlo noi
voglio perché legge dallo standard in
utilizza un buffer e mantiene il suo riutilizzo
Buffer abbiamo bisogno di fare copie del
dati perché byline sta per reindirizzare
usa questo buffer così quest’uomo
ne fa solo una copia e la sua uscita
è alimentato in array che lo trasforma in un
array assembla tutte quelle linee in
una serie di loro poi li ordiniamo usando
quicksort e poi prendiamo il risultato
e lo copiamo con lo standard usando
blocco testo scrittore quale testo di blocco
lo scrittore fa è perché scrive a
lo standard out può essere fatto da qualsiasi thread
devi bloccare lo standard mentre tu
scrivici sopra altrimenti ottieni l’output
da tutti i tuoi fili tutti interfogliati
e modi imprevedibili quindi è quello che questo
fa le caratteristiche linguistiche di D che sono
necessario per far funzionare tutto questo
bisogno di gestione delle eccezioni per errori no
codici di errore non so davvero come
questo funzionerebbe come questo sembrerebbe
codici di errore perché sicuramente lo sarei
credo che sarebbe rivelarsi piuttosto
brutto hai bisogno di funzioni generiche di cui hai bisogno
vincoli di modello per implementare il
idea di concetto abbiamo bisogno di una funzione uniforme
chiama la sintassi per farlo sembrare
hai lasciato da sinistra a destra localmente
desiderio ho già parlato di loro essere
non concetti tipi di linguaggio ha bisogno di
supporto all’integrazione della personalizzazione e
ottimizzazione e tutto questo è necessario
per avere alte prestazioni
specializzazione dei risultati che puoi scrivere
versioni specializzate dei tuoi algoritmi
e il compilatore ne sceglierà uno
corrisponde ai tuoi tipi di dati, quindi se ne hai
tipi specializzati per vari diversi
tipi di dati questo funzionerà con quello
tipo di detrazione se non si notano tipi
compaiono ovunque nel compilatore
deduce i tipi in questo caso è carino
molto li deduce tutti perché sa
quello standard e restituisce i caratteri così
questo influenza tutto il resto
seguendo come trattare con i personaggi
entrare e tuple anche se non l’ho fatto
avere un esempio
algoritmi e filtri e roba possibile
in realtà Moulton fare più cose a
nello stesso tempo su un singolo passaggio sopra il
dati e quindi restituire un risultato come una tupla
quindi è bello avere delle tuple in
linguaggio per farlo
componenti di conclusione giuste sono un modo per
rendere il codice riutilizzabile cercando di farli
lavoro è una combinazione di convenzioni
e il supporto linguistico per loro molto
funzionalità avanzate di D si uniscono a
far funzionare i componenti che non conosco
un’altra lingua con questa combinazione
di caratteristiche quindi se avete voglia di
far funzionare i componenti li dentro non li faccio
pensare è andare a lavorare come bene e
si basa sul successo dei precedenti
modelli di componenti che sono file e
filtra i flussi e lo standard
libreria di modelli quindi ce ne sono altri due
modelli componenti in largo uso uno è il
idea di programmazione funzionale e il
il linguaggio di programmazione funzionale è
tipicamente come collegano il
fonti algoritmo i lavandini che ha
Idee che usano elenchi che hanno ragione loro
collegare ciò che fanno è che ce l’hanno
tutto è rappresentato come una lista e
è così che tutto si connette come
una lista e il problema arriva quando tu
avere algoritmi che non lo fanno davvero
si comportano molto bene su una lista come a
quicksort quindi un design dei componenti migliore
è quello che abilita il componente
costruttore per scrivere una struttura dati che
più appropriatamente corrisponde ai suoi dati di
sto solo cercando di forzare tutto dentro
essendo una lista l’altro modello di componente
in largo uso utilizza funzioni virtuali
sai come la programmazione della comunicazione e
cose del genere
e questo ha due gravi inconvenienti uno
è ogni iterazione attraverso di essa sei
chiamando funzioni virtuali che su
le moderne architetture sono lente ora lo è
possibile con un sufficientemente intelligente
ottimizzatore puoi foldare tutti quelli
funzioni virtuali o D virtualizzate e
li inline ma non molte lingue sono
sufficientemente intelligente per farlo e il
altra difficoltà con loro è la tua tendenza
non avere il controllo sui tuoi dati
layout e se stai scrivendo
codice ad alte prestazioni e oggi
processori che devono ottimizzare per
linee di memoria cache e cose del genere
vuoi davvero controllare da vicino come
i tuoi dati sono disposti e l’interfaccia
disegna generalmente i più grandi
si preclude dal farlo così
domande si signore oh vedo cosa è il
uscita del filtro allora l’uscita
il filtro è un altro intervallo di input ah
questo è un ottimo domanda al
ottima domanda è si sa che questo è un
gamma che esce ottieni un risultato
fuori dal filtro fino a quando non viene letto tutto
l’input o lo ottieni element by
elemento va bene e vorrei caratterizzare
questo è pigro o è desideroso e il
la risposta è che puoi farlo tu
in entrambi i casi quindi una delle cose belle
sulla programmazione dei componenti e B è I
può sostituire un algoritmo desideroso con a
pigro e viceversa tutto senza solo
cambiando il nome del componente I
collegare lì, infatti, ho spesso fatto
quella mia prima iterazione di un componente
in realtà di solito è desideroso perché lo è
più facile scrivere uno desideroso e più tardi
se trovo che lo sto usando molto, lo farò
migliorarlo rendendolo pigro e
una cosa interessante di quelli pigri è
quelli pigri aprono la possibilità di
fare le cose in parallelo, quindi anche se
quello non ha
fatto ancora con questa roba l’opportunità
è lì per paralizzare davvero le cose
Please follow and like us: