インタビュー
「テキストの編集」にこだわりが凝縮!定番エディタ「EmEditor」はなぜ他のエディタと違うのか?
マルチコアCPUやAVX-512命令も活用、GB単位の超大容量ファイルもスムースに編集……
2020年2月3日 06:45
「テキストの編集」というと、どんなツールを思いだすだろうか?
「Windows標準のメモ帳」という人もいるだろうし、Wordなどのオフィスアプリを使う人、Webメールやブログサービスの入力画面でそのまま入力する人など、様々な人がいると思う。そうした中、「テキスト編集」を最も効率よく行うために作られたソフトが「テキストエディタ」だ。
そして、そうしたテキストエディタの中でも、速度の速さや機能の豊富さで多くのユーザーに支持されているソフトの1つが「EmEditor」だ。初期バージョンが1997年公開という歴史あるソフトだが、長い間支持され続けてきただけあって、速度や機能へのこだわりはかなりのもの。
一例を挙げるなら、「マルチスレッドで検索処理を実行する」「512ビットを一括処理できるCPUの拡張命令を活用する」といった最新ハードウェアを活かす高速化が実装されていたり、普通のエディタにはほぼ見られない本格的なCSV編集機能まで用意されていたり……といった具合だ。
「テキストエディタ」というとシンプルなアプリに思われがちだが、実は「こだわりの凝縮」といえるEmEditorの内側を、その開発者である江村豊氏にお伺いした。
「数GBの超大容量ファイルでもスムースな処理を」圧倒的なスピードの裏側には数多くの工夫が”
――1997年に最初のバージョンである「EmEditor Free v.1.00」をリリースしてから20年以上が経過している「EmEditor」ですが、今でも人気は衰えていません。その開発において、特にこだわっているのはどういった部分でしょうか。
[江村氏]こだわっていることの1つは、大きなファイルを開く部分ですね。例えばビッグデータを扱う、あるいはサーバーのログファイルをチェックするなどといった用途が挙げられるでしょう。
こうしたファイルは数十~百GB超になることもあり、そのすべての内容をメモリに展開することができません。
そのため、ファイルから直接読み込むことになりますが、ファイルを開くタイミングでは行数をカウントするためにすべて読み込む必要があります。そのスピードをできるだけ速くするための工夫をEmEditorには盛り込んでいます。
具体的な処理は改行の数のカウントですが、改行コードには「CR」と「LF」、そして「CR+LF」の3種類があります。それを考慮しつつ、改行をカウントする処理を高速に行えるように工夫しています。
ちなみに、EmEditorの開発に使っているC++には文字列を操作するためのさまざまな標準ライブラリがあり、それを使えば簡単に行数をカウントできます。ただ、それを使っていては僕が理想とするパフォーマンスが得られません。ですので、EmEditorでは、改行コードを検索するための独自ルーチンを使っています。
CPUの拡張命令やマルチスレッドを使って高速化!「80倍」も……C++の「テンプレート」も活用した高速化も
――現在のEmEditorの64ビット版では、SSE2とAVX-2、AVX-512命令セットのそれぞれで別ビルドを提供していますが、そうした処理の最適化にハードウェアの機能も利用されているのでしょうか。
[江村氏]そうですね。たとえば検索処理の例ですが、従来は32ビット、あるいは64ビット単位でしか検索することができませんでした。
しかしCPUの拡張命令であるSIMD(single instruction, multiple data)を使えば、SSE2なら128ビット、AVX-2で256ビット、AVX-512では512ビット単位で検索することが可能になり、従来に比べてかなりの高速化を図ることができます。
このように、EmEditorではハードウェアが備える機能も積極的に活用し、高速化を図っています。
同様にマルチコアCPUのメリットも活用しています。従来はシングルスレッドで、1行目から順番に検索するしかなかったわけです。しかし現在はマルチスレッドになっていて、複数行をまとめて検索できるようになりました。
例えば1つのスレッドは1行目と11行目、21行目、2つ目のスレッドは2行目、12行目、22行目などといった形です。さらにSIMDも組み合わせることで極めて高速になります。
また、数億行もあるファイルを扱う場合は、仮に10スレッドがあっても数千万回ループしなければならないので、ループはできるだけ短く、かつループの中に分岐点を作らないようにしています。
ループになぜ分岐点が必要かというと、検索機能で提供しているさまざまなオプションに対応するためです。大文字と小文字の区別や正規表現の利用、あるいは単語のみを検索するのかなど、検索機能にはさまざまなオプションがあります。
それに対応するため、通常はループの中にさまざまな分岐を作りますが、分岐があると遅くなってしまいます。
分岐を減らす方法としては、検索オプションごとに関数を用意することが考えられますが、そうすると今度はバグが入り込む可能性が高くなってしまいます。そのためEmEditorでは、分岐を減らすと同時にプログラム上のミスを増やさないようにするため、C++のテンプレートの機能を用いています。
開発者が自ら語るEmEditorの便利機能とは?
――高速化にこだわる理由を教えてもらえますか。
[江村氏]やっぱり必要としている人がどこかにいるわけですよね。巨大なファイルを開いて検索したいけど、すごく時間がかかってしまうと嘆いている人がどこかにいるかもしれない。そういう方をできるだけ救いたい。
ある処理をするのに1時間かかっていたのが、ちょっと最適化するだけで何百倍、何千倍と速くなることもあります。そういった最適化を重ねて、これからもEmEditorを速くしていきたいですね。
――EmEditorで注目してほしい機能はありますか。
[江村氏]フィルターの機能はもっと使ってほしいなと思いますね。
以前、検索文字列の制限をそれまでの1万文字から5万文字にまで増やして欲しいという要望を受けたことがありました。なぜそんなに必要なのか不思議だったので、その理由を聞いてみたんですね。
そうすると、「正規表現でORを使って複数の文字列を検索する際、その人の使い方では1万文字では足りない」と言うことだったんです。
それなら、検索の機能を使わずにフィルターの機能で複数の文字列を入力し、すべてORとすれば抽出できるので、それを使うのではどうですかと提案しました。
このように、EmEditorを使っていてもフィルター機能の存在を知らない方がいらっしゃるのですが、便利なのでぜひ使ってほしいなと思います。
最新の機能で言えば、頻出文字列を抽出できる機能も便利だと思っていて、ファイル内によく出る単語を抽出するといった用途で利用することが可能です。
この機能はビッグデータの解析にも役立ちますし、Webサーバーのログであれば、どういったキーワードで検索が行われているのかをすばやく調べるといったことも可能です。このように大きなファイルを分析する場面では便利な機能ではないでしょうか。
開発機はCore i7/i9の高スペック機、それでもビルドは一回1時間……
――EmEditorのリリース作業はどのように行われているのでしょうか。
[江村氏]最近は私の長男である誠が開発した、ビルドからインストーラーの作成、更新ファイルの作成、Webサイトへのアップロードおよび更新までを自動的に行う仕組みを利用しています。ボタンを2回押すだけですべて自動で処理が行われ、ミスが発生しないため非常に便利に使っています。
それまでは手作業ですべて1つずつ行っていました。ただ、そうするとWebページに記載するリンクを間違えるなどといったミスがあったのですが、そうしたことが一切なくなり、品質向上にもつながっています。
このように長男が手伝ってくれるようになったのは嬉しいですね。もし将来、私に何かがあったとしても彼が引き継いでくれるのではないかと思いますし、EmEditorの開発を止めてしまうのではないかという心配がなくなりました。
――江村さんから息子さんに何かを教えることはあるのですか。
[江村氏]気づいたことを伝えるといったことはありますが、プログラムを教えたことはありません。彼は自分で勉強するタイプで、むしろ僕が彼から教わっていることの方が多いかもしれません(笑)。
――開発に利用しているPCはどういったものでしょうか。
[江村氏]CPUはCore i9-9900Kで、32GBメモリと2TBのSSDを搭載したデスクトップPCです。
これとは別にビルド用のPCもあり、そちらはCore i7なのですが、EmEditorの32ビット版と3種類(SSE2/AVX-2/AVX-512)の64ビット版のビルドに61分ほどかかっています。時間がかかるのは、テンプレートを使った場合分けを大量にしていることや、コードの複雑さなどからですが、ビルドに時間がかかると開発効率にも影響するので、できるだけ速いPCを使うようにしています。
――今後、EmEditorをどのように機能強化していくのか、展望を伺わせてください。
[江村氏]CSVファイルの編集やフィルター機能など、EmEditorとしてのユニークな機能を強化していきたいですね。巨大なファイルの扱いもそうですけれども、ユーザーの方にEmEditorじゃないと仕事にならないと思わせられるようになればいいなと考えています。
あと直近の予定としては、ライセンス更新の仕組みの改善を検討しています。従来、年間サブスクリプションでは毎回キーを登録してもらう必要がありましたが、今後はメールアドレスとパスワードを入力すれば、ライセンスを更新したときに自動的に登録されるような仕組みを追加したいと思っています。
それ以外では頻出文字列の抽出機能を強化する予定で、これによってビッグデータ解析などにおいて、EmEditorをより便利に使っていただけるのではないでしょうか。
今後もビッグデータの需要は伸びるのではないかと考えていますし、もしビッグデータの解析にEmEditorを使っている方で何か意見があれば、ぜひお聞かせいただきたいと思います。
――本日はありがとうございました。