kubo39's blog

ただの雑記です。

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…

ざっくりバイナリ・メモリの世界 for D言語を考えてみた、elfutils便利、そしてcapacityが重い操作というはなし

KOBA789さんのYouTube配信みてて、似たような内容書くとどうなるかな、と考えてたが所有権もライフタイムもどっかいってしまった。。 Hello, World!? バイナリの気持ちを考えるところから、なのでハードルが高いんだよな。 なんとかついていこう。 import st…

LDC: LLVMとmemcpyとRVOのはなし

Addressing Rust optimization failures in LLVMのはなしで、これがLDCだとどうなるか。 以下のようなコードでどうなるかみてみる。 このコードはRustのcodegen testを移植したもの。 import std.algorithm : sum; pragma(mangle, "ThreeSlices") struct Thr…

2024やりたいこと

とくに毎年振り返りとかしてないしできてないし意味あるんかな。。 LDCのxtensa対応してマイクロマウス Pi:Co V2という練習用のマイクロマウスがあるそうで、 これはCPUにESP32-S3、そして組み立て済なのでたぶんハンダとかなしでできる。ほんまかな。 それ…

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

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

Writing OS in 1000 lines をD言語でやった

Writing an OS in 1000 Linesという自作OSを学ぶための教材があり、これをD言語(LDCコンパイラ)で行った記録です。 先行事例 他言語実装という枠では、RustやZigですでにやられている方がいました。 Rust Totsugekitai/kanios レポジトリ: https://github.co…

DMDの-fPIE/-fPICとリロケーションタイプのはなし

https://twitter.com/yukicoder/status/1703772579511836745 という話がTwitter、あいやX(旧Twitter)あった。 これはLinux環境でbrewで入れたDMDはdmd.confに-fPICがついていないのが原因だった、っぽい。 DMDはコンパイル時の初期化設定ファイルを読み込む…

D言語のftoa/dtoa実装

以前のポストでftoa実装がナイーブな感じであるという話はしたが、説明はしてなかったので残しておく。 アルゴリズム D言語の浮動小数点数の10進表記アルゴリズムは指数部の数値によって3種類のアルゴリズムを使い分けている。 Algorithm A: 指数部が大きい…

D言語で使われているデータ構造・アルゴリズム

