読者です 読者をやめる 読者になる 読者になる

kubo39's blog

ただの雑記です。

LDCの最適化とか

http://robert.ocallahan.org/2017/04/rust-optimizations-that-c-cant-do_5.html これを読んで、なるほどRustだとこういう最適化できるのね、というのを学んだ。 Here it’s really clear that the semantics of Rust are making this optimization possible…

STM32F3DISCOVERYをD言語から動かすライブラリを書いている

https://github.com/kubo39/stm32f3discovery で開発中です。LDC前提。とりあえずのLチカと例外のハンドリングとかくらいしかない。 Lチカのプログラムはこんな感じの抽象度で書けます。 import stm32f3discovery; import led; extern(C): @nogc: nothrow: v…

STM32F3DISCOVERYでD言語のプログラムを実行する

LDCコンパイラでSTM32F3DISCOVERYで動く実行バイナリをいろいろ苦労して作成した。 いろいろ罠 LDCのオプションは罠だらけ march,mcpuの指定が罠 float ABIの指定でhardが効かない、soft ABIとなる tripleの指定が罠 eabihfだとsoft-float ABIになってしまう…

LDCでSTM32F103のバイナリを作ろうとしてできなかった

Cortex-M3な環境を試してみる。 コードを以下のようなかんじで用意する。 import ldc.attributes; extern(C): @nogc: nothrow: pragma(LDC_no_moduleinfo); @(section("_reset")) void _reset() { int y = void; auto x = 42; y = x; while (true) {} } ENTR…

QEMUを使ってCortex M3なバイナリを動かしてみる

環境 $ cat /proc/version Linux version 4.8.0-41-generic (buildd@lgw01-18) (gcc version 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12) ) #44-Ubuntu SMP Fri Mar 3 15:27:17 UTC 2017 $ ldc2 -version| head -1 LDC - the LLVM D compiler (1.0.0): インス…

STM32F3DISCOVERYボード向けに実行プログラムをLDCで作ってみようとしてハマった

