@b0rk_reruns Also, some commands are programs, but bash has a built-in version anyway for performance. The built-in version doesn't need to spawn a new process and it's usually faster.
Examples are `echo`, `printf`, `true`, `false`, `test` (also aliased to `[`).

Functions are commands, too, but they're neither a program nor a built-in.

@b0rk_reruns besides cd exit and source, which ones really HAVE TO be builtins?
@f4grx @b0rk_reruns echo and printf don't need to be builtins, and they're actually also programs. Builtins are just faster.
I guess you could theoretically make alias a program, but it would have different semantics.
read and declare also need to be builtins. And since you can't completely eliminate builtins, you need type to be a builtin in order to identify other builtins.