1. A non-transitory computer-readable medium storing instructions that, when executed by one or more processors, cause the one or more processors to: receive a program written in a late-bound programming language that supports function overloading, where: the program has a structure; and the late bound programming language delays function binding until a run time of the program; identify a function call of a function in the program, the function having a function name and the function being overloaded such that the multiple function implementations are provided for the function name, the function call being bound during the run time of the program, the function call being bound by a function binding, the function binding specifying: which of the function implementations is to be invoked in response to the function call, and the function name; analyze the function call during the run time of the program, wherein the function call specifies one or more function arguments, each of the one or more function arguments having a type, the analyzing comprising: collecting the type of the one or more function arguments when the function is called during the run time of the program, collecting an execution context representing a state of the runtime environment executing the program when the program is running, and collecting dependency relationships between functions and data objects in the program; determine a set of one or more predicted function bindings for the program, the determining based on the analyzing of the collected type of the one or more function arguments, the collected execution context and/or the collected dependency relationships; and generate a customized runtime environment for the program, the customized runtime environment including the predicted function bindings.