Shader programs must be compiled before use. Fortunately, OpenGL offers an interface to load shader programs in text form. The shader source code uses a syntax similar to the C code with several limitations. For instance, you can't perform recursive function calls. After compilation, you can check whether there were any errors in the process.
Shaders can use input values from your application. These input values are called uniforms. You can use these values in any part of the rendering pipeline, which consists of several shader program stages: