Sto sviluppando una lingua come Vala e OOC che ricompila in C.
Questo significa che, alla fine, ogni funzionalità deve essere adattabile al codice C in un modo o nell'altro. Generics è una delle funzionalità che vorrei implementare nella mia lingua.
Come probabilmente sapete, C è un linguaggio tipizzato rigorosamente. Ad eccezione del puntatore opaco del vuoto, non c'è modo di passare un argomento di un tipo sconosciuto. Questo perché il compilatore deve conoscere la dimensione esatta dell'argomento passato o restituito.
Le seguenti soluzioni mi vengono in mente:
- Boxing: crea un sindacato in grado di memorizzare tutti i tipi possibili
- Passa un puntatore al parametro, piuttosto che al parametro stesso.
Entrambi hanno i loro lati negativi:
-
- La dimensione del tipo generico
T
sarà uguale al tipo più grande possibile - Le dimensioni sono predeterminate, una struttura con una dimensione diversa non può essere passata per valore
- Più lento, perché ogni argomento deve essere inserito / disinserito
- La dimensione del tipo generico
-
- Il parametro non viene copiato nel nuovo ambito di stack
- Problemi di gestione della memoria a causa di quanto sopra
- Non il comportamento desiderato a causa di quanto sopra
Sono interessato a sapere come poter adottare questo principio di alto livello in un linguaggio di livello inferiore e anche in che modo altri linguaggi di alto livello hanno superato questo problema.
Modifica
Come ha sottolineato @delnan, un'altra possibilità è la monomorfizzazione, che crea una nuova funzione per ogni tipo di dati. Questo ha alcuni aspetti negativi:
- Il tipo
T
deve essere definito in anticipo (non molto generico) - La dimensione binaria diventa più grande (che, scontato, non è molto rilevante al giorno d'oggi)