Tabs versus Spaces

  Ralf Hersel   Lesezeit: 4 Minuten  🗪 8 Kommentare

Die Frage stellt sich bei der Textverarbeitung, beim Speicherplatz und bei der Programmierung.

tabs versus spaces

Wenn Blasen-Outsider diesen Artikel lesen würden, wäre ihre Reaktion ein irritiertes Kopfschütteln. Wie kann man nur über ein derart unbedeutendes Thema schreiben? Aber egal, wir sind hier (leider) in der Blase. Die Frage, ob man Tabulatoren oder Leerzeichen verwendet, hängt vom Einsatzzweck ab. Um es vorweg zu nehmen, ich bevorzuge in allen Fällen Tabs gegenüber Spaces.

Anhand dreier Beispiele zeige ich, warum man mit Tabulatoren immer besser beraten ist, als mit Leerzeichen:

Texte

Beim Einsatz von Textverarbeitungsprogrammen (LibreOffice Writer, usw.), ist die Entscheidung einfach. Wer Abstände mithilfe von Leerzeichen erzeugt, outet sich als Anfänger. Warum? Weil Leerzeichen vom gewählten Font abhängen, und somit keinen definierten horizontalen Abstand erzeugen können. Hier ein Beispiel:

In der ersten Zeile wird dieselbe Anzahl an Leerzeichen verwendet, jedoch die Schriftgrösse verändert. Die Abstände sind dadurch unterschiedlich gross, weil die Leerzeichen auch der Schriftart und Schriftgrösse unterliegen. In der zweiten Zeile habe ich Tabulatoren mit einem Abstand von 2 cm verwendet. Hier bleiben die Abstände gleich, obwohl sich die Schriftgrösse ändert. Das liegt daran, dass Tabulatoren unabhängig von der Schriftart und Schriftgrösse sind.

Speicherbedarf

Dass Leerzeichen mehr Speicher verbrauchen als Tabulatoren, liegt auf der Hand: 10 Spaces sind 10 Bytes, 1 Tab ist 1 Byte. Selbst wenn man Komprimierung ins Spiel bringt, schneiden die Tabs besser ab: 10 Spaces sind 10x1 Space; das benötigt immer noch mehr Speicherplatz als das eine Byte für den Tab. Zugegeben, das ist unbedeutend bei normalen Textmengen, summiert sich jedoch bei langen Texten.

Die Idee zu diesem Artikel kam mir, als ich diesen Beitrag gelesen habe: https://edjopato.de/post/2021/11/18-tabs-spaces/. Dort wird der Speicherbedarf ausführlicher beschrieben.

Programmierung

Kommen wir zum Elefanten im Raum: PEP8. Das ist der Style Guide für Python Code; sozusagen der heilige Gral für alle Python-Programmiererinnen. Da die Python-Syntax stark von der Formatierung des Codes abhängt, hat die Frage nach 'Tab oder Space' eine besondere Bedeutung. Der Style Guide sagt dazu Folgendes:

Spaces are the preferred indentation method.
Tabs should be used solely to remain consistent with code that is already indented with tabs.
Python 3 disallows mixing the use of tabs and spaces for indentation.

Klare Ansage; es sollen Leerzeichen verwendet werden. Tabs sollen beibehalten werden, wenn sie vorher bereits zum Einsatz kamen, um die Konsistenz zu wahren. Eine Mischung von Tabs und Spaces ist keine gute Idee, die vom Interpreter bemängelt wird.

Die grosse Frage ist: warum Spaces? Niemand mag Leerzeichen. Meiner Meinung nach stehen sie der Usability bei der Programmierung fundamental im Wege. Das Problem ergibt sich nicht beim Eintippen der Leerzeichen, weil die IDEs einem diese Arbeit abnehmen: Du tippst ein Tab und die IDE ersetzt es durch 4 Spaces. Welche Ironie ist das denn? Anscheinend weiss es dein Code-Editor besser als der PEP8-Styleguide.

Problematisch werden die Spaces beim späteren Editieren. Hier werden die Spaces nämlich nicht wie Tabs behandelt, sondern erfordern einige Tasteneingaben, um sie wieder loszuwerden. Bei einem Tab machst du ein Delete oder einen Backspace, um sich ihrer zu entledigen. Bei Spaces braucht man 4 oder 8 Tasteneingaben dafür. Ein weiterer Vorteil von Tabs liegt in der höheren Flexibilität. Falls mir die Einrückungen im Code zu gross oder klein erscheinen, muss ich nur die Breite der Tab-Definition ändern, anstatt alle Leerzeichen anzupassen.

Ich lasse mich jedoch gerne von euch überzeugen, warum PEP8 recht hat.

