carbon-lang - Carbon Languageのメインリポジトリ:ドキュメント、設計、実装、および関連ツール。(注:Carbon言語は実験的なものです。READMEを参照してください)

(Carbon Language's main repository: documents, design, implementation, and related tools. (NOTE: Carbon Language is experimental; see README))

Created at: 2020-04-28 05:45:16
Language: C++
License: NOASSERTION

カーボン言語:
C++の実験的な後継者

なんで?| 目標| はじめに| 参加しませんか

CppNorthから の発表ビデオをご覧ください

Carbonのクイックソートコード。 詳細については、リンクをたどってください。

高速でC++で動作します

  • LLVMを使用したパフォーマンスマッチングC++、ビットとアドレスへの低レベルアクセス
  • 継承からテンプレートまで、既存のC++コードと相互運用します
  • 既存のC++ビルドシステムで動作する高速でスケーラブルなビルド

現代的で進化している

  • 特にC++を使用したことがある場合は、習得が容易な堅固な言語基盤
  • Carbonバージョン間の簡単なツールベースのアップグレード
  • より安全なファンダメンタルズ、およびメモリセーフサブセットへの増分パス

歓迎するオープンソースコミュニティ

  • 堅牢なガバナンスによる明確な目標と優先順位
  • 歓迎的で、包括的で、友好的であるように働くコミュニティ
  • バッテリーに含まれるアプローチ:コンパイラー、ライブラリー、ドキュメント、ツール、パッケージマネージャーなど

なぜCarbonを構築するのですか?

C ++は、パフォーマンスが重要なソフトウェアの主要なプログラミング言語であり、コードベースと投資が大幅に増加しています。しかし、上で概説したように、何十年にもわたる技術的負債の蓄積のために、開発者のニーズを改善し、満たすのに苦労しています。C ++を段階的に改善する ことは、技術的負債自体とその進化プロセスの課題の両方のために、非常に困難です。これらの問題に対処する最善の方法は、CまたはC ++のレガシーを直接継承することを避け、代わりに、 最新のジェネリックシステム、モジュラーコード編成、一貫性のある単純な構文などの堅固な言語基盤から始めることです。

Go、Swift、Kotlin、Rustなど、既存の最新言語はすでに優れた開発者エクスペリエンスを提供しています。これらの既存の言語のいずれかを使用できる開発者は、そうする必要があります。残念ながら、これらの言語の設計は、C++からの採用と移行に大きな障壁をもたらします。これらの障壁は、ソフトウェアの慣用的な設計の変更からパフォーマンスのオーバーヘッドにまで及びます。

Carbonは、C ++を段階的に進化させる試みではなく、基本的に後継言語アプローチです。これは、C ++との相互運用性、および既存のC++コードベースと開発者向けの大規模な採用と移行を中心に設計されています。C ++の後継言語には、次のものが必要です。

  • 開発者にとって不可欠なプロパティであるC++と一致するパフォーマンス。
  • C ++とのシームレスな双方向の相互運用性。これにより、既存のC ++スタック内の任意のライブラリが、残りを移植せずにCarbonを採用できます。
  • C++開発者にとって妥当な知識を備えた穏やかな学習曲線。
  • 同等の表現度と既存のソフトウェアの設計とアーキテクチャのサポート。
  • 慣用的なC++コードのソースからソースへのある程度の変換を伴うスケーラブルな移行。

このアプローチにより、C ++の既存のエコシステムの上に構築し、既存の投資、コードベース、および開発者集団をもたらすことができます。他のエコシステムでこのモデルに従っている言語はいくつかあり、CarbonはC++でも同様の役割を果たすことを目指しています。

  • JavaScript→TypeScript
  • Java→Kotlin
  • C++→カーボン

言語の目標

以下をサポートするようにCarbonを設計しています。

  • パフォーマンスが重要なソフトウェア
  • ソフトウェアと言語の進化
  • 読みやすく、理解しやすく、書きやすいコード
  • 実用的な安全性とテストメカニズム
  • 高速でスケーラブルな開発
  • 最新のOSプラットフォーム、ハードウェアアーキテクチャ、および環境
  • 既存のC++コードとの相互運用性と移行

多くの言語がこれらの目標のサブセットを共有していますが、Carbonを区別するのはそれらの組み合わせです。

また、Carbonには、特に次のような明確な非目標があります。

  • 言語とライブラリ全体の安定したABI
  • 完全な後方互換性または前方互換性

詳細な目標ドキュメントは、これらのアイデアを具体化し、Carbonプロジェクトと言語の目標をより深く理解するためのものです。

プロジェクトのステータス

カーボンは現在実験的なプロジェクトです。後継言語の基準を満たす言語を構築できるかどうか、および結果として得られる言語が、より大きなC++業界およびコミュニティ内で非常に多くの関心を集めることができるかどうかをよりよく理解したいと思います。

現在、Carbonプロジェクトと言語の両方のいくつかのコアな側面を具体化しています。

  • カーボンランゲージとプロジェクトの戦略。
  • オープンソースのプロジェクト構造、ガバナンスモデル、および進化プロセス。
  • C ++の経験と予想される最も困難な課題から得られる、言語設計の重要で基本的な側面。これには、次の設計が含まれます。
    • ジェネリック
    • クラスタイプ
    • 継承
    • 演算子のオーバーロード
    • 字句および構文構造
    • コード編成とモジュール構造
  • 分離された例を実行し、Carbonの特定のセマンティックモデルと抽象マシンの詳細な分析を提供できるプロトタイプインタープリターデモ。これをCarbonExplorerと呼びます。

現在、C ++コミュニティからより幅広いフィードバックと参加を得て 、0.1言語の設計完了し、この設計のCarbonExplorerの実装を完了することに重点を置いています。さらに、C ++の相互運用性と、0.1言語を実装し、Carbonをより詳細に評価するために使用できる現実的なツールチェーンを優先する予定です。

詳細については、完全なロードマップをご覧ください。

カーボンとC++

すでにC++開発者である場合、Carbonには緩やかな学習曲線が必要です。これは、親しみやすく、読みやすく、理解しやすい言語構造の一貫したセットから構築されています。

このようなC++コード:

C++コードのスニペット。 リンクをたどって読んでください。

このカーボンコードに対応します:

変換されたCarbonコードのスニペット。 リンクをたどって読んでください。

オーバーヘッドなしでC++からCarbonを呼び出すことができ、その逆も可能です。これは、単一のC ++ライブラリをアプリケーション内のCarbonに移行するか、既存のC++投資に加えて新しいCarbonを作成することを意味します。例えば:

CarbonとC++の混合コードのスニペット。 リンクをたどって読んでください。

CarbonでのC++相互運用性の詳細をご覧ください 。

CarbonとC++の間の相互運用性に加えて、既存のC++コードベースをCarbonに切り替えるのに役立つ慣用的なC++コードをCarbonコードに機械的に変換する移行ツールもサポートする予定です。

ジェネリック

Carbonは、 シームレスなC ++相互運用のためのオプトイン テンプレートをサポート しながら、チェックされた定義を備えた最新のジェネリックシステムを提供します。チェックされたジェネリックは、C++テンプレートと比較していくつかの利点を提供します。

  • 一般的な定義は完全に型チェックされているため、エラーをチェックするためにインスタンス化する必要がなくなり、コードの信頼性が高まります。
    • インスタンス化ごとに定義を再チェックするコンパイル時のコストを回避します。
    • 定義がチェックされたジェネリックを使用すると、使用エラーメッセージがより明確になり、どの要件が満たされていないかが直接示されます。
  • 個別の実装なしで、自動のオプトイン型消去と動的ディスパッチを有効にします。これにより、バイナリサイズを削減でき、異種コンテナのような構成が可能になります。
  • 強力でチェックされたインターフェースは、実装の詳細への偶発的な依存が少なくなり、消費者にとってより明確な契約を意味します。

これらの利点を犠牲にすることなく、Carbonジェネリックは特殊化をサポートし、C++テンプレートのパフォーマンスが重要なユースケースに完全に対応できるようにします。Carbonのジェネリックスの詳細については、その 設計を参照してください。

C ++との簡単で強力な相互運用に加えて、Carbonテンプレートは制約され、チェックされたジェネリックに細かく、スムーズな進化パスで段階的に移行できます。

メモリの安全性

安全性、特に メモリの安全性は、C ++にとって依然として重要な課題であり、後継言語が対処する必要のある問題です。私たちの最初の優先事項と焦点は、安全スペースで重要で手に負えない果物にすぐに対処することです。

  • 初期化されていない状態をより適切に追跡し、初期化の実施を強化し、必要に応じて初期化のバグに対する強化を体系的に提供します。
  • デバッグおよび強化ビルドで動的境界チェックをサポートするための基本的なAPIとイディオムの設計。
  • Address Sanitizerと組み合わせた場合でも、既存のC++ビルドモードよりも安価で包括的なデフォルトのデバッグビルドモードがあります 。

コードをCarbonに移行できるようになると、必要な注釈や機能を追加するためのスペースを設計スペースに備えた単純化された言語と、より安全な設計パターンをサポートするジェネリックスなどのインフラストラクチャができあがります。長期的には、これに基づいて安全なCarbonサブセットを導入します。これは大規模で複雑な作業であり、0.1の設計には含まれません。一方、Rustに触発されたライフタイムアノテーションなど、メモリセーフなセマンティクスをC++に追加する取り組みを注意深く監視して学習してい ます。

入門

コードベースを確認し、Carbonエクスプローラーを使用すると、Carbonの使用を開始できます。

# Install bazelisk using Homebrew.
$ brew install bazelisk

# Install Clang/LLVM using Homebrew.
# Many Clang/LLVM releases aren't built with options we rely on.
$ brew install llvm
$ export PATH="$(brew --prefix llvm)/bin:${PATH}"

# Download Carbon's code.
$ git clone https://github.com/carbon-language/carbon-lang
$ cd carbon-lang

# Build and run the explorer.
$ bazel run //explorer -- ./explorer/testdata/print/format_only.carbon

これらの手順はHomebrewを想定しています。より広範なツールの説明については、コントリビューションツールのドキュメントを参照 してください。

Carbonプロジェクトの詳細:

参加しませんか

Carbonは、誰もが貢献できる、歓迎的で包括的な環境に取り組んでいます。