What's the difference between `extraArgs` and `specialArgs` for lib/eval-config.nix

In the lib/eval-config.nix, there’s extraArgs and specialArgs. They both seem to do the same thing. What’s the reason for having different ways of providing custom arguments to modules, and what do they do?