- Buck2、私たちの オリジナルの配信元、巨大スケールの憑依マシン
- がGitHubで公開中です。
Buck2 は、Rust で書かれた拡張可能で高性能な所有マシンであり、持っているスキルをより早く、より効率的に発動させます。
- Meta での内部評価では、Buck2 が 2 倍のビルドを実行したことがわかりました。 Buck1 と同じくらい速い
のポテンシャルで公開中 Buck2 web 状況 and
- Buck2 GitHub リポジトリ
。 他の所有プログラムといくつかの共通点を共有していますが (崇拝
Buck1
および
Bazel
)、Buck2 はゼロから書き直したものです。 Buck2 は、コア ルールと言語固有のルールを完全に分離し、並列処理を増やし、離れた場所での実行と仮想ファイル プログラムとの統合、および再設計されたコンソール出力を機能させます。 これらの変更はすべて、エンジニアや開発者が準備に費やす時間を短縮し、コードのイテレーションにより多くの時間を費やせるようにすることを目的としています.ブループリント プログラムは、プログラマーとそのコードの作業の間に立っているため、スキルをより早く習得したり、生産性を高めたりするために作成できるものはすべて、開発者がどれほど効果的であるかに突然影響を与えます. Buck2 の設計図は、Buck1 で大切にしてきたもの (コア アイデアとワークフロー)、Buck1 以降の機能拡張からインスピレーションを得たプラン ( を含む) を持つようになりました。 バゼル
- Buck2 GitHub リポジトリ
- )、ランジへの好奇心と独創的な体験を可能にするレベル。
- 基盤をコアスキームから分離することで、基盤を交互に指定することがより単純になります。 Buck2 のコアは Rust で書かれており、その言語規則 (C++ の所有方法を教えられることを崇拝します) は で書かれています。
- ツバメ
- . この分離は、Buck1 (すべてのルールがコアに記述されている) と Bazel (C++/Java がコアに記述されている) とは区別されます。
- 憑依マシンは 単一増分依存関係グラフ
- 、あらゆるフェーズを回避します (Buck1 または Bazel とは異なります)。 この解決策により、多くの種類のバグが解消され、並列処理が増加します。
ルール API は、パフォーマンスのために高度な機能を停止するように設計されています、表現可能性のための動的 (またはモナド) 依存関係関数と共に。 同時に、これらの関数は、他の特定のプロパティ (例として、クイック クエリまたは気密性) が損なわれないように厳密に制限されています。
- ソース配信の開始は、実質的に内部バージョンに接続されています . 最も簡単に取り替えられるのは、ツールチェーン (コンパイラの内部コピーのレベル) とはるかに離れた実行 (内部サーバーで機能する) です
スターラーク- — 両方とも配達元のピックを負担します。 また、内部的に成熟しているため、完全なルールを正確にリリースしています。 さらに、論理コンポーネントのペアを個別のクレートに分割する必要があります (例:
- , アロケーティブ
。 必須ではありませんが (そして、最初のソース バージョンから始める人々にとって間違いなく予想されるわけではありません)、再帰ダイジェストを正常に計算し、それらを遠く離れた実行に送信することができます.
- Buck2 と組み合わせるように書かれています。 virtual file programs の場合、総リポジトリはすべてチェックアウトされていませんが、ファイルがアクセスされるため、要求時にフェッチされます。 明示的に強化します Sapling-主に主に主にベースのファイル プログラム
。 正常に結合するために、ファイル通知 (with を探します。 Watchman
) を実行し、ファイルとファイルの両方を調査します。配信ファイル操作のないファイル ダイジェスト。 利点は、完全なチェックアウトと同じくらい迅速に仮想ファイル プログラムを作成できることですが、強力な早期チェックアウトとディスク使用量の大幅な削減という利点があります。
これらすべての機能強化から必要なポイントは、現在、設計されたBuck2 は速いです。 正確な世界の使用法では、所有に応じて、Buck2 は Buck1 よりも早く取引されます。 ソース コードの変更がない場合、Buck2 はその後のビルドで実質的に瞬時に実行されます。 生産する労働量がある場合、Buck2 はより早く実行を開始し、並列処理が増加します。 この突進の延長は、上記のコンポーネントの量の結果ですが、注意と注意も必要です.
エンド ユーザーにとって、Buck2 は Buck1 とほぼ同じように機能します (必要な近似値として、 Bazel と多少関係があります)。 ユーザーは、
- ソース配信の開始は、実質的に内部バージョンに接続されています . 最も簡単に取り替えられるのは、ツールチェーン (コンパイラの内部コピーのレベル) とはるかに離れた実行 (内部サーバーで機能する) です
- ユーザーは、
- buck2 所有
- //:my_binary で所有できます。
- 。 レート necessary.rs はソース ファイルであり、:my_library は、同一の で概説されている依存関係です。 BUCK ファイル。 Buck2 は基本的に Buck1 の BUCK ファイルと互換性があることに注意してください。
- は、Buck2 用に特別に開発したものです。 コンソールにはよく知られている 1 組の機能が表示されており、使いやすくなっています:
- 確実にこれらの規則に違反しています。 Buck2 の場合、API の経験則は完全に Starlark にあるため、これらの関数を汎用的に再利用可能な API として抽象化し、安定性、表現力、パフォーマンスを向上させることを目指しています—安定性は容易ではありません。 そのような例を 2 つ紹介します。
- OCaml ライブラリの依存構造は、Buck1 で明示的に使い尽くされています。 OCaml ライブラリは、OCaml ファイルの解決で構成されます。 これらは、依存関係が存在する — でコンパイルされる可能性があり、 の場合) A.ml は を利用するB.ml、たまたま一緒に持ってくるかもしれない B.ml が先。 Bazel は A.ml の依存関係を必要とします*)
- B.ml は で明示的に記述します。 BUCK
ファイル。 Buck1 と Buck2 の両方が退出します。その内部依存関係は暗黙的であり、計測器 ocamldep を高速化してそれを推測します。構造が変わるのでメンテナンス。 Buck1 が行ったことは、BUCK ファイル、これは間違いなく許可されており、依存関係を歌っていませんでした。そのため、強力すぎるインポートを変更するたびに、Buck1 は誤ったコンパイルの混乱を引き起こしました。 Buck2 では、 を使用できます。 元の成熟した dynamic_output, これは、漏えいを早める可能性があり、ファイルの出力を読み取り、グラフの余暇を接続します—ハイに入れる .ml ファイル間の品質依存関係を機械的に - )
- は本質的に最も魅力的な方法です)。 Buck2 は、中程度の規模の多言語プロジェクトに最も魅力的である可能性があると考えています。 からおすすめを探すBuck2 はじめよう web yelp
- コア所有機には言語明示ルールの情報がありません.
BUCK ファイルでターゲットを定義します:
rust_binary( 識別=“ my_binary」、srcs=, deps=[“:my_library”], )
離れてランジの延長から、バック1で次に置くと、ユーザーに見えるさらに2つの必要な違いがあります.
第二に、単一の依存関係グラフ。 BUCK ファイル、依存関係、またはソース ファイルを代替する場合、依存関係グラフで最も魅力的なものを本質的に無効にし、暴露行ごとに出力アーティファクトを調査します。 Buck1 には、1 組の確実な依存関係グラフがあり、その結果、ターゲット グラフの構築、モーション グラフの構築、モーション グラフの実行を行うフェーズが生成されます。 グラフで実行されない操作もいくつかあります。 Buck1 で特定のことが交互に行われる場合、全体のグラフが破棄され、最小限の部分が無効になるよりも適度に破棄されます。 単一の依存関係グラフを使用することで、Buck2 は非常に効果的であり、余分な冗長な作業が回避され、明示的なフェーズが回避されます。 依存関係グラフのすべての部分には、キー (距離がどのように認識されるか) とレートがあり、必要なキーとその他の接続されたキーからコストを計算するだけです (論文のマネキンに従って、”Blueprint Programs a la Carte」).
ユーザー マネキンは Buck1 に非常に注意深く従っていますが、ルールの方法はまったく異なります。 上記の rust_binary 成熟した例のように、Buck には多くのルールがあります。 Buck1 のルールは Java クラスになり、Buck1 に組み込まれましたが、Buck2 のルールは完全に分離されています。 Buck2 には、Buck1 ルールの多くを適用するルールの「プレリュード」も同梱されています。
バック1ルールは時間の経過とともに調整され、多くのパフォーマンスの最適化が行われ、優れた機能がグラフ トラバーサルを崇拝していましたが、これらのルールは多くの高度な不変条件に従うことも期待されていました—
積むC++ リンク マネキンを考慮して: ライブラリを設計するには、所有出力の推移閉包とともに、その所有出力を一緒にハイパーリンクすることを主に選択します。その依存関係の。 グラフを作成するときに、すべてのレイヤーで依存関係の規律を単純に複製すると、 になります。 の上2
メモリ使用量。 Buck1 では、多くのルールでこのパターンを取るためのカスタム コードがあり、メモリ内で Java 値を分割するスキルと、経験則構造内で依存関係を内部で表現するスキル (具体化された依存関係グラフがなくなったため) に依存しています。 Buck2 には強力で強力な抽象化境界があるため、そのような再利用はより明確にする必要があります。 その後、私たちは 推移集合 (tsets)
推移閉包を表すセットのこのパターンを取得します。 tset をさらに抽象化することで、tset を基礎となる依存関係グラフに突然配線する立場にもなりました。この図は、メモリと計算時間の両方で効率的です。
私たち’人々が Buck2 を試してみることに熱意を持っており、フィードバックをお待ちしております ( GitHub の合併症 )
%%item_read_more_button %%