Kotlin: игры с кодом

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Kotlin: игры с кодом

Непрочитанное сообщение Olej » 27 дек 2022, 08:29

Собственно, по Kotlin есть уже тема - и свежая, и близко тут рядом...
Хотел было туда продолжать ... но жалко стало :lol: : там получается законченая тема прото как 1). установить Kotlin в разных вариантах + 2). как запускать код написанный Kotlin ... а это совсем не так просто.

Начать туда писать про эксперименты с кодом - потеряется! А жалко. :lol:

А код Kotlin понадобился в связи с вот этим: регулярные выражения в программном коде.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Kotlin: игры с кодом

Непрочитанное сообщение Olej » 27 дек 2022, 08:41

Olej писал(а):
27 дек 2022, 08:29
установить Kotlin в разных вариантах
Итого, у меня имеется (там описано):

1. Исходный Kotlin ... с консольным компилятором:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/ManyLang/ManyLangL.42.exmpl/triangle$ which kotlin
/home/olej/.sdkman/candidates/kotlin/current/bin/kotlin

Код: Выделить всё

olej@R420:~$ kotlin -version
Kotlin version 1.7.20-release-201 (JRE 11.0.17+8-post-Ubuntu-1ubuntu220.04)

Код: Выделить всё

lej@R420:~/2022/own.BOOKs/ManyLang/ManyLangL.42.exmpl/triangle$ which kotlinc
/home/olej/.sdkman/candidates/kotlin/current/bin/kotlinc

Код: Выделить всё

olej@R420:~$ kotlinc -version
info: kotlinc-jvm 1.7.20 (JRE 11.0.17+8-post-Ubuntu-1ubuntu220.04)
2. Нативный Kotlin (чему основной объём темы про установку и был посвящён):

Код: Выделить всё

olej@R420:~$ ~/kotlin/kotlin-native/dist/bin/kotlinc-native -version
info: kotlinc-native 1.8.255-SNAPSHOT (JRE 11.0.17+8-post-Ubuntu-1ubuntu220.04)
Kotlin/Native: 1.6.0-dev
К нему пути не установлены ... но когда, изредка, понадобится - я его и оттуда запущу.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Kotlin: игры с кодом

Непрочитанное сообщение Olej » 27 дек 2022, 08:45

Olej писал(а):
27 дек 2022, 08:29
2). как запускать код написанный Kotlin
Возьму за эталон - просто потому что он у меня уже есть:

Код: Выделить всё

olej@R420:~/2022/Kotlin$ cat fibo.kt 
fun fib(n: Long): Long {
   return if(n < 2.toLong()) 1.toLong() else fib(n - 1) + fib(n - 2); 
} 

fun main(args: Array<String>) {
   val x = args[0].toLong()
   println(fib(x))
}
Вложения
fibo.kt
(181 байт) 24 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Kotlin: игры с кодом

Непрочитанное сообщение Olej » 27 дек 2022, 09:14

Olej писал(а):
27 дек 2022, 08:45
2). как запускать код написанный Kotlin
Это раз - используя Java JVM для запуска:

Код: Выделить всё

olej@R420:~/2022/Kotlin$ time kotlinc fibo.kt -include-runtime -d fiboj.jar

real	0m5,891s
user	0m18,115s
sys	0m1,226s
... это всё так очень неспешно ;-)

Код: Выделить всё

olej@R420:~/2022/Kotlin$ ls -l fiboj.jar
-rw-rw-r-- 1 olej olej 4693657 дек 27 07:48 fiboj.jar

olej@R420:~/2022/Kotlin$ file fiboj.jar
fiboj.jar: Zip archive data, at least v2.0 to extract
Запуск:

Код: Выделить всё

olej@R420:~/2022/Kotlin$ java -jar fiboj.jar 10
89

Код: Выделить всё

olej@R420:~/2022/Kotlin$ time java -jar fiboj.jar 43
701408733

real	0m2,532s
user	0m2,546s
sys	0m0,037s

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Kotlin: игры с кодом

Непрочитанное сообщение Olej » 27 дек 2022, 09:39

Olej писал(а):
27 дек 2022, 09:14
Это раз
Это два - используя исполняющую систему Kotlin - без JVM:

Код: Выделить всё

olej@R420:~/2022/Kotlin$ time kotlinc fibo.kt -d fibo.jar

real	0m4,982s
user	0m18,206s
sys	0m0,740s

Код: Выделить всё

olej@R420:~/2022/Kotlin$ ls -l *.jar
-rw-rw-r-- 1 olej olej    1284 дек 27 08:19 fibo.jar
-rw-rw-r-- 1 olej olej 4693657 дек 27 07:48 fiboj.jar
-rw-rw-r-- 1 olej olej 4693506 дек 13 11:35 hello.jar

Код: Выделить всё

olej@R420:~/2022/Kotlin$ ls -l *.jar
-rw-rw-r-- 1 olej olej    1284 дек 27 08:19 fibo.jar
-rw-rw-r-- 1 olej olej 4693657 дек 27 07:48 fiboj.jar

Код: Выделить всё

olej@R420:~/2022/Kotlin$ file fibo.jar
fibo.jar: Zip archive data, at least v2.0 to extract

Код: Выделить всё

olej@R420:~/2022/Kotlin$ kotlin -classpath fibo.jar FiboKt 10
89

Код: Выделить всё