Tags

Spaces, Tabs, Leerzeichen, Tabulatoren, PEP8, Python, Tabulator

Scheks
Geschrieben von Scheks am 19. November 2021 um 10:30

Wer Texte mit Vim schreibt, hat beim „Loswerden“ gleichen Arbeitsaufwand für Tabs wie Spaces: dw, d0, cw etc. ;)

Problematisch können sich Tabs zeigen, wenn sie Struktur- und Layout-Funktionen übernehmen sollen. Das lässt sich nach meiner Erfahrung solider per strikter Trennung von Inhalt und Form realisieren.

666
Geschrieben von 666 am 19. November 2021 um 12:15

du willst doch nur die hölle brennen sehen

Max
Geschrieben von Max am 19. November 2021 um 13:35

Am schlimmsten: Mischen von Tabs und Spaces.

Schlimm: Tabs

Toll: Spaces ;)

Dieses Thema ist so endlos wie vim vs. emacs (Tipp: es ist vim). Ich finde Spaces einfach wunderbar einheitlich, leichter zu parsen, weniger fehleranfällig und passender bei Monospace-Fonts. Daher feiere ich PEP8 in diesem Punkt.

Den wirklich einzigen Vorteil sehe ich bei nicht-Monospace-Fonts mit viel Formatierung im Dokument, da hier der Tab wirklich immer denselben Abstand erzeugt.

Einige Dateitypen wie Makefiles erwarten jedoch Tabs, damit muss man dann halt leben. Ansonsten gehen die meisten großen Projekte, Firmen und Programmiersprachen aber auf Spaces mit unterschiedlicher Tiefe.

👓
Geschrieben von 👓 am 20. November 2021 um 11:04

Ich bin Schockiert. Warum interessiert sich ein Interpreter dafür ob ich Leerschläge oder Tabs verwende. Programmier- oder Scriptsprachen sind doch Strukturierte Daten. Es wäre doch wahnsin wenn der Style Einfluss darauf hat, ob ein Programm funktioniert oder nicht. Eigentlich müsste es doch so sein, dass der Programmierstiel völlig egal sein sollte. Bein Programmieren geht es doch darum Welche Programmbefehle in welcher Reihenfolge wie ausgeführt werden. Dafür strukturiert man die Befehle und seine Parameter in Reihe und untergeordneter zu anderen Befehlen und Parameter.

Wenn es nach mir ginge müsste ein jeder Programmcode doch vor dem compilieren oder Interpretieren in eine einheitliche Strukturierte Form wie z.B. XML oder JSON oder sonst eine Datenbank gebracht werden und dann von da aus verarbeitet werden.

Ich dachte irgendwie immer, dass der Persönliche Programmierstiel daher für andere nicht relevant ist, weil die Editoren den Quellcode nach den eigenen Vorlieben formatieren können und weil der Quellcode nachher eh in ein einheitliches Maschinenlesbares hoch strukturiertes Format, wie XML, JSON oder gar in eine Datenbank gelesen wird.

Das macht für mich auch mehr Sinn, Schliesslich muss doch der Compiler nachher den Code optimieren. Wo ginge das den besser als wenn strukturierte Daten in einer Datenbank zur Verfügung stehen.

Andanan
Geschrieben von Andanan am 19. November 2021 um 16:45

Wenn es um Quellcode und Markup geht ist meine klare Meinung: Beide!

Beide haben ihren jeweiligen Einsatzzweck:

  • Tabs für die Einrückung
  • Spaces fürs Alignment.

Das hat den Vorteil, dass jeder sich die Einrückungsbreite im Editor seiner Wahl nach belieben konfigurieren kann ohne, dass das Alignment kaputt geht. Ich konfiguriere mir z.B. immer (wo möglich) eine Tab-Breite von 3 Zeichen, weil mir 2 zu wenig und 4 zu viel sind :P

kamome
Geschrieben von kamome am 19. November 2021 um 18:45

Klar Tabs! und Alignment möglichst vermeiden ;)

Adrian
Geschrieben von Adrian am 19. November 2021 um 17:00

In der Textverarbeitung (Word, Openoffice) ist Tabs ein muss wenn du eine schöne Formatierung haben willst.

Für Code ist das schlimmste was passieren kann ein mix von Spaces und Tabs, daher habe ich mir angewöhnt Spaces zu verwenden. Warum? Gefällt mir einfach besser.

Alex
Geschrieben von Alex am 20. November 2021 um 08:23

Zur Ergänzung sei hier noch erwähnt, dass es dank POSIX mit expand und unexpand relativ leicht ist, zwischen beiden Formen hin und her zu wechseln.