Esiste una lingua tra C e C ++?

18

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

Tuttavia C non ha queste semplici e utili decorazioni che il C ++ offre classi simili, una gestione semplificata di non cstring, ecc. So che è possibile implementarlo in C usando le tabelle di salto e simili, ma è un po ' prolisso a volte, e non molto sicuro per vari motivi.

Non sono un fan dell'eccessiva enfasi sugli oggetti in C ++, però, e sono intimidito dal "nuovo" operatore e simili. Il C ++ sembra avere solo troppi problemi, ad esempio, per essere usato come linguaggio di programmazione di sistema.

Esiste un linguaggio che si trova tra C e C ++ sulla scala dei widget e delle decorazioni?

Disclaimer: intendo questa come una domanda puramente fattuale. Non ho intenzione di farti arrabbiare perché non condivido il tuo punto di vista sul fatto che C {, ++} sia abbastanza buono da fare tutto ciò che sto pianificando.

    
posta Robert Martin 01.04.2012 - 06:00
fonte

8 risposte

29

Questi potrebbero essere i droidi che stai cercando ...

Vai - link

D - link

Rust - link

    
risposta data 01.04.2012 - 06:08
fonte
19

Ci sono alcune lingue (ad es. Java, Go, D, Objective-C) che sono o più o meno parallele al C ++, o tentano di risolvere problemi che gli autori hanno visto con C ++.

Almeno IMO, comunque, tutti funzionano in modo sostanzialmente inferiore a C ++ per la maggior parte degli scopi pratici.

Sfortunatamente, sulla base del tuo apparente gusto per sapere quale codice di assemblaggio verrà prodotto, possiamo probabilmente escludere immediatamente Objective C e Java.

In teoria, ritengo che Go sia il più interessante di questi: ha alcune idee veramente originali e approcci interessanti alla risoluzione di problemi che rendono molto più semplice alcuni tipi di codice. Sfortunatamente, i compilatori attuali non producono codice molto buono e negli ultimi anni non ci sono stati molti miglioramenti.

Questo lascia praticamente a D l'unico che abbia una possibilità. Probabilmente è il più simile al C ++ (di questi), ma anche il meno probabile (IMO) per correggere quelli che sembri vedere come problemi.

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

    
risposta data 01.04.2012 - 07:17
fonte
16

However, C doesn't have these simple, helpful doodads that C++ offers like classes, simplified non-cstring handling, etc. I know that it's all possible to implement in C using jump tables and the like, but that's a bit wordy at times, and not very type-safe for various reasons.

I'm not a fan of the over-emphasis on objects in C++, though, and I'm gun shy of the 'new' operator and the like.

Mi dispiace, amico, allarme di contraddizione. La gestione non cstring richiede new . È una necessità fondamentale. Non puoi avere std::string senza new . Inoltre, new / delete equivale esattamente a malloc / free ma più sicuro , perché garantisce la corretta costruzione e distruzione di oggetti heap (assolutamente necessari!) E utilizza la gestione delle eccezioni invece di un NULL di ritorno, ed è quindi superiore in ogni modo immaginabile. In C ++ 11 è molto possibile scrivere la propria funzione new -style, perché l'inoltro perfetto consente di trattare qualsiasi costruttore di qualsiasi tipo. Se sei timido su new , allora ti suggerisco di non sapere esattamente con cosa hai a che fare.

Oh, sì, e i puntatori intelligenti fanno in modo che tu non debba mai e poi mai occuparsi di niente di tutto ciò.

Inoltre, in C ++ non c'è eccessiva enfasi. Non devi usare nessun oggetto che non vuoi. Puoi programmare in modo funzionale con lambda e ogni volta che lo desideri. Nessuno ti obbliga a usare l'ereditarietà e le funzioni virtuali - in effetti, molti buoni programmi C ++ mostrano raramente eredità. I modelli sono la tecnica di astrazione più potente e più utile. Questo non è Java.

    
risposta data 01.04.2012 - 10:10
fonte
4

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

Non scriverai C ++ idiomatico, ma è "in-between".

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

E infine, a seconda della natura del progetto, puoi adottare un approccio poliglotta: dividi il tuo progetto in moduli e scegli la lingua più adatta per ogni parte. Il rovescio della medaglia di questo è che devi far lavorare le lingue insieme, il che potrebbe essere troppo lavoro per meritare lo sforzo.

    
risposta data 01.04.2012 - 14:37
fonte
3

Solo per offrire una risposta selvaggia, pronta per l'uso: se la lingua che desideri non esiste, perché non crearne una tu stesso? Ci sono una varietà di potenti strumenti per lo sviluppo del linguaggio là fuori, proprio nei vecchi stand-by di (F) Lex e Yacc / Bison. Dato che conosci già C, hai solo bisogno del tuo "compilatore" per l'output del codice C, che poi usi per 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 siano importanti. Se i tavoli di salto sono noiosi di scrivere a mano, immagina un costrutto per esprimere l'astratto e lascia che il tuo interprete li scriva per te. Essenzialmente questo è solo un livello superiore di metaprogrammazione del pre-processore, usando strumenti esterni per eseguire la metaprogrammazione. Saprai sempre esattamente come sarà l'assemblaggio finale dal momento che conosci la C e saprai in che modo verranno estese le estensioni della tua lingua.

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

    
risposta data 01.04.2012 - 19:01
fonte
2

Non hai detto quali funzionalità di C ++ sono fastidiose per te. comunque potresti provare Objective-C. Enfatizza su Object Oriented invece di Standard Library su C ++.

    
risposta data 01.04.2012 - 08:48
fonte
0

Potresti trovare utile questo approfondito confronto side-by-side di C ++, Objective-C, Java e C # . Personalmente penso che C # sia molto più pulito con il C ++. Ho portato diverse funzioni (numeriche / calcoli) C in C # prima senza troppe modifiche essendo necessario a causa della somiglianza dei tipi di dati numerici e sintattici.

    
risposta data 02.04.2012 - 06:56
fonte

Leggi altre domande sui tag