Zigプログラミング蚀語







すばらしい蚘事である「理想的なプログラミング蚀語の䞻芳的ビゞョン」に察する最初のコメントは、Zigプログラミング蚀語ぞの参照であるこずが刀明したした。 圓然、C ++、D、およびRustのニッチであるず䞻匵する蚀語の皮類が興味深いものになりたした。 私は芋た-蚀語はきれいで、やや面癜そうだった。 玠晎らしいsiのような構文、゚ラヌ凊理ぞの独自のアプロヌチ、組み蟌みのコルヌチン。 この蚘事は、実行䞭のコヌド䟋からの圌ら自身の考えや印象が散りばめられた公匏文曞の簡単な抂芁です。



はじめに



コンパむラのむンストヌルは非垞に簡単です。Windowsの堎合、配垃パッケヌゞをいく぀かのフォルダヌに解凍するだけです。 同じフォルダヌにhello.zigテキストファむルを䜜成し、そこにドキュメントのコヌドを貌り付けお保存したす。 組み立おはコマンドによっお行われたす



zig build-exe hello.zig
      
      





次に、hello.exeが同じディレクトリに衚瀺されたす。



アセンブリに加えお、ナニットテストモヌドを䜿甚できたす。このため、コヌドでテストブロックが䜿甚され、テストのアセンブリず起動が実行されたす。



 zig test hello.zig
      
      





最初の奇劙な



コンパむラは、Windowsの改行\ r \ nをサポヌトしおいたせん。 もちろん、各システムWin、Nix、Macの改行が独自のものであるずいう事実は、荒野ず過去の遺物です。 ただし、実行するこずは䜕もないので、たずえば、メモ垳++でコンパむラに必芁な圢匏を遞択するだけです。



偶然偶然出䌚った2番目の奇劙な点-タブはコヌドではサポヌトされおいたせん スペヌスのみ。 しかし、それは起こりたす:)



しかし、これはドキュメントに正盎に曞かれおいたす-真実はすでに最埌にありたす。



コメント



もう1぀の奇劙な点は、Zigが耇数行コメントをサポヌトしおいないこずです。 私はすべおが叀代のタヌボパスカルで正しく行われたこずを芚えおいたす-ネストされた耇数行コメントがサポヌトされおいたした。 どうやら、それ以来、そのような単玔なこずをマスタヌした蚀語開発者はいたせん:)



しかし、ドキュメンタリヌのコメントがありたす。 ///で始たりたす。 特定の堎所-察応するオブゞェクト倉数、関数、クラスなどの前にある必芁がありたす。 それらが別の堎所にある堎合-コンパむル゚ラヌ。 悪くない。



倉数宣蚀



キヌワヌドconstたたはvarが最初に、次に名前、次にオプションで型、次に初期倀が曞き蟌たれるずき、ファッショナブルな今およびむデオロギヌ的に正しいスタむルで行われたす。 ぀たり 自動型掚論が利甚可胜です。 倉数は初期化する必芁がありたす-初期倀を指定しないず、コンパむル゚ラヌが発生したす。 ただし、特別な未定矩倀が甚意されおおり、初期化されおいない倉数を明瀺的に指定するために䜿甚できたす。



 var i:i32 = undefined;
      
      





コン゜ヌル出力



実隓のために、コン゜ヌルぞの出力が必芁です-すべおの䟋で、これが䜿甚される方法です。 プラグむンの分野で



 const warn = std.debug.warn;
      
      





そしお、コヌドでは次のように曞かれおいたす



 warn("{}\n{}\n", false, "hi");
      
      





コンパむラにはいく぀かのバグがあり、この方法で敎数たたは浮動小数点数を出力しようずするず正盎に報告されたす。

゚ラヌコンパむラのバグvar args関数の敎数リテラルず浮動小数点リテラルをキャストする必芁がありたす。 github.com/ziglang/zig/issues/557

デヌタ型



プリミティブ型



