Peculiarità indipendenti del C++

di il
14 risposte

Peculiarità indipendenti del C++

Hola
qualcuno saprebbe dirmi a grandi linee quali sono le peculiarità del linguaggio C++ che sono dipendenti dalla piattaforma su cui si lavora (es. classi, gestione delle eccezioni, ecc)?

14 Risposte

  • Re: Peculiarità indipendenti del C++

    Il problema del C++ non e' la piattaforma, ma l'implementazione.
    Benche' esista uno standard nessun compilatore lo segue al 100%.
    Il compilatore che si allinea di piu' allo standard e' l'implementazione GNU (il cui porting su Windows e' fatta da Cygwin specificatamente la versione a 64bit!). No so il compilatore della Intel ma fino a qualche tempo fa il compilatore della Microsoft era quello meno compliant con lo standard.

    Generalmente le cose piu' banali le supportano tutti.

    Attualmente lo standard e' il C++11.

    Il GNU GCC 4.8.1 supporta tutte le caratteristiche del linguaggio e della libreria standard.

    Al compilatore della Microsoft, invece, mancano un sacco di funzionalita'

    http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx

    Comunque sono funzionalita' che possono essere simulate oppure inpattano solo sulle performance, non sull'espressivita'. Insomma, anche se non ci sono, si soppravvive lo stesso.
  • Re: Peculiarità indipendenti del C++

    Travare una risposta a questa domanda è molto difficile,nel c/c++ è tutto dipendente dalla piattaforma!
    Bisogna anche specificare meglio cosa intendi e cosa vuoi sapere e a quali piattaforme ti riferisci.
    Rimane il fatto che esistono veramente pochissime cose che si possono lasciare inalterate tra diversi compilatori e sistemi operativi.
  • Re: Peculiarità indipendenti del C++

    Quello che intendo io è se non dovessi includere nessuna libreria è possibile utilizzare tutti i costrutti del C++ su qualsiasi piattaforma come succede con il C?
  • Re: Peculiarità indipendenti del C++

    Tutto ciò che i due compilatori in esame supportano. Se un compilatore non supporta una sezione dello standard ma l'altro si, allora il tuo codice non si compilerà. Ma se non usi cose strane allora puoi avere la portabilità del codice.
  • Re: Peculiarità indipendenti del C++

    Il fatto è che leggendo degli articoli sui kernel, mi è+ sembrato di capire che per programmare un kernel in C++ alcune strutture (le funzioni virtuali per esempio e altro) non si possono usare perchè bisogna implementarle. Tutto vero o c'è altro o è tutto un complotto per depistarmi? ahahaha
  • Re: Peculiarità indipendenti del C++

    Forse perche' il kernel (ma poi di che kernel stai parlando? Linux, Android, Chrome OS???) e' scritto in C, ed il C non ha il concetto di metodo virtuale (ma di puntatore a funzione si' pero').
  • Re: Peculiarità indipendenti del C++

    Ci sono anche kernels in c++ e assembly, non parlo di uno in particolare, parlo solo del processo di programmazione di un kernel in generale e che quindi non si appoggia a niente che non sia nativo nella struttura stessa del linguaggio usato in questo caso il c++
  • Re: Peculiarità indipendenti del C++

    Se usi le librerie standard non hai problemi su s.o. diversi.
    Questo perché durante la fase di compilazione in base al so selezionato verranno utilizzate tali api.
    Ovvero ad esempio quando invochi la malloc durante la fase di compilazione o meglio nel preprocessore verra indicata quale api(funzione del kernel) usare in base alle direttive impostate.
    Naturalmente se scrivi un tuo kernel avrai una tua funzione che allochi memoria e lo dovrai specificare al compilatore a prescindere dal linguaggio utilizzato.
    Nessun complotto quindi.
  • Re: Peculiarità indipendenti del C++

    spaccaversi7 ha scritto:


    Ci sono anche kernels in c++ e assembly, non parlo di uno in particolare, parlo solo del processo di programmazione di un kernel in generale e che quindi non si appoggia a niente che non sia nativo nella struttura stessa del linguaggio usato in questo caso il c++
    Stai pasticciando (e altri ti seguono) con concetti diversi:

    In qualunque linguaggio di programmazione ci sono 2 componenti findamentali:

    1) la sintassi del linguaggio
    2) le librerie a corredo

    Ora, con la sola sintassi ci fai ben poco per il banale motivo che hai molto poco a disposizione. Al piu' hai a disposizione dei meccanismi di allocazione della memoria (nel caso del C++ gli operatori "new" e "delete"), le 4 operazioni tra interi e floating point, i meccanismi per accedere ad un membro di una struttura dati.

    E se vuoi leggere/scrivere un file? Usare la concorrenza? Usare una funzione matematica?

    Tutto questo viene fornito dalle librerie. E tali librerie possono essere fornite direttamente con il linguaggio oppure di 'terze parti'

    Ora il C ed il C++ sono sempre stati abbastanza scarsi in fatto di librerie predefinite, al contrario di Java, .NET ed i framework di ultima generazione.

    Solo ultimamente, con le STL, al C++ e' stata aggiunta una libreria per le collezioni predefinita, e con C++11 finalmente hanno aggiunto anche una libreria predefinita per la gestione dei thread.

    Questo non vuol dire che non ci siano librerie di terze parti che sono a tutti gli effetti degli standard: esiste il porting su tutte le princiali piattaforme, sono efficienti, ben documentate.

    Solo per citarne una per il C++, ad esempio c'e' 'boost': aggiunge una buona parte di quello che manca nelle librerie predefinite del C++, e' multipiattaforma, considerata uno standrd 'de facto'.

    Anche programmare a livello di Kernel (termine comunque che non vuol dire nulla per come lo intendi tu) richede la presenza di librerie predefinite che devono essere messe a disposizione.
    Poi dipende a che parte del kernel stai accedendo.

    Facciamo un esempio: vuoi implementare un nuovo tipo di file-system: in questo caso COMUNQUE ti serve una libreria che ti mette a disposizione le primitive per leggere/scrivere sul disco.

    Andiamo piu' in basso? Vuoi scrivere i driver per leggere e scrivere su un nuovo tipo di disco: ti servono le librerie per comandare la posizione della testina. E questo e' il firmware del disco

    Forse il livello piu' basso e' proprio quello a livello del firmware: qui sei a contatto diretto con l'hardware e ti serve molto poco.

    Quindi, ritornando al problema del C++ e dei metodi virtuali: il C++, a meno di un'implementazione degenere, supporta l'uso dei metodi virtuali. Supporta la derivazione multipla ed un sacco di altre cose. Se non e' possibile utilizzarli e' forse solo perche' in realta' si deve programmare in C, ma si sfrutta il compilatore C++ perche' e' molti piu' stringente in termini di flessibilita' sintattica: ad esempio si incavola parecchio se dichiari una funzione con un parametro e ne passi due. Il compilatore C, invece, e' di bocca molto piu' buona e per una cosa del genere non si lamenta.
  • Re: Peculiarità indipendenti del C++

    Migliorabile hai una gran confusione in testa.
    Tutto il discorso delle libreria è circa giusto,ma il c e il c++ mettono a disposizione del programmatore tecniche di programmazione avanzate,permettendo di programmare un intero s.o. avendo solo il compilatore che compili il proprio file(ovvero produca bytecode compatibile) senza nessuana libreria di supporto!!!
    Infatti se non erro la libreria standard è scritta nel linguaggio c per il c e c++ per il c++.
    Utilizzare il c o c++ è indifferente,anche perchè il c++ nasconde parecchie cose al programmatore, e spesso tutte quelle magie che riesce ad eseguire analizzando il codice compilato si scopre che altro non solo che semplici tecniche di programmazione.
    Una ad esempio:
    Nel c++ quando all'interno di un metodo di una classe utilizzi il comando "this" in realtà non si sta facendo niente di magico!Il compilatore tradurrà in questo modo la funzione:
    
    int classname_functionname_nnn(Object this);
    
    e quando la si va ad utilizzare il compilatore in automatico passerà l'oggetto anche se noi in realtà non lo facciamo.
    La reale potenza del c/c++ sta proprio nel fatto che con quei 4 costrutti che mettono a disposizione sono in grado di svolgere tutti i compiti di un computer.

    Per accedere poi all'hardware non è obbligatorio l'uso di una libreria,lo si può fare benissimo direttamente in c o c++.
  • Re: Peculiarità indipendenti del C++

    vbextreme ha scritto:


    Migliorabile hai una gran confusione in testa.
    Fossi in te ci andrei piano su certe affermazioni ... personalmente condivido tutto quello che ha scritto Migliorabile ...

    Al contrario, su quello che hai scritto tu ho molte perplessità a cominciare dal fatto che chiami il puntatore this "comando" ....
  • Re: Peculiarità indipendenti del C++

    vbextreme ha scritto:


    ...
    Tutto il discorso delle libreria è circa giusto,ma il c e il c++ mettono a disposizione del programmatore tecniche di programmazione avanzate,permettendo di programmare un intero s.o. avendo solo il compilatore che compili il proprio file(ovvero produca bytecode compatibile) senza nessuana libreria di supporto!!!
    Infatti se non erro la libreria standard è scritta nel linguaggio c per il c e c++ per il c++.
    Utilizzare il c o c++ è indifferente,anche perchè il c++ nasconde parecchie cose al programmatore, e spesso tutte quelle magie che riesce ad eseguire analizzando il codice compilato si scopre che altro non solo che semplici tecniche di programmazione.
    Una ad esempio:
    Nel c++ quando all'interno di un metodo di una classe utilizzi il comando "this" in realtà non si sta facendo niente di magico!Il compilatore tradurrà in questo modo la funzione:
    
    int classname_functionname_nnn(Object this);
    
    e quando la si va ad utilizzare il compilatore in automatico passerà l'oggetto anche se noi in realtà non lo facciamo.
    La reale potenza del c/c++ sta proprio nel fatto che con quei 4 costrutti che mettono a disposizione sono in grado di svolgere tutti i compiti di un computer.

    Per accedere poi all'hardware non è obbligatorio l'uso di una libreria,lo si può fare benissimo direttamente in c o c++.
    Beata gioventu'!


    Innanzitutto non sono tecniche di programmazione, ma semmai paradigmi di programmazione.

    vbextreme ha scritto:


    il c e il c++ mettono a disposizione del programmatore tecniche di programmazione avanzate
    Dirai: e' la stessa cosa!
    Si e no: utilizzare la terminologia corretta implica anche una comprensione di quello che si sta' dicendo. Usare una terminologia sbagliata o in modo non corretto invece, ....

    vbextreme ha scritto:


    ... permettendo di programmare un intero s.o. avendo solo il compilatore che compili il proprio file
    Vero: puoi programmare un intero S.O. con il solo compilatore.
    Ma se sei un programmatore (non sto dicendo tu in paricolare, ma un professionista che studia e conosce la materia), saprai anche che la prima cosa da fare e' quella di partizionare il tuo lavoro in moduli, identificare le interfaccie tra ogni modulo, ed implementare un modulo alla volta.

    Quello che fai e' crearti una libreria!
    Certo' e' una libreria che hai fatto tu e non qualcun altro. Ma sempre una libreria e'.

    Non vuoi chiamarla libreria? Ma modulo? Gerarchia di classi?
    Chiamala come vuoi ma e' sempre la setssa cosa: un qualcosa che una volta preparato puo' essere utilizzato per fare altro.

    Ora come saprai, l'utilizzo di una libreria ha i suei pregi ed i suoi diffetti:

    1) il pregio e' che qualcun altro, probabilmente piu' esperto di te (ovviamente non tu personalmente, ma del professionista di cui sopra), ha identificato un'interfaccia che descrive l'uso comune che si fa delle funzionalita' messe a disposizione dalla libreria, e ha implementato e testato la suddetta interfaccia
    2) il diffetto e' che bisogna adattarsi alla filosofia della libreria. E non e' detto che il tuo problema si adatti perfettamente a tale filosofia.

    Ora, implementare qualunque cosa senza un approccio modulare (le cosidette tecniche di programming in large) e' impossibile. Oppure si e' dei dilettanti.

    Ovviamente, non mi permetterei mai di offendere un dilettante che non sa programmare. Ma non assegnerei mai un lavoro complesso ad un dilettante, o a uno che non sa utilizzare i termini in modo corretto...

    Nota: a meno di non intendere la piattaforma .NET in cui esiste un compilatore C++ (cosi' come un compilatore Basic), la maggior parte dei compilatori C/C++ non si appoggiano ad una virtual machine e non generano bytecode compatibile.

    vbextreme ha scritto:


    ... il compilatore che compili il proprio file(ovvero produca bytecode compatibile) senza nessuana libreria di supporto!!!
    Generano codice binario eseguibile direttamente sull'hardware e sul SO per cui sono stati progettati.

    Il che non vuol dire che sia la macchina sui cui vengono utilizzati: esistono anche i 'cross compilatori'.

    Nota 2: Sarebbe interessante avere un esempio di queste miracolose techniche di programmazione che permettono di implementare un intero S.O. senza librerie di supporto.


    Nota 3: la libreria standard del C/C++ e' composta da due parti:

    1) la libreria di funzioni C, usabile sia in C che in C++, con le primitive per l'input/output, le funzioni matematiche, l'accesso al file system, le routine di allocazione della memoria. E poco altro. Ad esempio, fino al C++11 non erano presenti le funzioni per create thread. Bisognava utilizzare una libreria di terze parti come 'pthreads', oppure le api WIN32 se si era sotto Windows (e non si voleva utilizzare le MFC)

    2) le STL che utilizzano i template del C++, ed usabili solo con esso, per mettere a dispoziione una serie di collezioni, una serie di algoritmi sulle collezioni, ed una serie di oggetti per un Input/Output piu' flessibile. Ed ora anche una serie di oggetti per il supporto al threading

    Quindi non e' esatto dire (cioe' stai errando ):

    vbextreme ha scritto:


    Infatti se non erro la libreria standard è scritta nel linguaggio c per il c e c++ per il c++.
    Nota 4: altrettanto interessante e' avere un esempio di queste magie:

    vbextreme ha scritto:


    ... Utilizzare il c o c++ è indifferente,anche perchè il c++ nasconde parecchie cose al programmatore, e spesso tutte quelle magie che riesce ad eseguire analizzando il codice compilato si scopre che altro non solo che semplici tecniche di programmazione.
    C e C++ sono due linguaggi che si assomigliano dal punto di vista sintattico, ed in particolare e' stato fatto uno sforzo considerevole per far si che il C++ sia compatibile con il C.

    Ma sono due linguaggi fondamentalmente diversi, per il banale motivo che implementano due paradigmi di programmazione diversi.

    Certo, quello che si puo' fare in C++ lo si puo' fare anche in C (il contrario e' assicurato per progettazione), con un po' di fatica in piu' e con ragionevole comprensione di che cosa e' la programmazione ad oggetti. Vero, nulla di eclatante.

    Ma il paradigma di programmazione non e' sintassi ma filosofia: e' un diverso modo di approciare un problema, e un diverso modo di risolverlo.

    Ad esempio, utilizzando il paradigma della programmazione a regole (il capostipite dei linguaggi di programmazione di questo tipo e' l'OPS5) un problema verrebbe risolto in modo estremamente diverso da quello utilizzabile con la programmazione ad oggetti.

    Poi, se gratti fino ad arrivare all'hardwrae, tutto si riduce alle istruzioni macchina. Questo per dire che qualunque cosa fai con il C++ lo puoi fare anche in assembler. Vero, ovvio.

    Ma vuoi mettere ragonare per oggetti e ragionare per indirizzi di memoria? Ragionare in termini di metodi di un oggetto o in termini di subroutine?

    Quindi, non credo che l'affermazione seguente sia condivisibile:

    vbextreme ha scritto:


    ... Nel c++ quando all'interno di un metodo di una classe utilizzi il comando "this" in realtà non si sta facendo niente di magico!Il compilatore tradurrà in questo modo la funzione:

    ... La reale potenza del c/c++ sta proprio nel fatto che con quei 4 costrutti che mettono a disposizione sono in grado di svolgere tutti i compiti di un computer.
    La reale potenza del C++ sta' nel paradigma di programmazione!

    PS: se non sei perfettamente competente nella materia, non ti conviene fare affermazioni del tipo ... hai una gran confusione in testa .... E' un po' ... troppo diretta ... a fronte di troppe poche informazioni sulla controparte .
  • Re: Peculiarità indipendenti del C++

    Ops sulla this ho toppato terminologia,ma il concetto almeno lo avete capito...eheheh(lo sapete che non scrivo bene)

    Concordo sulla tecnica di modulazione della scrittura del codice.E non vorrei uscire troppo dalla discussione.
    Nota 4: altrettanto interessante e' avere un esempio di queste magie:
    Hai mai letto il codice sorgente memcpy?
    hai mai provato a scrivere la tua memcpy?
    hai testato le differenze?
    e con la la strcpy? la strcmp?
    la malloc?
    la cpu mica ti da un comando memcpy,al massimo ti da altri tipi di comandi che te lo permettono di fare, e questo lo puoi fare in assembly quanto in c o c++ senza ricorrere a nessuna "stdqualcosa".
    E questo vale per tutte le librerie standard e quant'altro.
    Ho fatto questi nomi solo perchè sono le piu semplici.
    Ovvio che per creare la malloc prima devi crearti un metodo per avere della memoria valida,e che questa sia una cosa veramente difficile e complicata è un'altro discorso.

    Concordo anche sulle affermazioni tra c e c++.

    Il concetto sulla confusione era riferito al fatto che nel tuo precedente post ti riferisci sempre al fatto che hai bisogno di librerie di terze parti,ma questo non è necessariamente vero,puoi scrivere un sistema operativo in un unico file.c ovvio che nessuno è psicopatico e quindi nessuno lo fa ma lo si può fare,il concetto che avevo capito è che sei obbligato ad avere librerie e dal di li è nata la mia affermazione.(compresa questa affermazione)
    Al piu' hai a disposizione dei meccanismi di allocazione della memoria (nel caso del C++ gli operatori "new" e "delete")
    Tecnicamente al livello che stiamo parlando non hai nemmeno la new e la delete perchè dovresti avere una funzione che allochi la memoria.
    Spero di essermi riuscito a spiegare,e sopratutto non volevo offenderti.
  • Re: Peculiarità indipendenti del C++

    Innanzitutto mi vedo d'accordo con entrambi. Secondo se non ho capito male, da quello che ho trovato in giro per la rete. Nel C++ ci sono delle peculiarità/costrutti comuni che non possono essere utilizzati nell'ambito della programmazione (per esempio di un S.O. senza l'appoggio di librerie, perchè appunto dovresti riscrivertele tutte) sono quelle che necessitano del supporto di runtime come le funzioni virtuali. Inoltre alcune keyword del C++ come new e delete non possono essere usate direttamente se non vongono implementate particolari funzioni che gestiscono la memoria dinamica (vedi malloc(), realloc(), free() )
Devi accedere o registrarti per scrivere nel forum
14 risposte