前振り 新機能 まとめ

D 言語にまだ入っていない新機能
Tomoya Tanjo
ttanjo@gmail.com

2014 年 2 月 27 日
D の日 2

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

自己紹介 D 言語

自己紹介

Twitter とか Github とかで活動中
(Twitter: tm tn, Github: tom-tan)

Phobos の関数に @safe とか pure とか付けてます
作ったものとかやったこととか

Flycheck の D 言語対応
Flycheck-d-unittest

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

自己紹介 D 言語

D!

そんなことより D 言語

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

自己紹介 D 言語

最近の D 言語

The D Programming Language (TDPL) 発売
日本語版も出ました!

Facebook が D 言語をプロダクションに利用
雑誌に紹介記事が載る (日経ソフトウエア 2014 年 4 月号)

DMD 2.065 リリース! (4 日前)

D 言語が熱い!

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

自己紹介 D 言語

今回のお話

D 言語のコンパイラ (DMD),ランタイム (Druntime),標準
ライブラリ (Phobos) は Github 上で開発されています
機能追加やバグ修正は,Pull Request として管理されている

Pull Request の中から面白そうなものを紹介します
そのまま新機能として入るかもしれない
入らないかもしれない
文法変わるかもしれない

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

Implement nogc framework

DMD Pull Request #1886
D 言語は静的型付けのコンパイル型の言語
メモリ管理には GC を採用
やろうと思えば malloc/free で手動管理もできる

ゲームとかでも使われてたりする
GC を動かしたくない
配列の使用や new 式等を使うと GC が動いてしまう

GC を動かさないようにコードを書くサポートが欲しい

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

Implement nogc framework
@nogc 属性の追加
例

@nogc auto foo() {
// new 式が GC.malloc を呼ぶのでエラー!
auto arr = new int[4];
}
GC を呼ぶ関数かどうかをコンパイル時に検出してくれる!
でも…
エラーになるべきじゃない! by yebblies

int main()
{
return [1, 2, 3][1];
}
Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

Implement nogc framework

更に…
これも動くべき! by 9rnsr

enum n = () { auto a = [1,2,3]; return a[0] + a[1] + a[2]; }();
つまりどういうことなの?

CTFE される関数に関しては GC 呼んでもいい!
CTFE: コンパイル時関数実行

現状
最初は -nogc スイッチで検出するかどうかを切り替えようと
してた
今はデフォルトで有効にする方向っぽい

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

おまけ: その他の属性との対比

@trusted (メモリ安全性)
外部に見せなければ,@trusted 関数内でシステム関数を使っ
てもよい!
システム関数: 引数によってはメモリ破壊の可能性のある関数

pure
外部に見せなければ,pure 関数内でローカル変数の書き換え
をしてもよい!
@nogc
コンパイル時であれば GC 呼んでもいい!
少し条件をゆるめて利便性を確保する,という点で D 言語っぽい

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

Functional pattern matching for object references

Phobos Pull Request #1266
Bugzilla #9959
要約: 関数型言語がやってるようなパターンマッチが欲しい
二分木の定義と走査 (Haskell の例)

data Tree = Leaf Int | Node Tree Tree
summation::Tree -> Int
summation (Leaf a) = a
summation (Node l r) = (summation l) + (summation r)
最後の 2 行みたいなことを D でやりたい!

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

Functional pattern matching for object references
多態使えば一応できる
二分木の定義と走査 (D での例)

class Tree{}
class Leaf: Tree { int a; }
class Node: Tree { Tree l, r; }
auto summation(Tree t)
{
if (auto leaf = cast(Leaf) t) // キャスト 1 回目
return leaf.a;
if (auto node = cast(Node) t) // キャスト 2 回目
return summation(node.l) + summation(node.r)
assert(false);
}
毎回キャストしてるのがイマイチ
Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

Functional pattern matching for object references
std.algorithm に castSwitch 関数を追加しよう!
二分木の定義と走査 (castSwitch)

auto summation(Tree t)
{
return t.castSwitch!(
(Leaf leaf) => leaf.a,
(Node node) => summation(node.l) + summation(node.r),
(Object ) => assert(false),
)();
}
現状
ソースにいくつか突っ込みが入っているものの,入れること
に反対の人はいない様子
そのうち入るかも
Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

