Existe uma maneira de traduzir o código-fonte do Scala para o código-fonte Java?

Melhor resposta

Para responder à sua pergunta, depende do que você entende por “código java”. O código Scala é um código java legal, você só precisa adicionar o scala.jar ao caminho da classe java. scalac é apenas um invólucro em torno do comando java que passa o objeto Main correto e define o caminho de classe corretamente. (chame $ vim `which scalac` para ver este script).

Por exemplo, se você estiver em um Mac com a pilha Typesafe Scala, você pode realmente compilar o código Scala encontrado em myFile.scala usando o comando :

java -Dscala.home=/Applications/typesafe-stack/ -D.scala.usejavacp=true -cp .:/Applications/typesafe-stack/lib/scala-library.jar:/Applications/typesafe-stack/lib/scala-compiler.jar scala.tools.nsc.Main myFile.scala

Darei mais algumas explicações abaixo, mas ficarei feliz em aceitar edições de especialistas em Scala por aí.

Vamos pegar o seguinte objeto scala simples (que eu compilei, mas não testei …)

class Adder(val x:Int){

def add(y:Int) = x+y

def applyFunction(f: Int=>Int) = f(x)

}

É um método estúpido. Ele pega um int, e então permite que você adicione outro int a ele ou aplique uma função que a esse inteiro.

Chamamos scalac e geramos os arquivos de classe. Agora podemos chamar o dissasembler java, javap para visualizar os campos reais gerados e métodos de classe.

$ javap Adder

public class Adder estende java.lang.Object implementa scala.ScalaObject {public int x (); public int add (int); public int applyFunction (scala.Function1); Public Adder (int); }

Este é um objeto Java perfeitamente satisfatório que poderia ser implementado usando Java explicitamente.

Agora você precisa ter cuidado ao usar técnicas Scala mais avançadas, como traits.

Vejamos este bloco de código

abstract class Thing {

def method:Unit

}

trait OtherThing {

def method { println("Hello")}

}

object Main{

def main(args: Array[String]) = {

val A = new Thing with OtherThing

A.method

}

}

Você tem uma classe abstrata que tem seu método implementado em um traço que é misturado no momento da definição do objeto.

Quando você compila isso, você verá muito mais classes com símbolos $ funky e a palavra anon. O mais interessante é a classe encontrada em Main $$ anon $ 1.class.

Chamando javap Main $$ anon $ 1, vemos que temos generat ed uma nova classe

public final class Main$$anon$1 extends Thing implements OtherThing{

public void method();

public Main$$anon$1();

}

que usa interfaces java e subclasses para representar adequadamente esta classe.

Incrível, certo?

Resposta

Não. Scala é uma ótima linguagem de programação no papel, mas não vai decolar. Observe a evolução de seu uso no gráfico abaixo:

Você consegue ver a linha azul claro que representa o Scala? Não? Bem, isso representa cerca de 2\% das solicitações de pull no Github (veja mais estatísticas aqui ). A curva não é apenas plana, na verdade, está ligeiramente abaixo dos 2,3\% de cinco anos atrás. Isso apesar do Spark , o projeto Scala mais popular, ter sido lançado em 2014.

Então, não, não há como o Scala ser vai decolar, apesar do que muitos de nós pensamos na primeira vez que usamos o idioma. O que poderia dar errado? Uma linguagem que opera na JVM bem testada e que oferece a flexibilidade de ser usada apenas como “um java melhor” ou “totalmente funcional”, ou mesmo outras sutilezas como atores ou futuros pareciam uma dádiva de Deus.

Acontece que as coisas funcionam de maneira diferente na prática. Scala é mais uma linguagem que você precisará oferecer suporte a menos que possa fazer tudo em Scala, o que é muito improvável. No mínimo, você combinará Scala e Java, então por que não se limitar apenas ao Java? Esse parece ser o principal motivo pelo qual o LinkedIn decidiu descontinuar o uso do Scala em sua pilha.

Mas, na verdade, fica pior, o Scala, por causa de seu design e flexibilidade, é um saco de manter . É como C ++, mas pior. Por exemplo, você pode fazer com que programadores especializados em Scala enlouqueçam com um estilo de codificação totalmente funcional para empacotar uma quantidade absurda de informações em uma linha de código que um novato não entenderá. Portanto, se você deseja manter uma base de código Scala, precisa ser bastante rígido sobre “como” usá-la. E, então, você precisa sair e contratar desenvolvedores que podem e estão dispostos a codificar Scala dessa maneira específica. Boa sorte com isso. Até mesmo o Twitter, a potência do Scala, disse que eles não escolheriam Scala como sua linguagem de programação se tivessem que fazê-lo “hoje” (ou em 2015 para ser mais concreto). Yammer também mudou de Scala para Java por motivos semelhantes.

Então, acontece que o Scala não apenas não está decolando, mas na realidade provavelmente está em declínio, mantido apenas pela popularidade do Spark. Na verdade, Scala é muito bom para dados, então a escolha faz sentido. No entanto, não ficaria surpreso se, com o tempo, as pessoas acabassem usando Python como a linguagem padrão do Spark, devido ao quão popular está se tornando entre os cientistas de dados.

Atualização:

Para aqueles que afirmam que o Github não é uma boa representação da popularidade do idioma, aqui estão alguns mais: Scala nem mesmo aparece no Top 20 do Tiobe , de acordo com PyPL , com base em Pesquisas do Google, sua popularidade é de 1,2\%, embora medem um ligeiro aumento. Você pode encontrar muitos outros índices aqui . Eu não acho que nenhum mostra nada nem perto da linguagem “decolando”.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *