There are a wide range of positions regarding the ontological nature of computer hardware and software. Moor [The British Journal for the Philosophy of Science 29 (1978), 213–222] argues that there is no significant ontological distinction between the two; Suber [The Journal of Speculative Philosophy 2 (1988), 89–119] argues that computer hardware is a kind of software; Colburn [The Monist (1999), 3–19] defines software as a special kind of entity he calls “concrete abstraction”, and Turner [Minds and Machines 21 (2011), 135–152] classifies software as a specification. In this paper, I examine the positions of each philosopher, and based on this examination, define ontological categories that account for computer hardware and software. As a result, clear distinctions emerge between computer hardware and software: A software program is a specification that consists of one or more programming language instructions and whose concretization is embodied by an artifact that is designed so that a physical machine may read the concretized instructions, whereas hardware is an artifact whose functions are realized in processes that directly or indirectly bring about the result of some calculation.