kubo39's blog

ただの雑記です。

D言語

ざっくりバイナリ・メモリの世界 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…

各言語処理系からみる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…

isInstanceOfテンプレートとalias templates

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

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関数内では禁止されている、と…

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

連日のキャストとタプル型ネタです。 現行の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…

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用のサポートがあるわけではないが、メタプログラミングでコンパイル時にクエリをある程度生成できたりすると便利だなあと思うなどした。 環境 …

D言語の名前修飾はUnicode識別子をエンコードしない

D言語はIdentifierとしてUnicode Codepointを使うことができる。 identifierの定義 character setの定義 (直接的に定義されていないが、Letterはcharacter setで表現可能である文字と推測できる) 従って、以下のようなコードを書くことができる。 void ほげ(…

D言語でRISC-Vシミュレータ上でハローワールドする

D言語でもRISC-Vやりたいんだが…? ← できた。そういう話です。 準備 LDCのバージョンは以下のもの。自前ビルドしてる人はRISC-V向けにしてることと、RISC-VはLLVM 9.0.0以降で公式にサポートされていることに注意されたい。 $ ldc2 --version | head -2 LDC…

D言語もくもく会第17回

(追記: なんやかんやでWASI Tutorialまでできるようになった: https://github.com/kubo39/ldc-wasi-tutorial ) はじめて記事書くな、17です(威圧)。 これにだいたい参加しています。 雑にWASIをwasmtimeで動かせないかな、と試すやつをやりました。 まずWA…

partialRELRO/fullRELRO、あるいは-fno-pltの話

relroはすでにけっこう有名だけど、はわりとこのへんの話は知られていない気がしてきた。 relro relro、すなわちrelocation read onlyは再配置情報を格納している領域を読み取り専用にして実行時に書き換えられないようにすることだ。 そもそも再配置(リロケ…

Linux環境でSharedObjectsを使う

とくになにかあるわけじゃなくてSharedObjectsの使い方の備忘録として。まあこういうのドキュメントないので。。 SharedObjectsというのはLinuxでだけ使えるやつで、実行プログラムがロードしている共有ライブラリを取得するために使うものである。 ようは d…

getFunctionAttributesでlive関数属性をとれるようにした

これ https://github.com/dlang/dmd/pull/11049 単にtraits.dを修正するだけではだめだった、というのはlive関数属性は名前修飾の定義も実装もされていなかったので、typeof内で普通の関数と区別されていなかったのである。 具体的に言うと以下のようになっ…

D言語のvulkan bindingであるEruptedDをいれる

以前挑戦してだめだった vulkan 利用、実はIntel HD用のパッケージを入れればいけるのでは?となったので試す。 $ sudo apt install -y mesa-vulkan-drivers おお、どうやら動いたっぽい。 $ dub run :devices Performing "debug" build using /home/kubo39/…

emacsのD言語環境 (2020.03.07版)

【2020.04.08追記】 dlsが非推奨になったので以下の内容はすべて古くなってしまいました。なんてこった。。 https://forum.dlang.org/post/usqhsdtwfhrterzpstst@forum.dlang.org 注意: この内容はもう古いです。 またまたemacsのD言語環境をいじってLSP仕様…

DMDはmain関数(not _Dmain)を実行する前になにをするのか

たとえば自前で pragma(crt_constructor) とか使った場合にどういう順で実行されるんだろう、とか。 こういうコードを用意して、 enum body = "import std.stdio;writeln(__PRETTY_FUNCTION__);"; pragma(crt_constructor) extern (C) void crt_constructor(…