La programmation dans la philosophie UNIX est-elle la même que la programmation fonctionnelle?

30

L'environnement de programmation UNIX (le texte classique) indique que l'approche UNIX de la programmation consiste à créer de petits outils bien définis qui peuvent être combinés pour résoudre des problèmes plus complexes. En apprenant le C et le shell Bash, j'ai trouvé que c'était un concept puissant qui peut être utilisé pour traiter un large éventail de problèmes de programmation.

En utilisant simplement une plateforme Linux, le concept est assez clair et utilisé tout le temps. Toute expression formée sur la ligne de commande qui redirige les E / S, reliant les outils système comme ls, grep, etc., montre à quel point ce concept est puissant.

Ce qui me déroute, c'est que beaucoup de ces programmes sont écrits en C, en utilisant un style de programmation impératif / procédural, mais la façon dont ils sont utilisés et réunis sur la ligne de commande me semble beaucoup plus comme une programmation fonctionnelle, où chaque programme est une fonction isolée qui ne dépend pas de l'état de tout autre programme auquel il pourrait être joint.

Est-ce exact, comprendre que la philosophie de programmation UNIX est essentiellement une programmation fonctionnelle utilisant des outils qui peuvent avoir été construits en utilisant un style de programmation impératif?

dvanaria
la source
5
Je ne pense pas qu'il soit important que cette analogie soit exacte ou non. La question est, est-ce une analogie utile pour vous? Y penser en ces termes vous aide-t-il à écrire des programmes et à faire le travail?

Réponses:

19

Je pense que vous avez un point là - bas, mais cp, rm, cdet beaucoup d'autres changent d' état, de sorte qu'ils ne sont pas vraiment des fonctions. La philosophie UNIX consiste davantage à ne faire qu'une chose mais à bien le faire; bien le faire signifie souvent autoriser une utilisation fonctionnelle, mais pas toujours.

dancek
la source
9

La réponse se trouve dans la "Programmation des E / S Monadiques et UNIX shell" par Oleg Kiselyov.

Il s'agit d'un essai inspiré de l'article de Philip Wadler "Comment déclarer un impératif" [ Wadler97 ]. Nous montrerons des similitudes étranges entre les E / S monadiques dans Haskell et les compositions de filtres UNIX basées sur des tuyaux et des redirections. Les canaux UNIX (traités sémantiquement comme l'écriture dans des fichiers temporaires) sont assez similaires aux monades. De plus, au niveau de la programmation UNIX, toutes les E / S peuvent être considérées comme monadiques ...

horsh
la source
6

Eh bien, je suppose que vous pouvez le voir de cette façon si vous ignorez tout le problème des effets secondaires. Les commandes Unix n'agissent fréquemment PAS en fonction du fait de toujours renvoyer le même ensemble de données avec les mêmes entrées. Cependant, comme vous l'avez mentionné, l'aspect tuyauterie est similaire à la façon dont la programmation fonctionnelle peut être effectuée.

Brian Knoblauch
la source
1
Avez-vous vraiment un avion ?? ;) (désolé pour le commentaire hors sujet)
BlackBear
@BlackBear Pas mon propre personnel. Je suis dans un club où environ 50 d'entre nous possèdent collectivement 4 avions. C'est un peu plus abordable de cette façon. :-)
Brian Knoblauch
@Brian Knoblauch: J'aimerais avoir un avion à l'avenir .. si l'argent le permet: P
Blackear
5
La programmation fonctionnelle n'implique pas "pas d'effets secondaires". Le concept où la même fonction produit toujours le même résultat est appelé "idempotence" et n'est pas une condition nécessaire pour qu'un programme soit fonctionnel. Ceci est également connu comme "purement fonctionnel".
2

Dans une certaine mesure, vous pouvez le dire. Mais ce n'est pas nécessairement vrai. Je pense que vous devriez lire cela plus comme «la capacité de faire 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 pour être franc avec vous, peut être expliquée par l'exemple suivant.

Toute programmation est une sorte de manipulation de données! Et dans certains cas, la programmation est également une manipulation de programme elle-même (programmation Meta). Désormais, la philosophie UNIX fonctionne, imaginez le traitement du texte. Qu'est-ce que le texte? Le texte est une sorte de données après tout. Lorsqu'il est assemblé en définition organisée, le texte devient également XML et JSON. Le texte peut également être une liste de nombres, le texte peut également être des csv, des tsv et quoi d'autre! Dans d'autres, le texte ou la chaîne peut représenter une zone énorme de données de programmation, simplement parce que son contexte peut se tordre et se transformer en ce que nous voulons!

Toute programmation nécessite une certaine organisation des données. L'organisation nécessite une recherche ...

une. Là vous allez avec juste «grep», «fgrep» et sa famille pour le faire.

Une fois que vous recherchez, vous devez faire un tri.

b. Maintenant, nous avons la commande 'sort' pour le faire.

Vous venez de trier deux fichiers, vous souhaitez maintenant les comparer.

c. Maintenant, nous avons 'diff', 'cmp' et al pour le faire.

Vous venez de découvrir qu'il n'y a aucune différence entre les fichiers. Vous avez besoin de plus de données organisées maintenant.

ré. Vous avez 'cat', des pipes et des opérateurs de redirection pour écrire dans un fichier.

Vous avez besoin d'une analyse plus spécifique.

e. Vous avez la tête, la queue, plus, moins, coupez et al pour faire ça ...

Tout cela coud ensemble en utilisant le '|' pour générer des trucs vraiment puissants quelque temps sans écrire de code du tout. Pour plus de recherche 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 cut, diff et al peuvent vous donner. Vous êtes-vous déjà demandé que command1 | command2 | La série command3 ... est une sorte de mécanisme de workflow. Lorsqu'il est combiné avec If, cela devient plus puissant.

Vient maintenant plus de plaisir.

Avez-vous déjà entendu parler d'un utilitaire appelé «Perl» , cette chose est si puissante que vous pouvez pratiquement effectuer n'importe quelle tâche à portée de main avec aussi peu de travail imaginable. Assemblé avec un utilitaire tel que DBM, vous pouvez faire des demandes de persistance de temps même minimes pour votre application. N'oubliez pas que nous n'avons même pas quitté le monde du texte, mais que nous avons réussi à couvrir la plupart des aspects d'un environnement de programmation.

Je pense donc qu'UNIX est plus qu'un système d'exploitation. C'est une collection d'outils et d'environnement conçue pour résoudre les problèmes de la manière la plus simple. Un moyen simple n'implique pas nécessairement la simplicité de mise en œuvre de la solution. Mais la simplicité elle-même ne vous emmène pas beaucoup loin.

J'ai lu ceci quelque part sur reddit.

"Si votre seul objectif de conception est la simplicité, vous obtiendrez autant d'utilisateurs que Plan9"

kamaal
la source
1

La façon dont ils sont réunis sur la ligne de commande et interagissent les uns avec les autres est très fonctionnelle. Cependant, je dirais que cela a plus à voir avec la conception du shell, et moins à voir si ces programmes sous-jacents sont écrits impérativement ou fonctionnellement. La plupart des bons langages fonctionnels prennent en charge les concepts impératifs / procéduraux, même si leur conception globale se prête à la programmation fonctionnelle. Oui, de nombreuses fonctionnalités du shell UNIX utilisent des concepts fonctionnels mais, encore une fois, cela est davantage dû à la conception du shell qu'à l'implémentation particulière des programmes sous-jacents.

J'espère que cela t'aides,

-tjw

Travis Webb
la source