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

Carbon Language:
C++ の試験的な後継言語

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

CppNorthから の発表ビデオをご覧ください。Carbon は 使用できる状態ではないことに注意してください。

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 → タイプスクリプト
  • Java → コトリン
  • C++ →カーボン

言語目標

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

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

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

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

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

プロジェクトの状況

Carbon Language は現在、実験的なプロジェクトです。動作するコンパイラまたはツールチェーンはありません。compiler-explorer.comで、Carbon のデモ インタープリターを確認できます 。

私たちは、後継言語の基準を満たす言語を構築できるかどうか、また、結果として得られる言語が、より大きな C++ 業界およびコミュニティ内でクリティカル マスの関心を集めることができるかどうかをよりよく理解したいと考えています。

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

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

貢献することに興味がある場合は、0.1 言語の設計完成させ、この設計の Carbon Explorer の実装を完成させるのを手伝って ください。現在、C++ コミュニティからより幅広いフィードバックと参加を得られるよう取り組んでいます。それ以上に、C++ の相互運用性と、0.1 言語を実装し、Carbon をより詳細に評価するために使用できる現実的なツールチェーンを優先する予定です。

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

Carbon と C++

すでに C++ の開発者であれば、Carbon は簡単に習得できるはずです。これは、親しみやすく、読みやすく、理解しやすい言語構造の一貫したセットから構築されています。

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

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

次の Carbon コードに対応します。

変換された 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 エクスプローラーを使用して Carbon コードを解釈し、その出力を出力できます。compiler-explorer.comですぐに試すことができます 。

Carbon Explorer を自分で構築するには、次の手順に従います。

# 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 は、誰もが貢献できる歓迎的で包括的な環境に取り組んでいます。