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