本気でJavaScriptによる端末エミュレーションを考えてみよう (1)

昔、某天才Yさんの紹介してくれたJS/UIXに本気で釣られて、JavaScriptで端末エミュレータを書き始めたことがあった。

結局まごまごしているうちにAjaxTermが出てしまったのだが、こちらはすべてサーバサイドでエスケープシーケンスを解釈してHTMLにレンダリングするタイプ。本質的に仕組みが違うし、自分のものと同じように改善すべき点はいっぱいあった。

そのときのソースは賞味期限切れる前にそのうち出すとして、今後同じことをやってみたいという好事家 (がいたとしたら) のためにメモを書いておきたい。

  • サーバサイドの問題
    • トランスポートを Comet ライクなものに置き換えないと、LAN外との通信ではつらい。
    • 実験では WEBrick と select() on tty の組み合わせで行ったが、結局は簡易的な Web サーバを自前で作る必要があるという結論に達した。
    • select()なんて遅い、epoll じゃなきゃだめでしょとか言ってる向きは作ってから言ってください。しかも *BSD は kevent だし。
  • クライアントサイドの問題
    • 最初1文字=1テキストノードというアホな構成でやってみたけど、愚の骨頂。スクロールが使い物にならなかった。innerHTML 操作がやっぱり速い。
    • <div style="font-family:monospace"> の中に展開するよりは、iframe に展開してスクロールバッファを兼ねてしまった方がパフォーマンスが出るかもしれない。
    • 1行を1ノードとして、カラーシーケンスの処理は、キャラクタバッファと HTML ラインバッファを持たせておいて、ライン単位で更新するのが最も効率がよさげだった。

なお、このメモは今後拡大する予定あり。
ですます調、面倒くさいのでやめる予定あり (今日みたいに)。