1. In a computer system, a method of annotating computer program code stored on a computer-readable medium, the computer program code operable to cause a computer to perform according to instructions in the computer program code, the method comprising: generating a specification in a programmable specification tool; inputting the specification to an inference engine; in the inference engine, inferring one or more annotations for a computer program, the inferring based at least in part on the specification; and outputting the one or more annotations from the inference engine; wherein the programmable specification tool is separate from the inference engine.