Language semantics¶
In general, the semantics of the Scala Native language are the same as Scala on the JVM. However, a few differences exist, which we mention here.
Interop extensions¶
Annotations and types defined scala.scalanative.unsafe
may modify semantics
of the language for sake of interoperability with C libraries, read more about
those in Native code interoperability section.
Multithreading¶
Scala Native doesn’t yet provide libraries for parallel multi-threaded programming and assumes single-threaded execution by default.
It’s possible to use C libraries to get access to multi-threading and synchronization primitives but this is not officially supported at the moment.
Finalization¶
Finalize method from java.lang.Object
is never called in Scala Native.
Undefined behavior¶
Generally, Scala Native follows most of the special error conditions similarly to JVM:
- Arrays throw
IndexOutOfBoundsException
on out-of-bounds access. - Casts throw
ClassCastException
on incorrect casts. - Accessing a field or method on
null
, throwingnull`
exception, throwsNullPointerException
. - Integer division by zero throws
ArithmeticException
.
There are a few exceptions:
- Stack overflows are undefined behavior and would typically segfault on supported architectures instead of throwing
StackOverflowError
. - Exhausting a heap space results in crash with a stack trace instead of throwing
OutOfMemoryError
.
Continue to Native code interoperability.