P: Ouvi muitas vezes a afirmação de que as linguagens dinamicamente digitadas são mais produtivas que as linguagens estaticamente. Quais são as razões para esta reivindicação? "
Isso tem razões históricas. Se você voltar algumas décadas, as linguagens dinâmicas eram indiscutivelmente mais produtivas que as linguagens estáticas (embora também significativamente mais lentas). Perl é claramente muito mais produtivo que C, se você conhece os dois e a tarefa em questão permite isso. Porém, com o tempo, os idiomas se emprestaram muito e os idiomas mais novos estão diminuindo a diferença (tanto em produtividade quanto em desempenho).
Aqui estão alguns pontos a considerar:
Coleta de lixo : A coleta de lixo é um enorme aumento de produtividade. Eu acredito que Java foi a primeira linguagem estática mainstream com GC. Antes disso, estática significava basicamente gerenciamento manual de memória. (Nota: Aqui e a seguir, considero apenas as principais linguagens. Existem muitas linguagens experimentais e de nicho que fornecerão contra-exemplos a qualquer ponto que eu faça.)
Segurança da memória : é uma melhoria de produtividade que você não precisa se preocupar em dar um tiro no próprio pé. Antes de linguagens estáticas "gerenciadas" como Java, estática normalmente significava acesso direto à memória. A depuração também faz parte da produtividade, e o acesso inseguro à memória pode levar a erros realmente obscuros.
Sistemas de tipo pesado. Antes da introdução de tipos parametrizados (como modelos ou genéricos) em linguagens estáticas, as limitações dos sistemas de tipos estáticos costumavam ser um fardo. Por exemplo, em Java, era necessário fazer o downcast explicitamente toda vez que você selecionava um item de uma coleção. Então você tem a sobrecarga sintática de um elenco e nenhum tipo de segurança. Considerando o quão onipresente as coleções são na programação, essa foi uma grande desvantagem.
Ter que declarar o tipo de tudo é muita digitação redundante, mas com a inferência de tipo moderna, isso pode ser reduzido significativamente.
Grande biblioteca padrão. O Python foi anunciado como "baterias incluídas" por causa da grande biblioteca padrão. Isso em comparação com C, que tem uma biblioteca padrão muito minimalista. Mas com plataformas como Java e .net, uma vasta biblioteca padrão está se tornando padrão, e linguagens mais recentes como Scala e F # estão herdando isso "de graça".
Estruturas de dados de primeira classe. Linguagens dinâmicas como Perl e Python possuem estruturas de dados de primeira classe, como listas e mapas, com atalhos sintáticos convenientes para operações comuns. Comparado a isso, C não tem coleções internas, exceto matrizes de tamanho fixo.
Encerramentos e sintaxe lambda - linguagens dinâmicas normalmente têm isso desde o início, mas linguagens estáticas adotam isso, mais recentemente Java.
A capacidade do REPL de testar rapidamente trechos de código de maneira interativa é um grande benefício. Porém, embora as ferramentas IDE, como a janela "imediata" no Visual Studio, as linguagens estáticas possam emular isso até certo ponto.
Ferramentas avançadas - além dos pontos acima em que as linguagens estáticas estão se aproximando da conveniência das linguagens dinâmicas, os editores modernos estão aproveitando a análise estática de uma maneira que as linguagens dinâmicas enfrentam dificuldades. Por exemplo, os editores podem fornecer refatorações automáticas seguras, algo estritamente impossível em um idioma dinâmico.
Conclusão: Historicamente era verdade, mas hoje a resposta é menos clara.
P: Então: o que há para dizer com relação à produtividade com a digitação dinâmica, que realmente é uma vantagem do próprio modelo de texto?
É um pouco difícil separar o modelo de digitação dinâmica das linguagens dinâmicas, mas, como exemplo, o C # adotou mais recursos mais dinâmicos ao longo do tempo, mesmo que seu núcleo seja uma linguagem estática. Esta é realmente uma prova de benefício do modelo de tipo dinâmico. Exemplos:
Reflexão A
reflexão é fundamentalmente um recurso de digitação dinâmica. Você inspeciona os tipos de objetos no runtime rater do que no tempo de compilação. Quando foi introduzido, era meio que desaprovado, mas em C # o uso da reflexão se torna cada vez mais onipresente, por exemplo, o ASP.Net MVC usa a reflexão fortemente.
Atributos
Atributos são um exemplo de digitação dinâmica. Você pode adicionar atributos arbitrários a uma classe em tempo de compilação e depois inspecionar em tempo de execução (por meio de reflexão) e manipular objetos com base nela. Algo como o MEP é basicamente uma estrutura de extensão baseada em um modelo de tipo dinâmico.
Linq para SQL, EF mv.
Os vários transformadores do Linq inspecionam consultas como objetos de tempo de execução e geram sql em tempo real. Não fica mais dinâmico do que inspecionar o código em tempo de execução. CodeDom é o outro lado da moeda, onde o código pode ser gerado em tempo de execução
Roslyn
Roslyn basicamente implementa eval
, que já foi considerado o recurso definidor de uma linguagem verdadeiramente dinâmica.
Dinâmico
O dynamic
tipo-é o recurso mais explicitamente dinâmico em C # e é anunciado para tornar a interação com objetos e linguagens externas mais simples e produtivas. Mas também é usado no MVC do Asp.net por conveniência.
O benefício de todos os recursos acima mostra que o modelo dinâmico possui vantagens definidas, mesmo em uma linguagem estática, com tipos parametrizados, tipos estruturais e inferência de tipos.