ソフトウェア開発において「動く」ことは最低条件に過ぎません。しかし、もしそのコードが戦闘機(F-35)の操縦システムや数千億円規模の資産を制御するものだとしたら、求められるのは「動く」ことではなく「絶対に壊れない、かつ予測可能であること」です。
今回は、Lockheed Martinが策定した伝説的な規約 JSF AV C++ Coding Standards(以下、JSF規約)に焦点を当て、その厳格すぎる「バイブス(精神)」と、現代における実装例を解説します。
1. JSF規約とは何か:空の安全を支える鉄の掟
JSF AV C++規約は、Joint Strike Fighter(統合打撃戦闘機)プロジェクトのために作成された、C++のサブセット規約です。航空電子機器のような、リアルタイム性と極限の信頼性が要求される環境を想定しています。
その核心にあるのは、**「不確実性の徹底排除」**です。
JSF規約の象徴的な「shall」ルール(絶対遵守事項)
JSF規約には多くのルールがありますが、その中でも「バイブス」を象徴する制約を抜粋しました。これらは単なる推奨ではなく、違反すればレビューを通らない「掟」です。
種別 ルール番号 内容(日本語意訳) 理由(安全性観点)
shall AV Rule 27 動的メモリ確保(new/delete)の禁止 断片化・リーク・非決定論的な実行時間の排除
shall AV Rule 30 例外処理(throw/catch)の禁止 スタックアンワインドの予測不能性を防ぐ
shall AV Rule 143 再帰関数の禁止 スタックオーバーフローによるシステム沈黙の防止
shall AV Rule 111 goto文の禁止 スパゲッティコード化と論理的証明の困難さを回避
shall AV Rule 15/16 関数形式・定数マクロの禁止 型安全性の欠如と副作用の防止
shall AV Rule 49 RTTI(dynamic_cast等)の禁止 実行時コストの増大と複雑化の回避
shall AV Rule 218 ポインタ演算の禁止 未定義動作やメモリ境界越えバグの温床を断つ
2. JSF規約を体現する「バイブ・コーディング」の実装例
2026年現在のモダンなC++(C++17/20/23)の文脈を取り入れつつ、JSF規約を厳格に守ったコードはどのようになるのか。振動制御(Vibration Controller)を例に見てみましょう。
インターフェース設計:不確実性をコンパイル時に殺す
// VibrationController.hpp
#pragma once
#include <cstdint>
#include <array>
namespace Actuator {
// 定数はマクロではなくconstexprで定義(AV Rule 16)
constexpr uint32_t MAX_CHANNEL = 8U;
class VibrationController final {
public:
// コピー・ムーブともに禁止(予期せぬ複製によるリソース競合を防ぐ)
VibrationController(const VibrationController&) = delete;
VibrationController& operator=(const VibrationController&) = delete;
// 例外を投げないことを明示(AV Rule 30)
explicit VibrationController() noexcept;
// 公開関数はすべて成功/失敗を戻り値で返す(例外禁止)
bool setFrequency(uint32_t channel, uint16_t freq_hz) noexcept;
bool setAmplitude(uint32_t channel, uint16_t amp_mV) noexcept;
// 状態取得もポインタ演算を避け、参照渡しを利用
bool getCurrentState(uint32_t channel, uint16_t& freq_out) const noexcept;
private:
struct ChannelState {
uint16_t frequency_hz {0U};
uint16_t amplitude_mv {0U};
bool active {false};
};
// ヒープ(new)を使わず、スタック上の固定長配列を利用(AV Rule 27)
std::array<ChannelState, MAX_CHANNEL> channels_;
static constexpr uint16_t MAX_FREQ_HZ = 20000U;
};
} // namespace Actuator実装:防御的プログラミングの極致
#include "VibrationController.hpp"
namespace Actuator {
VibrationController::VibrationController() noexcept
: channels_() // 値初期化によるゼロクリアを保証
{
// コンストラクタ内でも防御的に初期状態を確定させる
for (auto& ch : channels_) {
ch.active = false;
}
}
bool VibrationController::setFrequency(uint32_t channel, uint16_t freq_hz) noexcept {
// 境界チェックの徹底(AV Rule 218関連:ポインタ演算を使わずインデックスで制御)
if (channel >= MAX_CHANNEL) {
return false;
}
if (freq_hz > MAX_FREQ_HZ) {
return false;
}
channels_[channel].frequency_hz = freq_hz;
channels_[channel].active = (freq_hz > 0U);
return true;
}
} // namespace Actuator
