1 ポイント 投稿者 GN⁺ 2024-12-25 | 1件のコメント | WhatsAppで共有
  • C++はC++11以降、言語とエコシステムが大きく変わり、自分で作って実験する過程の中でプログラミングの楽しさを取り戻せる言語になった
  • かつてのC++は、テンプレートメタプログラミングの過剰さと標準・パターン中心の文化のために、多くの開発者にとって疲れる言語として記憶されていた
  • autonullptrrange-for、ラムダ、<chrono>、スマートポインタ、<thread>のような変化が、C++のコーディングスタイルを大きく変えた
  • 最新のC++は、ファイルシステム、パッケージ管理、GUI/TUI、グラフィックス、数学、AI、OS APIへのアクセスまで選択肢が広く、作りたいものを自分で実装しやすい
  • コンパイラエラー、ビルドツール、標準準拠、歴史的な複雑さ、RAIIといった欠点は残っているが、創作の可能性がその不便さを上回る

C++が再び面白くなった理由

  • 小さなローグライクゲームを作る中で、マップ生成にDijkstraアルゴリズムを使って部屋をつなぐトンネルを実装したが、その過程でC++が実験の大きな妨げになることはなかった
  • FTXUI のユーザーインターフェースを SFML のレンダーウィンドウに直接描画する実験も可能で、その過程でC++のUnicode処理も学べた
  • こうした作業は簡単ではなかったが、実際に実現可能であり、「このアイデアは本当に動いた」という感覚がC++の面白さを生んでいる
  • そもそもプログラミングを始めた理由は、億万長者にもっと金を稼がせるためでも、レンダリングエンジンと格闘するためでも、オープンソースプロジェクトの上層部を満足させるためでもなく、アイデアを実装する楽しさにあった

テンプレートメタプログラミング時代の疲労感

  • 1990年代末から2000年代初頭にかけて、C++にはテンプレートメタプログラミングをあらゆるものに適用しようとする空気が強くあり、この時期がC++をつまらなくした転換点として扱われている
  • テンプレートで2つの数を足す方法が直接足すより速いというような議論もあったが、実際のアセンブリ出力は同じだったという例が紹介されている
  • C++標準委員会がプログラマに優れた使い勝手を提供することに消極的だった、という認識も否定的な体験を強めた
  • 当時のC++は、<> の山括弧と複雑な文法ばかり多く、得るものは少ない言語として記憶されている
  • Javaも当初はガベージコレクタと開発者フレンドリーさで魅力的に見えたが、その後はボイラープレートとデザインパターンの過剰さによって似たような疲労感を生んだ

C++11が変えた言語の感覚

  • C++11に追加された機能 は、C++の印象を大きく変えた変化として評価されている
  • 主な機能は次の通り
    • auto: 同じ型名を何度も書く負担を減らす自動型推論キーワード
    • nullptr: Cの NULL の問題を補うヌルポインタ表現
    • range-for: auto と組み合わせることでコンテナ走査をより簡単にするループ
    • lambda expressions: API設計と使い勝手を大きく変えうるラムダ
    • <chrono>: 100ms のような表現が可能な型安全の時間ライブラリ
    • <regex>: 標準ライブラリに含まれる正規表現機能
    • unique_ptr, shared_ptr: 所有権と参照カウントを扱うスマートポインタ
    • <thread>: マルチスレッドを基本的な言語エコシステムに含めた機能
  • C++11は従来のやり方を捨てることなく、言語の哲学とスタイルを変えたという点で、JavaScriptのES6に近いものとして受け止められている

現代C++エコシステムの選択肢

  • 最新のC++は、他の言語で期待される機能の多くを備えている
  • 例として挙げられているツールとライブラリは次の通り
  • エコシステムの品質には項目ごとの差があるものの、JavaScriptやPythonで経験したものより全体として高く評価されている
  • 特にFTXUIとSTLは、優れた設計と使いやすさを示す例として挙げられている

「面白さ」を生む広い実装可能性

  • C++が面白い理由は、単にモダンな機能が追加されたからだけではなく、ほとんど何でも作れるという実装可能性にある
  • デスクトップアプリは fensterSFMLQt を使うことも、OS APIを直接扱って作ることもできる
  • サウンドについても、SFMLのような手軽な選択肢から Wwise のような商用ツールまで幅広い
  • 3DグラフィックスにはOpenGL、Vulkan、Direct3D、Ogre3Dなど多様な選択肢がある
  • 数学分野には BLASEigenGMTL のようなライブラリがある
  • 必要なライブラリがなくても、CまたはC++ ABIやOS APIに直接アクセスして作ることができ、その自作の過程自体が面白さの一部になる

流行から外れた言語の創作の自由

  • C++は言語とエコシステムの品質が高い一方で、現在の流行語ではないため、言語を駄目にする類いの関心を比較的受けにくいという評価がある
  • C++コミュニティは、何を作るにしてもあまり干渉しない雰囲気として描かれている
    • 行列ライブラリ、GUIライブラリ、ゲームエンジン、妙なゲームのようなプロジェクトを自由に試せる
  • 創造的な作業には、まずアイデアを外に出す段階と、その後に冷静に批判して品質を高める段階の両方が必要である
  • 他の言語では、組織、リーダーシップ、コミュニティからの圧力が、創作途中の実験を妨げると評価されている
  • C++の広い可能性と、比較的恥をかかせにくい文化が、創造的な体験を生みうる

cppreference.comの強み

  • cppreference.com は、これまで使ってきたプログラミング言語のドキュメントの中でも最高水準と評価されている
  • 長所は次の通り
    • すべてのキーワードとライブラリがリファレンス文書として整理されている
    • ほとんどの項目に実際に動く例がある
    • 各機能が導入されたC++標準のバージョンが示されている
    • 標準文書や関連する参考資料にリンクされている
    • DuckDuckGoベースの検索ボックスがあり、スペルを間違えたり正確な用語を知らなくても探しやすい
    • Copy elision のような重要概念も例とともに説明されている
  • 不足している点は、さまざまなプラットフォームでコンパイラをインストールする方法がないこと
  • C++コンパイラやプラットフォームの数はそれほど多くないため、導入ガイドを追加する余地もある

それでも残るC++の問題

  • これはC++が完璧な言語だという意味ではなく、他の言語と同様に不便な点も多い
  • WindowsでMicrosoft以外のインストール経路を使ってコンパイラや開発ツールを構成するのは難しく、そのために PowerShellインストールスクリプト を自作した
  • 現在感じている主な不便さは次の通り
    • コンパイラのエラーメッセージの95%以上は業界最悪レベルと評価されている
    • ビルドツールは使いにくく、Meson でさえインストール済みパッケージの指示を無視して壊れたシステムライブラリを使う問題に遭遇した
    • コンパイラベンダーに標準準拠を徹底させるインセンティブが乏しい
    • C++は歴史的経緯から非常に複雑で、古いヒープ確保・raw pointerスタイル、テンプレートメタプログラミングスタイル、C++11以降のスタック中心スタイル、struct 中心のさらに新しいスタイルが共存している
    • RAIIは現実的な設定作業では邪魔になることが多く、他言語的な初期化コンストラクタと現在のRAIIとの中間地点が必要だと見ている
  • こうした欠点があっても、C++の不便さは面白さを壊すほどではなく、C++は過去の山括弧とポインタ中心の言語という印象とはすでに異なっている
  • FTXUIのGUIレイアウトコードは、C++だと知らなければ別の言語に見えるほどモダンな文法を示す例になっている

