$30 off During Our Annual Pro Sale. View Details »

Kotlin/NativeからCの標準ライブラリを呼び出そう

 Kotlin/NativeからCの標準ライブラリを呼び出そう

2021/12/04 Piyogrammer Conference 2021にて発表

Yuta Tomiyama

December 04, 2021
Tweet

More Decks by Yuta Tomiyama

Other Decks in Programming

Transcript

  1. Kotlin/Nativeから
    Cの標準ライブラリを呼び出そう
    2021/12/04 Piyogrammer Conference

    View Slide

  2. 自己紹介
    HN: マヤミト
    ID: yt8492
    会津大学 学部4年
    普段はAndroidアプリ書いたりサーバー書いたり
    今回のイベントの運営でもあります
    GitHub: https://github.com/yt8492
    趣味: Kotlin, Twitter, ウマ娘
    Twitter: yt8492

    View Slide

  3. Kotlin/Nativeとは?
    - KotlinのコードをJavaのバイトコード以外にコンパイルする技術
    - VMなしで実行可能なバイナリ
    - C/C++向けのライブラリとCヘッダ
    - Swift/Objective-C向けのApple framework
    - 当然JavaのライブラリやJVMのみをターゲットとしたKotlinのライブラリは使えない
    😇
    - 目的のtargetに対応したKotlinのライブラリを使う
    - 目的のtargetの処理をブリッジを書いて Kotlinでラップする

    View Slide

  4. Kotlin標準ライブラリでできることは意外と限られている
    - Javaの標準ライブラリが普通にKotlinから使えるおかげで普段意識しないが、実
    はKotlinの標準ライブラリではファイル操作やソケット通信などは提供されていな

    - kotlinx-ioというライブラリが公式で開発中だが、ファイル操作もソケット通信もまだできない 😇

    View Slide

  5. KotlinからCの標準ライブラリを呼び出そう(本題)
    - fopenとかをKotlin/Nativeから呼び出せばいいじゃん!
    - とはいえ自力でブリッジを書くのはあまりにもしんどい
    - Kotlin/Native向けにplatform librariesという形でCの標準ライブラリの関数など
    をそのままKotlinから使えるようにしたラッパーが公式で提供されている

    View Slide

  6. 簡単な例

    View Slide

  7. Cのprintfが呼び出せた🎉

    View Slide

  8. とはいえそんなに単純に済む話じゃない
    - KotlinとCのそもそもの言語仕様の違い
    - Kotlinは変数の宣言と代入はセットだが、 Cは変数宣言だけしてポインタを関数に渡すなどができ

    - KotlinはGCがあるけどCにはない
    - Kotlinにポインタの概念はない
    - などなど

    View Slide

  9. KotlinでCの変数のメモリ確保など
    - memScopedという関数に渡すブロックの中でallocなどの関数が使える
    - このスコープを抜けると確保したメモリは開放される
    - ポインタは ptr という拡張プロパティで取得できる

    View Slide

  10. Cの値とポインタをKotlinで扱う
    - allocで確保できる型はCVariable型を継承した型のみ
    - Kotlinのプリミティブ型(Intなど)がallocできないじゃん!
    - プリミティブ型用にCVariable型を継承したIntVar型などが用意されている
    - CVariable型が継承しているCPointed型には、ptrという拡張プロパティが生えて
    いる
    - ptrはCPointer型

    View Slide

  11. Kotlin/NativeでTCPのソケット通信をecho backする例
    - yt8492/NativeServer
    https://github.com/yt8492/NativeServer
    - Cのsocket関数などをKotlinでラップしてJavaのSocketまわりの標準ライブラリに近いものを自作
    - それを使う形でecho backを実装

    View Slide

  12. これでみなさんもCのコードをKotlinに
    脳内変換できるようになりましたね?

    View Slide

  13. みんなもKotlin/Native、しよう!

    View Slide