Esiste un linguaggio tra C e C ++?


18

Mi piace molto la natura semplice e trasparente di C: quando scrivo il codice C mi sento libero da "astrazioni che perdono" e quasi sempre riesco a fare un'ipotesi accorta sull'assemblaggio che sto producendo. Mi piace anche la sintassi semplice e familiare per C.

Tuttavia, C non ha questi doodle semplici e utili che C ++ offre come classi, gestione semplificata senza cstring, ecc. So che è possibile implementare in C usando le tabelle di salto e simili, ma a volte è un po 'prolisso e non molto sicuro per vari motivi.

Non sono un fan dell'enfasi eccessiva sugli oggetti in C ++, e sono timida del "nuovo" operatore e simili. Il C ++ sembra avere solo troppi singhiozzi da utilizzare, ad esempio, come linguaggio di programmazione del sistema.

Esiste un linguaggio compreso tra C e C ++ sulla scala dei widget e dei disegni?

Disclaimer: intendo questo come una domanda puramente fattuale. Non ho intenzione di farti arrabbiare perché non condivido la tua opinione che C {, ++} sia abbastanza buono da fare qualunque cosa io stia pianificando.


10
Dici che la tua domanda è "puramente fattuale", ma stai scontando c ++ perché "sembra" avere troppi singhiozzi. Cosa sono questi singhiozzi e sono validi motivi per scontare c ++?
whatsisname

2
Qual è la "scala di widget e doodle"? Se vuoi risposte reali a una domanda "puramente fattuale", dovresti evitare metriche insignificanti.
Caleb,

2
E le poche cose che affermi sul C ++ tradiscono una disinformazione. newè principalmente un potenziamento mallocche può anche occuparsi di inizializzare la memoria per te. Con "posizionamento nuovo" e operator new, puoi decidere come e dove allocare memoria. E per quanto riguarda l'enfasi sull'oggetto: alcune righe sopra di te affermano che consideri le classi un "semplice e utile scarabocchio". Decidi!

25
Usa C+ Diclaimer: Siamo spiacenti, non potrei essere t resist. Itil 1 ° aprile;)
annodare l'

2
Questo suona moltissimo come l'ipotesi del continuum, e probabilmente con la stessa risposta. ( en.wikipedia.org/wiki/Continuum_hypothesis )
John Smith

Risposte:


29

Questi potrebbero essere i droidi che stai cercando ...

Vai - http://golang.org/

D - http://dlang.org/

Rust - http://rust-lang.org/


5
@dtech: D ha quel GC inutile / "Tutto ciò che eredita dall'oggetto" / I valori devono aspirare merda. Ho già ottenuto C # per questo e in realtà ha strumenti decenti. Vai, ammetto che il mio ricordo del motivo per cui l'ho scartato è un po 'confuso, ma come ricordo, ha tagliato diverse funzioni molto utili.
DeadMG

4
-1 per "quello che C ++ avrebbe dovuto essere". Il C ++ è quello che è e se non puoi gestirlo, questo è in gran parte il tuo problema. Puoi gestirlo usando un linguaggio che ti si addice meglio, ma ciò non significa che C ++ avrebbe dovuto essere come quella lingua.
back2dos

7
@DeadMG Su D, hai fatto 2 dichiarazioni significative: GC è obbligatorio e tutto deve essere un oggetto. Entrambi hanno torto. Mi porta a pensare che la tua conclusione sia più basata sull'ignoranza che sulla conoscenza effettiva. Sono d'accordo con CodexArcanum.
deadalnix,

5
@deadalnix: tecnicamente, puoi scegliere di non usare il GC. Ma dal momento che non hai modo di sapere o controllare quali funzioni di libreria o funzionalità del linguaggio utilizzano il GC, non c'è realisticamente alcun modo per produrre un programma che non lo utilizza. E non puoi creare una classe che non erediti da Object. E i loro structs sono seriamente ostacolati rispetto ai valori C ++: nessuna eredità, nessun riferimento al valore, per esempio, quindi è impossibile produrre qualcosa di semplice come una classe di stringhe di valore in D che sia efficiente quanto l'equivalente in C ++. Questi sono fatti sul linguaggio D.
DeadMG

5
@DeadMG: la creazione di strutture senza ereditarietà è una caratteristica , non un "ostacolo". È qualcosa che hanno fatto bene, qualcosa che praticamente tutti i linguaggi OO nella storia non chiamati "C ++" hanno fatto bene (incluso Simula, il linguaggio originale OO) e che C ++ ha incredibilmente sbagliato. Ereditarietà e tipi di valore non si mescolano. Rompe l'identità dell'oggetto, rompe la sostituzione di Liskov, rompe l'intero paradigma OO.
Mason Wheeler

19

Esistono alcuni linguaggi (ad esempio Java, Go, D, Objective-C) che sono approssimativamente paralleli al C ++ o tentano di risolvere i problemi che gli autori hanno riscontrato con C ++.

