€•ňŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒEnglish”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ/process/4.Coding”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Simplified)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/zh_CN/process/4.Coding”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/zh_TW/process/4.Coding”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ja_JP/process/4.Coding”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ko_KR/process/4.Coding”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/sp_SP/process/4.Coding”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒItalian”uh1h hhŒ _document”hŒsource”NŒline”NubhŒwarning”“”)”}”(hŒ×In caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.”h]”hŒ paragraph”“”)”}”(hŒ×In caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.”h]”(hŒˇIn caso di dubbi sulla correttezza del contenuto di questa traduzione, l’unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le ”…””}”(hhŠhžhhŸNh Nubh)”}”(hŒ!:ref:`avvertenze `”h]”hŒinline”“”)”}”(hhłh]”hŒ avvertenze”…””}”(hhˇhžhhŸNh Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-ref”eh"]”h$]”h&]”uh1hľhhąubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ#translations/it_IT/process/4.Coding”Œ refdomain”hŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆŒ reftarget”Œ it_disclaimer”uh1hhŸŒ3Documentation/translations/it_IT/disclaimer-ita.rst”h KhhŠubhŒ.”…””}”(hhŠhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸhÖh KhhŁubah}”(h]”h ]”h"]”h$]”h&]”uh1hĄhhhžhhŸhÖh NubhŒ field_list”“”)”}”(hhh]”(hŒfield”“”)”}”(hhh]”(hŒ field_name”“”)”}”(hŒOriginal”h]”hŒOriginal”…””}”(hhóhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hńhhîhŸŒQ/var/lib/git/docbuild/linux/Documentation/translations/it_IT/process/4.Coding.rst”h KubhŒ field_body”“”)”}”(hŒ>:ref:`Documentation/process/4.Coding.rst `”h]”h¨)”}”(hjh]”h)”}”(hjh]”hś)”}”(hjh]”hŒ"Documentation/process/4.Coding.rst”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”(hÁŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hľhj ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hΌ refdomain”jŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆhԌdevelopment_coding”uh1hhŸjh Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhhîubeh}”(h]”h ]”h"]”h$]”h&]”uh1hěhŸjh Khhéhžhubhí)”}”(hhh]”(hň)”}”(hŒ Translator”h]”hŒ Translator”…””}”(hj?hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hńhj<hŸjh Kubj)”}”(hŒ,Alessia Mantegazza ”h]”h¨)”}”(hŒ+Alessia Mantegazza ”h]”(hŒAlessia Mantegazza <”…””}”(hjQhžhhŸNh NubhŒ reference”“”)”}”(hŒamantegazza@vaga.pv.it”h]”hŒamantegazza@vaga.pv.it”…””}”(hj[hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:amantegazza@vaga.pv.it”uh1jYhjQubhŒ>”…””}”(hjQhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj<ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hěhŸjh Khhéhžhubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhhhžhhŸjh KubhŒtarget”“”)”}”(hŒ.. _it_development_coding:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œit-development-coding”uh1j‡h KhhhžhhŸjubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒScrivere codice corretto”h]”hŒScrivere codice corretto”…””}”(hjœhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhj—hžhhŸjh K ubh¨)”}”(hX~Nonostante ci sia molto da dire sul processo di creazione, sulla sua soliditĂ  e sul suo orientamento alla comunitĂ , la prova di ogni progetto di sviluppo del kernel si trova nel codice stesso. È il codice che sarĂ  esaminato dagli altri sviluppatori ed inserito (o no) nel ramo principale. Quindi è la qualitĂ  di questo codice che determinerĂ  il successo finale del progetto.”h]”hX~Nonostante ci sia molto da dire sul processo di creazione, sulla sua soliditĂ  e sul suo orientamento alla comunitĂ , la prova di ogni progetto di sviluppo del kernel si trova nel codice stesso. È il codice che sarĂ  esaminato dagli altri sviluppatori ed inserito (o no) nel ramo principale. Quindi è la qualitĂ  di questo codice che determinerĂ  il successo finale del progetto.”…””}”(hjŞhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K hj—hžhubh¨)”}”(hX#Questa sezione esaminerĂ  il processo di codifica. Inizieremo con uno sguardo sulle diverse casistiche nelle quali gli sviluppatori kernel possono sbagliare. Poi, l'attenzione si sposterĂ  verso "il fare le cose correttamente" e sugli strumenti che possono essere utili in questa missione.”h]”hX)Questa sezione esaminerĂ  il processo di codifica. Inizieremo con uno sguardo sulle diverse casistiche nelle quali gli sviluppatori kernel possono sbagliare. Poi, l’attenzione si sposterĂ  verso “il fare le cose correttamente” e sugli strumenti che possono essere utili in questa missione.”…””}”(hj¸hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Khj—hžhubj–)”}”(hhh]”(j›)”}”(hŒTrappole”h]”hŒTrappole”…””}”(hjÉhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhjĆhžhhŸjh Kubj–)”}”(hhh]”(j›)”}”(hŒLo stile del codice”h]”hŒLo stile del codice”…””}”(hjÚhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhj×hžhhŸjh Kubh¨)”}”(hXŘIl kernel ha da tempo delle norme sullo stile di codifica che sono descritte in :ref:`Documentation/translations/it_IT/process/coding-style.rst `. Per la maggior parte del tempo, la politica descritta in quel file è stata praticamente informativa. Ne risulta che ci sia una quantitĂ  sostanziale di codice nel kernel che non rispetta le linee guida relative allo stile. La presenza di quel codice conduce a due distinti pericoli per gli sviluppatori kernel.”h]”(hŒPIl kernel ha da tempo delle norme sullo stile di codifica che sono descritte in ”…””}”(hjčhžhhŸNh Nubh)”}”(hŒN:ref:`Documentation/translations/it_IT/process/coding-style.rst `”h]”hś)”}”(hjňh]”hŒ9Documentation/translations/it_IT/process/coding-style.rst”…””}”(hjôhžhhŸNh Nubah}”(h]”h ]”(hÁŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hľhjđubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hΌ refdomain”jţŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆhԌ codingstyle”uh1hhŸjh KhjčubhX:. Per la maggior parte del tempo, la politica descritta in quel file è stata praticamente informativa. Ne risulta che ci sia una quantitĂ  sostanziale di codice nel kernel che non rispetta le linee guida relative allo stile. La presenza di quel codice conduce a due distinti pericoli per gli sviluppatori kernel.”…””}”(hjčhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Khj×hžhubh¨)”}”(hX8Il primo di questi è credere che gli standard di codifica del kernel non sono importanti e possono non essere applicati. La veritĂ  è che aggiungere nuovo codice al kernel è davvero difficile se questo non rispetta le norme; molti sviluppatori richiederanno che il codice sia riformulato prima che anche solo lo revisionino. Una base di codice larga quanto il kernel richiede una certa uniformitĂ , in modo da rendere possibile per gli sviluppatori una comprensione veloce di ogni sua parte. Non ci sono, quindi, piĂš spazi per un codice formattato alla carlona.”h]”hX8Il primo di questi è credere che gli standard di codifica del kernel non sono importanti e possono non essere applicati. La veritĂ  è che aggiungere nuovo codice al kernel è davvero difficile se questo non rispetta le norme; molti sviluppatori richiederanno che il codice sia riformulato prima che anche solo lo revisionino. Una base di codice larga quanto il kernel richiede una certa uniformitĂ , in modo da rendere possibile per gli sviluppatori una comprensione veloce di ogni sua parte. Non ci sono, quindi, piĂš spazi per un codice formattato alla carlona.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K$hj×hžhubh¨)”}”(hXsOccasionalmente, lo stile di codifica del kernel andrĂ  in conflitto con lo stile richiesto da un datore di lavoro. In alcuni casi, lo stile del kernel dovrĂ  prevalere prima che il codice venga inserito. Mettere il codice all'interno del kernel significa rinunciare a un certo grado di controllo in differenti modi - incluso il controllo sul come formattare il codice.”h]”hXuOccasionalmente, lo stile di codifica del kernel andrĂ  in conflitto con lo stile richiesto da un datore di lavoro. In alcuni casi, lo stile del kernel dovrĂ  prevalere prima che il codice venga inserito. Mettere il codice all’interno del kernel significa rinunciare a un certo grado di controllo in differenti modi - incluso il controllo sul come formattare il codice.”…””}”(hj(hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K-hj×hžhubh¨)”}”(hXąL’altra trappola è quella di pensare che il codice giĂ  presente nel kernel abbia urgentemente bisogno di essere sistemato. Gli sviluppatori potrebbero iniziare a generare patch che correggono lo stile come modo per prendere famigliaritĂ  con il processo, o come modo per inserire i propri nomi nei changelog del kernel – o entrambe. La comunitĂ  di sviluppo vede un attivitĂ  di codifica puramente correttiva come "rumore"; queste attivitĂ  riceveranno una fredda accoglienza. Di conseguenza è meglio evitare questo tipo di patch. Mentre si lavora su un pezzo di codice è normale correggerne anche lo stile, ma le modifiche di stile non dovrebbero essere fatte fini a se stesse.”h]”hXľL’altra trappola è quella di pensare che il codice giĂ  presente nel kernel abbia urgentemente bisogno di essere sistemato. Gli sviluppatori potrebbero iniziare a generare patch che correggono lo stile come modo per prendere famigliaritĂ  con il processo, o come modo per inserire i propri nomi nei changelog del kernel – o entrambe. La comunitĂ  di sviluppo vede un attivitĂ  di codifica puramente correttiva come “rumore”; queste attivitĂ  riceveranno una fredda accoglienza. Di conseguenza è meglio evitare questo tipo di patch. Mentre si lavora su un pezzo di codice è normale correggerne anche lo stile, ma le modifiche di stile non dovrebbero essere fatte fini a se stesse.”…””}”(hj6hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K3hj×hžhubh¨)”}”(hXIl documento sullo stile del codice non dovrebbe essere letto come una legge assoluta che non può mai essere trasgredita. Se c’è un a buona ragione (per esempio, una linea che diviene poco leggibile se divisa per rientrare nel limite di 80 colonne), fatelo e basta.”h]”hXIl documento sullo stile del codice non dovrebbe essere letto come una legge assoluta che non può mai essere trasgredita. Se c’è un a buona ragione (per esempio, una linea che diviene poco leggibile se divisa per rientrare nel limite di 80 colonne), fatelo e basta.”…””}”(hjDhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K=hj×hžhubh¨)”}”(hX Notate che potete utilizzare lo strumento “clang-format” per aiutarvi con le regole, per una riformattazione automatica e veloce del vostro codice e per revisionare interi file per individuare errori nello stile di codifica, refusi e possibili miglioramenti. Inoltre è utile anche per classificare gli ``#includes``, per allineare variabili/macro, per testi derivati ed altri compiti del genere. Consultate il file :ref:`Documentation/translations/it_IT/dev-tools/clang-format.rst ` per maggiori dettagli”h]”(hX4Notate che potete utilizzare lo strumento “clang-format” per aiutarvi con le regole, per una riformattazione automatica e veloce del vostro codice e per revisionare interi file per individuare errori nello stile di codifica, refusi e possibili miglioramenti. Inoltre è utile anche per classificare gli ”…””}”(hjRhžhhŸNh NubhŒliteral”“”)”}”(hŒ ``#includes``”h]”hŒ #includes”…””}”(hj\hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjRubhŒe, per allineare variabili/macro, per testi derivati ed altri compiti del genere. Consultate il file ”…””}”(hjRhžhhŸNh Nubh)”}”(hŒP:ref:`Documentation/translations/it_IT/dev-tools/clang-format.rst `”h]”hś)”}”(hjph]”hŒ;Documentation/translations/it_IT/dev-tools/clang-format.rst”…””}”(hjrhžhhŸNh Nubah}”(h]”h ]”(hÁŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hľhjnubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hΌ refdomain”j|Œreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆhԌ clangformat”uh1hhŸjh KBhjRubhŒ per maggiori dettagli”…””}”(hjRhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KBhj×hžhubh¨)”}”(hŒöSe utilizzate un programma compatibile con EditorConfig, allora alcune configurazioni basilari come l'indentazione e la fine delle righe verranno applicate automaticamente. Per maggiori informazioni consultate la pagina: https://editorconfig.org/”h]”(hŒßSe utilizzate un programma compatibile con EditorConfig, allora alcune configurazioni basilari come l’indentazione e la fine delle righe verranno applicate automaticamente. Per maggiori informazioni consultate la pagina: ”…””}”(hj˜hžhhŸNh NubjZ)”}”(hŒhttps://editorconfig.org/”h]”hŒhttps://editorconfig.org/”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j˘uh1jYhj˜ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KKhj×hžhubeh}”(h]”Œlo-stile-del-codice”ah ]”h"]”Œlo stile del codice”ah$]”h&]”uh1j•hjĆhžhhŸjh Kubj–)”}”(hhh]”(j›)”}”(hŒLivelli di astrazione”h]”hŒLivelli di astrazione”…””}”(hjŔhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhj˝hžhhŸjh KQubh¨)”}”(hXüI professori di Informatica insegnano ai propri studenti a fare ampio uso dei livelli di astrazione nel nome della flessibilitĂ  e del nascondere informazioni. Certo il kernel fa un grande uso dell'astrazione; nessun progetto con milioni di righe di codice potrebbe fare altrimenti e sopravvivere. Ma l'esperienza ha dimostrato che un'eccessiva o prematura astrazione può rivelarsi dannosa al pari di una prematura ottimizzazione. L'astrazione dovrebbe essere usata fino al livello necessario e non oltre.”h]”hXI professori di Informatica insegnano ai propri studenti a fare ampio uso dei livelli di astrazione nel nome della flessibilitĂ  e del nascondere informazioni. Certo il kernel fa un grande uso dell’astrazione; nessun progetto con milioni di righe di codice potrebbe fare altrimenti e sopravvivere. Ma l’esperienza ha dimostrato che un’eccessiva o prematura astrazione può rivelarsi dannosa al pari di una prematura ottimizzazione. L’astrazione dovrebbe essere usata fino al livello necessario e non oltre.”…””}”(hjÎhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KThj˝hžhubh¨)”}”(hXňAd un livello base, considerate una funzione che ha un argomento che viene sempre impostato a zero da tutti i chiamanti. Uno potrebbe mantenere quell'argomento nell'eventualitĂ  qualcuno volesse sfruttare la flessibilitĂ  offerta. In ogni caso, tuttavia, ci sono buone possibilitĂ  che il codice che va ad implementare questo argomento aggiuntivo, sia stato rotto in maniera sottile, in un modo che non è mai stato notato - perchĂŠ non è mai stato usato. Oppure, quando sorge la necessitĂ  di avere piĂš flessibilitĂ , questo argomento non la fornisce in maniera soddisfacente. Gli sviluppatori di Kernel, sottopongono costantemente patch che vanno a rimuovere gli argomenti inutilizzate; anche se, in generale, non avrebbero dovuto essere aggiunti.”h]”hXöAd un livello base, considerate una funzione che ha un argomento che viene sempre impostato a zero da tutti i chiamanti. Uno potrebbe mantenere quell’argomento nell’eventualitĂ  qualcuno volesse sfruttare la flessibilitĂ  offerta. In ogni caso, tuttavia, ci sono buone possibilitĂ  che il codice che va ad implementare questo argomento aggiuntivo, sia stato rotto in maniera sottile, in un modo che non è mai stato notato - perchĂŠ non è mai stato usato. Oppure, quando sorge la necessitĂ  di avere piĂš flessibilitĂ , questo argomento non la fornisce in maniera soddisfacente. Gli sviluppatori di Kernel, sottopongono costantemente patch che vanno a rimuovere gli argomenti inutilizzate; anche se, in generale, non avrebbero dovuto essere aggiunti.”…””}”(hjÜhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K\hj˝hžhubh¨)”}”(hXI livelli di astrazione che nascondono l'accesso all'hardware - spesso per poter usare dei driver su diversi sistemi operativi - vengono particolarmente disapprovati. Tali livelli oscurano il codice e possono peggiorare le prestazioni; essi non appartengono al kernel Linux.”h]”hXI livelli di astrazione che nascondono l’accesso all’hardware - spesso per poter usare dei driver su diversi sistemi operativi - vengono particolarmente disapprovati. Tali livelli oscurano il codice e possono peggiorare le prestazioni; essi non appartengono al kernel Linux.”…””}”(hjęhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Kghj˝hžhubh¨)”}”(hXŽD'altro canto, se vi ritrovate a dover copiare una quantitĂ  significativa di codice proveniente da un altro sottosistema del kernel, è tempo di chiedersi se, in effetti, non avrebbe piĂš senso togliere parte di quel codice e metterlo in una libreria separata o di implementare quella funzionalitĂ  ad un livello piĂš elevato. Non c'è utilitĂ  nel replicare lo stesso codice per tutto il kernel.”h]”hX’D’altro canto, se vi ritrovate a dover copiare una quantitĂ  significativa di codice proveniente da un altro sottosistema del kernel, è tempo di chiedersi se, in effetti, non avrebbe piĂš senso togliere parte di quel codice e metterlo in una libreria separata o di implementare quella funzionalitĂ  ad un livello piĂš elevato. Non c’è utilitĂ  nel replicare lo stesso codice per tutto il kernel.”…””}”(hjřhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Klhj˝hžhubeh}”(h]”Œlivelli-di-astrazione”ah ]”h"]”Œlivelli di astrazione”ah$]”h&]”uh1j•hjĆhžhhŸjh KQubj–)”}”(hhh]”(j›)”}”(hŒ,#ifdef e l'uso del preprocessore in generale”h]”hŒ.#ifdef e l’uso del preprocessore in generale”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhjhžhhŸjh Kuubh¨)”}”(hXýIl preprocessore C sembra essere una fonte di attrazione per qualche programmatore C, che ci vede una via per ottenere una grande flessibilitĂ  all'interno di un file sorgente. Ma il preprocessore non è scritto in C, e un suo massiccio impiego conduce a un codice che è molto piĂš difficile da leggere per gli altri e che rende piĂš difficile il lavoro di verifica del compilatore. L'uso eccessivo del preprocessore è praticamente sempre il segno di un codice che necessita di un certo lavoro di pulizia.”h]”hXIl preprocessore C sembra essere una fonte di attrazione per qualche programmatore C, che ci vede una via per ottenere una grande flessibilitĂ  all’interno di un file sorgente. Ma il preprocessore non è scritto in C, e un suo massiccio impiego conduce a un codice che è molto piĂš difficile da leggere per gli altri e che rende piĂš difficile il lavoro di verifica del compilatore. L’uso eccessivo del preprocessore è praticamente sempre il segno di un codice che necessita di un certo lavoro di pulizia.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Kwhjhžhubh¨)”}”(hX‡La compilazione condizionata con #ifdef è, in effetti, un potente strumento, ed esso viene usato all'interno del kernel. Ma esiste un piccolo desiderio: quello di vedere il codice coperto solo da una leggera spolverata di blocchi #ifdef. Come regola generale, quando possibile, l'uso di #ifdef dovrebbe essere confinato nei file d'intestazione. Il codice compilato condizionatamente può essere confinato a funzioni tali che, nel caso in cui il codice non deve essere presente, diventano vuote. Il compilatore poi ottimizzerĂ  la chiamata alla funzione vuota rimuovendola. Il risultato è un codice molto piĂš pulito, piĂš facile da seguire.”h]”hXLa compilazione condizionata con #ifdef è, in effetti, un potente strumento, ed esso viene usato all’interno del kernel. Ma esiste un piccolo desiderio: quello di vedere il codice coperto solo da una leggera spolverata di blocchi #ifdef. Come regola generale, quando possibile, l’uso di #ifdef dovrebbe essere confinato nei file d’intestazione. Il codice compilato condizionatamente può essere confinato a funzioni tali che, nel caso in cui il codice non deve essere presente, diventano vuote. Il compilatore poi ottimizzerĂ  la chiamata alla funzione vuota rimuovendola. Il risultato è un codice molto piĂš pulito, piĂš facile da seguire.”…””}”(hj-hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Khjhžhubh¨)”}”(hX Le macro del preprocessore C presentano una serie di pericoli, inclusi valutazioni multiple di espressioni che hanno effetti collaterali e non garantiscono una sicurezza rispetto ai tipi. Se siete tentati dal definire una macro, considerate l'idea di creare invece una funzione inline. Il codice che ne risulterĂ  sarĂ  lo stesso, ma le funzioni inline sono piĂš leggibili, non considerano i propri argomenti piĂš volte, e permettono al compilatore di effettuare controlli sul tipo degli argomenti e del valore di ritorno.”h]”hXLe macro del preprocessore C presentano una serie di pericoli, inclusi valutazioni multiple di espressioni che hanno effetti collaterali e non garantiscono una sicurezza rispetto ai tipi. Se siete tentati dal definire una macro, considerate l’idea di creare invece una funzione inline. Il codice che ne risulterĂ  sarĂ  lo stesso, ma le funzioni inline sono piĂš leggibili, non considerano i propri argomenti piĂš volte, e permettono al compilatore di effettuare controlli sul tipo degli argomenti e del valore di ritorno.”…””}”(hj;hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K‰hjhžhubeh}”(h]”Œ+ifdef-e-l-uso-del-preprocessore-in-generale”ah ]”h"]”Œ,#ifdef e l'uso del preprocessore in generale”ah$]”h&]”uh1j•hjĆhžhhŸjh Kuubj–)”}”(hhh]”(j›)”}”(hŒFunzioni inline”h]”hŒFunzioni inline”…””}”(hjThžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhjQhžhhŸjh K“ubh¨)”}”(hXÚComunque, anche le funzioni inline hanno i loro pericoli. I programmatori potrebbero innamorarsi dell'efficienza percepita derivata dalla rimozione di una chiamata a funzione. Queste funzioni, tuttavia, possono ridurre le prestazioni. Dato che il loro codice viene replicato ovunque vi sia una chiamata ad esse, si finisce per gonfiare le dimensioni del kernel compilato. Questi, a turno, creano pressione sulla memoria cache del processore, e questo può causare rallentamenti importanti. Le funzioni inline, di norma, dovrebbero essere piccole e usate raramente. Il costo di una chiamata a funzione, dopo tutto, non è cosĂŹ alto; la creazione di molte funzioni inline è il classico esempio di un'ottimizzazione prematura.”h]”hXŢComunque, anche le funzioni inline hanno i loro pericoli. I programmatori potrebbero innamorarsi dell’efficienza percepita derivata dalla rimozione di una chiamata a funzione. Queste funzioni, tuttavia, possono ridurre le prestazioni. Dato che il loro codice viene replicato ovunque vi sia una chiamata ad esse, si finisce per gonfiare le dimensioni del kernel compilato. Questi, a turno, creano pressione sulla memoria cache del processore, e questo può causare rallentamenti importanti. Le funzioni inline, di norma, dovrebbero essere piccole e usate raramente. Il costo di una chiamata a funzione, dopo tutto, non è cosĂŹ alto; la creazione di molte funzioni inline è il classico esempio di un’ottimizzazione prematura.”…””}”(hjbhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K•hjQhžhubh¨)”}”(hX^In generale, i programmatori del kernel ignorano gli effetti della cache a loro rischio e pericolo. Il classico compromesso tempo/spazio teorizzato all'inizio delle lezioni sulle strutture dati spesso non si applica all'hardware moderno. Lo spazio *è* tempo, in questo senso un programma piĂš grande sarĂ  piĂš lento rispetto ad uno piĂš compatto.”h]”(hŒţIn generale, i programmatori del kernel ignorano gli effetti della cache a loro rischio e pericolo. Il classico compromesso tempo/spazio teorizzato all’inizio delle lezioni sulle strutture dati spesso non si applica all’hardware moderno. Lo spazio ”…””}”(hjphžhhŸNh NubhŒemphasis”“”)”}”(hŒ*è*”h]”hŒ蔅””}”(hjzhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jxhjpubhŒ` tempo, in questo senso un programma piĂš grande sarĂ  piĂš lento rispetto ad uno piĂš compatto.”…””}”(hjphžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh K hjQhžhubh¨)”}”(hŒóI compilatori piĂš recenti hanno preso un ruolo attivo nel decidere se una data funzione deve essere resa inline oppure no. Quindi l'uso indiscriminato della parola chiave "inline" potrebbe non essere non solo eccessivo, ma anche irrilevante.”h]”hŒůI compilatori piĂš recenti hanno preso un ruolo attivo nel decidere se una data funzione deve essere resa inline oppure no. Quindi l’uso indiscriminato della parola chiave “inline” potrebbe non essere non solo eccessivo, ma anche irrilevante.”…””}”(hj’hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KŚhjQhžhubeh}”(h]”Œfunzioni-inline”ah ]”h"]”Œfunzioni inline”ah$]”h&]”uh1j•hjĆhžhhŸjh K“ubj–)”}”(hhh]”(j›)”}”(hŒSincronizzazione”h]”hŒSincronizzazione”…””}”(hjŤhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhj¨hžhhŸjh KŹubh¨)”}”(hX˙Nel maggio 2006, il sistema di rete "Devicescape" fu rilasciato in pompa magna sotto la licenza GPL e reso disponibile per la sua inclusione nella ramo principale del kernel. Questa donazione fu una notizia bene accolta; il supporto per le reti senza fili era considerata, nel migliore dei casi, al di sotto degli standard; il sistema Deviscape offrĂŹ la promessa di una risoluzione a tale situazione. Tuttavia, questo codice non fu inserito nel ramo principale fino al giugno del 2007 (2.6.22). Cosa accadde?”h]”hXNel maggio 2006, il sistema di rete “Devicescape” fu rilasciato in pompa magna sotto la licenza GPL e reso disponibile per la sua inclusione nella ramo principale del kernel. Questa donazione fu una notizia bene accolta; il supporto per le reti senza fili era considerata, nel migliore dei casi, al di sotto degli standard; il sistema Deviscape offrĂŹ la promessa di una risoluzione a tale situazione. Tuttavia, questo codice non fu inserito nel ramo principale fino al giugno del 2007 (2.6.22). Cosa accadde?”…””}”(hjšhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KŽhj¨hžhubh¨)”}”(hXPQuel codice mostrava numerosi segnali di uno sviluppo in azienda avvenuto a porte chiuse. Ma in particolare, un grosso problema fu che non fu progettato per girare in un sistema multiprocessore. Prima che questo sistema di rete (ora chiamato mac80211) potesse essere inserito, fu necessario un lavoro sugli schemi di sincronizzazione.”h]”hXPQuel codice mostrava numerosi segnali di uno sviluppo in azienda avvenuto a porte chiuse. Ma in particolare, un grosso problema fu che non fu progettato per girare in un sistema multiprocessore. Prima che questo sistema di rete (ora chiamato mac80211) potesse essere inserito, fu necessario un lavoro sugli schemi di sincronizzazione.”…””}”(hjÇhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Kśhj¨hžhubh¨)”}”(hXçUna volta, il codice del kernel Linux poteva essere sviluppato senza pensare ai problemi di concorrenza presenti nei sistemi multiprocessore. Ora, comunque, questo documento è stato scritto su di un portatile dual-core. Persino su sistemi a singolo processore, il lavoro svolto per incrementare la capacitĂ  di risposta aumenterĂ  il livello di concorrenza interno al kernel. I giorni nei quali il codice poteva essere scritto senza pensare alla sincronizzazione sono da passati tempo.”h]”hXçUna volta, il codice del kernel Linux poteva essere sviluppato senza pensare ai problemi di concorrenza presenti nei sistemi multiprocessore. Ora, comunque, questo documento è stato scritto su di un portatile dual-core. Persino su sistemi a singolo processore, il lavoro svolto per incrementare la capacitĂ  di risposta aumenterĂ  il livello di concorrenza interno al kernel. I giorni nei quali il codice poteva essere scritto senza pensare alla sincronizzazione sono da passati tempo.”…””}”(hjŐhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Kźhj¨hžhubh¨)”}”(hXbOgni risorsa (strutture dati, registri hardware, etc.) ai quali si potrebbe avere accesso simultaneo da piĂš di un thread deve essere sincronizzato. Il nuovo codice dovrebbe essere scritto avendo tale accortezza in testa; riadattare la sincronizzazione a posteriori è un compito molto piĂš difficile. Gli sviluppatori del kernel dovrebbero prendersi il tempo di comprendere bene le primitive di sincronizzazione, in modo da sceglier lo strumento corretto per eseguire un compito. Il codice che presenta una mancanza di attenzione alla concorrenza avrĂ  un percorso difficile all'interno del ramo principale.”h]”hXdOgni risorsa (strutture dati, registri hardware, etc.) ai quali si potrebbe avere accesso simultaneo da piĂš di un thread deve essere sincronizzato. Il nuovo codice dovrebbe essere scritto avendo tale accortezza in testa; riadattare la sincronizzazione a posteriori è un compito molto piĂš difficile. Gli sviluppatori del kernel dovrebbero prendersi il tempo di comprendere bene le primitive di sincronizzazione, in modo da sceglier lo strumento corretto per eseguire un compito. Il codice che presenta una mancanza di attenzione alla concorrenza avrĂ  un percorso difficile all’interno del ramo principale.”…””}”(hjăhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KÄhj¨hžhubeh}”(h]”Œsincronizzazione”ah ]”h"]”Œsincronizzazione”ah$]”h&]”uh1j•hjĆhžhhŸjh KŹubj–)”}”(hhh]”(j›)”}”(hŒ Regressioni”h]”hŒ Regressioni”…””}”(hjühžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhjůhžhhŸjh KÎubh¨)”}”(hX"Vale la pena menzionare un ultimo pericolo: potrebbe rivelarsi accattivante l'idea di eseguire un cambiamento (che potrebbe portare a grandi miglioramenti) che porterĂ  ad alcune rotture per gli utenti esistenti. Questa tipologia di cambiamento è chiamata "regressione", e le regressioni son diventate mal viste nel ramo principale del kernel. Con alcune eccezioni, i cambiamenti che causano regressioni saranno fermati se quest'ultime non potranno essere corrette in tempo utile. È molto meglio quindi evitare la regressione fin dall'inizio.”h]”hX,Vale la pena menzionare un ultimo pericolo: potrebbe rivelarsi accattivante l’idea di eseguire un cambiamento (che potrebbe portare a grandi miglioramenti) che porterĂ  ad alcune rotture per gli utenti esistenti. Questa tipologia di cambiamento è chiamata “regressione”, e le regressioni son diventate mal viste nel ramo principale del kernel. Con alcune eccezioni, i cambiamenti che causano regressioni saranno fermati se quest’ultime non potranno essere corrette in tempo utile. È molto meglio quindi evitare la regressione fin dall’inizio.”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KĐhjůhžhubh¨)”}”(hXfSpesso si è argomentato che una regressione può essere giustificata se essa porta risolve piĂš problemi di quanti non ne crei. PerchĂŠ, dunque, non fare un cambiamento se questo porta a nuove funzionalitĂ  a dieci sistemi per ognuno dei quali esso determina una rottura? La migliore risposta a questa domanda ci è stata fornita da Linus nel luglio 2007:”h]”hXfSpesso si è argomentato che una regressione può essere giustificata se essa porta risolve piĂš problemi di quanti non ne crei. PerchĂŠ, dunque, non fare un cambiamento se questo porta a nuove funzionalitĂ  a dieci sistemi per ognuno dei quali esso determina una rottura? La migliore risposta a questa domanda ci è stata fornita da Linus nel luglio 2007:”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KŮhjůhžhubhŒdefinition_list”“”)”}”(hhh]”hŒdefinition_list_item”“”)”}”(hŒń:: Dunque, noi non sistemiamo bachi introducendo nuovi problemi. Quella via nasconde insidie, e nessuno può sapere del tutto se state facendo dei progressi reali. Sono due passi avanti e uno indietro, oppure un passo avanti e due indietro? ”h]”(hŒterm”“”)”}”(hŒ::”h]”hŒ::”…””}”(hj3hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j1hŸjh Kăhj-ubhŒ definition”“”)”}”(hhh]”h¨)”}”(hŒíDunque, noi non sistemiamo bachi introducendo nuovi problemi. Quella via nasconde insidie, e nessuno può sapere del tutto se state facendo dei progressi reali. Sono due passi avanti e uno indietro, oppure un passo avanti e due indietro?”h]”hŒíDunque, noi non sistemiamo bachi introducendo nuovi problemi. Quella via nasconde insidie, e nessuno può sapere del tutto se state facendo dei progressi reali. Sono due passi avanti e uno indietro, oppure un passo avanti e due indietro?”…””}”(hjFhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KŕhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jAhj-ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j+hŸjh Kăhj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1j&hjůhžhhŸjh Nubh¨)”}”(hŒ"(http://lwn.net/Articles/243460/).”h]”(hŒ(”…””}”(hjfhžhhŸNh NubjZ)”}”(hŒhttp://lwn.net/Articles/243460/”h]”hŒhttp://lwn.net/Articles/243460/”…””}”(hjnhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jpuh1jYhjfubhŒ).”…””}”(hjfhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Kĺhjůhžhubh¨)”}”(hXDUna particolare tipologia di regressione mal vista consiste in una qualsiasi sorta di modifica all'ABI dello spazio utente. Una volta che un'interfaccia viene esportata verso lo spazio utente, dev'essere supportata all'infinito. Questo fatto rende la creazione di interfacce per lo spazio utente particolarmente complicato: dato che non possono venir cambiate introducendo incompatibilitĂ , esse devono essere fatte bene al primo colpo. Per questa ragione sono sempre richieste: ampie riflessioni, documentazione chiara e ampie revisioni dell'interfaccia verso lo spazio utente.”h]”hXNUna particolare tipologia di regressione mal vista consiste in una qualsiasi sorta di modifica all’ABI dello spazio utente. Una volta che un’interfaccia viene esportata verso lo spazio utente, dev’essere supportata all’infinito. Questo fatto rende la creazione di interfacce per lo spazio utente particolarmente complicato: dato che non possono venir cambiate introducendo incompatibilitĂ , esse devono essere fatte bene al primo colpo. Per questa ragione sono sempre richieste: ampie riflessioni, documentazione chiara e ampie revisioni dell’interfaccia verso lo spazio utente.”…””}”(hj‡hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Kçhjůhžhubeh}”(h]”Œ regressioni”ah ]”h"]”Œ regressioni”ah$]”h&]”uh1j•hjĆhžhhŸjh KÎubeh}”(h]”Œtrappole”ah ]”h"]”Œtrappole”ah$]”h&]”uh1j•hj—hžhhŸjh Kubj–)”}”(hhh]”(j›)”}”(hŒ Strumenti di verifica del codice”h]”hŒ Strumenti di verifica del codice”…””}”(hj¨hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhjĽhžhhŸjh Kňubh¨)”}”(hX]Almeno per ora la scrittura di codice priva di errori resta un ideale irraggiungibile ai piĂš. Quello che speriamo di poter fare, tuttavia, è trovare e correggere molti di questi errori prima che il codice entri nel ramo principale del kernel. A tal scopo gli sviluppatori del kernel devono mettere insieme una schiera impressionante di strumenti che possano localizzare automaticamente un'ampia varietĂ  di problemi. Qualsiasi problema trovato dal computer è un problema che non affliggerĂ  l'utente in seguito, ne consegue che gli strumenti automatici dovrebbero essere impiegati ovunque possibile.”h]”hXaAlmeno per ora la scrittura di codice priva di errori resta un ideale irraggiungibile ai piĂš. Quello che speriamo di poter fare, tuttavia, è trovare e correggere molti di questi errori prima che il codice entri nel ramo principale del kernel. A tal scopo gli sviluppatori del kernel devono mettere insieme una schiera impressionante di strumenti che possano localizzare automaticamente un’ampia varietĂ  di problemi. Qualsiasi problema trovato dal computer è un problema che non affliggerĂ  l’utente in seguito, ne consegue che gli strumenti automatici dovrebbero essere impiegati ovunque possibile.”…””}”(hjśhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KóhjĽhžhubh¨)”}”(hX/Il primo passo consiste semplicemente nel fare attenzione agli avvertimenti proveniente dal compilatore. Versioni moderne di gcc possono individuare (e segnalare) un gran numero di potenziali errori. Molto spesso, questi avvertimenti indicano problemi reali. Di regola, il codice inviato per la revisione non dovrebbe produrre nessun avvertimento da parte del compilatore. Per mettere a tacere gli avvertimenti, cercate di comprenderne le cause reali e cercate di evitare le "riparazioni" che fan sparire l'avvertimento senza però averne trovato la causa.”h]”hX5Il primo passo consiste semplicemente nel fare attenzione agli avvertimenti proveniente dal compilatore. Versioni moderne di gcc possono individuare (e segnalare) un gran numero di potenziali errori. Molto spesso, questi avvertimenti indicano problemi reali. Di regola, il codice inviato per la revisione non dovrebbe produrre nessun avvertimento da parte del compilatore. Per mettere a tacere gli avvertimenti, cercate di comprenderne le cause reali e cercate di evitare le “riparazioni” che fan sparire l’avvertimento senza però averne trovato la causa.”…””}”(hjÄhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh KýhjĽhžhubh¨)”}”(hŒŠTenete a mente che non tutti gli avvertimenti sono disabilitati di default. Costruite il kernel con "make KCFLAGS=-W" per ottenerli tutti.”h]”hŒŽTenete a mente che non tutti gli avvertimenti sono disabilitati di default. Costruite il kernel con “make KCFLAGS=-W” per ottenerli tutti.”…””}”(hjŇhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh MhjĽhžhubh¨)”}”(hX:Il kernel fornisce differenti opzioni che abilitano funzionalitĂ  di debugging; molti di queste sono trovano all'interno del sotto menu "kernel hacking". La maggior parte di queste opzioni possono essere attivate per qualsiasi kernel utilizzato per lo sviluppo o a scopo di test. In particolare dovreste attivare:”h]”hX@Il kernel fornisce differenti opzioni che abilitano funzionalitĂ  di debugging; molti di queste sono trovano all’interno del sotto menu “kernel hacking”. La maggior parte di queste opzioni possono essere attivate per qualsiasi kernel utilizzato per lo sviluppo o a scopo di test. In particolare dovreste attivare:”…””}”(hjŕhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh M hjĽhžhubhŒ block_quote”“”)”}”(hXS- FRAME_WARN per ottenere degli avvertimenti su stack frame piĂš grandi di un dato valore. Il risultato generato da questi avvertimenti può risultare verboso, ma non bisogna preoccuparsi per gli avvertimenti provenienti da altre parti del kernel. - DEBUG_OBJECTS aggiungerĂ  un codice per tracciare il ciclo di vita di diversi oggetti creati dal kernel e avvisa quando qualcosa viene eseguito fuori controllo. Se state aggiungendo un sottosistema che crea (ed esporta) oggetti complessi propri, considerate l'aggiunta di un supporto al debugging dell'oggetto. - DEBUG_SLAB può trovare svariati errori di uso e di allocazione di memoria; esso dovrebbe esser usato dalla maggior parte dei kernel di sviluppo. - DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP, e DEBUG_MUTEXES troveranno un certo numero di errori comuni di sincronizzazione. ”h]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒ÷FRAME_WARN per ottenere degli avvertimenti su stack frame piĂš grandi di un dato valore. Il risultato generato da questi avvertimenti può risultare verboso, ma non bisogna preoccuparsi per gli avvertimenti provenienti da altre parti del kernel. ”h]”h¨)”}”(hŒöFRAME_WARN per ottenere degli avvertimenti su stack frame piĂš grandi di un dato valore. Il risultato generato da questi avvertimenti può risultare verboso, ma non bisogna preoccuparsi per gli avvertimenti provenienti da altre parti del kernel.”h]”hŒöFRAME_WARN per ottenere degli avvertimenti su stack frame piĂš grandi di un dato valore. Il risultato generato da questi avvertimenti può risultare verboso, ma non bisogna preoccuparsi per gli avvertimenti provenienti da altre parti del kernel.”…””}”(hj˙hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Mhjűubah}”(h]”h ]”h"]”h$]”h&]”uh1jůhjöubjú)”}”(hX8DEBUG_OBJECTS aggiungerĂ  un codice per tracciare il ciclo di vita di diversi oggetti creati dal kernel e avvisa quando qualcosa viene eseguito fuori controllo. Se state aggiungendo un sottosistema che crea (ed esporta) oggetti complessi propri, considerate l'aggiunta di un supporto al debugging dell'oggetto. ”h]”h¨)”}”(hX7DEBUG_OBJECTS aggiungerĂ  un codice per tracciare il ciclo di vita di diversi oggetti creati dal kernel e avvisa quando qualcosa viene eseguito fuori controllo. Se state aggiungendo un sottosistema che crea (ed esporta) oggetti complessi propri, considerate l'aggiunta di un supporto al debugging dell'oggetto.”h]”hX;DEBUG_OBJECTS aggiungerĂ  un codice per tracciare il ciclo di vita di diversi oggetti creati dal kernel e avvisa quando qualcosa viene eseguito fuori controllo. Se state aggiungendo un sottosistema che crea (ed esporta) oggetti complessi propri, considerate l’aggiunta di un supporto al debugging dell’oggetto.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Mhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jůhjöubjú)”}”(hŒ’DEBUG_SLAB può trovare svariati errori di uso e di allocazione di memoria; esso dovrebbe esser usato dalla maggior parte dei kernel di sviluppo. ”h]”h¨)”}”(hŒ‘DEBUG_SLAB può trovare svariati errori di uso e di allocazione di memoria; esso dovrebbe esser usato dalla maggior parte dei kernel di sviluppo.”h]”hŒ‘DEBUG_SLAB può trovare svariati errori di uso e di allocazione di memoria; esso dovrebbe esser usato dalla maggior parte dei kernel di sviluppo.”…””}”(hj/hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Mhj+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jůhjöubjú)”}”(hŒuDEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP, e DEBUG_MUTEXES troveranno un certo numero di errori comuni di sincronizzazione. ”h]”h¨)”}”(hŒtDEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP, e DEBUG_MUTEXES troveranno un certo numero di errori comuni di sincronizzazione.”h]”hŒtDEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP, e DEBUG_MUTEXES troveranno un certo numero di errori comuni di sincronizzazione.”…””}”(hjGhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh MhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1jůhjöubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jôhŸjh Mhjđubah}”(h]”h ]”h"]”h$]”h&]”uh1jîhŸjh MhjĽhžhubh¨)”}”(hX(Esistono ancora delle altre opzioni di debugging, di alcune di esse discuteremo qui sotto. Alcune di esse hanno un forte impatto e non dovrebbero essere usate tutte le volte. Ma qualche volta il tempo speso nell'capire le opzioni disponibili porterĂ  ad un risparmio di tempo nel breve termine.”h]”hX*Esistono ancora delle altre opzioni di debugging, di alcune di esse discuteremo qui sotto. Alcune di esse hanno un forte impatto e non dovrebbero essere usate tutte le volte. Ma qualche volta il tempo speso nell’capire le opzioni disponibili porterĂ  ad un risparmio di tempo nel breve termine.”…””}”(hjihžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh M hjĽhžhubh¨)”}”(hX'Uno degli strumenti di debugging piĂš tosti è il *locking checker*, o "lockdep". Questo strumento traccerĂ  qualsiasi acquisizione e rilascio di ogni *lock* (spinlock o mutex) nel sistema, l'ordine con il quale i *lock* sono acquisiti in relazione l'uno con l'altro, l'ambiente corrente di interruzione, eccetera. Inoltre esso può assicurare che i *lock* vengano acquisiti sempre nello stesso ordine, che le stesse assunzioni sulle interruzioni si applichino in tutte le occasioni, e cosĂŹ via. In altre parole, lockdep può scovare diversi scenari nei quali il sistema potrebbe, in rari casi, trovarsi in stallo. Questa tipologia di problema può essere grave (sia per gli sviluppatori che per gli utenti) in un sistema in uso; lockdep permette di trovare tali problemi automaticamente e in anticipo.”h]”(hŒ2Uno degli strumenti di debugging piĂš tosti è il ”…””}”(hjwhžhhŸNh Nubjy)”}”(hŒ*locking checker*”h]”hŒlocking checker”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jxhjwubhŒY, o “lockdep”. Questo strumento traccerĂ  qualsiasi acquisizione e rilascio di ogni ”…””}”(hjwhžhhŸNh Nubjy)”}”(hŒ*lock*”h]”hŒlock”…””}”(hj‘hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jxhjwubhŒ; (spinlock o mutex) nel sistema, l’ordine con il quale i ”…””}”(hjwhžhhŸNh Nubjy)”}”(hŒ*lock*”h]”hŒlock”…””}”(hjŁhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jxhjwubhŒ‰ sono acquisiti in relazione l’uno con l’altro, l’ambiente corrente di interruzione, eccetera. Inoltre esso può assicurare che i ”…””}”(hjwhžhhŸNh Nubjy)”}”(hŒ*lock*”h]”hŒlock”…””}”(hjľhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jxhjwubhXÁ vengano acquisiti sempre nello stesso ordine, che le stesse assunzioni sulle interruzioni si applichino in tutte le occasioni, e cosĂŹ via. In altre parole, lockdep può scovare diversi scenari nei quali il sistema potrebbe, in rari casi, trovarsi in stallo. Questa tipologia di problema può essere grave (sia per gli sviluppatori che per gli utenti) in un sistema in uso; lockdep permette di trovare tali problemi automaticamente e in anticipo.”…””}”(hjwhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh M%hjĽhžhubh¨)”}”(hXűIn qualitĂ  di programmatore kernel diligente, senza dubbio, dovrete controllare il valore di ritorno di ogni operazione (come l'allocazione della memoria) poichĂŠ esso potrebbe fallire. Il nocciolo della questione è che i percorsi di gestione degli errori, con grande probabilitĂ , non sono mai stati collaudati del tutto. Il codice collaudato tende ad essere codice bacato; potrete quindi essere piĂš a vostro agio con il vostro codice se tutti questi percorsi fossero stati verificati un po' di volte.”h]”hX˙In qualitĂ  di programmatore kernel diligente, senza dubbio, dovrete controllare il valore di ritorno di ogni operazione (come l’allocazione della memoria) poichĂŠ esso potrebbe fallire. Il nocciolo della questione è che i percorsi di gestione degli errori, con grande probabilitĂ , non sono mai stati collaudati del tutto. Il codice collaudato tende ad essere codice bacato; potrete quindi essere piĂš a vostro agio con il vostro codice se tutti questi percorsi fossero stati verificati un po’ di volte.”…””}”(hjÍhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh M1hjĽhžhubh¨)”}”(hXzIl kernel fornisce un framework per l'inserimento di fallimenti che fa esattamente al caso, specialmente dove sono coinvolte allocazioni di memoria. Con l'opzione per l'inserimento dei fallimenti abilitata, una certa percentuale di allocazione di memoria sarĂ  destinata al fallimento; questi fallimenti possono essere ridotti ad uno specifico pezzo di codice. Procedere con l'inserimento dei fallimenti attivo permette al programmatore di verificare come il codice risponde quando le cose vanno male. Consultate: Documentation/fault-injection/fault-injection.rst per avere maggiori informazioni su come utilizzare questo strumento.”h]”hX‚Il kernel fornisce un framework per l’inserimento di fallimenti che fa esattamente al caso, specialmente dove sono coinvolte allocazioni di memoria. Con l’opzione per l’inserimento dei fallimenti abilitata, una certa percentuale di allocazione di memoria sarĂ  destinata al fallimento; questi fallimenti possono essere ridotti ad uno specifico pezzo di codice. Procedere con l’inserimento dei fallimenti attivo permette al programmatore di verificare come il codice risponde quando le cose vanno male. Consultate: Documentation/fault-injection/fault-injection.rst per avere maggiori informazioni su come utilizzare questo strumento.”…””}”(hjŰhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh M9hjĽhžhubh¨)”}”(hXUAltre tipologie di errori possono essere riscontrati con lo strumento di analisi statica "sparse". Con Sparse, il programmatore può essere avvisato circa la confusione tra gli indirizzi dello spazio utente e dello spazio kernel, un miscuglio fra quantitĂ  big-endian e little-endian, il passaggio di un valore intero dove ci sia aspetta un gruppo di flag, e cosĂŹ via. Sparse deve essere installato separatamente (se il vostra distribuzione non lo prevede, potete trovarlo su https://sparse.wiki.kernel.org/index.php/Main_Page); può essere attivato sul codice aggiungendo "C=1" al comando make.”h]”(hXâAltre tipologie di errori possono essere riscontrati con lo strumento di analisi statica “sparse”. Con Sparse, il programmatore può essere avvisato circa la confusione tra gli indirizzi dello spazio utente e dello spazio kernel, un miscuglio fra quantitĂ  big-endian e little-endian, il passaggio di un valore intero dove ci sia aspetta un gruppo di flag, e cosĂŹ via. Sparse deve essere installato separatamente (se il vostra distribuzione non lo prevede, potete trovarlo su ”…””}”(hjéhžhhŸNh NubjZ)”}”(hŒ2https://sparse.wiki.kernel.org/index.php/Main_Page”h]”hŒ2https://sparse.wiki.kernel.org/index.php/Main_Page”…””}”(hjńhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jóuh1jYhjéubhŒI); può essere attivato sul codice aggiungendo “C=1” al comando make.”…””}”(hjéhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh MChjĽhžhubh¨)”}”(hXLo strumento "Coccinelle" (http://coccinelle.lip6.fr/) è in grado di trovare una vasta varietĂ  di potenziali problemi di codifica; e può inoltre proporre soluzioni per risolverli. Un buon numero di "patch semantiche" per il kernel sono state preparate nella cartella scripts/coccinelle; utilizzando "make coccicheck" esso percorrerĂ  tali patch semantiche e farĂ  rapporto su qualsiasi problema trovato. Per maggiori informazioni, consultate :ref:`Documentation/dev-tools/coccinelle.rst `.”h]”(hŒLo strumento “Coccinelle” (”…””}”(hj hžhhŸNh NubjZ)”}”(hŒhttp://coccinelle.lip6.fr/”h]”hŒhttp://coccinelle.lip6.fr/”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1jYhj ubhX’) è in grado di trovare una vasta varietĂ  di potenziali problemi di codifica; e può inoltre proporre soluzioni per risolverli. Un buon numero di “patch semantiche” per il kernel sono state preparate nella cartella scripts/coccinelle; utilizzando “make coccicheck” esso percorrerĂ  tali patch semantiche e farĂ  rapporto su qualsiasi problema trovato. Per maggiori informazioni, consultate ”…””}”(hj hžhhŸNh Nubh)”}”(hŒC:ref:`Documentation/dev-tools/coccinelle.rst `”h]”hś)”}”(hj'h]”hŒ&Documentation/dev-tools/coccinelle.rst”…””}”(hj)hžhhŸNh Nubah}”(h]”h ]”(hÁŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hľhj%ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hΌ refdomain”j3Œreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆhԌdevtools_coccinelle”uh1hhŸjh MLhj ubhŒ.”…””}”(hj hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh MLhjĽhžhubh¨)”}”(hX@Altri errori di portabilitĂ  sono meglio scovati compilando il vostro codice per altre architetture. Se non vi accade di avere un sistema S/390 o una scheda di sviluppo Blackfin sotto mano, potete comunque continuare la fase di compilazione. Un vasto numero di cross-compilatori per x86 possono essere trovati al sito:”h]”hX@Altri errori di portabilitĂ  sono meglio scovati compilando il vostro codice per altre architetture. Se non vi accade di avere un sistema S/390 o una scheda di sviluppo Blackfin sotto mano, potete comunque continuare la fase di compilazione. Un vasto numero di cross-compilatori per x86 possono essere trovati al sito:”…””}”(hjOhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh MThjĽhžhubjď)”}”(hŒ+http://www.kernel.org/pub/tools/crosstool/ ”h]”h¨)”}”(hŒ*http://www.kernel.org/pub/tools/crosstool/”h]”jZ)”}”(hjch]”hŒ*http://www.kernel.org/pub/tools/crosstool/”…””}”(hjehžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jcuh1jYhjaubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh MZhj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1jîhŸjh MZhjĽhžhubh¨)”}”(hŒ|Il tempo impiegato nell'installare e usare questi compilatori sarĂ  d'aiuto nell'evitare situazioni imbarazzanti nel futuro.”h]”hŒ‚Il tempo impiegato nell’installare e usare questi compilatori sarĂ  d’aiuto nell’evitare situazioni imbarazzanti nel futuro.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh M\hjĽhžhubeh}”(h]”Œ strumenti-di-verifica-del-codice”ah ]”h"]”Œ strumenti di verifica del codice”ah$]”h&]”uh1j•hj—hžhhŸjh Kňubj–)”}”(hhh]”(j›)”}”(hŒDocumentazione”h]”hŒDocumentazione”…””}”(hj˜hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhj•hžhhŸjh Maubh¨)”}”(hXpLa documentazione è spesso stata piĂš un'eccezione che una regola nello sviluppo del kernel. Nonostante questo, un'adeguata documentazione aiuterĂ  a facilitare l'inserimento di nuovo codice nel kernel, rende la vita piĂš facile per gli altri sviluppatori e sarĂ  utile per i vostri utenti. In molti casi, la documentazione è divenuta sostanzialmente obbligatoria.”h]”hXvLa documentazione è spesso stata piĂš un’eccezione che una regola nello sviluppo del kernel. Nonostante questo, un’adeguata documentazione aiuterĂ  a facilitare l’inserimento di nuovo codice nel kernel, rende la vita piĂš facile per gli altri sviluppatori e sarĂ  utile per i vostri utenti. In molti casi, la documentazione è divenuta sostanzialmente obbligatoria.”…””}”(hjŚhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Mchj•hžhubh¨)”}”(hXĆLa prima parte di documentazione per qualsiasi patch è il suo changelog. Questi dovrebbero descrivere le problematiche risolte, la tipologia di soluzione, le persone che lavorano alla patch, ogni effetto rilevante sulle prestazioni e tutto ciò che può servire per la comprensione della patch. Assicuratevi che il changelog dica *perchĂŠ*, vale la pena aggiungere la patch; un numero sorprendente di sviluppatori sbaglia nel fornire tale informazione.”h]”(hXLLa prima parte di documentazione per qualsiasi patch è il suo changelog. Questi dovrebbero descrivere le problematiche risolte, la tipologia di soluzione, le persone che lavorano alla patch, ogni effetto rilevante sulle prestazioni e tutto ciò che può servire per la comprensione della patch. Assicuratevi che il changelog dica ”…””}”(hj´hžhhŸNh Nubjy)”}”(hŒ *perchĂŠ*”h]”hŒperchĂŠ”…””}”(hjźhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jxhj´ubhŒq, vale la pena aggiungere la patch; un numero sorprendente di sviluppatori sbaglia nel fornire tale informazione.”…””}”(hj´hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Mihj•hžhubh¨)”}”(hXŸQualsiasi codice che aggiunge una nuova interfaccia in spazio utente - inclusi nuovi file in sysfs o /proc - dovrebbe includere la documentazione di tale interfaccia cosĂŹ da permette agli sviluppatori dello spazio utente di sapere con cosa stanno lavorando. Consultate: Documentation/ABI/README per avere una descrizione di come questi documenti devono essere impostati e quali informazioni devono essere fornite.”h]”hXŸQualsiasi codice che aggiunge una nuova interfaccia in spazio utente - inclusi nuovi file in sysfs o /proc - dovrebbe includere la documentazione di tale interfaccia cosĂŹ da permette agli sviluppatori dello spazio utente di sapere con cosa stanno lavorando. Consultate: Documentation/ABI/README per avere una descrizione di come questi documenti devono essere impostati e quali informazioni devono essere fornite.”…””}”(hjÔhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Mqhj•hžhubh¨)”}”(hŒëIl file :ref:`Documentation/translations/it_IT/admin-guide/kernel-parameters.rst ` descrive tutti i parametri di avvio del kernel. Ogni patch che aggiunga nuovi parametri dovrebbe aggiungere nuove voci a questo file.”h]”(hŒIl file ”…””}”(hjâhžhhŸNh Nubh)”}”(hŒ\:ref:`Documentation/translations/it_IT/admin-guide/kernel-parameters.rst `”h]”hś)”}”(hjěh]”hŒBDocumentation/translations/it_IT/admin-guide/kernel-parameters.rst”…””}”(hjîhžhhŸNh Nubah}”(h]”h ]”(hÁŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hľhjęubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hΌ refdomain”jřŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆhԌkernelparameters”uh1hhŸjh MxhjâubhŒ‡ descrive tutti i parametri di avvio del kernel. Ogni patch che aggiunga nuovi parametri dovrebbe aggiungere nuove voci a questo file.”…””}”(hjâhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Mxhj•hžhubh¨)”}”(hŒĽOgni nuova configurazione deve essere accompagnata da un testo di supporto che spieghi chiaramente le opzioni e spieghi quando l'utente potrebbe volerle selezionare.”h]”hŒ§Ogni nuova configurazione deve essere accompagnata da un testo di supporto che spieghi chiaramente le opzioni e spieghi quando l’utente potrebbe volerle selezionare.”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh M|hj•hžhubh¨)”}”(hX!Per molti sottosistemi le informazioni sull'API interna sono documentate sotto forma di commenti formattati in maniera particolare; questi commenti possono essere estratti e formattati in differenti modi attraverso lo script "kernel-doc". Se state lavorando all'interno di un sottosistema che ha commenti kerneldoc dovreste mantenerli e aggiungerli, in maniera appropriata, per le funzioni disponibili esternamente. Anche in aree che non sono molto documentate, non c'è motivo per non aggiungere commenti kerneldoc per il futuro; infatti, questa può essere un'attivitĂ  utile per sviluppatori novizi del kernel. Il formato di questi commenti, assieme alle informazione su come creare modelli per kerneldoc, possono essere trovati in :ref:`Documentation/translations/it_IT/doc-guide/ `.”h]”(hXîPer molti sottosistemi le informazioni sull’API interna sono documentate sotto forma di commenti formattati in maniera particolare; questi commenti possono essere estratti e formattati in differenti modi attraverso lo script “kernel-doc”. Se state lavorando all’interno di un sottosistema che ha commenti kerneldoc dovreste mantenerli e aggiungerli, in maniera appropriata, per le funzioni disponibili esternamente. Anche in aree che non sono molto documentate, non c’è motivo per non aggiungere commenti kerneldoc per il futuro; infatti, questa può essere un’attivitĂ  utile per sviluppatori novizi del kernel. Il formato di questi commenti, assieme alle informazione su come creare modelli per kerneldoc, possono essere trovati in ”…””}”(hj"hžhhŸNh Nubh)”}”(hŒ>:ref:`Documentation/translations/it_IT/doc-guide/ `”h]”hś)”}”(hj,h]”hŒ+Documentation/translations/it_IT/doc-guide/”…””}”(hj.hžhhŸNh Nubah}”(h]”h ]”(hÁŒstd”Œstd-ref”eh"]”h$]”h&]”uh1hľhj*ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hΌ refdomain”j8Œreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆhԌ doc_guide”uh1hhŸjh M€hj"ubhŒ.”…””}”(hj"hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh M€hj•hžhubh¨)”}”(hXÜChiunque legga un ammontare significativo di codice kernel noterĂ  che, spesso, i commenti si fanno maggiormente notare per la loro assenza. Ancora una volta, le aspettative verso il nuovo codice sono piĂš alte rispetto al passato; inserire codice privo di commenti sarĂ  piĂš difficile. Detto ciò, va aggiunto che non si desiderano commenti prolissi per il codice. Il codice dovrebbe essere, di per sĂŠ, leggibile, con dei commenti che spieghino gli aspetti piĂš sottili.”h]”hXÜChiunque legga un ammontare significativo di codice kernel noterĂ  che, spesso, i commenti si fanno maggiormente notare per la loro assenza. Ancora una volta, le aspettative verso il nuovo codice sono piĂš alte rispetto al passato; inserire codice privo di commenti sarĂ  piĂš difficile. Detto ciò, va aggiunto che non si desiderano commenti prolissi per il codice. Il codice dovrebbe essere, di per sĂŠ, leggibile, con dei commenti che spieghino gli aspetti piĂš sottili.”…””}”(hjThžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh MŒhj•hžhubh¨)”}”(hX‡Determinate cose dovrebbero essere sempre commentate. L'uso di barriere di memoria dovrebbero essere accompagnate da una riga che spieghi perchĂŠ sia necessaria. Le regole di sincronizzazione per le strutture dati, generalmente, necessitano di una spiegazioni da qualche parte. Le strutture dati piĂš importanti, in generale, hanno bisogno di una documentazione onnicomprensiva. Le dipendenze che non sono ovvie tra bit separati di codice dovrebbero essere indicate. Tutto ciò che potrebbe indurre un inserviente del codice a fare una "pulizia" incorretta, ha bisogno di un commento che dica perchĂŠ è stato fatto in quel modo. E cosĂŹ via.”h]”hXDeterminate cose dovrebbero essere sempre commentate. L’uso di barriere di memoria dovrebbero essere accompagnate da una riga che spieghi perchĂŠ sia necessaria. Le regole di sincronizzazione per le strutture dati, generalmente, necessitano di una spiegazioni da qualche parte. Le strutture dati piĂš importanti, in generale, hanno bisogno di una documentazione onnicomprensiva. Le dipendenze che non sono ovvie tra bit separati di codice dovrebbero essere indicate. Tutto ciò che potrebbe indurre un inserviente del codice a fare una “pulizia” incorretta, ha bisogno di un commento che dica perchĂŠ è stato fatto in quel modo. E cosĂŹ via.”…””}”(hjbhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh M”hj•hžhubeh}”(h]”Œdocumentazione”ah ]”h"]”Œdocumentazione”ah$]”h&]”uh1j•hj—hžhhŸjh Maubj–)”}”(hhh]”(j›)”}”(hŒCambiamenti interni dell'API”h]”hŒCambiamenti interni dell’API”…””}”(hj{hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jšhjxhžhhŸjh MŸubh¨)”}”(hXEL'interfaccia binaria fornita dal kernel allo spazio utente non può essere rotta tranne che in circostanze eccezionali. L'interfaccia di programmazione interna al kernel, invece, è estremamente fluida e può essere modificata al bisogno. Se vi trovate a dover lavorare attorno ad un'API del kernel o semplicemente non state utilizzando una funzionalitĂ  offerta perchĂŠ questa non rispecchia i vostri bisogni, allora questo potrebbe essere un segno che l'API ha bisogno di essere cambiata. In qualitĂ  di sviluppatore del kernel, hai il potere di fare questo tipo di modifica.”h]”hXML’interfaccia binaria fornita dal kernel allo spazio utente non può essere rotta tranne che in circostanze eccezionali. L’interfaccia di programmazione interna al kernel, invece, è estremamente fluida e può essere modificata al bisogno. Se vi trovate a dover lavorare attorno ad un’API del kernel o semplicemente non state utilizzando una funzionalitĂ  offerta perchĂŠ questa non rispecchia i vostri bisogni, allora questo potrebbe essere un segno che l’API ha bisogno di essere cambiata. In qualitĂ  di sviluppatore del kernel, hai il potere di fare questo tipo di modifica.”…””}”(hj‰hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh MĄhjxhžhubh¨)”}”(hXŽCi sono ovviamente alcuni punti da cogliere. I cambiamenti API possono essere fatti, ma devono essere giustificati. Quindi ogni patch che porta ad una modifica dell'API interna dovrebbe essere accompagnata da una descrizione della modifica in sĂŠ e del perchĂŠ essa è necessaria. Questo tipo di cambiamenti dovrebbero, inoltre, essere fatti in una patch separata, invece di essere sepolti all'interno di una patch piĂš grande.”•Nh]”hX˛Ci sono ovviamente alcuni punti da cogliere. I cambiamenti API possono essere fatti, ma devono essere giustificati. Quindi ogni patch che porta ad una modifica dell’API interna dovrebbe essere accompagnata da una descrizione della modifica in sĂŠ e del perchĂŠ essa è necessaria. Questo tipo di cambiamenti dovrebbero, inoltre, essere fatti in una patch separata, invece di essere sepolti all’interno di una patch piĂš grande.”…””}”(hj—hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh MŞhjxhžhubh¨)”}”(hX}L'altro punto da cogliere consiste nel fatto che uno sviluppatore che modifica l'API deve, in generale, essere responsabile della correzione di tutto il codice del kernel che viene rotto per via della sua modifica. Per una funzione ampiamente usata, questo compito può condurre letteralmente a centinaia o migliaia di modifiche, molte delle quali sono in conflitto con il lavoro svolto da altri sviluppatori. Non c'è bisogno di dire che questo può essere un lavoro molto grosso, quindi è meglio essere sicuri che la motivazione sia ben solida. Notate che lo strumento Coccinelle può fornire un aiuto con modifiche estese dell'API.”h]”hX…L’altro punto da cogliere consiste nel fatto che uno sviluppatore che modifica l’API deve, in generale, essere responsabile della correzione di tutto il codice del kernel che viene rotto per via della sua modifica. Per una funzione ampiamente usata, questo compito può condurre letteralmente a centinaia o migliaia di modifiche, molte delle quali sono in conflitto con il lavoro svolto da altri sviluppatori. Non c’è bisogno di dire che questo può essere un lavoro molto grosso, quindi è meglio essere sicuri che la motivazione sia ben solida. Notate che lo strumento Coccinelle può fornire un aiuto con modifiche estese dell’API.”…””}”(hjĽhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Mąhjxhžhubh¨)”}”(hX[Quando viene fatta una modifica API incompatibile, una persona dovrebbe, quando possibile, assicurarsi che quel codice non aggiornato sia trovato dal compilatore. Questo vi aiuterĂ  ad essere sicuri d'avere trovato, tutti gli usi di quell'interfaccia. Inoltre questo avviserĂ  gli sviluppatori di codice fuori dal kernel che c'è un cambiamento per il quale è necessario del lavoro. Il supporto al codice fuori dal kernel non è qualcosa di cui gli sviluppatori del kernel devono preoccuparsi, ma non dobbiamo nemmeno rendere piĂš difficile del necessario la vita agli sviluppatori di questo codice.”h]”hXaQuando viene fatta una modifica API incompatibile, una persona dovrebbe, quando possibile, assicurarsi che quel codice non aggiornato sia trovato dal compilatore. Questo vi aiuterĂ  ad essere sicuri d’avere trovato, tutti gli usi di quell’interfaccia. Inoltre questo avviserĂ  gli sviluppatori di codice fuori dal kernel che c’è un cambiamento per il quale è necessario del lavoro. Il supporto al codice fuori dal kernel non è qualcosa di cui gli sviluppatori del kernel devono preoccuparsi, ma non dobbiamo nemmeno rendere piĂš difficile del necessario la vita agli sviluppatori di questo codice.”…””}”(hjłhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hŸjh Mťhjxhžhubeh}”(h]”Œcambiamenti-interni-dell-api”ah ]”h"]”Œcambiamenti interni dell'api”ah$]”h&]”uh1j•hj—hžhhŸjh MŸubeh}”(h]”(Œscrivere-codice-corretto”j”eh ]”h"]”(Œscrivere codice corretto”Œit_development_coding”eh$]”h&]”uh1j•hhhžhhŸjh K Œexpect_referenced_by_name”}”jĎj‰sŒexpect_referenced_by_id”}”j”j‰subeh}”(h]”h ]”h"]”h$]”h&]”Œsource”juh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(jšNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jůŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”jŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”j”]”j‰asŒnameids”}”(jĎj”jÎjËj˘jŸjşjˇj jjNjKjĽj˘jöjójšj—j’jjujrjĆjĂuŒ nametypes”}”(jĎˆjΉj˘‰jş‰j ‰jN‰jĽ‰jö‰jš‰j’‰ju‰jƉuh}”(j”j—jËj—jŸjĆjˇj×jj˝jKjj˘jQjój¨j—jůjjĽjrj•jĂjxuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”(hŒsystem_message”“”)”}”(hhh]”h¨)”}”(hŒ`Possible incomplete section title. Treating the overline as ordinary text because it's so short.”h]”hŒbPossible incomplete section title. Treating the overline as ordinary text because it’s so short.”…””}”(hjahžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hj^ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œline”Kߌsource”juh1j\hjůhžhhŸjh Káubj])”}”(hhh]”h¨)”}”(hŒ`Blank line missing before literal block (after the "::")? Interpreted as a definition list item.”h]”hŒdBlank line missing before literal block (after the “::”)? Interpreted as a definition list item.”…””}”(hj}hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h§hjzubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jwŒline”KäŒsource”juh1j\hjCubeŒtransform_messages”]”j])”}”(hhh]”h¨)”}”(hhh]”hŒ;Hyperlink target "it-development-coding" is not referenced.”…””}”hjšsbah}”(h]”h ]”h"]”h$]”h&]”uh1h§hj—ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jwŒsource”jŒline”Kuh1j\ubaŒ transformer”NŒ include_log”]”Œ5Documentation/translations/it_IT/process/4.Coding.rst”(NNNNt”†”aŒ decoration”Nhžhub.