Gestione dei tipi e delle conversioni in un compilatore

2

Sto cercando di determinare come gestire tipi e conversioni tra tipi all'interno di un compilatore che sto scrivendo. Il compilatore è stato scritto in C #.

Esistono diversi tipi di tipi.

  1. Classi (sola lettura / non modificabile)
  2. Tipi mutabili (che contengono un altro tipo. Pensa al contrario di C ++ const.)
  3. Tipi generici (con vincoli relativi ai tipi)
  4. etc

Il problema che sto cercando di risolvere è dato da due tipi, come posso determinare se uno può essere convertito all'altro. (ad esempio, consentire l'assegnazione di un tipo mutabile alla versione di sola lettura del tipo)

Il mio primo pensiero è stato quello di utilizzare un metodo virtuale e un visitatore. Tuttavia, poiché i tipi possono dipendere da altri (ad esempio, un tipo mutabile è un wrapper che si riferisce a un altro tipo.), Ciò può causare il numero di casi che devono essere gestiti per balloon. Sto cercando un design che lo mantenga al minimo.

    
posta MI3Guy 24.01.2015 - 16:21
fonte

1 risposta

3

The problem I am trying to solve is, given two types, how can I determine whether one can be converted to the other.

Nella progettazione della lingua, hai un insieme ben definito di regole per il tuo sistema di tipi. A è un sottotipo di B se e solo se queste condizioni sono valide. C può essere assegnato a una variabile di tipo D se e solo se queste altre condizioni sono valide. E fai i documenti per dimostrare che il tuo sistema di tipi è coerente (non puoi entrare in uno stato in cui le regole sono infranti).

Quindi, per l'implementazione è abbastanza semplice. Si definiscono alcune classi per definire le varie forme di tipo, spesso derivate da alcune classi di base di tipo comune, in modo che i tipi concreti possano essere utilizzati ovunque la lingua si aspetti un tipo. Quindi scrivi queste regole in semplici predicati binari statici (possibilmente ricorsivi) che ti dicono se per questi due tipi, le condizioni rimangono.

Sì, questo significa spesso un po 'di if T is GenericType di bruttezza. Puoi spostarti un po 'usando dynamic e facendo invocazione dinamica sui predicati. Non sono sicuro che sia particolarmente pulito.

La cosa buona dei predicati statici è che sono assurdamente facili da testare e dovrebbero essere una traduzione quasi 1: 1 del tuo sistema di tipi su carta. Sono difficili da rovinare e forniscono ai programmatori futuri (probabilmente voi) una documentazione chiara su quali sono le regole.

    
risposta data 24.01.2015 - 17:58
fonte

Leggi altre domande sui tag