incorporare i linguaggi di programmazione in altre lingue [duplicato]

1

In C / C ++, esiste una parola chiave che consente di inserire la lingua dell'assembly direttamente in un metodo.

Esempio

int Main()
{
    __asm // notify the compiler that this block is assembly language.
    {
        push ax;
        xor ax, ax;
        int 33h;
        mov ax, 1;
        int 33h;
        pop ax;
        retf;
    }

    return 0;
}

Che ci crediate o no, la mia memoria ha questo piccolo frammento di linguaggio di assemblaggio impresso per la vita, o almeno finché non divento senile! È un piccolo comando DOS vecchia scuola che chiama l'interrupt del mouse e mostra il cursore del mouse. A parte questo, a seconda del compilatore C / C ++ in questione, questo sarebbe stato compilato per l'esecuzione del metodo Main ().

Pochi anni dopo, sono uno sviluppatore C # e JavaScript ... puoi indovinare dove sto andando con questo?

In ASP.NET, possiamo sviluppare le funzionalità lato server di un'applicazione web con C # (o altri linguaggi .NET) e la funzionalità lato client con JavaScript.

A volte dobbiamo essere in grado di passare script JavaScript al client, dal server, perché il server fornirà alcune informazioni che saranno richieste dallo script. Attualmente questi devono essere scritti come stringhe, che possono causare mal di testa quando si tratta di eseguire il debug!

Esempio

string js = "function test() { alert(\"" + message + "\"); }";
aspLiteral.Text = ScriptWrapper.Wrap(js); //assume this just wraps a script into a <script> tag.

E se potessimo inserire JavaScript direttamente nel codice lato server, dando così una maggiore esposizione al debugger, all'intelligence, al completamento del codice ecc.

Esempio

DateTime x = DateTime.Now;
string message = "Hello World";
var script = javascript //special keyword notifies the compiler that this block is JavaScript.
{
    function test() {
        alert(@message); //Tell the compiler to evaluate C# message to JS message
        var x = @x; //Tell the compiler to evaluate C# x to JS x
    }
}

aspLiteral.Content = ScriptWrapper.Wrap(script);

// output

<script type="text/javascript">
    function test() {
        alert("Hello World");
        var x = \/Date(1371561853440)\/;
    }
</script>

So che sembra una montagna monumentale da scalare, forse fino alla follia ... Sono l'unico a pensare che questo possa essere utile, o, se è un uso piuttosto limitato, non giustifica l'implementazione di questo in futuri compilatori / IDE?

    
posta series0ne 18.06.2013 - 15:50
fonte

2 risposte

9

Sicuramente non sei l'unico a trovarlo utile, dato che viene fatto dappertutto come hai mostrato sopra. Dal mettere il codice ottimizzato del compilatore in metodi per la velocità, all'utilizzo di linguaggi di scripting per la loro semplicità, le persone hanno codificato il codice per un po 'di tempo. Il vero trucco qui, però, è far sì che il compilatore sappia cosa diavolo stai cercando di fare.

La maggior parte dei compilatori è fatta per interpretare 1 lingua, quella per cui sono progettati. La ragione per cui la parola chiave ASM funziona così bene in C è che ASM è un passo intermedio per il compilatore C, cioè mette tutto il codice C che trova in equivalenti ASM, quindi quando specifichi con la parola chiave __asm, stai dicendo "Ehi compilatore, non preoccuparti di trasformare questo in assemblea, l'ho fatto per te!" e il compilatore procede in modo allegro inserendo il tuo codice premade ovunque sia necessario prima di convertirlo in binario.

Quando fai cose come assemblare javascript all'interno di java, diventa più complicato. Perché? Perché javascript è NON un passaggio intermedio da java a binario. Ciò significa che non solo il compilatore deve essere in grado di leggere java, ma deve anche essere in grado di leggere javascript! Oltre a questo, deve sapere come integrare i due quando il loro unico passo comune è binario! Come puoi vedere, questo diventa un po 'più complicato. Questo è spesso il motivo per cui il javascript è inserito in stringhe, poiché spesso viene passato a un altro metodo che interpreterà il javascript e poi lo trasformerà in java, che il compilatore riconosce e compila.

Quindi, per riassumere, se vuoi essere in grado di farlo, ogni compilatore dovrebbe essere in grado di interpretare con successo N lingue, dove N è il numero di lingue diverse che useresti in ogni file sorgente. Funzionerà per 1 o 2 lingue, ma quando inizi a entrare in 3+ stai osservando una crescita esponenziale del codice. Cosa succede se la lingua 2 è nidificata nella lingua 3 che è annidata nella lingua 1? Come lo interpreta il compilatore? Sembra semplice caso per caso, ma elaborare un algoritmo predefinito per ordinare automaticamente quei tipi di problemi non è un compito da poco.

    
risposta data 18.06.2013 - 16:01
fonte
3

Questo è esattamente ciò che ASP.NET (o il più moderno rasoio) già fa, solo al contrario. Quindi, non puoi facilmente avere C # con JS in linea, ma puoi avere JS / HTML con inline C #, che penso funzionerà altrettanto bene.

    
risposta data 18.06.2013 - 16:34
fonte

Leggi altre domande sui tag