Alternative moderne compilabili a C / C ++ [chiuso]


38

Sto pensando di scrivere un nuovo prodotto software. Le prestazioni saranno fondamentali, quindi sono cauto nell'usare un linguaggio interpretato o uno che usa un livello di emulazione (leggi Java).

Il che mi porta a pensare di usare C (o C ++), ma entrambi sono piuttosto lunghi nel dente. Non ho usato neanche per molto tempo. Ho pensato che negli ultimi 20 anni qualcuno abbia probabilmente creato qualcosa che è ragionevolmente popolare, piacevole da scrivere e compilare.

Quali alternative più moderne ci sono a C per scrivere codice compilato ad alte prestazioni?

Se il C ++ fosse una bestia diversa rispetto a 15 anni fa, la prenderei in considerazione, suppongo di aver supposto che avesse dei problemi intrinseci.

La parallelizzazione sarebbe importante, ma probabilmente non su più macchine.


21
Il C ++ moderno è radicalmente diverso da C. È molto più paragonabile a qualcosa come Java o C # che a C, tranne per il fatto che presenta una distruzione deterministica invece della garbage collection e ha anche un comportamento indefinito poiché non viene eseguito in una VM o gestito ambiente. L'altra alternativa è D, che è un linguaggio decente, ma ancora molto immaturo in termini di librerie e supporto.
Charles Salvia,

11
Puoi approfondire la parte "Le prestazioni saranno fondamentali"? Perché sarà critico? Hai già misurato qualcosa?
JesperE,

3
15 anni sono un eon in termini di computer e da tempo, persone come Ericsson hanno usato linguaggi funzionali come Erlang per supportare applicazioni distribuite, tolleranti ai guasti, in tempo reale, non-stop nei loro sistemi embedded! Non dare per scontato che solo il C ++ possa darti le prestazioni che desideri, potresti fare meglio a gettare più hardware al problema e risparmiarti molto tempo di implementazione con un'altra lingua.
Mark Booth,

5
@JeremyFrench: ma stai facendo domande basate su false assunzioni, che performance => compilazione statica.
vartec,

4
Per quello che vale, Haskell attualmente serve come mio sostituto del C ++ nella maggior parte dei casi.
Jon Purdy,

Risposte:


54

Esiste un linguaggio in sviluppo chiamato The Rust Programming Language che persegue obiettivi simili a quelli del C ++, in particolare astrazioni a costo zero e controllo accurato sulla gestione della memoria. Detto questo, è forse il candidato emergente più notevole nonostante sia ancora molto giovane.

A parte Rust non ci sono altre alternative popolari che si compilano in codice nativo. Ci sono anche Delphi e D, ovviamente, ma non sono così veloci, popolari o usati. La lingua Go di Google potrebbe essere un candidato, ma è ancora molto giovane e punta a un dominio un po 'diverso.

Tuttavia, si noti che C # (presupponendo la piattaforma Microsoft) e Java potrebbero non essere così lenti anche se vengono eseguiti su una macchina virtuale; la compilazione just-in-time del codice può fare alcune ottimizzazioni che i compilatori tradizionali anticipati non sono in grado di applicare a causa della mancanza di informazioni sullo stato e sull'ambiente del programma.

Francamente non considererei personalmente C come candidato se C ++ fosse un'opzione, principalmente a causa del fatto che il C ++ moderno è più sicuro, funziona a un livello più alto di astrazione, è più espressivo e praticamente non ha perdite di prestazioni rispetto a C (in alcuni casi Il C ++ è notevolmente più veloce). In poche parole, C ++ fornisce tutto ciò che offre C e altro ancora. La maggior parte delle funzionalità C è considerata "deprecata" e la libreria standard C ++ fornisce alternative migliori, più sicure, più veloci e più intuitive.


5
Non direi che la funzionalità C è "deprecata", in senso ufficiale - solo che non c'è quasi motivo di usare mai funzioni di libreria C, puntatori non elaborati o C-array in C ++.
Charles Salvia,

20
+1 per parlare contro la falsa ipotesi di "compilazione obbligatoria per l'esecuzione".
Telastyn,

