パーサコンビネータを高速化した

例のアレです. 式年遷宮したときの話はこちら.

github.com

最初は軽い気持ちで細々とした最適化をしていたんです.

ちなみにどう最適化するかというと V8 のプロファイラを使って適当に遅そうなところに目星をつけて色々試します.

そんなこんなで Parsimmon*1 より妙に遅い原因を探していたら, ap, left, right (Parsec*2 でいうところの <*>, <*, *>) の実装の効率が悪く, これが主な原因であることがわかりました.

その後, 比較用の JSON パーサ実装を (Parsimmon のものと同等になるように) 改良した結果がこれです.

このあたりで長いこと不明だった諸悪の根源を見つけられてほぼ満足していますが, さらに細々とした最適化を続けました.

処理系によりそうな話になってきたのでこのへんで終わり.

以上です.

*1:先行の JS のパーサコンビネータライブラリ https://github.com/jneen/parsimmon

*2:Haskell のパーサコンビネータライブラリ https://github.com/aslatter/parsec/ 機能はほぼこれのパクリ

Markdown のテーブルをいい感じに編集する Atom パッケージを作った

相変わらず既存のものが……だったので作りました. 以前 SyaroNote で Ace 向けに作ったものをベースに色々改良しています.

atom.io

動作はこんな感じです.

f:id:susisu:20170303181404g:plain

他にも行の挿入や, 左・右・中央揃えの切り替えなどが簡単にできます. Markdown のテーブルの編集にお困りの方はお試しください.

あと, WindowsLinux でのキーバインドなどがまだ適当だったりするので, 何か機能についてのご意見などあればお気軽に @susisu2413 までどうぞ.

Markdown に関する愚痴

Markdown は簡単に使えますが, 一方で仕様がはっきりしていないので, 実装によってかなり解釈が違って, 色々試しているときにかなり疲弊しました.

例えばこれは Atom 標準の Markdown のプレビュー markdown-preview-plus のデフォルト (markdown-it) なのですが, バッククォート ` 内にテーブルの区切りの縦線 | を書いた時にかなり意味不明な挙動をします.

今回のパッケージの実装は Pandoc の挙動に合わせたつもりですが, これが正しいとも言えないのでなんとも……

追記

機能追加, パフォーマンス向上などをして v0.2.0 としてリリースしました. 微妙に tab で移動するときの動作が変わっていますのでご注意ください.

あとキーバインドを重複を避けて決めるのが面倒になったので, むしろいくつか削除しました. 各自適当に設定してください. 参考までに以下は私の使っている設定です.

'atom-text-editor:not(.mini):not(.autocomplete-active).markdown-table-editor-active':
  'shift-cmd-left' : 'markdown-table-editor:align-left'
  'shift-cmd-right': 'markdown-table-editor:align-right'
  'shift-cmd-up'   : 'markdown-table-editor:align-center'
  'shift-cmd-down' : 'markdown-table-editor:align-default'
  'cmd-left'       : 'markdown-table-editor:move-left'
  'cmd-right'      : 'markdown-table-editor:move-right'
  'cmd-up'         : 'markdown-table-editor:move-up'
  'cmd-down'       : 'markdown-table-editor:move-down'
  'cmd-k cmd-i'    : 'markdown-table-editor:insert-row'
  'cmd-k alt-cmd-i': 'markdown-table-editor:delete-row'
  'cmd-k cmd-j'    : 'markdown-table-editor:insert-column'
  'cmd-k alt-cmd-j': 'markdown-table-editor:delete-column'