kubo39's blog

ただの雑記です。

Rust

Why my rust program cannot merge string literals?

こういう文字列の末尾が共通となるようなRustのコードがある。 fn main() { print!("foobar\n"); print!("bar\n"); } こうなってしまう。 $ rustc hoge.rs $ readelf -p .rodata hoge| grep bar [ 0] invalid args/rustc/82e1608dfa6e0b5569232559e3d385fea5…

各言語処理系からみるLLVMインラインアセンブラ、主にmemory clobberについて

雑メモです。LLVMの実装追いきれてないからなんか間違ってたら、、スマンコ!w 前提 LLVMのインラインアセンブラはCodeGenの実体としてはnaked function相当。そのため、codegenには関数属性なんかを渡しているし、ジッサイこれが最適化に効いている! また…

WSL2上でRustでespのstdをやっていく予定のはなし (1)

Interface誌のRust特集で、espのstdをやっていくぜ!となったが悪戦苦闘している。 まずドライバを入れてWindows側でデバイスを認識するところからつまづいた。 Establish Serial Connection with ESP32 - ESP32 - — ESP-IDF Programming Guide latest docum…

jemallocator/tikv-jemallocatorのdisable_initial_exec_tlsってなに?

GitHubでよくjemallocatorを使っているときにdisable_initial_exec_tls featureを有効にしているのをみかける。 これはなにかという話をする前に、TLSモデルについて知っておく必要がある。 TLSにはアクセスモデルというものがあり、モジュールの種類(実行バ…

プロセス起動でposix_spawnとかvforkとかを使うはなし

posix_spawn/vfork/clone(CLONE_VFORK) はメモリを共有するので速い. 速いが、親子でメモリを共有するので危険である. それでも速いのでプロセス起動で気をつけて使っている言語があり、どういう実装をしているか調べた. 前提 fork-exec間はasync-singal-saf…

SpinlockのExponential Backoff実装について

SpinLockのExponential Backoffアルゴルズムの実装を少し調べた. ParkingLot (WebKit,C++) https://webkit.org/blog/6161/locking-in-webkit/ という素晴らしいブログ記事で spinning という節で触れている. どうやら JikesRVM というJVM実装に由来するよう…

Rustでバイナリなライブラリ

最近いじるときにどっかに情報まとめとくといいかな、と思い。他にもあれば是非教えてください。 gimli-rs/gimli - DWARFを扱うためのライブラリ。DWARFってだいたいでかいのでlazy, zero-copyで扱いやすいのは期待してる。 m4b/goblin - ELF/Mach-O/pe 形式…

Rustのconst_fnがそれほど使い勝手がよくなさそうだという話

現状ではnightlyでしか使えないが、Rustは部分的にコンパイル時に関数評価を定数畳み込みする const_fn という機能がある。 https://doc.rust-lang.org/beta/unstable-book/language-features/const-fn.html そこでコンパイル時にバイト列を比較するコードを…

Rustのlockとスコープのはなし

こういうコードを書くと当然deadlockする。 use std::sync::{Mutex, Arc}; use std::thread; fn main() { let mut lock = Arc::new(Mutex::new(false)); let mut cloned_lock = lock.clone(); let th = thread::spawn(move|| { loop { let mut quit = cloned…

各OSにおけるRustのインストール方法

たまーに聞かれるので。うろ覚えで書いているので違ってたら直すのでこっそり教えてください。 Linux/macOS/FreeBSD/Windows rustup使いましょう。macOSでもhomebrew使うよりrustup使ったほうがいいと思います。.bashenvなり.zshenvなりに export PATH="$HOM…

ぱっと使えそうなRust製のツール

cargo installで入れられそうなやつを雑にまとめてみた。 ripgrep(rg) - はやいgrep、あるいはag。 xsv - CSVツールキット。 alacritty - 速いらしいターミナルエミュレータ。 parallel - GNU parallelのRust版。 coreutils - GNU coreutilsのポート。使えな…

Rust LT会で発表しました

Rust Rust LT会で発表しました。最初スクリーン映らなくて焦った…進行の方にご迷惑おかけしたことをここでお詫びします。 qiita.com まあここに書いてることをまた書いてもあまり意味ないのでこぼれ話を。 取り上げてるmiocoは最近はあまり活発じゃないです…

Rustのmysql_asyncをさわってみる

Rustの非同期I/O隆盛の流れでtokioベースのmysql driverができたっぽい。(ほんとにできたばっかり) GitHub - blackbeam/mysql_async: Asyncronous Rust Mysql driver based on Tokio. 雑な説明だけれど一応書いておくと、非同期I/Oは一スレッドが捌くクライ…

フィボナッチ rust版

無意味にマクロで。 macro_rules! fib { ( $n:expr ) => {{ let (mut x, mut y) = (1, 0); for _ in 0..$n { let tmp = box x; x += y; y = *tmp; } y }}; } fn main() { println!("{}", fib!(10)); } ( ՞ਊ ՞) :~/dev $ rustc --version # ちと古い rustc 1.…