🔖

C++の負債とCarbon

2022/07/31に公開
2

はじめに

修正や追加等はコメントまたはGitHubで編集リクエストをお待ちしております。

本題

最近Googleが発表したCarbonと言う言語をご存知でしょうか?
これはC++を改善するために生まれた言語です。
ですがRustやZigみたいに全て書き換える必要は無いです。
TypeScriptとJavaScriptのように相互に運用できる言語設計(になる予定)です。
では何故Carbonが必要だったのでしょうか?
Carbonは生き残れるのでしょうか?
C++を知ることで、Carbonを使う理由が見えてくると思います。

C++で作られた or 依存しているもの

(間接的なもの含む)

  • V8
  • Windows
  • Mac
  • Linux
  • Python
  • LLVM
  • Swift
  • Ruby
  • Adobe製品
  • Microsoft Office
  • JVM

ご覧ください
プログラミングの根幹を支えているのはC++です。
人類はC++に依存しています。

C++の欠点

構文がかけ離れすぎてる

Cが生まれたの約半世紀前
一方今使われているC以外の言語は10~20年前ぐらいに生まれました。
1983年(39年前)に生まれたC++は現代のプログラミング言語とは全く別の構文を持っています。
例えば以下のようなプログラムがあります。

C++
#include <iostream>
int main() {
    int age = 18;
    std::cout << "I am " << age << " years old." << std::endl;
    return 0;
}
Rust
fn main() {
    let age = 18;
    println!("I am {} years old.", age);
}
JavaScript
function main() {
    let age = 18;
    console.log("I am " + age + " years old.");
}
main();
Python
def main():
    age = 18
    print("I am " + age + " years old.")

if __name__ == "__main__":
    main()

C++を見てください。
print,printf,console.logのどれでもなくstd::coutとかいう意味わからん言葉です。
(coutはcharacter output(文字出力)の略らしいです)
構文も () ではなく << を使う特殊な構文です。

メモリを自分で管理しないといけない

C/C++のメモリ管理はプログラマーの責任です。
自分で管理できるので自由度が高い反面考慮しなければいけないことが増えます。

C++
#include <iostream>
int main(int argc, const char **argv)
{
    char *name = new char[32];
    memset(name, 0, 33);//オーバーフロー
    return 0;
}

上記コードのようにメモリ操作で思わぬオーバーフローを起こすことがあります。
コンパイラは上記コードでは何の警告もしません。
自由と責任が常にC/C++に付きまといます。

C 互換ではない

C言語とC++は混在して書けるので互換性があると思いがちですがそうではないです。
簡単な例を挙げるとすれば auto です。
Cの auto はローカル変数の意味で型を省略すると int で解釈されます。
C++の auto は型推論で解釈されます。
したがって下記のようなコードはCとC++で違いがでます。

C++
#include <iostream>
int main(int argc, const char **argv)
{
    auto age = 9.5;
    std::cout << "I am " << age * 2 << " years old." << std::endl;
    return 0;
}
C
#include <stdio.h>
int main(int argc, const char **argv)
{
    auto age = 9.5;//int型なので0.5は切り捨て
    printf("I am %f years old.\n", age * 2);// 18になる
    return 0;
}

Rust と Carbon どっち?

RustはC/C++の代わりになることを目的としています。
メモリ安全なコードを簡単に書けるのにC/C++とほぼ同等な速度を持っています。
ですが独特で難解な構文があり、人類には少し早すぎます。
Carbonのサイトには。

If you can use Rust, ignore Carbon(もしRustが使えるなら、Carbonは無視して)

とあるのでRustが書ける強強マンにはCarbonは無用です。
C++は書けるけどRustは無理だなーって人向けの言語がCarbonです。

まとめ

まだまだ赤ちゃんのCarbonの今後の成長が楽しみです。
個人的にはV8などでCarbonが採用されたら一気に注目されると思います。

GitHubで編集を提案

Discussion

Hidden comment
大森保英大森保英

Linuxは主にC言語で書かれています。少なくとも、kernelはC++に依存していなかったかと。
配布物としては、Qt / KDEを含み、C++に依存することが多いかも知れません。