Komplikation von Konsolenbefehlen, 1979–2020

Mein Hobby ist es, McIlroys „UNIX-Philosophie“ auf einem Monitor zu öffnen , während ich auf einem anderen Mana lese.

Das erste von McIlroys Prinzipien wird oft als "Mach eine Sache, aber mach es gut" umformuliert. Dies ist eine Abkürzung für seine Worte: "Erstellen Sie Programme, die eine Sache gut machen." Erstellen Sie für neue Arbeiten neue Programme, anstatt die alten durch Hinzufügen neuer "Funktionen" zu komplizieren. "

McIlroy gibt ein Beispiel:

Für Außenstehende scheint es überraschend, dass UNIX-Compiler keine Listen erstellen: Das Drucken wird besser durchgeführt und mit einem separaten Programm flexibler konfiguriert.

Wenn Sie die Hilfe für öffnen ls, beginnt sie mit

ls [-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1] [file ...]

Das heißt, die Ein-Buchstaben-Flags für lsenthalten alle Kleinbuchstaben mit Ausnahme von {jvyz}14 Großbuchstaben @und 1. Dies ist 22 + 14 + 2 = 38 nur Einzelzeichenoptionen.

In Ubuntu 17 zeigt die Hilfe für lskeine normale Zusammenfassung an, aber Sie werden sehen, dass lses 58 Optionen gibt (einschließlich --helpund --version).

Mal sehen, ob dies eine einzigartige Situation oder ein normaler Zustand ist. Lassen Sie uns eine Liste einiger gängiger Befehle erstellen, sortiert nach Verwendungshäufigkeit.



Die Tabelle zeigt die Anzahl der Befehlszeilenoptionen für verschiedene Befehle von v7 Unix (1979), Slackware 3.1 (1996), Ubuntu 12 (2015) und Ubuntu 17 (2017). Je mehr Parameter vorhanden sind, desto dunkler sind die Zellen (auf einer logarithmischen Skala).

Wir sehen, dass die Anzahl der Optionen im Laufe der Jahre dramatisch zunimmt: In der Regel werden Datensätze von links nach rechts dunkler (mehr Optionen), und es gibt keine Fälle, in denen Datensätze heller werden (weniger Optionen).

McIlroy hat die Zunahme der Anzahl von Optionen, der Größe und der Gesamtfunktionalität von Teams seit langem verurteilt 1::

Alles war klein, und jetzt zieht sich mein Herz zusammen, wenn ich die Größe unter Linux sehe ... [unverständlich]. Die gleichen Dienstprogramme, die früher in acht Kilobyte passten, wurden jetzt zu Megabyte. Und eine Manpage, die früher eine Seite war, … Unix : « ? ?» , - , . , , , . … , .

Ironischerweise ist einer der Gründe für die wachsende Anzahl von Befehlszeilenoptionen McIlroys anderes Sprichwort: "Schreiben Sie Programme zur Verarbeitung von Textströmen, da dies eine universelle Schnittstelle ist" (siehe lsals Beispiel).

