progettazione di applicazioni su larga scala in un linguaggio di basso livello

7

Ho imparato C per un po ', ma continuo a confondermi sulla progettazione di programmi di grandi dimensioni all'interno di C (una grande applicazione come il kernel di Linux).

Spostandoti da Java dove hai classi è difficile capire come progettare una grande applicazione in C.

Quali consigli / collegamenti possono consigliare le persone passando da un linguaggio di alto livello alla progettazione di applicazioni in un linguaggio di basso livello come C?

    
posta Dean 14.05.2012 - 23:53
fonte

2 risposte

4

In generale, più basso è il linguaggio, più rigoroso devi essere sullo stile. Molte delle regole dello stesso stile in qualsiasi lingua sono importanti. Mantenere le funzioni brevi Mantieni come metodi insieme. Generalizza codice ripetuto. Inoltre, il codice di livello inferiore richiede più commenti in quanto il codice è di per sé meno leggibile.

Nella maggior parte dei casi, i metodi che useresti per mantenere le cose organizzate sono più prolissi e più manuali. Fondamentalmente, in C, si ottiene qualcosa come l'incapsulamento mantenendo le funzioni correlate in un unico file sorgente e utilizzando globali statici per tutti i dati che devono condividere. Puoi usarlo per simulare i dati privati in una classe. O più correttamente, questo crea qualcosa come un "Modulo", che era la risposta del mondo di programmazione strutturata allo sviluppo di programmi su larga scala prima che OO arrivasse.

In modo simile, puoi usare lo stesso metodo di handle usato dalle librerie di sistema come fopen per creare qualcosa come una classe. Internamente disponi di una tabella che associa le maniglie ai "dati di istanza". Oppure puoi anche passare un puntatore crudo avanti e indietro.

In generale, cerca di essere il più "funzionale" possibile. Evita globals ed effetti collaterali e fai più comunicazioni possibili con il parametro passing.

Un grosso problema è che non hai alcun aiuto con la gestione della memoria, quindi devi essere molto rigoroso quando assegni e libera memoria. I dati allocati che vanno insieme dovrebbero essere legati insieme in qualche modo in modo che possano essere tutti liberati in una singola funzione destroy . Cerca di avere una struttura generale per quando le cose sono assegnate e liberate. Inoltre, alloca nello stack ogni volta che puoi. Un grande aiuto sono i nuovi array dinamici in C99.

L'altro grosso problema è la completa mancanza di classi di raccolta. Il modo migliore per risolvere questo è andare alla ricerca di soluzioni di terze parti. Non vuoi dedicare tutto il tuo tempo al debug delle implementazioni della tabella hash personalizzata.

Puoi fare tutto e implementare completamente OO facendo a mano ciò che i compilatori C ++ fanno per te. Crea classi creando le strutture con i puntatori di funzione per i metodi virtuali. È possibile utilizzare lo stesso hack C ++ per derivare le classi facendo in modo che la classe "child" abbia dei puntatori di funzione ai metodi della classe base nello stesso ordine in memoria. Questa è una cattiva idea per un vero programma, ma può essere un interessante esercizio di apprendimento.

    
risposta data 15.05.2012 - 05:37
fonte
2

Finisci per implementare gli oggetti più direttamente, senza lo zucchero sintattico. In sostanza, le strutture con i puntatori di funzione.

Hai menzionato il kernel di Linux; potresti prendere in considerazione di leggere la sua fonte alla ricerca di quel modello.

    
risposta data 15.05.2012 - 00:12
fonte

Leggi altre domande sui tag