Finns det ett sätt att översätta Scala-källkod till Java-källkod?

Bästa svaret

För att svara på din fråga beror det på vad du menar med ”java-kod”. Scala-kod är laglig Java-kod, du behöver bara lägga till scala.jar till Java-klassvägen. scalac är bara ett omslag runt java-kommandot som skickar rätt huvudobjekt och ställer in klassvägen ordentligt. (ring $ vim `vilken skalac` för att se detta skript).

Om du till exempel är på en Mac med Typesafe Scala-stacken kan du faktiskt kompilera Scala-kod som finns i myFile.scala med kommandot :

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

Jag kommer att ge några fler förklaringar nedan, men accepterar gärna redigeringar från Scala-experter där ute.

Låt oss ta följande enkla scala-objekt (som jag kompilerade men inte testade …)

class Adder(val x:Int){

def add(y:Int) = x+y

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

}

Det är en dum metod. Det tar ett int och låter dig sedan lägga till ett annat int till det eller använda en funktion som till det heltalet.

Vi kallar scalac och genererar klassfilerna. Nu kan vi ringa java dissasembler, javap för att se de faktiska genererade fälten och klassmetoderna.

$ javap Adder

public class Adder förlänger java.lang.Object implementerar scala.ScalaObject {public int x (); public int add (int); public int applyFunction (scala.Function1); offentlig Adder (int); }

Detta är ett helt lyckligt Java-objekt som kan implementeras med Java uttryckligen.

Nu måste du vara försiktig när du använder mer avancerade Scala-tekniker, till exempel egenskaper.

Låt oss titta på det här kodblocket

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

}

}

Du har en abstrakt klass som har sin metod implementerad i ett drag som blandas in vid objektdefinitionstidpunkten.

När du kompilerar detta kommer du att se många fler klasser med funky $ -symboler och ordet anon. Det mest intressanta är den klass som finns i Main $$ anon $ 1.class.

Ringer javap Main $$ anon $ 1 vi ser att vi har generat redigerade en ny klass

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

public void method();

public Main$$anon$1();

}

som använder Java-gränssnitt och underklassning för att korrekt representera denna klass.

Fantastiskt, eller hur?

Svar

Nej Scala är ett bra programmeringsspråk på papper, men det kommer inte att ta fart. Titta på utvecklingen av dess användning i diagrammet nedan:

Kan du se den ljusblå linjen som representerar Scala? Nej? Tja, det representerar cirka 2\% av dragförfrågningarna i Github (se mer statistik här ). Kurvan är inte bara platt, den är faktiskt något lägre än 2,3\% för fem år sedan. Det är trots Spark , det mest populära Scala-projektet som släpptes 2014.

Så nej, det finns inget sätt Scala är kommer att ta fart trots vad många av oss trodde första gången vi använde språket. Vad kan gå fel? Ett språk som fungerar i den väl beprövade JVM och som erbjuder flexibiliteten att bara användas som ”en bättre java” eller gå ”fullt funktionell”, eller till och med andra trevliga saker som skådespelare eller framtida verkade som en sken.

Det visar sig att saker och ting fungerar annorlunda i praktiken. Scala är ännu ett språk som du måste stödja om du inte kan göra allt i Scala, vilket är mycket osannolikt. Åtminstone kommer du att kombinera Scala och Java, så varför inte bara begränsa dig till Java? Det verkar vara den främsta anledningen till att LinkedIn bestämde sig för att avveckla sin användning av Scala i sin stack.

Men det blir faktiskt värre, Scala, på grund av sin design och flexibilitet, är en smärta att behålla i sig själv . Det är som C ++, men värre. Till exempel kan du få experter från Scala-programmerare att gå nötter med fullt funktionell kodningsstil för att packa en galen mängd information i en kodrad som en nybörjare inte förstår. Så om du vill upprätthålla en Scala-kodbas måste du vara ganska strikt om ”hur” du använder den. Och då måste du gå ut och anställa utvecklare som kan och är villiga att koda Scala på det specifika sättet. Lycka till med det. Till och med Twitter, Scala-kraftverket, sa att de inte skulle välja Scala som sitt programmeringsspråk om de skulle göra det ”idag” (eller 2015 för att vara mer betong). Yammer flyttade också bort från Scala till Java av liknande skäl.

Så det visar sig att Scala inte bara tar fart utan den är i själva verket troligtvis på väg ner, bara upprätthålls av Sparks popularitet. Egentligen är Scala riktigt bra för data, så valet är vettigt. Jag skulle dock inte bli förvånad om människor med tiden slutar använda Python som standardspråk med tanke på hur populärt det blir bland dataforskare.

Uppdatering:

För de som hävdar att Github inte är en bra representation av språkets popularitet, här är ett par mer: Scala visas inte ens i Tiobes topp 20 , enligt PyPL , baserat på Google söker, dess popularitet är 1,2\% men de mäter en liten ökning. Du hittar många andra index här . Jag tror inte att någon visar något som ligger nära språket ”tar fart”.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *