Deno

V8 JavaScriptエンジン及びRustプログラミング言語に基づいたJavaScript及びTypeScriptの実行環境

Denoは、V8 JavaScriptエンジン及びRustプログラミング言語に基づいた、JavaScript及びTypeScriptランタイム環境である。Node.jsの作者であるライアン・ダールによって作成され、セキュリティと生産性に焦点を当てている[2]。ライアン・ダールが2018年に行った講演「Node.jsに関する10の反省点」で発表された[3]。Denoは単一の実行ファイル内でランタイム環境とパッケージ管理システムの両方の役割を明示的に引き受けるので、別途パッケージ管理システムを必要としない[4][5]

Deno
作者 ライアン・ダール
初版 2018年5月13日 (5年前) (2018-05-13)[1]
最新版
1.40.5 / 2024年2月15日 (2か月前) (2024-02-15)
リポジトリ ウィキデータを編集
プログラミング
言語
対応OS
種別 ランタイム環境
ライセンス MITライセンス
公式サイト deno.com ウィキデータを編集
テンプレートを表示

歴史 編集

DenoはJSConf EU 2018でのライアン・ダールによる講演「Node.jsに関する10の反省点」で発表された[3]。ライアン・ダールはこの講演において、後悔しているNode.jsの初期設計での決定について言及し、以下の点を挙げている。[6]

  • APIの設計でpromiseを使用しないという選択をしたこと
  • 古いGYPビルドシステムを使用するようにしたこと
  • node_modulespackage.jsonの採用
  • 拡張子を除外したこと
  • index.jsによる魔法のようなモジュールの依存関係の解決
  • V8のサンドボックス環境の破壊

最終的に、彼はDenoのプロトタイプ版を発表し、Protocol Buffersのようなシリアライズツールを使用したメッセージの受け渡しを通じてシステムコールバインディングを実現し、アクセス制御用のコマンドラインフラグを提供することを目指した。

Denoは当初はGoで実装され、特権側 (Goとシステムコールアクセス) と非特権側 (V8) の間のシリアライズにProtocol Buffersを使用していた[7]。しかしながら、実行時間が2倍になることとガベージコレクションの圧力から、コードは直ぐにRustで再実装された[8]。非同期イベント駆動型プラットフォームとしてlibuv英語版に代わってTokioが導入され、より高速な「ゼロ・コピー」シリアライゼーション及びデシリアライゼーションのためにFlatBuffers英語版が導入された[9]が、2019年4月にシリアライゼーションの大幅なオーバーヘッドを測定したベンチマークが公開されたことによって[10]、FlatBuffersは同年8月の後半に削除された[11]

Goの標準ライブラリをモデルとしたDenoの標準ライブラリは、広範なツール及びユーティリティを提供するために2018年11月に作成され、Node.jsの依存関係での爆発問題を部分的に解決した[12]

概要 編集

Denoは現代のプログラマのための生産的で安全なスクリプト環境を目指している[4]。Node.jsと同様に、Denoはイベント駆動型アーキテクチャ英語版に重点を置いており、非ブロッキングコアIOユーティリティのセットとそのブロッキング版を提供している。DenoはWebサーバの作成や科学計算に利用することができる。発音は当初デノだったがディーノ[13][14] となった模様。

Node.jsとの比較 編集

DenoとNode.jsはGoogle ChromeなどのChromiumベースのウェブブラウザで採用されているV8 JavaScriptエンジン上に構築されたランタイム環境である。どちらも内部イベントループがあり、スクリプトと広範なコマンドラインユーティリティを実行するためのコマンドラインインタフェースを提供している。

DenoがNode.jsと異なる主な点は以下の通りである[4]:

  1. CommonJSの代わりに、ES Moduleをデフォルトのモジュールとシステムとして使用する。
  2. ウェブブラウザと同様に、依存関係 (ローカル及びリモート) を読み込むためにURLを使用する。
  3. リソースを取得するためのパッケージ管理システムが組み込まれているので、npmは不要である。
  4. キャッシングメカニズムを備えたスナップショットTypeScriptコンパイラを使用することによるTypeScriptのサポート。
  5. 幅広いWeb APIを実装することによるウェブブラウザとの互換性の向上。
  6. サンドボックスコードを実行するために、ファイルシステムとネットワークアクセスを制御することができる。
  7. promise、ES6及びTypeScriptの機能を利用するためにAPIを再設計したこと。
  8. コアAPIのサイズを最小限にしながら、外部に依存関係の無い大きな標準ライブラリを提供すること。
  9. 特権システムAPIを呼び出しとバインディングの使用のために、メッセージ受け渡しチャネルを使用すること。

