A imutabilidade é bem compreendida há algum tempo. Python, Java e C ++ têm diferentes modelos de memória que dificultam as comparações diretas. O autor do artigo que você citou originalmente não parece conhecer C ++.
Como em Python, Java e na maioria das linguagens de múltiplos paradigmas, C e C ++ permitem mutabilidade por padrão. Isto é o que os programadores geralmente querem: se eu tiver uma String x
variável, desejo poder atribuir um novo valor x = "foo"
.
O sistema const em C e C ++ permite uma grande imutabilidade sutil que falta em Python, Java e até Scala. Se uma função C ++ usa a const std::string&
ou a const char*
, promete (e o compilador garante, até certo ponto), que essa função não irá (não pode!) Alterar o conteúdo dessa string. Dado um objeto const, só podemos invocar métodos desse objeto que também são marcados como const. Se uma classe C ++ tiver apenas membros públicos const
, o objeto será efetivamente imutável.
No entanto, isso às vezes é confuso, pois os objetos C e C ++ são locais de memória e variáveis são nomes para locais de memória. Por outro lado, variáveis em Python e Java são nomes para ponteiros para objetos. Em uma linguagem com semântica de referência, x = y
significa "faça x apontar para o mesmo objeto que y". Como estamos apenas copiando ponteiros, isso é possível com objetos imutáveis. Em uma linguagem com semântica de valores como C ++, significa "atualizar o conteúdo de x
com o conteúdo de y
". Portanto, se a redistribuição de uma variável for desejada em C ou C ++, a variável pode não ter um tipo const. Para fazer isso com objetos imutáveis, teríamos que usar um ponteiro explicitamente.
O fato de Java e Python usarem objetos de sequência imutáveis é uma decisão de design fundamental, mas não está diretamente conectada aos benefícios da imutabilidade em um ambiente de multithreading. Uma razão é que literais de string no código-fonte podem ser agrupados, o que reduz o número de objetos. Isso também é possível em C / C ++. Em C ++, o literal "foo"
tem tipo const char[4]
(o quarto caractere é o final '\0'
). Outro motivo é que as entradas em conjuntos e chaves em dictos / mapas não devem ser alteradas. Como as seqüências de caracteres são usadas amplamente como chaves de ditado (a maioria dos objetos Python é um ditado), a imutabilidade remove uma fonte comum de erros. Em Java, outro motivo para sequências imutáveis é o modelo de segurança Java. Todos esses motivos não têm nenhuma relação com o multithreading.
Se o Java fosse construído com imutabilidade em mente, a linguagem teria uma aparência muito diferente. Embora seja intimamente inspirado pelo C ++, os designers tentaram criar uma linguagem muito mais simples, livrar-se do const é um desses passos. A coisa Java equivalente a uma referência const C ++ é um adaptador ou decorador que implementa qualquer método de mutação como throws new NotImplementedException()
e encaminha chamadas de método não mutante para a coleção real. O fato de a coleção java.util interagir com todos implica em mutabilidade é um sinal claro de que eles não se esforçaram por um idioma de imutabilidade em primeiro lugar.
A solução que o Java apresentou para solucionar problemas de concorrência não era imutabilidade, mas um bloqueio generalizado. Cada objeto contém um mutex que pode ser usado para synchronized
blocos ou métodos inteiros. Como se vê, isso não é bom para o desempenho, não se adapta muito bem e é propenso a erros - você ainda precisa lidar com um estado global mutável.