atof/ftoa相当や正規表現まわりのコードをざっくり読んでて、phobosとかで使われてるアルゴリズムってどんなのがあるっけというのをまとめてみた。主に、というかだいたい標準ライブラリで超雑なまとめです。 std.algorithm Boyer-Moore法(std.algorithm.sea…

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

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

isInstanceOfテンプレートとalias templates

Slackで以下のコードが通らないのはなぜ?という話があった。 import std; static assert(isInstanceOf!(Array, Array!char)); // OK! static assert(isInstanceOf!(Regex, Regex!char)); // Compile Error! どうもこれを調べてみると、alias templatesの場…

Nimと名前修飾の小ネタ

Nim

NimはDWARF v5の時点では DW_AT_language の割当はないけど、ソースコードはDWARFに入れることが できて $ eu-readelf --debug-dump=info hello とかで確認できる。 proc main() = echo "Hello!" main() $ nim c --debugger:native hello.nim (...) $ file h…

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

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

preExecFunctionのはなし

preExecFunctionとはなにか preExecFunctionはspawnProcessでfork-execのあいだに行う任意の処理を記述するためにある。 import std.process; import std.stdio; void main() { Config config = { preExecFunction: () nothrow @nogc @trusted { import core…

Is it safe in safe cast in safe functions?

safe functionの定義 より、 The following operations are not allowed in safe functions: * No casting from a pointer type to any type with pointers other than void*. void*を除く異なるポインタ型へのキャストは@safe関数内では禁止されている、と…

浮動小数点数の10進表記についてまとめてみた

リソースをまとめたのみで、これといってアルゴリズムを解説しているわけではない。 後々時間をみつけて気になったものは記事化するかもしれない(しないかもしれない)。 はじめに 以下の前提をおく。 IEEE754準拠 IEEE 754-2008 IEEE754とかなにかというのは…

タプル型をキャストしたときに型変換が走らない話

連日のキャストとタプル型ネタです。 現行のD言語の驚くべき振る舞いの一つとして、タプル型をキャストにより変換した際に指定した型への変換が行われないということがある。 動作確認を行ったコンパイラのバージョンは以下。 )$ dmd --version DMD64 D Comp…

小ネタ: D言語はいかなる型もタプル型へのキャストはできない

いかなる型であってもできない。これはタプル型そのものの値であっても例外ではない。 void main() { alias tuple(A...) = A; tuple!int tup; cast(tuple!int) tup; } (dmd-2.098.1)$ dmd -c cast.d cast.d(5): Error: cannot cast `__tup_field_0` to tuple…

最近やったゲーム

ちょっと前のもあるけど、 フォールアウト4 やりこみ要素強い。普通にメインストーリーもおもしろかった。 ボーダーランズ3 たぶんマルチプレイでやった初のゲーム。 ARK かなり重かった記憶が強い、なんだかんだドラゴン乗ったのが一番おもしろかった気がす…

Goのジェネリクスを試してみたらいきなりICEに遭遇した話

Go

Goにジェネリクスが来るぞ!ということで早速試してみることにする。 適当にmasterをクローンして cd src && ./make.bash でビルド(これだけでビルドできるの楽ちん)。 $ go version go version devel go1.18-6602c86a38 Fri Sep 17 08:20:48 2021 +0000 lin…

Peggedを使ってみる話

最近このへん触ってないなと思い。 Peggedまったく触ったことないわけではなかったけどパーサ書く時はいつも手書きでやってしまいがちなのであんまり詳しくなかったり。 PeggedはD言語でPEGを扱うライブラリです。 初回なので一番簡単な題材にしたいところだ…

mysql-d/mysql-nativeについてのFAQ その1

前回に続いてmysql-nativeネタ。 FAQみたいなのに残しておいたほうが説明とかする時に楽そうなので。 その1と書いたがその2があるとは言ってない(?) Q1: 都度コネクションをクローズするのは効率的にどうなのか? ウェブアプリケーション内で以下のような…

ここのところのmysql-d/mysql-nativeについてのはなし

mysql-d/mysql-nativeってMySQL8.0対応してないの?という話があったので。 ちょっと前まで開発停滞していたけど最近はmysql-native自体は結構活発にコミットが積まれていて、たとえばCIの整備とかCollationのデフォルト変更(これは俺がやった)とかが行われ…

gtkdのgtk4 branch(この時点で開発版)を試そうとしてだめだった記録

まずgtkの最新版を入れる。 $ pip install meson # わりと新しめのものにしないと動かないがち $ git clone -o upstream https://gitlab.gnome.org/GNOME/gtk.git $ cd gtk $ meson --prefix /opt/gtk builddir $ ninja -C builddir $ sudo ninja -C builddi…

LDCでwasmのmultivalue拡張できないか軽く試す (3)

さらに続き。 もう少し調べてみるとリンカに渡す前のオブジェクトファイルはTypeセクションが意図したおりになっていた。 ldc2 -mtriple=wasm32-unknown-unknown \ -mattr=+multivalue \ -betterC \ -fvisibility=hidden \ --frame-pointer=none \ -Oz \ -c …

LDCでwasmのmultivalue拡張できないか軽く試す (2)

前回の続き。 構造体は静的初期化にしたらうまくいくかも?と思い以下のようにコードを変更してみた。 extern (C): nothrow: @nogc: struct TwoI32 { int aa; int bb; }; export TwoI32 return_two_i32() { TwoI32 s = { aa: 1, bb: 2 }; return s; } が結果…

LDCでwasmのmultivalue拡張できないか軽く試す

LDCでWebAssemblyのmultivalue拡張を試したい。 コンパイラはLDC1.25.1でまず試してみる。 以下のようなコードを書いてみる。 extern (C): nothrow: @nogc: struct TwoI32 { int aa; int bb; } export TwoI32 return_two_i32() { return TwoI32(1, 2); } $ l…

mysql-nativeで一度に受信できるパケットサイズは16777210バイト

コードを読んでもとくにサイズ上限が規定されていなかったので実験した。 環境(mysql-nativeのバージョン) $ cat dub.selections.json| grep mysql-native "mysql-native": "3.0.0", 以下のようにmax_allowed_packetや受信サイズを調整して試した結果、max_a…

mysql-nativeでbulk insertをする

最近はMySQLを触っている中で、なにかしらメモを残しておくかという気分になった。 mysql-nativeにはbulk insert用のサポートがあるわけではないが、メタプログラミングでコンパイル時にクエリをある程度生成できたりすると便利だなあと思うなどした。 環境 …

Prologを使ってD言語のtraitsを表現してみる

D言語のtraitsのうちいくつか簡単に実装できそうなものを表現してみた。 といっても非常に不完全な状態であるが。 SWI-Prologを使ったが、他の実装でもおそらく問題ない。 $ swipl --version SWI-Prolog version 7.6.4 for amd64 ソースコードは以下のような…