305 | | |
| 305 | * C# や .NET Framework がやっていること |
| 306 | * どうしてそういう機能が |
| 307 | * 自前で実装するならどうやれば |
| 308 | * 自前でやる上で気をつける必要がある点 |
| 309 | * Managed |
| 310 | * .Net Framework の管理下にある |
| 311 | * メモリーとか |
| 312 | * GC |
| 313 | * Mark & Sweep 3rd |
| 314 | * Compaction (メモリー移動) |
| 315 | * 一度 GC かかったオブジェクトはしばらく放置 |
| 316 | * C++ での GC |
| 317 | * 通常、参照カウント (shared_ptr, weak_ptr) |
| 318 | * M&S GC lib もあるけど |
| 319 | * 型がはっきりしないので保守的にならざるを |
| 320 | * すべての数値をポインタとみなし Mark |
| 321 | * M&S と参照カウント比較 - 一長一短 |
| 322 | * Throughput トータル性能は M&S のが良さげ |
| 323 | * 自前メモリ管理との混在 |
| 324 | * スコープ短いならスタックに取ればいいのに… |
| 325 | * C# は class は必ずヒープ, structはスタック |
| 326 | * Python とか Go とかの事情… |
| 327 | * 境界チェック |
| 328 | * .NET の配列は厳しい - 常に境界チェックやっとる |
| 329 | * buffer overrun 病死 |
| 330 | * C# にもポインターはあるよ (unmanaged) |
| 331 | * unsafe ブロック内のみ |
| 332 | * class (参照型) はアドレス取れない |
| 333 | * struct (値型) は、メンバーが全部値型であればアドレス取れる |
| 334 | * コンパイルオプション /unsafe が必要。 |
| 335 | * AppDomain - 実行環境の分離、セキュリティ保証 |
| 336 | * 他のアプリの機能を自分のアプリから呼びたい (Word, Excel とか) |
| 337 | * サーバー上に自分のアプリを配置したい (IIS上 (ASP.NET)、SQL Server上に) |
| 338 | * 単一プロセス内で、分離された複数の実行領域 (domain) を提供 |
| 339 | * ドメイン間には壁がある |
| 340 | * ドメイン間の通信 - marshaling |
| 341 | * marshalの命令通りにしか壁を超えられない |
| 342 | * データの受け渡しは一旦シリアライズして相手ドメイン上のメモリーに複製を作らせる、とか。 |
| 343 | * 2種類あるよ |
| 344 | * marshal by ref |
| 345 | * const ポインタみたいなのを渡す |
| 346 | * marshal by value |
| 347 | * シリアライズ - BinarySerializer |
| 348 | * marshal by value でも文字列は特殊扱い。 |
| 349 | * コピーしない |
| 350 | * 参照をそのまま渡してしまう |
| 351 | * コスト |
| 352 | * ライブラリ読み込みはブロックごとに |
| 353 | * GAC は共有される |
| 354 | * C++ でも |
| 355 | * COM とか |
| 356 | * COM ぐらい仰々しいものが必要… |
| 357 | * メタデータ |
| 358 | * DLL にどういう方が含まれるかという情報 |
| 359 | * 外部のどういう DLL を参照しているか |
| 360 | * バージョン |
| 361 | * プログラミング言語をまたげる |
| 362 | * 動的リンクのバージョン管理 |
| 363 | * 動的リンク |
| 364 | * メタデータの作成 |
| 365 | * COM の頃 |
| 366 | * 自分で書いてた |
| 367 | * .tlb/.olb ファイル |
| 368 | * .NET |
| 369 | * メタデータの規格を持ってる |
| 370 | * C# コンパイル時に自動生成 |
| 371 | * C++/CX |
| 372 | * C++ Component Extensions (M$) |
| 373 | * JIT |
| 374 | * .NET Framework の中間言語 (IL) |
| 375 | * セキュリティチェックやりやすい |
| 376 | * 動的リンク時にコード修正の影響を JIT で吸収 |
| 377 | * コンパイラ作る人と CPU 最適化やる人を分けたい |
| 378 | * 中間コードまでは型情報メタデータが残るよ |
| 379 | * メンバの出現順が変わっても中間コードまでは変化しない |
| 380 | * Ngen.exe ... IL をネイティブコード化するツール |
| 381 | * Auto-Ngen ... Ngen が Windows サービスとして動いている |
| 382 | * MDIL ... 部分的にネイティブ化 (コード内容はほぼネイティブだが、型情報等は残している) |
| 383 | * C++ だと |
| 384 | * 動的にやろうと思ったら結局 COM とかになっちゃう |
| 385 | * コンパイル時間短縮で良ければ… setter/getter とか pimpl とかが現実的 |
| 386 | * Portable Class Library |
| 387 | * 実行環境ごとに別の「標準ライブラリ」メタデータを用意 |
| 388 | * C++ |
| 389 | * ターゲット広すぎていっそう大変… |
| 390 | * メタデータ持ってないと… |
| 391 | * #ifdef? |
| 392 | * ジェネリック |
| 393 | * C++ template 的な |
| 394 | * C++ で generics やるとしたら… |
| 395 | * 一炭汎用クラスをつくり |
| 396 | * キャストだけ template で… |
| 397 | * インタフェース制約かけないとメソッドすら呼べない… |
| 398 | * 演算子呼べない |
| 399 | * C++/CX はジェネリック持ってる - 制限キツイ |
| 400 | * イテレータ |
| 401 | * IEnumerable<T> |
| 402 | * C++ でもマクロ書けば yield return 作れちゃうYO! |
| 403 | * 他の言語では generator って呼ばれることが多い |
| 404 | * C++ 1y にも generator 載るかも…。 |
| 405 | * LINQ |
| 406 | * データ処理を言語統合 (SQL 的なもの) |
| 407 | * ラムダ式、匿名型、拡張メソッドとの相性が良い |
| 408 | * dynamic |
| 409 | * 動的型 |
| 410 | * 多重ディスパッチ |
| 411 | * ダックタイピング |
| 412 | * DLR 連携 |
| 413 | * 重い dynamic |
| 414 | * 多くの場合、過剰スペック |
| 415 | * JSON みたいなスキーマレスなデータ読み書き |
| 416 | * async/await |
| 417 | * 非同期処理しんどい |
| 418 | * begin/end地獄 |
| 419 | * event地獄 |
| 420 | * then地獄 (ContinueWith地獄) |
| 421 | * 同期処理みたいな書き方で非同期処理が書ける!! のが await |
| 422 | * イテレータ (generator) と似た仕組み |
| 423 | * C++1y にも await 載るかも… |
| 424 | * Compiler as a Service |
| 425 | * コンパイラの内部データを活用 |
| 426 | * IDE 連携のための機能… |
| 427 | * これのためにコンパイラをフルスクラッチで書きなおしているとか何とか… |
| 428 | * clang はその辺りをゴールの1つに掲げている模様… |