Existe-t-il un moyen de traduire le code source Scala en code source Java?

Meilleure réponse

Pour répondre à votre question, cela dépend de ce que vous entendez par « code java ». Le code Scala est du code java légal, il vous suffit dajouter le scala.jar au chemin de la classe java. scalac est juste un wrapper autour de la commande java qui passe le bon objet Main et définit correctement le chemin de classe. (appelez $ vim `quel scalac` pour voir ce script).

Par exemple, si vous êtes sur un Mac avec la pile Typesafe Scala, vous pouvez en fait compiler le code Scala trouvé dans myFile.scala en utilisant la commande :

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

Je donnerai plus dexplications ci-dessous, mais accepterai volontiers les modifications des experts Scala.

Prenons le simple objet scala suivant (que jai compilé mais que je nai pas testé …)

class Adder(val x:Int){

def add(y:Int) = x+y

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

}

Cest une méthode stupide. Il prend un int, puis vous permet dajouter un autre int à lui ou dappliquer une fonction qui à cet entier.

Nous appelons scalac et générons les fichiers de classe. Maintenant, nous pouvons appeler le dissasembler java, javap pour afficher les champs générés et les méthodes de classe.

$ javap Adder

Public class Adder étend java.lang.Object implémente scala.ScalaObject {public int x (); public int add (int); public int applyFunction (scala.Function1); public Adder (int); }

Cest un objet Java parfaitement heureux qui pourrait être implémenté en utilisant Java explicitement.

Maintenant, vous devez faire attention lorsque vous utilisez des techniques Scala plus avancées, telles que les traits.

Regardons ce bloc de code

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

}

}

Vous avez une classe abstraite dont la méthode est implémentée dans un trait qui est mélangé au moment de la définition de lobjet.

Lorsque vous compilez ceci, vous verrez beaucoup plus de classes avec des symboles funky $ et le mot anon. Le plus intéressant est la classe trouvée dans Main $$ anon $ 1.class.

En appelant javap Main $$ anon $ 1, nous voyons que nous avons generat a créé une nouvelle classe

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

public void method();

public Main$$anon$1();

}

qui utilise des interfaces java et des sous-classements pour représenter correctement cette classe.

Génial, non?

Réponse

Non. Scala est un excellent langage de programmation sur papier, mais il ne va pas décoller. Regardez lévolution de son utilisation dans le graphique ci-dessous:

Pouvez-vous voir la ligne bleu clair représentant Scala? Non? Eh bien, cela représente environ 2\% des pull requests dans Github (voir plus de statistiques ici ). La courbe nest pas seulement plate, elle est en fait légèrement en baisse par rapport à 2,3\% il y a cinq ans. Et ce malgré que Spark , le projet Scala le plus populaire, soit sorti en 2014.

Donc, non, il ny a aucun moyen pour Scala va décoller malgré ce que beaucoup dentre nous pensaient la première fois que nous avons utilisé la langue. Quest-ce qui pourrait mal se passer? Un langage qui fonctionne dans la JVM bien testée et qui offre la flexibilité dêtre utilisé simplement comme « un meilleur Java » ou devenir « entièrement fonctionnel », ou même dautres subtilités comme des acteurs ou des futurs semblaient être une aubaine.

Il savère que les choses fonctionnent différemment dans la pratique. Scala est encore un autre langage que vous devrez prendre en charge à moins que vous ne puissiez tout faire dans Scala, ce qui est très peu probable. À tout le moins, vous combinerez Scala et Java, alors pourquoi ne pas vous limiter à Java? Cela semble être la principale raison pour laquelle LinkedIn a décidé de supprimer progressivement leur utilisation de Scala dans leur pile.

Mais, en fait, la situation empire, Scala, en raison de sa conception et de sa flexibilité, est difficile à maintenir en soi . Cest comme C ++, mais en pire. Par exemple, vous pouvez faire en sorte que les programmeurs experts de Scala deviennent fous avec un style de codage entièrement fonctionnel pour emballer une quantité folle dinformations dans une ligne de code quun débutant ne comprendra pas. Donc, si vous voulez maintenir une base de code Scala, vous devez être assez strict sur «comment» lutiliser. Et puis, vous devez engager des développeurs qui peuvent et sont prêts à coder Scala de cette manière particulière. Bonne chance avec ça. Même Twitter, la centrale électrique de Scala, a déclaré que ils ne choisiraient pas Scala comme langage de programmation sils devaient le faire «aujourdhui» (ou en 2015 pour être plus béton). Yammer a également quitté Scala pour devenir Java pour des raisons similaires.

Donc, il savère que non seulement Scala ne décolle pas, mais il est en réalité probablement en voie de régression, uniquement entretenu par la popularité de Spark. En fait, Scala est vraiment bon pour les données, donc le choix est logique. Cependant, je ne serais pas surpris si, avec le temps, les gens finissent par utiliser Python comme langage Spark par défaut étant donné la popularité de parmi les Data Scientists.

Mise à jour:

Pour ceux qui prétendent que Github nest pas une bonne représentation de la popularité du langage, en voici quelques plus: Scala napparaît même pas dans le top 20 de Tiobe , selon PyPL , basé sur Les recherches Google, sa popularité est de 1,2\% bien quelles mesurent une légère augmentation. Vous pouvez trouver de nombreux autres indices ici . Je ne pense pas qu’aucun montre quoi que ce soit, même proche de la langue «décoller».

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *