Esiste un linguaggio che si traspila in C, con una sintassi migliore? [chiuso]


19

CoffeeScript è un linguaggio che traspila in JavaScript, con una sintassi pulita, ispirato a Ruby. Esiste un linguaggio simile che traspila in C, consentendo un codice più leggibile senza compromettere le prestazioni? Se non esiste nulla del genere, c'è una buona ragione per non crearlo?


10
Si noti, tuttavia, che "compila in C" non è sinonimo di "veloce come i programmi C originali". Quando qualcosa viene compilato in C, genererà spesso un codice piuttosto (o completamente) diverso da quello che qualsiasi persona normale scriverebbe in C. Potrebbe facilmente essere notevolmente più lento (o talvolta più veloce) di quello che normalmente scriveresti a mano.
Jerry Coffin,

4
Quello che non mi piace di nessuna di queste risposte è che propongono lingue totalmente diverse, come Vala. La cosa su CoffeeScript è che è Javascript, ma con una sintassi diversa.
prof. Falken sostiene Monica


5
Vorrei davvero che "transcompile" (la parola) morisse. È "compilare" e "compilatore". Non hai bisogno di una nuova parola solo perché il linguaggio di output non è x86 (e se pensi di farlo, non capisci i compilatori).
Leushenko,

2
La parola transpile significa (o ha recentemente assunto il significato) di tradurre il codice nel codice sorgente di un'altra lingua con la stessa semantica , in genere un'istruzione per un'istruzione equivalente (che consente anche di creare una mappa sorgente). Nessuno sostiene che i transpilers facciano qualcosa di diverso dai compilatori. I transpilers sono un tipo specifico di compilatore.
Carl Smith,

Risposte:


23

CoffeeScript si compila in JavaScript per una ragione molto semplice, JavaScript è il linguaggio lato client di fatto e sarebbe irragionevole aspettarsi che i fornitori di browser supportino nativamente CoffeeScript, quando tutto ciò che offre è una sintassi alternativa.

In un modo molto simile, il punto principale del linguaggio di alto livello con i traduttori C è la portabilità immediata, poiché esiste un compilatore C per quasi tutte le piattaforme e un'abbondanza di librerie C. Vala , ad esempio, è stato progettato per :

  1. essere un compilatore per GObject ,
  2. costruire eseguibili nativi (tramite il compilatore C della macchina),
  3. automatizzare il conteggio dei riferimenti e
  4. essere ancora accessibile ai programmatori GNOME C.

GNOME è un progetto tradizionalmente orientato al C e GObject in particolare è scritto in C, probabilmente Vala non troverebbe molto amore tra gli sviluppatori GNOME se compilato per codice macchina, indipendentemente dalla sua natura più amichevole (e sintassi). Non tutti sembravano gradire la sintassi, al punto che un'altra lingua, Genie , era stata costruita per migliorarla.

Per un esempio C ++, Facebook ha sviluppato HipHop , un traduttore da PHP a C ++. Stavano cercando di risolvere un problema molto specifico, l'utilizzo della CPU, senza dover sostituire tutto il loro codice PHP e riqualificare i loro ingegneri (o peggio, sostituirli). Questo è un esempio molto più specifico, poiché i problemi di scalabilità di Facebook sono, beh, unici, e di nuovo avere accesso al codice C ++ intermedio può essere utile, poiché le estensioni PHP sono scritte in C e C ++.

Quindi un traduttore da una lingua di alto livello a un'altra è una buona idea soprattutto quando è richiesto l'accesso al codice intermedio. Per CoffeeScript, il codice JavaScript è necessario a causa della sua ampia adozione del browser e per Vala, Genie e HipHop a causa della base di codice esistente. Ovviamente avere accesso al codice intermedio significa che è possibile ottimizzarlo ulteriormente se necessario.

Ma in generale , non sarebbe una buona idea costruire una lingua che si traduca in C, o in qualsiasi altra lingua, se non si usasse il codice risultante. Ci sono così tante lingue là fuori, se non riesci a farcela con C, scegline un'altra. Per coincidenza, il primo compilatore C ++ scritto da Bjarne Stroustrup, CFront, era un traduttore da C con Classi in C, ma principalmente perché, come nuovo linguaggio, era impossibile avviare C con Classi.


3
C'è anche Nim.
noɥʇʎԀʎzɐɹƆ

Swift può compilare anche in C.
Quazi Irfan,

9

Tratterò alcuni punti che Yannis Rizos non ha fatto nella sua ottima risposta.

Sì, esistono molte lingue. C è un obiettivo comune per i back-end del compilatore poiché è incredibilmente portatile e fortemente ottimizzato, anche se con LLVM non ha molto senso.

Alcune implementazioni che conosco sono:

  • C ++ (almeno nei primi giorni)
  • GHC Haskell (Sebbene il generatore di codice principale sia C--)
  • Schema Gambit / Chicken / Bigloo
  • ECL (Common Lisp)
  • Perl
  • Vala & Genie

veloce come i programmi C originali

No, solo perché usa C come linguaggio intermedio non significa che raggiungerai la sua velocità. La ragione per cui C è veloce è a causa del metodo di scrittura del codice che è ovviamente diverso per altre lingue. È solo un assemblaggio portatile, niente di speciale.


1
C è molto lontano dall'assemblea ...
Sarge Borsch,

1
Alcune persone pensano che C sia un "assemblatore di alto livello". È abbastanza vicino alla macchina, ma ovviamente non è un sacco di codici operativi.
dstromberg,

6

Rock è un compilatore ooc che genera sorgente C99. L'OOC-lang è un linguaggio di programmazione con gli oggetti, le funzioni di prima classe, e unicorni rosa. L' ooc è un linguaggio dinamico e cammina così lontano. Genera codici c più grassi e più lenti. hai bisogno di più modifiche per soddisfare le tue esigenze. Ma è un buon punto di partenza.


4

Vala e Genie sono entrambi linguaggi che vengono compilati in C. haxe compilati in C ++, ma non sono sicuro che sia quello che vuoi.


2
ti dispiacerebbe ampliare un po 'quello che ognuna di queste risorse ha e perché le consigli a rispondere alla domanda posta? Le "risposte solo link" non sono del tutto benvenute allo Stack Exchange
moscerino del

4

OCaml può compilare in bytecode, codice nativo, può essere interpretato direttamente, o può compilare in C .


1
ti dispiacerebbe spiegare di più su ciò che fa e perché lo consigli come rispondere alla domanda posta? Le "risposte solo link" non sono del tutto benvenute allo Stack Exchange
moscerino del

3
Non riesco a vedere come la mia risposta sia una "risposta solo link". In realtà, potrei rimuovere il link e sarebbe comunque una risposta valida. La domanda è "Esiste una lingua che fa X" e la mia risposta è "la lingua Y fa X". Questo commento vale anche per la risposta di Bilijk.
Barjak,

3
  • Il compilatore C ++ originale di Bjarne Stroustrop, "cfront", compilava da C ++ a C, su cui avrebbe eventualmente eseguito il compilatore C per produrre il codice oggetto. Il C ++ è "non teorico" come puoi ottenere :-)
  • I compilatori e compilatori Unix "yacc" e GNU "Bison" traducono i loro linguaggi di input in C. Molti, molti sistemi sofisticati sono stati scritti con loro.
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.