表題のとおり、STM32F3DISCOVERYボード向けに実行プログラムをLDCで作ってみようとしてハマった。 D言語のソースコード import ldc.attributes; extern(C): @nogc: nothrow: pragma(LDC_no_moduleinfo); @(section("_reset")) void _reset() { int y = void;…

re-visit kNN and operf/LDC

以前書いたものはシングルスレッド版のRust/OCamlよりも遅かった。これをprofilingしてみる。 スペック $ lscpu [kubo39:knn][git:master] Architecture: x86_64 CPU 操作モード: 32-bit, 64-bit Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: …

DMD on FreeBSD

だいたいこの記事のとおりなんだけど、細々と補足をしておく。 まず選定したFreeBSDのboxの話。最初はfreebsd/FreeBSD-11.0-STABLEのboxを試していたのだけど、これは毎度VMが突然シャットダウンしてしまって使い物にならなかったためにfreebsd/FreeBSD-11.0…

D言語でFD_CLOEXECをデフォルトにする?

表題のとおりの提案をしてみたいと思った。(思っただけ) FD継承はUNIXの伝統だが、意図しない継承によって様々なセキュリティ上の問題を引き起こしてきた。(APIデザインケーススタディとかPEP446あたり参照) そのため最近の言語 (Perl/Go/Ruby/Python/Rust…

D言語のcast

D言語で型変換したかったら基本は std.conv.to 使うのが安全である。 import std.conv; void main() { int a = 1; long b = a.to!long; assert(b == 1); } std.conv.toは安全であるが、安全であるということは制約が強いということでもある。例えば以下のコ…

shibuya.d #2 開催しました

12/15(木)に開催しました。参加いただいた皆様、ありがとうございました。 connpass.com 当日の様子はTogetterでまとめています。ツイートの利用問題ありましたら誰でも編集可能にしているので削除お願いします。 ツイートを使わせていただきました。誰でも…

D言語でシュッとスクリプトっぽく試す

qiita.com これがとてもいいと思い、D言語で同じようなものを作ってみた。とりあえず3rd party製のものを意識しない版。 import std.stdio; import std.regex; import std.format; import std.process; import std.path; import std.file; import core.stdc.…

D言語とOS開発と自作OS

この記事は 自作OS Advent Calendar 2016 の3日目です。 D言語とOS開発 D言語はシステムプログラミング言語であり、OSを開発することのできる言語のひとつです。D言語でのOSプロジェクトはすでにいくつかあります。 Vild/PowerNex 今D言語でもっとも勢いがあ…

コードを書き換えずに実行時のメモリ使用量を観測したい

元のプログラムを書き換えることなく実行中にメモリ使用量をみることを考える。 libcの関数、例えば free(3) にフックを仕込んでみたらどうだろうか。 こういうコードを書く。 import core.stdc.stdio : printf; import core.sys.linux.dlfcn : dlsym, RTLD_…

起伏のない日々

労 相変わらずjavascriptとPerlの日々だ。 PIEとD言語 (Cont.) 昨日の続き。 どうもdmdでうまくいかないのはlibphobos2.aが-fPICつきで生成されていないためのようだ。 https://issues.dlang.org/show_bug.cgi?id=5278 https://wiki.ubuntu.com/SteveBeattie…

月曜日のはわわっ・・!

Sierra 会社のMBPをSierraにあげた。MacOSXはOSのアップデートのような操作もApple IDを要求、すなはち住所などの入力を要求してくる邪悪なOSであり早急に滅ぶべきだ。 PIEとD言語 Ubuntu16.10にあげて以降dmd/ldcともにこのようなエラーが $ LANG=C dmd hel…

日記: 10/11~12あたり

メモリ情報 D言語でプロセス・システムのメモリ使用量をとりたいときどうするんだ、みたいな話があって、自分だとmallinfo(3)とかで import std.stdio; extern(C) { struct mallinfo_ { int arena; /* Non-mmapped space allocated (bytes) */ int ordblks; …

小ネタ: コンパイラの最適化を信じる

以下のコードは同じアセンブラを生成している。 bool mod(size_t i) { return i % 4 == 0; } bool bitOr(size_t i) { return (i & 3) == 0; } % dmd --version DMD64 D Compiler v2.071.0 Copyright (c) 1999-2015 by Digital Mars written by Walter Bright…

spawnProcessのめも

外部プロセス起動のうち、もっともgenericなspawnProcessを読んでメモ書き。読んだのはPosix側の処理だけです。 spawnProcess std.processのspawnProcess関数がそれ。実体はspawnProcessImpl関数。 fork(2)した後をみていく。まずは親側。 といっても大した…

dmdの-profileオプション

dmdにはWindowsもしくはx86系のアーキテクチャの場合は -profile オプションで実行したプログラムのプロファイルを取得することができます。 dmdのmanを見ると、 -profile Profile the runtime performance of the generated code こういう風に確認できます…

Gotanda.pm #8

参加して発表もしてきました。(発表用のスライド、どこかにあげてもらったんだけどどこか忘れた。。資料はよしなに扱ってもらってよいです。 いろいろ発表聴いてたんですがずっとトイレ行きたすぎて全然集中できなかった。。あとLTってまじめな内容だと5分…

case文で範囲を指定する方法

いつも忘れてしまう。 string f(char c) { switch (c) { case 'a': .. case 'z': return "Lower letter!"; case 'A': .. case 'Z': return "Upper letter!"; default: return "Non-alphabetical character!"; } assert(false); } unittest { assert(f('f') =…

DMDでプログラムのカバレッジを測定する方法

-covオプションを使うとできる。 適当なプログラムを作る。 import std.stdio; enum Fruit { Apple, Orange, } int tested1(int val) { return (val % 2 == 1) ? val : (val == 0) ? 42 : -val; } void tested2(Fruit val) { final switch (val) { case Frui…

Operator Overloadingによるインデックスアクセスの実現

D言語では任意のユーザ定義型に対して opIndex/opIndexAssign を定義することでインデックスアクセスを実現することができます。 特に注意すべき点などないのですが、インデックスアクセスにおいて $ は特殊な扱いになっているので opDollar のオーバーロー…

re-implement timeout(1), but written in D

timeout(1)便利だよ、という話をしたらどうやらOSXにはtimeoutがないっぽい?という話になったので(いやあるだろ、多分)勉強も兼ねて、Dでtimeoutを実装しなおすか、となった。 kubo39/expire · GitHub std.concurrencyでreceiveTimeout使おうと思ったけど…

k-NN in D, with parallelism

Comparing k-NN in Rust | Huon on the internet というblog postを見つけたので、Dに移植してみた。 std.parallelism ひさしぶりに使った気がする。 import std.algorithm; import std.array; import std.conv; import std.range; import std.stdio; import…

マルチスレッドなTCPサーバ

こんなのを作ってみました。 kubo39/threadedtcpservergithub.com D言語でマルチスレッドなサーバを作ろうと思うと、 cast() とか cast(shared) とか使わざるをえなかったりしてだいぶ辛いです。 workerスレッドの死活監視もなんとかしたいですね。。

Using DMD to make a 256 byte x86_64 Linux binary

こちらにまとめました. kubo39/tiny-d-demogithub.com これ解決したらgcc -static版も作りたいなあ. [Issue 12268] New: full static linking does not work, unresolved __tls_get_addr - D Programming Language Discussionforum.dlang.org 一応今のままで…

functionとdelegate

D言語にはfunctionとdelegateというよく似た使い方をするものがあります。 functionはただの関数ポインタ(Cとだいたい同じもの)ですが、delegateはclosureに対する参照も保持してるので必要となるメモリ量が2倍になります。 import std.stdio; void func_for…

Raw syscall for D.

DMD 2.067.0 で地味にインラインアセンブラで syscall 命令がサポートされたので、それを軽くラップするようなライブラリを書いてみました。 https://github.com/kubo39/syscall.d コード例: import syscall : syscall, WRITE; void main() { string buf = "…

フィボナッチ

import std.stdio : writeln; import std.conv : to; class Fib(T) if (__traits(isIntegral, T)) { T opIndex(T n) const pure nothrow @trusted @nogc in { assert(n > 0); } body { T y; { T x = 1; foreach (_; 0..n) (((x = n = x) += y) ? y : y) = n;…

Dからxlibを触ってみる(ほんとにさわってみるだけ)

ちょっと興味がでたのでやってみる. 前準備. $ sudo apt-get apt-file $ apt-file update $ apt-file search XInput.h libxi-dev: /usr/include/X11/extensions/XInput.h $ apt-file search Xrandr.h ... libxrandr-dev: /usr/include/X11/extensions/Xrandr…

bounded MPMCの実装

sharedの勉強がてらに、Lock-free Queue実装のひとつである制限付きMulti-Producer Mulit-Consumer QueueをD言語で実装してみた。 https://github.com/kubo39/mpmcqueue このQueueはatomicなread/writeとCAS(当然この操作もatomicだ)のみで操作が行われてい…