There are a wide range of positions regarding the ontological nature of computer hardware and software. Moor (1978) argues that there is no significant ontological distinction between the two; Suber (1988) argues that computer hardware is a kind of software; Colburn (1999) defines software as a special kind of entity he calls “concrete abstraction”, and Turner (2011) 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.