長く続く争い
プログラムを記述する際のインデントにタブ文字を使うか、複数のスペースを使うか。ここには大きく長く続く宗教論争があります。
「宗教論争」という言葉には「一部のコアな人たちだけのもので、一般人には縁遠く無関係な論争」という皮肉めいた意味がこめられています。しかしプログラマたるもの、考えなしににコーディングするわけにはいきません。理由があるならちゃんと考えないと。
私はスペースを用いる派です。
ちょっと気になることがあったので今回は調べてみました。
プログラミングのコードを書く時のタブvsスペース戦争がついに決着 | ギズモード・ジャパン
派閥の大きさに関して言えば、ほぼ決着していると見て良さそうです。私はあまり関心を持ってこなかったので両者の主張をもう一度じっくりと調べてみましょう。
インデントとは何か
インデントとは「字下げ」のことですが、プログラミングの世界では「ソースコードの構造を視覚的にわかりやすくするために行頭に空白を設けること」を指します。
インデントを設けるソースコードの構造とは、関数ブロックだったり条件ブロックだったり、繰り返し処理のブロックだったりします。
インデントとは何ではないか
この「行頭に設ける空白」の他にもソースコードを視覚的に読みやすくするために設ける空白があります。連続する変数の初期化でスペースをそろえたりするなどです。これはインデントではありません(が、しばしば混同されます。私も混同していました)。以下に図で示します。
上のイメージは EmEditor を使用しています。空白、タブ、CR、LF、CRLF、EOF などの不可視文字を表示させています。
行頭インデントと桁揃え
以降、この記事では行頭に使うものだけを「インデント」、行の途中で文字をそろえることを「桁揃え」と呼称します。一般的には違うかもしれませんが、記事中はそうします。
ハードタブとソフトタブ
ハードタブとは、タブにタブ文字を使うことです。
ソフトタブとは、タブ文字の変わりに複数のスペースを用いてそれを表現することです。「仮想タブ」と言い換えられるかもしれません。
タブとは、カーソルや文字の位置を任意の場所にずらすための制御文字のことです。
これはインデントに用いられることもあれば桁揃えに用いられることもあるため、インデントとは無関係な言葉です(しかしこれも混同して用いられることがあります)。
単に「タブ」と言う場合、狭義にはその「制御文字」自体のことを指しますが、広義にはその「任意の場所にずらすこと」も含んでいるのではないかと、私は考えています。
インデントにハードタブを用いる
「インデントにハードタブを用いる派」と「インデントにソフトタブを用いる派」が存在しています。前者が語るそうする理由は以下のようなものです。
- エディタの設定で各人が好みの幅にすることができる
- リソースを節約できる(タブ文字なら 1byte、スペースならその分使ってしまう)
もっともです。
以下のような理由もありました。
- スペースを用いるほうがタイプ数が多い(手間が多い)
しかしこれは逆であると__つまりハードタブを用いるほうがタイプ数が多くなると__私は考えています。理由は後述します。
また次のような指摘もありました。
- (ソフトタブについて)タブ文字を使用していないためタブという呼称は抵抗がある
私は前述のように「タブ」を制御文字という「もの」だけでなく任意の場所にずらす「こと」を含むと感じていますし、仮想タブという解釈も可能ならば、ソフトタブという呼称に対する抵抗感はなくなるかと思っています。
インデントにソフトタブを用いる
インデントにソフトタブを用いる派のそうする理由は以下のようなものです。
- どのような環境で見ても同じ見た目が保証されるため
これはチームのメンバーによって使用しているエディタが異なる場合に、人によって見え方が変わってしまうと問題があるとの立場です。
環境とは開発者の PC にインストールされているエディタに限りません。エディタだけでも各々の好みがあるのに、diff ツール、ページャなどの好みも考えるとその組み合わせは更に多くなります。管理のために Office ソフトにソースコード貼り付けて共有するプロジェクトもあるでしょう。
そういった「様々な環境」の中には制御文字を「長さの揃った空白を表示」するためではなく、文字通り「制御」を行うために用いるものがあり、その場合、前後の表示が大きく崩れる可能性があります。
今日ではソースコードを GitHub や Qiita、StackOverflow などで共有したりすることもあるでしょう。そのような場合もあらかじめソフトタブになっている方が有利に思えます。ソフトタブ派の隆盛はそんなところにも理由があるのかもしれません。
またソフトタブ派も、インデントの入力をスペースキーで行うわけではなく、多くのエディタに「Tab キーが押されたらスペースを入力する」という設定があるため、それを用いて入力しています。タイプ数は多くなりません。
桁揃えに用いるタブ
しかしながら通常、ソースコードはエディタで読み書きする時間が最も長いものなので、それを最優先に考えるべきであり、副次的な環境(diff ツールやページャ)に束縛されるべきではないという考え方はあり得ます。
そのようなわけで、インデントに用いるタブがハードタブかソフトタブかは、結局のところ「その人の好み」でよいのかもしれません。
インデントはそれで良いとして、行の途中で桁を揃えたい場合にはどすればよいでしょうか。これも「好み」の問題なので各人が好きにすればよいのでしょうか。
これはハードタブを用いてはダメそうです。
ハードタブを用いる際の前提は「エディタの設定で好きな幅に変えられる」でした。言い換えると「環境によって変わってしまう」です。
桁揃えにハードタブを用いた場合
インデントと桁揃えの両方をハードタブにし、エディタの設定でその幅を 8 としてソースコードを記述し、それを幅 4 の環境で見た場合にどうなるかを以下に示します。
ハードタブの幅を 8 に設定した場合。
ハードタブの幅を 4 に設定した場合。
インデントの方は位置が変わっても先頭が揃っているという点に違いはないため、問題にはなりません。
しかし桁揃えのほうはずれが発生しています。これは関数の一行目と三行目では用いるタブ文字が 1 個で済むのに対して二行目は 2 個のタブ文字があるためです。これは見づらく、問題になります。
したがってインデントにハードタブを用いるのは問題ないけれども、桁揃えはスペースを用いなければなりません。
ソフトタブ派の誤解
ソフトタブ派の主張となっている「ハードタブを用いるとエディタの設定によって桁が揃わなくなる」というものがありますが、これはインデントと桁揃えを混同しているものと思います。
インデントに関する限り、ハードタブを用いることのデメリットはそれほど多くありません。
ハードタブ派の誤解
しかしながらインデントにハードタブを用いている人は十中八九桁揃えにもハードタブを用いているのです。
「インデントはハードタブだ」とするのは構いませんが「桁揃えもハードタブだ」というのは上に見たとおり問題が発生します。「エディタで好みの幅に調整できる」という前提が崩れます。ハードタブを用いてなお、ソフトタブと同じように幅は強制されるのです。
この「桁揃えもハードタブで問題ない」というのがハードタブ派の多くの人が誤解している点__意識さえしていない点__ではないかと思います。
これは私も今回調べて初めて気づきました。
エディタの設定を調整する
どちらの派閥に属する人も、インデントも、桁揃えも、入力は Tab キーを使用しているはずです。
ではハードタブ派の人はエディタで「行頭だけハードタブ、行の途中で Tab キーを押したらスペースを入力」するように設定する必要があります。そのような設定ができるでしょうか。
そのような設定が出来るエディタはゼロではありませんが、けっして多くありません。
Tab キーでハードタブが入力されるようにエディタを設定している場合、行の途中で桁揃えを行うためにはスペースキーを用いることになるというのが現状です。
ソフトタブ派の人の多くはエディタ設定で「Tab キーの押下でスペース入力」としているかと思います。インデントも、行の途中の桁揃えも Tab キーを用いることが出来ます。したがって、ハードタブ派の方がタイプ数が多くなるはずです。あくまで桁揃えをスペースで行うならという前提ですが。
エディタの設定はソフトタブ派に有利
上記のように多くのエディタでは、ちゃんとインデントだけをハードタブにしようと思うと設定で対処することが難しい現状です。
「Tab キーの押下でスペースを入力する」設定を持つエディタはたくさんあります。その設定を使い、ソフトタブ派閥に入ることが楽なのです。
そのような理由で私はソフトタブ派に所属します。
ハードタブ派へのお願い
行の途中の桁揃えにハードタブを用いないでください。それはインデントではありません。
ソフトタブ派へのお願い
行の途中の桁揃えにハードタブを用いない限り、インデントにハードタブを使うことを許容してください。
ソフトタブ派の私ですが、長すぎたり短すぎたりするソフトタブは、やっぱりつらいと感じるのです。そんなときはハードタブ派がうらやましいのです。
どちらでもないという人へのお願い
上記のことに注意してください。混在は地獄です。
免責
すみません。混在させたことがあります。
ツール群
混在を予防したり、検知して修正してくれるツールがあります。Untabify、Fix Mixed Tabs、EditorConfig などのキーワードで検索してください。お使いのエディタ・IDE に適したツールが見つかるかと思います。