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

22
前振り 新機能 まとめ D 言語にまだ入っていない新機能 Tomoya Tanjo [email protected] 2014 2 27 D の日 2 Tomoya Tanjo D 言語にまだ入っていない新機能

Upload: tom-tan

Post on 14-Jun-2015

2.472 views

Category:

Technology


4 download

DESCRIPTION

English title: Not yet merged new features for D This talk introduces some proposed (and not yet merged) new features for D Programming language. This presentation is written in Japanese.

TRANSCRIPT

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

前振り 新機能 まとめ

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

Tomoya Tanjo

[email protected]

2014年 2月 27日Dの日 2

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

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

前振り 新機能 まとめ 自己紹介 D 言語

自己紹介

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

Phobos の関数に @safe とか pure とか付けてます

作ったものとかやったこととか

Flycheck の D言語対応

Flycheck-d-unittest

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

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

前振り 新機能 まとめ 自己紹介 D 言語

D!

そんなことよりD言語

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

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

前振り 新機能 まとめ 自己紹介 D 言語

最近のD言語

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

Facebook が D言語をプロダクションに利用

雑誌に紹介記事が載る (日経ソフトウエア 2014年 4月号)

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

D言語が熱い!

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

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

前振り 新機能 まとめ 自己紹介 D 言語

今回のお話

D言語のコンパイラ (DMD),ランタイム (Druntime),標準ライブラリ (Phobos)は Github上で開発されています

機能追加やバグ修正は,Pull Request として管理されている

Pull Request の中から面白そうなものを紹介します

そのまま新機能として入るかもしれない

入らないかもしれない

文法変わるかもしれない

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

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

前振り 新機能 まとめ Nogc PatMatch UTS DDMD

Implement nogc framework

DMD Pull Request #1886

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

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

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

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

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

前振り 新機能 まとめ 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 言語にまだ入っていない新機能

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

前振り 新機能 まとめ 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 言語にまだ入っていない新機能

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

前振り 新機能 まとめ Nogc PatMatch UTS DDMD

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

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

pure外部に見せなければ,pure関数内でローカル変数の書き換えをしてもよい!

@nogcコンパイル時であれば GC呼んでもいい!

少し条件をゆるめて利便性を確保する,という点で D言語っぽい

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

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

前振り 新機能 まとめ 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 -> Intsummation (Leaf a) = asummation (Node l r) = (summation l) + (summation r)

最後の 2行みたいなことを Dでやりたい!

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

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

前振り 新機能 まとめ 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 言語にまだ入っていない新機能

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

前振り 新機能 まとめ 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 言語にまだ入っていない新機能

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

前振り 新機能 まとめ Nogc PatMatch UTS DDMD

Uniform tuple syntax

DIP 32DIP: 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 言語にまだ入っていない新機能

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

前振り 新機能 まとめ 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 言語にまだ入っていない新機能

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

前振り 新機能 まとめ 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 言語にまだ入っていない新機能

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

前振り 新機能 まとめ Nogc PatMatch UTS DDMD

[DDMD] Current patch list

DMD Pull Request #1980

Open されたのが 10ヶ月前

DDMDとは?

D言語で実装された D言語処理系DMDは C++で書かれている

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

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

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

前振り 新機能 まとめ Nogc PatMatch UTS DDMD

[DDMD] Current patch list

DDMDのマイルストーン

C++ を D にコンバートするプログラムを作成し,DMDのソースを Dに変換できるようにする (!)

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

. . .

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

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

前振り 新機能 まとめ Nogc PatMatch UTS DDMD

[DDMD] Current patch list

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

Pull Requestの数は 230以上

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

. . .

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

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

前振り 新機能 まとめ Nogc PatMatch UTS DDMD

[DDMD] Current patch list

git-head が変更なしに D に変換できる! (らしい)

コンバートツール: magicport2(https://github.com/yebblies/magicport2)

試したかったけど時間が取れず…

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

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

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

前振り 新機能 まとめ

まとめ

新機能とか眺めてるだけで楽しい!

触れられなかったものstd.lexervirtual キーワード

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

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

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

前振り 新機能 まとめ

おしまい

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

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

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

前振り 新機能 まとめ

関連リンク集

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 言語にまだ入っていない新機能