POSTD PRODUCED BY NIJIBOX
POSTD PRODUCED BY NIJIBOX

ニジボックスが運営する
エンジニアに向けた
キュレーションメディア

2017年2月2日

Sublime Textを逆アセンブルする

Tristan Hume

本記事は、原著者の許諾のもとに翻訳・掲載しております。

今日の午後、私は Hopper Disassembler のフリートライアル版で、Sublime Text 3のバイナリを見ながら時間を過ごしました。そこでいくつかの興味深い点と文書化されていない設定を見つけたので、ここに記したいと思います。

文書化されていない設定

私が見つけた最も有益で興味深いと思われるものは、Sublime Text用の文書化されていない設定です。そのうちのいくつかは一部の人々にとっても有用かもしれません。

  • draw_shadows :ウィンドウより長い行がある時にシャドウ効果を無効にするブール値。個人的にシャドウ効果は好みですが、よりクリーンな見た目にしたい時や、ウィンドウがテキストよりわずかに広いだけで、シャドウ効果が早く始まる場合、この設定を使うことができます。
  • indent_guide_options

    • solid :これは、文書化されていないオプションとして、インデントガイドを点線ではなく実線にします。これを draw_* オプションに加えて、追加してください。
    • draw_active_singledraw_active に似ていますが、そこに至るまでのインデントレベルごとにガイドを描画するのではなく、カーソルがある最も内側のインデントガイドだけを描画します。
  • draw_debug :trueの場合、特別なデバッギングテキストレンダラが有効になるブール値。文書のセクションが青または赤のいずれかに変わったように見え、セクション内では、トークンがそれらの明るい色合いと暗い色合いに交互に変わります。これをオフにするには、単に削除するだけでなく、設定をfalseにしなければなりません。これらは、スクロールや編集時に変わることがありますが、その理由とタイミングは、私には分かりません。
  • wide_caret :これは、 caret_extra_width に追加するのに似ています。恐らくは古い設定で、あまり有用ではありません。

また、文書化されていないコマンドラインフラグもあります。

  • --multiinstance :既に実行中の場合でも、Sublimeの新しいインスタンスを開始します。
  • --debug :デバッグ出力をstdoutに印刷します。恐らくは、単に組み込みのコンソールに出力されるものだと思います。

私はこれらの設定を、 Sublime Text.app/Contents/MacOS/Sublime Text バイナリの strings を実行し、configオプションに見えるもので、大体そこら辺かなと見当を付けた箇所の周りを探して試してみることで発見しました。

Debug rendering mode
Debug rendering mode

使用されるライブラリ

Sublime Textがリリースするバイナリでは、シンボル名が削除されていません。恐らくこれはデバッグ上の理由からだと思いますが、私の意見としては、これは非常にクールで感謝しています。アセンブリは、まだ私にはほとんど解読できませんが、それでもいくつかのクールな点を見つけました。

関数名から、Sublime Textの作成に使われるライブラリの一部を理解することができます。以下は、その部分的なリストです。

  • Skia:オンラインで調べると、これはレンダリング用であることが分かります。
  • Google Densehash:高速なハッシュマップで、あらゆる場所で使われています。
  • 鬼車:カスタムエンジンが扱えない、手が込んだ正規表現のためのフォールバックです。
  • Boost
  • Google Breakpad
  • CryptoPP / Crypto ++(旧バージョン。現在ではLibTomCryptに置き換えられています)
  • LevelDB:シンボルインデックスを格納するためのものだと思います。
  • Snappy:高速圧縮、ただし何に使われているのかは分かりません。
  • Hunspell
  • YAML(どうも実際にはyaml-cppのようです)
  • LZMA
  • hUnzip:恐らく、圧縮されたパッケージ形式を解凍するために使われるものでしょうか。
  • LibTomCrypt

内部用の名前

一部の一般的なアーキテクチャや、どういう名前が付けられているかも分かります。以下は、ちょっとした雑学です。

  • sregex :カスタムの超高速正規表現エンジンです。特筆すべき点は、1つのテキストで同時に多くの異なる正規表現を検索できることでしょう。以前、私が sublime-syntaxのハイライタを書いた時に 、これがあれば良かったと思いました。
  • skyline :Sublimeのウィジェットフレームワークの名前で、中心は skyline_text_control です。
  • px :Windows、Linux、OS Xでのイベント処理、ファイル管理、その他のOS統合に使用されるウィンドウとプラットフォームの統合フレームワークです。
  • TokenStorage :ハイライトされたトークンを格納およびレンダリングするクラスです。

これらがオープンソースだったらどれだけ素晴らしいでしょうか。実際、上記のどれもが、多くの場面でテキストエディタ以外でも役に立つはずです。 skylinepx のような、スピーディかつスムーズにOSに統合できる独自のカスタムレンダリングUIフレームワークは、他のアプリでも見たことがありません。カスタムの正規表現エンジンも間違いなく便利なライブラリだと思います。ただし、こうした便利なライブラリは、Jon SkinnerがSublime Textで成功しなければ存在しなかった可能性もあるので、あまり贅沢は言えないかもしれません。そのようなわけで、少なくとも、美しくて速いクロスプラットフォームのアプリを手にできたことに感謝するべきでしょう。

さらに

私はまた、エディタのある部分がどのように機能しているのか、なぜそんなに速いのかについて調べてみましたが、アセンブリから多くを理解することはできませんでした。全ての主要な機能には何百もの基本となるブロックがあり、全てがインライン展開されています。丸1日かければ、あるいは何らかの機能をリバースエンジニアリングできるかもしれませんが、できたとしても大した進展にはならないでしょう。

Sublime Textの内部構造について、もし興味があればぜひコメントを残してください。特に、プラグインAPIにはアクセスできないものの、デバッガや Frida のようなものでバイナリにパッチを当てることは可能かもしれない、といったような些細な動作改善のコメントなどは、私自身非常に興味があります。

編集後記

この記事が Hacker News に掲載され、 Sublimeのフォーラム に転載された後、パッケージコントロールの管理者でありSublimeの新たな開発者でもある@wbondから、いくつかの誤りの指摘と新しい情報をいただきました。上記のライブラリリストは、新しい情報で更新したものです。