Die Unix-Philosophie empfiehlt die Verwendung kleiner, generisch wiederverwendbarer Kooperationsprogramme, die mit Formen der prozessübergreifenden Kommunikation wie Pipes, Fifos und Sockets zusammenarbeiten, im Gegensatz zu gemeinsamem Speicherplatz und Verknüpfung. Die Programme MH und uzbl werden häufig als Beispiele für Anwendungen angegeben, die die Unix-Philosophie in ihrem Design veranschaulichen.
Wenn dies der Fall ist, stimmt es nicht, dass die Unix-Philosophie bei der Gestaltung von Webanwendungen völlig aufgegeben wurde? Fast alle Webanwendungen, die Anforderungen verarbeiten, werden jetzt als einzelne große monolithische Prozesse mit langer Laufzeit erstellt, die den gesamten Anforderungs- / Antwortzyklus (abgesehen von Aufrufen eines externen Datenbankprogramms) nicht nur für eine Ressource, sondern für alle Ressourcen in einer gesamten Domäne verarbeiten.
Liegt dies hauptsächlich daran, dass das Weiterleiten an eine Sammlung externer Programme zum Erstellen einer dynamischen Antwort auf eine Webanforderung zu viel Prozessstartzeitaufwand verursacht? Ich kann sehen, wie dies der Fall ist, wenn Sie zu Ruby- oder Python-Skripten wechseln möchten, aber wenn Sie eine Sprache wie Haskell verwenden, die Sie kompilieren können, verschwinden echte Hindernisse für die Befolgung der Unix-Philosophie beim Erstellen von Web-Apps?
quelle
Antworten:
Ich denke, es hängt sehr davon ab, wo Sie eine Grenze zwischen Anwendungen ziehen (dh wie definieren Sie eine Anwendung) und welche Anwendungsfälle Sie berücksichtigen.
Während Sie einen Webbrowser als Zusammenführung von
wget
/ implementieren könntencurl
, einen HTML / XML-Parser, der eine einfache Anwendung für jeden Dokumentknoten aufruft, eine eigenständige JavaScript-Engine, die mit all dem interagiert, und einen "einfachen" Anzeiger, der "nur" Platzieren Sie die Ausgabe des oben genannten auf dem Bildschirm (und geben Sie die Eingaben an einen Kernkoordinierungsprozess zurück). Dies wäre sogar noch chaotischer als (wahrscheinlich jeder andere) heutige Browser.Das Weiterleiten der Daten an einen externen Prozess - so hat es tatsächlich begonnen . Wenn Sie sich Sorgen über die Größe eines durchschnittlichen Webanwendungscodes machen, sind diese häufig groß (und häufig, weil sie sich über einer Plattform befinden, die in einer interpretierten Programmiersprache und nicht in einer "einfachen" Anwendung geschrieben ist), aber vergleichen Sie sie zu ihren Äquivalenten. E-Mail-Clients, Bürosuiten ... Sie nennen es. All dies ist recht komplex und verfügt über zu viele Funktionen, um als mehrere Prozesse implementiert zu werden, die über Pipes kommunizieren. Für die Aufgaben, für die Sie diese Anwendungen verwenden, sind sie häufig ebenfalls komplex. Es gibt keine guten einfachen Lösungen für komplexe Probleme.
Vielleicht ist es an der Zeit, ein wenig über die Motivation hinaus hinter das UNIX-Motto "Anwendungen, die ein wenig tun, aber gut darin sind" zu schauen. Ersetzen Sie "Anwendungen" durch "allgemeine modulare Einheiten" und Sie gelangen zu einer der grundlegenden guten Programmierpraktiken: Machen Sie die Dinge modular, damit Teile separat wiederverwendet und entwickelt werden können . Das ist wirklich wichtig, IMHO (und die Wahl der Programmiersprache hat sehr wenig damit zu tun).
ps (nach dem Kommentar) : Im strengsten Sinne haben Sie größtenteils Recht - Webanwendungen folgen nicht der UNIX-Philosophie (in mehrere kleinere eigenständige Programme aufgeteilt zu sein). Das gesamte Konzept einer Anwendung scheint jedoch eher trübe zu sein -
sed
könnte in einigen Situationen wahrscheinlich als Anwendung angesehen werden , während es normalerweise nur als Filter fungiert.Daher hängt es davon ab, wie wörtlich Sie es nehmen möchten. Wenn Sie die übliche Definition eines Prozesses verwenden - etwas, das als einzelner Prozess ausgeführt wird (im Sinne des Kernels), ist beispielsweise eine von einem Modul in httpd interpretierte PHP-Webanwendung genau das Gegenteil. Fallen geladene gemeinsam genutzte Bibliotheken immer noch in den Bereich eines einzelnen Prozesses (weil sie denselben Adressraum verwenden) oder sind sie bereits etwas getrennter (vom Standpunkt des Programmierers unveränderlich, vollständig wiederverwendbar und über eine genau definierte API kommunizierend)?
Andererseits sind die meisten Webanwendungen heutzutage in Client- und Serverteile unterteilt, die als separate Prozesse ausgeführt werden - normalerweise auf verschiedenen Systemen (und sogar physisch getrennter Hardware). Diese beiden Teile kommunizieren über eine gut definierte (normalerweise textuelle) Schnittstelle (XML / HTML / JSON über HTTP) miteinander. Oft (zumindest im Browser) gibt es mehrere Threads , die die Client-Seite der Anwendung verarbeiten (JavaScript / DOM, Eingabe / Ausgabe ...), manchmal sogar einen separaten Prozess, auf dem ein Plugin ausgeführt wird (Java, Flash, ... ). Das klingt genau wie das Original UNIX - Philosophie, vor allem auf Linux, wo Threads sind Prozesse durch (fast) jedes Konto.
Darüber hinaus sind die Serverteile so gut wie immer in mehrere Teile unterteilt. Ein separates Datenbankmodul, das angeforderte Operationen an strukturierten (oder unstrukturierten) Daten ausführt, ist ein kanonisches Beispiel. Es macht einfach nicht viel Sinn, eine Datenbank in einen Webserver zu integrieren. Es macht jedoch auch wenig Sinn, eine Datenbank in mehrere Prozesse aufzuteilen, die sich darauf spezialisiert haben, beispielsweise nur Anforderungen zu analysieren, Daten aus dem Datenspeicher abzurufen, die Daten zu filtern ... Man muss ein Gleichgewicht zwischen der Erstellung eines allmächtigen Giganten und einem Schwarm von fast nilpotenten Arbeitern, die die meiste Zeit miteinander reden.
Was die Textschnittstelle betrifft: Beachten Sie, dass das, was vor 40 Jahren für verarbeitete Daten galt, heute nicht unbedingt zutrifft - Binärformate sind sowohl hinsichtlich des für die De- / Serialisierung erforderlichen Speicherplatzes als auch der für die De- / Serialisierung erforderlichen Leistung billiger, und die Datenmenge ist immens größer.
Eine weitere wichtige Frage ist auch, was eigentlich das Ziel der UNIX-Philosophie war. Ich glaube nicht, dass numerische Simulationen, Bankensysteme oder öffentlich zugängliche Fotogalerien / soziale Netzwerke jemals gewesen sind. Die Wartung von Systemen, auf denen diese Dienste ausgeführt werden, war und ist jedoch definitiv auch in Zukunft.
quelle
Ich bin mir nicht sicher, ob Unix-Philosophie jemals im Design von Webanwendungen präsent war. Obwohl sich viele Webanwendungen so verhalten, wie Sie es beschrieben haben, könnte man bedenken, dass Webanwendungen heutzutage eher Datenkonsumenten sind (Angesichts der zunehmend von API / Webdiensten gesteuerten Methode zur Erstellung von Daten für den Webverbrauch).
Dies könnte wiederum dazu führen, dass kleine, wiederverwendbare Komponenten (in Form von JavaScript-Funktionen) verwendet werden, die miteinander zusammenarbeiten, sodass möglicherweise eine kleine Parallele besteht.
quelle