Under scalet på Scala
- tor 7 feb, 2008 kl 01:20
- 3 kommentarer
- Programmering
I sann expressen anda så var jag tvungen att ta den ordvitsen ;-) . Håller på att lära mig Scala för att se om det är något att ha och hitils är jag rätt nöjd. Men idag bestämde jag mig för att titta lite närmare på interopabiliteten med Java.
Jag kompilerade lite Scala klasser och tittade vad som egentligen genererades. Det märks ju att java byte koden inte är skriven för andra språk än Java med tanke på alla special saker som man måste emulera i byte koden när man använder tex closures eller properties i Scala.
Properties i Scala får ju i den kompilerade koden automatiskt en överlagring av = operatorn samt en metod för att få access till propertien. Operator metoden slutar på _$eq vilket kanske går att anropa från java men blir väldigt fult (är osäker på om $ är ok i Java). Access metoden har samma namn som propertien och returnerar den. Så till skillnad från tex Groovy så får man inga getters och setters automat kompilerade. Men om man tittar på scala som språk som använder operator överlagring så känns det på ett sett naturligt. Men enligt en på #scala irc kanalen så skall det finnas annotations för att lösa detta.
När man skapar en ”object” vilket är det samma som en singelton klass så genereras det faktiskt två klasser. En riktig singelton klass med en public variable som heter MODULE$ som innehåller singelton objektet. Metoderna som var deklarerade blir vanliga metoder i singelton klassen. Det genreras också en klass med alla metoder fast i static form vilken använder sig utav singelton klassen.
Så det känns lite som om det där med interopabillitet mellan Scala och Java är mest envägs riktad. Det gör ju iofs inte så mycket för oftast väljer man väl ett språk. Det tråkiga blir väl dock att det kanske växer fram bra bibliotek i Scala som man inte kan använda rakt av i Java. Detta kanske löser sig i framtida versioner om JVM:en uppgraderas för bättre språk stöd. Här kan man ju sno lite av en av dom sakerna som faktiskt är bra med .NET nämligen att den är designad för multipla språk.
Jag har liknande problem med JavaFX. Det är inga som helst problem att anropa en Java-metod i JavaFX Script, men tvärtom är inget det finns stöd för idag. Lösningen blir att bygga callbacks istället, vilket kan bli lite bakvänt om man jobbar med något som är beroende av att köras i en tråd, vilket i mitt fall är Java OpenGL.
När det stoppar in closures i Java kanske det blir trevligare. Då kan man nog skicka upp en referens till en funktion tillbaka till Java…
Lösningen som lite scala folk tyckte att man skulle göra var att man skrev en java kompatibel wrapper i scala och på så sätt explicit skapade tex getters och setters. Men det känns mer som ett fulhack.
…och nästa gång jag kommenterar ska jag korrekturläsa det jag skrev.. :)