ARB_fragment_shader VS. ARB_fragment_program

Could somebody please explain the difference between a fragment shader and a fragment program? (e.g. uses, limitations, etc)

ARB_fragment_shader - this is the high level GLSL extension that allows you to program the pipeline using a C style syntax.

ARB_fragment_program - this is the low level ARB extension that allows you to program the pipeline using an ASM style syntax

In terms of abilities they are roughly equal, but different ways of programming the same thing, like C and ASM are two different ways of writing a CPU program. Some people will tell you that one or the other is better and if you’re really interested in that there’s a recent thread discussing if high/low level shader programming is better.

ARB_fragment_program is equal to Pixel Shader 2.0 in DirectX 9.0. You can’t access 2.0a,2.0b,3.0 features without extensions to ARB_fragment_program, e.g. NV_fragment_program_option, NV_fragment_program2. Currently, the ATI cards doesn’t support these extensions but in Radeon X??0 XT cards they supports 2.0b. So you can’t use the enhanced features with ARB_fragment_program.
for ARB_vertex_program, the situation is even more worse. ARB_vertex_program = Vertex Shader 1.1, to use Vertex shader 1.1+, you should use NV_vertex_program2, NV_vertex_program3. But ATI cards have no extension to expose these features. GLSL is vendor-independent. So you can take advantage of the new hardware feature easily.