1件のコメント

 
GN⁺ 2024-12-25
Hacker News の意見
  • C++ 嫌いに近いが、それは信頼性が求められる業務コードを、まったく信用しがたい同僚たちと一緒に C++ で扱わなければならないのが嫌だからだ
    個人プロジェクトでは、これまで経験したコーディング環境の中でもかなり満足度の高い部類で、実行を非常に細かく制御できる点は本当にワクワクする
    約10年前に C++ から離れ、戻るつもりはないが、最近の自分のプロジェクトでは長期的な信頼性が最重要なので Rust + CI/CD がちょうど合っている
    それでも、プログラムが自分の意図したとおりに実行されるよう設計・実装し、それが自分の専門性と洞察のおかげだと感じられる高揚感は恋しい
    一緒に働く人にそういう動機で動いてほしいかと言われれば絶対に嫌だが、個人的には忘れられない楽しさだ
    ビルドシステムとパッケージ管理は悪夢で、プリプロセッサはサディスティックな冗談のようで、構文はひどく、ランタイムには自分の足を機関銃で撃たないために何年もの経験が必要な残滓が多すぎる
    だがある意味では、こうした苦痛が、知性と血の涙で包み込んだ実行ファイルをついに吐き出すときの喜びをさらに大きくしてくれる

    • C++ について読んだ描写の中で、かなり共感できるものの一つだ
      C/C++ を数年間仕事で使っていたが、また戻りたいとは思わない
      他人のコードをデバッグし、曖昧な統合問題に悩まされ、ビルドシステムのスパゲッティを動かすのにあまりにも多くの時間を費やした
    • 仕事も個人プロジェクトと同じくらい楽しくあるべき
      この10年でテック業界はこの考えを失ってしまったように思うし、最高の人材をおいしい食事と柔らかい椅子のある大人向けの牢獄に入れている大手テック企業のせいだと思っている
      スタートアップも以前ほど楽しくなくなり、VC 業界が狭い思考の窓を助長した結果、同じものを作るクローンスタートアップや流行が多すぎるようになった
      新しいプロジェクトごとに C++ を使う理由は、自分で作る必要があるときに作れるという確信があるからだ
      フレームワークは、特にプロジェクトの核心部分を扱うとき、望むとおりに動かないことが多く、使い続けたくなくなる
      自分で作れるなら自分で作ればいいし、そうでなければフレームワークを使えばいい
      自分で作れるなら、C++ は何でもでき、重要な面では邪魔をしない優れた道具だ
      Rust のような言語は、私が危険なことをしていると文句を言うかもしれないが、C++ では頭の中のモデルを直接表現できる
      ときにはポインタで考えることもあり、ポインタは本当に優れた道具だ
      楽しさを取り戻そう、私生活だけでなく仕事でも
  • この記事はやや混乱しているように見える
    多くの点に触れているが、それがなぜ C++ のほうが楽しい、あるいは楽しくないという結論につながるのかをくみ取るのが難しい
    モダン C++ を極めて高品質だと言いながら、同時に広範なレガシー問題やひどいツールについて語っているのも混乱する
    unique_ptr は素晴らしいと言いながら RAII は本当に嫌いだと言い、メタプログラミングは昔はどこにでもあったが今はそうではない、という主張も奇妙だ
    concepts を見るとそうではないし、C++ には最高のグラフィックライブラリがあるという話や、Python のインストールは C++ より難しいという話も、論旨とはあまり関係のない著者のこだわりに見える
    結局、著者は個人的な要因の複雑な組み合わせによって C++ を楽しいと感じているようで、それ自体は構わない
    性能や技術的な性格のために C++ で最も楽しくプログラミングしたこともあるが、実践的なソフトウェア開発では、私たちが知っている多くの理由から C++ はあまり良くない
    C++ は数十年分のレガシーと政治に傷ついた、深く矛盾した言語であり、C++ の現実を無視することが C++ 論議における最大の誤りだ
    最近の C++ に対する私の態度は疲労感に近く、ここ何年も C++ が投げてきた障害をこれ以上飛び越えたくない
    もうとっくに死んだ馬を叩き続ける必要はなく、C++ はただ C++ のままにしておけばいい

    • その文は記事の要旨をよく要約していると思う
      私には、記事が混乱しているというより、著者が楽しんでいて、その喜びをできるだけ分かち合おうとしているように見える
      きちんとした論説というより、積極的に説得しようとする文章ではなく、「あえて説得されなくても共感できるなら、あなたも楽しめるかもしれない」というものに近い
      商業的な仕事で現実に打ちのめされて疲れた立場なら、筋が通らないと感じるのも十分理解できる
      私も最近、よりによって JavaScript を使ってものすごく楽しんでいるが、同じような記事を書いたら、この10年の商業的 JavaScript に疲れた人には同じくらい悪く読まれそうだ
      それでも、著者が楽しんでいて、その楽しさを共有することにしたのは喜ばしい
  • C++ プロジェクトでサードパーティ依存関係を Linux/Windows/macOS で動くよう静的リンクするのに3日を費やした
    そのパッケージは conan/vcpkg にはなく、奇妙な Makefile/cmake の組み合わせがある GitHub リポジトリだけだった
    cmake/cpp の専門家とはほど遠いが、ほとんどの現代的な言語では pip installcargo addnpm installgo get のような方法で問題にならない
    C++ の意味論の細部を本で最初から最後まで読んだとしても、実際のプロジェクトで作業するのは依然として苦痛だ

    • JavaScript の依存関係とビルドツールチェーンも、最も汚い Makefile と同じくらい難解だ
      結局 JavaScript 版 autotools のようなものにたどり着いたというのは驚きだ
    • 特に何が難しかったのか気になる
      他人のコードを静的ビルドしたり、別のプラットフォームでビルドできるよう変えたりするのは時に厄介だが、リンク自体は通常、include ディレクトリ、ライブラリパス、ライブラリ指定くらいのものだ
    • 逆に考えると、このサードパーティを別の「現代的」な言語で使いたい場合、何がより良くなるのだろうと思う
      誰かが vcpkg/conan のパッケージングをしていないなら、pip/cargo/npm にもない可能性が高い
      C++ で苦労したなら、他の言語ではさらにずっと大変かもしれない
      ただし、歴史的な C++ の一部、特にビルドの話が非常に悪い状態にあることは、ここからも明らかだ
      vcpkg にさえ入っていれば、インストールの難易度は他のエコシステムと正確に同じになる
  • 定期的に C の代わりに C++ で作業してみるのだが、毎回似たようなパターンになる。
    新しい C++ の技法を知り、何か良くなりそうだと思ってコードを書き、コンパイラエラーにぶつかり、その日の残りを、なぜ自分のやりたいことができないのか学ぶのに費やす。
    たいてい C++14 に縛られていて、一部の問題は以後のバージョンで修正されているが、それでもやはりそうだ。
    C++ を本当に好きになりたいのだが、理論上は生産性を高めてくれる、より強力な C を提供してくれる一方で、結局は認知的な負荷が大きすぎて、たいてい「クラス付きの C」を書いて済ませることになる。

    • 学ぶのが楽しい段階というものがあり、元記事の筆者はまだそこにいるように見える。
      2003年にはリアルタイム C++ をたくさん書いていて嫌いだったが、昨年はコードの大半を C++ で書き、ようやく好きになれた。
      ラムダと auto が、C++ を嫌いでなくなる転機だった。
      テンプレートも少し使ったが、主に同じ関数のバリエーションごとに大量の分岐を書かなくて済ませるためだった。
      ラムダのおかげで、SICP 風の Lisp 系の先生たちから最初に教わったやり方でコードを書けるようになった。
      unique_ptr を使うと、アロケーションも嫌ではなかった。
    • ある機能を覚えたばかりの人が、それを使いたいがために書いたひどいコードをたくさん見てきた。
      そうではなく、まずコードをどう使うかを考え、そのうえで何らかの機能が問題を解いてくれるなら使うべきだ。
      問題 → 解決策であって、その逆ではない。
      たとえば C++ のテンプレートは概してひどいが、コンパイル時のダックタイピングや、sizeof() に基づいてパディングを自動追加するようなものは、ときどき非常に役立つ。
    • 自分の C++ 体験もまさにこれだった。
      最初は C# プログラマーとして、組み込みプロジェクトのために C を学んでいたのだが、流れはまったく同じだった。
      C++ には、アプリケーションにぴったりはまれば強力に見える素晴らしい機能がたくさんある。
      しかし新機能を試すたびに、自分のやろうとしていることはいつもその状況では動かない境界ケースで、何時間も、あるいは何日も試した末に諦め、結局ただ C で書いていた。
    • C++ も大半の技術と同じで、きちんと学ぶ努力をすればよりうまく動く。
      もちろん Python や Ruby のように、この傾向から外れる言語もあるにはある。
    • ChatGPT や Copilot は、そういう部分でかなり助けになる。
      たいていエラーテキストをコピーして、解読させている。
  • C++ は本当に面白いし、人々の不満は文脈に大きく左右されると思う。
    多くの C++ 開発者はこの言語を嫌っているが、実際にはその嫌悪の向きが間違っていることがある。
    実のところ、ソフトウェアをそれほどうまく扱えなかった人たちが作ったレガシー製品を相手にしている場合が多い。
    自分も Rust で似たような経験をした。会社の既存の Rust プロジェクトに投入されたのだが、古いコードベースの中に互いに衝突する慣習がたくさんあった。
    うまく合成できないエラー処理型、悪いクラス抽象化、不要な unsafe ブロックなどがあり、これまで担当したプロジェクトの中で最も苦痛だった。
    Rust のせいにするのは簡単だが、実際には単に悪いソフトウェア開発だった。
    C++ に欠点があるのは確かだが、人々が感じる苦痛のかなりの部分は、どの言語で書いてもひどいものになっていたであろう悪いコードを扱っているからだ。

    • C を除くほぼすべての他の言語では、v[x]=y を書くたびに任意のメモリ破壊を招くわけではない。
      C++ の std::optional は、v が空のときに *v を呼ぶと未定義動作になる。
      optional の要点は空かもしれない値を保持することなのに、optional が空のときに最もよく行う操作に、なぜ未定義動作を入れるのか理解しがたい。
      C++ をかなり使ってきた立場からすると、問題はプロジェクトのすべてのプログラマーが、100% の時間、100% 完璧でなければならない点だ。
      メモリチェッカーや STL のデバッグモードを走らせることはできるが、リリースでもそれを走らせないなら、テストスイートが愚かな、あるいは悪意あるユーザーがやり得るあらゆる奇妙なことを突いてくれるのを期待するしかない。
      ソフトウェアがこれほど重要になった時代に、Rust が C++ に近い性能を出せるように見えるなら、基本機能の多くを安全に使うのが非常に難しい言語を使う価値があるのか疑問だ。
      しかも状況はさらに悪くなっていて、空の std::function の呼び出しは assert を投げていたが、新しい std::copyable_function はこれを未定義動作にしてしまった。
    • この意見には同意しにくい。
      型システムは苛立たしいし、だからといってまともなメモリ安全性が得られるわけでもない。
      最も厄介な構文解析は本当に厄介で、ポインタの崩壊のような C から受け継いだ奇妙な点もそのままだ。
      その上に std::array のような新しい解決策を重ねながら、古いやり方をなくすことはできていない。
      実際のモジュールインポートシステムをまねようとしてプリプロセッサに依存し続けているのも問題で、そのせいでクラスコードの構成や pimpl イディオムのような回避策が付いてくる。
      本質的に欠点があまりに大きく、多すぎるので、もはやその中に美しさを見つけるのは難しい。
    • その通りだが、言語が複雑であればあるほど、理解不能な混乱を作るのははるかに簡単になる。
      一方で、単純な blub 言語のプロジェクトは、コードベースの状態に関係なく、かなり簡単に読み解けることが多い。
    • 古いものではあるが、なかなか笑える C++ FQA は参考になる: https://yosefk.com/c++fqa/
  • C++に楽しさを感じる人がいるのはいいことだけど、個人的には20年以上付き合った末に、もうC++は終わりにしたい
    単にめちゃくちゃだ
    本当に低レベル制御が必要なら欠点があってもCを扱うし、そうでなければRustやPythonなどのほうがずっと自分を幸せにしてくれる

    • 同意する
      それでもC++は残り続けるだろう
      その言語で書かれたコードがあまりに多く、確実に身につけておく価値のある技術であり、かなり稼げる仕事もある
      自分にとっては、言語があまりにも邪魔で、過度に複雑に感じる
      「モダンC++」は素晴らしく、古いバージョンは学ぶ必要がなく、新しいバージョンごとにより単純になっている、という言説は知っている
      問題は、実際に担当するコードベースがモダンC++ではないという点だ
      これまでに出たあらゆる機能が使われていて、難しく、落とし穴だらけだ
      何年も自分のプロジェクトだけでC++をやってきた人なら、ある程度の専門性を身につけて複雑さに耐性ができるかもしれないが、本当に良い言語ではない
    • 時間が経つにつれてC++をより耐えやすくした要素の一つは、大部分を、自分が考えた通りに動作し、その動作が十分に定義された実装へ自然に置き換えやすくなった点だ
      中核的なデータ型や標準ライブラリなどを置き換えるようなやり方だ
      特にC++20以降は、置き換えの基盤がかなりネイティブで表現力のあるものに感じられる
      私が見る新しいC++プロジェクトのかなり多くは、この方向性を強く採っている
      アプリケーションのためのシステムレベルのドメイン固有言語を簡単に作れることは、C++の強みだ
    • C++/SDL2で作っていたUltima派生プロジェクトでは、C++の機能をいくつかだけ取り入れていた
      残念ながら完成できなかったが、覚えているのはクラス、std::functionstd::unordered_mapstd::stringstd::unique_ptrくらいだ
      似たスタイルでなければ、他人のコードを読むのは想像しにくい
      大規模プログラムを職業として書いていないので、Visitorパターンのようなプログラミングパターンを越えるのが一番難しかった
      C++はC++11で止まってくれればよかった
      委員会はいま、あらゆるものを言語に入れたがっているように見え、C++はあらゆるニッチなプログラミングスタイルを支援する超巨大言語のように見える
    • C++は完全にめちゃくちゃだ
      だが面白いめちゃくちゃさで、私はC++で書くのが好きだ
      ときにはそれが重要だ
      Rustとの関係はずっと冷めている
      Rustを尊重しているし、特に仕事のようにC++の使用を擁護しにくい文脈では、Rustが正しいと思えば使うし、Rustがやっていることは重要だと思う
      しかし、これまでかなり多くのRustプロジェクトをやってきたにもかかわらず、書いていて退屈に感じる
      本質的な面ではより優れているが、少なくとも自分にとっては楽しさが少ない
    • RustもCと同じ制御力と低レベル性を提供しようとする言語ではないのか?
      unsafeの封印を解けば整数をポインタへ明示的にキャストできるし、例えばメモリマップドI/Oでハードウェアを制御することもできるのでは?
  • この記事は範囲の広い長い大演説で、「C++」という文字だけでも人々を刺激して、多くの部分が無視されかねない
    自分も時々そうだ
    不満は「It's Not All Puppies and Butterflies」の部分へ飛べばよい
    著者はC++11に大きな感銘を受けていて、ほぼ20年にわたって意図的にC++を無視した後、私も似たように感じた
    試して遊べるパッケージやライブラリを紹介してくれた点は良いが、それでも別のライブラリを自分のプロジェクトに入れるのは、しばしば苦痛だ
    単一ファイルのヘッダーが思い浮かぶ
    FTXUIは興味深い
    そして本当にcppreference.comはすごい
    Pythonのドキュメントもかなり良いが、cppreference.comほど良いドキュメントは見たことがない

    • cppreference.comは、その名の通りリファレンス文書として非常に優れている
      Pythonのドキュメントはあちこちに散らばっていて、多くの箇所で不完全であり、一貫した文体編集スタイルも不足している
      ただしDiataxisフレームワークの基準では、リファレンス文書だけでなく複数の種類の文書をかなりよく包含している
      その文書を書く人たちは、このフレームワークを明示的に考慮しながら改善の方向を探っている
      それでも、コード開発とほとんど同じように動く、ボランティアベースのオープンソース作業ではある
    • 学校と大学でC++を学んだ後、すぐ仕事ではPython/JavaScriptへ移ったが、この記事のおかげで知らなかったC++の内容をかなり補えた
      しばらく「システムにより近いところ」へ行きたいと思っていて、横でRustを学ぶのも簡単ではなかった
      この記事を見ると、C++をもう一度身につければ可能かもしれないという希望が湧いてくる
      さようならCMake……いや、たぶんMesonと言うべきかもしれない
  • 才能あるチームが**モダンC++**をうまく使える状態で新しいプロジェクトを始めるなら、C++は素晴らしいという点に同意する
    楽しく強力な言語で、性能がよく、複雑ではあってもデバッグと最適化は比較的直感的だ
    約5年もののコードベースで働く機会があったが、C++11以降の基準で書かれていて、記事で述べられているいくつもの理由から非常に楽しかった
    一方で、20〜30年かけて進化してきた古いコードベースや、腕の立つ人たちが保守していないコードベースなら、まったく別の体験になるだろう

    • 開発者人生はPHPで始まり、特殊なデータ型用のプラグインが入ったカスタムWordPressテーマを作りながら仕事を覚えた
      21歳のとき会社が学費を出すと言ってくれたので、コンピュータサイエンスの学位課程に戻り、後に計算機科学へ変更した
      「プログラミング入門」の授業初日にC++に触れた瞬間、恋に落ちた
      当時使っていたPHP 7に比べて、型システム、デバッグ、エコシステムが素晴らしかった
      マネージャーの許可を得て、既存のイントラネットアプリの一部にC++ベースのAPIを作り、PHPがWebSocketで呼び出すようにし、型システムと性能を活用できた
      それらのシステムはいまも会社全体で毎日使われており、保守も問題ではなかった
      IBM Pase for iというかなり特殊な環境で動いているにもかかわらず、そうだった
      今はRustとAxumを使ってみた後なので、そういうAPIを作るときはRustエコシステムのほうをずっと好むだろうが、C++も評価されるべきだ
      特にTypeScriptではないJavaScriptやPHPのようなWeb言語から来るなら、本当に素晴らしい言語だ
    • 20〜30年にわたって進化してきた、あるいは腕の立つ人たちが保守していない古いコードベースという条件で、ひどくない他の言語は思い浮かばない
      実際、思いつくいくつかの可能性、例えばC、Java、FortranよりはC++を好むと思う
      例外はC#かもしれないが、その条件に入るほど古いのかは分からない
  • C++ に組み込みの正規表現が入り、かなり良いと言われる一方で、std::regex は良いとは言いにくい
    性能が悪く、Unicode 対応も不十分なので、一般的には避けたほうがよい

    • うちの会社で使っているリンターも、std::regex を使わないよう強制している
    • 性能低下を招く仕様上の問題があるのか気になる
  • C++ を学び、楽しみもしたが、深く入り込むことはなかった
    いつも C のほうが好きだったし、もともと Dune のゲームエンジンや Unix ユーティリティのように、C をよりよく学ぶために読める最上級のコードベースも多い
    最近 Rust を少し触ってみると、C++ を使う強い理由があまり見えない
    関数型プログラミングに着想を得た強力な型システムと性能の組み合わせは打ち負かしにくく、ほぼ完璧な言語のように思える
    それでも C++ を使わざるを得ないレガシーな理由は確かにあるはず
    ゲームエンジン、組み込みプログラミング、別種のレガシーな結合といったものかもしれない

    • 仕事では C++ と Rust を行き来しながら使っているが、正直なところ現代の C++20/23 では、Rust をほぼ真似る形で多くの痛点が修正されつつある
      新しい C++ コードベースなら、かなりきれいに作ることはできる
      ただ、この時点で新しいソフトウェアをなぜ C++ で作るのかは、あまり理解できない
      C++ には面倒な点が多い
      ライブラリ/パッケージ管理は標準化されておらず、ヘッダーはコードの重複であり、標準ライブラリは実装によって異なり、ほとんど読みにくい
      標準には奇妙な挙動があり、人々は未定義動作に依存していながらそれに気づかず、初期化前の使用問題があり、所有権の問題や誤った参照カウントによるメモリリークが微妙に発生する
      すべてをデフォルトではなく const にしなければならず、noexcept を保証するには呼び出すすべてのものの例外を確認しなければならず、標準ライブラリの処理中のエラーは読みづらい
      オブジェクト指向色の強いコードは、実質的に技術的負債である
      C++ の LSP は Rust のように抽象構文木を確認して定義を見つける構造的な方式ではないため、探索やコードベースの把握が遅い
      Rust は nostd を第一級のものとして明示的にサポートしているが、C++ で標準ライブラリを無効にするにはコンパイラごとのフラグが必要で、正しくできたか確認しにくい
      なので、組み込みだから C++ を使うという理由は、自分には説得力が弱い
      Rust にも bevy のようなゲームエンジンはあるが、まだ新しく、望むなら Godot のスクリプティングに Rust を組み合わせることもできる
      低レベルオーディオも Rust で同じように簡単で、単一のクレートでクロスプラットフォーム対応が可能
      全体としては、レガシーコードと変化へのためらいが核心だと思う
    • レガシーは C++ で書かれたアプリだけでなく、さまざまな次元で途方もなく大きい
      ユーザー数、公開され利用可能な知識や資料、書籍、講義、ブログ、記事、動画、ソフトウェアライブラリ、そしてもう一つの巨大な言語である C との高い互換性まで含まれる
      この分野に数年以上いる人にとっては、ソフトウェア業界の一般常識に近い
      私は C++ をたくさん使ったことがないので、まともな初心者とも言いがたいが、以前に言語の生みの親である Bjarne Stroustrup や Scott Meyers などの古典的な C++ の本を買って読んで、ある程度理解したことはある
      ただし C は、成功した商用製品を含め、数年間プロダクションでかなり使ってきた
      https://www.stroustrup.com/applications.html
      https://www.stroustrup.com
      https://en.m.wikipedia.org/wiki/Bjarne_Stroustrup
      https://en.m.wikipedia.org/wiki/Scott_Meyers
    • 低レイテンシが必要だが、正確性はそれほど気にしない場合には C++ が理にかなう
      だからゲーム開発が最も長く C++ に残ると思う
      0.001% のユーザーでセグメンテーション違反によりゲームが落ちたとしても、「だから何だ」という感じだ
    • 超高速取引も可能性がある