L'environnement de programmation UNIX (texte classique) indique que l'approche UNIX de la programmation consiste à construire de petits outils bien définis pouvant être combinés pour résoudre des problèmes plus complexes. Dans l'apprentissage C et la coquille Bash, j'ai trouvé que c'était un concept puissant qui peut être utilisé pour faire face à un large éventail de problèmes de programmation.
Utilisez simplement une plate-forme Linux, le concept est assez clair et utilisé tout le temps. Toute expression formée sur la ligne de commande qui redirige des E/S, reliant des outils système tels que LS, Grep, plus ouc. montre à quel point ce concept est puissant.
La chose qui me confond est que beaucoup de ces programmes sont écrits en C, en utilisant un style de programmation impératif/procédural, mais la manière dont ils sont utilisés et assemblés ensemble sur la ligne de commande semblent beaucoup plus comme une programmation fonctionnelle pour moi, où chaque programme est Une fonction isolée qui ne dépend pas de l'état d'un autre programme qu'il pourrait être joint.
Est-ce précis, la compréhension de la philosophie de programmation UNIX est essentiellement une programmation fonctionnelle à l'aide d'outils pouvant avoir été construits à l'aide d'un style de programmation impératif?
Je pense que vous avez un point là-bas, mais cp
, rm
, cd
et beaucoup d'autres changent d'état, ils ne sont donc pas vraiment des fonctions. La philosophie UNIX est davantage à ne faire qu'une seule chose, mais bien le faire bien; Le fait souvent, cela signifie bien permettre une utilisation fonctionnelle, mais pas toujours.
La réponse est dans la section "PROGRAMMATION DE MONADIC E/S et UNIX SOQUE" par Oleg Kiselyov.
C'est un essai inspiré par le papier de Philip Wadler "Comment déclarer un impératif" [ Wadler97 ]. Nous montrerons des similitudes incroyées entre les E/S monadiques de Haskell et des compositions de filtres UNIX basées sur des tuyaux et des redirections. Les tuyaux UNIX (traités sémantiquement comme écriture à des fichiers temporaires) sont assez similaires à des monades. En outre, au niveau de la programmation Unix, tous les E/S peuvent être considérés monadiques ...
Eh bien, je suppose que vous pouvez en quelque sorte regarder de cette façon si vous ignorez la question des effets secondaires entière. Les commandes UNIX n'agissent fréquemment pas fonctionnelle en ce qui concerne toujours le retour des mêmes données avec les mêmes entrées. Cependant, comme vous l'avez mentionné, l'aspect de la tuyauterie est similaire à la manière dont la programmation fonctionnelle peut être effectuée.
Dans une mesure où vous pouvez dire cela. Mais ce n'est pas nécessairement vrai. Je pense que vous devriez le lire davantage comme "capacité à atteindre plus" avec une approche de conception simpliste. Et pour être simple, vous devrez diviser la tâche en pièces facilement compréhensibles et faciles à assembler. La philosophie UNIX doit être franche avec vous, peut être expliquée avec l'exemple suivant.
Toute la programmation est une sorte de manipulation de données! Et dans certains cas, la programmation est également la manipulation du programme elle-même (méta-programmation). Maintenant, la façon dont la philosophie Unix fonctionne est, imaginez un texte de traitement. Quel est le texte? Le texte est une sorte de données après tout. Lors de l'assemblage dans le texte de définition organisé devient également XML et JSON's. Le texte peut également être une liste de chiffres, le texte peut également être de CSV, TSV et ce qui n'est pas! Dans un autre texte ou une chaîne, vous pouvez représenter une grande étendue de données de programmation, simplement parce que son contexte peut être tordu et transformé en ce que nous voulons!
Toute la programmation nécessite une organisation de données de quelque sorte. L'organisation nécessite une recherche ...
une. Voilà avec juste avoir 'Grep', 'FGREP' et sa famille de faire cela.
Une fois que vous avez effectué votre recherche, vous devez faire du tri ..
b. Maintenant, nous avons la commande "trier" pour le faire.
Vous venez de trier deux fichiers, vous souhaitez maintenant les comparer.
c. Maintenant, nous avons 'diff', 'CMP' et AL de faire cela.
Vous venez de trouver qu'il n'y a pas de différence entre les fichiers. Vous avez besoin de plus de données organisées maintenant.
ré. Vous avez des opérateurs de pipe et de redirection pour écrire dans un fichier.
Vous avez besoin de plusieurs analyses spécifiques ..
e. Vous avez la tête, la queue, plus encore moins, coupée et al pour faire ça ...
Tout cela cousez ensemble en utilisant le '|' Pour générer des trucs réels puissants quelque temps sans écrire de code du tout. Pour plus de recherches et de couture, vous avez ..
f. awk, shell et sed.
awk, Shell et Sed vous donnent plus de contrôle sur le texte que ce que la coupe, Diff et al Peut vous donner. Vous êtes-vous déjà demandé que Command1 | Commande2 | Command3 ... la série est une sorte de mécanisme de flux de travail. Quand combiné avec si cela devient plus puissant.
Maintenant vient plus amusant.
Avez-vous déjà entendu parler d'un utilitaire appelé "Perl", cette chose est si puissante que vous pouvez pratiquement faire une tâche à portée de main avec un peu de travail imaginable. Curé avec un utilitaire comme DBM, vous pouvez faire des demandes de persistance même à petit temps pour votre application. N'oubliez pas que nous n'avons même pas quitté le texte du texte mais réussi à couvrir la plupart des aspects d'un environnement de programmation.
Je pense donc que Unix est plus qu'un système d'exploitation. C'est une collection d'outils et d'environnement conçus pour résoudre les problèmes de la manière la plus simple. Un moyen simple n'implique pas nécessairement la simplicité de la mise en œuvre de la solution. Mais la simplicité elle-même ne vous prend pas beaucoup de choses.
Je lis cela certains où sur Reddit.
"Si votre seul objectif de conception est la simplicité, vous obtiendrez autant d'utilisateurs que plan9"
La façon dont ils sont rejoints ensemble sur la ligne de commande et interagir les uns avec les autres sont très fonctionnels. Cependant, je dirais que cela a plus à voir avec la conception de la coquille, et moins à voir si ces programmes sous-jacents sont écrits imprégnemment ou fonctionnellement. La plupart des bonnes langues fonctionnelles soutiennent des concepts impératifs/procédures, même si leur conception globale se prête à la programmation fonctionnelle. Oui, bon nombre des fonctionnalités de shell UNIX utilisent des concepts fonctionnels, mais encore une fois, cela est davantage dû à la conception de la coquille que la mise en œuvre particulière des programmes sous-jacents.
J'espère que cela t'aides,
-TJW