/entry/yyyy/MM/dd/:id

ねこが好きです。

授業でFirefoxにコントリビュートした話



OSS





OpenCV/OpenGL



AI


   FirefoxJavaScript SpiderMonkey


1(): https://hg.mozilla.org/mozilla-central/rev/7371550c7fc5

2(): https://hg.mozilla.org/mozilla-central/rev/0e5d50e17fef


()


2(210)x1035OSS gnuplotgnuplot2OSS調3(2 or 3)

 @hakatashi SpiderMonkey  Pipeline Operator 

JavaScript


SpiderMonkeyFireFoxJavaScript JavaScript TC39ECMAScript

ECMAScript stage-0()stage-4(2)5 Pipeline Operatorstage-0stage-1

Pipeline Operator


Pipeline Operator
1 |> print


print(1)

Pipeline Operator
function doubleSay (str) {
  return str + ", " + str;
}

function capitalize (str) {
  return str[0].toUpperCase() + str.substring(1);
}

function exclaim (str) {
  return str + '!';
}

let result = "hello"
  |> doubleSay
  |> capitalize
  |> exclaim;

result //=> "Hello, hello!"

"hello" |> doubleSay |> capitalize |> exclaim  exclaim(capitalize(doubleSay("hello")))  Pipeline Operator 便

TC39 *1


JavaScript使Web JavaScriptOSS JavaScript使Babel *2 使 JavaScript

TASpiderMonkey TA OSSOSS OSS() SpiderMonkeyOSS OSSSpiderMonkey

TC39

() JavaScript





(一)

(二)

(あ)Tokenizer 

(い)Parser 

(う)BytecodeEmitter 

(え)

(お)



(三)

(四)

(五)

(六)

(あ)

(い)




make git status git

MozillaWiki *3 
cd spidermonkey/js/src
cp configure.in configure && chmod +x configure # or autoconf2.13 or autoconf-2.13
mkdir build_DBG.OBJ 
cd build_DBG.OBJ 
../configure --enable-debug --disable-optimize
make # or make -j8
cd ..


JavaScript (JavaScript)(Bytecode) Pipeline Operator Pipeline Operator Pipeline Operator




(あ)Tokenizer 

(い)Parser 

(う)BytecodeEmitter 

(え)

(お)


Tokenizer |>Token Tokenizer|>Token

js/src/frontend/ParseNode.h
/* \
* Binary operators. \
* These must be in the same order as TOK_OR and friends in TokenStream.h. \
*/ \
+F(PIPELINE) \
F(OR) \

js/src/frontend/TokenStream.cpp
case '|':
  if (matchChar('|'))
    tp->type = TOK_OR;
+#ifdef ENABLE_PIPELINE_OPERATOR
+ else if (matchChar('>'))
+   tp->type = TOK_PIPELINE;
+#endif

ParserTokenizeAST(Abstract Syntax Tree) SpiderMonkeyParserParseAST JavaScriptASTparse使 使AST
js> parse('1 |> print')
(STATEMENTLIST [(SEMI (PIPELINE [1
                                 print]))])

js/src/frontend/Parser.cpp
static const int PrecedenceTable[] = {
-    1, /* PNK_OR */
-    2, /* PNK_AND */
...
+    1, /* PNK_PIPELINE */
+    2, /* PNK_OR */

ASTBytecode BytecodeBytecodeEmitter Bytecodecallcall dis使
js> dis('1 |> print')
loc     op
-----   --
main:
00000:  one                             # 1
00001:  getgname "print"                # 1 print
00006:  gimplicitthis "print"           # 1 print THIS
00011:  pick 2                          # print THIS 1
00013:  call 1                          # print(...)
00016:  setrval                         #
00017:  retrval                         #

Source notes:
 ofs line    pc  delta desc     args
---- ---- ----- ------ -------- ------
  0:    1    17 [17] xdelta
  1:    1    17 [   0] colspan 10

pick使 Babel

Pipeline Operator SpiderMonkey(JavaScript) Pipeline Operatorstage-1  *4  JavaScriptPipeline Operator Syntax Error eval


git format-patch使 Bugzilla 

1405943 - Implement Pipeline Operator |>

f:id:siquare:20171025015349p:plain


TA

f:id:siquare:20171025015412p:plain


SpiderMonkey ()




SpiderMonkey 🎉 *5


Part 1: https://hg.mozilla.org/mozilla-central/rev/7371550c7fc5

Part 2: https://hg.mozilla.org/mozilla-central/rev/0e5d50e17fef


@hakatashi


OSS1 TA@hakatashi

OSSOSS 使OSSRailsReact



 @hakatashi 

hakatashi.hatenadiary.com

*1:https://github.com/tc39/proposal-pipeline-operator

*2:BabelはECMAScriptに取り込まれていない新仕様を先取りしたいというモチベーションで開発されたプロダクトで、 新仕様の文法を現行の仕様のJavaScriptに書き換えてくれるトランスパイラみたいなやつです。 ちなみにPipeline OperatorもBabelを使えば使用可能です。 また、後から聞いた話ですが、現場のエンジニアがJavaScriptエンジンの開発を積極的に進めて欲しい理由として、 TypeScriptなどBabelを使わない環境でも新仕様を使いたいというのもあるそうです。 確かに、まったくそのとおりでした。

*3:JavaScript:New to SpiderMonkey - MozillaWiki

*4:specが提案されていたのでこれを参考に実装しました https://github.com/tc39/proposal-pipeline-operator/pull/51

*5:Pipeline Operatorは現在stage-1なので将来的に仕様が変更される可能性があり、デフォルトでは有効になっていません。 configure時にフラグとして--enable-pipeline-operatorを含めると使用できるようになります。