vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2022-11-21 01:06 pm

Scala как родная

Оказывается, Скалу теперь можно компилить непосредственно в бинарный код, без всякой Джавы и прочих виртуальных машин. Неплохой язычок получается.

(1) Сначала устанавливаем sbt по инструкции: https://www.scala-sbt.org/1.x/docs/Setup.html

(2) Создаём проект типа "Hello World":
$ sbt new scala-native/scala-native.g8
На запрос надо будет ввести желаемое имя проекта. Я выбрал hello.

(3) Компилируем и запускаем:
$ cd hello
$ sbt run
[info] welcome to sbt 1.6.2 (Ubuntu Java 11.0.17)
[info] loading settings for project hello-build from plugins.sbt ...
[info] loading project definition from /.../hello/project
[info] loading settings for project hello from build.sbt ...
[info] set current project to hello (in build file:/.../hello/)
[info] compiling 1 Scala source to /.../hello/target/scala-3.1.3/classes ...
[info] Linking (1343 ms)
[info] Discovered 663 classes and 3689 methods
[info] Optimizing (debug mode) (1047 ms)
[info] Generating intermediate code (829 ms)
[info] Produced 12 files
[info] Compiling to native code (1583 ms)
[info] Linking native code (immix gc, none lto) (122 ms)
[info] Total (4968 ms)
Hello, world!
[success] Total time: 9 s, completed Nov 21, 2022, 1:11:59 PM
Смотрим исходник:
$ cat src/main/scala/Main.scala 
object Main {
  def main(args: Array[String]): Unit =
    println("Hello, world!")
}
Смотрим бинарник:
$ size target/scala-3.1.3/hello-out 
text data bss dec hex filename
1625129 223248 4928 1853305 1c4779 target/scala-3.1.3/hello-out

$ ldd target/scala-3.1.3/hello-out
linux-vdso.so.1 (0x00007ffe9492a000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5817600000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5817517000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5817895000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5817200000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5817a93000)

$ ./target/scala-3.1.3/hello-out
Hello, world!
Подробности здесь: https://scala-native.org/en/stable/user/index.html
vlad_m: (Default)

[personal profile] vlad_m 2022-11-21 11:52 pm (UTC)(link)
Динамический бинарник под 2М размером. hello.

Чем они там занимаются в таких просторах!?
ircicq: (Default)

[personal profile] ircicq 2022-11-22 05:37 am (UTC)(link)
Внутри этих мегабайт JVM?

vlad_m: (Default)

[personal profile] vlad_m 2022-11-22 12:59 pm (UTC)(link)
А мэйби.
На c++ написанный.
Но тогда это не вполне native.
Turbo Basic был такой в прошлом веке.
vlad_m: (Default)

[personal profile] vlad_m 2022-11-22 12:14 pm (UTC)(link)
С размахом.
У суслика 1М выходит.
Статический.
spamsink: (Default)

[personal profile] spamsink 2022-11-22 12:17 am (UTC)(link)
...А если вас что-то не устраивает, пользуйтесь UPX! Удобно.

[personal profile] dedekha 2022-11-22 01:12 am (UTC)(link)
Неужто это и впрямь случилось, будет самым популярным языком?
juan_gandhi: (Default)

[personal profile] juan_gandhi 2022-11-22 09:31 am (UTC)(link)

Эти два языка ортогональны.

[personal profile] dedekha 2022-11-22 12:58 pm (UTC)(link)
Просто по впечатлениям, я немного знаком со scala (закончил два курса в coursera) и это по моему мнению бесконечно приятный язык, с Rust сталкивался совсем немного, осталось впечатление чего-то очень корявого и очень низкоуровневого.

Мне какжется что приятственность языка очень сушественна, помню как мне было приятно переключиться c ТurboPascal на C- и перестать использовать надоевшие begin и end на каждоц строчке. Наверное я не один такой.

Единственная проблема scala в моих глазах это быстродействие и память, те кто мерил на реальных программах говорили 2х - 4х vs c++.
cali4nickation: (Default)

[personal profile] cali4nickation 2022-11-22 05:54 am (UTC)(link)
Вот еще бы без SBT и было бы совсем хорошо.
juan_gandhi: (Default)

[personal profile] juan_gandhi 2022-11-22 09:31 am (UTC)(link)

Да бля...

norian: (Default)

[personal profile] norian 2022-11-22 07:25 am (UTC)(link)
походу они его через крестовый препроцессор компилят, судя по библиотекам

вообще надо будет как-нть сделать полуавтоматический гарбаж коллектор в сорцах крестов

чтобы унутре класса вставлял очистку в деструктор, а на хардкорных пойнтерах наружу ругалсо "сам убирай за собой, утырок двуногий" и метил всё выделение гиперссылками на очистку или руганью
juan_gandhi: (Default)

[personal profile] juan_gandhi 2022-11-22 09:30 am (UTC)(link)

Ну это много лет уже как. Но проблема в том, что без JIT этот код оказывается довольно медленным, сравнительно с тем, что на JVM бегает.

[personal profile] chabapok 2022-11-22 06:07 pm (UTC)(link)
Был вроде раньше excleisor jet который умел компилить яву.
И был сборщики, делали exe на вшений вид - но внутри jvm.

Просто непонятно, зачем это все. В jvm гораздо больше человеко-часов, чем в любой другой поделке. Времена, когда ява интерпретировалась, давно ушли. Уже много лет компилятор компилит на основани профиля исполнения кода, под конкретный проц используя его фишки. Вряд ли скомпиленное в exe покажет лучше результат.

[personal profile] chabapok 2022-11-25 09:49 pm (UTC)(link)
если даже кобол жив сейчас, то до вымирания жвм еще долго.
techquisitor: (sis)

[personal profile] techquisitor 2022-11-27 09:00 pm (UTC)(link)
А я с помощью sbt только готовил deb пакеты для Кафки. Но я wannabe devops, мне можно. :)