Domanda

Può un compilatore essere scritto, dal quale non si può reverse engineering la grammatica e il significato della lingua di input.

vale a dire. si può ottenere sempre la specifica della lingua dal compilatore?

Diciamo che voglio compilare da ?? in una certa lingua, ma non voglio che le persone che leggono il compilatore di essere in grado di leggere e capire ??

personalmente ho la sensazione che i compilatori e le specifiche linguistiche sono isomorfi, ma io sono interessato da un punto di vista accademico se questo è sbagliato.

È stato utile?

Soluzione

Supponendo che si sta dicendo che hanno solo l'accesso al binario:

Risposta breve:. No, se una persona si preoccupa abbastanza

Risposta lunga: E 'sempre possibile, se una persona è stata così inclinato e aveva un sacco di tempo libero, di strappare il compilatore fino al livello di byte e mappare completamente. Da lì, si poteva capire gli alberi di logica, e ricostruire la lingua.

Si sarebbe doloroso, ma questo rientra nella stessa categoria di "posso mai fare un algoritmo che impedisce a un utente dedicato da cracking verifica cd-key".

Ora, se non avete mai realmente dato il compilatore di una persona (immaginate una sorta di sistema di proxy?) Potrebbe essere ragionevole dire che un utente avrebbe dovuto prendere un molto, molto tempo per la forza bruta le specifiche del linguaggio, se potesse mai generare qualcosa che potrebbe esercitare completamente.

Se stai insinuando che abbiano accesso al codice sorgente:

No. Si può offuscare, ma il compilatore ha ancora per costruire gli stessi alberi logici, non importa quanto sia difficile la lettura.

Ci potrebbe essere un modo per fare esoterica this..if hai fornito l'albero lingua separatamente in una sorta di forma binaria cifrata ... e non ha fornito il compilatore del source..and gli utenti non erano annoiati tipi NSA .

Altri suggerimenti

Credo che il compilatore rivela sempre la specifica del linguaggio che compila (Sono consapevole che questo è super a mano ondulato).

Tuttavia, probabilmente non c'è un algoritmo di farlo (vale a dire che è indecidibile), perché, per esempio tale algoritmo avrebbe bisogno di scoprire quali programmi il compilatore si ferma su.

No, non sono la stessa cosa. Ma un compilatore capisce inevitabilmente la grammatica della lingua di input, e (si spera) segue la specifica del linguaggio in modo molto preciso. Pertanto, la comprensione dei mezzi compilatore comprensione quelli.

Naturalmente è possibile offuscare il codice sorgente del compilatore così pesantemente che nessuno si preoccupa di leggere ed estrarre la grammatica e le regole del linguaggio. Certo che fa male gli sviluppatori di troppo (buona fortuna sostenendo che schifo!).

Inoltre, la lettura sorgente del compilatore sarebbe la mia ultima opzione se volevo sapere qualcosa circa la lingua (non su come è implementato, ma come è definita su un livello più astratto) - mi piacerebbe dirigo alla specifica o qualche altro fonte autorevole (documentazione ufficiale, ecc), in quanto sarebbe modo più semplice, anche se il codice del compilatore è molto comprensibile.

La mia sensazione è che si potrebbe determinare il comportamento semantica del compilatore ispezionando il suo output. Ma non si potrebbe ottenere la sintassi reale senza documentazione o l'accesso alla sorgente del compilatore. se avete la fonte questo diventa banale, quindi sto supponendo che non si ha il sorgente del compilatore, solo l'accesso ad esso come uno strumento.

In generale, se v'è un'informazione sulla semantica nel codice (e c'è sempre una semantica operative definite in qualsiasi interprete o compilatore), quindi è sempre possibile estrarre tali informazioni. L'unica domanda è la complessità di un tale engineering inverso. Quindi, è necessario un linguaggio offuscato e un compilatore offuscato.

Date un'occhiata al "decompilatore" Malbolge per esempio.

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