I never thought of it this way

Logictells us what propositions exist (what sorts of thoughts we wish to express) and what constitutes a proof (how we can communicate our thoughts to others).Languages(in the sense of programming) tells us what types exist (what computational phenomena we wish to express) and what constitutes a program (how we can give rise to that phenomenon).Categoriestell us what structures exist (what mathematical models we have to work with) and what constitutes a mapping between them (how they relate to one another). In this senseall three have ontological force; they codify what is, not how to describe what is already given to us.In this sense they are foundational; if we suppose that they are merely descriptive, we would be left with the question of where these previously given concepts arise, leading us back again to foundations.