編集

以下は、読み取り / 書き込み / ネットワーク権限無しの基本的なDenoスクリプトの実行例である (サンドボックスモード):

deno run main.ts

権限を許可する場合は、明示的に対応するフラグを指定することが必要:

deno run --allow-read --allow-net main.ts

スクリプトの依存関係を検査する場合は、infoサブコマンドを使用する:

deno info main.ts

Denoでの基本的なHello worldは以下の通りである (Node.jsと同様):

console.log("Hello world");

Denoはウェブブラウザでは使用できない殆どのDeno固有のAPIにグローバル名前空間を提供する。UNIXcatコマンドは、以下のように実装することができる:

/* cat.ts */

/* Deno APIs are exposed through the `Deno` namespace. */
const { stdout, open, copy, args } = Deno;

// Top-level await is supported
for (let i = 0; i < args.length; i++) {
    const filename = args[i]; // Obtains command-line arguments.
    const file = await open(filename); // Opens the corresponding file for reading.
    await copy(file, stdout); // Performs a zero-copy asynchronous copy from `file` to `stdout`.
}

上記のDeno.copy関数は、Goのio.Copy関数のように機能する。stdout (標準出力) はWriterに出力され、fileの入力はReaderである。このプログラムを実行するには、ファイルシステムの読み取り許可が必要である:

deno run --allow-read cat.ts myfile

以下はDenoによる基本的なHTTPサーバの実装である:

// Imports `serve` from the remote Deno standard library, using URL.
import { serve } from "https://deno.land/std@v0.21.0/http/server.ts";

const body = new TextEncoder().encode("Hello World\n");
// `serve` function returns an asynchronous iterator, yielding a stream of requests
for await (const req of serve(":8000")) {
    req.respond({ body });
}

上記のスクリプトを実行すると、Denoはリモートの標準ライブラリファイルを自動的にダウンロードしてキャッシュし、コードをコンパイルする。同様に、URLを入力ファイル名として指定することで、明示的にダウンロードせずに標準ライブラリスクリプト (ファイルサーバなど) を直接実行することができる (-Aは全ての権限を有効にするフラグである):

$ deno run -A https://deno.land/std/http/file_server.ts
Download https://deno.land/std/http/file_server.ts
Compile https://deno.land/std/http/file_server.ts
...
HTTP server listening on http://0.0.0.0:4500/

脚注 編集

  1. ^ Contributors to denoland/deno”. GitHub. 2020年5月15日閲覧。
  2. ^ Dylan Schiemann (2018年12月26日). “Deno: Secure V8 TypeScript Runtime from Original Node.js Creator”. InfoQ. 2019年11月18日閲覧。
  3. ^ a b JSConf (2018年6月6日). “Node.jsに関する10の反省点”. YouTube. 2019年11月18日閲覧。
  4. ^ a b c Deno Manual”. deno.land. 2019年11月18日閲覧。
  5. ^ Paul Krill (2018年6月21日). “Ryan Dahl’s Node.js regrets lead to Deno”. InfoWorld. 2019年11月18日閲覧。
  6. ^ Ryan Dahl (2018年6月). “Design Mistakes in Node”. 2019年11月18日閲覧。
  7. ^ denoland/deno at golang”. GitHub. 2019年11月18日閲覧。
  8. ^ Suggestion: Look into porting to Rust and using Tokio”. GitHub. 2019年11月18日閲覧。
  9. ^ Protobuf seems like a lot of overhead for this use case?”. GitHub. 2019年11月18日閲覧。
  10. ^ Replace flatbuffers”. GitHub. 2019年11月18日閲覧。
  11. ^ Remove flatbuffers”. GitHub. 2019年11月18日閲覧。
  12. ^ deno_std”. GitHub. 2019年11月18日閲覧。
  13. ^ Pronunciation #5707”. GitHub. 2022年8月22日閲覧。
  14. ^ マニュアル冒頭に発音が記載”. deno.com. 2024年1月12日閲覧。

関連項目 編集

外部リンク 編集