3
@gbjbaanb prova a compilare con Visual Studio e con MinGW su Windows e buona fortuna con questo: | prova anche a convincere una persona che ti dà una libreria compilata compilata con uno di questi strumenti che non sa nulla di ABI che ha torto e che dovrebbe darti la fonte di quella libreria o imparare come ricompilare e fornire le giuste specifiche . l'orrore, a volte.
user827992,

5
@paxRoman: puoi scrivere piccoli programmi in C ++ e scriverli più sicuri di quanto tu possa fare in C.
kevin cline,

3
@JBRWilkinson Per quanto ne so, la popolarità di Objective-C è inesistente al di fuori della piattaforma Apple.
zxcdw,

19

C'è anche Ada , che si compila in codice nativo, ed è portatile su varie piattaforme entro i limiti della sua libreria standard. La lingua è viva e vegeta, con l'aggiornamento della lingua standard più recente attualmente in corso (noto come Ada 2012).

Breve riepilogo per chi non ha familiarità con Ada:

  • Fortemente tipizzato
  • Supporto integrato per la concorrenza
  • Orientato agli oggetti o procedurale, a seconda delle esigenze
  • Supportato da GNU toolchain (GCC contiene Ada frontend)
  • Eccellente anche per lo sviluppo di software, ovvero quando è necessario interfacciarsi direttamente con l'hardware
  • Supporta la programmazione generica (pacchetti generici, procedure, funzioni)
  • Le funzionalità supportano lo sviluppo di software su larga scala (pacchetti, pacchetti secondari, compilazione separata, distinzione rigorosa tra specifica e implementazione)

1
Per non parlare di Ada Tasks (Parallelisation!)
NWS,

6
+1: ho provato ad imparare un po 'di Ada e penso che sia un linguaggio molto robusto e pulito. Un vero peccato che non ci siano tanti lavori come per altri linguaggi di programmazione.
Giorgio,

3
Buona menzione, stavo cercando qualcosa di più "moderno" ma mi ero dimenticato di Ada
Jeremy French,

4
@Jeremy French: quali funzionalità stai cercando in una lingua più "moderna" che Ada non offre?
Giorgio,

17

Se il C ++ fosse una bestia diversa rispetto a 15 anni fa, la prenderei in considerazione, suppongo di aver supposto che avesse dei problemi intrinseci.

15 anni fa, non esisteva uno standard C ++. Il secondo è stato pubblicato l'anno scorso. Le migliori pratiche C ++ sono cambiate molto nei 5 anni successivi alla pubblicazione dello standard 98 e stanno cambiando di nuovo con la pubblicazione dell'11.


12

Perché le persone insistono sempre nella ricerca di nuove lingue?

C ++:

  • È la lingua numero 4 di TIOBE, ma ostacola tutta la competizione se combinato con C
  • Ha molti framework
  • È molto facile codificare
  • È molto facile da sintonizzare
  • È molto performante
  • È molto sicuro
  • Ha un ottimo supporto nel settore
  • È multipiattaforma
  • Non necessita di ulteriori VM / Frameworks / disordine di distribuzione se fatto correttamente
  • Ti farà facilmente un lavoro
  • Ha tutte le cose necessarie per compilare .so / .dll da avviare su sistemi molto vecchi
  • Facile da risolvere
  • Molto espressivo
  • Molto dinamico
  • e un sacco di altre cose interessanti

L'unico aspetto negativo di C ++ è che devi imparare un po '. Questo è tutto.

Confronta quello con altre lingue che sono una o più di:

  • Strettamente supportato (OCML, Fortran, ...)
  • Lento (Java, Javascript)
  • Sperimentale (Silverlight)
  • Un bersaglio mobile (.NET 1/2/3/4/5? Qual è l'ultimo adesso?)
  • Piattaforma bloccata (.NET)
  • Supporto per il framework scadente (Fortran)
  • Ha piccole comunità (qualsiasi cosa al di fuori della top 10)
  • Sono un incubo da risolvere (qualsiasi cosa con concetti e cose a prova di errore di alto livello)
  • Richiede 500 MB di preintallazione sulla macchina dei clienti (JVM / .NETVM)

IMHO, meno lingue useremo e sosterremo, migliore sarà la situazione.

Ciò provoca miglioramenti automatici nei framework per la lingua, il supporto, la documentazione, il lavoro dei comitati di standardizzazione, libri migliori, maggiore conoscenza, software di supporto più facile, schemi migliori, cicli di supporto linguistici più lunghi e codice più esperto scritto nella lingua.

So che le persone ridurranno il voto, ma ci penso davvero.


71
C ++ "è molto facile da inserire" è semplicemente ridicolmente sbagliato, scusa. È un linguaggio incredibilmente difficile da imparare e anche se usi i moderni idiomi C ++ e eviti i puntatori, dovrai affrontare tonnellate di enigmi del compilatore ed errori di runtime prima di capire. E anche dopo averlo imparato, la sintassi si intromette abbastanza spesso. Safe C ++ usa spesso un pasticcio di modelli nidificati che generano enormi quantità di codice boilerplate.
Konrad Rudolph,

20
Molto espressivo e molto dinamico non suona come i tipici tratti C ++, rispetto ai linguaggi dinamici.
vartec,

29
@gbjbaanb "leggermente più difficile da imparare" è, ancora una volta, ridicolmente fuori dal segno. Scusate. Ho programmato tutti questi linguaggi per anni, preferisco chiaramente il C ++ (e faccio la programmazione più seria in esso) ma dire che è facile è semplicemente fuorviante. E non sto parlando di cose fantasiose di metaprogrammazione, sto parlando di errori del compilatore prodotti dal codice run-of-the-mill, causati da nascondere i nomi, ADL, constproblemi di correttezza e cose del genere. Chiunque abbia letto il C ++ efficace (come afferma Coder) e sostiene che il C ++ è facile ha una disconnessione mentale.
Konrad Rudolph,

13
@gbjbaanb Sono un programmatore C ++. Ancora una volta, non credo che C ++ sia facile. E questo thread di commenti ha ottenuto anche alcuni cipigli dalla chat C ++. Quindi non è quello. E la differenza tra i gotcha C ++ e quelli di altre lingue è che se non li conosci in altre lingue, probabilmente starai bene. In C ++, sei un brindisi. E anche se li conosci, puoi comunque ottenere diverse schermate di errori di compilazione per un singolo errore (mi è successo di nuovo oggi). E anche se l'errore era semplice da correggere (un refuso), ci vuole tempo per analizzare tutto ciò.
Konrad Rudolph,

6
Quando una lingua popolare è mai stata buona? PHP è estremamente popolare e nessuna persona seria pensa che sia un linguaggio "buono", anche per la sua nicchia. L'unica cosa "positiva" dei linguaggi popolari è che ci sono molte librerie per facilitare la programmazione di alcuni domini. Il C ++ stesso è pieno di frustrazione.
weberc2,

11

C / C ++ è piuttosto lungo nel dente .... questa è una buona cosa . Implica che sono stati progettati abbastanza bene (ahem) da essere ancora molto utilizzabili, che molte persone li usano per le attività quotidiane e che troverai un gran numero di sviluppatori che ne sono esperti. La maturità è qualcosa da apprezzare.

Se passi tutto il tuo tempo alla ricerca di qualcosa di nuovo, solo perché è nuovo e pensi quindi che in qualche modo debba essere migliore, stai provando molta delusione. Questo vale per i linguaggi software, i sistemi di interfaccia grafica (prendi nota, Microsoft e Gnome) e gli amanti (prendi nota, giovani donne :))

Ora, ammettiamolo, se la tua esperienza con C ++ ha 20 anni, quando il codice C ++ era generalmente codificato come C, allora forse è il momento di rivalutare il linguaggio, tutte le funzionalità che erano lì nel giorno che non erano mai state usate molto di più oggi, e alcuni sforzi di standardizzazione hanno ampliato un po 'il linguaggio per farlo apparire molto diverso da quei vecchi sviluppi in stile C. Non che anche C sia un male: è un linguaggio perfetto anche per molti tipi di attività di codifica!


