kubo39's blog

ただの雑記です。

D言語

dfmtのnightly binaryを作成するレポジトリを作った

レポジトリは これ 作成手順を残しておく。 とりあえずtravis gemの力を借りる。ここで二段階認証を行うのだが、やけに失敗した。 このタイミングでapi_keyが作られている。 $ gem install travis $ travis setup releases -r kubo39/dfmt-bin あとはtagつき…

LDCでのvolatileのはなし

LDCはpragmaを利用してLLVMのコード生成時にvolatileLoad/volatileStoreのハンドリングをしてる。 ここではvolatileLoadの呼び出し/コード生成までみていく。 core.bitopモジュールは、LDCコンパイラを使うときは特に指定しなくても pragma(LDC_intrinsic, “…

D言語をプロダクションに使うには、ということを考える

D言語のコードを社のレポジトリにpushした。(まだmasterにmergeされていないので、先走り気味かもしれない) D言語を使った理由は使いたかったというのもあるが、今回のケースでは 使う箇所が部分的(言語はわりとなんでもいいところ) 標準でjsonを扱うための…

D言語のfizzbuzz

FizzBuzzでD言語っぽいコードってどんな感じだろう、みたいな話があったので。 ふつうに実行時に書くならこんな感じだろうか。 import std.algorithm; import std.conv : to; import std.range; import std.stdio; void main() { 1.iota(16) .map!(a => (! (…

Dconf 2017

1日目 Pointers Gone Wild: Memory Safety and D Dの作者ことうぉるたん。コンパイラの恩恵を受けるために生ポインタを使うよりref使おうとか、return refやscope refとか追加した理由とか。スライドにD言語くんがいっぱい登場していた。 D as a Better C 基…

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使おうと思ったけど…