ScalaソースコードをJavaソースコードに翻訳する方法はありますか?


ベストアンサー

質問に答えるには、「Javaコード」の意味によって異なります。 Scalaコードは正当なJavaコードであり、Javaクラスパスにscala.jarを追加するだけです。 scalacは、正しいMainオブジェクトを渡し、クラスパスを適切に設定するjavaコマンドの単なるラッパーです。 (このスクリプトを表示するには、$ vim `which scalac`を呼び出します。)

たとえば、Typesafe Scalaスタックを搭載したMacを使用している場合、myFile.scalaにあるScalaコードをコマンドを使用して実際にコンパイルできます。 :

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

以下でもう少し説明しますが、Scalaの専門家による編集を喜んで受け入れます。

次の単純なscalaオブジェクト(コンパイルしたがテストしなかった…)を見てみましょう

class Adder(val x:Int){

def add(y:Int) = x+y

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

}

これはばかげた方法です。 intを受け取り、他のintを追加したり、その整数に関数を適用したりできます。

scalacを呼び出して、クラスファイルを生成します。これで、java dissasembler、javapを呼び出して、実際に生成されたフィールドとクラスメソッドを表示できます。

$ javap Adder

public class Adder extends java.lang.Objectimplements scala.ScalaObject {public int x(); public int add(int); public int applyFunction(scala.Function1); public Adder(int); }

これは、Javaを明示的に使用して実装できる完全に満足のいくJavaオブジェクトです。

特性など、より高度なScala手法を使用する場合は注意が必要です。

このコードブロックを見てみましょう

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

}

}

オブジェクト定義時に混合されるトレイトにメソッドが実装されている抽象クラス。

これをコンパイルすると、ファンキーな$記号とanonという単語を含むクラスがさらに多く表示されます。最も興味深いのははMain $$ anon $ 1.classにあるクラスです。

javap Main $$ anon $ 1を呼び出すと、生成されたものがあることがわかります。新しいクラスを編集しました

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

public void method();

public Main$$anon$1();

}

Javaインターフェースとサブクラス化を使用してこのクラスを適切に表現します。

すごいですよね?

答え

いいえ。 Scalaは紙の上で優れたプログラミング言語ですが、普及することはありません。以下のグラフでその使用法の進化を見てください。

Scalaを表す水色の線が見えますか?番号?それは、Githubのプルリクエストの約2%に相当します(その他の統計情報こちらをご覧ください)。曲線は平坦であるだけでなく、実際には5年前の2.3%からわずかに減少しています。それは、2014年にリリースされた最も人気のあるScalaプロジェクトである Spark にもかかわらずです。

つまり、Scalaがそうである方法はありません。私たちの多くがこの言語を初めて使用したときに思ったことにもかかわらず、離陸する予定です。何がうまくいかない可能性がありますか?十分にテストされたJVMで動作し、「より優れたJava」または「完全に機能する」ように使用できる柔軟性を提供する言語、あるいは俳優や先物などの他の優れた機能は、天の恵みのように見えました。

実際には、動作が異なることがわかりました。 Scalaは、Scalaですべてを実行できない限り、サポートする必要のあるもう1つの言語です。これは、ほとんどあり得ないことです。少なくとも、ScalaとJavaを組み合わせるので、Javaに限定してみませんか?これが、LinkedInがスタックでのScalaの使用を段階的に廃止することを決定した主な理由のようです。

しかし、実際にはさらに悪化しています。Scalaは、その設計と柔軟性のために、それ自体を維持するのが面倒です。 。これはC ++に似ていますが、さらに悪いです。たとえば、Scalaのエキスパートプログラマーに、完全に機能するコーディングスタイルに夢中になって、初心者が理解できないコード行に膨大な量の情報を詰め込むことができます。したがって、Scalaコードベースを維持したい場合は、それを「どのように」使用するかについてかなり厳密にする必要があります。そして、その特定の方法でScalaをコーディングできる開発者を雇う必要があります。それで頑張ってください。 Scalaの大国であるTwitterでさえ、「今日」(または2015年にはもっと多くのことをする)しなければならない場合、プログラミング言語としてを選択しないだろうと述べました。コンクリート)。 Yammer も、同様の理由でScalaからJavaに移行しました。

つまり、Scalaは離陸しているだけでなく、実際にはおそらく下降途上にあり、Sparkの人気によってのみ維持されていることがわかりました。 実際、Scalaはデータに非常に適しているので、選択は理にかなっています。 ただし、データサイエンティストの間で、Pythonが人気になっていることを考えると、時間の経過とともに人々がデフォルトのSpark言語としてPythonを使用するようになっても驚かないでしょう。

更新:

Githubが言語の人気をうまく表していないと主張する人のために、ここにいくつかあります 詳細: PyPL によると、Scalaは Tiobeのトップ20 にも表示されません。 Google検索では、わずかな増加を測定していますが、人気は1.2%です。 他の多くのインデックスはここにあります。 「離陸」という言葉に近いものは何も表示されていないと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です