Strumento per la convalida della nuova sintassi del codice nella lingua esistente

3

Un team linguistico di programmazione dispone di uno strumento per convalidare le nuove idee sulla nuova sintassi del codice?

Ad esempio, supponiamo che il team linguistico Java inizi a sviluppare nuove funzionalità, che richiede una nuova sintassi. Questa funzione è presumibilmente nuova parola chiave public , che può indicare quali classi vedranno questa classe. Uno sviluppatore propone una sintassi:

//means that Class3 will be only visible to Class1 and Class2
public(Class1, Class2) Class3 

Ora, come gli sviluppatori saranno assolutamente sicuri , che questa nuova sintassi public(arg1, arg2) non rotti il metodo di qualcuno chiamato public con parametri?

Lo strumento dovrebbe riconoscere che public è una parola riservata, il che significa che non può esserci un tale metodo, come un esempio di convalida.

    
posta DreamOnJava 01.12.2017 - 16:14
fonte

1 risposta

10

Formalizzato, la tua domanda è: data una grammatica G che analizza una lingua L (G) e una grammatica estesa G 'che analizza una lingua estesa L (G') dove L (G) è un sottoinsieme di L (G ') ), come si può dimostrare che qualsiasi programma nella lingua L (G) produce lo stesso albero di analisi con la grammatica G e G '?

Questo è il problema di inclusione linguistica ed è indecidibile per grammatiche senza contesto. È anche indecidibile se un CFG è ambiguo , ad es. se lo stesso programma può essere analizzato in due modi diversi sotto la grammatica G.

Tuttavia, questi problemi possono essere decidibili per i sottogruppi CFG effettivamente utilizzati dalla maggior parte dei linguaggi di programmazione, come LALR. Può anche essere decidibile se la differenza tra G e G 'ha una struttura specifica. Sfortunatamente non ho familiarità con la teoria necessaria.

Invece, ci sono due modi pratici per controllare la compatibilità di tali cambiamenti di sintassi.

In primo luogo, potrebbe esserci un corpus di programmi esistenti, inclusi molti casi limite. Usando un parser basato su una grammatica che può analizzare tutti i CFG (come i parser GLR o Earley), questi parser possono segnalare se i programmi di quel corpus avevano un'analisi ambigua.

L'approccio più comune è chiedere ad altre persone se possono individuare eventuali problemi.

In questo caso particolare c'è una chiara argomentazione che tale sintassi non sarebbe ambigua. ( public è una parola chiave, ergo non può esserci alcun metodo o costruttore chiamato public() . Introdurre una tale sintassi non introdurrebbe quindi ambiguità.) Uno strumento può o non può essere in grado di fare quella connessione. Un uomo esperto sicuramente di noi.

Naturalmente la compatibilità sintattica è il problema facile. Molto più difficile è mantenere la semantica compatibile, che è un problema molto più difficile anche per gli esseri umani e non può essere definitivamente controllato automaticamente dagli strumenti. Per cominciare, la maggior parte dei linguaggi di programmazione non ha nemmeno una semantica formale che potrebbe essere l'oggetto di una dimostrazione. Di nuovo, chiedere a molti umani esperti è l'unico approccio praticabile. Se un problema viene trascurato (accade abbastanza spesso), allora questo è un bug che deve essere risolto successivamente.

    
risposta data 01.12.2017 - 16:46
fonte