O que é a digitação dinâmica?

Eu ouvi esse termo usado com linguagens de script, como o PHP. O que exatamente isso significa?

    A digitação dinâmica é uma característica definitiva de uma linguagem. Uma breve explicação pode ser:

    Um idioma possui digitação dinâmica quando não associa valores estritamente a um tipo específico, mas é projetado para “decidir” qual o tipo de valor em tempo de execução, com base em como você está tentando usá-lo.

    Por exemplo, em PHP você pode escrever

    $count = "5"; // defines a string variable 

    e depois continue dizendo

     $count = $count * 2; // this is legal and has the obvious result¹ 

    O que aconteceu aqui? Por um lado, o compilador não reclamou que você está tentando multiplicar uma string por um número e se recusar a compilar o programa (como aconteceria em idiomas como C, C ++, C # e Java). Ele produziu código para encaminhar os argumentos $count e 2 para o operador de multiplicação, assim como você perguntou e seguiu em frente.

    Com o programa compilado, a digitação dinâmica entra em vigor no tempo de execução . Quando o operador de multiplicação passa a olhar para seus operandos, ele verifica o que é o tipo atual de cada um, se quiser. Como antes, é uma string e um int. Mas o operador sabe que ele só pode multiplicar dois inteiros (ignore flutuadores por simplicidade), então, de alguma forma, ele deve produzir um valor inteiro da string. Todas as linguagens de digitação dinâmica têm regras que estipulam como essa conversão funciona entre todos os pares de tipos de valor; neste caso, o PHP produz o número inteiro 5 da string “5”.

    Outro aspecto da digitação dinâmica que você pode encontrar é chamado de digitação de pato ; isso aplica-se apenas a valores de tipos de class (ou seja, não são primitivos). Em suma, a digitação do pato estipula que, quando você escreve

     $object->quack(); 

    o compilador não tentará ver se o $object é de um tipo que possui um método chamado quack que não possui argumentos. Em vez disso, ele tentará o tempo de execução para ver se o $object realmente possui esse método; se o fizer, o método será chamado independentemente do tipo de object que temos à mão (pode ser um pato, pode ser um cão para todos os cuidados do compilador).

    Notas de rodapé:

    ¹ Multiplicar uma string por um número inteiro é o que é a tipagem dinâmica (produzindo um número inteiro de uma string porque a multiplicação exige uma); no entanto, também há digitação solta no trabalho aqui (permitindo que a multiplicação compile sem ser capaz de provar que ambos os operandos são realmente ints).