xref: /OK3568_Linux_fs/kernel/Documentation/translations/it_IT/process/4.Coding.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun.. include:: ../disclaimer-ita.rst
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun:Original: :ref:`Documentation/process/4.Coding.rst <development_coding>`
4*4882a593Smuzhiyun:Translator: Alessia Mantegazza <amantegazza@vaga.pv.it>
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun.. _it_development_coding:
7*4882a593Smuzhiyun
8*4882a593SmuzhiyunScrivere codice corretto
9*4882a593Smuzhiyun========================
10*4882a593Smuzhiyun
11*4882a593SmuzhiyunNonostante ci sia molto da dire sul processo di creazione, sulla sua solidità
12*4882a593Smuzhiyune sul suo orientamento alla comunità, la prova di ogni progetto di sviluppo
13*4882a593Smuzhiyundel kernel si trova nel codice stesso.  È il codice che sarà esaminato dagli
14*4882a593Smuzhiyunaltri sviluppatori ed inserito (o no) nel ramo principale. Quindi è la
15*4882a593Smuzhiyunqualità di questo codice che determinerà il successo finale del progetto.
16*4882a593Smuzhiyun
17*4882a593SmuzhiyunQuesta sezione esaminerà il processo di codifica.  Inizieremo con uno sguardo
18*4882a593Smuzhiyunsulle diverse casistiche nelle quali gli sviluppatori kernel possono
19*4882a593Smuzhiyunsbagliare.  Poi, l'attenzione si sposterà verso "il fare le cose
20*4882a593Smuzhiyuncorrettamente" e sugli strumenti che possono essere utili in questa missione.
21*4882a593Smuzhiyun
22*4882a593SmuzhiyunTrappole
23*4882a593Smuzhiyun--------
24*4882a593Smuzhiyun
25*4882a593SmuzhiyunLo stile del codice
26*4882a593Smuzhiyun*******************
27*4882a593Smuzhiyun
28*4882a593SmuzhiyunIl kernel ha da tempo delle norme sullo stile di codifica che sono descritte in
29*4882a593Smuzhiyun:ref:`Documentation/translations/it_IT/process/coding-style.rst <codingstyle>`.
30*4882a593SmuzhiyunPer la maggior parte del tempo, la politica descritta in quel file è stata
31*4882a593Smuzhiyunpraticamente informativa.  Ne risulta che ci sia una quantità sostanziale di
32*4882a593Smuzhiyuncodice nel kernel che non rispetta le linee guida relative allo stile.
33*4882a593SmuzhiyunLa presenza di quel codice conduce a due distinti pericoli per gli
34*4882a593Smuzhiyunsviluppatori kernel.
35*4882a593Smuzhiyun
36*4882a593SmuzhiyunIl primo di questi è credere che gli standard di codifica del kernel
37*4882a593Smuzhiyunnon sono importanti e possono non essere applicati.  La verità è che
38*4882a593Smuzhiyunaggiungere nuovo codice al kernel è davvero difficile se questo non
39*4882a593Smuzhiyunrispetta le norme; molti sviluppatori richiederanno che il codice sia
40*4882a593Smuzhiyunriformulato prima che anche solo lo revisionino.  Una base di codice larga
41*4882a593Smuzhiyunquanto il kernel richiede una certa uniformità, in modo da rendere possibile
42*4882a593Smuzhiyunper gli sviluppatori una comprensione veloce di ogni sua parte.  Non ci sono,
43*4882a593Smuzhiyunquindi, più spazi per un codice formattato alla carlona.
44*4882a593Smuzhiyun
45*4882a593SmuzhiyunOccasionalmente, lo stile di codifica del kernel andrà in conflitto con lo
46*4882a593Smuzhiyunstile richiesto da un datore di lavoro.  In alcuni casi, lo stile del kernel
47*4882a593Smuzhiyundovrà prevalere prima che il codice venga inserito.  Mettere il codice
48*4882a593Smuzhiyunall'interno del kernel significa rinunciare a un certo grado di controllo
49*4882a593Smuzhiyunin differenti modi - incluso il controllo sul come formattare il codice.
50*4882a593Smuzhiyun
51*4882a593SmuzhiyunL’altra trappola è quella di pensare che il codice già presente nel kernel
52*4882a593Smuzhiyunabbia urgentemente bisogno di essere sistemato.  Gli sviluppatori potrebbero
53*4882a593Smuzhiyuniniziare a generare patch che correggono lo stile come modo per prendere
54*4882a593Smuzhiyunfamigliarità con il processo, o come modo per inserire i propri nomi nei
55*4882a593Smuzhiyunchangelog del kernel – o entrambe.  La comunità di sviluppo vede un attività
56*4882a593Smuzhiyundi codifica puramente correttiva come "rumore"; queste attività riceveranno
57*4882a593Smuzhiyununa fredda accoglienza.  Di conseguenza è meglio evitare questo tipo di patch.
58*4882a593SmuzhiyunMentre si lavora su un pezzo di codice è normale correggerne anche lo stile,
59*4882a593Smuzhiyunma le modifiche di stile non dovrebbero essere fatte fini a se stesse.
60*4882a593Smuzhiyun
61*4882a593SmuzhiyunIl documento sullo stile del codice non dovrebbe essere letto come una legge
62*4882a593Smuzhiyunassoluta che non può mai essere trasgredita.  Se c’è un a buona ragione
63*4882a593Smuzhiyun(per esempio, una linea che diviene poco leggibile se divisa per rientrare
64*4882a593Smuzhiyunnel limite di 80 colonne), fatelo e basta.
65*4882a593Smuzhiyun
66*4882a593SmuzhiyunNotate che potete utilizzare lo strumento “clang-format” per aiutarvi con
67*4882a593Smuzhiyunle regole, per una riformattazione automatica e veloce del vostro codice
68*4882a593Smuzhiyune per revisionare interi file per individuare errori nello stile di codifica,
69*4882a593Smuzhiyunrefusi e possibili miglioramenti.  Inoltre è utile anche per classificare gli
70*4882a593Smuzhiyun``#includes``, per allineare variabili/macro, per testi derivati ed altri
71*4882a593Smuzhiyuncompiti del genere.  Consultate il file
72*4882a593Smuzhiyun:ref:`Documentation/translations/it_IT/process/clang-format.rst <clangformat>`
73*4882a593Smuzhiyunper maggiori dettagli
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun
76*4882a593SmuzhiyunLivelli di astrazione
77*4882a593Smuzhiyun*********************
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun
80*4882a593SmuzhiyunI professori di Informatica insegnano ai propri studenti a fare ampio uso dei
81*4882a593Smuzhiyunlivelli di astrazione nel nome della flessibilità e del nascondere informazioni.
82*4882a593SmuzhiyunCerto il kernel fa un grande uso dell'astrazione; nessun progetto con milioni
83*4882a593Smuzhiyundi righe di codice potrebbe fare altrimenti e sopravvivere.  Ma l'esperienza
84*4882a593Smuzhiyunha dimostrato che un'eccessiva o prematura astrazione può rivelarsi dannosa
85*4882a593Smuzhiyunal pari di una prematura ottimizzazione.  L'astrazione dovrebbe essere usata
86*4882a593Smuzhiyunfino al livello necessario e non oltre.
87*4882a593Smuzhiyun
88*4882a593SmuzhiyunAd un livello base, considerate una funzione che ha un argomento che viene
89*4882a593Smuzhiyunsempre impostato a zero da tutti i chiamanti.  Uno potrebbe mantenere
90*4882a593Smuzhiyunquell'argomento nell'eventualità qualcuno volesse sfruttare la flessibilità
91*4882a593Smuzhiyunofferta.  In ogni caso, tuttavia, ci sono buone possibilità che il codice
92*4882a593Smuzhiyunche va ad implementare questo argomento aggiuntivo, sia stato rotto in maniera
93*4882a593Smuzhiyunsottile, in un modo che non è mai stato notato - perché non è mai stato usato.
94*4882a593SmuzhiyunOppure, quando sorge la necessità di avere più flessibilità, questo argomento
95*4882a593Smuzhiyunnon la fornisce in maniera soddisfacente.  Gli sviluppatori di Kernel,
96*4882a593Smuzhiyunsottopongono costantemente patch che vanno a rimuovere gli argomenti
97*4882a593Smuzhiyuninutilizzate; anche se, in generale, non avrebbero dovuto essere aggiunti.
98*4882a593Smuzhiyun
99*4882a593SmuzhiyunI livelli di astrazione che nascondono l'accesso all'hardware -
100*4882a593Smuzhiyunspesso per poter usare dei driver su diversi sistemi operativi - vengono
101*4882a593Smuzhiyunparticolarmente disapprovati.  Tali livelli oscurano il codice e possono
102*4882a593Smuzhiyunpeggiorare le prestazioni; essi non appartengono al kernel Linux.
103*4882a593Smuzhiyun
104*4882a593SmuzhiyunD'altro canto, se vi ritrovate a dover copiare una quantità significativa di
105*4882a593Smuzhiyuncodice proveniente da un altro sottosistema del kernel, è tempo di chiedersi
106*4882a593Smuzhiyunse, in effetti, non avrebbe più senso togliere parte di quel codice e metterlo
107*4882a593Smuzhiyunin una libreria separata o di implementare quella funzionalità ad un livello
108*4882a593Smuzhiyunpiù elevato.  Non c'è utilità nel replicare lo stesso codice per tutto
109*4882a593Smuzhiyunil kernel.
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun#ifdef e l'uso del preprocessore in generale
113*4882a593Smuzhiyun********************************************
114*4882a593Smuzhiyun
115*4882a593SmuzhiyunIl preprocessore C sembra essere una fonte di attrazione per qualche
116*4882a593Smuzhiyunprogrammatore C, che ci vede una via per ottenere una grande flessibilità
117*4882a593Smuzhiyunall'interno di un file sorgente.  Ma il preprocessore non è scritto in C,
118*4882a593Smuzhiyune un suo massiccio impiego conduce a un codice che è molto più difficile
119*4882a593Smuzhiyunda leggere per gli altri e che rende più difficile il lavoro di verifica del
120*4882a593Smuzhiyuncompilatore.  L'uso eccessivo del preprocessore è praticamente sempre il segno
121*4882a593Smuzhiyundi un codice che necessita di un certo lavoro di pulizia.
122*4882a593Smuzhiyun
123*4882a593SmuzhiyunLa compilazione condizionata con #ifdef è, in effetti, un potente strumento,
124*4882a593Smuzhiyuned esso viene usato all'interno del kernel.  Ma esiste un piccolo desiderio:
125*4882a593Smuzhiyunquello di vedere il codice coperto solo da una leggera spolverata di
126*4882a593Smuzhiyunblocchi #ifdef.  Come regola generale, quando possibile, l'uso di #ifdef
127*4882a593Smuzhiyundovrebbe essere confinato nei file d'intestazione.  Il codice compilato
128*4882a593Smuzhiyuncondizionatamente può essere confinato a funzioni tali che, nel caso in cui
129*4882a593Smuzhiyunil codice non deve essere presente, diventano vuote.  Il compilatore poi
130*4882a593Smuzhiyunottimizzerà la chiamata alla funzione vuota rimuovendola.  Il risultato è
131*4882a593Smuzhiyunun codice molto più pulito, più facile da seguire.
132*4882a593Smuzhiyun
133*4882a593SmuzhiyunLe macro del preprocessore C presentano una serie di pericoli, inclusi
134*4882a593Smuzhiyunvalutazioni multiple di espressioni che hanno effetti collaterali e non
135*4882a593Smuzhiyungarantiscono una sicurezza rispetto ai tipi.  Se siete tentati dal definire
136*4882a593Smuzhiyununa macro, considerate l'idea di creare invece una funzione inline.  Il codice
137*4882a593Smuzhiyunche ne risulterà sarà lo stesso, ma le funzioni inline sono più leggibili,
138*4882a593Smuzhiyunnon considerano i propri argomenti più volte, e permettono al compilatore di
139*4882a593Smuzhiyuneffettuare controlli sul tipo degli argomenti e del valore di ritorno.
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun
142*4882a593SmuzhiyunFunzioni inline
143*4882a593Smuzhiyun***************
144*4882a593Smuzhiyun
145*4882a593SmuzhiyunComunque, anche le funzioni inline hanno i loro pericoli.  I programmatori
146*4882a593Smuzhiyunpotrebbero innamorarsi dell'efficienza percepita derivata dalla rimozione
147*4882a593Smuzhiyundi una chiamata a funzione.  Queste funzioni, tuttavia, possono ridurre le
148*4882a593Smuzhiyunprestazioni.  Dato che il loro codice viene replicato ovunque vi sia una
149*4882a593Smuzhiyunchiamata ad esse, si finisce per gonfiare le dimensioni del kernel compilato.
150*4882a593SmuzhiyunQuesti, a turno, creano pressione sulla memoria cache del processore, e questo
151*4882a593Smuzhiyunpuò causare rallentamenti importanti.  Le funzioni inline, di norma, dovrebbero
152*4882a593Smuzhiyunessere piccole e usate raramente.  Il costo di una chiamata a funzione, dopo
153*4882a593Smuzhiyuntutto, non è così alto; la creazione di molte funzioni inline è il classico
154*4882a593Smuzhiyunesempio di un'ottimizzazione prematura.
155*4882a593Smuzhiyun
156*4882a593SmuzhiyunIn generale, i programmatori del kernel ignorano gli effetti della cache a
157*4882a593Smuzhiyunloro rischio e pericolo.  Il classico compromesso tempo/spazio teorizzato
158*4882a593Smuzhiyunall'inizio delle lezioni sulle strutture dati spesso non si applica
159*4882a593Smuzhiyunall'hardware moderno.  Lo spazio *è* tempo, in questo senso un programma
160*4882a593Smuzhiyunpiù grande sarà più lento rispetto ad uno più compatto.
161*4882a593Smuzhiyun
162*4882a593SmuzhiyunI compilatori più recenti hanno preso un ruolo attivo nel decidere se
163*4882a593Smuzhiyununa data funzione deve essere resa inline oppure no.  Quindi l'uso
164*4882a593Smuzhiyunindiscriminato della parola chiave "inline" potrebbe non essere non solo
165*4882a593Smuzhiyuneccessivo, ma anche irrilevante.
166*4882a593Smuzhiyun
167*4882a593SmuzhiyunSincronizzazione
168*4882a593Smuzhiyun****************
169*4882a593Smuzhiyun
170*4882a593SmuzhiyunNel maggio 2006, il sistema di rete "Devicescape" fu rilasciato in pompa magna
171*4882a593Smuzhiyunsotto la licenza GPL e reso disponibile per la sua inclusione nella ramo
172*4882a593Smuzhiyunprincipale del kernel.  Questa donazione fu una notizia bene accolta;
173*4882a593Smuzhiyunil supporto per le reti senza fili era considerata, nel migliore dei casi,
174*4882a593Smuzhiyunal di sotto degli standard; il sistema Deviscape offrì la promessa di una
175*4882a593Smuzhiyunrisoluzione a tale situazione.  Tuttavia, questo codice non fu inserito nel
176*4882a593Smuzhiyunramo principale fino al giugno del 2007 (2.6.22). Cosa accadde?
177*4882a593Smuzhiyun
178*4882a593SmuzhiyunQuel codice mostrava numerosi segnali di uno sviluppo in azienda avvenuto
179*4882a593Smuzhiyuna porte chiuse.  Ma in particolare, un grosso problema fu che non fu
180*4882a593Smuzhiyunprogettato per girare in un sistema multiprocessore.  Prima che questo
181*4882a593Smuzhiyunsistema di rete (ora chiamato mac80211) potesse essere inserito, fu necessario
182*4882a593Smuzhiyunun lavoro sugli schemi di sincronizzazione.
183*4882a593Smuzhiyun
184*4882a593SmuzhiyunUna volta, il codice del kernel Linux poteva essere sviluppato senza pensare
185*4882a593Smuzhiyunai problemi di concorrenza presenti nei sistemi multiprocessore.  Ora,
186*4882a593Smuzhiyuncomunque, questo documento è stato scritto su di un portatile dual-core.
187*4882a593SmuzhiyunPersino su sistemi a singolo processore, il lavoro svolto per incrementare
188*4882a593Smuzhiyunla capacità di risposta aumenterà il livello di concorrenza interno al kernel.
189*4882a593SmuzhiyunI giorni nei quali il codice poteva essere scritto senza pensare alla
190*4882a593Smuzhiyunsincronizzazione sono da passati tempo.
191*4882a593Smuzhiyun
192*4882a593SmuzhiyunOgni risorsa (strutture dati, registri hardware, etc.) ai quali si potrebbe
193*4882a593Smuzhiyunavere accesso simultaneo da più di un thread deve essere sincronizzato.  Il
194*4882a593Smuzhiyunnuovo codice dovrebbe essere scritto avendo tale accortezza in testa;
195*4882a593Smuzhiyunriadattare la sincronizzazione a posteriori è un compito molto più difficile.
196*4882a593SmuzhiyunGli sviluppatori del kernel dovrebbero prendersi il tempo di comprendere bene
197*4882a593Smuzhiyunle primitive di sincronizzazione, in modo da sceglier lo strumento corretto
198*4882a593Smuzhiyunper eseguire un compito.  Il codice che presenta una mancanza di attenzione
199*4882a593Smuzhiyunalla concorrenza avrà un percorso difficile all'interno del ramo principale.
200*4882a593Smuzhiyun
201*4882a593SmuzhiyunRegressioni
202*4882a593Smuzhiyun***********
203*4882a593Smuzhiyun
204*4882a593SmuzhiyunVale la pena menzionare un ultimo pericolo: potrebbe rivelarsi accattivante
205*4882a593Smuzhiyunl'idea di eseguire un cambiamento (che potrebbe portare a grandi
206*4882a593Smuzhiyunmiglioramenti) che porterà ad alcune rotture per gli utenti esistenti.
207*4882a593SmuzhiyunQuesta tipologia di cambiamento è chiamata "regressione", e le regressioni son
208*4882a593Smuzhiyundiventate mal viste nel ramo principale del kernel.  Con alcune eccezioni,
209*4882a593Smuzhiyuni cambiamenti che causano regressioni saranno fermati se quest'ultime non
210*4882a593Smuzhiyunpotranno essere corrette in tempo utile.  È molto meglio quindi evitare
211*4882a593Smuzhiyunla regressione fin dall'inizio.
212*4882a593Smuzhiyun
213*4882a593SmuzhiyunSpesso si è argomentato che una regressione può essere giustificata se essa
214*4882a593Smuzhiyunporta risolve più problemi di quanti non ne crei.  Perché, dunque, non fare
215*4882a593Smuzhiyunun cambiamento se questo porta a nuove funzionalità a dieci sistemi per
216*4882a593Smuzhiyunognuno dei quali esso determina una rottura?  La migliore risposta a questa
217*4882a593Smuzhiyundomanda ci è stata fornita da Linus nel luglio 2007:
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun::
220*4882a593Smuzhiyun   Dunque, noi non sistemiamo bachi introducendo nuovi problemi. Quella
221*4882a593Smuzhiyun   via nasconde insidie, e nessuno può sapere del tutto se state facendo
222*4882a593Smuzhiyun   dei progressi reali. Sono due passi avanti e uno indietro, oppure
223*4882a593Smuzhiyun   un passo avanti e due indietro?
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun(http://lwn.net/Articles/243460/).
226*4882a593Smuzhiyun
227*4882a593SmuzhiyunUna particolare tipologia di regressione mal vista consiste in una qualsiasi
228*4882a593Smuzhiyunsorta di modifica all'ABI dello spazio utente.  Una volta che un'interfaccia
229*4882a593Smuzhiyunviene esportata verso lo spazio utente, dev'essere supportata all'infinito.
230*4882a593SmuzhiyunQuesto fatto rende la creazione di interfacce per lo spazio utente
231*4882a593Smuzhiyunparticolarmente complicato: dato che non possono venir cambiate introducendo
232*4882a593Smuzhiyunincompatibilità, esse devono essere fatte bene al primo colpo.  Per questa
233*4882a593Smuzhiyunragione sono sempre richieste: ampie riflessioni, documentazione chiara e
234*4882a593Smuzhiyunampie revisioni dell'interfaccia verso lo spazio utente.
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun
237*4882a593SmuzhiyunStrumenti di verifica del codice
238*4882a593Smuzhiyun--------------------------------
239*4882a593SmuzhiyunAlmeno per ora la scrittura di codice priva di errori resta un ideale
240*4882a593Smuzhiyunirraggiungibile ai più.  Quello che speriamo di poter fare, tuttavia, è
241*4882a593Smuzhiyuntrovare e correggere molti di questi errori prima che il codice entri nel
242*4882a593Smuzhiyunramo principale del kernel.  A tal scopo gli sviluppatori del kernel devono
243*4882a593Smuzhiyunmettere insieme una schiera impressionante di strumenti che possano
244*4882a593Smuzhiyunlocalizzare automaticamente un'ampia varietà di problemi.  Qualsiasi problema
245*4882a593Smuzhiyuntrovato dal computer è un problema che non affliggerà l'utente in seguito,
246*4882a593Smuzhiyunne consegue che gli strumenti automatici dovrebbero essere impiegati ovunque
247*4882a593Smuzhiyunpossibile.
248*4882a593Smuzhiyun
249*4882a593SmuzhiyunIl primo passo consiste semplicemente nel fare attenzione agli avvertimenti
250*4882a593Smuzhiyunproveniente dal compilatore.  Versioni moderne di gcc possono individuare
251*4882a593Smuzhiyun(e segnalare) un gran numero di potenziali errori.  Molto spesso, questi
252*4882a593Smuzhiyunavvertimenti indicano problemi reali.  Di regola, il codice inviato per la
253*4882a593Smuzhiyunrevisione non dovrebbe produrre nessun avvertimento da parte del compilatore.
254*4882a593SmuzhiyunPer mettere a tacere gli avvertimenti, cercate di comprenderne le cause reali
255*4882a593Smuzhiyune cercate di evitare le "riparazioni" che fan sparire l'avvertimento senza
256*4882a593Smuzhiyunperò averne trovato la causa.
257*4882a593Smuzhiyun
258*4882a593SmuzhiyunTenete a mente che non tutti gli avvertimenti sono disabilitati di default.
259*4882a593SmuzhiyunCostruite il kernel con "make EXTRA_CFLAGS=-W" per ottenerli tutti.
260*4882a593Smuzhiyun
261*4882a593SmuzhiyunIl kernel fornisce differenti opzioni che abilitano funzionalità di debugging;
262*4882a593Smuzhiyunmolti di queste sono trovano all'interno del sotto menu "kernel hacking".
263*4882a593SmuzhiyunLa maggior parte di queste opzioni possono essere attivate per qualsiasi
264*4882a593Smuzhiyunkernel utilizzato per lo sviluppo o a scopo di test.  In particolare dovreste
265*4882a593Smuzhiyunattivare:
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun - ENABLE_MUST_CHECK e FRAME_WARN per ottenere degli
268*4882a593Smuzhiyun   avvertimenti dedicati a problemi come l'uso di interfacce deprecate o
269*4882a593Smuzhiyun   l'ignorare un importante valore di ritorno di una funzione.  Il risultato
270*4882a593Smuzhiyun   generato da questi avvertimenti può risultare verboso, ma non bisogna
271*4882a593Smuzhiyun   preoccuparsi per gli avvertimenti provenienti da altre parti del kernel.
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun - DEBUG_OBJECTS aggiungerà un codice per tracciare il ciclo di vita di
274*4882a593Smuzhiyun   diversi oggetti creati dal kernel e avvisa quando qualcosa viene eseguito
275*4882a593Smuzhiyun   fuori controllo.  Se state aggiungendo un sottosistema che crea (ed
276*4882a593Smuzhiyun   esporta) oggetti complessi propri, considerate l'aggiunta di un supporto
277*4882a593Smuzhiyun   al debugging dell'oggetto.
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun - DEBUG_SLAB può trovare svariati errori di uso e di allocazione di memoria;
280*4882a593Smuzhiyun   esso dovrebbe esser usato dalla maggior parte dei kernel di sviluppo.
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun - DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP, e DEBUG_MUTEXES troveranno un certo
283*4882a593Smuzhiyun   numero di errori comuni di sincronizzazione.
284*4882a593Smuzhiyun
285*4882a593SmuzhiyunEsistono ancora delle altre opzioni di debugging, di alcune di esse
286*4882a593Smuzhiyundiscuteremo qui sotto.  Alcune di esse hanno un forte impatto e non dovrebbero
287*4882a593Smuzhiyunessere usate tutte le volte.  Ma qualche volta il tempo speso nell'capire
288*4882a593Smuzhiyunle opzioni disponibili porterà ad un risparmio di tempo nel breve termine.
289*4882a593Smuzhiyun
290*4882a593SmuzhiyunUno degli strumenti di debugging più tosti è il *locking checker*, o
291*4882a593Smuzhiyun"lockdep".  Questo strumento traccerà qualsiasi acquisizione e rilascio di
292*4882a593Smuzhiyunogni *lock* (spinlock o mutex) nel sistema, l'ordine con il quale i *lock*
293*4882a593Smuzhiyunsono acquisiti in relazione l'uno con l'altro, l'ambiente corrente di
294*4882a593Smuzhiyuninterruzione, eccetera.  Inoltre esso può assicurare che i *lock* vengano
295*4882a593Smuzhiyunacquisiti sempre nello stesso ordine, che le stesse assunzioni sulle
296*4882a593Smuzhiyuninterruzioni si applichino in tutte le occasioni, e così via.  In altre parole,
297*4882a593Smuzhiyunlockdep può scovare diversi scenari nei quali il sistema potrebbe, in rari
298*4882a593Smuzhiyuncasi, trovarsi in stallo.  Questa tipologia di problema può essere grave
299*4882a593Smuzhiyun(sia per gli sviluppatori che per gli utenti) in un sistema in uso; lockdep
300*4882a593Smuzhiyunpermette di trovare tali problemi automaticamente e in anticipo.
301*4882a593Smuzhiyun
302*4882a593SmuzhiyunIn qualità di programmatore kernel diligente, senza dubbio, dovrete controllare
303*4882a593Smuzhiyunil valore di ritorno di ogni operazione (come l'allocazione della memoria)
304*4882a593Smuzhiyunpoiché esso potrebbe fallire.  Il nocciolo della questione è che i percorsi
305*4882a593Smuzhiyundi gestione degli errori, con grande probabilità, non sono mai stati
306*4882a593Smuzhiyuncollaudati del tutto.  Il codice collaudato tende ad essere codice bacato;
307*4882a593Smuzhiyunpotrete quindi essere più a vostro agio con il vostro codice se tutti questi
308*4882a593Smuzhiyunpercorsi fossero stati verificati un po' di volte.
309*4882a593Smuzhiyun
310*4882a593SmuzhiyunIl kernel fornisce un framework per l'inserimento di fallimenti che fa
311*4882a593Smuzhiyunesattamente al caso, specialmente dove sono coinvolte allocazioni di memoria.
312*4882a593SmuzhiyunCon l'opzione per l'inserimento dei fallimenti abilitata, una certa percentuale
313*4882a593Smuzhiyundi allocazione di memoria sarà destinata al fallimento; questi fallimenti
314*4882a593Smuzhiyunpossono essere ridotti ad uno specifico pezzo di codice.  Procedere con
315*4882a593Smuzhiyunl'inserimento dei fallimenti attivo permette al programmatore di verificare
316*4882a593Smuzhiyuncome il codice risponde quando le cose vanno male.  Consultate:
317*4882a593SmuzhiyunDocumentation/fault-injection/fault-injection.rst per avere maggiori
318*4882a593Smuzhiyuninformazioni su come utilizzare questo strumento.
319*4882a593Smuzhiyun
320*4882a593SmuzhiyunAltre tipologie di errori possono essere riscontrati con lo strumento di
321*4882a593Smuzhiyunanalisi statica "sparse".  Con Sparse, il programmatore può essere avvisato
322*4882a593Smuzhiyuncirca la confusione tra gli indirizzi dello spazio utente e dello spazio
323*4882a593Smuzhiyunkernel, un miscuglio fra quantità big-endian e little-endian, il passaggio
324*4882a593Smuzhiyundi un valore intero dove ci sia aspetta un gruppo di flag, e così via.
325*4882a593SmuzhiyunSparse deve essere installato separatamente (se il vostra distribuzione non
326*4882a593Smuzhiyunlo prevede, potete trovarlo su https://sparse.wiki.kernel.org/index.php/Main_Page);
327*4882a593Smuzhiyunpuò essere attivato sul codice aggiungendo "C=1" al comando make.
328*4882a593Smuzhiyun
329*4882a593SmuzhiyunLo strumento "Coccinelle" (http://coccinelle.lip6.fr/) è in grado di trovare
330*4882a593Smuzhiyununa vasta varietà di potenziali problemi di codifica; e può inoltre proporre
331*4882a593Smuzhiyunsoluzioni per risolverli.  Un buon numero di "patch semantiche" per il kernel
332*4882a593Smuzhiyunsono state preparate nella cartella scripts/coccinelle; utilizzando
333*4882a593Smuzhiyun"make coccicheck" esso percorrerà tali patch semantiche e farà rapporto su
334*4882a593Smuzhiyunqualsiasi problema trovato.  Per maggiori informazioni, consultate
335*4882a593Smuzhiyun:ref:`Documentation/dev-tools/coccinelle.rst <devtools_coccinelle>`.
336*4882a593Smuzhiyun
337*4882a593SmuzhiyunAltri errori di portabilità sono meglio scovati compilando il vostro codice
338*4882a593Smuzhiyunper altre architetture.  Se non vi accade di avere un sistema S/390 o una
339*4882a593Smuzhiyunscheda di sviluppo Blackfin sotto mano, potete comunque continuare la fase
340*4882a593Smuzhiyundi compilazione.  Un vasto numero di cross-compilatori per x86 possono
341*4882a593Smuzhiyunessere trovati al sito:
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun	http://www.kernel.org/pub/tools/crosstool/
344*4882a593Smuzhiyun
345*4882a593SmuzhiyunIl tempo impiegato nell'installare e usare questi compilatori sarà d'aiuto
346*4882a593Smuzhiyunnell'evitare situazioni imbarazzanti nel futuro.
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun
349*4882a593SmuzhiyunDocumentazione
350*4882a593Smuzhiyun--------------
351*4882a593Smuzhiyun
352*4882a593SmuzhiyunLa documentazione è spesso stata più un'eccezione che una regola nello
353*4882a593Smuzhiyunsviluppo del kernel.  Nonostante questo, un'adeguata documentazione aiuterà
354*4882a593Smuzhiyuna facilitare l'inserimento di nuovo codice nel kernel, rende la vita più
355*4882a593Smuzhiyunfacile per gli altri sviluppatori e sarà utile per i vostri utenti.  In molti
356*4882a593Smuzhiyuncasi, la documentazione è divenuta sostanzialmente obbligatoria.
357*4882a593Smuzhiyun
358*4882a593SmuzhiyunLa prima parte di documentazione per qualsiasi patch è il suo changelog.
359*4882a593SmuzhiyunQuesti dovrebbero descrivere le problematiche risolte, la tipologia di
360*4882a593Smuzhiyunsoluzione, le persone che lavorano alla patch, ogni effetto rilevante
361*4882a593Smuzhiyunsulle prestazioni e tutto ciò che può servire per la comprensione della
362*4882a593Smuzhiyunpatch.  Assicuratevi che il changelog dica *perché*, vale la pena aggiungere
363*4882a593Smuzhiyunla patch; un numero sorprendente di sviluppatori sbaglia nel fornire tale
364*4882a593Smuzhiyuninformazione.
365*4882a593Smuzhiyun
366*4882a593SmuzhiyunQualsiasi codice che aggiunge una nuova interfaccia in spazio utente - inclusi
367*4882a593Smuzhiyunnuovi file in sysfs o /proc - dovrebbe includere la documentazione di tale
368*4882a593Smuzhiyuninterfaccia così da permette agli sviluppatori dello spazio utente di sapere
369*4882a593Smuzhiyuncon cosa stanno lavorando.  Consultate: Documentation/ABI/README per avere una
370*4882a593Smuzhiyundescrizione di come questi documenti devono essere impostati e quali
371*4882a593Smuzhiyuninformazioni devono essere fornite.
372*4882a593Smuzhiyun
373*4882a593SmuzhiyunIl file :ref:`Documentation/translations/it_IT/admin-guide/kernel-parameters.rst <kernelparameters>`
374*4882a593Smuzhiyundescrive tutti i parametri di avvio del kernel.  Ogni patch che aggiunga
375*4882a593Smuzhiyunnuovi parametri dovrebbe aggiungere nuove voci a questo file.
376*4882a593Smuzhiyun
377*4882a593SmuzhiyunOgni nuova configurazione deve essere accompagnata da un testo di supporto
378*4882a593Smuzhiyunche spieghi chiaramente le opzioni e spieghi quando l'utente potrebbe volerle
379*4882a593Smuzhiyunselezionare.
380*4882a593Smuzhiyun
381*4882a593SmuzhiyunPer molti sottosistemi le informazioni sull'API interna sono documentate sotto
382*4882a593Smuzhiyunforma di commenti formattati in maniera particolare; questi commenti possono
383*4882a593Smuzhiyunessere estratti e formattati in differenti modi attraverso lo script
384*4882a593Smuzhiyun"kernel-doc".  Se state lavorando all'interno di un sottosistema che ha
385*4882a593Smuzhiyuncommenti kerneldoc dovreste mantenerli e aggiungerli, in maniera appropriata,
386*4882a593Smuzhiyunper le funzioni disponibili esternamente.  Anche in aree che non sono molto
387*4882a593Smuzhiyundocumentate, non c'è motivo per non aggiungere commenti kerneldoc per il
388*4882a593Smuzhiyunfuturo; infatti, questa può essere un'attività utile per sviluppatori novizi
389*4882a593Smuzhiyundel kernel.  Il formato di questi commenti, assieme alle informazione su come
390*4882a593Smuzhiyuncreare modelli per kerneldoc, possono essere trovati in
391*4882a593Smuzhiyun:ref:`Documentation/translations/it_IT/doc-guide/ <doc_guide>`.
392*4882a593Smuzhiyun
393*4882a593SmuzhiyunChiunque legga un ammontare significativo di codice kernel noterà che, spesso,
394*4882a593Smuzhiyuni commenti si fanno maggiormente notare per la loro assenza.  Ancora una volta,
395*4882a593Smuzhiyunle aspettative verso il nuovo codice sono più alte rispetto al passato;
396*4882a593Smuzhiyuninserire codice privo di commenti sarà più difficile.  Detto ciò, va aggiunto
397*4882a593Smuzhiyunche non si desiderano commenti prolissi per il codice.  Il codice dovrebbe
398*4882a593Smuzhiyunessere, di per sé, leggibile, con dei commenti che spieghino gli aspetti più
399*4882a593Smuzhiyunsottili.
400*4882a593Smuzhiyun
401*4882a593SmuzhiyunDeterminate cose dovrebbero essere sempre commentate.  L'uso di barriere
402*4882a593Smuzhiyundi memoria dovrebbero essere accompagnate da una riga che spieghi perché sia
403*4882a593Smuzhiyunnecessaria.  Le regole di sincronizzazione per le strutture dati, generalmente,
404*4882a593Smuzhiyunnecessitano di una spiegazioni da qualche parte.  Le strutture dati più
405*4882a593Smuzhiyunimportanti, in generale, hanno bisogno di una documentazione onnicomprensiva.
406*4882a593SmuzhiyunLe dipendenze che non sono ovvie tra bit separati di codice dovrebbero essere
407*4882a593Smuzhiyunindicate.  Tutto ciò che potrebbe indurre un inserviente del codice a fare
408*4882a593Smuzhiyununa "pulizia" incorretta, ha bisogno di un commento che dica perché è stato
409*4882a593Smuzhiyunfatto in quel modo.  E così via.
410*4882a593Smuzhiyun
411*4882a593SmuzhiyunCambiamenti interni dell'API
412*4882a593Smuzhiyun----------------------------
413*4882a593Smuzhiyun
414*4882a593SmuzhiyunL'interfaccia binaria fornita dal kernel allo spazio utente non può essere
415*4882a593Smuzhiyunrotta tranne che in circostanze eccezionali.  L'interfaccia di programmazione
416*4882a593Smuzhiyuninterna al kernel, invece, è estremamente fluida e può essere modificata al
417*4882a593Smuzhiyunbisogno.  Se vi trovate a dover lavorare attorno ad un'API del kernel o
418*4882a593Smuzhiyunsemplicemente non state utilizzando una funzionalità offerta perché questa
419*4882a593Smuzhiyunnon rispecchia i vostri bisogni, allora questo potrebbe essere un segno che
420*4882a593Smuzhiyunl'API ha bisogno di essere cambiata.  In qualità di sviluppatore del kernel,
421*4882a593Smuzhiyunhai il potere di fare questo tipo di modifica.
422*4882a593Smuzhiyun
423*4882a593SmuzhiyunCi sono ovviamente alcuni punti da cogliere.  I cambiamenti API possono essere
424*4882a593Smuzhiyunfatti, ma devono essere giustificati.  Quindi ogni patch che porta ad una
425*4882a593Smuzhiyunmodifica dell'API interna dovrebbe essere accompagnata da una descrizione
426*4882a593Smuzhiyundella modifica in sé e del perché essa è necessaria.  Questo tipo di
427*4882a593Smuzhiyuncambiamenti dovrebbero, inoltre, essere fatti in una patch separata, invece di
428*4882a593Smuzhiyunessere sepolti all'interno di una patch più grande.
429*4882a593Smuzhiyun
430*4882a593SmuzhiyunL'altro punto da cogliere consiste nel fatto che uno sviluppatore che
431*4882a593Smuzhiyunmodifica l'API deve, in generale, essere responsabile della correzione
432*4882a593Smuzhiyundi tutto il codice del kernel che viene rotto per via della sua modifica.
433*4882a593SmuzhiyunPer una funzione ampiamente usata, questo compito può condurre letteralmente
434*4882a593Smuzhiyuna centinaia o migliaia di modifiche, molte delle quali sono in conflitto con
435*4882a593Smuzhiyunil lavoro svolto da altri sviluppatori.  Non c'è bisogno di dire che questo
436*4882a593Smuzhiyunpuò essere un lavoro molto grosso, quindi è meglio essere sicuri che la
437*4882a593Smuzhiyunmotivazione sia ben solida.  Notate che lo strumento Coccinelle può fornire
438*4882a593Smuzhiyunun aiuto con modifiche estese dell'API.
439*4882a593Smuzhiyun
440*4882a593SmuzhiyunQuando viene fatta una modifica API incompatibile, una persona dovrebbe,
441*4882a593Smuzhiyunquando possibile, assicurarsi che quel codice non aggiornato sia trovato
442*4882a593Smuzhiyundal compilatore.  Questo vi aiuterà ad essere sicuri d'avere trovato,
443*4882a593Smuzhiyuntutti gli usi di quell'interfaccia.  Inoltre questo avviserà gli sviluppatori
444*4882a593Smuzhiyundi codice fuori dal kernel che c'è un cambiamento per il quale è necessario del
445*4882a593Smuzhiyunlavoro.  Il supporto al codice fuori dal kernel non è qualcosa di cui gli
446*4882a593Smuzhiyunsviluppatori del kernel devono preoccuparsi, ma non dobbiamo nemmeno rendere
447*4882a593Smuzhiyunpiù difficile del necessario la vita agli sviluppatori di questo codice.
448