2011-05-06
プログラミング初心者にオススメのD言語本
プログラミング初心者がD言語を学ぶのに適した本を,俺が実際に読んだことのあるものの中から選んでみました.
1冊目
1冊目はなんでもいいと思うのでとりあえず定番としてTDPLを挙げておきます.
- 作者: Andrei Alexandrescu
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2010/06/02
- メディア: ペーパーバック
- 購入: 3人 クリック: 212回
- この商品を含むブログ (5件) を見る
これで基本的なD言語の文法が学べるはずです.この手の入門書は「課題」がつきものですが,これには全くありません.まぁ載ってるコードを書いて試せばいいでしょう.
1冊目読了の時点では,以下のプログラムのCTFEバージョンを実装できるようになっていればいいと思います.余裕があれば実際に実装してみてください.
2冊目
ある程度コードが書けるようになったら次はTDPLがいいでしょう.
- 作者: Andrei Alexandrescu
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2010/06/02
- メディア: ペーパーバック
- 購入: 3人 クリック: 212回
- この商品を含むブログ (5件) を見る
この本はD言語を紹介している本ですが,それ以外にも以下のような特徴があります.
- Concurrencyに関して,今までどんな風にパラダイムが推移してきたかの説明
- 今後の仕様となるサンプルコードが豊富
特に並行処理に関しては今後どんなプログラミング言語でもほぼかならず必須となる要素なので,D言語での扱いは早めにマスターしておいたほうがいいでしょう.
しかしながら,すべて読むと時間がかかってしまいます.そこで,最初は以下の章だけ読むことお勧めします.
- 1章「“D”iving In」
- 5章「Data and Functions. Functional Style」
- 13章「Concurrency」
Rangeについてはソースコードも参考になります.特にstd.range/std.algorithm/std.variantあたりは重要性も高いので読んでみてもいいと思います.
上記のトピックを読んだ時点では,作れるプログラムは特に増えないかもしれません.しかし,同じことでも効率よく,あるいは楽に,あるいはデバッグしやすく書けるようになっているはずです.
3冊目
3冊目は『TDPL』か『The D Programming Language』のどちらかを勧めます。
- 作者: Andrei Alexandrescu
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2010/06/02
- メディア: ペーパーバック
- 購入: 3人 クリック: 212回
- この商品を含むブログ (5件) を見る
or
- 作者: Andrei Alexandrescu
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2010/06/02
- メディア: ペーパーバック
- 購入: 3人 クリック: 212回
- この商品を含むブログ (5件) を見る
TDPLはD言語という言語を網羅的に説明してありますが,具体例にやや乏しいのが欠点です.The D Programming Languageは仕様例を大量に集めたものですが,Phobosなどの実コードの解説はあまりありません.この2冊(というか1冊)をKindleで買うとあまりの手軽さにドン引きすること間違いないため,最初は紙で読むことをお勧めします.どちらがいいか迷ったときは両方買えばいいと思います.
TDPLを読破した時点で,D言語の学習は終了したと考えていいでしょう.
その後の展開
その後はプログラミング作法やアルゴリズム,あるいはNoSQLやDMDScriptなどの関連した他の言語について学ぶことになるでしょう.その際,D言語と外の世界との間を埋めるものとしてはTDPLは適していないと思います.
- 作者: Andrei Alexandrescu
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2010/06/02
- メディア: ペーパーバック
- 購入: 3人 クリック: 212回
- この商品を含むブログ (5件) を見る
この本を「間を埋めないもの」として紹介したのは,ここまで来るとソースを読んだ方が手っ取り早いからです.
Phobosは標準ライブラリであるため,Rangeやtemplateを使ったコードがふんだんに使われています.D言語で他のプログラマとコミュニケーションをするには,D言語を使うのが一番効率が良いです.従って,Andrei先生のコードは非常に読みにくいと評判ですが,他の俺やSeanやDavidなどが書いたコードは読みやすいため,Phobos / druntime / その他公開されているD言語向けのライブラリを読んでおくのは重要です.
データベースはこれひとつで何冊も本が出るほどの大きなトピックです.しかし,D言語からデータベースにアクセスする方法については今現在ほとんどないため,GSoC 2011の成果次第です.俺が突っ込みを入れたのですがSQL専用になりそうなので,他のデータベース群にはそれなりのモジュールを設計しないと駄目になりそうです.
テストについての解説は重要です.テストの大きな目的の一つは,開発中に一度潰したバグを再現してしまうといったような「後戻り」を防ぐことです.特にD言語はtrunkの更新が活発なので,その日に書いたコードを無駄にしないためも,テスト手法については早めにマスターしておくべきでしょう.TDPLでD言語における単体テストの書き方を学んだら,Phobosで実際どのように皆が書いてるのか知るのも非常に勉強になります.
さていくつか書籍を紹介しましたが,もちろん書籍以外からも学ぶことは大いにあります.また,学べば学ぶほど世界が広くなってくるので,「これで十分」という段階にはなかなか達しません.しかし「良いtrunkの破壊的変更に喜んで追従するエンジニア」ならば手の届くところにあります.私もまだまだ道半ばですが,共に「良いtrunkの破壊的変更に喜んで追従するエンジニア」を目指しましょう.
参考
オリジナルの記事はこちら プログラミング初心者にオススメのPerl本
2011-04-12
D言語会議 01
http://partake.in/events/feac18f7-0b78-4129-92c5-ad0cce8feafb
やりました!他の人もブログを書かれているので,探せば見つかると思います(時間があったら上のサイトにコメントとしてまとめておきます.
もともと勉強会ではないと明言していたので,まぁ最初に今のD言語の現状をアジェンダ的に話した以外は,その場のノリに任せました.このイベントを企画した当初はGSoCの話はまだ全然だったんだけど,その後決まったGSoCのプランがなんだかんだで今のD言語の弱点に関するものが多かったので,それをベースに話しました.
とりあえず適当なまとめ
- gdbが上手く動かないのは,DWARFとDでの定義が被っているかららしい(shinhさん調べ).とりあえずてきとうにずらせば解決する様子
- Leandroが書いてたcdgcがfork()を使っていて,なんでなんかなぁと前疑問に思って放置していた.今回他にソースを読んだ人も「fork()である必要ない」と言っていたので,まぁなんか色々怪しい.
- Davidのは別に世代別にしているわけじゃなくて,単にデカいのを舐めないようにしているだけ
- std.concurrencyにreply機能が欲しいという意見が
- Erlangと同等を目指すのであれば必要そうだけど,Seanはどこまでやる気があるんだろうなぁという
- etc.c.curlがあるので,ネットワークアクセスそのものは改善される予定
- サーバとか非同期IOとかは,GSoCの課題
- Weak Symbolを使ってないらしく,DLLとexeでシンボルが分かれてしまう現象が起きてるらしい
- リンカの話し書いてるのにおかしいだろ,と誰か突っ込んでた
- kinabaさんのtoHash / getHash問題は今でもtwitterで盛り上がっている
- haraさんがパッチをなげてました http://d.puremagic.com/issues/show_bug.cgi?id=5835
- 後なんか例外のthrowのパースエラーに関してもkinabaさんとりりかるろじかるさんとku6さんが追ってた気がする
- SHOOは「シュー」ではなく「ショー」
- CTFEチームも出来てて,結局3 - 4グループに分かれていた気がする
- haraさんのScopedについての比較でC++0xのコード見てたけど,各コンストラクタとか多過ぎてあばば
- D言語の仕様としてはrelocatableなのと相まってCopy GCでおかしくなるようなことはない仕様になっている
- 実装は別なので,誰かとりあえず実装してみると改善がすすむやも?という感じか
- イベントとかデリゲートとかにスタックトレース的なもの(誰が作ったか)が欲しいという話
- こういうのってTLSとか上手く使ってなんとかならないだろうのか
- そういえばユーザ定義アノテーションどうなったの? -> 誰も分からない
- RangeってBlocking前提なのに非同期とかどうすんべ?Andrei先生の妄想爆発疑惑
- UUIDをPhobos向けに書こうとしたけど,よくよく考えると俺が使う予定ないし,randomまで書いてオワタ
後なんか思い出したら追記する.まぁこんなてきとうな会で良ければまた開いてみたい.2次会, 3次会まであったものの全員とは話せなかったので,次回はもうちょい手広くやりたい.
正直こんなに人が集まるとは思ってなかったですよ!
2011-03-21
DMD as a Library
ddmdって正直いらないんじゃないかと思ってたけど,インタラクティブ環境をD言語で提供したいと思ったらこれしかないんじゃないかと思えてきた.D言語にevalを入れるのはかなり厳しいし,GSoCでパーサ&レキサの案が出てるけどライブラリとしてどこまで提供するのか分からん.
dmdはC++なのでこれからAPIを提供されても困るけど,ddmdならコンテキストを持たせればなんとかなるかもしれない気がしている.勿論色々足りない機能とかあるんだけど,CTFEな部分をもう少し抽象化して強化出来ればAPI経由で操作出来る可能性が!
ということで,当分先になるけど色々考えて置く.
2010-12-30
職場の自席に置いとくと,スゲーできそうって思われるかもしれない本(D言語編)
- 作者: Andrei Alexandrescu
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2010/06/02
- メディア: ペーパーバック
- 購入: 3人 クリック: 212回
- この商品を含むブログ (5件) を見る
D言語の本はこれしかありません ;-(
AndroidアプリUIデザイン&プログラミング アイデア固めからユーザーフィードバック分析まで
- 作者: 渡嘉敷守
- 出版社/メーカー: 日経BP社
- 発売日: 2010/12/02
- メディア: 単行本
- 購入: 9人 クリック: 539回
- この商品を含むブログ (25件) を見る
見た目D言語の本みたく見えるので,見栄がはれます
C++ 1xについて
C++ Advent Calendar jp 2010の24日目の記事です.世の中ではC++ 0xが旬のようですが,そんな古いのは置いておいてC++ 1xの話をしましょう.C++ 1xはついに破壊的変更が来ます.
include to import
includeは単なる置換でコンパイルが遅い原因にもなっていました.C++ 1xからはシンボルをインポートするだけのimportが追加され,またコンパイル処理の明確な分離によって,爆速コンパイルになっています.
struct / classの最後の;の削除
struct S { // ... } // ;がいらない!
これに苦しめられた人は結構いるのではないでしょうか!
Angel Bracketの削除
C++ 0xで>>が出来るようになったとはいえ,やっぱりこの辺はコンパイラに優しくないわけです.なので,C++ 1xでは!()を使ってテンプレートパラメータを指定するようにします.
vector!(string) v;
auto
C++ 0xでautoが入ったものの,constとかと合わせるときはconst autoとかになって冗長でした.C++ 1xでは
const v = 10; // v is int
とより書きやすくなってます.
配列,連想配列,foreach
この辺ってよく使われるんだから,組み込んだ方がいいよね,ということで組み込まれてます.後Range-based for文はRangeサポートも考慮にいれてforeachに名前が変わりました.
foreach (v : [1, 2, 3]) { // do something }
型推論も効いて使いやすいですね.
static *
static ifやstatic assert(C++ 0xではstatic_assert)などコンパイルタイムに色々やる人が増えたので,組み込みで使いやすくなりました.
alias
typedefがあまり使い勝手がよくないので,template周りでより柔軟に使えるaliasが入りました.template parameterでも使うことができて,parameterに様々なシンボルを受け取れるようになります.
constexpr
C++ 1xでは,コンパイル時に値が決まるものを利用した関数はそもそもコンパイル時に評価されるため,これは廃止されました.
thread_local
C++ 1xではデフォルトで変数はTLSに保存されます.なので,thread_localの変わりにsharedという共有変数を表すキーワードが追加されました.
まとめ
その他にもここにあるような機能はちゃんとサポートされています.で,肝心の処理系はこのページからダウンロードできます.あ,言い忘れましたがC++ 1xは別名D言語と呼ばれているので,C++ 1xが面倒な人はD言語と読んだ方が呼びやすいかもしれません.
Enjoy C++ 1x!
2010-12-24
D Programming Advent Calender 2010 - 24日目: 使ってはいけない標準モジュール
D Programming Advent Calender 2010の24日目の記事です.ついにここまで来ました.今回の内容はPerlの方であったこの記事のD言語版です.
D言語は言語仕様が固定されることはありますが「標準ライブラリはそうではない」とAndreiが述べています.これはつまりあるメジャーバージョンの言語仕様が固まっても標準ライブラリに破壊的変更が発生する可能性があるということです(D2は今もろにそんな感じです).
ということで,今現在D2のPhobosに関して削除されるモジュールと,使わない方がいいモジュール,破壊的変更がくるであろうモジュールについてまとめて置きたいと思います.D言語にはdeprecatedという便利な属性があるので,使う時にはコンパイラオプションをつけないとコンパイル出来ない関数などもあります.また,削除される予定のモジュールにはpragmaを使ってコンパイル時にメッセージが表示されます.
モジュールのリストは以下から見れます(std.outofmemoryとかはもう消えてるはずなんだけど,なぜリストにあるのか…).
http://www.digitalmars.com/d/2.0/phobos/phobos.html
いずれ削除されるモジュール
- std.atomics
druntimeのcore.atomicを使って下さい.std.atomicsはCASがintにしか対応してなかったりとかなり機能不足です.
- std.bind
レキシカルクロージャが言語としてサポートされたので,使い道がありません.後多分バグっているので,そもそも使えません:(
- std.boxer
std.variantに取って代わられました.
- std.contracts
std.exceptionを使って下さい.std.contractsは名前がおかしい,という議論の後std.exceptionにリネームされたので,中身は一緒です.
- std.date / std.gregorian / std.perf
次のリリースで入る予定のstd.datetimeに全て統合されます.
- std.demangle
druntimeにあるcore.demangleを使って下さい(というか今日core.demangleに委譲するコミットがありました).
- std.intrinsic
消すという話は出てないんですが,core.bitopに取って代わられると思います(なんでまだメンテされているのか…).
- std.iterator
Donが消したはずなのになんでまだリストにいるのかわかりませんが,元々D言語の配列とかはiterableであり,PhobosはRangeコンセプトなので使う事はありません.
- std.openrj
はるか昔とりあえず入れとけ的なノリでReviewもなく入ったモジュールで,使ってる人見た事ありません.
- changeset 2240で削除されたので,2.052からは存在しません.
- std.stdint
druntimeのcore.stdc.stdintを使って下さい.ですが元々変数のサイズが決まっているD言語で使っている人見た事ありません.
- std.c.*
druntimeのcore.stdcを使って下さい.環境依存のはcore.sys以下を使って下さい.
使わない方がいいモジュール
- std.metastrings
今はもう必要ないんじゃないかと思います.
- std.regexp
charしか対応してません.std.regexはRange対応でchar, wchar, dcharにも対応しているのでなるべくこっちを使いましょう.
破壊的変更が来るモジュール
- std.json
そもそもバグありです.Robertがstd.variantのパッチ付きでまともな実装を出しているので,レビューが終わればリプレースされます.
- std.md5
デザインがCの移植でダサダサです.OutputRangeを使ったstd.cryptみたいなモジュールで置き換えられると思います(今考えているところですが).
- std.process
StevenとLarsの二人が新しいstd.processを書いています.いずれリプレースされます.
- std.cstream and std.stream
Andreiの一言でstd.streamが消える予定でしたが,さすがに標準ライブラリのIOのほとんどの機能が消えるのはやばいということで,代替案を皆が考えているところです.
- std.socket and std.socketstream
俺担当です.IPv4しか使えなくてかつデザインが微妙なのでリプレース予定です.こんなに遅れてすいません.
- std.typetuple
なんか名前があれ,的な感じでモジュール名とかTypeTupleの名前が変わる可能性があります.この辺はrsinfu先生とか任せ.
- std.xml
遅い?ということでリプレース予定です.2, 3個代替実装があるのですが,個人的にはMichelのXOMベースの実装が気になってたりします(他のはよくも悪くも普通のXMLモジュールなので).
結構なモジュールに変更が来ますね.昔の人が少ない時の影響か,実装やデザインがあれなのに入ってしまったモジュールがあったりして,この辺のブラッシュアップもPhobosの課題の一つだったりします.ということで,俺がリプレースしてやるぜ!って人はモジュールを書いてMLで提案とかしてみたらコミッタになれるかもしれませんよ!!
