HN 日本語サマリー

← 一覧へ戻る
プログラミング

CobaltC – Cの後継か?

CobaltC – The Successor to C? (strawberry9.github.io)

11 pointsby SilentLambda14 コメント

要約

CobaltCは、明示的な所有権、決定論的な破棄、コンパイラチェック済みの借用、推論されたライフタイムなどを特徴とする、静的型付けのシステムプログラミング言語です。ガベージコレクションを必要とせず、メモリ安全性と予測可能なリソース管理を重視し、低レベル機能との制御された相互作用を可能にします。

全文翻訳

1. はじめに CobaltCは、静的型付けのシステムプログラミング言語であり、以下の機能を提供します。 明示的な所有権 決定論的な破棄 コンパイラチェック済みの借用 推論されたライフタイム 明示的なnull許容性 境界安全な操作 構造化されたエラーハンドリング 安全な並行処理 明示的なunsafe操作 明示的な外部関数インターフェース この言語は、予測可能なリソース管理、強力なメモリ安全性、ネイティブ実行、および低レベル機能との制御された相互作用を必要とするソフトウェアを対象としています。CobaltCは、トレーシングガベージコレクションを必要としません。 2. 規範用語 "MUST"、"MUST NOT"、"SHOULD"、"SHOULD NOT"、"MAY"という言葉は規範的です。 実装定義とは、実装が動作を選択し、その選択を文書化することを意味します。 未定義の動作とは、この仕様が要件を課さない動作を指します。 安全なCobaltC操作は、通常の利用によって未定義の動作を導入してはなりません(MUST NOT)。 3. ソースファイル CobaltCプログラムは、1つ以上のソースモジュールで構成されます。 ソーステキストはUnicodeです。 識別子はケースセンシティブです。 空白は、必要に応じて字句トークンを区切りますが、それ以外の場合は意味を持ちません。 4. コメント CobaltCは、行コメント(// comment)とブロックコメント(/* comment */)をサポートします。 コメントは意味を持ちません。 5. キーワード 以下のキーワードは予約されています。 as break case const continue defer else enum extern false fn for if import in interface loop match move mut null return static struct true type unsafe while let is not はCobaltC 1.0のキーワードではありません。 6. 識別子 識別子は、Unicodeの識別子開始文字で始まり、後続の識別子文字と数字を含むことができます。 識別子はケースセンシティブです。 したがって、以下のものは異なる名前を表します。 value Value VALUE 7. リテラル CobaltCは、以下のリテラルを提供します。 整数リテラル 浮動小数点リテラル 文字リテラル 文字列リテラル ブールリテラル null 数値リテラルは、実装がサポートする区切り文字を使用してもよいですが、区切り文字は値を変更しないものとします。 8. モジュール モジュール宣言の形式は以下の通りです。 module example; モジュールは名前空間を確立します。 モジュールは、他のモジュールからの宣言をインポートしてもよいです。 import io; 名前解決は字句的であり、モジュールを認識します。 解決されない名前は、コンパイル時エラーとなります。 9. 宣言 CobaltCは、以下の宣言を提供します。 const static type struct enum interface fn 宣言は、適用可能な字句的またはモジュール名前空間に導入されます。 内部宣言は、許可される場合、外部宣言をシャドウしてもよいです。 10. 変数 変数は次のように宣言されます。 i32 count = 0; ミュータブルな変数は次のように宣言されます。 mut i32 count = 0; 初期化されていない宣言も許可されます。 i32 result; しかし、resultは読み取られる前に初期化されなければなりません(MUST)。 11. 定数 定数は次のように使用されます。 const i32 maximum = 100; 定数初期化子は、実装の定数式要件を満たさなければなりません(MUST)。 定数はミュータブルにできません。 12. 基本型 CobaltCは、以下の型を定義します。 bool char i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 isize usize f32 f64 固定幅整数型は、指定された幅を正確に持ちます。 isizeとusizeはポインタサイズの整数型です。 13. 複合型 CobaltCは、以下の型をサポートします。 structs enums tuples arrays function types managed references raw pointers generic types interface-constrained types 構造体と列挙型は名義型です。 型エイリアスは新しい名義型を作成しません。 14. マネージド参照 表記 T* は、マネージドな非null参照を表します。 表記 T*? は、null許容なマネージド参照を表します。 マネージド参照は、所有権、借用、ライフタイムチェックに参加します。 15. 生ポインタ 生ポインタは、raw T* のように表されます。 生ポインタは、通常のマネージド所有権およびライフタイム保証の外部にあります。 生ポインタのデリファレンスおよび無制限のポインタ操作には、unsafeコンテキストが必要です。 16. ミュータビリティ ミュータブルなバインディングは、所有権または借用のルールが操作を禁止しない限り、そのバインディングを通じてミューテーションを許可します。 ミュータビリティはエイリアスルールをオーバーライドしません。 例えば、ミュータブルな所有者を持っていても、互換性のない借用がアクティブな間はミューテーションを許可しません。 17. 型の互換性 代入、関数引数、および戻り値は、互換性のある型でなければなりません(MUST)。 暗黙的な変換は、以下をサイレントに行ってはなりません(MUST NOT): null許容性を削除する 所有権を作成する 所有権を破棄する ミュータビリティに違反する ライフタイム保証を無効にする unsafeな再解釈を実行する 明示的な変換機能は提供されてもよいです(MAY)。 18. 型推論 CobaltCは、言語の文法とコンテキストが一意な型を確立する場合に推論を許可します。 推論は、以下の関連するすべての意味論的な区別を維持しなければなりません(MUST): 所有権 ミュータビリティ null許容性 借用 ライフタイム 推論は、unsafeな操作を安全に見せてはなりません(MUST NOT)。 19. ジェネリック型 ジェネリック型と関数は静的にチェックされます。 例: fn identity<T>(T value) -> T { return value; } ジェネリックエンティティが使用される前に、ジェネリック制約を満たさなければなりません(MUST)。 20. インターフェース インターフェースは、必要な操作を定義します。 例: interface Printable { fn print(); } ジェネリック制約は、実装を要求することがあります。 T: Printable コンパイラは、要求されたインターフェース操作が存在することを確認しなければなりません(MUST)。 21. 構造体 構造体は、名義集計を定義します。 struct Point { i32 x; i32 y; } 構造体フィールドには宣言された型があります。 所有フィールドは、囲む値の所有権および破棄セマンティクスに参加します。 22. 列挙型 列挙型は、有限のバリアントセットを定義します。 enum Status { Ready, Running, Failed } バリアントは、関連値を含んでもよいです(MAY)。 enum Result<T,E> { Ok(T), Err(E) } 23. タプル タプルは、固定数の値を組み合わせます。 タプル要素は独立に型付けされます。 タプルの所有権は、その要素の所有権ルールに従います。 24. 配列 配列は、固定数の要素を含みます。 T[N] 長さは配列型の一部です。 安全なインデックスアクセスは、有効な範囲内に留まらなければなりません(MUST)。 25. 関数 関数は次のように宣言されます。 fn add(i32 a, i32 b) -> i32 { return a + b; } 引数の数と型は、関数シグネチャと一致しなければなりません(MUST)。 所有権と借用の要件は、引数と戻り値に適用されます。 26. 式 式は、値を生成するか、操作を実行します。 主要な式カテゴリには以下が含まれます。 名前 リテラル 呼び出し 構築 メンバーアクセス インデックスアクセス 借用 単項演算子 二項演算子 代入 27. 演算子の優先順位 最も高いものから最も低いものへ: レベル 演算子 1 呼び出し、インデックスアクセス、メンバーアクセス 2 !, 単項 +, 単項 -, move, borrow 3 *, /, % 4 +, - 5 <<, >> 6 <, <=, >, >= 7 ==, != 8 & 9 ^ 10 | 11 && 12 || 13 代入 二項演算子は、特に指定されない限り左結合です。 代入は右結合です。 28. 算術演算 整数および浮動小数点演算は、それぞれの型のセマンティクスに従います。 必要な結果を安全に生成できない操作は、型の指定されたオーバーフローまたは失敗セマンティクスに従わなければなりません(MUST)。 安全な算術演算は、メモリ破損をサイレントに生成してはなりません(MUST NOT)。 29. 等価性 等価性は、互換性のあるオペランドを必要とします。 値の等価性は、型の等価性セマンティクスに従って値を比較します。 ポインタの同一性が明示的に要求される場合、ポインタの等価性は参照先を再帰的に比較するのではなく、同一性を比較します。 30. 代入 代入には、有効なミュータブルな宛先が必要です。 複合代入は、対応する算術演算またはビット演算に従います。 代入は、操作がmoveを構成しない限り、所有権を暗黙的に転送しません。 31. 関数呼び出し 呼び出しは、以下の場合にのみ有効です。 関数が解決可能である 引数の数が正しい 引数が互換性のある型である 所有権の転送が有効である 借用が有効なままである ジェネリック制約が満たされている 32. 条件実行 CobaltCは、以下を提供します。 if condition { ... } else { ... } 条件は、ブール条件の要件を満たさなければなりません(MUST)。 33. ループ CobaltCは、以下を提供します。 while for loop breakは、適用可能なループを終了します。 continueは、次のイテレーションを開始します。 34. マッチ パターンマッチングは、matchによって提供されます。 match value { Some(x) => use(x), None => use_default() } 網羅的に既知のバリアントセットに対するmatchは、すべての可能なケースを処理しなければなりません(MUST)。 コンパイラは、統計的に