型名は明らかにRusti8、u8、... i128、u128から取られたもので、バむナリC互換性のための特別な型、4皮類の浮動小数点型f16、f32、f64、f128もありたす。 タむプboolがありたす。 長されロのボむドず特別な戻りがないタむプがありたすが、これに぀いおは埌で説明したす。



たた、1〜65535のビット単䜍の任意の長さの敎数型を䜜成できたす。型名は文字iたたはuで始たり、ビット単䜍の長さが曞き蟌たれたす。



 //  ! var j:i65535 = 0x0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF;
      
      





ただし、コン゜ヌルにこの倀を取埗できたせんでした-コンパむル䞭にLLVMで゚ラヌが発生したした。



䞀般に、これはあいたいですがIMHOコンパむラレベルで正確に長い数倀リテラルをサポヌトするこずは正しいですが、この方法で型を呜名するこずはあたりよくありたせんが、テンプレヌト型を介しお正盎に行う方が良いです、興味深い゜リュヌションです。 そしお、なぜ制限は65535ですか GMPのようなラむブラリは、そのような制限を課しおいないようですか



文字列リテラル



これらは、文字の配列です末尟のれロはなし。 終了れロを持぀リテラルの堎合、接頭蟞「c」が䜿甚されたす。



 const normal_bytes = "hello"; const null_terminated_bytes = c"hello";
      
      





ほずんどの蚀語ず同様に、Zigは暙準の゚スケヌプシヌケンスをサポヌトし、コヌド\ uNNNN、\ UNNNNNNNは16進数を介しおUnicode文字を挿入したす。

耇数行リテラルは、各行の先頭に2぀のバックスラッシュを䜿甚しお圢成されたす。 匕甚笊は必芁ありたせん。 ぀たり、生の行を䜜成しようずする詊みがいく぀かありたすが、IMHOは倱敗したす-生の行の利点は、任意のテキストをコヌドのどこからでも挿入できるこずです-理想的には䜕も倉曎したせんが、ここでは各行の先頭に\\を远加する必芁がありたす。



 const multiline = \\#include <stdio.h> \\ \\int main(int argc, char **argv) { \\ printf("hello world\n"); \\ return 0; \\} ;
      
      





敎数リテラル



すべおがsiのような蚀語です。 8進リテラルには接頭蟞0oが䜿甚され、Cのようにれロだけではないこずに非垞に満足しおいたす。 プレフィックスが0bのバむナリリテラルもサポヌトされおいたす。 浮動小数点リテラルは16進数にするこずができたす GCC拡匵で行われたす。



運営



もちろん、暙準的な算術挔算、論理挔算、ビット単䜍のC挔算がありたす。 短瞮操䜜がサポヌトされおいたす+ =など。 &&および||の代わりに キヌワヌドandおよびorが䜿甚されたす。 興味深い点は、ラップアラりンドセマンティクスが保蚌された操䜜が远加でサポヌトされるこずです。 次のようになりたす。



 a +% b a +%= b
      
      





この堎合、通垞の算術挔算はオヌバヌフロヌを保蚌せず、オヌバヌフロヌ䞭の結果は未定矩ず芋なされたす定数に察しおコンパむル゚ラヌが生成されたす。 私芋これは少し奇劙ですが、どうやらそれはC蚀語のセマンティクスずの互換性のいく぀かの深い考慮から䜜られおいたす。



配列



配列リテラルは次のようになりたす。



 const msg = []u8{ 'h', 'e', 'l', 'l', 'o' }; const arr = []i32{ 1, 2, 3, 4 };
      
      





文字列は、Cのように文字の配列です。 角かっこを䜿甚したクラシックなむンデックス。 配列の加算連結および乗算の操䜜が提䟛されたす。 それは非垞に興味深いこずです。連結ですべおが明らかな堎合は、乗算-誰かがこれを実装するたで埅ち続け、今は埅ちたす:)アセンブラヌでは、重耇デヌタを生成できるようなdup操䜜がありたす。 今Zigで



 const one = []i32{ 1, 2, 3, 4 }; const two = []i32{ 5, 6, 7, 8 }; const c = one ++ two; // { 1,2,3,4,5,6,7,8 } const pattern = "ab" ** 3; // "ababab"
      
      





ポむンタ



構文はCに䌌おいたす。



 var x: i32 = 1234; //  const x_ptr = &x; //  
      
      





間接参照ポむンタヌによる倀の取埗には、通垞ずは異なる埌眮操䜜が䜿甚されたす。



 x_ptr.* == 5678; x_ptr.* += 1;
      
      





ポむンタヌ型は、型名の前にアスタリスクを蚭定するこずにより明瀺的に指定されたす。



 const x_ptr : *i32 = &x;
      
      





スラむススラむス



蚀語に組み蟌たれたデヌタ構造。配列たたはその䞀郚を参照できたす。 最初の芁玠ぞのポむンタず芁玠の数が含たれおいたす。 次のようになりたす。



 var array = []i32{ 1, 2, 3, 4 }; const slice = array[0..array.len];
      
      





確かにGoから取られたようです。 たた、蚀語に埋め蟌む䟡倀があるかどうかもわかりたせんが、そのようなもののOOP蚀語での実装は非垞に初歩的なものです。



構造



構造を宣蚀する興味深い方法定数が宣蚀され、そのタむプは自動的に「タむプ」タむプずしお衚瀺され、それが構造の名前ずしお䜿甚されたす。 そしお、構造自䜓構造は「名前なし」です。



 const Point = struct { x: f32, y: f32, };
      
      





Cラむクな蚀語では通垞の方法で名前を指定するこずはできたせんが、コンパむラは特定のルヌルに埓っお型名を衚瀺したす。特に、䞊蚘で怜蚎した堎合、「型」定数の名前ず䞀臎したす。



䞀般に、この蚀語はフィヌルドの順序ずメモリ内でのそれらの敎列を保蚌したせん。 保蚌が必芁な堎合は、「パッケヌゞ化された」構造を䜿甚する必芁がありたす。



 const Point2 = packed struct { x: f32, y: f32, };
      
      





初期化-Sishny指定子のスタむル



 const p = Point { .x = 0.12, .y = 0.34, };
      
      





構造にはメ゜ッドがありたす。 ただし、構造䜓にメ゜ッドを配眮するこずは、構造䜓を名前空間ずしお䜿甚するだけです。 C ++ずは異なり、このパラメヌタヌは暗黙的に枡されたせん。



乗り換え



䞀般的に、C / C ++ず同じです。 蚀語に組み蟌たれた構文マクロドキュメントでは組み蟌み関数ず呌ばれたすによっお実装される、フィヌルドの数ずその名前など、メタ情報にアクセスする䟿利な組み蟌み手段がいく぀かありたす。



「Cずのバむナリ互換性」のために、いく぀かのextern列挙が提䟛されおいたす。



列挙の基瀎ずなる型を瀺すために、フォヌムの構築



 packed enum(u8)
      
      





ここで、u8はベヌスタむプです。

列挙型には、構造に類䌌したメ゜ッドを含めるこずができたす぀たり、列挙名を名前空間ずしお䜿甚したす。



組合



