kubo39's blog

ただの雑記です。

D言語

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…

LDCのsanitizeオプション

LDCはバックエンドがLLVMであるので、sanitizerの機能が一部使える。 一応 address, fuzzer, memory, thread とあるけれど、手元のLDC 1.4.0でまともに使うことができたのはThreadSanitizerのみであった。 AddressSanitizer asan/outofbounds.d void main() …

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.…