Kotlin의 개요 및 모바일 애플리케이션 개발

16307 단어 AndroidKotlin
회사 내 Kotlin 학습회에서 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의 저장소를 열면 디렉터리가 많지만 우선 자세히 봐야 할 것은
  • libraries/stdlib
  • libraries/tools/kotlin-annotation-processing
  • libraries/tools/kotlin-gradle-plugin
  • compiler
  • 근처일 것 같은데.

    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은 개방적이고 누구나 제어할 수 있기 때문에 코드가 얼마든지 빨라지거나 주변 도구를 만들 수 있다.제가 조사한 건 여기까지니까 여기서 직접 확인해 주세요.

    좋은 웹페이지 즐겨찾기