プログラミング
C3 0.8.2 小さな改善
C3 0.8.2 a Modest Improvement (c3-lang.org)
要約
プログラミング言語C3のバージョン0.8.2がリリースされました。このバージョンでは、ライブラリ向けの再利用可能なターゲットテンプレートやジェネリックconstdefなどの言語エルゴノミクス改善、新しいリフレクション機能、およびバグ修正が含まれています。特に、ライブラリがビルド設定を共有しやすくなるテンプレート機能や、ジェネリックインスタンスを検査できるリフレクション機能が追加されています。
全文翻訳
C3 0.8.2 小さな改善
C3 0.8.2 がリリースされました。このリリースでは、ライブラリ向けの再利用可能なターゲットテンプレートやジェネリックconstdefといった言語エルゴノミクスの改善、新しいリフレクション機能、そして一連のバグ修正がもたらされました。0.8.1と比較すると、かなり控えめなリリースですが、とにかく新機能は以下の通りです。
言語の変更と改善
ライブラリ向けの再利用可能なターゲット設定
ライブラリはマニフェストにテンプレートマップを公開できるようになり、プロジェクトは template: "library/template" を使用してターゲットにそれをプルできるようになりました。テンプレートのプロパティは最初にロードされ、ターゲットローカル設定がそれをオーバーライドするため、ライブラリはすべてのユーザーにコピー&ペーストのセットアップを求めるのではなく、合理的で共有可能なビルド設定を提供できます。
ジェネリックのリフレクション
Foo::is_generic(...), Foo::generic_qname, Foo::generic_args により、ジェネリックインスタンスを検査できるようになりました。
alias Foo = List{int};
fn void main() {
typeid t = List{String}::generic_args[0]; //String::typeid
String name = Foo::generic_qname; // "std::collections::list::List"
bool x = Foo::is_generic(List); // true
bool y = int::is_generic(List); // false
}
ビット構造のプロパティ
ビット構造メンバーに bitoffset と bitsize プロパティが追加されました。
bitstruct Foo : uint {
uint a : 0..1;
bool b : 6;
bool c : 10;
int d : 14..20;
}
fn void main() {
int a = $reflect(Foo.a).bitsize; // 2
int b = $reflect(Foo.d).bitoffset; // 14
int c = $reflect(Foo.c).bitoffset; // 10
}
@param オプション: own, init, drop
in/inout/out 以外に、パラメータに注釈を付けることが可能になりました。
own は、関数が関数のスコープを超えて変数を保持することを意味します。drop は、ポインタとそのポインタが指すデータが関数から返されるときに無効になることを意味します。init は、ポインタが指すデータが関数によって初期化されることを意味します。これはコンパイラが静的解析に使用でき、関数やマクロを文書化することもできます。
<* @param [own] f *>
fn void foo(Foo* f) {
some_global.foo = f;
}
Asm スタックアライメント
0.8.2 より前は、すべての asm ブロックはスタックアラインメントされていましたが、これは C の動作と一致しませんでした。これは現在修正されています。スタックアラインメントは @align を使用してオプトインできるようになりました。
asm // Unaligned
{
syscall;
}
asm @align // Stack aligned
{
syscall;
}
Windows の改善
Windows サブシステムを直接設定できるようになりました。Windows は依然として @winmain を使用してウィンドウサブシステムを暗黙的に設定できますが、すべてのサブシステムが利用可能になり、EFI アプリケーションなどのものも可能になります。
標準ライブラリ
Atomic.compare_exchange が追加されました。array::contains_slice および array::index_of_slice が、配列に対する部分文字列検索のために追加されました。log::register_dynamic_category は、ライブラリが独自のログカテゴリを動的に定義するために使用できます。String.index_of および rindex_of は、空文字列の検索も受け入れるようになりました。
修正
標準ライブラリの修正
Denormal (subnormal) 結果が String.to_double() で正しく処理されるようになりました。浮動小数点数の最小値に近い非常に小さな値が以前は間違って出力されていました。大文字の F サフィックスを持つ float リテラルは、float ではなく double として誤って型付けされていました。JSON シリアライゼーションは、Unicode と \v を正しく処理するようになりました(#3353)。IPv6 解析:「a::b:c:d:e:f:0」が有効な IPv6 文字列として受け入れられるようになりました。BackedArenaAllocator の破壊時に回帰が発生し、クラッシュを引き起こす可能性がありました。macOS の回帰がスタックトレースを壊していたのを修正しました。
コンパイラの修正
$stringify が時々余分な括弧で出力をラップしていました。エイリアスを持つ constdef vector が誤って低下されていました。struct を untypedlist に連結するとコンパイラがアサートしていました。untypedlist は、enum の連想値型またはポインタとして無効であることが検出されませんでした。
感謝
このリリースも、C3 コミュニティなしでは不可能でした。問題提起、PR、そして単なる議論を通じて貢献してくださったすべての方々に、心から感謝いたします。
このリリースでの PR 貢献者
標準ライブラリ: AtomicSynth, Book-reader, GuineaPigUuhh, Manu Linares
コンパイラとツールチェーン: Book-reader, Johannes Müller, Manu Linares, Osama Badeeb, rickyadastra, Rodrigo Camacho
CI/インフラストラクチャ: Hade, Manu Linares
変更ログ
完全な変更ログはこちらをクリック
変更/改善
@weak がすべての宣言で機能するようになりました。asm ブロックのスタックアラインメントのために @align を追加しました。スタックアラインメントはデフォルトではなくなりました。Windows サブシステムを直接設定できるようになりました。ビット構造メンバーに bitoffset と bitsize のリフレクションプロパティを追加しました。#3219 char 配列から String へのキャストを試みる際のエラーメッセージを改善しました。#3343 Foo::is_generic(...), Foo::generic_qname, Foo::generic_args を追加しました。#2909 #3329 own, init, drop パラメータ注釈を追加しました。constdef はジェネリック化できるようになりました。ライブラリは、マニフェストでテンプレートマップを介して再利用可能なターゲット設定を公開できるようになり、プロジェクトはターゲットから template: "library/template" を使用して参照できます。テンプレートのプロパティは最初にロードされ、ターゲットローカル設定でオーバーライドできます。
標準ライブラリの変更
Atomic.compare_exchange を追加しました。array::contains_slice および array::index_of_slice を追加しました。String.index_of および rindex_of は、空文字列の検索を受け入れるようになりました。log::register_dynamic_category を追加しました。これは、ライブラリが独自のカテゴリを動的に定義したい場合に使用します。
修正
$stringify が時々括弧を含んでいました。BackedArenaAllocator を破壊する際の回帰(一部の場合)#3332。IPv6 文字列として「a::b:c:d:e:f:0」は解析されませんでした。エイリアスを持つ constdef vector が誤って低下されました #3335。struct を untypedlist に連結するとコンパイラがアサートしていました #3326。untypedlist は enum の連想値型またはポインタとして無効であることが検出されませんでした #3342。オプションであり結果が代入されない &a - &b の場合のセマンティックチェックが誤っていました。macOS での回帰、スタックトレースを壊していました。
C3 に飛び込みたいですか?
ドキュメントをチェックするか、ダウンロードして試してみてください。質問がありますか?Discord でチャットしましょう。