Resposta curta: não, porque a equivalência de Turing.
Resposta longa: esse cara está sendo um troll. Embora seja verdade que os sistemas de tipos "restrinjam você a um subconjunto", as coisas fora desse subconjunto são, por definição, coisas que não funcionam.
Tudo o que você é capaz de fazer em qualquer linguagem de programação completa de Turing (que é projetada para programação de uso geral, além de muitas que não são; é uma barra bastante baixa para limpar e existem vários exemplos de um sistema se tornando Turing- (não intencionalmente)), você pode fazer em qualquer outra linguagem de programação completa de Turing. Isso é chamado de "equivalência de Turing" e significa apenas exatamente o que diz. É importante ressaltar que isso não significa que você possa fazer a outra coisa com a mesma facilidade na outra linguagem - alguns argumentariam que esse é o objetivo de criar uma nova linguagem de programação em primeiro lugar: para oferecer a você uma maneira melhor de fazer certas coisas. coisas que idiomas existentes sugam.
Um sistema de tipo dinâmico, por exemplo, pode ser emulado no topo de um sistema de tipo OO estático, apenas declarando todas as variáveis, parâmetros e valores de retorno como o Object
tipo base e, em seguida, usando a reflexão para acessar os dados específicos, portanto, quando você perceber isso você vê que não há literalmente nada que você possa fazer em uma linguagem dinâmica que você não possa fazer em uma linguagem estática. Mas fazer dessa maneira seria uma grande bagunça, é claro.
O cara da citação está correto em que tipos estáticos restringem o que você pode fazer, mas esse é um recurso importante, não um problema. As linhas na estrada restringem o que você pode fazer no seu carro, mas você as acha restritivas ou úteis? (Eu sei que não gostaria de dirigir em uma estrada movimentada e complexa, onde não há nada que diga aos carros que sigam na direção oposta para se manterem do lado deles e não cheguem aonde estou dirigindo!) Estabelecendo regras que definem claramente o que é considerado comportamento inválido e garantindo que isso não aconteça, você diminui bastante as chances de ocorrer uma falha grave.
Além disso, ele está descaracterizando o outro lado. Não é que "todos os programas interessantes que você deseja escrever funcionem como tipos", mas "todos os programas interessantes que você deseja escrever exigirão tipos". Depois que você ultrapassa um certo nível de complexidade, fica muito difícil manter a base de código sem um sistema de tipos para mantê-lo alinhado, por dois motivos.
Primeiro, porque é difícil ler o código sem anotações de tipo. Considere o seguinte Python:
def sendData(self, value):
self.connection.send(serialize(value.someProperty))
Como você espera que os dados pareçam que o sistema na outra extremidade da conexão receba? E se está recebendo algo que parece completamente errado, como você descobre o que está acontecendo?
Tudo depende da estrutura de value.someProperty
. Mas como é isso? Boa pergunta! O que está chamando sendData()
? O que está passando? Como é essa variável? De onde veio? Se não for local, você deve rastrear toda a história value
para rastrear o que está acontecendo. Talvez você esteja passando outra coisa que também tem uma someProperty
propriedade, mas ela não faz o que você acha que faz?
Agora vamos dar uma olhada com anotações de tipo, como você pode ver na linguagem Boo, que usa sintaxe muito semelhante, mas é tipicamente estatizada:
def SendData(value as MyDataType):
self.Connection.Send(Serialize(value.SomeProperty))
Se houver algo de errado, de repente, seu trabalho de depuração ficou com uma ordem de magnitude mais fácil: procure a definição de MyDataType
! Além disso, a chance de ter um comportamento ruim porque você passou por um tipo incompatível que também possui uma propriedade com o mesmo nome repentinamente chega a zero, porque o sistema de tipos não permite que você cometa esse erro.
O segundo motivo se baseia no primeiro: em um projeto grande e complexo, você provavelmente tem vários colaboradores. (E, se não, você está construindo por um longo tempo, o que é essencialmente a mesma coisa. Tente ler o código que você escreveu há 3 anos, se você não acredita em mim!) Isso significa que você não sabe o que foi. passando pela cabeça da pessoa que escreveu quase parte do código no momento em que o escreveu, porque você não estava lá ou não se lembra se era o seu próprio código há muito tempo. Ter declarações de tipo realmente ajuda a entender qual era a intenção do código!
Pessoas como o sujeito da citação frequentemente descaracterizam os benefícios da digitação estática como "ajudar o compilador" ou "tudo sobre eficiência" em um mundo onde recursos de hardware quase ilimitados tornam isso cada vez menos relevante a cada ano que passa. Mas, como mostrei, embora esses benefícios certamente existam, o principal benefício está nos fatores humanos, particularmente na legibilidade e manutenção do código. (A eficiência adicional é certamente um bom bônus!)