Fingerprinting for Programs is aimed at analyzing code blocks on a semantic level. This is done by symbolically executing the code block via SPF over JPF in order to generate path constraints for each possible path that a program may take. The path constraints are then put into canonical form and analyzed. Level of refinement of the path constraints dictate the level at which we model programs i.e. If we do not refine the path constraints at all, the program is modeled on a syntactical level. If we stop refinement early, the program is modeled on a semantic level but syntactical structure of the program is still considered. If we completely refine the path constraints and put them into canonical form, the program is modeled on a semantic level with no consideration towards the syntactical structure of the program. This gives us options on applications of fingerprinting for programs. Further research in this field could result in semantic patterns not just being observed but rather analyzed. Applications of this analysis include the possible creation of a semantic auto-complete for programmers.