私が理解しおいるように、Zigの和集合は代数型の和です。 どのナニオンフィヌルドが「アクティブ」であるかを決定する隠しタグフィヌルドが含たれおいたす。 別のフィヌルドの「アクティブ化」は、関連付け党䜓の完党な再割り圓おによっお実行されたす。 ドキュメントの䟋



 const assert = @import("std").debug.assert; const mem = @import("std").mem; const Payload = union { Int: i64, Float: f64, Bool: bool, }; test "simple union" { var payload = Payload {.Int = 1234}; // payload.Float = 12.34; // !    assert(payload.Int == 1234); //       payload = Payload {.Float = 12.34}; assert(payload.Float == 12.34); }
      
      





ナニオンは、タグの列挙を明瀺的に䜿甚するこずもできたす。



 // Unions can be given an enum tag type: const ComplexTypeTag = enum { Ok, NotOk }; const ComplexType = union(ComplexTypeTag) { Ok: u8, NotOk: void, };
      
      





列挙䜓や構造䜓などの共甚䜓も、メ゜ッドに独自の名前空間を提䟛できたす。



オプションタむプ



Zigにはオプションのサポヌトが組み蟌たれおいたす。 タむプ名の前に疑問笊が远加されたす。



 const normal_int: i32 = 1234; // normal integer const optional_int: ?i32 = 5678; // optional integer
      
      





興味深いこずに、Zigは私が疑った可胜性に぀いお1぀のこずを実装しおいたすが、それが正しいかどうかはわかりたせんでした。 ポむンタヌは、倀の有効性の兆候を保存する远加の非衚瀺フィヌルド「タグ」を远加するこずなく、オプションず互換性がありたす。 nullは無効な倀ずしお䜿甚されたす。 したがっお、Zigでポむンタによっお衚される参照型は、「オプション」のために远加のメモリさえ必芁ずしたせん。 同時に、ヌル倀を通垞のポむンタヌに割り圓おるこずは犁止されおいたす。



゚ラヌの皮類



これらはオプションのタむプに䌌おいたすが、ブヌルタグ「本圓に無効」の代わりに、゚ラヌコヌドに察応する列挙芁玠が䜿甚されたす。 構文はオプションに䌌おいたす。疑問笊の代わりに感嘆笊が远加されたす。 したがっお、これらの型は、たずえば、関数から戻るために䜿甚できたす。関数の正垞な操䜜のオブゞェクト結果が返されるか、察応するコヌドの゚ラヌが返されたす。 ゚ラヌタむプは、Zig蚀語の゚ラヌ凊理システムの重芁な郚分であり、詳现は「゚ラヌ凊理」セクションにありたす。



タむプvoid



Zigではvoid型の倉数ずそれらを䜿甚した操䜜が可胜です



 var x: void = {}; var y: void = {}; x = y;
      
      





このような操䜜のコヌドは生成されたせん。 このタむプは、䞻にメタプログラミングに圹立ちたす。



C互換性のためにc_void型もありたす。



制埡挔算子ず機胜



これらには、ブロック、スむッチ、while、for、if、else、break、continueが含たれたす。 コヌドをグルヌプ化するために、暙準の䞭括匧が䜿甚されたす。 C / C ++のように、ブロックだけが倉数のスコヌプを制限するために䜿甚されたす。 ブロックは匏ず芋なすこずができたす。 蚀語にはgotoはありたせんが、breakおよびcontinueステヌトメントで䜿甚できるラベルがありたす。 デフォルトでは、これらの挔算子はルヌプで動䜜したすが、ブロックにラベルがある堎合は、それを䜿甚できたす。



 var y: i32 = 123; const x = blk: { y += 1; break :blk y; //   blk   y };
      
      





switchステヌトメントは、「フォヌルスルヌ」がないずいう点で挔算子ず異なりたす。぀たり、 1぀の条件ケヌスのみが満たされ、スむッチが終了したす。 構文はよりコンパクトです。矢印の「=>」が倧文字小文字の代わりに䜿甚されたす。 スむッチも匏ず芋なすこずができたす。



whileステヌトメントずifステヌトメントは、䞀般的にすべおのC蚀語に䌌おいたす。 forステヌトメントはforeachに䌌おいたす。 それらはすべお匏ず芋なすこずができたす。 新機胜のうち、whileずfor、およびifには、ルヌプの反埩がなかった堎合に実行するelseブロックを含めるこずができたす。



ここで、スむッチの䞀般的な機胜に぀いお説明したす。これは、foreachルヌプの抂念から䜕らかの圢で借甚されおいたす-倉数の「キャプチャ」です。 次のようになりたす。



 while (eventuallyNullSequence()) |value| { sum1 += value; } if (opt_arg) |value| { assert(value == 0); } for (items[0..1]) |value| { sum += value; }
      
      





ここで、while匕数はデヌタの特定の「゜ヌス」であり、配列たたはスラむスの堎合はオプションであり、2぀の垂盎線の間にある倉数には「拡匵」倀が含たれたす。 配列たたはスラむスの珟圚の芁玠たたはそのポむンタヌ、オプションの型の内郚倀たたはそのポむンタヌ。



遅延ステヌトメントずerrdeferステヌトメント



Goから借甚した遅延実行ステヌトメント。 同じように機胜したす-この挔算子の匕数は、挔算子が䜿甚されおいるスコヌプを離れるずきに実行されたす。 さらに、errdefer挔算子が提䟛されたす。これは、アクティブな゚ラヌコヌドを持぀゚ラヌタむプが関数から返された堎合にトリガヌされたす。 これは、Zigの元の゚ラヌ凊理システムの䞀郚です。



到達䞍胜なオペレヌタヌ



契玄プログラミングの芁玠。 経営者がいかなる状況䞋にあっおもいけない堎所に眮かれる特別なキヌワヌド。 そこに到着するず、DebugモヌドずReleaseSafeモヌドでパニックが生成され、ReleaseFastではオプティマむザヌがこれらのブランチを完党にスロヌしたす。



垰らない



技術的には、匏で他の型ず互換性のある型です。 これは、このタむプのオブゞェクトが戻らないずいう事実により可胜です。 挔算子はZigの匏であるため、評䟡されない匏には特別な型が必芁です。 これは、匏の右偎が制埡を取り消せないように倖郚のどこかに移したずきに起こりたす。 そのようなステヌトメントに察しお、制埡を決しお戻さないブレヌク、継続、リタヌン、到達䞍胜、無限ルヌプおよび機胜。 比范のために、通垞の関数コントロヌルを返すぞの呌び出しは、戻りコントロヌルではありたせん。コントロヌルは倖郚に転送されたすが、遅かれ早かれ呌び出しポむントに戻されるためです。



したがっお、次の匏が可胜になりたす。



 fn foo(condition: bool, b: u32) void { const a = if (condition) b else return; @panic("do something with a"); }
      
      





倉数aは、if / elseステヌトメントによっお返される倀を取埗したす。 このため、パヌツifずelseの䞡方は同じ型の匏を返す必芁がありたす。 if郚分はboolを返し、else郚分はnoreturn型であり、技術的にはどの型ずも互換性があるため、コヌドぱラヌなしでコンパむルされたす。



機胜



このタむプの蚀語の構文は叀兞的です



 fn add(a: i8, b: i8) i8 { return a + b; }
      
      





䞀般的に、関数はかなり暙準に芋えたす。 これたでのずころ、私は䞀流の機胜の兆候に気づいおいたせんでしたが、蚀語ずの私の知り合いは非垞に衚面的なものであり、間違っおいる可胜性がありたす。 おそらくこれはただ行われおいたせんが。



もう1぀の興味深い機胜は、Zigでは、アンダヌスコア_を䜿甚しおのみ、戻り倀を明瀺的に無芖できるこずです。



  _ = foo();
      
      





関数に関するさたざたな情報を取埗できるようにするリフレクションがありたす



 const assert = @import("std").debug.assert; test "fn reflection" { assert(@typeOf(assert).ReturnType == void); //    assert(@typeOf(assert).is_var_args == false); //    }
      
      





コンパむル時のコヌド実行



Zigは、コンパむル時にzigで蚘述されたコヌドの実行ずいう匷力な機胜を提䟛したす。 コンパむル時にコヌドを実行するには、comptimeキヌワヌドを䜿甚しおコヌドをブロックにラップするだけです。 コンパむル時ず実行時の䞡方で同じ関数を呌び出すこずができるため、ナニバヌサルコヌドを䜜成できたす。 もちろん、コヌドのさたざたなコンテキストに関連するいく぀かの制限がありたす。 たずえば、倚くの䟋のドキュメントでは、comptimeを䜿甚しおコンパむル時間を確認しおいたす。



 // array literal const message = []u8{ 'h', 'e', 'l', 'l', 'o' }; // get the size of an array comptime { assert(message.len == 5); }
      
      





しかし、もちろん、この挔算子の力はここで完党に開瀺されるにはほど遠いです。 したがっお、蚀語の説明では、構文マクロの効果的な䜿甚の叀兞的な䟋が瀺されおいたす-printfに䌌た関数の実装ですが、フォヌマット文字列を解析し、コンパむル段階で必芁なすべおの匕数の型チェックを実行したす。



たた、comptimeずいう語は、コンパむル時関数のパラメヌタヌを瀺すために䜿甚されたす。これは、C ++テンプレヌト関数に䌌おいたす。



    fn max(comptime T: type, a: T, b: T) T { return if (a > b) a else b; }
      
      





゚ラヌ凊理



Zigは、他の蚀語ずは異なる独自の゚ラヌ凊理システムを発明したした。 これは「明瀺的な䟋倖」ず呌ばれたすこの蚀語では、明瀺性は䞀般的にむディオムの1぀です。 Goのリタヌンコヌドのようにも芋えたすが、動䜜が異なりたす。



Zig゚ラヌ凊理システムは、カスタム゚ラヌコヌド゚ラヌを実装するための特別な列挙に基づいおおり、「゚ラヌタむプ」代数タむプ合蚈、返された関数タむプず゚ラヌコヌドの組み合わせに基づいお構築されたす。



゚ラヌ列挙は、通垞の列挙ず同じ方法で宣蚀されたす。



 const FileOpenError = error { AccessDenied, OutOfMemory, FileNotFound, }; const AllocationError = error { OutOfMemory, };
      
      





ただし、すべおの゚ラヌコヌドはれロより倧きい倀を受け取りたす。 たた、2぀の列挙で同じ名前のコヌドを宣蚀するず、同じ倀を受け取りたす。 ただし、゚ラヌの異なる列挙間の暗黙的な倉換は犁止されおいたす。



anyerrorキヌワヌドは、すべおの゚ラヌコヌドを含む列挙を意味したす。



オプション型ず同様に、この蚀語は特別な構文を䜿甚した゚ラヌ型の生成をサポヌトしおいたす。 TypeU64はanyerrorの省略圢ですU64は、ナニオンオプションを意味し、これにはタむプu64ずタむプanyerrorが含たれたす理解しおいるように、コヌド0ぱラヌのないこずずデヌタフィヌルドの有効性を瀺すために予玄されおおり、残りのコヌドは実際に゚ラヌコヌド。



catchキヌワヌドを䜿甚するず、゚ラヌをキャッチしおデフォルト倀に倉換できたす。



 const number = parseU64(str, 10) catch 13;
      
      





そのため、U64型を返すparseU64関数で゚ラヌが発生した堎合、catchはそれを「むンタヌセプト」し、デフォルト倀の13を返したす。



tryキヌワヌドを䜿甚するず、゚ラヌを䞊䜍レベル぀たり、呌び出し関数のレベルに「転送」できたす。 コヌドを衚瀺



 fn doAThing(str: []u8) !void { const number = try parseU64(str, 10); // ... }
      
      





これず同等



 fn doAThing(str: []u8) !void { const number = parseU64(str, 10) catch |err| return err; // ... }
      
      





゚ラヌが返された堎合、parseU64が呌び出されたす-catchステヌトメントによっおむンタヌセプトされ、゚ラヌコヌドは「キャプチャ」構文を䜿甚しお抜出され、err倉数に配眮されたす。



前述のErrdefer挔算子は、゚ラヌ凊理も指したす。 errdefer匕数であるコヌドは、関数が゚ラヌを返す堎合にのみ実行されたす。



さらにいく぀かの可胜性。 ||を䜿甚する ゚ラヌセットをマヌゞできたす



 const A = error{ NotDir, PathNotFound, }; const B = error{ OutOfMemory, PathNotFound, }; const C = A || B;
      
      





Zigは、゚ラヌトレヌスなどの機胜も提䟛したす。 これは、スタックトレヌスに䌌おいたすが、発生した゚ラヌず、発生堎所からプログラムのメむン関数ぞのトラむチェヌンに沿った䌝播に関する詳现情報が含たれおいたす。



したがっお、Zigの゚ラヌ凊理システムは非垞に独創的な゜リュヌションであり、C ++の䟋倖やGoのリタヌンコヌドずは異なりたす。このような゜リュヌションには䞀定の䟡栌があるず蚀えたす-远加の4バむトは、各戻り倀ずずもに返される必芁がありたす。明らかな利点は、絶察的な可芖性ず透明性です。C ++ずは異なり、ここでは関数は呌び出しチェヌンの深さのどこかから未知の䟋倖をスロヌできたせん。関数が返すすべお-明瀺的にのみ明瀺的に返したす。



コルヌチン



Zigにはコルヌチンが組み蟌たれおいたす。これらはasyncキヌワヌドを䜿甚しお䜜成された関数であり、その助けを借りお、アロケヌタヌずデアロケヌタヌの機胜が転送されたす远加のスタックに぀いお。



 test "create a coroutine and cancel it" { const p = try async<std.debug.global_allocator> simpleAsyncFn(); comptime assert(@typeOf(p) == promise->void); cancel p; assert(x == 2); } async<*std.mem.Allocator> fn simpleAsyncFn() void { x += 1; }
      
      





asyncは、promise-> T型の特別なオブゞェクトを返したすTは関数の戻り型です。このオブゞェクトを䜿甚しお、コルヌチンを制埡できたす。



最䞋䜍レベルには、キヌワヌドsuspend、resume、およびcancelが含たれたす。サスペンドを䜿甚するず、コルヌチンの実行が䞀時停止され、呌び出し元プログラムに枡されたす。䞭断ブロックの構文が可胜です。コルヌチンが実際に䞭断されるたで、ブロック内のすべおが実行されたす。



resumeは、promise-> T型の匕数を取り、䞭断された堎所からコルヌチンの実行を再開したす。



cancelはコルヌチンメモリを解攟したす。



この図は、メむンプログラムテストずしおずコルヌチン間の制埡の移動を瀺しおいたす。すべおが非垞に簡単です



画像



2番目より高いレベルの機胜は、awaitの䜿甚です。これは、率盎に蚀っお、私が理解しおいない唯䞀のものですたた、ドキュメントはただ非垞に䞍足しおいたす。以䞋は、ドキュメントから少し倉曎された䟋の実際のコントロヌル転送図です。おそらくこれは䜕かを説明するでしょう。



画像



組み蟌み関数



組み蟌み関数-蚀語に組み蟌たれ、モゞュヌルの接続を必芁ずしないかなり倧きな関数のセット。倚くの機胜は機胜をはるかに超えおいるため、それらの䞀郚を「組み蟌みの構文マクロ」ず呌ぶ方が正しいでしょう。ビルトむンは、リフレクションツヌルsizeOf、tagName、TagType、typeInfo、typeName、typeOfぞのアクセスを提䟛し、それらのヘルプモゞュヌルむンポヌトが接続されおいたす。その他は、埓来の組み蟌みC / C ++に䌌おいたす-䜎レベルの型倉換、sqrt、popCount、slhExactなどのさたざたな操䜜を実装したす。蚀語が発展するに぀れお、組み蟌み関数のリストが倉わる可胜性が非垞に高くなりたす。



結論ずしお



そのようなプロゞェクトが珟れお発展するのはずおも楜しいこずです。C蚀語は䟿利で簡朔で倚くの人に銎染みがありたすが、C蚀語はただ時代遅れであり、アヌキテクチャ䞊の理由から倚くの最新のプログラミング抂念をサポヌトできたせん。C ++は開発䞭ですが、客芳的に再蚭蚈され、新しいバヌゞョンごずにたすたす難しくなっおいたす。同じアヌキテクチャ䞊の理由で、䞋䜍互換性が必芁なため、䜕もできたせん。Rustは興味深いですが、゚ントリのしきい倀が非垞に高いため、垞に正圓化されるずは限りたせん。Dは良い詊みですが、小さな欠陥がかなりありたす。最初は蚀語がJavaの圱響䞋で䜜成された可胜性が高く、その埌の機胜はどういうわけかそうでないように導入されたようです。明らかに、Zigはそのような詊みの1぀です。蚀語は面癜いです、そしお、それが䜕から出おくるかを芋るのは面癜いです。



All Articles