Almeno l'IMO, tuttavia, tutti funzionano sostanzialmente al di sotto del C ++ per scopi pratici.

Sfortunatamente, in base al tuo apparente gusto di sapere quale codice assembly verrà prodotto, possiamo probabilmente escludere immediatamente Objective C e Java.

Teoricamente, considererei Go il più interessante di questi - ha alcune idee davvero originali e approcci interessanti per risolvere problemi che rendono molto più facile qualche tipo di codice. Sfortunatamente, i compilatori attuali non producono un ottimo codice, e non ci sono stati molti miglioramenti in questo senso negli ultimi anni.

Questo lascia praticamente D come l'unico che ha una possibilità. Probabilmente è il più simile al C ++ (di questi), ma anche il meno probabile (IMO) per risolvere ciò che sembra vedere come un problema.

Ciò lascia un approccio ovvio: usa C ++, ma usa solo le parti che desideri ed evita quelle che non ti piacciono.


13
+1 per "usa C ++ ed evita le parti che non ti piacciono". E suggerirei all'OP di saperne di più sul C ++, le persone spesso rifiutano le cose solo perché non le conoscono abbastanza bene.
Doc Brown,

1
@DocBrown Forse è perché non è così facile conoscere C ++ abbastanza bene.
Malcolm,

3
@Malcolm: ovviamente è difficile imparare il C ++ moderno in modo approfondito. D'altra parte, non c'è assolutamente motivo di essere "timido nei confronti del nuovo operatore", che suona solo per me superstizioso.
Doc Brown,

3
@Malcolm: Probabilmente perché il concetto è molto semplice . È necessario un valore letterale stringa UTF-32 o un valore letterale stringa UTF-16? Bene, questa è una domanda abbastanza semplice a cui rispondere, supponendo che tu sappia le basi delle codifiche di stringa wtf. E quella moltitudine di funzioni difficili? Esistono per un motivo . Ad esempio, i generici di Java. Sono patetici rispetto ai modelli. Certo, c'è meno da imparare, ma è semplicemente perché non sono molto utili. È come chiamare difficile qualcosa di più complesso di Brainfuck.
DeadMG

3
@Malcolm: non è affatto vero. La popolarità è influenzata da 99999 cose a prescindere dal fatto che la lingua sia buona o utile.
DeadMG

16

Tuttavia, C non ha questi doodle semplici e utili che C ++ offre come classi, gestione semplificata senza cstring, ecc. So che è possibile implementare in C usando le tabelle di salto e simili, ma a volte è un po 'prolisso e non molto sicuro per vari motivi.

Non sono un fan dell'enfasi eccessiva sugli oggetti in C ++, e sono timida del "nuovo" operatore e simili.

Scusa, amico, allarme di contraddizione. È richiesta una gestione senza strattature new. È una necessità fondamentale. Non puoi avere std::stringsenza new. Inoltre, new/ deleteè esattamente equivalente a malloc/ freema più sicuro , perché garantisce la corretta costruzione e distruzione di oggetti heap (assolutamente necessario!) E utilizza la gestione delle eccezioni anziché un NULLritorno, ed è quindi superiore in ogni modo immaginabile. In C ++ 11 è molto possibile scrivere la propria newfunzione di stile, poiché l'inoltro perfetto consente di gestire qualsiasi costruttore di qualsiasi tipo. Se sei timido con la pistola new, allora ti suggerisco di non sapere davvero con cosa hai a che fare.

Oh, sì, e i puntatori intelligenti lo fanno in modo che tu non debba mai, in realtà, affrontare nulla di tutto questo da solo.

Inoltre, in C ++ non c'è eccessiva enfasi. Non è necessario utilizzare alcun oggetto che non si desidera. Puoi programmare funzionalmente con lambdas e così ogni volta che vuoi. Nessuno ti sta costringendo a usare l'ereditarietà e le funzioni virtuali, infatti, molti buoni programmi C ++ raramente mostrano ereditarietà. I modelli sono la tecnica di astrazione più potente e più utile. Questo non è Java.


1
Sono d'accordo. È molto meglio usare C ++ nel modo desiderato piuttosto che cercare un'alternativa (probabilmente inferiore)
dtech

1
Non penso che i lambda siano sufficienti per programmare in modo funzionale. Mi aspetterei anche di avere un operatore di composizione di funzioni, curry e così via. Vedi anche stackoverflow.com/questions/1981400/functional-programming-in-c . Per me sembra quasi di fare OOP in C ...
Giorgio

@Giorgio: le risposte a questa domanda dicono "È difficile!". Non mostrano alcuna prova che sia effettivamente difficile . Perché vorresti un operatore separato per la composizione delle funzioni? f(g(x))sembra funzionare bene per me. E credo anche che il curry possa essere fatto come una libreria genericamente in C ++ 11.
DeadMG