16
Penso che C e C ++ esemplificino il commento di Hoare sulla progettazione del software: o lo rendono così semplice, non ci sono ovviamente carenze, o lo rende così complicato che non ci sono carenze evidenti.
TMN,

1
In che modo le ripetute vulnerabilità della sicurezza dovute a una qualche forma di buffer sfruttano una "buona cosa", a prescindere dalla vecchia o radicata lingua? E questo è davvero diverso dal discutere la continuazione di un matrimonio stabilito dopo ripetuti abusi?
user2864740

@utente2864740 quello che stai suggerendo è divorziare perché la moglie è vecchia e vuoi un modello nuovo ed eccitante ... Dico che ti attieni a quello che hai perché conosci le debolezze e le stranezze. Quante lingue nuove e interessanti risolvono problemi come l'overflow del buffer e poi risultano avere modi sottili di buffer di overflow? Quindi, cosa c'è di meglio: l'overflow che puoi evitare non essere pigro o usando il costrutto giusto, o quello in cui cadi perché non sapevi che c'era?
gbjbaanb,

@gbjbaanb No, non l'ho mai detto. Stavo disegnando una similitudine specifica per i danni causati dal non migliorare il contesto delle situazioni. Sono generalmente abbastanza razionale e non incline alla selezione "fanboi" di argomenti o strumenti di tendenza (questa è solo la mia natura). Inoltre, C e C ++ sono lingue diverse; tuttavia sono entrambi giustificati per lo stesso motivo di copertura. E questo è il problema con questo.
user2864740

8

L'attuale standard di C ++ è C ++ 11 , che è stato pubblicato nel 2011. Quindi non è uno standard di 20 anni. E ci sono stati numerosi standard in mezzo. Ognuno di loro introduce numerosi miglioramenti delle prestazioni.

Anche i compilatori sono in costante miglioramento. Sono molto più bravi nell'ottimizzare, rispetto al passato.

Anche i formati eseguibili sono migliorati, 20 anni fa hai avuto un.out , ora hai ELF .

Nel complesso, il suggerimento che il C ++ non sia cambiato in 20 anni non può essere più lontano dalla verità.

Inoltre, tieni presente che C e C ++ sono linguaggi molto diversi.


2
La mia ipotesi era che qualcosa che era stato concepito per la prima volta 20 anni fa avrebbe intrinseci limiti architettonici che potevano essere migliorati solo con una lavagna vuota. Penso che questa ipotesi potrebbe essere stata sbagliata.
Jeremy French,

4
@JeremyFrench: Ti piace l'architettura x86?
TMN,

2
@TMN è che prova o smentisce il mio presupposto?
Jeremy French,

6
L'architettura originale x86 rappresentava un brutto compromesso tra la compatibilità all'indietro con l'8080 e una serie di funzionalità per competere con il 68000 e l'NS32032. Memoria segmentata (con puntatori "lontani" e "vicini"), solo 4 registri per scopi generici, codifica di istruzioni a lunghezza variabile, oltre 50 versioni di istruzioni JMP, un bus di sistema a tre stati multiplex ... Eppure oggi lo stesso il design di base sta andando più forte che mai, dopo che molti progetti "superior" in ardesia pulita (Alpha, MIPS, PowerPC) non sono riusciti a sostituirlo.
TMN,

1
@JeremyFrench no, la tua ipotesi non era sbagliata, almeno nel caso del C ++. Le funzionalità di C ++ 11 sono sicuramente utili; tuttavia, a questo punto sono solo più schifezze sulla pila di schifezze. Tentano di integrare le funzionalità dei linguaggi moderni, ma per far fronte al caos C ++ esistente, devono avere eccezioni e tali eccezioni avranno eccezioni e così via e così via.
weberc2,

6

Non sono un grande esperto di questa lingua, ma penso che OCaml potrebbe essere un'opzione interessante da guardare.

