この記事では、Google製のC++後継言語である Carbon言語 の公式READMEを日本語訳にして公開しています。
昨日、C++ の実験的な後継言語とされる Carbon が発表されました。
私自身、C++を業務で10年以上使っていた経験があり、C++とCarbonの関係に興味を持ったので、公式のREADMEを和訳してみることにしました。
この記事を通して、Carbon言語の理解が進むことを期待します。
それでは、次章よりREADMEの日本語訳になります。(翻訳時の原文はこちらになります -> https://github.com/carbon-language/carbon-lang/blob/59f91aa0d565f5161720552568dab28a21de7941/README.md)
目次
Carbon言語: C++の後継となる実験的言語
高速かつC++と連動
- LLVMを使用したパフォーマンスマッチングC++、ビットとアドレスへの低レベルアクセス
- 継承からテンプレートまで、既存のC++コードと相互運用可能
- 既存のC++ビルドシステムで動作する高速でスケーラブルなビルド
モダンで進化し続ける
- 特にC++を使用したことがあれば、簡単に習得できる強固な言語基盤
- Carbonのバージョン間のアップグレードがツールベースで簡単にできる
- より安全なファンダメンタルズと、メモリセーフなサブセットへのインクリメンタルパス
オープンソースコミュニティを歓迎
- 堅牢なガバナンスによる明確な目標と優先順位
- 歓迎的で、包括的で、友好的であるように働くコミュニティ
- バッテリーインクルードアプローチ(標準で十分な機能を持つというニュアンス):コンパイラ、ライブラリ、ドキュメント、ツール、パッケージマネージャ、その他
なぜCarbonを作るのか?
C++は、パフォーマンス重視のソフトウェアにおいて、依然として支配的なプログラミング言語であり、そのコードベースと投資額は膨大かつ拡大しています。
しかし、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
言語の目標
以下をサポートするようにCarbonを設計しています。
- パフォーマンスが重要なソフトウェア
- ソフトウェアと言語の進化
- 読みやすく,理解しやすく,書きやすいコード
- 実用的な安全性とテストメカニズム
- 高速でスケーラブルな開発
- 最新のOSプラットフォーム、ハードウェアアーキテクチャ、および環境
- 既存のC++コードとの相互運用性・移行性
多くの言語がこれらの目標の一部を共有していますが、Carbonの特徴はこれらの目標の組み合わせであることです。
また、Carbonには、特に次のような明確な非目標があります。
- 言語とライブラリ全体に対する安定したABI
- 完全な後方または前方互換性
詳細な目標ドキュメントは、これらのアイデアを具体化し、Carbonプロジェクトと言語の目標をより深く理解するためのものです。
プロジェクトの状況
Carbonは現在、実験的なプロジェクトです。私たちは、後継言語の基準を満たす言語を構築できるかどうか、また、その言語がより大きなC++業界やコミュニティの中で関心を集めることができるかどうかを、よりよく理解したいと考えています。
現在、Carbonプロジェクトと言語の両方について、いくつかの核となる部分を具体化することができました:
- カーボン言語の戦略とプロジェクト。
- オープンソースのプロジェクト構造、ガバナンスモデル、および進化プロセス。
- C++の経験から得た言語設計の重要かつ基礎的な側面と、予想される最も困難な課題を説明します。これには、以下のような設計が含まれます。
- ジェネリクス
- クラスタイプ
- 継承
- 演算子オーバーロード
- レキシカルおよびシンタックス構造
- コード構成とモジュール構造
- プロトタイプのインタプリタデモは、孤立した例を実行することができ、Carbonの特定の意味モデルと抽象マシンの詳細な分析を行うことができます。これをCarbon Explorerと呼んでいます。
現在、C ++コミュニティからより幅広いフィードバックと参加を得て、0.1言語の設計を完了し、この設計のCarbonExplorerの実装を完了することに重点を置いています。 さらに、C ++の相互運用性と、0.1言語を実装し、Carbonをより詳細に評価するために使用できる現実的なツールチェーンを優先する予定です。
詳しくは、ロードマップをご覧ください。
Carbon と C++
すでにC++の開発者であれば、Carbonの学習曲線は穏やかなものになるはずです。Carbonは、一貫した言語構造のセットで構築されているので、親しみやすく、読みやすく、理解しやすいはずです。
C++のコードがこの様な場合:
対応するCarbonのコードはこの様になります:
C++からCarbonをオーバーヘッドなしで呼び出すことも、その逆も可能です。つまり、アプリケーション内で単一のC++ライブラリをCarbonに移行したり、既存のC++への投資の上に新しいCarbonを記述するのです。例として:
CarbonでC++の相互運用についてもっと読む。
CarbonとC++の間の相互運用性に加えて、既存のC++コードベースをCarbonに切り替えるのに役立つ慣用的なC++コードをCarbonコードに機械的に変換する移行ツールのサポートも計画しています。
ジェネリクス
Carbonは、チェックされた定義を持つ最新のジェネリクスシステムを提供する一方で、シームレスなC++相互運用のためのオプトインテンプレートをサポートしています。
チェックされたジェネリックには、C++テンプレートと比較していくつかの利点があります。
- ジェネリクス定義は完全に型チェックされるため、エラーをチェックするためにインスタンス化する必要がなくなり、コードの信頼性が高まります。
- インスタンス化のたびに定義を再チェックするコンパイル時のコストを回避することができます。
- 定義がチェックされたジェネリクスを使用すると、使用エラーメッセージがより明確になり、どの要件が満たされていないかが直接示されます。
- 個別の実装なしで、自動のオプトイン型消去と動的ディスパッチを有効にします。 これにより、バイナリサイズが削減され、異種コンテナのような構成が可能になります。
- 強力でチェックされたインターフェースは、実装の詳細に対する偶発的な依存を減らし、消費者にとってより明確な契約となります。
これらの利点を犠牲にすることなく、Carbonジェネリクスは特殊化をサポートし、C++テンプレートのパフォーマンスが重要なユースケースに完全に対応できるようにします。 Carbonのジェネリクスの詳細については、その設計を参照してください。
C ++との簡単で強力な相互運用性に加えて、Carbonテンプレートは制約され、チェックされたジェネリクスに細かくスムーズな進化パスで段階的に移行できます。
メモリ安全性
安全性、特にメモリ安全性は、C++にとって重要な課題であり、後継言語が取り組むべきものであることに変わりはありません。
私たちは、安全性の領域で重要な、低いところにぶら下がっている果実(大した努力をしなくとも簡単に達成できる目標という意味)に直ちに取り組むことに、最初の優先順位と焦点を合わせています。
- 初期化されていない状態をより適切に追跡し、初期化の強制力を高め、必要に応じて初期化のバグに対する強化を体系的に提供します。
- デバッグおよび強化ビルドで動的境界チェックをサポートするための基本的なAPIとイディオムの設計。
- アドレスサニタイザーと組み合わせた場合でも、既存の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は、誰もが貢献できる、歓迎的で包括的な環境に取り組んでいます。
- メジャーリリースのお知らせを見るには、GitHubのCarbonリリースポストを購読し、carbon-lang を starして下さい。
- 設計の議論に参加するには、Githubフォーラムにご参加ください。
- Carbon開発コミュニティに関する情報は、行動規範とコントリビューションガイドラインをご覧ください。
- DiscordでCarbonについて議論しています。
参考
- GitHub - carbon-language/carbon-lang: Carbon language specification and documentation.
- DeepL翻訳:世界一高精度な翻訳ツール
- Google 翻訳