kubo39's blog

ただの雑記です。

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

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)した後をみていく。まずは親側。 といっても大した…