OCaml è un linguaggio compilato, funzionale / orientato agli oggetti. Per un confronto delle prestazioni con C ++ vedere C ++ vs OCaml: confronto tra traccianti Ray . Naturalmente, questo è un esempio molto specifico e si dovrebbero fare test più approfonditi per avere una migliore sensazione delle prestazioni di OCaml.


Il downvoter può fornire un suggerimento su come migliorare questa risposta? Grazie.
Giorgio,

3

Dipende da cosa farà il tuo prodotto. Se le prestazioni sono davvero fondamentali, la lingua preferita è ancora FORTRAN . Inoltre, non escluderei Java: viene utilizzato in molte applicazioni di trading finanziario ad alto volume. Erlang vale la pena dare un'occhiata se il tuo dominio problematico richiede un'elevata concorrenza. Objective-C è bello, anche se non so quanto sia ben supportato al di fuori dell'ecosistema Apple (oltre ai compilatori e al runtime di base). Ho anche sentito cose positive sulle prestazioni di Haskell, ma non sono sicuro che si tratti di prestazioni assolute o solo prestazioni rispetto ad altri linguaggi funzionali.


2
ogni lavoro di finanza che ho cercato richiede sviluppatori C / C ++, non Java. Dall'esperienza con Java, non riesco a vedere nessuno che sia ad alte prestazioni a meno che non ci lanciate masse di hardware.
gbjbaanb,

Ci sono molti sistemi di trading Java in funzione a Wall Street e in varie banche di investimento negli Stati Uniti e nel Regno Unito. È anche usato abbastanza pesantemente al Mercantile Exchange di Chicago.
TMN,

3

Quando dici che il tuo progetto è sensibile alle prestazioni, intendi ogni sua riga di codice? Oppure, come al solito, esiste una percentuale minore che è critica in termini di prestazioni, mentre il resto è la normale esecuzione del codice aziendale del mulino?

Dopo aver risposto a questo, qual è il rischio maggiore per il tuo progetto: che il risultato finale è troppo lento o che non lo finisci mai in primo luogo?

Supponendo che tu risponda al secondo per entrambi, dovresti sviluppare un linguaggio di livello superiore che supporti l'interoperabilità nativa (Python, Ruby, la famiglia .Net hanno tutti questo). Per prima cosa, completa il progetto. Quindi profilare, ottimizzare, risciacquare, ripetere. Solo in seguito, considera di riqualificare il segmento di scelta della tua applicazione nel codice nativo e di integrare quel codice nativo con il tuo prodotto finito.


Una volta che è Java, non puoi recuperarlo se è troppo lento.
Coder

6
@Coder Java ha un FFI (JNI) che ti permette di "creare scompiglio" nella tua lingua preferita. Quindi, se hai progettato bene le interfacce, puoi semplicemente sostituire un'implementazione Java con una nativa. La piattaforma Java è ben pensata.
K.Steff,

1

Vala è simile a Java e C #, si compila in codice nativo (o codice sorgente C se si preferisce) ed è molto veloce . Richiede GLib per i suoi bit orientati agli oggetti, ed è scritto da hacker Linux per hacker Linux, quindi se il tuo dominio è Windows potrebbe non essere molto buono.


1

Objective-C è un'alternativa moderna e compilata alla C e alla C ++ diritte. Ha una gestione della memoria sia garbage collection che deterministica e il runtime OO che passa messaggi è stato ottimizzato per le prestazioni.

È disponibile tramite GCC e CLang e ci sono librerie di applicazioni come GNUStep e Cocotron che funzionano su varie piattaforme.

Se stai facendo un lavoro ad alte prestazioni, suppongo che sia un tipo di scricchiolio del numero o altro lavoro di divisione e conquista invece dell'interfaccia utente, quindi ciò significa che potresti eseguire l'interfaccia utente in qualsiasi lingua sia più facile per te, ad es. HTML tramite un mini server http.


0

Non l'ho mai usato, ma un amico dei miei giuramenti di Cython che ti consente di usare le primitive in stile C in parti critiche delle prestazioni del tuo codice mantenendo la sintassi generale di Python ed essendo in grado di sfruttare appieno i costrutti di livello superiore dei pitoni per ridurre lo sviluppo tempo dappertutto.

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.