After the structured program theorem by Böhm & Jacopini (1966), different computer programming languages spread out. In fact, in spite of the fact that most programming languages are Turing-complete and hence they have the same expressive power, some programming languages are more equal than others in accomplishing specific goals, although no particular programming language is better than the others in absolute terms. This paper addresses the research question of what changes in terms of the programmers' knowledge in choosing one programming language instead of another. The method of levels of abstraction by Floridi (2008) is used in analysing four prototypical paradigms of computer programming: procedural, functional, object-oriented, and logic-based. The analysis provides the structure on which each language' constructions can be canonically simulated by another language. Furthermore, it clarifies the epistemological commitments adopted by the programmer within each paradigm, and in particular the levels of abstraction that get hidden.