目次

Rustの勉強[unsafe その5]

ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版

を読んでいる

お勉強

#

NO IMAGEUnsafe Rust - The Rust Programming Language 日本語版

  • 機能実行環境をウェブで使ったけどスマホ辛すぎて降参した

メモ

#

できあがったsplit_at_mut関数をunsafeでマークする必要はなく、この関数をsafe Rustから呼び出せることに注意してください。

  • うーんなるほど、unsafe関数を関数として切り出してるのか

時として、自分のRustコードが他の言語で書かれたコードと相互作用する必要が出てくる可能性があります。

  • これ全くわからん
    • 既存のライブラリ(C/C++)を活用したいとき
    • geminiにきいた
    • たしかに
extern "C" {
    fn abs(input: i32) -> i32;
}

fn main() {
    unsafe {
        // -3の絶対値は、Cによると{}
        println!("Absolute value of -3 according to C: {}", abs(-3));
    }
}
  • こんな感じで書くんやね

マングルとは、コンパイラが関数に与えた名前を他のコンパイル過程の情報をより多く含むけれども、人間に読みにくい異なる名前にすることです。全ての言語のコンパイラは、少々異なる方法でマングルを行うので、Rustの関数が他の言語で名前付けできるように、 Rustコンパイラの名前マングルをオフにしなければならないのです。

  • ???
  • 今日はここを理解するか

具体的なイメージ
あなたが書いたコード:
fn calculate(x: i32) -> i32
コンパイラが作るマングル名(例):
_ZN4core3foo9calculate17h8e9f5e2b1c0a5e6fE
「人間には読めないけれど、コンピュータにとっては『coreモジュールのfooにある、i32を受け取るcalculate関数だ!』と一発でわかる完璧な名前」 になっているのです。

  • geminiより

  • なるほど、コンパイラが解釈するときは人間が読めなくてもいいって話か

  • あーなるほどー!

  • Rust側がコンパイル時にマングルしてしまうから、他言語向けのコードは#[no_mangle]でその処理をさせないという記述か

まとめ

#
  • 生ポインタは一旦抜かした
  • 概要はスマートポインタのその他トレイト全部ないものという理解
  • 多言語の話はマングルが面白かった
  • 次はグローバル変数
  • そろそろ終わるかな