Kotlin의 개요 및 모바일 애플리케이션 개발
Runs on JVM이란 무엇입니까?
Kotlin is a statically-typed programming language that runs on the Java Virtual Machine and also can be compiled to JavaScript source code.
Kotlin (programming language) - Wikipedia, the free encyclopedia
우선'Runs on JVM'이 어떻게 된 건지 고민했습니다.JVM은 지정된 형식의 바이트 코드를 실행합니다.예를 들어, 도움말 세계로 내보내는 클래스 파일은 다음과 같습니다.00000000 ca fe ba be 00 00 00 34 00 1d 0a 00 06 00 0f 09 |.......4........|
00000010 00 10 00 11 08 00 12 0a 00 13 00 14 07 00 15 07 |................|
00000020 00 16 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 |.....<init>...()|
00000030 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e |V...Code...LineN|
00000040 75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 |umberTable...mai|
00000050 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 |n...([Ljava/lang|
00000060 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 |/String;)V...Sou|
00000070 72 63 65 46 69 6c 65 01 00 0a 48 65 6c 6c 6f 2e |rceFile...Hello.|
00000080 6a 61 76 61 0c 00 07 00 08 07 00 17 0c 00 18 00 |java............|
00000090 19 01 00 0b 48 65 6c 6c 6f 20 57 6f 72 6c 64 07 |....Hello World.|
000000a0 00 1a 0c 00 1b 00 1c 01 00 05 48 65 6c 6c 6f 01 |..........Hello.|
000000b0 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 |..java/lang/Obje|
000000c0 63 74 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |ct...java/lang/S|
000000d0 79 73 74 65 6d 01 00 03 6f 75 74 01 00 15 4c 6a |ystem...out...Lj|
000000e0 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 |ava/io/PrintStre|
000000f0 61 6d 3b 01 00 13 6a 61 76 61 2f 69 6f 2f 50 72 |am;...java/io/Pr|
00000100 69 6e 74 53 74 72 65 61 6d 01 00 07 70 72 69 6e |intStream...prin|
00000110 74 6c 6e 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e |tln...(Ljava/lan|
00000120 67 2f 53 74 72 69 6e 67 3b 29 56 00 21 00 05 00 |g/String;)V.!...|
00000130 06 00 00 00 00 00 02 00 01 00 07 00 08 00 01 00 |................|
00000140 09 00 00 00 1d 00 01 00 01 00 00 00 05 2a b7 00 |.............*..|
00000150 01 b1 00 00 00 01 00 0a 00 00 00 06 00 01 00 00 |................|
00000160 00 01 00 09 00 0b 00 0c 00 01 00 09 00 00 00 25 |...............%|
00000170 00 02 00 01 00 00 00 09 b2 00 02 12 03 b6 00 04 |................|
00000180 b1 00 00 00 01 00 0a 00 00 00 0a 00 02 00 00 00 |................|
00000190 03 00 08 00 04 00 01 00 0d 00 00 00 02 00 0e |...............|
0000019f
즉,'Runs on JVM'이라고 불리는 제품은 JVM을 통한class verifier의 바이트 코드를 뱉은 것과 같다.그래서 어셈블리도 "Runs on JVM"입니다..class public Main
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit stack 2
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Hello World"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
.end method
물론 자바도'Runs on JVM'이죠.public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
Kotlin도 "Runs on JVM"입니다.fun main(args: Array<String>) {
println("Hello World")
}
나는 JVM에서 주행하는 어떤 차이점이 추상도와 천국이라고 생각한다.
이것만 보면 결국valid 바이트만 뱉으면 뭐든지 가능하니까 다시 자세히 보세요.
Kotlin 저장소 정보
Kotlin이 GitHub에 게시됨JetBrains/kotlin 즉시 다운로드하여 컴파일할 수 있습니다.Kotlin의 issue는 GitHub가 아니라 JetBrains의 Bug & Issue Tracker YouTrackKotlin (KT) | YouTrack을 사용합니다.
구축 도구는ant와maven을 사용하지만, 나는 우선ant가 있으면 좋겠다고 생각한다.
Kotlin의 저장소를 열면 디렉터리가 많지만 우선 자세히 봐야 할 것은
00000000 ca fe ba be 00 00 00 34 00 1d 0a 00 06 00 0f 09 |.......4........|
00000010 00 10 00 11 08 00 12 0a 00 13 00 14 07 00 15 07 |................|
00000020 00 16 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 |.....<init>...()|
00000030 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e |V...Code...LineN|
00000040 75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 |umberTable...mai|
00000050 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 |n...([Ljava/lang|
00000060 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 |/String;)V...Sou|
00000070 72 63 65 46 69 6c 65 01 00 0a 48 65 6c 6c 6f 2e |rceFile...Hello.|
00000080 6a 61 76 61 0c 00 07 00 08 07 00 17 0c 00 18 00 |java............|
00000090 19 01 00 0b 48 65 6c 6c 6f 20 57 6f 72 6c 64 07 |....Hello World.|
000000a0 00 1a 0c 00 1b 00 1c 01 00 05 48 65 6c 6c 6f 01 |..........Hello.|
000000b0 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 |..java/lang/Obje|
000000c0 63 74 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 |ct...java/lang/S|
000000d0 79 73 74 65 6d 01 00 03 6f 75 74 01 00 15 4c 6a |ystem...out...Lj|
000000e0 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 |ava/io/PrintStre|
000000f0 61 6d 3b 01 00 13 6a 61 76 61 2f 69 6f 2f 50 72 |am;...java/io/Pr|
00000100 69 6e 74 53 74 72 65 61 6d 01 00 07 70 72 69 6e |intStream...prin|
00000110 74 6c 6e 01 00 15 28 4c 6a 61 76 61 2f 6c 61 6e |tln...(Ljava/lan|
00000120 67 2f 53 74 72 69 6e 67 3b 29 56 00 21 00 05 00 |g/String;)V.!...|
00000130 06 00 00 00 00 00 02 00 01 00 07 00 08 00 01 00 |................|
00000140 09 00 00 00 1d 00 01 00 01 00 00 00 05 2a b7 00 |.............*..|
00000150 01 b1 00 00 00 01 00 0a 00 00 00 06 00 01 00 00 |................|
00000160 00 01 00 09 00 0b 00 0c 00 01 00 09 00 00 00 25 |...............%|
00000170 00 02 00 01 00 00 00 09 b2 00 02 12 03 b6 00 04 |................|
00000180 b1 00 00 00 01 00 0a 00 00 00 0a 00 02 00 00 00 |................|
00000190 03 00 08 00 04 00 01 00 0d 00 00 00 02 00 0e |...............|
0000019f
.class public Main
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit stack 2
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Hello World"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
.end method
public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
fun main(args: Array<String>) {
println("Hello World")
}
Kotlin이 GitHub에 게시됨JetBrains/kotlin 즉시 다운로드하여 컴파일할 수 있습니다.Kotlin의 issue는 GitHub가 아니라 JetBrains의 Bug & Issue Tracker YouTrackKotlin (KT) | YouTrack을 사용합니다.
구축 도구는ant와maven을 사용하지만, 나는 우선ant가 있으면 좋겠다고 생각한다.
Kotlin의 저장소를 열면 디렉터리가 많지만 우선 자세히 봐야 할 것은
stdlib
사람들은 흔히 Kotlin의 운행 시간이 매우 적다고 말하지만, 구체적으로 어떻게 된 일인지 확인해 봅시다.먼저 "Hello World"Hello.kt
를 출력합니다.// Hello.kt
fun main(args: Array<String>) {
println("Hello World")
}
kotlinc 명령을 사용하여 javac Hello.java
에서 클래스 파일을 생성하고 java Hello
에서 실행합니다.생성된 클래스 파일이 HelloKt.class
인 것은 Kotlin이 컴파일할 때 외부 클래스를 생성했기 때문에 클래스를 정의하지 않고 방법을 직접 정의할 수 있지만 JVM의 규격 클래스는 필요하다.$ kotlinc Hello.kt
$ kotlin HelloKt
Hello World
"Hello World"를 내보냈습니다.그러면 호기심 때문에 자바 명령으로 Kotlin의 클래스 파일을 실행해 보십시오.$ java HelloKt
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
at HelloKt.main(Hello.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
NoClassDefFoundError입니다.무슨 일이 일어났는지 알기 위해 어셈블리를 해 보세요.$ javap -c HelloKt.class
Compiled from "Hello.kt"
public final class HelloKt {
public static final void main(java.lang.String[]);
Code:
0: aload_0
1: ldc #9 // String args
3: invokestatic #15 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: ldc #17 // String Hello World
8: invokestatic #23 // Method kotlin/io/ConsoleKt.println:(Ljava/lang/Object;)V
11: return
}
다음은 Java로 작성된 코드의 클래스 파일을 어셈블한 결과입니다.기본 구조 함수는 자동으로 생성되기 때문에 무시할 수 있습니다.$ javap -c Hello.class
Compiled from "Hello.java"
public class Hello {
public Hello();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello World
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
비교할 때 Kotlin의 클래스 파일에 3: invokestatic #15 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
가 추가되었습니다.stdlib에서 이 클래스를 정의했습니다.kotlinc는 존재하는 전제에서 클래스 파일을 토합니다.따라서 stdlib가 없으면 실행할 때 오류가 발생합니다.
컴파일할 때 전송 -include-runtime
옵션을 통해 stdlib를 포함하는jar를 생성할 수 있으며, java 명령을 통해 이jar를 실행할 수 있습니다.$ kotlinc Hello.kt
$ kotlin HelloKt
Hello World
$ kotlinc Hello.kt -include-runtime -d Hello.jar
$ java -jar Hello.jar
Hello World
해동jar 안의 내용을 보면 자신이 쓴 HelloKt.class
과 stdlib가 확실히 있다는 것을 발견할 수 있다.
Scala의 표준 라이브러리와 파일 수를 간단하게 비교해 보면 Kotlin은 70개의 파일이고 Scala는 751개의 파일로 Kotlin의 운행 시간이 매우 적다는 것을 알 수 있다.
이것은 Kotlin이 편리한 문법과 확장 함수(stdlib의 대부분은 확장 함수)를 제공했기 때문이다. 즉, Better Java라는 위치에 비해 Scala의 목표는 기능 프로그래밍을 완전히 지원하는 것이다나는 그 천국을 실현하기 위해 많은 반이 필요하다고 생각한다.
운행 시간이 많으면 Proguard로 깎으면 되지만 다 사용하지 않아도 필요하기 때문에 stdlib에 들어갔습니다. 물론 깎은 것은 깎지만 더 Scala 같은 코드를 쓰면 사이즈가 커지는 것도 어쩔 수 없습니다.
그렇다면 이런 stdlib는 변경이 간단하기 때문에 stdlib의 적당한 파일을 열고 자신이 좋아하는 확장 함수를 추가하여 컴파일하고 실행하십시오.// libraries/stdlib/src/kotlin/text/Strings.kt
public inline fun String.hello(): String = "Hello World"
추가되면 ant runtime
만 수행하면 됩니다.성과물이 dist
이하로 토할 수 있으니 빨리 실행하세요.$ dist/kotlinc/bin/kotlinc
Type :help for help, :quit for quit
>>> "".hello()
Hello World
간단하네.
kotlinc
다른 컴파일러의 말대로kotlinc에도 Lexer analyzer, Parser, Codegenerator가 있는데 각각 다음과 같다.
Lexcal analyzer는 JFlex - The Fast Scanner Generator for Java라는 Lexical analyzer generator를 사용하여 Kotlin.flex
라는 정의 파일에서 _JetLexer.java
라는 Lexer를 생성합니다.
Parser도 일부 Parser generator를 사용하지만,kotlinc는 IntelliJ platform SDK라는 프레임워크를 사용합니다. 수첩에 영패를 예독하고 표시하며 AST를 구축했습니다.
Implementing Parser and PSI
AST에서 Optimizer가 필요 없는 Boxing, Null check, Dead code를 삭제하면 코드generator가 코드를 생성합니다.
Codegenerator는 Groovy, Clojure, JRuby, IntelliJ, Eclipse, Lombok 등 모든 곳에서 사용ASM합니다.상상하기 쉽도록 구체적인 예를 들어 ASM에서'Hello World'를 출력하는 코드는 다음과 같다.MethodVisitor methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC,
"main",
"([Ljava/lang/String;)V",
null,
null);
methodVisitor.visitCode();
methodVisitor.visitFieldInsn(Opcodes.GETSTATIC,
"java/lang/System",
"out",
"Ljava/io/PrintStream;");
methodVisitor.visitLdcInsn("Hello World");
methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
"java/io/PrintStream",
"println",
"(Ljava/lang/String;)V");
methodVisitor.visitInsn(Opcodes.RETURN);
methodVisitor.visitEnd();
거의 어셈블리에 가깝다.JVM 사양을 이해하지 못하면 쓸 수 없습니다.kotlinc는 포장의 클래스를 만들어 다소 쓰기 쉬워졌다.
Kotlin 및 모바일 애플리케이션 개발
모바일 응용 프로그램 개발에서 Kotlin을 사용할 수 있는지의 초기 목적으로 돌아가면 현황이 다소 오류가 있지만 언어라도 언어 개발 환경 자체가 그렇게 나쁘지는 않지만 응용 프로그램의 코드를 작성하고 자동 완성이 느리며 Lint계의 도구가 충실하지 못하다 등매일 좋은 곳, 나쁜 곳의 새로운 발견이 있는데, 나의 의견은 며칠마다 변한다.
특히 Jack & Jill의 등장으로 갑자기 전멸하지 않을까 걱정했지만 Jill은 클래스 파일을 읽을 수 있을 것 같고 Jack으로 해석할 수 있는 중간 코드를 출력할 수 있을 것 같다(만약 그렇지 않으면 기존 라이브러리가 전멸할 것이다...). apt의 지원은 시간이 걸릴 수 있다나는 Kotlin이 전혀 움직이지 않을 것이라고 생각한다.
문제가 있더라도 마음속에서 우러나오는 생각이 있다면 Kotlin은 개방적이고 누구나 제어할 수 있기 때문에 코드가 얼마든지 빨라지거나 주변 도구를 만들 수 있다.제가 조사한 건 여기까지니까 여기서 직접 확인해 주세요.
Reference
이 문제에 관하여(Kotlin의 개요 및 모바일 애플리케이션 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rejasupotaro/items/d3fa66c3f02d1cb2477a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// Hello.kt
fun main(args: Array<String>) {
println("Hello World")
}
$ kotlinc Hello.kt
$ kotlin HelloKt
Hello World
$ java HelloKt
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
at HelloKt.main(Hello.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
$ javap -c HelloKt.class
Compiled from "Hello.kt"
public final class HelloKt {
public static final void main(java.lang.String[]);
Code:
0: aload_0
1: ldc #9 // String args
3: invokestatic #15 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: ldc #17 // String Hello World
8: invokestatic #23 // Method kotlin/io/ConsoleKt.println:(Ljava/lang/Object;)V
11: return
}
$ javap -c Hello.class
Compiled from "Hello.java"
public class Hello {
public Hello();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello World
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
$ kotlinc Hello.kt
$ kotlin HelloKt
Hello World
$ kotlinc Hello.kt -include-runtime -d Hello.jar
$ java -jar Hello.jar
Hello World
// libraries/stdlib/src/kotlin/text/Strings.kt
public inline fun String.hello(): String = "Hello World"
$ dist/kotlinc/bin/kotlinc
Type :help for help, :quit for quit
>>> "".hello()
Hello World
다른 컴파일러의 말대로kotlinc에도 Lexer analyzer, Parser, Codegenerator가 있는데 각각 다음과 같다.
Lexcal analyzer는 JFlex - The Fast Scanner Generator for Java라는 Lexical analyzer generator를 사용하여
Kotlin.flex
라는 정의 파일에서 _JetLexer.java
라는 Lexer를 생성합니다.Parser도 일부 Parser generator를 사용하지만,kotlinc는 IntelliJ platform SDK라는 프레임워크를 사용합니다. 수첩에 영패를 예독하고 표시하며 AST를 구축했습니다.
Implementing Parser and PSI
AST에서 Optimizer가 필요 없는 Boxing, Null check, Dead code를 삭제하면 코드generator가 코드를 생성합니다.
Codegenerator는 Groovy, Clojure, JRuby, IntelliJ, Eclipse, Lombok 등 모든 곳에서 사용ASM합니다.상상하기 쉽도록 구체적인 예를 들어 ASM에서'Hello World'를 출력하는 코드는 다음과 같다.
MethodVisitor methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC,
"main",
"([Ljava/lang/String;)V",
null,
null);
methodVisitor.visitCode();
methodVisitor.visitFieldInsn(Opcodes.GETSTATIC,
"java/lang/System",
"out",
"Ljava/io/PrintStream;");
methodVisitor.visitLdcInsn("Hello World");
methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
"java/io/PrintStream",
"println",
"(Ljava/lang/String;)V");
methodVisitor.visitInsn(Opcodes.RETURN);
methodVisitor.visitEnd();
거의 어셈블리에 가깝다.JVM 사양을 이해하지 못하면 쓸 수 없습니다.kotlinc는 포장의 클래스를 만들어 다소 쓰기 쉬워졌다.Kotlin 및 모바일 애플리케이션 개발
모바일 응용 프로그램 개발에서 Kotlin을 사용할 수 있는지의 초기 목적으로 돌아가면 현황이 다소 오류가 있지만 언어라도 언어 개발 환경 자체가 그렇게 나쁘지는 않지만 응용 프로그램의 코드를 작성하고 자동 완성이 느리며 Lint계의 도구가 충실하지 못하다 등매일 좋은 곳, 나쁜 곳의 새로운 발견이 있는데, 나의 의견은 며칠마다 변한다.
특히 Jack & Jill의 등장으로 갑자기 전멸하지 않을까 걱정했지만 Jill은 클래스 파일을 읽을 수 있을 것 같고 Jack으로 해석할 수 있는 중간 코드를 출력할 수 있을 것 같다(만약 그렇지 않으면 기존 라이브러리가 전멸할 것이다...). apt의 지원은 시간이 걸릴 수 있다나는 Kotlin이 전혀 움직이지 않을 것이라고 생각한다.
문제가 있더라도 마음속에서 우러나오는 생각이 있다면 Kotlin은 개방적이고 누구나 제어할 수 있기 때문에 코드가 얼마든지 빨라지거나 주변 도구를 만들 수 있다.제가 조사한 건 여기까지니까 여기서 직접 확인해 주세요.
Reference
이 문제에 관하여(Kotlin의 개요 및 모바일 애플리케이션 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rejasupotaro/items/d3fa66c3f02d1cb2477a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Kotlin의 개요 및 모바일 애플리케이션 개발), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rejasupotaro/items/d3fa66c3f02d1cb2477a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)