kubo39's blog

ただの雑記です。

D言語

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

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

そのスタックを食べたのはだれ? ~travisでdubがSEGVし続けたワケ~

あらすじ ある日のこと、Travis上のプロジェクトがdub使ってるとSEGVで落ちる、というチケットが。さらにスレッドが進み、どうもいろいろなパッケージで同様の問題が起きているとのこと。 LinuxでしかおきないぞとかdubでParallel GC(注:mark&sweep gcのmark…

D言語のOpenSSL事情、というか愚痴

つらい話です、というかただの愚痴です。 D言語のOpenSSLバインディングとしては D-Programming-Deimos/openssl があるのですが、メンテナンスが行き届いているとは言い難い状態です。 それ以外にもいくつか問題があって、 新しめのAPIへの対応が追従できて…

LDCのlibFuzzerを試す

LLVMはlibFuzzerというFuzzingの仕組みがあって、LDCからその機能を使うことができる。 こういうコードで試してみる。LDCは1.19.0。 import ldc.libfuzzer; import std.string; mixin DefineTestOneInput!fuzz_target; int fuzz_target(in ubyte[] data) { i…

LDCにおいてもはや必要なくなったcopy-relocation checkのためのワークアラウンドを消した話

LDCのバグで困っている、というので調査をしてみた。 調べてみると、どうもこれはLDCで実行バイナリを生成する場合(より正確にはmain関数を定義している場合)のみ行われるcopy-relocation checkのために必要とされるようだ。 なんでcopy-relocation checkが…

DMDのDWARFが2019年でまだv3だった

ふと、DMDが生成するデバッグ情報を調べていたところDMDはDWARF v3でデバッグ情報を付与するようだ。 DMDのバージョンは2.089.0を使っている。 $ dmd --version DMD64 D Compiler v2.089.0 Copyright (C) 1999-2019 by The D Language Foundation, All Right…

ずっとdruntimeのベンチマークのコンパイルがリンカエラーで落ち続けてる

最近ちっともDMDのビルドがうまくいかない。 ホストのコンパイラとしてDMD 2.087.1にパスを通した状態で、全部(dmd,druntime,phobos)のレポジトリに make -f posix.mak clean をかけた状態でmasterを更新してdmdで make -f posix.mak -j4、 phobosでも make …

いまさらマンデルブロー集合を書くので、なるべく型安全っぽくを意識した

プログラミングRustをちらちら読んでいたら並列化の例としてあったので、いまさらマンデルブロー集合を実装した。 元のコードがRustなのでなるべく型安全な感じに書いてみたつもり。 他の言語でfind相当のものがcountUntilという名前で、findは別の操作を行…

jailingをD言語にポーティング、やってみた!

kazuho/jailing をD言語に置き換えてみました。 これです。 目的 実用的にはLinuxであればどの環境でもPerl5が入っていることは期待できるし外部依存もないので特に意義はないです。 あくまで学習目的というやつです。コードサイズも小さいし、いいかなって…

argc = 0 でプロセスを動かす

DMDのコード内ではargcが0な環境を想定してコードが書かれているが、そういう環境は存在するのだろうか。 調べてみるとわりとすぐにstackoverflowがみつかった。 c - executing a process with argc=0 - Stack Overflow posix_spawnを使えばできるようなので…

小ネタ: safe functionとcast function of null

おなじみ(?), safe functionを考えてみようの会です. 突然ですが, 以下のコードは合法でしょうか? void main() @safe { (cast(void function() @safe) null)(); } 結果はおおかた予想がつくとは思いますが、Segmentation Faultになります。 (dmd-2.084.0)$ …

scope parameter storage class と in parameter storage class

(2019/02/07; いくつか追記したのでそちらのほうもみてください) 現在の最新版コンパイラ(DMD 2.084.0)だと, このコードはSEGVで落ちてしまう. auto foo(scope void delegate() @safe dg) @safe { return dg; } auto bar(void delegate() @safe dg) @safe …

DMDでprofileオプションを使ったときだけスタックオーバーフローする不思議なバグの調査

なんかおもしろいコンパイラのバグに遭遇したのでめも。 もともとはpeggedを使ったプロジェクトで dub build --build=profile でビルドしたバイナリを実行するとSEGVに遭遇するんだけど・・・、という問題だった。 とりあえずgdbにかけてみると >>> bt 10 #0…

C言語のmainでめちゃくちゃできる、ってネタみたけど別にDでもできるよな。 main is usually a function はでないけど。 extern (C) void main() pure nothrow @nogc { asm pure nothrow @nogc { naked; db 0x31; db 0xC0; // xor EAX, EAX; db 0xFF; db 0xC…

druntimeのcore.syncについて

いろいろいけてないよな。 Mutexの実装がデフォルトでre-entrant 不定な振る舞いよりはデッドロックが早期にわかるほうが100倍マシだから 条件変数およびセマフォのタイムアウトつきwaitがmonotonicなclockじゃなくシステムクロック なので、システムの時刻…

ErupteDを使ってDからVulkan触ろうと思ったけどできなかった話

最近しょうもない記事ばっかり書いてるけど、無職だとこうやってメリハリつけないとだめかなーと思っての行為なので許容して。 DでVulkanさわろうとおもうと https://github.com/ParticlePeter/ErupteD というライブラリが一番スターついてるっぽいのでこれ…

LDC向けのSIMDライブラリを作っているけど、いろいろつらい

x86intrin 勉強がてらにLDCでx86intrinsicっぽくSIMDを書けるライブラリを書いてみている。まだまだ全然途中なので使わないでください。 github.com _m128iとかじゃなくてそのままbyte16とかを直接 _mm_XXX の引数にとったりするようにしてるけど、将来的に…

perfを使ってD言語のプロファイリング結果をみる

まず手元の /proc/sys/kernel/perf_event_paranoid を確認する。Ubuntuとかだと最弱設定になってるので変えとく。 $ cat /proc/sys/kernel/perf_event_paranoid 3 $ sudo sh -c 'echo 1 > /proc/sys/kernel/perf_event_paranoid' 普通に perf record にかけ…

D言語で一ヶ月前を表すとき

日付の扱いは忘れそうなのでメモ。 一ヶ月前を表す場合、可能であれば前月の同日同時刻を表し、前月に同日が存在しない場合は差分を計算して付け足す。 import std.datetime; import std.stdio; void main() { auto currTime = Clock.currTime(UTC()); write…

D言語のprecise(正確な) GC

(追記: 編集あり) 実は結構前に保守的なGCから正確なGCになって いた いなかった。仕組みはマーク・アンド・スィープで変わらないが性能は大幅に向上が期待できそう。 github.com これによって、 メモリ確保時 allocatorの使い分けによる効率的なメモリ管理…

D言語の八進数リテラルの特殊扱い

D言語はかつて八進数リテラルを定義していたが、現在は仕様上Invalidとなっており std.conv.octal を使うようにエラーメッセージが出現する。 (dmd-2.081.1)$ cat octal.d void main() { auto _ = 010; } (dmd-2.081.1)$ dmd octal.d octal.d(3): Error: oct…

D言語の静的配列のちょっとかわった挙動

以下のコードの振る舞いはちょっと変わった感じをうけるかもしれない。 int[2] ARR = [5]; void main() { // int[2] arr = [5]; // Error: mismatched array lengths, 2 and 1 assert(ARR == [5, 0]); } この場合、D言語の静的配列はグローバルに宣言した場…

DMDにContributeした

D言語の数値まわりの字句解析のはなし - kubo39's blog これがほっといてもなおってなかったので、自分で報告して修正した。 github.com DMDのビルドははやくて快適だけど、フルテスト回すとそこそこ時間がかかる。 追記 今きづいたけどエラーメッセージにSu…

std.parallelismざっくり

D言語で並列処理を扱うためのライブラリとして、標準ライブラリにstd.parallelismがある。 これはstd.algorithmやstd.rangeを使うのとほとんど同じような感じで処理が書ける。 以下の処理はOSスレッドによって並列に実行される。 デフォルトのワーカースレッ…

DockerとD言語のイメージ

そろそろDockerをまじめにやらないといけなくなってきた。D言語は飾りです。 まずは試す 準公式?のDockerイメージがあるのでpullしてくる。 $ docker pull dlanguage/dmd (...) README にあるとおりに試す、ファイル名だけかえて hello.d というファイルを…

DCDのめも

多くの言語と同じようにD言語にもコード補完ツールがあり、DCDという。 コード補完ツールは基本の仕組みはほぼほぼ同じなのだが、それなりに個性があったりする。 例えばコンパイラがライブラリとしてパーサを提供していてそれを使っているもの(Rustのracer…

Dで生成したバイナリ自身のシンボルをみる

完全ではないが、モジュール情報や関数名や型情報などは .symtab をみればとれる。もう少しまじめにsections_elf_shared.dを読めば意味のあるものになるかもしれません。 import core.demangle; import std.algorithm : map; import std.file : thisExePath;…

D言語の数値まわりの字句解析のはなし

仕様はここにある https://dlang.org/spec/lex.html#Integer これをみると、 0b_ はBinaryIntegerとして表現可能なリテラルとなる。 import std.stdio; void main() { writeln("0b_: ", 0b_); writeln("0b________: ", 0b________); // _ がいくつあってもよ…

社内勉強会でD言語とマイコンのはなしを発表した

スライド Q&A 組込みでDを使うメリットがあまりなかった、Rustのほうが筋がいいのでは? たしかにそうなんですよね Cのライブラリを使わなかったのはなぜ? プリプロセッサマクロがふんだんに使われているので、どうせなら全部自前で実装したほうがはやかっ…

emacsのD言語設定をひさしぶりにいじった

emacs 25.1.1でd-modeを使おうとするとなんかエラーが出てたので今までjava-modeを使っていたが、d-mode.elをM-x byte-recompile-fileすると動くようになったので、ついでにD言語設定をえいやっとやってしまった。 大した設定はしていなくて、 auto-complete…