Checked and template generic terminology
Table of contents
Abstract
Change terminology from “generics” and “templates” to “checked generics” and “template generics”. Afterwards, “generics” will be an umbrella term that include templates.
Problem
The C++ community does “generic programming” using templates in C++, and so thinks of templates as a mechanism for implementing generics. In Carbon, templates and other generic features are more similar than they are different, so it is worthwhile to have an easy way to talk about things that apply to both.
Proposal
Change terminology from “generics” and “templates” to “checked generics” and “template generics”. Afterwards, “generics” will be an umbrella term that include templates.
Similarly, for parameters, use “checked generic parameter” and “template generic parameter”, with the umbrella term “generic parameter” describing both kinds. The word “generic” can be omitted from these terms if it’s clear from context, which will usually be the case for template parameters.
Some existing design docs give examples of the difference before and after this proposal:
- The generics overview, for example, currently demonstrates the current approach of using “generics” and “templates”.
- The generics section of the design overview demonstrates the use of the proposed new terminology.
Rationale
Using the terminology expected by the community supports these goals:
- Code that is easy to read, understand, and write since our documentation governing the interpretation of that code will be more easily understood and with greater accuracy.
- Interoperability with and migration from existing C++ code since there will be a smaller terminology gap between Carbon and C++.
Alternatives considered
Status quo: “generic” means “checked”
Use “generic” for checked generics, “template” for template generics, and “template or generic” when we mean both.
Advantages:
- The terms “generic” and “template” are more concise than “checked generic” and “template generic”.
- The term “template” is more familiar than “template generic” to people coming from C++.
Disadvantages:
- Does not provide a unifying term for templates and generics, leading to our needing to talk about both in various places, given that they are very similar concepts in Carbon.
- Does not acknowledge that templates are used for generic programming and as such are a kind of generic.
- Carbon’s template generics aren’t exactly the same as C++’s templates, so this may give the wrong intuition for people coming from C++ in some cases.
Use the name “templates” instead of “template generics”
Use “checked generic” for checked generics, “template” for template generics, and “generic” when we mean both.
Advantages:
- More concise term than in this proposal.
- More familiar to people coming from C++.
- People will likely use this term anyway rather than saying “template generics”.
Disadvantages:
- Does not parallel the term “checked generics”.
- Loses the implication that a template generic is a kind of generic.
- Carbon’s template generics aren’t exactly the same as C++’s templates, so this may give the wrong intuition for people coming from C++ in some cases.
Use the name “unchecked generics” instead of “template generics”
Use “checked generic” for checked generics, “unchecked generic” for template generics, and “generic” when we mean both.
Advantages:
- Creates a better parallel between “checked generics” and “unchecked generics”.
- Describes the semantics rather than the implementation strategy, especially given that templating / monomorphization is also the implementation strategy we intend to use for unchecked generics.
Disadvantages:
- Unfamiliar to people coming from C++.
- Would either need to rename the
template
keyword or pick new non-keyword syntax for it, or have a mismatch between keywords and terminology. - Template generics still involve checking, it just can’t complete until later when the argument values are known.
This was suggested in #1443.