Uniform tuple syntax
DIP 32
DIP: D Improvement Proposals

パターンマッチっぽい物つながり

castSwitch がライブラリ関数だったのに対して,こちらは言
語機能の拡張の提案
Tuple?
色々入れられる無名構造体みたいなもの
現在は std.typecons 内で定義されている型

Tuple の使用例
import std.typecons;
auto t = tuple(1, “hi”); // int と string を持つ構造体
assert(t[0] == 1); // インデックスでアクセスできる

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

Uniform tuple syntax

DIP 32: std.typecons で定義されている Tuple 構造体を言語
機能に入れよう!
組み込みタプルの使用例

auto t = {1, “hi”}; // int と string を持つ構造体
assert(t[0] == 1); // インデックスでアクセスできる
std.typecons.Tuple との違いは?
unpacking まで提案されていること

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

Uniform tuple syntax
組み込みタプルの使用例 その 2

auto {x, y} = {1, “hi”}; // int と string を同時に宣言 & 初期化!
switch (tup) { // パターンマッチ!
case {1, 2}:
case {$, 2}: // $はワイルドカード
case {1, x}: // x は tup の 2 番目の要素で初期化される
default:
}
std.typecons.Tuple の unpacking 関数 (tie) には問題があった
のか,現在は std.typecons 内には見当たらない
現状
最近は ML 上の話題にはなっていない
構造体の初期化と構文がかぶり,破壊的更新が起きるので導
入に慎重になっている?
個人的には期待
Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

[DDMD] Current patch list

DMD Pull Request #1980
Open されたのが 10ヶ月前
DDMD とは?
D 言語で実装された D 言語処理系
DMD は C++で書かれている

以前にも DMD を D に移植するプロジェクトがあったが頓挫
している

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

[DDMD] Current patch list

DDMD のマイルストーン
C++ を D にコンバートするプログラムを作成し,DMD の
ソースを D に変換できるようにする (!)
DMD の Makefile に,DMD のソースから DDMD を作成す
るターゲットを追加する
...

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

[DDMD] Current patch list

現状

C++ を D にコンバートするプログラムを作成し,DMD の
ソースを D に変換できるようにする (3 日ほど前に完了)
Pull Request の数は 230 以上

DMD の Makefile に,DMD のソースから DDMD を作成す
るターゲットを追加する
...

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

Nogc PatMatch UTS DDMD

[DDMD] Current patch list

