Neither the executed program nor the kernel see any difference whatever one you call: It is both converted to the same system call by your C library. The executed program comes one additional step behind the kernel, thus has even less chance to see any difference.
For the exact kernel interface, look in the sources of either the kernel or your platform C library.
The shell (bash/ash/csh/sh/...) is not in any way priviliged. Still, going directly to the API call allows you to pass a bogus program name.