Există o modalitate de a traduce codul sursă Scala în cod sursă Java?

Cel mai bun răspuns

Pentru a răspunde la întrebarea dvs., depinde ce înțelegeți prin „cod Java”. Codul Scala este un cod Java legal, trebuie doar să adăugați scala.jar la calea clasei Java. scalac este doar un wrapper în jurul comenzii java care trece obiectul principal corect și setează corect clasa. (apelați $ vim `care scalac` pentru a vedea acest script).

De exemplu, dacă sunteți pe un Mac cu stiva Typesafe Scala, puteți compila codul Scala găsit în myFile.scala folosind comanda :

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

Voi da mai multe explicații mai jos, dar voi accepta cu plăcere editări ale experților Scala de acolo.

Să luăm următorul obiect scala simplu (pe care l-am compilat, dar nu l-am testat …)

class Adder(val x:Int){

def add(y:Int) = x+y

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

}

Este o metodă stupidă. Este nevoie de un int și apoi vă permite să adăugați un alt int la acesta sau să aplicați o funcție care la acel număr întreg.

Apelăm scalac și generăm fișierele de clasă. Acum putem apela disasemblerul java, javap pentru a vizualiza câmpurile reale generate și metodele de clasă.

$ javap Adder

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

Acesta este un obiect Java perfect fericit care ar putea fi implementat folosind Java în mod explicit.

Acum trebuie să aveți grijă atunci când utilizați tehnici Scala mai avansate, cum ar fi trăsăturile.

Să vedem acest bloc de cod

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

}

}

Aveți o clasă abstractă care are metoda sa implementată într-o trăsătură care este amestecată la momentul definirii obiectului.

Când compilați acest lucru, veți vedea multe alte clase cu simboluri funky $ și cuvântul anon. este clasa găsită în Main $ $ anon $ 1.class.

Apelând javap Main $$ anon $ 1 vedem că avem generat a editat o nouă clasă

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

public void method();

public Main$$anon$1();

}

care folosește interfețe java și subclasare pentru a reprezenta corect această clasă.

Minunat, nu?

Răspuns

Nu. Scala este un mare limbaj de programare pe hârtie, dar nu va decola. Uitați-vă la evoluția utilizării sale în graficul de mai jos:

Puteți vedea linia albastru deschis care reprezintă Scala? Nu? Ei bine, reprezintă aproximativ 2\% din solicitările de extragere din Github (consultați mai multe statistici aici ). Curba nu este doar plană, ci este de fapt ușor în jos față de 2,3\% acum cinci ani. Asta în ciuda faptului că Spark , cel mai popular proiect Scala, a fost lansat în 2014.

Deci, nu, nu există nicio modalitate în care Scala este o să decolăm în ciuda a ceea ce mulți dintre noi credeam prima dată când foloseam limba. Ce ar putea merge prost? Un limbaj care funcționează în JVM bine testat și care oferă flexibilitatea de a fi folosit doar ca „un java mai bun” sau ca să devină „pe deplin funcțional”, sau chiar și alte simpatii, cum ar fi actorii sau viitorul, păreau a fi un dar de la Dumnezeu.

Se pare că lucrurile funcționează diferit în practică. Scala este încă o altă limbă pe care va trebui să o susțineți, cu excepția cazului în care puteți face totul în Scala, ceea ce este foarte puțin probabil. Cel puțin veți combina Scala și Java, deci de ce să nu vă limitați doar la Java? Acesta pare să fie principalul motiv pentru care LinkedIn a decis să elimine treptat utilizarea Scala în stiva lor.

Dar, de fapt, se înrăutățește, Scala, datorită designului și flexibilității sale, este o durere de menținut în sine . Este ca C ++, dar mai rău. De exemplu, puteți obține programatori Scala experți care se înrăutățesc cu un stil de codare complet funcțional pentru a împacheta o cantitate nebună de informații într-o linie de cod pe care un începător nu o va înțelege. Deci, dacă doriți să mențineți o bază de cod Scala, trebuie să fiți destul de strict cu privire la „cum” să o utilizați. Și, atunci, trebuie să ieșiți și să angajați dezvoltatori care pot și sunt dispuși să codeze Scala în acest mod special. Mult noroc cu asta. Chiar și Twitter, centrala Scala, a spus că nu ar alege Scala ca limbaj de programare dacă ar trebui să o facă „astăzi” (sau în 2015 pentru a fi mai mult beton). Yammer s-a îndepărtat de Scala în Java din motive similare.

Deci, se pare că Scala nu numai că nu decolează, dar este în realitate probabil pe drumul său, menținut doar de popularitatea lui Spark. De fapt, Scala este foarte bun pentru date, deci alegerea are sens. Cu toate acestea, nu aș fi surprins dacă, de-a lungul timpului, oamenii vor folosi Python ca limbă implicită Spark, având în vedere cât de popular devine printre oamenii de știință de date.

Actualizare:

Pentru cei care susțin că Github nu este o bună reprezentare a popularității limbii, iată un cuplu mai mult: Scala nici măcar nu apare în Top 20 Tiobe , conform PyPL , pe baza Căutările Google, popularitatea sa este de 1,2\%, deși măsoară o ușoară creștere. Puteți găsi mulți alți indici aici . Nu cred că cineva arată nimic apropiat de limbajul „decolare”.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *