escalabilidade do Scala sobre Java

9

Eu li um artigo que diz que o Scala lida com a concorrência melhor que o Java.

http://www.theserverside.com/feature/Solving-the-Scalability-Paradox-with-Scala-Clojure-and-Groovy

... a limitação de escalabilidade está confinada especificamente à própria linguagem de programação Java, mas não é uma limitação da plataforma Java como um todo ...

Os problemas de escalabilidade do Java não são uma nova revelação. De fato, muito trabalho foi feito para resolver esses problemas, com dois dos projetos mais bem-sucedidos sendo as linguagens de programação denominadas Scala e Clojure ...

... Scala está encontrando maneiras de contornar o problemático thread e o paradigma de bloqueio da linguagem Java ...

Como isso é possível? O Scala não usa as principais bibliotecas do Java, o que traz todos os problemas de encadeamento e bloqueio do Java para o Scala?

Marcus
fonte

Respostas:

16

Bem, claro que sim. E o Java reutiliza toda a infraestrutura fornecida pela JVM, que foi escrita em C, e finalmente é executada no código da máquina!

O objetivo de permitir que os desenvolvedores permitam que seus aplicativos sejam dimensionados não é fornecer mais energia bruta. O Assembler já tem todo o poder que seu hardware permite e nenhum idioma pode fornecer mais. De fato, o objetivo das linguagens de ordem superior é restringir o que os programadores podem fazer nelas. Isso parece horrível, mas o gargalo ao escrever código ótimo, correto e eficiente não é o modelo de computação. São os cérebros das pessoas que precisam entender os programas escritos para a máquina. A experiência mostrou que não somos inteligentes o suficiente para entender a solução teoricamente ideal de um problema de computação complexo; provavelmente nem o reconheceríamos se o víssemos.

No exemplo concreto, presumivelmente, o artigo significa que o Scala fornece bibliotecas e conceitos de nível superior que tornam mais fácil para os desenvolvedores entenderem seus problemas da perspectiva da simultaneidade e, portanto, o resultado final é melhor e mais escalável do que codificar diretamente em Java ( ou C ou Assembler) teria sido. Isso não contradiz o fato de o Scala ser executado inteiramente em cima de uma máquina virtual Java. A JVM é uma invenção bonita que permite que todos os tipos de coisas legais sejam escritas com mais facilidade do que seria possível sem ela - incluindo estruturas e bibliotecas que facilitam coisas ainda mais complexas. Incrível, não é?

Kilian Foth
fonte
2
Idiomas de ordem superior fazem mais do que restringir. Eles também permitem abstrações - o assembler tem todo o poder do hardware, mas pouco faz para você abstrair sobre ele. E, neste caso em particular, eu diria que Scala faz é 50% de restrição, 50% de abstração.
Daniel C. Sobral
1
@ Daniel - Eu concordo que abstrações são valiosas, mas certamente abstração é apenas uma forma de restrição? No sentido de remover detalhes específicos de instâncias concretas e reter apenas o conceito geral? A Wikipedia coloca assim: "As
abstrações
5

É uma questão de suporte de biblioteca. Java usa a construção Thread de baixo nível para representar simultaneidade (é como a linguagem assembly do mundo da simultaneidade). Existem muitas bibliotecas e técnicas que você pode usar para criar soluções escaláveis, como usar o suporte fornecido pelo pacote java.util.concurrent e seguir as técnicas de Brian's Goetz em seu livro Java Concurrency in Practice. O Scala ajudou a introduzir coisas como a estrutura Akka (agora utilizável pelo Java agora) que integra algumas dessas práticas recomendadas e suporte à biblioteca. Isso não quer dizer que a linguagem Java não possa alcançar (coleções paralelas etc.), como Kilian afirma, tudo é executado na JVM e, portanto, na JMM.

Além disso, os objetos de Java também são mutáveis ​​por padrão e requerem algum conhecimento não trivial para torná-los efetivamente imutáveis. Scala supostamente facilita a criação de objetos imutáveis

Martijn Verburg
fonte
2

O Scala não usa as principais bibliotecas do Java, o que traz todos os problemas de encadeamento e bloqueio do Java para o Scala?

Bem, sim, e se você trancar o Scala, enfrentará os mesmos problemas. O ponto, no entanto, é que você não deveria, pois o Scala fornece abstrações que lidam com esse problema de maneira mais segura.

Agora, Scala faz duas coisas que realmente ajudam. Um deles é o modelo de ator, que pode ser pensado como um padrão de simultaneidade, fornecido por Scala como uma biblioteca. Se você é um programador Java, sugiro que você vá ao site da Akka e veja as coisas em Java. Essa é a biblioteca que substituirá a atual biblioteca de atores do Scala e você poderá usá-la no Java.

A segunda coisa que Scala faz que ajuda é usar estruturas de dados imutáveis. Não há nada que impeça o Java de usar estruturas de dados imutáveis ​​- Stringpor um lado, é imutável! As estruturas de dados imutáveis não sofrem de problemas de simultaneidade, pois os threads não podem alterá-las.

Há outras coisas que se somam a elas, para criar soluções completas, como agentes e stm (ambos disponíveis na Akka) ou travas (do Java).

Agora, as duas coisas acima podem ser feitas em Java, como eu mesmo disse. Você pode usar o Akka em Java e gravar estruturas de dados imutáveis ​​em Java (ou usar em bibliotecas que as fornecem). No entanto, Java faz mal ao usar essas coisas, porque não suporta tipos de ordem superior, nem fechamentos e funções de primeira classe.

Portanto, enquanto você pode fazer isso, os programadores geralmente não o fazem porque, em Java, escrever esse código é muito detalhado (quero dizer, muito mais do que o padrão para Java).

Daniel C. Sobral
fonte
0

O pensamento principal do artigo referenciado é:

a limitação de escalabilidade está confinada especificamente à própria linguagem de programação Java, mas não é uma limitação da plataforma Java como um todo. De fato, quando os programas são escritos para aproveitar adequadamente a plataforma Java subjacente, a escalabilidade linear não é um problema.

Se você precisar de escalabilidade massiva, sempre poderá tirar proveito de linguagens JVM periféricas como Scala e Clojure

Eu não posso concordar com isso. O uso de idiomas da JVM como o Scala implica:

  1. usando suporte de tempo de execução específico. Este suporte pode ser acessado diretamente a partir de programas Java.

  2. sintaxe específica, permitindo expressões concisas para facilitar o acesso ao suporte ao tempo de execução e menos propenso a erros. Isso é verdade, e escrever em Java puro é mais detalhado e requer mais disciplina, mas a diferença não é tão dramática.

Em resumo, o Scala lida com a concorrência melhor do que o Java por usar o modelo do Actor. O modelo do ator pode muito bem ser empregado em Java. Existem várias bibliotecas de atores para Java, incluindo Akka (usado pelo Scala), portanto, mudar para o Scala não é um imperativo.

O uso do modelo Actor via Java puro tem suas próprias vantagens:

  • depuração mais fácil
  • possibilidade de personalizar a biblioteca de atores usada. Isto é especialmente verdade quando a biblioteca é compacta e, portanto, compreensível, como esta minha: df4j
Alexei Kaigorodov
fonte