Non molto. Tradurre da una lingua di livello superiore ad una lingua di livello inferiore significa re-implementare tutte le caratteristiche linguistiche di livello superiore usando solo quelle funzioni disponibili nella lingua di livello inferiore. Questo è fondamentalmente ciò che fa un compilatore. Per esempio. una riga potrebbe diventare molte, molte istruzioni di linguaggio assembly.
Se stai traducendo da una lingua di livello inferiore a una lingua di livello superiore, puoi (a) implementare esattamente lo stesso programma nella lingua di livello superiore, ad es. tradurre un programma di linguaggio macchina compilato in una sequenza di comandi python per "registri di modello che usano queste variabili, caricare questo valore in questo registro, aggiungere questi registri, memorizzare questo valore, saltare alla riga xxx" ecc. ecc. che è piuttosto inutile. (Per esempio, quasi tutti i programmi C sono già programmi C ++ validi, o quasi, semplicemente senza usare nessuna delle funzionalità che rendono utile l'uso di C ++).
Oppure (b) prova a indovinare quali caratteristiche della lingua originale sono state tradotte nella lingua di livello inferiore. Se il linguaggio di livello inferiore è stato originariamente compilato, questo può avere un certo successo: il decompilatore cerca i tipi di compilatori di codice che di solito generano e indovina quale potrebbe essere stato il codice originale. Un esempio scelto da google: link .
Tuttavia, ciò si applica solo se è stato originariamente compilato da quel linguaggio di livello superiore usando un compilatore conosciuto in primo luogo (o scritto a mano usando molti idiomi che hanno caratteristiche linguistiche corrispondenti).
Se hai una pila di codice C e vuoi convertirla in codice C ++, devi prendere decisioni di valore su quali bit del codice saranno estensibili, quali funzioni dovrebbero essere raggruppate in classi, come evitare lo stato globale ecc. ecc., che è ciò che fanno i programmatori e non possono essere immediatamente automatizzati.