La C è stata progettata per facilitare la programmazione orientata agli oggetti?

5

Sto cercando di ampliare la mia comprensione della storia e dello sviluppo della programmazione orientata agli oggetti, e sono curioso di scoprirlo se C è stato progettato per facilitare la programmazione orientata agli oggetti? (come C ++ e Objective-C sicuramente lo sono) o se lo fosse, al contrario , semplicemente un intelligente sfruttamento dei costrutti del linguaggio.

Non riesco a trovare alcuna fonte, tra cui K & R , in cui gli autori originali commentano questo approccio.

Recentemente ho esaminato l'OOP in ANSI-C, che è descritto in Programmazione orientata agli oggetti con ANSI-C di Axel Schreiner .

Per una versione PDF disponibile gratuitamente visita link .

Un approccio leggermente diverso viene utilizzato nella parte del kernel Linux che si occupa di file system, visitare il link per maggiori informazioni.

L'idea comune è di mettere function pointers in un struct insieme a fields per "emulare" un class "metodi e data members .

Cronologia

Da Wikipedia.org/wiki/Object-oriented_programming#History

Objects as a formal concept in programming were introduced in the 1960s in Simula 67

Mentre Wikipedia.org/wiki/C_programming#K.26R_C afferma che

In 1978, Brian Kernighan and Dennis Ritchie published the first edition of The C Programming Language.

La cronologia sembra suggerire che K & R doveva essere ben consapevole di OOP.

Quindi ancora:

La C è stata progettata per facilitare la programmazione orientata agli oggetti?

    
posta Einar 29.04.2013 - 16:21
fonte

4 risposte

14

Versione breve: C era prima del tempo di OOP, quindi non era una scelta di design.

La programmazione orientata agli oggetti, OOP, è una vecchia idea. Ma come fenomeno culturale è decollato solo negli anni '80 e '90. Come qualcuno nato negli anni '80, direi che è stato il C ++ a lanciare l'hype, impostare la tendenza, avviare la parola d'ordine, o altrimenti far decollare OOP. Ciò lo ha trasformato da un progetto accademico per animali domestici a qualcosa che le imprese cercavano nei curricula. E questo è il tipo di dichiarazione dell'ignoranza che porterà le barbe grigie a uscire dalla falegnameria, sostenendo che era davvero Delphi o qualche altra lingua che era l'accenditore. E saranno contrastati dagli storici che possono mostrare che alcuni italiani del Rinascimento avevano prima il concetto di oggetti orientati. E il tutto finisce in fiamme. Ma fidati di me, OOP è decollato molto bene dopo la progettazione di C.

Cronologia a parte, C è un linguaggio di basso livello e come tale può implementare quasi tutto ciò che le lingue di livello superiore danno per scontato. Puoi implementare un sistema che agisce come ereditarietà del C ++. È possibile implementare un sistema che funzioni come la riflessione di Java. A prescindere dai pazzi modelli di design che questi giovani whippersnapper escogitano nella loro fantasia, i nuovi linguaggi saranno probabilmente implementabili in C. Che sia o meno un buona idea , è un altro problema.

    
risposta data 29.04.2013 - 17:43
fonte
2

Sebbene l'idea di OOP esistesse prima dello sviluppo di C, con Simula che precede C di 5 anni circa, nessuno dei costrutti linguistici di C incoraggia e facilita attivamente OOP. Questo non significa che non puoi fare OOP, devi solo crearlo da solo. Due esempi che vengono subito in mente sono i primi compilatori C ++ che emettono codice C & L'ampio uso del progetto Gnome di GObject per portare oggetti agli sviluppatori C.

    
risposta data 08.08.2013 - 00:03
fonte
1

L'idea di "puntatori di funzione in una struttura insieme a campi" è una versione di "programmazione modulare", che è ciò che è venuto tra "programmazione strutturata" e "programmazione orientata agli oggetti"

C e Pascal non erano linguaggi "di programmazione modulare". Pascal andò a Modula, Delphi e ADA, che erano, tra le altre cose, linguaggi di programmazione modulare, ma C non ci andò mai. Invece, C alla fine saltò direttamente al passo successivo, C ++, un linguaggio orientato agli oggetti.

Molte persone hanno subito notato che il C ++ era "una C migliore". Ci sono un paio di motivi per questo, ma penso che sia stato principalmente a causa del supporto per la programmazione modulare.

In C, il modulo / oggetto di base è l'unità File / Compilation. In C ++ c'è il supporto del linguaggio per suddividere il tuo codice in moduli (oggetti). Potresti chiamare questo OO, ma se non usi l'ereditarietà o il polimorfismo, il tuo OO è solo l'incapsulamento che tutti gli altri avevano già, e nessuno pensava che Modula fosse un linguaggio di programmazione orientato agli oggetti.

Ovviamente è possibile eseguire la programmazione modulare in C e in ISO Pascal, ma è possibile eseguire la programmazione OO e generica in BASIC interpretato. Ciò che intendiamo quando diciamo che C ++ è una lingua OO è che la lingua fa per te, non che puoi farlo alla lingua.

Per me, il punto semplice è che quando esegui OO in Pascal, dovevo scrivere i miei vtables. È lo stesso in C: se vuoi una tabella dei metodi virtuale, devi mantenerla tu stesso. Così è stato progettato C per facilitare l'OOP? Se lo fosse, dove alle vtables? Cadit quaestio.

BTW, C ++ è un linguaggio di programmazione generico, nonché modulare e OO. La programmazione generica ha un pedigree ancora più lungo, ma ...

    
risposta data 08.08.2013 - 11:36
fonte
0

C (e anche C ++) è iniziato a AT & T. Il loro switch telefonico 5ESS era uno dei primi utenti di C, e utilizza sicuramente C e OOP. I due lati di una chiamata (oggetti Originating Party e Terminating Party) potevano scambiarsi messaggi e c'era una grande sovrapposizione nell'insieme di messaggi utilizzati. Tuttavia, non ha usato le tecniche che descrivi qui. Era tutto codificato a mano.

Quindi, l'OOP risale ai primi giorni di C, le due tecniche sono state combinate in un singolo prodotto, e K & R deve averlo saputo. Eppure non hanno facilitato l'OOP in C come veniva usato in quel momento, nella loro compagnia.

    
risposta data 08.08.2013 - 13:50
fonte

Leggi altre domande sui tag