Linguagem de script ou Linguagem de programação dinâmica?

Afinal de contas, existe alguma diferença entre uma linguagem de script e uma linguagem de programação dinâmica?

Na verdade são duas definições diferentes.

A primeira refere-se a uma linguagem que é tipicamente interpretada. Ou seja, o código fonte do programa de script não gera um código binário antes da execução (salvo em casos onde se deseja melhorar a performance do programa, mas esta conversão é transparente para o usuário). Nos programas tradicionais, é necessário compilar o código fonte para então executar o arquivo binário gerado. Nos programas feitos em linguagem de script, executa-se diretamente o código fonte através de um interpretador. Considera-se também uma característica a presença de tipagem dinâmica, porém não é isto o que define uma linguagem de script, podendo inclusive não ocorrer.

Linguagem de programação dinâmica refere-se a linguagens de programação de alto nível que permitem a alteração do comportamento de um programa – como a adição de novos códigos ou alteração de métodos de objetos instanciados – durante a sua execução de uma maneira simples, ao contrário de linguagens tradicionais que fazem isto somente no momento da compilação, ou durante a execução mas não de uma forma trivial. Uma das características de uma linguagem de programação dinâmica é a presença comandos de eval que executam o código de dentro de uma string como se fosse um código do próprio programa.

Linguagens de programação dinâmica geralmente são linguagens de script, e vice-versa. Por isso a confusão que existe entre as duas definições.

Groovy e Ruby são ambos, mas trataremos aqui somente pelo nome de linguagens de programação dinâmica.