1. A computer-implemented method for facilitating the development and execution of a software program, comprising: during runtime of the software program, obtaining a function call associated with an overloaded function and a generic type hierarchy; determining an applicability of an implementation of the overloaded function to the function call; selecting the implementation for invocation by the function call based on the determined applicability and a partial order of implementations for the overloaded function; and performing type inference on one or more generic type parameters of the implementation by: applying a constraint-solving technique to a set of initial limits and a set of constraints on the one or more generic type parameters; and when the constraint-solving technique does not provide a solution to the initial limits and the constraints, determining that the implementation is not applicable to the function call.