Em resumo: como os sistemas de tipos são categorizados em contextos acadêmicos; particularmente, onde posso encontrar fontes respeitáveis que tornem claras as distinções entre diferentes tipos de sistemas de tipos?
Em certo sentido, a dificuldade com esta pergunta não é que não consigo encontrar uma resposta, mas sim que posso encontrar muitas, e nenhuma se destaca como correta. O pano de fundo é que estou tentando melhorar um artigo no wiki da Haskell sobre digitação , que atualmente afirma as seguintes distinções:
- Sem digitação: o idioma não tem noção de tipos ou de uma perspectiva digitada: existe exatamente um tipo no idioma. A linguagem Assembly possui apenas o tipo 'padrão de bits', Rexx e Tk apenas o tipo 'texto', o MatLab principal possui apenas o tipo 'matriz de valor complexo'.
- Digitação fraca: existem apenas alguns tipos distintos e talvez sinônimos de tipo para vários tipos. Por exemplo, C usa números inteiros para booleanos, inteiros, caracteres, conjuntos de bits e enumerações.
- Digitação forte: conjunto de tipos refinados, como Ada, idiomas wirthianos (Pascal, Modula-2), Eiffel
Isso é totalmente contrário à minha percepção pessoal, que era mais parecida com:
- Digitação fraca: os objetos têm tipos, mas são implicitamente convertidos em outros tipos quando o contexto exige. Por exemplo, Perl, PHP e JavaScript são todos os idiomas em que
"1"
podem ser usados em mais ou menos qualquer contexto1
possível. - Digitação forte: os objetos têm tipos e não há conversões implícitas (embora a sobrecarga possa ser usada para simulá-las), portanto, usar um objeto no contexto errado é um erro. No Python, a indexação de uma matriz com uma string ou float lança uma exceção TypeError; em Haskell, ele falhará no momento da compilação.
Pedi opiniões sobre isso a outras pessoas mais experientes no campo do que eu, e uma delas deu essa caracterização:
- Digitação fraca: a execução de operações inválidas nos dados não é controlada ou rejeitada, mas apenas produz resultados inválidos / arbitrários.
- Digitação forte: operações com dados são permitidas apenas se os dados forem compatíveis com a operação.
Pelo que entendi, a primeira e a última caracterizações chamariam C de tipo fraco, a segunda chamaria de tipo forte. O primeiro e o segundo chamariam Perl e PHP de tipo fraco, o terceiro os chamaria de tipo forte. Todos os três descreveriam o Python como fortemente tipado.
Eu acho que a maioria das pessoas me diria "bem, não há consenso, não há significado aceito dos termos". Se essas pessoas estiverem erradas, eu ficaria feliz em ouvir sobre isso, mas se elas estiverem certas, como os pesquisadores de CS descrevem e comparam sistemas de tipos? Que terminologia posso usar que é menos problemática?
Como questão relacionada, considero que a distinção dinâmica / estática é frequentemente dada em termos de "tempo de compilação" e "tempo de execução", o que considero insatisfatório, dado que a compilação ou não de um idioma não é tanto uma propriedade desse idioma como suas implementações. Eu sinto que deveria haver uma descrição puramente semântica da tipagem dinâmica versus estática; algo como "uma linguagem estática é aquela em que toda subexpressão pode ser digitada". Eu apreciaria quaisquer pensamentos, particularmente referências, que tragam clareza a essa noção.