JavaScriptと #!

3 min読了の目安(約2800字TECH技術記事
Likes13

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 Grammer" が重複して作成されていた (関連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 Grammer" の仕様に準拠することになった。
  • 2019年06月: V8側がshebangに対応したので、Node.jsに元々あったshebangサポートが削除された。 (コミット)

なお、これとは別にNode.jsにはUTF-8 BOMの対応があります。現行のHashbang Grammerではファイルの冒頭に #! がある場合のみコメントとみなすため、 UTF-8 BOMに後続する #! はコメントになりませんが、Node.jsでは UTF-8 BOMに後続する場合でもファイルの先頭にあるとみなします。この機能もNode.jsの比較的初期にあたる2011年8月 (0.5.4; コミット) に実装され、今に至ります。

脚注
  1. ECMAScript 5.1, ECMAScript 2020 など ↩︎