1. A method for resolving a first type in a programming language to a first resolve stage, comprising: determining whether a first version at a first resolve stage of the type exists; if the first version at the first resolve stage does not exist: allowing the first thread exclusive access to the first type; resolving the first type to the first resolve stage by the first thread; and creating a first version of the first type based on the resolving.