Wenn strukturierte Daten oder Objekte übertragen wurden, kann die Formatierung bis zur letzten Stufe beibehalten werden. Bei einfachem Text werden Formatierung und Inhalt jedoch gemischt. Da die Formatierung nur durch Parsen von Inhalten erfolgen kann, fügen Befehle normalerweise der Einfachheit halber Formatierungsoptionen hinzu. Darüber hinaus kann die Formatierung durchgeführt werden , wenn der Benutzer seine Kenntnis der Datenstruktur und „codiert“ dieses Wissen in die Argumente gilt für cut,awk ,sedusw. (Der Benutzer verwendet auch sein Wissen darüber, wie diese Programme mit der Formatierung funktionieren, da es für verschiedene Programme unterschiedlich ist, sodass der Benutzer beispielsweise wissen muss, wie es cut -f4 sich von awk '{ print $4 }2 unterscheidet) Dies ist viel mühsamer als das Übergeben von ein oder zwei Argumenten an den nächsten Befehl in einer Sequenz, und dies überträgt die Komplexität des Tools auf den Benutzer.

Manchmal sagen die Leute, dass sie strukturierte Daten nicht unterstützen möchten, weil man dann in einem universellen Tool mehrere Formate unterstützen müsste. Sie müssen jedoch bereits mehrere Formate unterstützen, um ein universelles Werkzeug zu erstellen. Einige Standardbefehle können die Ausgabe anderer Befehle nicht lesen, da sie andere Formate verwenden. Zum Beispiel behandelt wc -wUnicode es nicht richtig usw. Zu sagen, dass „Text“ ein universelles Format ist, ist dasselbe wie zu sagen, dass „binär“ ein universelles Format ist.

Es wird gesagt, dass es keine Alternative für eine solche Komplikation von Befehlszeilentools gibt. Aber Leute, die das sagen, haben noch nie eine Alternative ausprobiert, so etwas wie PowerShell. Ich habe viele Beschwerden über PowerShell, aber die Übertragung strukturierter Daten und die Möglichkeit, problemlos mit strukturierten Daten zu arbeiten, ohne Metadaten im Kopf zu behalten, damit ich sie an den richtigen Stellen in der Pipeline an die richtigen Befehlszeilentools übertragen kann, gehört nicht zu meinen Beschwerden 3.

Wenn Sie erfahren, dass Programme während der Textverarbeitung einfach und kompatibel sein sollten, geben diese Personen vor, dass Textdaten keine Struktur zum Parsen von 4 haben. In einigen Fällen können wir uns alles als eine durch Leerzeichen getrennte Zeile oder als eine Tabelle mit Zeilen- und Spaltentrennzeichen vorstellen ( mit einem Verhalten, das natürlich nicht mit anderen Werkzeugen übereinstimmt ). Dies fügt ein bisschen Ärger hinzu. Es gibt immer noch Fälle, in denen das Serialisieren von Daten in ein Nur-Text-Format eine erhebliche Komplexität verursacht, da aufgrund der Datenstruktur eine einfache Serialisierung von Text anschließend erhebliche Analyseaufwände erfordert, um Daten auf sinnvolle Weise neu zu assimilieren.

Ein weiterer Grund, warum Teams jetzt mehr Optionen haben, besteht darin, dass Benutzer praktische Flags für Funktionen hinzugefügt haben, die von einer Pipeline mehrerer Teams implementiert werden könnten. Diese Praxis wird seit Unix v7 fortgesetztls Eine Option schien die Sortierreihenfolge zu ändern (obwohl dies durch Übergeben der Ausgabe an erfolgen könnte tac).

Im Laufe der Zeit wurden aus praktischen Gründen zusätzliche Parameter hinzugefügt. Zum Beispiel ein Befehl, der ursprünglich keine Parameter hattemvJetzt kann die Datei verschoben und gleichzeitig eine Sicherung erstellt werden (drei Optionen; zwei verschiedene Möglichkeiten zur Angabe einer Sicherung, von denen eine ein Argument und die andere keine Argumente enthält, lesen ein implizites Argument aus einer Umgebungsvariablen VERSION_CONTROL; mit einer anderen Option können Sie das Standardsuffix der Sicherung überschreiben ) Jetzt mvgibt es immer noch Optionen, um niemals Dateien zu überschreiben oder nur neuere Dateien zu überschreiben.

mkdirein anderes Programm, das zuvor keine Optionen hatte. Heute werden alle Flags mit Ausnahme der Sicherheitsoptionen für SELinux oder SMACK sowie der Hilfe- und Versionsnummern nur zur Vereinfachung hinzugefügt: Festlegen von Berechtigungen für das neue Verzeichnis und Erstellen übergeordneter Verzeichnisse, falls diese nicht vorhanden sind.

ZutailAnfangs gab es nur eine Option -number, die den Startpunkt für den Job angab. Dann haben wir sowohl Formatierungen als auch Optionen hinzugefügt, um die Formatierung zu vereinfachen. Das Flag -zersetzt das Zeilentrennzeichen durch null. Hier sind weitere Beispiele für Optionen -f, -sdie der Einfachheit halber hinzugefügt wurden: Drucken, wenn neue Änderungen angezeigt werden, Festlegen des Zeitlimits zwischen dem Überprüfen von Änderungen / Code> -f und -retryerneuter Versuch, auf die Datei zuzugreifen, wenn sie nicht verfügbar ist.

McIlroy kritisiert Entwickler dafür, dass sie all diese Optionen hinzugefügt haben, aber ich persönlich fühle mich besser. Obwohl ich einige von ihnen nie verwendet habe, habe ich andere selten verwendet, aber das ist das Schöne an den Befehlszeilenparametern - im Gegensatz zur grafischen Oberfläche führt das Hinzufügen dieser Parameter nicht zu einer Überlastung der Oberfläche. Ja, Mana und Hilfe schwellen an, aber im Zeitalter von Google und Stackoverflow googeln viele auf jeden Fall nur eine Frage, anstatt Mana zu lesen.

Das Hinzufügen von Optionen erhöht natürlich die Belastung der Betreuer. Dies ist jedoch eine faire Zahlung für die damit verbundenen Vorteile. Angesichts des Verhältnisses von Anzahl der Betreuer und Benutzer ist es logisch, erstere zusätzlich zu belasten und nicht letztere. Dies ähnelt der Bemerkung von Gary Bernhardt, dass es ratsam ist, eine Aufführung 50 Mal zu proben. Wenn das Publikum 300 Personen umfasst, beträgt das Verhältnis der Zeit, die für das Anschauen der Aufführung aufgewendet wird, zu der Zeit, die für die Proben aufgewendet wird, immer noch 6: 1. Bei gängigen Befehlszeilentools ist dieses Verhältnis noch extremer.

Einige könnten argumentieren, dass all diese zusätzlichen Optionen die Benutzer zusätzlich belasten. Das ist nicht ganz falsch, aber diese Last der Komplexität wird immer bestehen. Die Frage ist wo genau. Wenn Sie sich vorstellen, dass eine Reihe von Befehlszeilentools zusammen mit einer Shell eine Sprache bilden, in der jeder eine neue Methode schreiben kann, und im Falle der Beliebtheit die Methode effektiv zur Standardbibliothek hinzugefügt wird und die Standards durch Axiome wie "Programme zum Verarbeiten von Textströmen schreiben" bestimmt werden, da sie universell sind Schnittstelle “, dann verwandelt sich die Sprache in ein inkohärentes Nur-Schreib-Chaos, wenn Sie es in seiner Gesamtheit betrachten. Zumindest können Unix-Benutzer dank Tools mit einer Vielzahl von Optionen und Funktionen einen riesigen Satz wild inkonsistenter Tools durch nur einen großen Satz von Tools ersetzen, dieObwohl sie von außen nicht miteinander vereinbar sind, weisen sie eine gewisse interne Konsistenz auf.

McIlroy impliziert einen Mangel an Nachdenklichkeit in der Toolbox. Die Gründerväter von Unix sollten im selben Raum sitzen und sorgfältig überlegen, bis sie eine Reihe von sequentiellen Werkzeugen von "außerordentlicher Einfachheit" gefunden haben. Aber es wird nicht skalieren, die Philosophie von Unix selbst hat unweigerlich zu dem Durcheinander geführt, in dem wir uns befinden. Es ist nicht so, dass jemand nicht lange oder hart nachgedacht hätte. Der Punkt ist eine Philosophie, die nicht über ein relativ kleines Team mit einem gemeinsamen kulturellen Verständnis hinausgeht, das in einen Raum passt.

Wenn jemand ein Tool schreiben möchte, das auf der „Unix-Philosophie“ basiert, haben verschiedene Personen unterschiedliche Meinungen darüber, was „Einfachheit“ oder das Prinzip „eine Sache tun“ bedeutet 5wie das Tool richtig funktionieren sollte - und Inkonsistenzen werden in üppigen Farben aufblühen, wodurch Sie eine enorme Komplexität erhalten, ähnlich wie bei wild inkonsistenten Sprachen wie PHP. Die Leute machen sich über PHP und JavaScript lustig, weil es verschiedene Kuriositäten und Inkonsistenzen gibt, aber wie eine Sprache und eine Standardbibliothek ist jede beliebte Shell mit einer Sammlung beliebter * nix-Tools zusammen viel schlimmer und enthält aufgrund von Inkonsistenzen selbst innerhalb derselben Linux-Distribution eine viel zufälligere Komplexität . Es kann nicht anders sein. Wenn Sie die Distributionen von Linux, BSD, Solaris, AIX usw. vergleichen, überschattet die zufällige Komplexität, die Benutzer beim Systemwechsel berücksichtigen sollten, die Inkonsistenz von PHP oder JavaScript.Die am weitesten verbreiteten Programmiersprachen sind echte Beispiele für großartiges Design im Vergleich zu ihnen.

Aus Gründen der Klarheit sage ich nicht, dass ich selbst oder jemand anderes die Entwicklung in den 70er Jahren unter Berücksichtigung des damals verfügbaren Wissens besser bewältigen und ein System schaffen könnte, das zu dieser Zeit nützlich und heute elegant wäre. Natürlich ist es einfach, zurückzublicken und im Nachhinein Probleme zu finden. Ich bin einfach nicht einverstanden mit den Kommentaren einiger Unix-Kenner wie McIlroy, die andeuten, dass wir den Wert der Einfachheit vergessen haben oder nicht verstehen. Oder Ken Thompson, der sagt, dass C eine so sichere Sprache ist wie jede andere, und wenn wir nicht möchten, dass Fehler auftreten, müssen wir nur Code ohne Fehler schreiben. Kommentare dieser Art implizieren, dass sich im Laufe der Jahre wenig geändert hat. Angeblich haben wir in den 70er Jahren Systeme auf die gleiche Weise wie heute gebaut, und für fünf Jahrzehnte kollektiver Erfahrung haben uns zig Millionen Personenjahre nichts beigebracht. Und wenn wir uns den Ursprüngen zuwenden, den Entwicklern von Unix, dann wird alles gut. Bei allem Respekt stimme ich nicht zu.

Anwendung: Speicher


Während McIlroys Beschwerden über aufgeblähte Binärdateien etwas außerhalb des Geltungsbereichs dieses Artikels liegen, stelle ich fest, dass ich 2017 ein Chromebook mit 16 GB RAM für 300 US-Dollar gekauft habe. Die 1-Megabyte-Binärdatei könnte 1979 ein ernstes Problem darstellen, als der Standard-Apple II mit 4 Kilobyte Speicher ausgestattet war. Apple II kostete 1979 1.298 USD oder 2020 4.612 USD. Heute können Sie ein kostengünstiges Chromebook kaufen, das weniger als 1/15 dieses Preises kostet und über vier Millionen Mal mehr Speicher verfügt. Beschwerden, dass die Speichernutzung tausendmal zugenommen hat, erscheinen etwas lächerlich, wenn (tragbar!) Die Maschine viel billiger ist und vier Millionen Mal mehr Speicher hat.

Ich mag die Optimierung, deshalb habe ich meine Homepage auf zwei Pakete eingegrenzt (es würde eines geben, wenn das CDN brotli high-level unterstützt), aber dies ist eine rein ästhetische Anforderung, ich mache es zum Spaß. Der Engpass bei den Befehlszeilentools verwendet keinen Speicher, und die Zeit zum Optimieren des Arbeitsspeichers des Tools mit einer Größe von einem Megabyte entspricht dem Reduzieren einer Homepage auf ein Paket. Vielleicht ein lustiges Hobby, aber nichts weiter.

Methode zur Tabellenerstellung


Die Häufigkeit der Verwendung von Befehlen wird aus den öffentlichen Dateien des Befehlsverlaufs auf github ermittelt und entspricht nicht unbedingt Ihrer persönlichen Erfahrung. Es wurden nur "einfache" Befehle gezählt, ausgenommen Instanzen wie curl, git, gcc (letzteres hat mehr als 1000 Optionen) und wget. Das Konzept der Einfachheit ist relativ. Eingebaute Shell-Befehle wie z. B. cdwurden ebenfalls nicht berücksichtigt.

Das Wiederholen von Flags wurde nicht als separate Option angesehen. Zum Beispiel, u git blame -C, git blame -C -Cund ein git blame -C -C -Canderes Verhalten, aber sie werden alle als ein Argument in Betracht gezogen werden, obwohl -C -Csie -C tatsächlich unterschiedliche Argumente.

Unteroptionen in der Tabelle werden als eine Option gezählt. Beispielsweise wird lsFolgendes unterstützt:

--format=WORD across -x, commas -m, horizontal -x, long -l, single-column -1, verbose -l, vertical -C

Trotz sieben Optionen formatzählt dies als eine Option.

Optionen, die explizit als nutzlos angegeben werden, werden weiterhin als Optionen betrachtet, die beispielsweise ls -gignoriert werden.

Mehrere Versionen derselben Option werden als eine Option betrachtet. Zum Beispiel -Aund --almost-allfür ls.

Wenn das Zertifikat besagt, dass die Option vorhanden ist, in Wirklichkeit jedoch nicht vorhanden ist, wird sie nicht berücksichtigt. In der Hilfe zu v7 mv heißt es beispielsweise:

TASCHEN

Wenn sich Datei1 und Datei2 in unterschiedlichen Dateisystemen befinden, sollte mv die Datei kopieren und das Original löschen. In diesem Fall wird der Name des Eigentümers zum Namen des Kopiervorgangs, und jede Verbindung mit anderen Dateien geht verloren.

mv muss das Flag -f als rm akzeptieren , um eine Nachricht über das Vorhandensein einer Zieldatei zu unterdrücken, die nicht beschreibbar ist.

Es -fwird jedoch nicht als Flag in der Tabelle betrachtet, da die Option tatsächlich nicht vorhanden ist.

Die Tabelle endet 2017, da dann der erste Entwurf dieses Artikels geschrieben wurde. Erst jetzt konnten sie es lesen.

Zu diesem Thema



, , -, //.



1. Dieses Zitat unterscheidet sich geringfügig von der allgemeinen Version, da ich das Originalvideo angesehen habe . Soweit ich das beurteilen kann, stammen alle Kopien dieses Zitats im Internet (Bing-, DuckDuckGo- und Google-Indizes) aus derselben Transkription einer Person. Es gibt eine gewisse Mehrdeutigkeit, weil der Klang von schlechter Qualität ist und ich Wörter höre, die sich geringfügig von dem unterscheiden, was diese Person gehört hat. [zurückgeben]

2. Ein weiteres Beispiel dafür, wie Komplexität an den Benutzer weitergegeben wird, da verschiedene Teams die Formatierung unterschiedlich handhaben, ist die Zeitformatierung . Die eingebaute Shell-Zeit ist timenatürlich nicht kompatibel mit /usr/bin/time. Der Benutzer muss sich dieser Tatsache bewusst sein und wissen, wie er damit umgehen soll. [zurückgeben]

3. Zum Beispiel für jedes Objekt, das Sie verwenden können ConvertTo-Jsonoder ConvertTo-CSV. Oder "Cmdlets", um die Anzeige der Objekteigenschaften zu ändern . Sie können Formatierungskonfigurationsdateien schreiben, die Ihre bevorzugten Formatierungsmethoden definieren.

Eine andere Möglichkeit, dies zu betrachten, ist das Prisma von Conways Gesetz . Wenn wir eine Reihe von Befehlszeilentools haben, die von verschiedenen Personen erstellt wurden, häufig von verschiedenen Organisationen, sind diese Tools äußerst inkonsistent, wenn jemand den Standard nicht bestimmen und die Leute dazu zwingen kann, ihn zu akzeptieren. Dies funktioniert unter Windows relativ gut, nicht nur unter PowerShell.

Eine häufige Beschwerde gegen Microsoft ist der massive Umsatz der API, häufig aus nichttechnischen organisatorischen Gründen (siehe beispielsweise Stephen Sinofskys Aktionen, wie in den Antworten auf einen Remote-Tweet beschrieben ). Es stimmt. Aus Sicht eines naiven Benutzers überträgt die Standard-Windows-Software in der Regel nicht-textuelle Daten viel besser als * nix. Die Erfassung von nicht-textuellen Daten in Windows geht mindestens auf COM im Jahr 1999 zurück (und möglicherweise auf OLE und DDE, die 1990 bzw. 1987 veröffentlicht wurden).

Zum Beispiel, wenn Sie aus dem Foo, das das Binärformat unterstützt, Aund Bin der Leiste, die Formate unterstützt, kopieren Bund Cdann von der Leiste nach Baz kopieren, das Cund unterstütztDwird alles gut funktionieren, auch wenn Foo und Baz keine gemeinsamen unterstützten Formate haben.

Wenn Sie etwas ausschneiden oder kopieren, teilt die Anwendung der Zwischenablage im Wesentlichen mit, in welchen Formaten sie Daten bereitstellen kann. Beim Einfügen in eine Anwendung kann die endgültige Anwendung Daten in einem der verfügbaren Formate anfordern. Wenn sich die Daten bereits in der Zwischenablage befinden, wird sie von Windows bereitgestellt. Ist dies nicht der Fall, empfängt Windows Daten von der Quellanwendung und überträgt sie dann an die Zielanwendung. Eine Kopie wird einige Zeit gespeichert. Wenn Sie aus Excel "ausschneiden", sagt er "Sie", dass er Daten in vielen Dutzend Formaten zur Verfügung hat. Ein solches System ist für die Kompatibilität ziemlich gut, obwohl es sicherlich nicht als einfach oder minimalistisch bezeichnet werden kann.

Neben der guten Unterstützung vieler Formate reicht es aus, dass viele Programme mit diesen Funktionen gut umgehen. Unter Windows gibt es normalerweise eine gute Unterstützung für die Zwischenablage.

Angenommen, Sie kopieren eine kleine Textmenge und fügen sie ein. In den meisten Fällen treten unter Windows oder Linux keine Überraschungen auf. Angenommen, Sie haben Text kopiert, das Programm, aus dem Sie kopiert haben, geschlossen und dann eingefügt. Viele Benutzer neigen dazu zu glauben, dass beim Kopieren Daten in der Zwischenablage und nicht in dem Programm gespeichert werden, aus dem sie kopiert werden. Unter Windows wird Software normalerweise gemäß dieser Erwartung geschrieben (obwohl technisch gesehen Benutzer der Zwischenablage-API dies nicht tun sollten). Dies ist unter Linux mit X weniger häufig, wo das richtige mentale Modell für die meisten Programme darin besteht, dass beim Kopieren ein Zeiger auf die Daten gespeichert wird, die noch zu dem Programm gehören, von dem es kopiert wird. Das heißt, die Einfügung funktioniert nicht, wenn das Programm geschlossen wird.Wenn ich (informell) Programmierer interviewte, waren sie normalerweise überrascht, es sei denn, sie arbeiteten wirklich mit der Copy + Paste-Funktion für ihre Anwendung. Wenn ich Nicht-Programmierer interviewte, fanden sie dieses Verhalten normalerweise nicht nur überraschend, sondern auch verwirrend.

Der Nachteil beim Übertragen der Zwischenablage auf das Betriebssystem besteht darin, dass das Kopieren großer Datenmengen teuer ist. Angenommen, Sie kopieren eine wirklich große Textmenge, viele Gigabyte oder ein komplexes Objekt und fügen es dann nicht ein. Tatsächlich möchten Sie diese Daten nicht von Ihrem Programm auf das Betriebssystem kopieren, damit sie dort gespeichert und verfügbar sind. Windows tut dies mit Bedacht: Anwendungen können Daten nur bei Bedarf bereitstellen , wenn dies als vorteilhaft erachtet wird. In unserem Fall kann der Benutzer beim Schließen des Programms festlegen, ob Daten in die Zwischenablage gestellt oder gelöscht werden sollen. In diesem Fall bieten viele Programme (z. B. Excel) an, Daten in der Zwischenablage zu speichern oder zu löschen, was durchaus sinnvoll ist.

Einige dieser Funktionen können unter Linux implementiert werden. Zum Beispiel,Die ClipboardManager-Spezifikation beschreibt einen Speichermechanismus, den GNOME-Anwendungen normalerweise unterstützen (wenn auch mit einigen Fehlern ). Die Situation unter * nix unterscheidet sich jedoch erheblich von der allgegenwärtigen Unterstützung für Windows-Anwendungen, bei denen normalerweise eine kompetente Zwischenablage implementiert ist. [zurückgeben]

4. Ein weiteres Beispiel sind Tools auf modernen Compilern. Schauen wir uns noch einmal das kanonische Macilroy-Beispiel an, in dem die richtigen Unix-Compiler so spezialisiert sind, dass die Auflistung von einem separaten Tool durchgeführt wird. Aber heute hat sich dies geändert, obwohl ein separates Listing-Tool erhalten geblieben ist. Einige beliebte Linux-Compiler bieten buchstäblich Tausende von Optionen - und sie sind äußerst funktionsreich. Eine der vielen Funktionen der Moderne clang ist beispielsweise die statische Analyse. Zum Zeitpunkt dieses Schreibens gibt es 79 Routinetests der statischen Analyse und 44 experimentelle Tests.. Wenn dies separate Befehle wären, würden sie sich immer noch auf dieselbe grundlegende Compiler-Infrastruktur stützen und denselben Wartungsaufwand verursachen. Es ist eigentlich unangemessen, dass diese statischen Analysetools mit einfachem Text arbeiten und die gesamte für sie erforderliche Compiler-Toolkette neu definieren Erhalten des Punktes, an dem sie statische Analysen durchführen können. Sie können separate Befehle sein, anstatt zu Clang kombiniert zu werden, aber sie hängen immer noch von demselben Mechanismus ab und belasten entweder den Compiler mit Wartung und Komplexität (der stabile Schnittstellen für Tools unterstützen sollte, die darauf arbeiten), oder sie sind konstant brechen.

Der Einfachheit halber klingt es schön, alles im Text zu tun, aber tatsächlich ist die Textdarstellung der Daten oft nicht das, was Sie brauchen, wenn Sie einen wirklich nützlichen Job machen möchten.

Der gleiche Clang ist einfach funktionaler als jeder Compiler, der 1979 existierte, oder sogar alle Compiler, die 1979 existierten, unabhängig davon, ob er von einem monolithischen Befehl oder Tausenden kleinerer Anweisungen ausgeführt wurde. Es ist leicht zu sagen, dass 1979 alles einfacher war und dass wir, moderne Programmierer, in die Irre gegangen sind. In Wirklichkeit ist es jedoch schwierig, ein Design anzubieten, das viel einfacher ist und von allen wirklich akzeptiert wird. Es ist unmöglich, dass ein solches Design alle vorhandenen Funktionen und Konfigurierbarkeit beibehält und so einfach ist wie etwas von 1979. [zurückgeben]

5. Curl hat sich seit seiner Einführung von der Unterstützung von drei Protokollen auf 40 verschoben. Bedeutet dies, dass es „40 Dinge erledigt“, und erfordert die Unix-Philosophie, dass es in 40 separate Befehle unterteilt wird? Kommt darauf an, wen man fragt. Wenn jedes Protokoll ein eigenes Team wäre, das von einer anderen Person erstellt und unterstützt wird, hätten wir das gleiche Durcheinander wie mit den Teams. Inkonsistente Befehlszeilenparameter, inkonsistente Ausgabeformate, obwohl dies alles Textströme sind usw. Bringt uns dies der Einfachheit näher, die McIlroy befürwortet? Kommt darauf an, wen man fragt. [zurückgeben]

All Articles