Domanda

Qualcuno sa di un gestita linguaggio di programmazione implementata su .NET che contiene un tipo di dati specializzato che non è mappato fino al Common Type System / FCL / BCL o uno che non dispone di un spedito equivalente .NET (ad esempio spediti tipi standard come System.String, System.Int32)?

Questa domanda sarebbe probabilmente venuto dal punto di vista di qualcuno porting di un compilatore (anche se non sto facendo quello).

E 'semplice come la lingua creazione di un nuovo tipo di dati al di fuori del BCL / FCL per il suo tipo specializzato? Se così fa questa interoperabilità Hinder tra linguaggi di programmazione che sono altrimenti abituati a mappare tutto il loro built-in tipi di dati a ciò che è nel BCL / FCL, come Visual Basic e C #?

posso immaginare questa situazione potrebbe accadere se un compilatore linguaggio oscuro di qualche tipo viene portato su .NET per i quali non v'è alcuna mappatura diretta di uno dei suoi tipi di dati impliciti al quadro fornito.

Come è la situazione supportato o consentito in generale? Quale sarebbe l'aspettativa del compilatore e il Common Language Runtime?

È stato utile?

Soluzione

Delphi for .NET implementato concezione del linguaggio Delphi di variabili di classe (che può contenere un riferimento a un tipo di classe), metodi di classe virtuali e costruttori virtuali (chiamato tramite un riferimento di classe). Nessuno di questi ha alcun analogica diretta in CLR - metodi statici in CLR non può essere virtuale, e costruttori non può essere virtuale.

Dato CLR ha una ricca zuppa di rtti tali, questi manufatti non sono strettamente necessario a CLR. Se si vuole costruire un esempio di un tipo in fase di esecuzione nel codice che non conosce il tipo esatto al momento della compilazione, è possibile farlo con la riflessione o di altre tecniche. Queste caratteristiche del linguaggio Delphi è cresciuto dal prodotto Win32 nativo compilato in cui il runtime informazioni sul tipo è limitata. Tutto questo è stato implementato su .NET 1.0 e 1.1, molto tempo prima che qualcosa di simile al DLR è arrivato.

Queste caratteristiche del linguaggio Delphi potrebbe essere emulato in CLR utilizzando la riflessione, ma per motivi di prestazioni abbiamo optato per la loro attuazione direttamente in IL creando un tipo di "meta di classe" che era un sidecar ad ogni tipo di classe dichiarata in Delphi. Se il codice Delphi assegnato un tipo di classe Delphi per una variabile di riferimento classe, abbiamo generato codice IL per assegnare l'istanza singleton della classe meta corrispondente alla variabile. chiamate di metodo virtuali tramite la variabile di riferimento classe sono stati codegen'd come IL chiamate di metodo virtuale nell'istanza Metaclasse che rimbalzavano all'attuazione effettiva metodo statico nel tipo classe corrispondente. Questo ha permesso le chiamate di classe metodo virtuale a comportarsi ancora polymorphically (per chiamare l'appropriata attuazione al tipo dell'istanza utilizzata per effettuare la chiamata) e con il minimo costo prestazioni runtime. Questa implementazione è stata anche di tipo-sicuro e verificabile.

Queste caratteristiche di metodo di classe virtuali erano applicabili solo alle classi dichiarate nella sintassi Delphi, e solo utilizzabile nella sintassi Delphi. Credo che i tipi di meta sono stati contrassegnati come non compatibile con CLS in modo che altri linguaggi .NET sarebbe (più probabile) ignorarli quando si utilizza classi create in Delphi. Altri linguaggi .NET non hanno potuto fare uso di queste caratteristiche del linguaggio Delphi specifico (a meno che lo sviluppatore è stato davvero determinato e si arrampicò attraverso le impalcature per effettuare le chiamate appropriate / attraverso le classi meta di nome brutti)

In generale, si dovrebbe non aspettatevi altre lingue fanno uso di non-CLS manufatti creati da / per la propria lingua. Se volete altre lingue per fare uso di roba creato dalla vostra lingua, è necessario capire come rappresentare la vostra salsa speciale in un modo che può essere rappresentato in modo ragionevole in termini CLS compliant. Che non può essere possibile, a seconda della natura della salsa speciale.

metodi di classe virtuale Delphi erano a disposizione di altri linguaggi .NET come metodi statici normali. La natura polimorfa non è stato esposto ad altri linguaggi .NET in gran parte perché CLS (né altre lingue) semplicemente non possono esprimere il concetto.

Idealmente, ogni lingua sarebbe in grado di esprimere ogni costrutto immaginabile altrettanto bene. Ma in realtà non è questo il caso. Alcune funzioni grafiche sono più facili da esprimere in coordinate cartesiane, mentre altri sono notevolmente semplificate utilizzando le coordinate polari. Lo stesso vale per i linguaggi di programmazione.

E 'ok per inventare nuovi mezzi di espressione nella vostra lingua anche quando è implementato su CLR. Basta essere sicuri di mantenere una chiara definizione di ciò che i tipi assomigliano ai programmatori che lavorano al di fuori la lingua se si prevede che il codice della vostra lingua per essere chiamato da altri. L'implementazione avrà una dualità:. Come stanno le cose per gli utenti di lingua, e come le cose cercare di utenti al di fuori della vostra lingua

Nota: Non credo che tutto questo vale anche per il nuovo prodotto di Delphi for .NET, Delphi Prism. Non credo che Delphi Prism supporta metodi della classe virtuale.

Altri suggerimenti

Non proprio. Ogni lingua ha l'onere finale di dover essere in grado di girare su hardware commodity per avere successo. Il CTS è un modello abbastanza buono per i tipi che possono essere gestiti in modo efficiente su hardware corrente.

Quello che potrebbe essere necessario è una grossa fetta di supporto runtime di adattamento tra il sistema il tipo di linguaggio e la CLI di. Un esempio classico è la DLR, il sistema di supporto runtime per i linguaggi dinamici come Python e Ruby. Lo fa essenzialmente ciò che un tale interprete del linguaggio deve fare così, ha perf comparabile. Niente trucchi btw, tutto è puro codice C #.

Una tale libreria di supporto runtime può ottenere lento quando la lingua ha caratteristiche che non sono disponibili a tutti. ereditarietà multipla, per esempio. E 'nativo 'supportato' dal CLR e compilatore JIT. Si può prendere qualsiasi programma standard compliant C ++ che utilizza MI, eseguirlo tramite il compilatore C ++ con l'opzione / CLR e vi ritroverete con un assieme contenente IL puro che sarà just-in-time compilato in fase di esecuzione. In nessun sforzo di immaginazione potrebbe chiamare il risultato di un programma gestito, non sarà verificabile e non utilizzerà il garbage collector. Risolvere che sta per richiedere una libreria di supporto che sta andando ad avere per emulare l'ereditarietà multipla. Possibile, dubito che sarà competitivo.

Beh, non c'è c ++ / CLI. Ci si può creare classi C ++ che non sono visibili in .NET. E 'questo quello che stai dopo?

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