Esiste una lingua intermedia completamente completa?

3

Spesso quando si traduce tra le lingue (sia con la traduzione del programma che con la compilazione) è una traduzione distruttiva a senso unico. La funzionalità della "porta" non è persa, ma alcuni degli intenti e delle espressioni sono.

Per esempio, il porting di un programma da Java a C è possibile, ma si perde la nozione di classi e metodi. Se quel programma dovesse essere riportato su Java, avresti bisogno di dedurre l'intento di quello che sarebbe considerato un oggetto per tornare allo stato originale. E questo è qualcosa che un computer non è bravo a fare. In questo modo si finirebbe con un programma Java che assomigliava più a un programma C con strutture dati e una grande collezione di funzioni statiche.

Considera anche un compilatore. Una volta che un linguaggio è stato compilato per assemblare o anche per dire CIL o JVM, concetti come se le affermazioni vengono perse quando vengono trasformate in rami.

A un livello più alto, esistono dei traduttori da origine a fonte, ma alcune lingue hanno caratteristiche (cioè delegati in C #) che non esistono in altri linguaggi (come Java che non ha delegati). La traduzione può avvenire, ma è leggermente distruttiva (cioè Java avrebbe bisogno di una classe wrapper per simulare i delegati).

Quindi, detto tutto questo, c'è un linguaggio che ha lo scopo di essere strutturalmente compatibile con tutte le altre lingue supportando tutte le funzionalità linguistiche di tutte le lingue?

Non mi preoccupo molto di essere in grado di tradurre completamente tra le lingue come sono con la capacità di esprimere il codice di ogni lingua nel linguaggio comune. Quindi l'obiettivo sarebbe quello di tradurre nella lingua comune e tornare alla lingua di partenza senza perdere nulla. Ad esempio: Java- > Common- > Java o LISP- > Common- > LISP

    
posta Sam Washburn 16.05.2015 - 21:32
fonte

3 risposte

8

Once a language has been compiled down to assembler or even to say CIL or JVM, concepts such as if statements are lost as they are turned into branches.

Non particolarmente nella pratica. Se guardi uno strumento come Reflector , trasformerà volentieri CIL in C # piuttosto accurato codice, ifs e tutti.

So, having said all that, is there a language who's goal is to be structurally compatible with all other languages by supporting all language features of all languages?

No, perché a quel punto non avremmo bisogno di compilatori o traduttori sorgente poiché abbiamo la One True Language. A parte il sarcasmo, questo sta effettivamente chiedendo perché abbiamo lingue diverse in primo luogo. Le caratteristiche linguistiche non sono cose che vivono isolate. Fornire uno spesso impedisce (o rompe) gli altri. Se esistesse un linguaggio che potesse fornire le caratteristiche degli altri senza perdita, perché dovremmo usare gli altri?

    
risposta data 16.05.2015 - 22:09
fonte
4

Alcune lingue intermedie sono state utilizzate con successo come target per molte lingue diverse, ad es. LLVM (o Ramsey & Jones C - , che potrebbe essere un progetto morto nel 2015)

Si noti che una lingua intermedia non contiene tutte le informazioni fornite nella lingua di origine (ad esempio, si stanno perdendo informazioni durante la compilazione da C a LLVM).

Tuttavia, non sono sicuro che il tuo desiderio abbia un senso. Ci sono alcune caratteristiche del linguaggio di programmazione che sono non composizionali, o sono un intero programma. Ad esempio continuazioni (non è possibile implementare call / cc senza alcun supporto dalla tua lingua intermedia), eccezioni , o anche garbage collection o parallelismo o homoiconicity .

Tieni presente che per la tua domanda di linguaggio di programmazione la semantica è molto più importante della sintassi.

A proposito, alcune persone potrebbero credere che il x86-64 codice macchina o JavaScript è in realtà ciò che desideri ....

    
risposta data 17.05.2015 - 11:39
fonte
2

L'unico modo per una conversione dalla lingua X ad una lingua intermedia IL e viceversa è che IL sia un superset di X. Se vuoi avere più lingue come X, allora IL deve essere un superset di tutti loro.

Pertanto, suggerirei che IL abbia la seguente struttura:

delimiter: ---------SOMERANDOMSTRING----------
---------SOMERANDOMSTRING----------
language: C
#include <stdio.h>
int main() { printf("hello world\n"); return 0; }
---------SOMERANDOMSTRING----------
language: Java
public class Main { public static void main(String[] args) {
  System.stdout.println("hello world");
}}
---------SOMERANDOMSTRING----------

In altre parole, incorporamento MIME del codice sorgente reale nella lingua. Il "compilatore" deve quindi analizzare i pezzi e passarli a un processore appropriato per quella lingua.

Questo ovviamente non è utile.

    
risposta data 18.05.2015 - 00:38
fonte