**********************************************************************
ワーク S4-b
テーマ:最近のCとC++を振り返る
講師:間瀬 順一 (株式会社アイシン)
日時:2022/9/2 12:30~13:43
参加人数:約16名(現地とハイブリッド合わせて)
**********************************************************************
12:30 開始
○講師(間瀬)からの話
・現状把握(使用率)
	・TIOBEによると...Pythonが首位、続いてC、C++
	・IEEEによると...Python、C、C++
	・2/3のプロジェクト(組み込みの現場)で、CとC++が主力言語として使われている。
	・なぜCとC++が使われているのか:組み込み製品のベースがCで構成されている。
	・まとめ:組込みソフト開発は流用することが多く、流用元がCで書かれているからそのままCを使っている。
		 小回りの利く言語を使うことが合理的
		 法規制や機能安全規格を考えるとCもしくはC++が蓄積あり。
・Cの現状
	・Cの歴史:名前「C」は、アルファベット「B」の次であるため1972年に開発されたため、生誕50周年
	・間瀬   :1988年からプログラムを触り始める。
	・ガイドラインの必要性
		・if文の本文は単文でも複文でも良いが、本文を単文で書いた場合、
	 	 文を追加するとインデントと実際の動作が合わなくなるため、
		  本文を複文にするようなガイドラインを導入する必要がある。
	・ガイドライン「MISRA-C」
		・Cの好ましくない書き方についてノウハウが集約されている。
		・自動車業界を中心に活用されている。
		・このようなガイドラインが確立していることがCの普及を促している。
	・車載開発におけるCバージョン
		・C90:多くの車載開発で現役
		・C99:車載で良く採用されている機能の例
			・1行コメント、inline関数
		・C11:車載向けのコンパイラは未対応のものが多い、MISRA C:2012 Amendment2が対象バージョンに加える
	・多くの開発ではC90を採用
		・車載開発では多くのプロジェクトでC99以降の機能を使っているとは言い難い。
	・C99で導入された機能
		・関数の引数などで指定した個数のローカル配列が宣言できる。
		・for文の制御式の中で変数が宣言できる。
		・ローカル変数の宣言をブロックの先頭で行う必要はない。
		・しかし、これらが実際に使われているところをほとんど見たことが無い。
	・Lepton先生のCの強化書
		・C90は普及したが、C99については普及していない、という見解は一致
	・C11で導入された機能を抜粋して紹介
	・Cの現状について(まとめ)
		・ISO化以前は方言が多く業界として困っていた。C90は業界として歓迎していた。
		・一方、C99/C11でいくつかの機能が導入されたが、C++コメント、インライン関数以外はほとんど使われていない。
		・メリット:言語仕様が安定していること
		・将来はアセンブラ言語に近い立場で生き残っていくだろう
・C++の現状
	・Cと比較すると、業界として新しい機能の取り組みに積極的である。
	・C++の歴史:実装技術に対応するため言語仕様字体を3年おきに改定する計画がある。
	・C++導入のメリット
		・オブジェクト指向が導入しやすい。
		・型については言語文法としてCより厳密になっている。
		・新しい言語の考え方が導入されている。
		・ガイドラインが整理されている。
	・C++のデメリット
		・言語仕様が巨大
		(例):Stroustrupが記した“C++ Programing Language Third Edition”1997年発行でも910ページある。
	・ガイドライン
		・MISRA C++:2008
			・2008年7月 MIRA Limited発行(初版から改版されていない)
			・C++のベースはC++03
			・228ガイドライン:C++の言語仕様の大きさがガイドライン数に反映されている
			・MISRA Forumによると新しい版がレビュー中
		・AUTOSAR C++14
			・車載ではメインで使用されている
			・ガイドラインのベースはMISRA C++
	・C++11で導入された機能(講師が考える影響の大きい機能は以下の6つ)
		・Auto(型推論):変数の型を初期化子から推論できる。
		・範囲for文:ガイドラインには範囲for文を推奨していると受け取れる記述あり。
		・ラムダ式:簡易的な関数オブジェクトをその場で定義するための機能
		・Constexpr:汎用的に定数式を表現するための機能
		・Nullptr:ヌルポインタ値を表すキーワード
		・テンプレートの右山カッコ:C++03では、2つ以上連続する右山カッコが出現する場合には間にスペースを入力必要があった。
	・C++14で導入された機能
		・2進数リテラル:0bもしくは0Bを付けることによって2進数を表す値を記述できる。
		 Java、Pythonで同じ構文が採用されている。
		・数値リテラルの桁区切り文字
		  整数リテラルと浮動小数点リテラルに途中にシグナルクォーテーションを入力することで値を読みやすくできる。
	・C++11/C++14のまとめ
		・現代的な言語仕様の取り組み、可読性の向上、性能の最適化の3つの点で優れた仕様変更を多く含んでいる。
		・ガイドラインも新機能について好意的に取り扱っている場合が多い。
		・しかし、もともと大きな言語仕様がさらに大きくなってしまった。
	・C++11/C++14の世間動向
		・最近のアルゴリズムの教科書ではC++11で記載されるものが出てきた。
		(例):「問題解決力を鍛える!アルゴリズムとデータ構造」
	・動的なメモリ管理をどうするか
		・動的なメモリ管理の必要性
		・デメリット:動的なメモリ管理ではメモリリークが発生する可能性がある。
		・ガーベージコレクション:メモリリークを避けるためにプログラマがメモリを管理するのではなく
					 使われていないメモリを環境側で判断して解法する仕組みが取り入れられた。
	・スマートポインタの導入:参考(https://qiita.com/hmito/items/db3b14917120b285112f)
		・AUTOSAR C++14 では、A18-5-2でスマートポインタの導入を要求している。
		・所有権を持つポインタがただ一つであることを保証する(unique_ptr)
		・複数の所有権を持つポインタ(shared_ptr)
		・循環参照を対策したポインタ(weak_ptr)
	・実際のC++動的メモリ管理運用
		・C++11以降で定義されたスマートポインタを使用する。しかし知っている技術者が少ないという懸念がある。
		・現代的な感覚では、スマートポインタに移行するべき。
	・結局C++を何に使うのか
		・GUI、高度なアルゴリズムの応用、C++の既存資産が多い分野、動的なコンポーネントの結合
	・C++の現状について(まとめ)
		・新しいパラダイムを言語仕様として積極的に取り入れられており、ガイドラインも新しい言語仕様の利用を促している。
		・Better Cとして活用する、C++11以降の機能を積極的に活用する。
〇質疑応答
<質問者1>
C++17はすぐ産業に使えるのか?
<回答>
C++17はガイドラインが追い付けば使える
13:43 終了
■参考情報
スマートポインタの導入:https://qiita.com/hmito/items/db3b14917120b285112f
以上