Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What compromises Scala made to run on JVM?

Tags:

Scala is a wonderful language, but I wonder how could be improved if it had it's own runtime?
I.e. what design choices were made because of JVM choice?

like image 359
Łukasz Lew Avatar asked Apr 21 '10 12:04

Łukasz Lew


People also ask

Can Scala run on JVM?

Scala runs on the Java Virtual Machine Scala is compiled into Java Byte Code which is executed by the Java Virtual Machine (JVM). This means that Scala and Java have a common runtime platform.

Why does Scala need JVM?

The Scala compiler ( scalac ) produces JVM bytecode ( . class files), as much as the Java compiler ( javac ). To execute these files you need a JVM.

Can Scala run without JVM?

Can I run my scala program without JVM using scala-native? Yes, the goal of Scala Native is to support compilation of Scala programs without any kind of VM.

Does Scala run on Java?

Scala runs on the Java platform (Java virtual machine) and is compatible with existing Java programs.


2 Answers

The two most important compromises I know about are:

  • type erasure ("reflecting on Type"): It has to manage a Manifest to get around the Java compilation (independent of the JVM, for backward compatibility reason).
  • collection of primitive type: e.g.: arrays

    new scheme of handling arrays in Scala 2.8. Instead of boxing/unboxing and other compiler magic the scheme relies on implicit conversions and manifests to integrate arrays

Those are the two main JVM limitations, when it comes to manage generic type (with bounds): The Java JVM does not keep the exact type use in a generic object, and it has "primitive" types.


But you could also consider:

  • Tail-call optimization is not yet full supported by the JVM, was hard to do anyway (and yet Scala 2.8 introduces the @tailrec annotation)
  • UAP (universal Access Principle) needs to be emulated (not supported by Java), and will be soon completed for Value Holder (@proxy)
  • the all mix-in mechanism needs also to be emulated
  • more generally, the huge number of static types introduced by Scala need (for most of them) to be generated in Java:

In order to cover as many possibilities as possible, Scala provides:

  • Conventional class types,
  • Value class types,
  • Nonnullable types,
  • Monad types,
  • Trait types,
  • Singleton object types (procedural modules, utility classes, etc.),
  • Compound types,
  • Functional types,
  • Case classes,
  • Path-dependent types,
  • Anonymous types,
  • Self types,
  • Type aliases,
  • Generic types,
  • Covariant generic types,
  • Contravariant generic types,
  • Bounded generic types,
  • Abstract types,
  • Existential types,
  • Implicit types,
  • Augmented types,
  • View bounded types, and
  • Structural types which allow a form of duck typing when all else fails
like image 137
VonC Avatar answered Sep 22 '22 12:09

VonC


This article is a discussion with Martin Odersky (Scala's creator) and includes the compromises that were made in Scala for compatibility with Java. The article mentions:

  1. Static overloading of methods
  2. Having both traits and classes
  3. Inclusion of null pointers.
like image 31
Ben Lings Avatar answered Sep 21 '22 12:09

Ben Lings