Domanda

Chiarimento

Quando ho citato croce compilazione voglio dire da una lingua all'altra (si pensi GWT), piuttosto che da una piattaforma host a una piattaforma di destinazione.

Sfondo

Sto sviluppando un linguaggio di programmazione araba che ho incrociato compilato a Java, questo mi ha salvato i fastidi piattaforma specifica. Ora ho dovuto mettere questo in attesa e mi voltai per la compilazione incrociata a C per vari motivi.

voglio sviluppare una singola libreria che sarebbe stato sostituito con una libreria equivalente del sistema è in esecuzione su durante la compilazione.

Ad esempio, se il programmatore scrive una GUI funzione di disegno nel linguaggio di programmazione araba e compila, sarebbe croce compilato in codice Win32 se compilato sotto Windows, GTK + sotto Gnome, Qt sotto KDE, ecc Lo stesso approccio sarà utilizzato per altre librerie come bene.

Domanda

Vale la pena di passare attraverso tutti questi problemi per finire con un eseguibile compilato o sono meglio con un approccio Virtual Machine? Vantaggi e svantaggi di raccolta sia (dal punto di vista degli sviluppatori lingua piuttosto che il programmatore utilizzando il linguaggio)? Ci sono altri fattori che devo prendere in considerazione?

I collegamenti di riferimento per ulteriori letture sarebbe molto apprezzato:)

È stato utile?

Soluzione

Si dovrebbe compilazione incrociata per la lingua che meglio supporta le ipotesi e le idee alla base la lingua. Se la lingua è garbage collection, tutte le chiamate di funzione sono chiamate a metodi, e non consentono di lavorare con gli indirizzi come dati, allora Java è la lingua da compilare a.

Non ci sono compilatori che compilare il codice Java per nativo. Quindi, se si desidera che il programma da eseguire in modo nativo, è possibile utilizzare quelli.

Quando si è pronti a fare il proprio compilatore completo per la propria lingua, allora si può divorziare se stessi da Java o quello che è si sceglie.

Questo approccio di base è stato utilizzato da un certo numero di lingue. Di solito la lingua di destinazione è C, perché si può fare cose di basso livello in C che non si può fare in qualsiasi altra lingua, deve maturare compilatori ottimizzazione, e corre molto veloce in modo nativo. Simboli Il modo di C, biblioteche e convenzioni di chiamata lavoro è anche ben conosciuto e tende ad essere un rigorosamente definita e sostenuta da varie lingue sulla qualsiasi piattaforma. Questo permette al nuovo linguaggio di avere accesso immediato a tutta una serie di librerie scritte per C.

C ++ ha iniziato in questo modo (il compilatore originale è stato chiamato Cfront), e credo che OCaml iniziato in questo modo troppo. Penso che se si scava un po 'si possono trovare numerose altre lingue per le quali questo è vero.

Ma se non hai bisogno di Cs basso livello dispone di un sacco di questi argomenti si applicano a Java pure. Un certo numero di lingue più recenti (Scala, per esempio) utilizzare la JVM in questo modo.

Altri suggerimenti

mi piace risposta @Omnifarious ma vorrei sottolineare, invece, che è necessario considerare che cosa compromessi si vuole fare. Se si desidera che ad alte prestazioni si può scegliere di cross-compilazione in C o C ++, se si desidera che la disponibilità di biblioteche, di nuovo C o C ++ è una buona scelta. Se si desidera che la lingua interoperabilità si potrebbe andare con LLVM assemblatore, o JVM o .NET assembler.

Ora, la tua domanda reale è: si dovrebbe rendere il plug backend? Devo avvertirvi che questo è davvero davvero davvero difficile da fare. Diamo un'occhiata ad alcuni prodotti che in realtà lo fanno: l'examplar è naturalmente gcc. È stato progettato per supportare non solo una vasta gamma di lingue di input, ma anche generare il codice per una vasta gamma di CPU di destinazione:. Puoi considerarlo è un cross-compilatore che genera vari linguaggi assembler

Il segreto per rendere il plug back-end è un linguaggio intermedio adatto che è abbastanza semplice da tradurre la lingua di input a, e abbastanza semplice da tradurre in varie lingue back-end, ma essere abbastanza forte per codificare l'ingresso.

In sostanza il problema è: se fate la vostra IL troppo astratto non si blocca in troppo di tua ipotesi non può può essere facilmente modificato. Se fate troppo si concreta che è troppo difficile da tradurre in molteplici back end.

Quindi penso che si dovrebbe prendere in considerazione facendo questo se, e solo se, si dispone di almeno tre potenziali lingue di destinazione back-end di agire come casi d'uso per guidare il vostro disegno dell'IL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top