Czy istnieje sposób na przetłumaczenie kodu źródłowego Scala na kod źródłowy Java?

Najlepsza odpowiedź

Odpowiedź na Twoje pytanie zależy od tego, co rozumiesz przez „kod java”. Kod Scala jest legalnym kodem java, wystarczy dodać scala.jar do ścieżki klas java. scalac to po prostu otoka wokół polecenia java, która przekazuje poprawny obiekt Main i prawidłowo ustawia ścieżkę klas. (wywołaj $ vim `which scalac`, aby zobaczyć ten skrypt).

Na przykład, jeśli używasz Maca ze stosem Typesafe Scala, możesz skompilować kod Scala znajdujący się w myFile.scala za pomocą polecenia :

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

Poniżej podam więcej wyjaśnień, ale z przyjemnością przyjmuję poprawki od ekspertów Scala.

Weźmy następujący prosty obiekt scala (który skompilowałem, ale nie przetestowałem …)

class Adder(val x:Int){

def add(y:Int) = x+y

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

}

To głupia metoda. Pobiera int, a następnie pozwala na inne dodanie do niego kolejnego int lub zastosowanie funkcji do tej liczby całkowitej.

Wywołujemy scalac i generujemy pliki klas. Teraz możemy wywołać disasembler java, javap, aby wyświetlić aktualnie wygenerowane pola i metody klas.

$ javap Adder

public class Adder rozszerza java.lang.Object implementuje scala.ScalaObject {public int x (); public int add (int); public int applyFunction (scala.Function1); publiczny Adder (int); }

To bardzo szczęśliwy obiekt Java, który można by zaimplementować bezpośrednio przy użyciu Javy.

Teraz musisz być ostrożny, używając bardziej zaawansowanych technik Scala, takich jak cechy.

Spójrzmy na ten blok kodu

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

}

}

Masz klasa abstrakcyjna, której metoda jest zaimplementowana w funkcji, która jest mieszana w czasie definiowania obiektu.

Kiedy to kompilujesz, zobaczysz o wiele więcej klas z funkowymi symbolami $ i słowem anon. to klasa znajdująca się w Main $$ anon $ 1.class.

Wywołując javap Main $$ anon $ 1, widzimy, że mamy generat ed nową klasę

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

public void method();

public Main$$anon$1();

}

, który wykorzystuje interfejsy Java i podklasy do prawidłowego reprezentowania tej klasy.

Świetnie, prawda?

Odpowiedź

Nie. Scala to świetny język programowania na papierze, ale nie da rady. Spójrz na ewolucję jego użycia na poniższym wykresie:

Czy widzisz jasnoniebieską linię przedstawiającą Scalę? Nie? Cóż, stanowi około 2\% żądań ściągnięcia w Github (zobacz więcej statystyk tutaj ). Krzywa jest nie tylko płaska, ale w rzeczywistości nieznacznie spadła z 2,3\% pięć lat temu. Dzieje się tak pomimo Spark , najpopularniejszego projektu Scali, który został wydany w 2014 roku.

Więc nie, nie ma mowy, żeby Scala była wystartuje pomimo tego, co wielu z nas myślało, gdy pierwszy raz użyliśmy tego języka. Co mogłoby pójść źle? Język, który działa w dobrze przetestowanej JVM i który oferuje elastyczność, aby być używany jako „lepsza java” lub „w pełni funkcjonalny”, a nawet inne subtelności, takie jak aktorzy lub przyszłość, wydawały się wybawieniem.

Okazuje się, że w praktyce jest inaczej. Scala to kolejny język, który będziesz musiał obsługiwać, chyba że możesz zrobić wszystko w Scala, co jest bardzo mało prawdopodobne. Przynajmniej połączysz Scala i Javę, więc dlaczego nie ograniczyć się do języka Java? Wydaje się, że jest to główny powód, dla którego LinkedIn zdecydował się wycofać użycie Scali w swoim stosie.

Ale w rzeczywistości sytuacja się pogarsza, Scala, ze względu na swój projekt i elastyczność, jest trudna do utrzymania sama . To jest jak C ++, ale gorzej. Na przykład, możesz sprawić, by doświadczeni programiści Scala oszaleli z w pełni funkcjonalnym stylem kodowania, aby spakować szaloną ilość informacji w linii kodu, której początkujący nie zrozumie. Tak więc, jeśli chcesz utrzymywać bazę kodu Scala, musisz być dość rygorystyczny co do tego, „jak” go używać. A potem musisz wyjść i zatrudnić programistów, którzy mogą i chcą kodować Scala w ten szczególny sposób. Powodzenia z tym. Nawet Twitter, potęga Scali, powiedział, że nie wybrałby Scala jako swojego języka programowania, gdyby musieli to zrobić „dzisiaj” (lub w 2015 r., Aby być bardziej beton). Yammer również przeniósł się ze Scali na Javę z podobnych powodów.

Okazuje się więc, że Scala nie tylko nie startuje, ale w rzeczywistości prawdopodobnie schodzi w dół, utrzymując się jedynie dzięki popularności Sparka. Właściwie Scala jest naprawdę dobra dla danych, więc wybór ma sens. Nie zdziwiłbym się jednak, gdyby z czasem ludzie zaczęli używać Pythona jako domyślnego języka Spark, biorąc pod uwagę, jak popularny staje się wśród analityków danych.

Aktualizacja:

Dla tych, którzy twierdzą, że Github nie jest dobrym odzwierciedleniem popularności języka, oto kilka więcej: Scala nie pojawia się nawet w dwudziestce najlepszych Tiobe , zgodnie z PyPL , na podstawie Wyszukiwania Google, ich popularność wynosi 1,2\%, choć mierzy niewielki wzrost. Wiele innych indeksów można znaleźć tutaj . Nie sądzę, żeby jakikolwiek pokazał coś nawet zbliżonego do „startu” języka.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *