0001 .. include:: ../disclaimer-ita.rst
0002
0003 :Original: :ref:`Documentation/process/4.Coding.rst <development_coding>`
0004 :Translator: Alessia Mantegazza <amantegazza@vaga.pv.it>
0005
0006 .. _it_development_coding:
0007
0008 Scrivere codice corretto
0009 ========================
0010
0011 Nonostante ci sia molto da dire sul processo di creazione, sulla sua solidità
0012 e sul suo orientamento alla comunità, la prova di ogni progetto di sviluppo
0013 del kernel si trova nel codice stesso. È il codice che sarà esaminato dagli
0014 altri sviluppatori ed inserito (o no) nel ramo principale. Quindi è la
0015 qualità di questo codice che determinerà il successo finale del progetto.
0016
0017 Questa sezione esaminerà il processo di codifica. Inizieremo con uno sguardo
0018 sulle diverse casistiche nelle quali gli sviluppatori kernel possono
0019 sbagliare. Poi, l'attenzione si sposterà verso "il fare le cose
0020 correttamente" e sugli strumenti che possono essere utili in questa missione.
0021
0022 Trappole
0023 --------
0024
0025 Lo stile del codice
0026 *******************
0027
0028 Il kernel ha da tempo delle norme sullo stile di codifica che sono descritte in
0029 :ref:`Documentation/translations/it_IT/process/coding-style.rst <codingstyle>`.
0030 Per la maggior parte del tempo, la politica descritta in quel file è stata
0031 praticamente informativa. Ne risulta che ci sia una quantità sostanziale di
0032 codice nel kernel che non rispetta le linee guida relative allo stile.
0033 La presenza di quel codice conduce a due distinti pericoli per gli
0034 sviluppatori kernel.
0035
0036 Il primo di questi è credere che gli standard di codifica del kernel
0037 non sono importanti e possono non essere applicati. La verità è che
0038 aggiungere nuovo codice al kernel è davvero difficile se questo non
0039 rispetta le norme; molti sviluppatori richiederanno che il codice sia
0040 riformulato prima che anche solo lo revisionino. Una base di codice larga
0041 quanto il kernel richiede una certa uniformità, in modo da rendere possibile
0042 per gli sviluppatori una comprensione veloce di ogni sua parte. Non ci sono,
0043 quindi, più spazi per un codice formattato alla carlona.
0044
0045 Occasionalmente, lo stile di codifica del kernel andrà in conflitto con lo
0046 stile richiesto da un datore di lavoro. In alcuni casi, lo stile del kernel
0047 dovrà prevalere prima che il codice venga inserito. Mettere il codice
0048 all'interno del kernel significa rinunciare a un certo grado di controllo
0049 in differenti modi - incluso il controllo sul come formattare il codice.
0050
0051 L’altra trappola è quella di pensare che il codice già presente nel kernel
0052 abbia urgentemente bisogno di essere sistemato. Gli sviluppatori potrebbero
0053 iniziare a generare patch che correggono lo stile come modo per prendere
0054 famigliarità con il processo, o come modo per inserire i propri nomi nei
0055 changelog del kernel – o entrambe. La comunità di sviluppo vede un attività
0056 di codifica puramente correttiva come "rumore"; queste attività riceveranno
0057 una fredda accoglienza. Di conseguenza è meglio evitare questo tipo di patch.
0058 Mentre si lavora su un pezzo di codice è normale correggerne anche lo stile,
0059 ma le modifiche di stile non dovrebbero essere fatte fini a se stesse.
0060
0061 Il documento sullo stile del codice non dovrebbe essere letto come una legge
0062 assoluta che non può mai essere trasgredita. Se c’è un a buona ragione
0063 (per esempio, una linea che diviene poco leggibile se divisa per rientrare
0064 nel limite di 80 colonne), fatelo e basta.
0065
0066 Notate che potete utilizzare lo strumento “clang-format” per aiutarvi con
0067 le regole, per una riformattazione automatica e veloce del vostro codice
0068 e per revisionare interi file per individuare errori nello stile di codifica,
0069 refusi e possibili miglioramenti. Inoltre è utile anche per classificare gli
0070 ``#includes``, per allineare variabili/macro, per testi derivati ed altri
0071 compiti del genere. Consultate il file
0072 :ref:`Documentation/translations/it_IT/process/clang-format.rst <clangformat>`
0073 per maggiori dettagli
0074
0075
0076 Livelli di astrazione
0077 *********************
0078
0079
0080 I professori di Informatica insegnano ai propri studenti a fare ampio uso dei
0081 livelli di astrazione nel nome della flessibilità e del nascondere informazioni.
0082 Certo il kernel fa un grande uso dell'astrazione; nessun progetto con milioni
0083 di righe di codice potrebbe fare altrimenti e sopravvivere. Ma l'esperienza
0084 ha dimostrato che un'eccessiva o prematura astrazione può rivelarsi dannosa
0085 al pari di una prematura ottimizzazione. L'astrazione dovrebbe essere usata
0086 fino al livello necessario e non oltre.
0087
0088 Ad un livello base, considerate una funzione che ha un argomento che viene
0089 sempre impostato a zero da tutti i chiamanti. Uno potrebbe mantenere
0090 quell'argomento nell'eventualità qualcuno volesse sfruttare la flessibilità
0091 offerta. In ogni caso, tuttavia, ci sono buone possibilità che il codice
0092 che va ad implementare questo argomento aggiuntivo, sia stato rotto in maniera
0093 sottile, in un modo che non è mai stato notato - perché non è mai stato usato.
0094 Oppure, quando sorge la necessità di avere più flessibilità, questo argomento
0095 non la fornisce in maniera soddisfacente. Gli sviluppatori di Kernel,
0096 sottopongono costantemente patch che vanno a rimuovere gli argomenti
0097 inutilizzate; anche se, in generale, non avrebbero dovuto essere aggiunti.
0098
0099 I livelli di astrazione che nascondono l'accesso all'hardware -
0100 spesso per poter usare dei driver su diversi sistemi operativi - vengono
0101 particolarmente disapprovati. Tali livelli oscurano il codice e possono
0102 peggiorare le prestazioni; essi non appartengono al kernel Linux.
0103
0104 D'altro canto, se vi ritrovate a dover copiare una quantità significativa di
0105 codice proveniente da un altro sottosistema del kernel, è tempo di chiedersi
0106 se, in effetti, non avrebbe più senso togliere parte di quel codice e metterlo
0107 in una libreria separata o di implementare quella funzionalità ad un livello
0108 più elevato. Non c'è utilità nel replicare lo stesso codice per tutto
0109 il kernel.
0110
0111
0112 #ifdef e l'uso del preprocessore in generale
0113 ********************************************
0114
0115 Il preprocessore C sembra essere una fonte di attrazione per qualche
0116 programmatore C, che ci vede una via per ottenere una grande flessibilità
0117 all'interno di un file sorgente. Ma il preprocessore non è scritto in C,
0118 e un suo massiccio impiego conduce a un codice che è molto più difficile
0119 da leggere per gli altri e che rende più difficile il lavoro di verifica del
0120 compilatore. L'uso eccessivo del preprocessore è praticamente sempre il segno
0121 di un codice che necessita di un certo lavoro di pulizia.
0122
0123 La compilazione condizionata con #ifdef è, in effetti, un potente strumento,
0124 ed esso viene usato all'interno del kernel. Ma esiste un piccolo desiderio:
0125 quello di vedere il codice coperto solo da una leggera spolverata di
0126 blocchi #ifdef. Come regola generale, quando possibile, l'uso di #ifdef
0127 dovrebbe essere confinato nei file d'intestazione. Il codice compilato
0128 condizionatamente può essere confinato a funzioni tali che, nel caso in cui
0129 il codice non deve essere presente, diventano vuote. Il compilatore poi
0130 ottimizzerà la chiamata alla funzione vuota rimuovendola. Il risultato è
0131 un codice molto più pulito, più facile da seguire.
0132
0133 Le macro del preprocessore C presentano una serie di pericoli, inclusi
0134 valutazioni multiple di espressioni che hanno effetti collaterali e non
0135 garantiscono una sicurezza rispetto ai tipi. Se siete tentati dal definire
0136 una macro, considerate l'idea di creare invece una funzione inline. Il codice
0137 che ne risulterà sarà lo stesso, ma le funzioni inline sono più leggibili,
0138 non considerano i propri argomenti più volte, e permettono al compilatore di
0139 effettuare controlli sul tipo degli argomenti e del valore di ritorno.
0140
0141
0142 Funzioni inline
0143 ***************
0144
0145 Comunque, anche le funzioni inline hanno i loro pericoli. I programmatori
0146 potrebbero innamorarsi dell'efficienza percepita derivata dalla rimozione
0147 di una chiamata a funzione. Queste funzioni, tuttavia, possono ridurre le
0148 prestazioni. Dato che il loro codice viene replicato ovunque vi sia una
0149 chiamata ad esse, si finisce per gonfiare le dimensioni del kernel compilato.
0150 Questi, a turno, creano pressione sulla memoria cache del processore, e questo
0151 può causare rallentamenti importanti. Le funzioni inline, di norma, dovrebbero
0152 essere piccole e usate raramente. Il costo di una chiamata a funzione, dopo
0153 tutto, non è così alto; la creazione di molte funzioni inline è il classico
0154 esempio di un'ottimizzazione prematura.
0155
0156 In generale, i programmatori del kernel ignorano gli effetti della cache a
0157 loro rischio e pericolo. Il classico compromesso tempo/spazio teorizzato
0158 all'inizio delle lezioni sulle strutture dati spesso non si applica
0159 all'hardware moderno. Lo spazio *è* tempo, in questo senso un programma
0160 più grande sarà più lento rispetto ad uno più compatto.
0161
0162 I compilatori più recenti hanno preso un ruolo attivo nel decidere se
0163 una data funzione deve essere resa inline oppure no. Quindi l'uso
0164 indiscriminato della parola chiave "inline" potrebbe non essere non solo
0165 eccessivo, ma anche irrilevante.
0166
0167 Sincronizzazione
0168 ****************
0169
0170 Nel maggio 2006, il sistema di rete "Devicescape" fu rilasciato in pompa magna
0171 sotto la licenza GPL e reso disponibile per la sua inclusione nella ramo
0172 principale del kernel. Questa donazione fu una notizia bene accolta;
0173 il supporto per le reti senza fili era considerata, nel migliore dei casi,
0174 al di sotto degli standard; il sistema Deviscape offrì la promessa di una
0175 risoluzione a tale situazione. Tuttavia, questo codice non fu inserito nel
0176 ramo principale fino al giugno del 2007 (2.6.22). Cosa accadde?
0177
0178 Quel codice mostrava numerosi segnali di uno sviluppo in azienda avvenuto
0179 a porte chiuse. Ma in particolare, un grosso problema fu che non fu
0180 progettato per girare in un sistema multiprocessore. Prima che questo
0181 sistema di rete (ora chiamato mac80211) potesse essere inserito, fu necessario
0182 un lavoro sugli schemi di sincronizzazione.
0183
0184 Una volta, il codice del kernel Linux poteva essere sviluppato senza pensare
0185 ai problemi di concorrenza presenti nei sistemi multiprocessore. Ora,
0186 comunque, questo documento è stato scritto su di un portatile dual-core.
0187 Persino su sistemi a singolo processore, il lavoro svolto per incrementare
0188 la capacità di risposta aumenterà il livello di concorrenza interno al kernel.
0189 I giorni nei quali il codice poteva essere scritto senza pensare alla
0190 sincronizzazione sono da passati tempo.
0191
0192 Ogni risorsa (strutture dati, registri hardware, etc.) ai quali si potrebbe
0193 avere accesso simultaneo da più di un thread deve essere sincronizzato. Il
0194 nuovo codice dovrebbe essere scritto avendo tale accortezza in testa;
0195 riadattare la sincronizzazione a posteriori è un compito molto più difficile.
0196 Gli sviluppatori del kernel dovrebbero prendersi il tempo di comprendere bene
0197 le primitive di sincronizzazione, in modo da sceglier lo strumento corretto
0198 per eseguire un compito. Il codice che presenta una mancanza di attenzione
0199 alla concorrenza avrà un percorso difficile all'interno del ramo principale.
0200
0201 Regressioni
0202 ***********
0203
0204 Vale la pena menzionare un ultimo pericolo: potrebbe rivelarsi accattivante
0205 l'idea di eseguire un cambiamento (che potrebbe portare a grandi
0206 miglioramenti) che porterà ad alcune rotture per gli utenti esistenti.
0207 Questa tipologia di cambiamento è chiamata "regressione", e le regressioni son
0208 diventate mal viste nel ramo principale del kernel. Con alcune eccezioni,
0209 i cambiamenti che causano regressioni saranno fermati se quest'ultime non
0210 potranno essere corrette in tempo utile. È molto meglio quindi evitare
0211 la regressione fin dall'inizio.
0212
0213 Spesso si è argomentato che una regressione può essere giustificata se essa
0214 porta risolve più problemi di quanti non ne crei. Perché, dunque, non fare
0215 un cambiamento se questo porta a nuove funzionalità a dieci sistemi per
0216 ognuno dei quali esso determina una rottura? La migliore risposta a questa
0217 domanda ci è stata fornita da Linus nel luglio 2007:
0218
0219 ::
0220 Dunque, noi non sistemiamo bachi introducendo nuovi problemi. Quella
0221 via nasconde insidie, e nessuno può sapere del tutto se state facendo
0222 dei progressi reali. Sono due passi avanti e uno indietro, oppure
0223 un passo avanti e due indietro?
0224
0225 (http://lwn.net/Articles/243460/).
0226
0227 Una particolare tipologia di regressione mal vista consiste in una qualsiasi
0228 sorta di modifica all'ABI dello spazio utente. Una volta che un'interfaccia
0229 viene esportata verso lo spazio utente, dev'essere supportata all'infinito.
0230 Questo fatto rende la creazione di interfacce per lo spazio utente
0231 particolarmente complicato: dato che non possono venir cambiate introducendo
0232 incompatibilità, esse devono essere fatte bene al primo colpo. Per questa
0233 ragione sono sempre richieste: ampie riflessioni, documentazione chiara e
0234 ampie revisioni dell'interfaccia verso lo spazio utente.
0235
0236
0237 Strumenti di verifica del codice
0238 --------------------------------
0239 Almeno per ora la scrittura di codice priva di errori resta un ideale
0240 irraggiungibile ai più. Quello che speriamo di poter fare, tuttavia, è
0241 trovare e correggere molti di questi errori prima che il codice entri nel
0242 ramo principale del kernel. A tal scopo gli sviluppatori del kernel devono
0243 mettere insieme una schiera impressionante di strumenti che possano
0244 localizzare automaticamente un'ampia varietà di problemi. Qualsiasi problema
0245 trovato dal computer è un problema che non affliggerà l'utente in seguito,
0246 ne consegue che gli strumenti automatici dovrebbero essere impiegati ovunque
0247 possibile.
0248
0249 Il primo passo consiste semplicemente nel fare attenzione agli avvertimenti
0250 proveniente dal compilatore. Versioni moderne di gcc possono individuare
0251 (e segnalare) un gran numero di potenziali errori. Molto spesso, questi
0252 avvertimenti indicano problemi reali. Di regola, il codice inviato per la
0253 revisione non dovrebbe produrre nessun avvertimento da parte del compilatore.
0254 Per mettere a tacere gli avvertimenti, cercate di comprenderne le cause reali
0255 e cercate di evitare le "riparazioni" che fan sparire l'avvertimento senza
0256 però averne trovato la causa.
0257
0258 Tenete a mente che non tutti gli avvertimenti sono disabilitati di default.
0259 Costruite il kernel con "make KCFLAGS=-W" per ottenerli tutti.
0260
0261 Il kernel fornisce differenti opzioni che abilitano funzionalità di debugging;
0262 molti di queste sono trovano all'interno del sotto menu "kernel hacking".
0263 La maggior parte di queste opzioni possono essere attivate per qualsiasi
0264 kernel utilizzato per lo sviluppo o a scopo di test. In particolare dovreste
0265 attivare:
0266
0267 - FRAME_WARN per ottenere degli avvertimenti su stack frame più
0268 grandi di un dato valore. Il risultato generato da questi
0269 avvertimenti può risultare verboso, ma non bisogna preoccuparsi per
0270 gli avvertimenti provenienti da altre parti del kernel.
0271
0272 - DEBUG_OBJECTS aggiungerà un codice per tracciare il ciclo di vita di
0273 diversi oggetti creati dal kernel e avvisa quando qualcosa viene eseguito
0274 fuori controllo. Se state aggiungendo un sottosistema che crea (ed
0275 esporta) oggetti complessi propri, considerate l'aggiunta di un supporto
0276 al debugging dell'oggetto.
0277
0278 - DEBUG_SLAB può trovare svariati errori di uso e di allocazione di memoria;
0279 esso dovrebbe esser usato dalla maggior parte dei kernel di sviluppo.
0280
0281 - DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP, e DEBUG_MUTEXES troveranno un certo
0282 numero di errori comuni di sincronizzazione.
0283
0284 Esistono ancora delle altre opzioni di debugging, di alcune di esse
0285 discuteremo qui sotto. Alcune di esse hanno un forte impatto e non dovrebbero
0286 essere usate tutte le volte. Ma qualche volta il tempo speso nell'capire
0287 le opzioni disponibili porterà ad un risparmio di tempo nel breve termine.
0288
0289 Uno degli strumenti di debugging più tosti è il *locking checker*, o
0290 "lockdep". Questo strumento traccerà qualsiasi acquisizione e rilascio di
0291 ogni *lock* (spinlock o mutex) nel sistema, l'ordine con il quale i *lock*
0292 sono acquisiti in relazione l'uno con l'altro, l'ambiente corrente di
0293 interruzione, eccetera. Inoltre esso può assicurare che i *lock* vengano
0294 acquisiti sempre nello stesso ordine, che le stesse assunzioni sulle
0295 interruzioni si applichino in tutte le occasioni, e così via. In altre parole,
0296 lockdep può scovare diversi scenari nei quali il sistema potrebbe, in rari
0297 casi, trovarsi in stallo. Questa tipologia di problema può essere grave
0298 (sia per gli sviluppatori che per gli utenti) in un sistema in uso; lockdep
0299 permette di trovare tali problemi automaticamente e in anticipo.
0300
0301 In qualità di programmatore kernel diligente, senza dubbio, dovrete controllare
0302 il valore di ritorno di ogni operazione (come l'allocazione della memoria)
0303 poiché esso potrebbe fallire. Il nocciolo della questione è che i percorsi
0304 di gestione degli errori, con grande probabilità, non sono mai stati
0305 collaudati del tutto. Il codice collaudato tende ad essere codice bacato;
0306 potrete quindi essere più a vostro agio con il vostro codice se tutti questi
0307 percorsi fossero stati verificati un po' di volte.
0308
0309 Il kernel fornisce un framework per l'inserimento di fallimenti che fa
0310 esattamente al caso, specialmente dove sono coinvolte allocazioni di memoria.
0311 Con l'opzione per l'inserimento dei fallimenti abilitata, una certa percentuale
0312 di allocazione di memoria sarà destinata al fallimento; questi fallimenti
0313 possono essere ridotti ad uno specifico pezzo di codice. Procedere con
0314 l'inserimento dei fallimenti attivo permette al programmatore di verificare
0315 come il codice risponde quando le cose vanno male. Consultate:
0316 Documentation/fault-injection/fault-injection.rst per avere maggiori
0317 informazioni su come utilizzare questo strumento.
0318
0319 Altre tipologie di errori possono essere riscontrati con lo strumento di
0320 analisi statica "sparse". Con Sparse, il programmatore può essere avvisato
0321 circa la confusione tra gli indirizzi dello spazio utente e dello spazio
0322 kernel, un miscuglio fra quantità big-endian e little-endian, il passaggio
0323 di un valore intero dove ci sia aspetta un gruppo di flag, e così via.
0324 Sparse deve essere installato separatamente (se il vostra distribuzione non
0325 lo prevede, potete trovarlo su https://sparse.wiki.kernel.org/index.php/Main_Page);
0326 può essere attivato sul codice aggiungendo "C=1" al comando make.
0327
0328 Lo strumento "Coccinelle" (http://coccinelle.lip6.fr/) è in grado di trovare
0329 una vasta varietà di potenziali problemi di codifica; e può inoltre proporre
0330 soluzioni per risolverli. Un buon numero di "patch semantiche" per il kernel
0331 sono state preparate nella cartella scripts/coccinelle; utilizzando
0332 "make coccicheck" esso percorrerà tali patch semantiche e farà rapporto su
0333 qualsiasi problema trovato. Per maggiori informazioni, consultate
0334 :ref:`Documentation/dev-tools/coccinelle.rst <devtools_coccinelle>`.
0335
0336 Altri errori di portabilità sono meglio scovati compilando il vostro codice
0337 per altre architetture. Se non vi accade di avere un sistema S/390 o una
0338 scheda di sviluppo Blackfin sotto mano, potete comunque continuare la fase
0339 di compilazione. Un vasto numero di cross-compilatori per x86 possono
0340 essere trovati al sito:
0341
0342 http://www.kernel.org/pub/tools/crosstool/
0343
0344 Il tempo impiegato nell'installare e usare questi compilatori sarà d'aiuto
0345 nell'evitare situazioni imbarazzanti nel futuro.
0346
0347
0348 Documentazione
0349 --------------
0350
0351 La documentazione è spesso stata più un'eccezione che una regola nello
0352 sviluppo del kernel. Nonostante questo, un'adeguata documentazione aiuterà
0353 a facilitare l'inserimento di nuovo codice nel kernel, rende la vita più
0354 facile per gli altri sviluppatori e sarà utile per i vostri utenti. In molti
0355 casi, la documentazione è divenuta sostanzialmente obbligatoria.
0356
0357 La prima parte di documentazione per qualsiasi patch è il suo changelog.
0358 Questi dovrebbero descrivere le problematiche risolte, la tipologia di
0359 soluzione, le persone che lavorano alla patch, ogni effetto rilevante
0360 sulle prestazioni e tutto ciò che può servire per la comprensione della
0361 patch. Assicuratevi che il changelog dica *perché*, vale la pena aggiungere
0362 la patch; un numero sorprendente di sviluppatori sbaglia nel fornire tale
0363 informazione.
0364
0365 Qualsiasi codice che aggiunge una nuova interfaccia in spazio utente - inclusi
0366 nuovi file in sysfs o /proc - dovrebbe includere la documentazione di tale
0367 interfaccia così da permette agli sviluppatori dello spazio utente di sapere
0368 con cosa stanno lavorando. Consultate: Documentation/ABI/README per avere una
0369 descrizione di come questi documenti devono essere impostati e quali
0370 informazioni devono essere fornite.
0371
0372 Il file :ref:`Documentation/translations/it_IT/admin-guide/kernel-parameters.rst <kernelparameters>`
0373 descrive tutti i parametri di avvio del kernel. Ogni patch che aggiunga
0374 nuovi parametri dovrebbe aggiungere nuove voci a questo file.
0375
0376 Ogni nuova configurazione deve essere accompagnata da un testo di supporto
0377 che spieghi chiaramente le opzioni e spieghi quando l'utente potrebbe volerle
0378 selezionare.
0379
0380 Per molti sottosistemi le informazioni sull'API interna sono documentate sotto
0381 forma di commenti formattati in maniera particolare; questi commenti possono
0382 essere estratti e formattati in differenti modi attraverso lo script
0383 "kernel-doc". Se state lavorando all'interno di un sottosistema che ha
0384 commenti kerneldoc dovreste mantenerli e aggiungerli, in maniera appropriata,
0385 per le funzioni disponibili esternamente. Anche in aree che non sono molto
0386 documentate, non c'è motivo per non aggiungere commenti kerneldoc per il
0387 futuro; infatti, questa può essere un'attività utile per sviluppatori novizi
0388 del kernel. Il formato di questi commenti, assieme alle informazione su come
0389 creare modelli per kerneldoc, possono essere trovati in
0390 :ref:`Documentation/translations/it_IT/doc-guide/ <doc_guide>`.
0391
0392 Chiunque legga un ammontare significativo di codice kernel noterà che, spesso,
0393 i commenti si fanno maggiormente notare per la loro assenza. Ancora una volta,
0394 le aspettative verso il nuovo codice sono più alte rispetto al passato;
0395 inserire codice privo di commenti sarà più difficile. Detto ciò, va aggiunto
0396 che non si desiderano commenti prolissi per il codice. Il codice dovrebbe
0397 essere, di per sé, leggibile, con dei commenti che spieghino gli aspetti più
0398 sottili.
0399
0400 Determinate cose dovrebbero essere sempre commentate. L'uso di barriere
0401 di memoria dovrebbero essere accompagnate da una riga che spieghi perché sia
0402 necessaria. Le regole di sincronizzazione per le strutture dati, generalmente,
0403 necessitano di una spiegazioni da qualche parte. Le strutture dati più
0404 importanti, in generale, hanno bisogno di una documentazione onnicomprensiva.
0405 Le dipendenze che non sono ovvie tra bit separati di codice dovrebbero essere
0406 indicate. Tutto ciò che potrebbe indurre un inserviente del codice a fare
0407 una "pulizia" incorretta, ha bisogno di un commento che dica perché è stato
0408 fatto in quel modo. E così via.
0409
0410 Cambiamenti interni dell'API
0411 ----------------------------
0412
0413 L'interfaccia binaria fornita dal kernel allo spazio utente non può essere
0414 rotta tranne che in circostanze eccezionali. L'interfaccia di programmazione
0415 interna al kernel, invece, è estremamente fluida e può essere modificata al
0416 bisogno. Se vi trovate a dover lavorare attorno ad un'API del kernel o
0417 semplicemente non state utilizzando una funzionalità offerta perché questa
0418 non rispecchia i vostri bisogni, allora questo potrebbe essere un segno che
0419 l'API ha bisogno di essere cambiata. In qualità di sviluppatore del kernel,
0420 hai il potere di fare questo tipo di modifica.
0421
0422 Ci sono ovviamente alcuni punti da cogliere. I cambiamenti API possono essere
0423 fatti, ma devono essere giustificati. Quindi ogni patch che porta ad una
0424 modifica dell'API interna dovrebbe essere accompagnata da una descrizione
0425 della modifica in sé e del perché essa è necessaria. Questo tipo di
0426 cambiamenti dovrebbero, inoltre, essere fatti in una patch separata, invece di
0427 essere sepolti all'interno di una patch più grande.
0428
0429 L'altro punto da cogliere consiste nel fatto che uno sviluppatore che
0430 modifica l'API deve, in generale, essere responsabile della correzione
0431 di tutto il codice del kernel che viene rotto per via della sua modifica.
0432 Per una funzione ampiamente usata, questo compito può condurre letteralmente
0433 a centinaia o migliaia di modifiche, molte delle quali sono in conflitto con
0434 il lavoro svolto da altri sviluppatori. Non c'è bisogno di dire che questo
0435 può essere un lavoro molto grosso, quindi è meglio essere sicuri che la
0436 motivazione sia ben solida. Notate che lo strumento Coccinelle può fornire
0437 un aiuto con modifiche estese dell'API.
0438
0439 Quando viene fatta una modifica API incompatibile, una persona dovrebbe,
0440 quando possibile, assicurarsi che quel codice non aggiornato sia trovato
0441 dal compilatore. Questo vi aiuterà ad essere sicuri d'avere trovato,
0442 tutti gli usi di quell'interfaccia. Inoltre questo avviserà gli sviluppatori
0443 di codice fuori dal kernel che c'è un cambiamento per il quale è necessario del
0444 lavoro. Il supporto al codice fuori dal kernel non è qualcosa di cui gli
0445 sviluppatori del kernel devono preoccuparsi, ma non dobbiamo nemmeno rendere
0446 più difficile del necessario la vita agli sviluppatori di questo codice.