1
@DeadMG: un operatore di composizione di funzioni è un concetto di base abbastanza ben definito nella programmazione funzionale. Mi aspetterei di trovarlo in una lingua a sostegno del PQ. Trovo molto conveniente (conciso) definire una funzione complessa come composizione di altre funzioni (ad es. Come si fa con le pipe in Unix) senza usare le variabili: k = h. g. f
Giorgio

1
@Giorgio: std::bindsupporta queste cose.
DeadMG

4

C è quasi un sottoinsieme di C ++, quindi potresti semplicemente usare quelle parti di C ++ che ti piacciono e ignorare il resto. È anche possibile scrivere C valido che è anche C ++ valido.

Non scriverai C ++ idiomatico, ma è "in mezzo" come si arriva.

In alternativa, puoi controllare altre lingue che provano ad estendere C verso qualcosa di più potente, in particolare D e Objective-C.

Infine, a seconda della natura del progetto, puoi scegliere un approccio poliglotta: dividi il progetto in moduli e scegli la lingua più adatta per ogni parte. Il rovescio della medaglia di questo è che è necessario far lavorare insieme le lingue, il che potrebbe essere troppo lavoro per valere la pena.


In effetti, lavorando in settori come lo sviluppo di giochi per console, dove volevamo davvero "un linguaggio tra C e C ++", è esattamente quello che abbiamo fatto. Abbiamo usato un sottoinsieme di funzionalità C ++, con alcune cose off-limits o più probabilmente off-limits all'interno di loop critici per le prestazioni.
Carson63000,

3

Solo per offrire una risposta fuori dagli schemi: se la lingua che desideri non esiste, perché non crearne una tu? Esistono numerosi potenti strumenti di sviluppo del linguaggio, proprio nei vecchi stand-by di (F) Lex e Yacc / Bison. Dato che conosci già C, hai solo bisogno del tuo "compilatore" per generare il codice C, per il quale usi la catena di strumenti esistente.

Questo può essere sia più semplice che più potente di quanto pensi. Inizia con un parser / lexer per C, quindi aggiungi le funzionalità extra che ritieni importanti. Se le tabelle di salto sono fastidiose da scrivere a mano, trova un costrutto per esprimere l'abstract e lascia che l'interprete le scriva per te. In sostanza, si tratta solo di un livello superiore di metaprogrammazione pre-processore, che utilizza strumenti esterni per eseguire la metaprogrammazione. Saprai sempre esattamente come sarà l'assemblaggio finale dal momento che conosci la C e sai in che C si espanderanno le tue estensioni di lingua.

Ovviamente ci sono alcune limitazioni a quanto possa essere efficace questo senza molto lavoro extra. L'aggiunta di un sistema di tipo statico completo potrebbe essere un po 'più complessa di quanto si desideri entrare, ma è un'opzione che potresti esplorare se scopri di avere un gusto per questo. Le tue estensioni DSL sono potenti e complesse quanto hai tempo ed energia per realizzarle e, chissà, forse un giorno il tuo linguaggio di estensione diventerà "il prossimo C ++".


2

Non hai detto quali sono le caratteristiche C ++ che ti danno fastidio. comunque potresti provare Objective-C. Sottolinea su Object Oriented invece di Standard Library su C ++.


2
imho Objective-C è un misero tentativo di introdurre classi in C e inferiori in molti modi a C ++. Inoltre è molto poco utilizzato al di fuori di Mac OS X / iOS.
dtech,

1
@dtech: Interessante, un mio ex collega, che non è un fan di Mac (piuttosto un ragazzo Debian / Linux) era convinto che Objective-C fosse un'estensione OO molto più pulita di C rispetto a C ++. Non ho mai provato Objective-C, quindi non ho un'opinione al riguardo.
Giorgio

1
@dtech: Allora ti consiglio umilmente di riconsiderare la tua opinione;) Objective-C riguarda l'orientamento agli oggetti, e fa un lavoro molto migliore rispetto a C ++, perché introduce il passaggio dei messaggi. Mentre sono d'accordo sul fatto che il linguaggio sia inferiore al C ++ in molti modi, è altrettanto superiore in altri modi.
back2dos

@Giorgio Concordo con il tuo collega, anche se Obj-C ha anche dei limiti (forse alcuni di questi sono stati eliminati con Obj-C 2.0), ad es. Vorrei avere un sovraccarico di "metodi" (selettori) - a proposito vorrei sovraccarico della Fortran in C ...
ShinTakezou

2

Il mondo embedded ha specificato Embedded C ++ , che potrebbe essere quello che stai cercando. Hanno rimosso cose come eredità multipla e simili. Per quanto ne so, è praticamente scomparso però.


0

Potresti trovare utile questo confronto approfondito side-by-side di C ++, Objective-C, Java e C # . Personalmente penso che C # sia molto più pulito con cui lavorare rispetto a C ++. Ho portato diverse funzioni C (numeriche / di calcolo) su C # prima senza che fossero necessarie troppe modifiche a causa della somiglianza della sintassi e dei tipi di dati numerici.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.