💢
JavaScriptと #!
Node.jsのアプリケーションでは以下のようなコードで始まるJavaScriptを見ることがあります。
#!/usr/bin/env node
'use strict';
// ...
この最初の行はshebang (hashbang)と呼ばれるものですが、なぜこれが含まれるJavaScriptコードが動作するのでしょうか。調べたところ、以下のような真相のようです。
- 元々JavaScriptには
#!
をコメントとみなす仕組みはなかった。[1] - Node.jsの最初期にshebangサポートが入った。 (2009年のコミット)
- 2017年から2018年にかけて、shebangサポートがECMAScriptに提案された。
- 2017-11-28 TC39: "Interpreter Directive" がStage1 proposalになった (議事録, コミット)
- 2018-03-21 TC39: "Interpreter Directive" が "Hashbang Grammar" にリネームされ、Stage2に昇格した (議事録, コミット)
- 2018-09-26 TC39: "Hashbang Grammar" がStage2に昇格した (再審議) (議事録, コミット)
- このときリネームの混乱から "Interpreter Directive" と "Hashbang Grammar" が重複して作成されていた (関連PR)
- 2018-11-28 TC39: "Hashbang Grammar" がStage3に昇格した (議事録, コミット)
- 2019年01月: V8 (Chromium) にHashbang syntaxサポートが入った (PR)
- SpiderMonkey (Firefox) や ChakraCore (Edge) にも同時期にサポートが入った
- 2019年03月: 当該V8がNode.jsに取り込まれる (コミット)。これによりNode.js 12.0.0は "Hashbang Grammar" の仕様に準拠することになった。
- 2019年06月: V8側がshebangに対応したので、Node.jsに元々あったshebangサポートが削除された。 (コミット)
なお、これとは別にNode.jsにはUTF-8 BOMの対応があります。現行のHashbang Grammarではファイルの冒頭に #!
がある場合のみコメントとみなすため、 UTF-8 BOMに後続する #!
はコメントになりませんが、Node.jsでは UTF-8 BOMに後続する場合でもファイルの先頭にあるとみなします。この機能もNode.jsの比較的初期にあたる2011年8月 (0.5.4; コミット) に実装され、今に至ります。
Discussion