D言語
KOBA789さんのYouTube配信みてて、似たような内容書くとどうなるかな、と考えてたが所有権もライフタイムもどっかいってしまった。。 Hello, World!? バイナリの気持ちを考えるところから、なのでハードルが高いんだよな。 なんとかついていこう。 import st…
Addressing Rust optimization failures in LLVMのはなしで、これがLDCだとどうなるか。 以下のようなコードでどうなるかみてみる。 このコードはRustのcodegen testを移植したもの。 import std.algorithm : sum; pragma(mangle, "ThreeSlices") struct Thr…
雑メモです。LLVMの実装追いきれてないからなんか間違ってたら、、スマンコ!w 前提 LLVMのインラインアセンブラはCodeGenの実体としてはnaked function相当。そのため、codegenには関数属性なんかを渡しているし、ジッサイこれが最適化に効いている! また…
Writing an OS in 1000 Linesという自作OSを学ぶための教材があり、これをD言語(LDCコンパイラ)で行った記録です。 先行事例 他言語実装という枠では、RustやZigですでにやられている方がいました。 Rust Totsugekitai/kanios レポジトリ: https://github.co…
https://twitter.com/yukicoder/status/1703772579511836745 という話がTwitter、あいやX(旧Twitter)あった。 これはLinux環境でbrewで入れたDMDはdmd.confに-fPICがついていないのが原因だった、っぽい。 DMDはコンパイル時の初期化設定ファイルを読み込む…
以前のポストでftoa実装がナイーブな感じであるという話はしたが、説明はしてなかったので残しておく。 アルゴリズム D言語の浮動小数点数の10進表記アルゴリズムは指数部の数値によって3種類のアルゴリズムを使い分けている。 Algorithm A: 指数部が大きい…
atof/ftoa相当や正規表現まわりのコードをざっくり読んでて、phobosとかで使われてるアルゴリズムってどんなのがあるっけというのをまとめてみた。主に、というかだいたい標準ライブラリで超雑なまとめです。 std.algorithm Boyer-Moore法(std.algorithm.sea…
Slackで以下のコードが通らないのはなぜ?という話があった。 import std; static assert(isInstanceOf!(Array, Array!char)); // OK! static assert(isInstanceOf!(Regex, Regex!char)); // Compile Error! どうもこれを調べてみると、alias templatesの場…
preExecFunctionとはなにか preExecFunctionはspawnProcessでfork-execのあいだに行う任意の処理を記述するためにある。 import std.process; import std.stdio; void main() { Config config = { preExecFunction: () nothrow @nogc @trusted { import core…
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…
いかなる型であってもできない。これはタプル型そのものの値であっても例外ではない。 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はD言語でPEGを扱うライブラリです。 初回なので一番簡単な題材にしたいところだ…
前回に続いてmysql-nativeネタ。 FAQみたいなのに残しておいたほうが説明とかする時に楽そうなので。 その1と書いたがその2があるとは言ってない(?) Q1: 都度コネクションをクローズするのは効率的にどうなのか? ウェブアプリケーション内で以下のような…
mysql-d/mysql-nativeってMySQL8.0対応してないの?という話があったので。 ちょっと前まで開発停滞していたけど最近はmysql-native自体は結構活発にコミットが積まれていて、たとえばCIの整備とかCollationのデフォルト変更(これは俺がやった)とかが行われ…
まず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…
さらに続き。 もう少し調べてみるとリンカに渡す前のオブジェクトファイルはTypeセクションが意図したおりになっていた。 ldc2 -mtriple=wasm32-unknown-unknown \ -mattr=+multivalue \ -betterC \ -fvisibility=hidden \ --frame-pointer=none \ -Oz \ -c …
前回の続き。 構造体は静的初期化にしたらうまくいくかも?と思い以下のようにコードを変更してみた。 extern (C): nothrow: @nogc: struct TwoI32 { int aa; int bb; }; export TwoI32 return_two_i32() { TwoI32 s = { aa: 1, bb: 2 }; return s; } が結果…
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のバージョン) $ cat dub.selections.json| grep mysql-native "mysql-native": "3.0.0", 以下のようにmax_allowed_packetや受信サイズを調整して試した結果、max_a…
最近はMySQLを触っている中で、なにかしらメモを残しておくかという気分になった。 mysql-nativeにはbulk insert用のサポートがあるわけではないが、メタプログラミングでコンパイル時にクエリをある程度生成できたりすると便利だなあと思うなどした。 環境 …
D言語はIdentifierとしてUnicode Codepointを使うことができる。 identifierの定義 character setの定義 (直接的に定義されていないが、Letterはcharacter setで表現可能である文字と推測できる) 従って、以下のようなコードを書くことができる。 void ほげ(…
D言語でもRISC-Vやりたいんだが…? ← できた。そういう話です。 準備 LDCのバージョンは以下のもの。自前ビルドしてる人はRISC-V向けにしてることと、RISC-VはLLVM 9.0.0以降で公式にサポートされていることに注意されたい。 $ ldc2 --version | head -2 LDC…
(追記: なんやかんやでWASI Tutorialまでできるようになった: https://github.com/kubo39/ldc-wasi-tutorial ) はじめて記事書くな、17です(威圧)。 これにだいたい参加しています。 雑にWASIをwasmtimeで動かせないかな、と試すやつをやりました。 まずWA…
relroはすでにけっこう有名だけど、はわりとこのへんの話は知られていない気がしてきた。 relro relro、すなわちrelocation read onlyは再配置情報を格納している領域を読み取り専用にして実行時に書き換えられないようにすることだ。 そもそも再配置(リロケ…
とくになにかあるわけじゃなくてSharedObjectsの使い方の備忘録として。まあこういうのドキュメントないので。。 SharedObjectsというのはLinuxでだけ使えるやつで、実行プログラムがロードしている共有ライブラリを取得するために使うものである。 ようは d…
これ https://github.com/dlang/dmd/pull/11049 単にtraits.dを修正するだけではだめだった、というのはlive関数属性は名前修飾の定義も実装もされていなかったので、typeof内で普通の関数と区別されていなかったのである。 具体的に言うと以下のようになっ…
以前挑戦してだめだった vulkan 利用、実はIntel HD用のパッケージを入れればいけるのでは?となったので試す。 $ sudo apt install -y mesa-vulkan-drivers おお、どうやら動いたっぽい。 $ dub run :devices Performing "debug" build using /home/kubo39/…
【2020.04.08追記】 dlsが非推奨になったので以下の内容はすべて古くなってしまいました。なんてこった。。 https://forum.dlang.org/post/usqhsdtwfhrterzpstst@forum.dlang.org 注意: この内容はもう古いです。 またまたemacsのD言語環境をいじってLSP仕様…
たとえば自前で pragma(crt_constructor) とか使った場合にどういう順で実行されるんだろう、とか。 こういうコードを用意して、 enum body = "import std.stdio;writeln(__PRETTY_FUNCTION__);"; pragma(crt_constructor) extern (C) void crt_constructor(…