Cè un modo per tradurre il codice sorgente Scala in codice sorgente Java?

Migliore risposta

Per rispondere alla tua domanda, dipende da cosa intendi per “codice java”. Il codice Scala è un codice java legale, devi solo aggiungere scala.jar al percorso della classe java. scalac è solo un wrapper attorno al comando java che passa loggetto Main corretto e imposta correttamente il classpath. (chiama $ vim `which scalac` per vedere questo script).

Ad esempio, se sei su un Mac con lo stack Scala Typesafe, puoi effettivamente compilare il codice Scala trovato in myFile.scala usando il 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

Darò qualche spiegazione in più di seguito, ma accetterò volentieri le modifiche dagli esperti di Scala là fuori.

Prendiamo il seguente semplice oggetto scala (che ho compilato ma non testato …)

class Adder(val x:Int){

def add(y:Int) = x+y

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

}

È un metodo stupido. Prende un int, e poi ti permette di aggiungere un altro int o di applicare una funzione a quellintero.

Chiamiamo scalac e generiamo i file di classe. Ora possiamo chiamare java dissasembler, javap per visualizzare i campi e i metodi di classe effettivamente generati.

$ 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); }

Questo è un oggetto Java perfettamente funzionante che potrebbe essere implementato usando Java esplicitamente.

Ora devi stare attento quando usi tecniche Scala più avanzate, come i tratti.

Esaminiamo questo blocco di codice

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

}

}

Hai una classe astratta che ha il suo metodo implementato in un tratto che viene mescolato al momento della definizione delloggetto.

Quando lo compili, vedrai molte più classi con simboli $ funky e la parola anon. è la classe che si trova in Main $$ anon $ 1.class.

Chiamando javap Main $$ anon $ 1 vediamo che abbiamo generato ed una nuova classe

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

public void method();

public Main$$anon$1();

}

che utilizza interfacce java e sottoclassi per rappresentare correttamente questa classe.

Fantastico, vero?

Risposta

No. Scala è un ottimo linguaggio di programmazione sulla carta, ma non decollerà. Guarda levoluzione del suo utilizzo nel grafico sottostante:

Riesci a vedere la linea azzurra che rappresenta Scala? No? Bene, rappresenta circa il 2\% delle richieste pull in Github (vedi più statistiche qui ). La curva non è solo piatta, in realtà è leggermente in calo rispetto al 2,3\% di cinque anni fa. Questo nonostante Spark , il progetto Scala più popolare, sia stato rilasciato nel 2014.

Quindi, no, non è possibile decollerà nonostante quello che molti di noi hanno pensato la prima volta che abbiamo usato la lingua. Cosa potrebbe andare storto? Un linguaggio che opera nella ben collaudata JVM e che offre la flessibilità di essere utilizzato solo come “un java migliore” o “completamente funzionante”, o anche altre sottigliezze come attori o futuri sembravano una manna dal cielo.

Si scopre che le cose funzionano in modo diverso nella pratica. Scala è ancora un altro linguaggio che dovrai supportare a meno che tu non possa fare tutto in Scala, il che è molto improbabile. Come minimo combinerai Scala e Java, quindi perché non limitarti a Java? Questa sembra essere la ragione principale per cui LinkedIn ha deciso di eliminare gradualmente luso di Scala nel proprio stack.

Ma, in realtà peggiora, Scala, a causa del suo design e della sua flessibilità, è un problema da mantenere in sé . È come il C ++, ma peggio. Ad esempio, puoi far impazzire programmatori Scala esperti con uno stile di codifica completamente funzionale per impacchettare una quantità folle di informazioni in una riga di codice che un principiante non capirà. Quindi, se vuoi mantenere una base di codice Scala, devi essere piuttosto severo su “come” usarlo. E, quindi, devi assumere sviluppatori che possono e sono disposti a codificare Scala in quel particolare modo. Buona fortuna. Persino Twitter, la potenza della Scala, ha detto che non sceglierebbero Scala come linguaggio di programmazione se dovessero farlo “oggi” (o nel 2015 per essere più calcestruzzo). Anche Yammer è passato da Scala a Java per motivi simili.

Quindi, si scopre che Scala non solo non sta decollando, ma in realtà è probabilmente in declino, mantenuto solo dalla popolarità di Spark. In realtà, Scala è davvero buono per i dati, quindi la scelta ha senso. Tuttavia, non sarei sorpreso se nel tempo le persone finissero per utilizzare Python come linguaggio Spark predefinito dato quanto sta diventando popolare tra i Data Scientist.

Aggiornamento:

Per coloro che affermano che Github non è una buona rappresentazione della popolarità del linguaggio, eccone un paio altro: Scala non compare nemmeno nella top 20 di Tiobe , secondo PyPL , basato su Ricerche su Google, la sua popolarità è dell1,2\% anche se misurano un leggero aumento. Puoi trovare molti altri indici qui . Non credo che nessuno mostri qualcosa anche vicino al linguaggio “decollare”.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *