ソフトウェア開発者のための OSS、まとめてみました!

ソフトウェア開発を行なっている自分が、個人的に面白いと思ったプログラムの最新技術や、オープンソースソフトウェア(OSS)をまとめています!

MENU

C++ 言語の後継となりうるか!「Carbon Language」

概要

C++ は、現在もパフォーマンスを重視するソフトウェアで使用されている主流なプログラミング言語ですが、何十年にもわたる技術的負債の蓄積により、開発者が段階的に改良するのにとてもコストがかかることが指摘されています。

上記の問題を解決するための最善の方法として、C または C++ のレガシーを直接継承することではなく、最新のジェネリックシステムなど一貫性のある単純な構文などの堅固な言語基板から始めることだとも説明されています。

そこで、それらの問題を解決する新しいプログラミング言語「Carbon Language」は、C++ の段階的な改善ではなく、C++との相互運用性を重視し既存の C++ コードベースや開発者の大規模な導入や移行を想定したうえで、最新のジェネリクスシステム、モジュール式のコード構成、一貫したシンプルな構文といった堅実な言語基盤から再設計した C++ の後継言語である、ということです。

ちなみに、「Carbon Language」においては、以下の機能を想定しているということでした。

  • C++ と同等なパフォーマンス
  • C++ とのシームレスな双方向の相互運用性
  • C++ 開発者にとって妥当な知識を備えた穏やかな学習曲線
  • 既存のソフトウェアの設計やアーキテクチャと同等な表現力
  • 慣用的な C++ コードのからある程度の返還を伴う程度のスケーラブルな移行

上記の機能を満たすことで C++ の機能を保ったまま改良することができ、目指す姿は以下のようなプログラミング言語のような後継言語となることだそうです。

それではもう少し見ていきましょう。

利用方法

現時点では Homebrew を利用したインストール方法のみのようで、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

サンプル

今回はまだ実験的公開として GitHub 上に公開されただけということなので、今回はインストールして動作することはせず、README の内容に沿って内容をまとめようと思います。

README に C++ と Carbon のソース例があったので、こちらで紹介します。

// C++:
#include <math.h>
#include <iostream>
#include <span>
#include <vector>

struct Circle {
  float r;
};

void PrintTotalArea(std::span<Circle> circles) {
  float area = 0;
  for (const Circle& c : circles) {
    area += M_PI * c.r * c.r;
  }
  std::cout << "Total area: " << area << "\n";
}

auto main(int argc, char** argv) -> int {
  std::vector<Circle> circles = {{1.0}, {2.0}};
  // Implicitly constructors `span` from `vector`.
  PrintTotalArea(circles);
  return 0;
}
  • Carbon
// Carbon:
package Geometry api;
import Math;

class Circle {
  var r: f32;
}

fn PrintTotalArea(circles: Slice(Circle)) {
  var area: f32 = 0;
  for (c: Circle in circles) {
    area += Math.Pi * c.r * c.r;
  }
  Print("Total area: {0}", area);
}

fn Main() -> i32 {
  // A dynamically sized array, like `std::vector`.
  var circles: Array(Circle) = ({.r = 1.0}, {.r = 2.0});
  // Implicitly constructs `Slice` from `Array`.
  PrintTotalArea(circles);
  return 0;
}

こうしてみると、最近の開発者エクスペリエンスを意識したプログラミング言語に見え、開発もスムーズに行えそうな印象ですね!

まとめ

今回は、C++ の段階的な改善ではなく、C++との相互運用性を重視し既存の C++ コードベースや開発者の大規模な導入や移行を想定したうえで、最新のジェネリクスシステム、モジュール式のコード構成、一貫したシンプルな構文といった堅実な言語基盤から再設計した C++ の新しい後継プログラミング言語「Carbon Language」を紹介しました。

現時点ではまずバージョン 0.1 への開発を積極的に進めているということで、コミュニティ参加なども積極的に行われているようです。

C++ をこれまで利用されていた開発者の方などは、今後流行するであろう C++ の新しい後継言語 Carbon の開発について情報をキャッチアップしつつコミュニテイに参加して、積極的に貢献されてみてはいかがでしょうか。

ライセンス

Apache License Version 2.0

リンク

github.com