olej@R420:~/2022/Kotlin$ time kotlin -classpath fibo.jar FiboKt 43
701408733

real	0m2,676s
user	0m2,674s
sys	0m0,124s
Параметры примерно те же ...
Не считая размеров jar-файлов - отличающихся больше чем на 3 порядка! ... 3655 раз :-o
В чём разница?
Не знаю, пока...
Нужно будет полюбопытствовать...

P.S. С этой строкой запуска пришлось пободаться ... откуда берутся такие её параметры?
- -classpath fibo.jar - это понятно, это имя файла скомпилированного архива байткода JAR...
- а FiboKt :?: Это имя класса (в Java, а значит и Kotlin, всё - класс!) в котором находится стартовая функция main() ... И образуется это ия так: <имя файла кода с большой буквы> + суффикс 'Kt'
Вот такой маленький эксперимент (с изменённым именем выходного архива):

Код: Выделить всё

olej@R420:~/2022/Kotlin$ kotlinc fibo.kt -d fibo2.jar

Код: Выделить всё

olej@R420:~/2022/Kotlin$ kotlin -classpath fibo2.jar FiboKt 10
89

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Kotlin: игры с кодом

Непрочитанное сообщение Olej » 27 дек 2022, 09:46

Olej писал(а):
27 дек 2022, 09:39
Это два
Это три: компиляция в нативный код OS ... в данном случае x86_64 Linux:

Код: Выделить всё

olej@R420:~/2022/Kotlin$ time ~/kotlin/kotlin-native/dist/bin/kotlinc-native fibo.kt -o fibo

real	0m16,951s
user	0m23,052s
sys	0m1,526s

Код: Выделить всё

olej@R420:~/2022/Kotlin$ ls -l fibo*
-rw-r--r-- 1 olej olej     231 дек 11 22:00 fibo.c
-rw-rw-r-- 1 olej olej    1284 дек 27 08:19 fibo.jar
-rw-rw-r-- 1 olej olej 4693657 дек 27 07:48 fiboj.jar
-rwxrwxr-x 1 olej olej  943736 дек 27 08:42 fibo.kexe
-rw-rw-r-- 1 olej olej     181 дек 11 22:01 fibo.kt

Код: Выделить всё

olej@R420:~/2022/Kotlin$ file fibo.kexe
fibo.kexe: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.16, BuildID[sha1]=d1fece2a4e8e3cb1c4e188f95e44f2d65929496d, not stripped

Код: Выделить всё

olej@R420:~/2022/Kotlin$ time ./fibo.kexe 43
701408733

real	0m13,214s
user	0m13,215s
sys	0m0,000s
Нативное исполнение в 5,21 медленнее чем в языковых виртуальных машинах... :-o
Но это, в общем то, можно ожидать и объяснить.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Kotlin: игры с кодом

Непрочитанное сообщение Olej » 27 дек 2022, 10:50

Olej писал(а):
27 дек 2022, 08:29
А код Kotlin понадобился в связи с вот этим: регулярные выражения в программном коде.
Вернуться к началу
Для этого делаю заготовку:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ cat regexk1.kt 
import kotlin.system.*

fun main(args: Array<String>) {
    val pattern : String = args[0]
    println("строка шаблона: <$pattern> - длиной ${pattern.length}")
    while (true) {
        var ввод : String = readln()
        if (0 == ввод.length)                     // пустая строка
            exitProcess(0)            
        println("целевая строка: <$ввод> - длиной ${ввод.length}")
    }
}    
На этом можно было бы и не останавливаться ... если бы не одно обстоятельство:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ kotlinc regexk1.kt -d regexk1.jar

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ kotlin -classpath regexk1.jar Regexk1Kt "\d\d\d" 
строка шаблона: <\d\d\d> - длиной 6
qwerty
целевая строка: <qwerty> - длиной 6
слово
целевая строка: <слово> - длиной 5
слово слово
целевая строка: <слово слово> - длиной 11
При вводе строк (с консоли в командной строке, в диалоге с терминала...) в кодировке UTF-8 (Linux всё же!), Kotlin со всем этим хозяйством распоряжается (length) как с символами, а не как с байтами в многобайтных последовательностях UTF-8.
Что отличается от Go, Rust ...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Kotlin: игры с кодом

Непрочитанное сообщение Olej » 27 дек 2022, 11:23

Olej писал(а):
27 дек 2022, 10:50
При вводе строк (с консоли в командной строке, в диалоге с терминала...) в кодировке UTF-8 (Linux всё же!), Kotlin со всем этим хозяйством распоряжается (length) как с символами, а не как с байтами в многобайтных последовательностях UTF-8.
И то же самое, но по-другому:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ make regexk1.jar
kotlinc regexk1.kt -include-runtime -d regexk1.jar

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/Localiz/regex.cod$ java -jar regexk1.jar "\d\d\d"
строка шаблона: <\d\d\d> - длиной 6
qwerty
целевая строка: <qwerty> - длиной 6
строка
целевая строка: <строка> - длиной 6
line
целевая строка: <line> - длиной 4

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Kotlin: игры с кодом

Непрочитанное сообщение Olej » 02 янв 2023, 08:11

Olej писал(а):
27 дек 2022, 08:29
А код Kotlin понадобился в связи с вот этим: регулярные выражения в программном коде.
Эта часть доделана: регулярные выражения в программном коде.
Теперь в этой теме будет продолжаться, при случае, всё что относится к образцам кода Kotlin.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей