SpiderMonkey と JavaScript エンジンの強化を通じたインターンの旅
Iterator.range プロポーザルとその内部のアルゴリズムを初めて見たとき、それをハッキングできるかどうかはわかりませんでした。 Outreachy の寄稿者として、私と他の寄稿者は 1 か月間寄稿し、その後 1 人のインターンが提案/仕様に取り組むために選ばれます。
前文
貢献期間が始まって数日後、私は Outreachy の貢献者に指定されたタスクを割り当てられましたが、最も重要なのは、ErrorIsError TC39 提案が割り当てられたことです。
SpiderMonkey (Mozilla JavaScript Engine) で TC39 プロポーザルを実装するための最初のステップは、TC39 プロポーザルの設定を追加することです。
これにより、実行時に機能を有効または無効にできるようになります。これは重要です。十分にテストして、ユーザーに問題が発生しないと確信できるまでは、機能をデフォルトで有効にしたくないからです。この場合、プリファレンスを作成し、値を false に設定します。
ご覧のとおり、JavaScript で実装すると、この提案は非常に簡単で、最初の実装となりました。しかし、コード レビューが戻ってきて、提案をネイティブ C 関数として実装する方が良いと判断されました。これは、理由と C の操作の両方の点で、私にとって学習プロセスでした。
このプロセス中に、クロスコンパートメント ラッパー (CCW) と JavaScript エンジンの組み込み型チェックに関連するいくつかの興味深い課題に遭遇しました。
クロスコンパートメントラッパーとErrorObjectチェックの問題
Error オブジェクトを処理する場合、IsErrorObject 関数は、指定された値が ErrorObject 型のインスタンスであるかどうかを判断します。ただし、引数が別のコンパートメントからの ErrorObject のクロスコンパートメント ラッパー (CCW) である場合、重大なエッジ ケースが発生します。 CCW は基になるオブジェクトを不明瞭にするため、IsErrorObject チェックでは CCW を直接考慮しません。
実装コンテキスト: 組み込み型チェックを処理するコードでは、オブジェクトが特定の型であるかどうかをチェックするために intrinsic_IsInstanceOfBuiltin 関数が使用されます。 this 値に適用すると機能します。すでにアンラップされていると仮定します。 CCW によってまだラップされている可能性のある引数は処理されません。
提案されたソリューション: 専用のネイティブ関数
この問題に対処するには、次の解決策が必要です。
1.新しいネイティブ関数の追加: CCW を透過的に処理するための専用のネイティブ関数が次の方法で作成されます:
- CCW のラップを解除します。
- ラップされていないオブジェクトのタイプが ErrorObject であるかどうかをテストします。
- 1 つのまとまった操作でオブジェクト タイプを検証します。
2.自己ホスト型の複雑性の削除:
この新しい関数を JSNative として実装することで、プロセスを合理化し、自己ホスト型ヘルパーに依存せずに単一のネイティブ関数内ですべての操作を実行できます。
なぜこのアプローチなのか?
非オブジェクトのケースの処理: 新しい関数は、値のラップ解除を続行する前に、値がオブジェクトであるかどうかのチェックを統合します。
仕様の調整の簡素化: CCW は実装の詳細であり、TC39 JavaScript 仕様の一部ではないため、これらの変更により、矛盾を回避しながら動作が仕様と一致することが保証されます。
上記は 2 つのテスト ファイルを除く 45 行のコードで構成されています。1 つは JIT (ジャストインタイム) コンパイルされたテスト用、もう 1 つは Test262 テスト/ファイル用です。ただし、この 45 行のコードを通じて、次のことができました。
- Mozilla コードベース内の事前定義されたエラー メッセージの場所とその使用方法を学びます。これは、Iterator.range. のエラー メッセージを定義する必要がある場合に便利であることがわかりました。
- 夜間ビルドと夜間ビルドを理解します。
- コードの一貫性: TC39 仕様を満たすようにコードを調整し、Mozilla 標準に従って新しく追加されたコードの略記を避けます。
私が現在取り組んでいること: Iterator.range
Outreachy への貢献期間中に、クロスコンパートメント ラッパーの複雑さを掘り下げ、ErrorObject 処理を強化した後、私は同様に刺激的なものに注目しました。それは、Mozilla Outreachy インターンシップでの Iterator.range 提案です。
馴染みのない人のために説明すると、Iterator.range は JavaScript の TC39 提案への追加であり、イテレーターの汎用性を高めることを目的としています。このメソッドは、値の範囲を生成する効率的な方法を導入します。これは、一連の数値の反復処理やステップベースのループの作成など、日常のプログラミングで特に役立ちます。
概念自体は単純に見えるかもしれません。開始点から終了点まで一連の値を生成することは、SpiderMonkey での実装が非常に困難であることが判明しています。
抽象操作やネイティブ C 関数の処理を必要とした以前の ErrorObject の作業とは異なり、Iterator.range では、JavaScript イテレータが内部でどのように動作するか、また SpiderMonkey がこれらの機能をエンジン レベルでどのように統合するかについて深く調べる必要があります。
私が Iterator.range の作業を開始したとき、ErrorIsError 提案に対して行ったことと同様の初期実装が行われていました。プロポーザルの設定を追加し、JavaScript シェルで組み込みにアクセスできるようにします。
Iterator.range は単純に false を返しました。これは、Iterator.range の実際の実装が開発中であるか完全に実装されていないことを示すスタブであり、ここで私が登場しました。
まず、Iterator.range 関数に委任する CreateNumericRangeIterator 関数を作成しました。続いて、最初の 3 つのステップを Iterator.range 関数内に実装しました。
次に、CreateNumericRangeIterator 関数で NUMBER-RANGE データ型の変数とパラメーターを初期化しました。
Iterator.range(0, 10) など、1 ずつ増加するシーケンスの実装に重点を置きました。また、仕様のステップ 19 に合わせて、適切な引数を使用して IteratorRangeGenerator (範囲提案仕様のステップ 18 を処理する) を呼び出すように CreateNumericRangeIterator 関数を更新し、その機能を検証するテストを追加しました。
今週は、Iterator.range によって返されるジェネレーターのプロトタイプを適切に設定する方法を検討します。
今後数週間/数か月の私の仕事には以下が含まれますが、これらに限定されません。
- Iterator.range によって返されるジェネレーターの適切なプロトタイプを設定します。
- Iterator.range で BigInt をサポートします。
- 今のところ 1 増加するシーケンスのみを取り上げているため、他のシーケンスもサポートします。
- 上記の適切なテストを追加します。
こちらもお勧めです:
オープンソースの解読: アウトリーチの旅で学んだ語彙
フリーソフトウェアで働くリモートインターンシップをご希望ですか?
以上がTCProposal のナビゲート: エラー処理から Iterator.range までの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PythonとJavaScriptの主な違いは、タイプシステムとアプリケーションシナリオです。 1。Pythonは、科学的コンピューティングとデータ分析に適した動的タイプを使用します。 2。JavaScriptは弱いタイプを採用し、フロントエンドとフルスタックの開発で広く使用されています。この2つは、非同期プログラミングとパフォーマンスの最適化に独自の利点があり、選択する際にプロジェクトの要件に従って決定する必要があります。

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。
