Domanda

Sto sviluppando un interprete di un semplice linguaggio di programmazione.

  1. Esistono dati dinamici strutturati ad albero , in cui ciascuno dei nodi di dati ha un oggetto di tipo associato (di proprietà).
  2. Esistono diversi tipi di tipi - ListType, StructType ecc. - e uno speciale - TypeRef . TypeRef contiene un nome (una stringa) che fa riferimento a un tipo concreto.
  3. Esiste una (quasi) mappa globale (dizionario) - io la chiamo ambiente - (std::map<string, Type*>) che traduce i nomi di tipo in oggetti di tipo.

Il problema è che potrebbero essere caricati diversi programmi e ognuno di essi potrebbe avere tipi diversi associati con gli stessi nomi. Questa singola ipotesi rende impossibile avere un ambiente globale (statico), che altrimenti sarebbe una soluzione perfetta.

Pertanto, sembra che io abbia bisogno di (# 1) un puntatore a un ambiente in ogni oggetto-tipo o (# 2) per eseguire ogni operazione nel contesto dell'ambiente (es. fornendolo ovunque come primo argomento ).

I problemi che vedo:
(# 1) Ridondanza delle informazioni, poiché tutti i nodi di dati connessi avrebbero lo stesso ambiente. Gli ambienti sarebbero diversi solo per dati strettamente separati.
(# 2) Un sacco di banale passaggio dell'ambiente alle subroutine, offuscando il codice.

Mi sembra che questo problema corrisponda a un modello generale che definirei dati quasi statici . Qualche idea su quale sarebbe la soluzione migliore?

È stato utile?

Soluzione 3

L'idea di utilizzare l'archiviazione locale di thread è interessante, ma alla fine ho trovato un'altra soluzione:

Uso i tipi in due fasi: prima sono tutti creati e poi sono " compilato " ;. La compilazione richiede un ambiente, ma viene eseguita una sola volta. Consiste nel tradurre tutti i nomi di tipo in oggetti di tipo appropriati. Dopo la compilazione l'ambiente non è più necessario.

Tuttavia, penso che sia ancora più una soluzione alternativa che una soluzione generale.

Altri suggerimenti

Cosa separa gli ambienti? Se si tratta del contesto di esecuzione (gli oggetti in un contesto chiamano solo quelli nello stesso contesto), è possibile utilizzare un thread per ambiente e memorizzare il & Quot; local-globals & Quot; in un archivio locale thread (o solo una mappa globale con chiavi che sono ID thread).

Questo ha alcuni svantaggi. Per uno, non funziona se ci sono chiamate tra contesti. E ovviamente ti costringe a diventare un modello filettato.

Potresti voler avere due tipi di archivi: uno globale per i tipi concreti, uno locale per i TypeRefs. La memoria locale deve essere inserita nel contesto di un programma attualmente in fase di analisi.

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