Domanda

sfondo: - esistono linguaggi formali per esprimere il linguaggio e la sintassi validi del linguaggio di programmazione - tali rappresentazioni (ad esempio espressioni regolari e grammatiche libere dal contesto) possono essere compilate automaticamente in analizzatori di lessici / sintassi per alcuni linguaggi di programmazione usando alcuni strumenti (ad esempio LEX e YACC)

domande: - esistono linguaggi formali per definire la semantica del linguaggio di programmazione? - ci sono compilatori per automatizzare la generazione del codice dell'analizzatore semantico basato su questi linguaggi formali? - eventuali risorse da leggere sull'analisi semantica del codice sorgente?

Note: - potresti trovare la mia domanda non realistica, va bene ... Sono un principiante per i compilatori? - per analisi semantica intendo davvero raccogliere informazioni necessarie dal codice sorgente per le prossime fasi di ottimizzazione e generazione del codice ... questo dovrebbe includere il controllo del tipo / confine ... ecc.

Spero di essermi chiarito molte grazie in anticipo

È stato utile?

Soluzione

Esistono molti schemi per definire la semantica dei linguaggi di programmazione: semantica denotazionale (che mappa la sintassi in funzioni che calcolano lo stato del programma); semantica operativa (che equivale a costruire interpreti per la tua lingua), semantica trasformazionale (che equivale a tradurre la tua lingua in un'altra lingua per la quale esiste già qualche altra semantica), ecc.

Pochissimi di questi attualmente portano a sistemi utilizzabili per linguaggi di programmazione reali. Una delle altre risposte qui suggerisce Centaur come un sistema che cerca di farlo. Semantica d'azione di Peter Mosses è uno dei più recenti recenti tentativi.

Per i sistemi reali, i metodi più ad hoc sono attualmente i più efficaci. Questi sistemi inclusivi in ??cui la sintassi lessicale e grammaticale può essere efficace definito (come varianti di LEX e YACC) e costruisce automaticamente alberi. Le grammatiche degli attributi consentono di specificare calcoli su alberi, che consentono di definire alcuni tipi di analisi, come la tabella dei simboli costruzione o metriche (tecnicamente potresti fare semantica denotazionale in questo modo). Lingue più convenzionali (C, Java, C #, COBOL, ...) hanno strutture relativamente simili per quanto riguarda il flusso di controllo e flusso di dati e, di conseguenza, è possibile creare routine di analisi del flusso generiche per consentire di ragionare su tali lingue standard.

Infine, hai bisogno di uno scopo per la tua analisi semantica: quali fatti vuoi estrarre esattamente? L'analisi statica disponibile i sistemi dispongono di metodi ibridi basati su pattern / codici procedurali per raccogliendo la sintassi, la tabella dei simboli e il flusso dei fatti di interesse per calcolare risposte specifiche a domande specifiche.

Alcuni sistemi consentono di utilizzare queste informazioni semantiche da trasportare modifica del codice sorgente.

Un sistema che segue l'approccio più ad hoc sopra è il nostro DMS Software Reengineering Toolkit , che ha anche le definizioni semantiche generiche (sintassi, tabelle dei simboli, anlaysis del flusso di dati) completato per davvero linguaggi come Java, C, C ++ e COBOL. DMS può applicare trasformazioni da sorgente a sorgente condizionate con varie procedure di raccolta dei fatti, e ciò consente la massa trasformazione del codice in modo affidabile.

Altri suggerimenti

Esistono molti linguaggi formali per la programmazione della semantica delle lingue: guarda la voce wikipedia per alcuni più termini per google. Ho fatto una piccola quantità di Z nella mia prima carriera (quel link ai metodi formali wiki è un altro posto possibile per iniziare ad esplorare). Suggerirei di chiedere sul lambda il forum definitivo in quanto le persone lì ne usano alcuni, e può suggerire cosa usare per qualsiasi caso d'uso tu abbia in mente; questo documento sembra in qualche modo correlato a ciò che hai chiesto in termini di generazione di compilatori - devi sia la semantica della lingua che una descrizione della macchina target per creare un compilatore.

Specificamente per l'analisi statica, guarda http: //rw4.cs. uni-sb.de/~martin/pag/

Quello che descrivi è esattamente lo scopo del progetto Centaur:

http://www-sop.inria.fr/croap/centaur /centaur.html

In effetti, potresti molto lontano nel descrivere la semantica della tua lingua, al punto in cui il sistema è stato in grado di darti un interprete per quella lingua (è allora che hai descritto completamente la semantica). Ma non dovevi andare fino in fondo. Potresti fare meno lavoro di descrizione e ottenere comunque un editor strutturato e un typechecker per i tuoi sforzi.

Sebbene il lavoro sia terminato sul progetto (per quanto ne so), puoi trovare articoli interessanti e scaricarli nei link.

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