git-head が変更なしに D に変換できる! (らしい)
コンバートツール: magicport2
(https://github.com/yebblies/magicport2)
試したかったけど時間が取れず…

近い将来 DDMD が標準になるかも

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

まとめ

新機能とか眺めてるだけで楽しい!
触れられなかったもの
std.lexer
virtual キーワード

意外と破壊的更新が少ない

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

おしまい

ありがとうございました!

Tomoya Tanjo

D 言語にまだ入っていない新機能
前振り 新機能 まとめ

関連リンク集
D 言語公式 (http://dlang.org/)
日本語版 (http://www.kmonos.net/alang/d/)

Github (https://github.com/D-Programming-Language)
D Wiki
(http://wiki.dlang.org/The D Programming Language)
d-manual (https://github.com/k3kaimu/d-manual)
D 言語友の会 (http://dusers.dip.jp/)
オンラインコンパイラサービス
DPaste (http://dpaste.dzfl.pl/)
Wandbox (http://melpon.org/wandbox/)
ProcGarden (http://sc.yutopp.net/)
D REPL (http://drepl.dawg.eu/)

Tomoya Tanjo

D 言語にまだ入っていない新機能

D言語にまだ入っていない新機能 (Dの日#2)

  • 1.
    前振り 新機能 まとめ D言語にまだ入っていない新機能 Tomoya Tanjo ttanjo@gmail.com 2014 年 2 月 27 日 D の日 2 Tomoya Tanjo D 言語にまだ入っていない新機能
  • 2.
    前振り 新機能 まとめ 自己紹介D 言語 自己紹介 Twitter とか Github とかで活動中 (Twitter: tm tn, Github: tom-tan) Phobos の関数に @safe とか pure とか付けてます 作ったものとかやったこととか Flycheck の D 言語対応 Flycheck-d-unittest Tomoya Tanjo D 言語にまだ入っていない新機能
  • 3.
    前振り 新機能 まとめ 自己紹介D 言語 D! そんなことより D 言語 Tomoya Tanjo D 言語にまだ入っていない新機能
  • 4.
    前振り 新機能 まとめ 自己紹介D 言語 最近の D 言語 The D Programming Language (TDPL) 発売 日本語版も出ました! Facebook が D 言語をプロダクションに利用 雑誌に紹介記事が載る (日経ソフトウエア 2014 年 4 月号) DMD 2.065 リリース! (4 日前) D 言語が熱い! Tomoya Tanjo D 言語にまだ入っていない新機能
  • 5.
    前振り 新機能 まとめ 自己紹介D 言語 今回のお話 D 言語のコンパイラ (DMD),ランタイム (Druntime),標準 ライブラリ (Phobos) は Github 上で開発されています 機能追加やバグ修正は,Pull Request として管理されている Pull Request の中から面白そうなものを紹介します そのまま新機能として入るかもしれない 入らないかもしれない 文法変わるかもしれない Tomoya Tanjo D 言語にまだ入っていない新機能
  • 6.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD Implement nogc framework DMD Pull Request #1886 D 言語は静的型付けのコンパイル型の言語 メモリ管理には GC を採用 やろうと思えば malloc/free で手動管理もできる ゲームとかでも使われてたりする GC を動かしたくない 配列の使用や new 式等を使うと GC が動いてしまう GC を動かさないようにコードを書くサポートが欲しい Tomoya Tanjo D 言語にまだ入っていない新機能
  • 7.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD Implement nogc framework @nogc 属性の追加 例 @nogc auto foo() { // new 式が GC.malloc を呼ぶのでエラー! auto arr = new int[4]; } GC を呼ぶ関数かどうかをコンパイル時に検出してくれる! でも… エラーになるべきじゃない! by yebblies int main() { return [1, 2, 3][1]; } Tomoya Tanjo D 言語にまだ入っていない新機能
  • 8.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD Implement nogc framework 更に… これも動くべき! by 9rnsr enum n = () { auto a = [1,2,3]; return a[0] + a[1] + a[2]; }(); つまりどういうことなの? CTFE される関数に関しては GC 呼んでもいい! CTFE: コンパイル時関数実行 現状 最初は -nogc スイッチで検出するかどうかを切り替えようと してた 今はデフォルトで有効にする方向っぽい Tomoya Tanjo D 言語にまだ入っていない新機能
  • 9.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD おまけ: その他の属性との対比 @trusted (メモリ安全性) 外部に見せなければ,@trusted 関数内でシステム関数を使っ てもよい! システム関数: 引数によってはメモリ破壊の可能性のある関数 pure 外部に見せなければ,pure 関数内でローカル変数の書き換え をしてもよい! @nogc コンパイル時であれば GC 呼んでもいい! 少し条件をゆるめて利便性を確保する,という点で D 言語っぽい Tomoya Tanjo D 言語にまだ入っていない新機能
  • 10.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD Functional pattern matching for object references Phobos Pull Request #1266 Bugzilla #9959 要約: 関数型言語がやってるようなパターンマッチが欲しい 二分木の定義と走査 (Haskell の例) data Tree = Leaf Int | Node Tree Tree summation::Tree -> Int summation (Leaf a) = a summation (Node l r) = (summation l) + (summation r) 最後の 2 行みたいなことを D でやりたい! Tomoya Tanjo D 言語にまだ入っていない新機能
  • 11.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD Functional pattern matching for object references 多態使えば一応できる 二分木の定義と走査 (D での例) class Tree{} class Leaf: Tree { int a; } class Node: Tree { Tree l, r; } auto summation(Tree t) { if (auto leaf = cast(Leaf) t) // キャスト 1 回目 return leaf.a; if (auto node = cast(Node) t) // キャスト 2 回目 return summation(node.l) + summation(node.r) assert(false); } 毎回キャストしてるのがイマイチ Tomoya Tanjo D 言語にまだ入っていない新機能
  • 12.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD Functional pattern matching for object references std.algorithm に castSwitch 関数を追加しよう! 二分木の定義と走査 (castSwitch) auto summation(Tree t) { return t.castSwitch!( (Leaf leaf) => leaf.a, (Node node) => summation(node.l) + summation(node.r), (Object ) => assert(false), )(); } 現状 ソースにいくつか突っ込みが入っているものの,入れること に反対の人はいない様子 そのうち入るかも Tomoya Tanjo D 言語にまだ入っていない新機能
  • 13.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD Uniform tuple syntax DIP 32 DIP: D Improvement Proposals パターンマッチっぽい物つながり castSwitch がライブラリ関数だったのに対して,こちらは言 語機能の拡張の提案 Tuple? 色々入れられる無名構造体みたいなもの 現在は std.typecons 内で定義されている型 Tuple の使用例 import std.typecons; auto t = tuple(1, “hi”); // int と string を持つ構造体 assert(t[0] == 1); // インデックスでアクセスできる Tomoya Tanjo D 言語にまだ入っていない新機能
  • 14.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD Uniform tuple syntax DIP 32: std.typecons で定義されている Tuple 構造体を言語 機能に入れよう! 組み込みタプルの使用例 auto t = {1, “hi”}; // int と string を持つ構造体 assert(t[0] == 1); // インデックスでアクセスできる std.typecons.Tuple との違いは? unpacking まで提案されていること Tomoya Tanjo D 言語にまだ入っていない新機能
  • 15.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD Uniform tuple syntax 組み込みタプルの使用例 その 2 auto {x, y} = {1, “hi”}; // int と string を同時に宣言 & 初期化! switch (tup) { // パターンマッチ! case {1, 2}: case {$, 2}: // $はワイルドカード case {1, x}: // x は tup の 2 番目の要素で初期化される default: } std.typecons.Tuple の unpacking 関数 (tie) には問題があった のか,現在は std.typecons 内には見当たらない 現状 最近は ML 上の話題にはなっていない 構造体の初期化と構文がかぶり,破壊的更新が起きるので導 入に慎重になっている? 個人的には期待 Tomoya Tanjo D 言語にまだ入っていない新機能
  • 16.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD [DDMD] Current patch list DMD Pull Request #1980 Open されたのが 10ヶ月前 DDMD とは? D 言語で実装された D 言語処理系 DMD は C++で書かれている 以前にも DMD を D に移植するプロジェクトがあったが頓挫 している Tomoya Tanjo D 言語にまだ入っていない新機能
  • 17.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD [DDMD] Current patch list DDMD のマイルストーン C++ を D にコンバートするプログラムを作成し,DMD の ソースを D に変換できるようにする (!) DMD の Makefile に,DMD のソースから DDMD を作成す るターゲットを追加する ... Tomoya Tanjo D 言語にまだ入っていない新機能
  • 18.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD [DDMD] Current patch list 現状 C++ を D にコンバートするプログラムを作成し,DMD の ソースを D に変換できるようにする (3 日ほど前に完了) Pull Request の数は 230 以上 DMD の Makefile に,DMD のソースから DDMD を作成す るターゲットを追加する ... Tomoya Tanjo D 言語にまだ入っていない新機能
  • 19.
    前振り 新機能 まとめ NogcPatMatch UTS DDMD [DDMD] Current patch list git-head が変更なしに D に変換できる! (らしい) コンバートツール: magicport2 (https://github.com/yebblies/magicport2) 試したかったけど時間が取れず… 近い将来 DDMD が標準になるかも Tomoya Tanjo D 言語にまだ入っていない新機能
  • 20.
    前振り 新機能 まとめ まとめ 新機能とか眺めてるだけで楽しい! 触れられなかったもの std.lexer virtualキーワード 意外と破壊的更新が少ない Tomoya Tanjo D 言語にまだ入っていない新機能
  • 21.
  • 22.
    前振り 新機能 まとめ 関連リンク集 D言語公式 (http://dlang.org/) 日本語版 (http://www.kmonos.net/alang/d/) Github (https://github.com/D-Programming-Language) D Wiki (http://wiki.dlang.org/The D Programming Language) d-manual (https://github.com/k3kaimu/d-manual) D 言語友の会 (http://dusers.dip.jp/) オンラインコンパイラサービス DPaste (http://dpaste.dzfl.pl/) Wandbox (http://melpon.org/wandbox/) ProcGarden (http://sc.yutopp.net/) D REPL (http://drepl.dawg.eu/) Tomoya Tanjo D 言語にまだ入っていない新機能