C++:ポストモダンなシステムプログラミング言語

3691 ワード

C++は古典的なプログラミング言語として、1980年代から今までシステム開発と高性能コンピューティングの分野で広く応用されてきた.ここ数年来、様々なプログラミング言語とモデルの興隆に伴い、C++の姿はだんだん人々の視野から薄れてきた.しかし、まだ進歩している言語として、C++はここ数年急速に発展し、現代言語の特性を備えており、既存のものや進行中の新しい開拓もたくさんあります.
クラシックなC++
C言語のスーパーセットとして、一方で、C++はCのシステムプログラミングの利点を統合し、メモリの各bitを正確に制御することができる.一方,豊富な抽象メカニズムとプログラミングパターンを提供し,オブジェクト向け,汎用プログラミング,関数プログラミングなどのスタイルを導入した.これにより,C++はCに匹敵するランタイム性能を持つ一方,C言語による領域モデリングの難しさも簡略化される.しかし、C++の全体的な設計は多種の風格を結合しているため、ほとんどいくつかの小さな言語をネストした巨大なシステムに相当し、これもC++の全体的な学びやすく、使いやすい性に少し悪い.同時に、標準ライブラリの更新が需要に追いつかないため、Concurrency/Networkなどのアプリケーション層のソフトウェア設計においてJavaなどの後者に取って代わられつつある.また、各C++メーカーはコンパイラの実現にISO規格を完全に参考していないため、プラットフォーム間での移植性と互換性の問題も多く発生している.
現代C++
C++はここ数年、いくつかの探索と脱皮を行い、言語全体を現代化の特色を備えさせた.
リソース管理
RAII(ResourceAquiration is Initialization)はC++の特色の一つとして、C++のプログラムに広く応用されている.RAIIは、スタックオブジェクトのライフサイクルによってリソース(スタックメモリ、ファイルハンドル、ネットワーク接続など)のライフサイクルを制御し、リソース管理をより自動化し、ゴミ回収の導入による稼働時の負担も回避します.しかし、このモードには重要な問題があります.リソースを共有する必要がある場合、チェックや同期などの作業に追加の作業を行う必要があります.
より現代的な資源管理方式として、C++11には2つのスマートポインタ、std::shared_ptrstd::unique_ptrが導入されている.前者はスレッドセキュリティの参照カウントを有し、後者は所有権(owenrship)転送によってリソースの生存サイクルを制御する.C++11には,リソース伝達中の不要なレプリケーションを回避するために,右値参照と移動の意味も導入されている.
Rustのライフサイクル(Lifetime)と所有権(Ownership)の概念と同様に、C++のstd::unique_ptrは、値が伝達されるたびに、自身が保有するリソースを付与の目標に移行し、移動の意味と結びつけて、付与プロセスをさらに最適化する.
Lambda
FunctorはC++STLの重要なコンポーネントとして、C++で多くの機能が使用されています.1つのFunctorは、実はoperator()のクラスを再ロードしたインスタンスオブジェクトであり、このオブジェクトはC++テンプレートの動作に合わせて、簡単に関数として呼び出すことができるので、Functor(通信子)と呼ばれています.ただし,C++は匿名クラスや内部クラスのサポートが不十分であるため,Functorを用いて事前に設計する必要がある.使いにくい一方で,定義と使用が分離され,コードの組織と理解にも一定の困難が生じている.
まず,lambdaはFunctorの代替品として,即座に定義して使用できない問題を解決した.STLのコンテナとアルゴリズムに合わせて、lambdaもC++の関数スタイルを極致に発揮することができます.次に,C++の一貫した性能と抽象的な考慮からlambda captureの概念を導入し,オブジェクトのライフサイクルをlambda式にバインドし,閉パッケージオブジェクト(closure)を構築できるようにした.また、C++14に組み込まれたgeneric lambdaは、lambdaのタイプ導出アルゴリズムを強化し、タイプセキュリティ特性を損なわない上で、コンビネーションプログラミング(Combnator-based Programming)をより容易に実現します.
同時
C++設計の初期には,コンカレントはコアの言語特性として考慮されていなかった.また,スレッドなどの同時モデルは異なるプラットフォーム上でも様々な実装があり,統一的な同時モデルを構築することも困難である.
C++11ではC++のメモリモデルを再設計し,既存の互換性を維持した上で同時コンテンツを加えた.また、標準ライブラリには、スレッド(<thread>)、信号量(<condition_variable>)、反発ロック(<mutex>)、原子操作(<atomic>)なども加わっている.これに基づいて、future/promiseモードやasyncなどの動作もパッケージ化されている.
メタプログラミング
C++自身はメタプログラミングに良好なサポートを提供している.メインコンポーネントの1つであるテンプレートとして、コンパイル時の数値計算とタイプ計算が提供されます.しかし、テンプレートを使用することでコンパイル速度が遅くなる一方で、テンプレートを使用する場合、デバッグや並べ替えが非常に困難であるため、多くの人が退却し、テンプレートベースのSTLコンポーネントにも恐れを感じている.
C++11ではメタプログラミングのサポートを強化した.まずtype traitsを標準ライブラリとして導入し、テンプレートに直感的な制約を提供し、タイプをC++の第1クラス値(first-class value)として存在させることができる.またconstexprの導入はコンパイル時の値演算を簡略化し,ユーザカスタム字面量(user-defined literals)や可変パラメータテンプレート(varadic template/parameter pack)などの特性に合わせて,C++が内部DSLをより容易に定義できるようにした.
Bright Future
古典的なプログラミング言語として、C++は今でも更新されています.間もなく到来するC++17では、これらの重要な特性が準備されています.
  • より豊富な標準ライブラリ:C++でFile System、Networkなどの重要なコンポーネントを標準化したサポート、
  • Module TS:C言語から継承するヘッダファイルに代わるモジュール化提案、C++のコンパイルモデルとモジュール依存性の簡略化、
  • .
  • Concepts TS:タイプ制約とタイプ導出を強化するとともに、テンプレートの使用を簡略化するために使用されます.
  • Reflection TS:コンパイル期間の静的反射のサポート、type traitsの簡素化と強化、より豊富なメタプログラミング機能を提供します.

  • Conclusion
    C++の発展は今までずっと時代の前列線を歩んできたことがわかります.一方,応用とシステム開発に適したコンポーネントをより多く増やし,一方,言語特性の拡張により抽象的複雑さを簡略化した.このような新しい特性と歴史的責任を兼ね備えたプログラミング言語として、その応用の広さを予見するのに十分である.同様に、Mesosなど、より多くのシステムレベルのオープンソースプロジェクトも、C++を主なプログラミング言語として選択しています.C++が再生していると信じるには十分な理由があります.
    編後語
    「他山の石」はInfoQ中国語ステーションが新たに発表したコラムで、国内外の技術コミュニティと個人ブログからの技術文章を精選し、より多くの読者の友人に利益をもたらした.本問は『TW洞見』から転載した.文章の推薦はメールを送ることができます[email protected].