シンタックスハイライト
シンタックスハイライト(英: Syntax highlighting)とは、テキストエディタの機能であり、テキスト中の一部分をその分類ごとに異なる色やフォントで表示するものである。シンタックスカラーリング(英: Syntax coloring)とも。
この機能により、プログラミング言語やマークアップ言語といった構造化された言語において、その構造や構文上のエラーが視覚的に区別しやすくなるため、ソースコードの記述が容易となる。エディタによってはシンタックスハイライトと、スペルチェックやコード畳み込みといった、その他の機能を統合して提供するものもある。
目次 |
実用上の特徴[編集]
シンタックスハイライトは、特に複数ページにわたるようなコードについて、テキストの可読性を向上させ、文脈をより明瞭にするための手法の1つである。読み手は関心のないコードやコメントを、それが長いものであっても、楽に無視して読むことができる。
また、プログラマがプログラム中の誤りをさがす助けともなる。例えば、ほとんどのエディタは文字列のリテラルを地のコードとは異なった色でハイライトする。文字色の対比から、文字列リテラルの区切り記号の忘れを見つけることがより簡単になる。また、多くのテキストエディタには括弧の対応をチェックする機能もある。カーソル位置の括弧のペアを特別な色で表示することで、正しく対応しているかの確認が容易となる。
エディタによっては、色付けの情報を印刷や他のテキスト処理ソフトウェアとの交換に適した形式でエクスポートできるものもある。エクスポート用のファイル形式としてはHTMLや色つきのLaTeX、PostScript、RTFなどが使われる。
しかし、シンタックスハイライトには
- 流し読みがしやすくなるので、プログラマはコード全体を理解しようとはしなくなる
- タイポグラフィ上の理由から、ハイライトされたコードはされていないコードよりも実際には判読性が劣ってしまう
という指摘もある[1]。
実例[編集]
以下はC++のコードをシンタックスハイライトしたものである。
// Allocate all the windows for (int i = 0; i < max; i++) { wins[i] = new Window(); }
この例では、ソフトウェアはキーワード(予約語)として for・int・new を、変数名として i・wins・max を判別し、異なる色でハイライトしている。1行目のコメントもコード部分とは区別できるようにハイライトされている。
複数の言語への対応と限界[編集]
1つ以上の言語に対応するエディタでは、シンタックスハイライトを正しくおこなうために、ユーザーがテキストの言語を指定するか、エディタがファイルの拡張子や内容から言語を自動的に判別する必要がある。
複数の言語のシンタックスハイライトをサポートする方法として、言語ごとにシンタックスハイライトの規則を独立して保持する方式がある。この方式には複数の言語に対応したエディタの作成がある程度は簡単になるという利点があるが、潜在的な限界もある。
例えば、ユーザーによっては以下のような要求もありうる。
- 複数の言語を含むテキストを取り扱いたい。例えば JavaScript コードを埋め込んだHTMLファイルなど。
- エディタが対応していない言語のテキストを取り扱いたい。例えば、マイナーな言語や擬似コードなど。
1985年に Live Parsing Editor(LEXXやLPEXと呼ばれる)がオックスフォード英語辞典の電子化のために開発された。これが色付きのシンタックスハイライトを利用したおそらく最初のエディタであろう。その Live parsing 機能はユーザーが文章やプログラム、データファイル用にパーサを追加することができた[2]。
ほとんどのエディタは、言語ごとにパーサを実装するといった複雑で面倒な方法はとらず、パターンマッチによるヒューリスティクスに基づいてシンタックスハイライトを行うので、その結果は完全に正確というわけにはいかない。さらに、パターンマッチのアルゴリズムによっては、ある種の構文のハイライト処理が非常に遅いものとなってしまう。常にファイル全体を解析するのではなく、表示する部分のみを解析することでこの問題を解決するエディタもある。
脚注[編集]
- ^ Linus Åkesson (2007年8月26日). “A case against syntax highlighting”. 2007年8月28日閲覧。
- ^ LEXX – A programmable structured editor, Cowlishaw, M. F., IBM Journal of Research and Development, Vol 31, No. 1, 1987, IBM Reprint order number G322-0151