メインコンテンツまでスキップ

「ECMAScript」タグの記事が16件件あります

全てのタグを見る

ECMAScript仕様を理解する, 第3部

· 約15分
[Marja Hölttä](https://twitter.com/marjakh), 推測的仕様観察者

すべてのエピソード

このエピソードでは、ECMAScript言語の定義とその構文についてさらに深掘りします。文脈自由文法に馴染みのない方は、今が基礎を確認する良いタイミングです。仕様では言語を定義するために文脈自由文法を使用しています。親しみやすい紹介として"Crafting Interpreters"の文脈自由文法に関する章を参照するか、より数学的な定義についてはWikipediaのページをご覧ください。

ECMAScript仕様を理解する、パート2

· 約14分
[Marja Hölttä](https://twitter.com/marjakh)、推論的仕様観察者

仕様を読むスキルをさらに練習しましょう。まだ前回のエピソードを見ていない場合は、今がそれを確認する良いタイミングです!

すべてのエピソード

パート2の準備はいいですか?

仕様を知る楽しみな方法として、まずJavaScriptの機能を選び、それがどのように仕様化されているかを調べます。

警告!このエピソードには、2020年2月時点のECMAScript仕様からコピーされたアルゴリズムが含まれています。これらはいずれ古くなります。

プロパティがプロトタイプチェーンで検索されることは知っています: オブジェクトが読もうとしているプロパティを持っていない場合、プロトタイプチェーンを検索し続け、プロパティが見つかるか、それ以上プロトタイプを持たないオブジェクトに達するまで探索します。

例えば:

const o1 = { foo: 99 };
const o2 = {};
Object.setPrototypeOf(o2, o1);
o2.foo;
// → 99

プロトタイプの検索はどこで定義されていますか?

この動作がどこで定義されているかを見つけてみましょう。始めるのに良い場所はオブジェクト内部メソッドのリストです。

[[GetOwnProperty]][[Get]]の両方がありますが、自身のプロパティに制限されないバージョンを探しているので、[[Get]]を選びます。

残念ながら、プロパティ記述子仕様型にも[[Get]]というフィールドがあります。そのため、仕様を[[Get]]のために閲覧する際には、この二つの独立した使用法を慎重に区別する必要があります。

ECMAScript仕様理解パート2の「追加内容」

· 約3分
[Marja Hölttä](https://twitter.com/marjakh), 推測的仕様の観察者

なぜo2.fooAssignmentExpressionなのか?

o2.fooAssignmentExpressionには見えません。なぜなら代入がないからです。なぜこれがAssignmentExpressionなのでしょうか?

仕様では、AssignmentExpressionを引数として使用したり代入の右辺に使用することが認められています。例を挙げると:

function simple(a) {
console.log('引数は ' + a);
}
simple(x = 1);
// → 「引数は 1」とログに記録される。
x;
// → 1

…および…

x = y = 5;
x; // 5
y; // 5

o2.fooは何も代入をしないAssignmentExpressionです。これには以下の文法生成規則が基づいています。それぞれ「最も簡単な」ケースをたどって最後に至ります:

AssignmentExpressionは代入を伴う必要はなく、ConditionalExpressionであることもできます:

AssignmentExpression : ConditionalExpression

(他にも生成規則がありますが、ここでは関連性のあるもののみを示しています。)

ConditionalExpressionは条件式(a == b ? c : d)を持たない必要はなく、ShortCircuitExpressionだけでも構いません:

ConditionalExpression : ShortCircuitExpression

さらに続けて:

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

ECMAScript仕様の理解、第1部

· 約12分
[Marja Hölttä](https://twitter.com/marjakh)、推測的仕様の観察者

全てのエピソードはこちら

この記事では、仕様内の簡単な関数を取り上げ、その記法を理解しようとします。さあ、始めましょう!

前書き

JavaScriptを知っていても、その言語仕様であるECMAScript Language specification、略してECMAScript仕様を読むのは非常に気が重い場合があります。少なくとも初めて読んだときはそう感じました。

より高速で多機能な国際化API

· 約7分
[சத்யா குணசேகரன் (Sathya Gunasekaran)](https://twitter.com/_gsathya)

ECMAScript国際化APIの仕様書 (ECMA-402、またはIntl) は、日付フォーマット、数値フォーマット、複数形選択、並べ替えなどのロケール固有の重要な機能を提供します。Chrome V8とGoogle国際化チームは、V8のECMA-402の実装に機能を追加しつつ、技術的負債を整理し、パフォーマンスや他のブラウザとの互換性を向上させる取り組みを行っています。

スプレッド要素の高速化

· 約12分
Hai Dang & Georg Neis

Hai DangはV8チームでの3か月間のインターンシップ中に、[...array], [...string], [...set], [...map.keys()], および [...map.values()](配列リテラルの最初にスプレッド要素がある場合)のパフォーマンスを改善しました。さらに、Array.from(iterable) の速度も大幅に向上させました。この記事では、彼の変更の詳細について説明します。これらの変更はv7.2以降のV8に含まれています。

非同期関数とプロミスの高速化

· 約23分
Maya Armyanova ([@Zmayski](https://twitter.com/Zmayski)), 常に待機する予測者, と Benedikt Meurer ([@bmeurer](https://twitter.com/bmeurer)), プロのパフォーマンス保証者

JavaScriptにおける非同期処理は従来、特に速いとは言えないレピュテーションを持っていました。さらに悪いことに、ライブJavaScriptアプリケーション、特にNode.jsサーバーのデバッグは簡単ではありません。特に 非同期プログラミングに関してはそうです。しかし、時代は変わりつつあります。本記事では、V8で非同期関数とプロミスをどのように最適化したか(そしてある程度は他のJavaScriptエンジンでも)、および非同期コードのデバッグ体験をどのように改善したかを探ります。

V8でのソートの整理

· 約24分
Simon Zünd([@nimODota](https://twitter.com/nimODota))、一貫性のある比較関数

Array.prototype.sortは、V8でセルフホスティングJavaScriptで実装された最後のビルトインの1つでした。このポート作業を通じて、異なるアルゴリズムや実装戦略を試す機会を得、それを最終的にV8 v7.0 / Chrome 70で安定化することができました。

V8での`DataView`パフォーマンスの向上

· 約11分
Théotime Grohens(<i lang="fr">データビューの賢人</i>)とBenedikt Meurer([@bmeurer](https://twitter.com/bmeurer))、プロフェッショナルなパフォーマンスパル

DataViewsは、JavaScriptで低レベルメモリアクセスを行うための2つの可能な方法の1つです。もう1つはTypedArraysです。これまで、V8においてTypedArraysはDataViewsよりもかなり最適化されており、グラフィックス集約ワークロードやバイナリデータのデコード/エンコードなどの作業において低いパフォーマンスを示していました。この理由の多くは歴史的な選択に起因しています。例えば、asm.jsDataViewsではなくTypedArraysを選択していたことにより、エンジンがTypedArraysのパフォーマンスに焦点を当てるよう促されていました。