
No.6ベストアンサー
- 回答日時:
引退したソフトウェア研究者です。
インデントにタブを使うか、スペースを使うかは、以下のような歴史的な経緯もあると思います。
その昔、ホストのCRT端末でTSSのエディタを使っていた頃、タブはハードウェアタブ(HT)しかなく、タブ幅は8キャラクタ(だったと思う)固定でした。で、端末のエディタの画面は72桁しか表示しませんからタブに8桁を設定すると、あっという間に右端に達してしまいます。また、一行に書けるソースがみるみる減ってしまいます。
当時の言語として、アセンブラやFORTRAN(66)は構造化記述をサポートしておらず、インデントを必要としませんが、COBOLの場合、インデントを使ってデータ構造を表現する必要があるし、プログラムとしても、IF~THEN構文がありましたから、インデントを使って構造化を表現することも出来ました。Wirth博士由来のALGOLなども同様です。
ただ、タブが8キャラクタというのは明らかに多すぎるので、COBOLのプログラマ達はスペースを使ってDATA DIVISIONやプログラム本体(PROCEDURE DIVISION)のインデントを記述していました。
なお、TABキーを押すと画面上は次のHT位置(8桁先)にカーソルが移動しますが、ソースとして保存されるときはスペースに変換されてしまいます。そういう意味で、この時代、ソースにTABコードが書かれることはありませんでした。
TSS以前のパンチカードや紙テープではインデントは必然的にスペースでした(東京重機のパンチマシンにはタブがセットできたが、カード上は空白になる)。私も初めてコンピュータを使った頃は、スペースバーをガチャンガチャンと押してインデントしていました。まあ、この世代のエンジニアが現場にどれくらい残っているかわかりませんが(上の方には残っているか)、こういう世代の場合、
Cが使われた初期のVT端末の仕様はわかりかねますが、おそらく、HTしか無かったと思いますから、事象は同じではなかったでしょうか、テクトロの蓄積管を使ったVT互換のグラフィック端末はHTだけだったようなほのかな記憶があります。
初期のPC用エディタも同様にタブ幅固定でしたから、こういう環境だと、一行の記述陵を増やそうとするとどうしてもインデントは半角スペースでということになります。
そういや、Mindなどの日本語記述できる言語は全角スペースもインデントに使えたんじゃなかったかな
大規模プロジェクトで採用されるコーディングスタイルのルールを見ると、比較的少ない数(2つ程度)のスペースによるインデント、比較的短い桁での改行を義務づけているものが多いような気がしますが、これはやはり大人数での開発において、千差万別の開発環境で困る人が出ないようにという配慮なのでしょうか。
詳しい解説をありがとうございました。
引き続きスペースを使うメリットを調べていて、ひとつ興味深いことがわかりました。
以下のようなケースです。
class MyClass {
int num;
:
:
int func() {
return num;
};
};
ここの先頭にpublic宣言を入れたい場合、もしタブでインデントしていたら、publicはインデントせず左側に書くか、メンバの記述に揃えて書くかのどちらかになってしまいます。
もしこれを「スペース2つ」でインデントしていた場合、publicの記述位置はクラス宣言より右でメンバより左の位置、つまり左からスペース1つ分空けた「半インデント」の位置を使うことができます。switch文でのcaseを書く位置でも、この半インデントが使える可能性があります。スペース4つでインデントしていれば、1/4インデントや3/4インデントなんてものもできたりします。
このように、言語によってはその特性上スペースによるインデントが便利に使えるものもあると感じました。
No.5
- 回答日時:
>そこで、インデントをスペースにするメリットを教えてください。
スペースを利用している多くの人間は、「メリットがあるから」使っているわけではないように思う。おそらく「タブでもスペースでも、実用上、まったく違いがないから」使っているんじゃないだろうか。
現在、ほとんどのソースコードはエディタではなく統合開発環境の類いで書かれているんじゃないだろうか。そうしたものでは、スペースもタブも、ほぼ同じ感覚でインデントする。タブキーを押せば、自動的に半角スペース4つとかがぱっと書き出されるし、バックスペースを押せばタブ1つ分の半角スペースが一度にぱっと消える。というように、スペースもタブもまったく同じ感覚で扱えるようになっている開発ソフトは多い。
そして、そうしたものでは、デフォルトで半角スペースが設定されているものも多い。そうしたものを使っているために、自分ではまったく気がつかずに半角スペースをインデントに使っている、という人は多い気がする
統合開発環境の多くで、デフォルトにタブではなく半角スペースを採用しているのは、「半角スペースでないとインデントを正しく認識しない」ものがあるためだろう。たとえば、yamlでは、タブによるインデントは認識されない。またPythonでは、タブはすべて「半角スペース8文字」と認識して動くため、下手にタブを混在させるとインデントが崩れ、シンタックス自体がおかしくなることが多々ある。
統合開発環境でいろいろな言語に対応するものだと、最初から「全部半角スペースでインデント」としたほうが余計なトラブルを防げる、ということでないだろうか。どっちにしろ、こうした環境では、ユーザーは「タブも半角スペースもインデントとしてはまったく同じもの」なんだから、「どっちを使うべきか」という発想自体がそもそもないかもしれないな。
ご意見ありがとうございます。
タブにするかスペースにするかはコードを共有する人たちの間でルールが決まっていれば良いだけのことですが、最初にそのルールを決めるにあたってはメリット・デメリットを比較する必要もあるかと思います。
半角スペースでないとインデントを正しく認識しないエディタをサポートしようと思った場合は、比較をするまでもなくスペースを採用するしかないですね。これは比較的大人数で開発環境が把握できないプロジェクト等が当てはまるでしょうか。yamlを扱う場合も同様ですね。
No.4
- 回答日時:
int a; //コメント
int xxxxxx; //コメント
でタブ幅が変わると右のコメントがそろわないことがある。
int a;
double b;
同じくaとbがそろわないかも。
(こんなのは無理にそろえることもないと個人的には思ったりするけど、好みの問題か。)
特定のタブ幅を前提に、
[Sp][Sp]
[ タブ ]
[ タブ ][Sp][Sp]
[ タブ ][ タブ ]
みたいに字下げを深くされてると、
タブ幅が変わると見苦しくなる。
これはタブが悪いというより
タブとスペースを組み合わせてるのが悪いんだけど、
特定のタブ幅を前提として見た目を整えているコードは
残念ながらそれなりに見かけることがある。
そういえば、タブ字下げとスペース字下げが完全に混ざってるなんてのもあったなあ。
あれは酷かった。(迷わずコード整形したけど。)
いろいろ書いたけど、まともに(タブ幅違う環境を意識して)書いてくれるなら
どっちを使うかは好みの問題だと思う。
なお、私はたいていスペースで字下げしてます。
func(a,
b,
c);
こんな感じの字下げしたい場合に、bやcの字下げの
後半部分だけスペースにするのをうっかり忘れるかもしれないので。
タブ幅が違う環境を意識するのが面倒だから全部スペースに統一してると言ってもいいかな。
あ、でもJavaScriptはタブ字下げで統一してた。
エディタの入力支援機能のデフォルトがタブ字下げだったから
そのままタブを使うことにしたんだったか。
行の途中でのコメント等の頭揃えにも、スペースを使うべきですね。
> タブとスペースを(うっかり)組み合わせてしまう
> 字下げの後半部分だけスペースにするのをうっかり忘れるかもしれないので
これはエディタが自動的に修正・補完してくれない場合「人為的なうっかりミスを防止する」という意味でスペースでインデントするメリットと言えそうです。しかし逆に言えばうっかりタブを挿入してしまうことを防げるわけではないので、判断は難しいところですね。
このような決まりの下では、タブキーをキーボードから抜いてしまうのが最良の策かもしれません。
回答ありがとうございました。
No.3
- 回答日時:
インデントを単に開始位置をずらすという意味で使うならタブで充分ですが、ソースコードをより分かりやすくするために各行の桁位置を合わせたい場合があります。
#1さんの例でいうと、=の位置を合わせる場合はスペースを使うしかありません。
エディタによってはスペースが使いやすい場合もありますし、タブが使えないものやタブの桁数が固定のものもあります。
ちなみに私はスペースを使っています。
この回答への補足
ご指摘の通り、ブロックの開始位置ではない場所での、変数や引数などの見た目の位置を揃えるための調整には、タブではなくスペースを用いるべきであると思います。
またスペースを使うメリットとは言えませんが、タブが使えないエディタを考慮すると、ファイル内に一切タブを挿入してはならないという決まり事も出てきますね。
nag0720さんは開始位置をずらすためのインデントの目的でもタブではなくスペースを使われているということでしょうか?もしそうでしたら、そのメリットをぜひ教えていただければと思います。
タブよりスペースが使いやすいエディタを使われているということであれば、具体的にどのように使いやすいのかもあわせて教えていただけると嬉しいです。
No.1
- 回答日時:
作成者の好みで分かれるでしょう。
(私はタブが好きだが会社では半角スペース4文字にしています。)
>そこで、インデントをスペースにするメリットを教えてください。
>多く見かけたのは「どの環境でも同じように見える」というものですが、その場合なぜ同じように見える必要があるのかを教えてください。
例えばHTMLで
#<table border="1" id="table1" class="table2">
こんなものがあったとします。
これを
#<html border="1"
# id="table1"
# class="table2">
このように書いたとします。
(まぁ短いので普通はこんな風に書きませんが・・・)
これの半角スペース2つ分をタブとしている場合、
タブを半角スペース4つ分で設定している人には以下のように見えます。
#<html border="1"
# id="table1"
# class="table2">
書いた人(ひとつのタブが半角スペース2つ分)にとっては見やすいですが、見た人(ひとつのタブが半角スペース4つ分)にとってはちょっと見づらいです。
見る人によって異なる表示は見栄えがかわってしまうのでどの環境でも同じように見えるように半角スペースで記述することを推しています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Word(ワード) Word2013 一行目のインデント位置 1 2022/09/23 06:05
- 食器・キッチン用品 フライパンのメリット わたしは現在一人暮らしをしていて、ほぼ毎日自炊しています。 しかし持っている鍋 12 2023/04/13 16:40
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/02 10:20
- その他(パソコン・周辺機器) 適切なペンタブ(液タブ)を購入する方法が分かりません。 3 2023/06/24 10:44
- その他(車) スマートな運転、スマートな判断力。図を見て教えてください。 6 2023/04/14 03:39
- 建築士 【一級建築士さんに質問です】ハウスメーカーのモデルhouseの多くは階段下に収納スペ 4 2023/04/14 22:56
- Excel(エクセル) セルの値をグーグルで検索するエクセルVBAについて! 2 2022/08/01 21:41
- WordPress(ワードプレス) ワードプレスで、左寄せ画像と文字を横並びにせず、画像の下に文字を表示される方法を教えてください 1 2022/04/24 11:06
- Visual Basic(VBA) 指定列最終行までのスペースを改行するVBAについて 2 2022/06/01 19:50
- タブレット Androidタブレットと液タブを兼用したいと考えているのですが、専用設計の液タブやiPad pen 3 2022/12/05 03:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Windows の文字コードで半角、...
-
ローマ数字などの文字化け対策...
-
デザインが崩れる
-
入力規則で 英数字の2桁-4桁と...
-
改行されたデータをIEに貼り付...
-
テキストフィールドでの全角チ...
-
Excel VBエディタで自動メンバ...
-
JSで全角英数記号を半角英数記...
-
ASP.NET TextBox 入力制限
-
検索エンジンでHPのタイトルが...
-
AfterEffectsでイージーイーズ...
-
target="_blank"、ソースの表示
-
webページのソース表示が出来ない
-
H1タグに改行の<br>を使う
-
ソースの表示ができないんです
-
携帯サイトで、HTMLタグがその...
-
XMLを作成してもタグしか表示さ...
-
サイト上でmp4を再生させる方法
-
カウンターが正常に表示されない
-
HTMLとCSS(ブラウザ関連)につい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBA 見本通りに...
-
JSONパース時に改行があるとエ...
-
C#のシリアル通信プログラムで...
-
JavascriptでIMEのON,OFF制御
-
半角空白チェックについて
-
氏名の入力チェックに全角スペ...
-
ホームページ制作でコピーライ...
-
なぜtabによるインデントはいけ...
-
stray '\\240' in programのエ...
-
ASCII文字列以外を検出する正規...
-
半角スペースを含む文字列を変...
-
php でtabを空白に変換して表示...
-
改行されたデータをIEに貼り付...
-
指定した文字を始点にスペース...
-
(再投稿) Word VBA マクロ スペ...
-
ボタンコントロールのTEXT...
-
ローマ数字などの文字化け対策...
-
ASP.NET TextBox 入力制限
-
ソースコードのインデントについて
-
Pythonの勉強を始めました。バ...
おすすめ情報