« Uniligne » : différence entre les versions
interwiki |
Fonctionnalité de suggestions de liens : 3 liens ajoutés. |
||
(44 versions intermédiaires par 34 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
Un '''uniligne''' (''{{Lang|en|one liner}}'' pour les anglophones) est généralement un [[programme informatique]] jetable, mais peu banal, écrit pour une tâche ponctuelle en un [[langage de script]] tel que [[Perl (langage)|Perl]] ou [[Ruby]], et tenant sur une seule ligne. Des langages qui imposent plusieurs phases avant l'exécution, la déclaration explicite de [[variable (informatique)|variables]], de [[fonction (informatique)|fonctions]] ou, pire, de [[classe (informatique)|classes]], ne se prêtent pas aux unilignes. Les unilignes bénéficient des qualités [[DWIM]] (''{{Lang|en|Do What I Mean}}'') et [[DRY]] (''{{Lang|en|Don't Repeat Yourself}}'') propres à certains langages. |
|||
[[en:One-liner program]][[zh:單行小程式]] |
|||
Un '''uniligne''' est généralement un programme jetable, mais peu banal, écrit pour une |
|||
tâche ponctuelle en un [[langage de script]] tel que [[Langage de programmation Perl|Perl]]. |
|||
Des langages qui imposent plusieurs phases avant l'exécution, la |
|||
déclaration explicite de [[variable]]s, de [[fonction (informatique)|fonction]]s ou, pire, de |
|||
[[classe]]s, ne se prêtent pas aux unilignes. |
|||
Parce qu'un uniligne est rarement destiné à être réutilisé, les considérations de lisibilité par un tiers sont secondaires. Certains unilignes sont des [[code impénétrable|assombrissements]] délibérés. En revanche, ils peuvent être pédagogiques en démontrant de manière concise certains idiotismes du langage. Il faut néanmoins savoir que certains idiotismes deviennent |
|||
Parce qu'un uniligne est rarement destiné à être réutilisé, les |
|||
inapplicables ou dangereux dans le cadre de programmes avec beaucoup de lignes de code. |
|||
considérations de lisibilité par un tiers sont secondaires. |
|||
Certains unilignes sont des [[assombrissement]]s délibérés. |
|||
== |
== Historique == |
||
⚫ | |||
Le mot est apparu pour la première fois dans le livre de [[Alfred Aho|Alfred V. Aho]], [[Peter Weinberger|Peter J. Weinberger]] et [[Brian Kernighan|Brian W. Kernighan]], ''{{Lang|en|The AWK Programming Language}}''. Ce livre a pour sujet le langage [[Awk]], utilisé dans le [[système d'exploitation]] Unix. Les auteurs expliquent comment leur travail quotidien sur Unix fut à l'origine de ce paradigme : « La version de [[1977]] d'[Unix] possédait très peu de variables internes et de fonctions prédéfinies. Elle est conçue pour écrire des programmes courts […] Notre modèle était qu'un appel de fonction serait long d'une ou deux lignes, exécutées sitôt tapées. […] Nous, en tant qu'auteurs, « savions » comment le langage était censé être utilisé, et c'est pour cela que nous n'écrivions que des unilignes. » |
|||
⚫ | |||
⚫ | |||
== Exemples == |
|||
=== En AWK === |
|||
Le livre ''The AWK Programming Language'' contient plus de vingt exemples à la fin du premier chapitre. |
|||
Voici les premiers : |
|||
::1. Afficher le nombre total de lignes lues en entrée : |
|||
END { print NR } |
|||
::2. Afficher la dixième ligne d'un fichier : |
|||
NR == 10 |
|||
::3. Afficher le dernier champ de chaque ligne : |
|||
{ print $NF } |
|||
=== En [[Perl (langage)|Perl]] === |
|||
Inverser tous les octets d'un fichier : |
|||
<syntaxhighlight lang="Perl"> |
|||
perl -0777e 'print scalar reverse <>' nomFichier |
|||
</syntaxhighlight> |
|||
Les unilignes sont également utilisés pour démontrer l'expressivité de certains langages de programmation. Ils servent souvent à démontrer le talent du programmeur, et de nombreux concours sont organisés pour savoir qui fera le plus exceptionnel. |
|||
=== En [[C (langage)|C]] === |
|||
Voici un exemple en C, lauréat du concours [[International Obfuscated C Code Contest|IOCCC]]. |
|||
<syntaxhighlight lang="C"> |
|||
main(int c,char**v){return!m(v[1],v[2]);}m(char*s,char*t){return*t-42?*s?63==*t|*s==*t&&m(s+1,t+1):!*t:m(s,t+1)||*s&&m(s+1,t);} |
|||
</syntaxhighlight> |
|||
Ce programme permet de vérifier si une [[chaîne de caractères]] correspond à un motif, avec les conventions [[Unix]] : * pour une suite de caractères quelconques de longueur quelconque, ? pour un seul caractère… Le code de retour est 0 pour vrai et 1 sinon. À noter que la correspondance motif se fait sur toute la chaîne, et non sur un sous-ensemble de celle-ci. |
|||
Exemples d'exécution : |
|||
$ prog foo 'f??'; echo $? → renvoie 0 (correspondance) |
|||
$ prog 'chaine quelconque' '??ai*e**n?*'; echo $? → renvoie 0 (correspondance) |
|||
$ prog 'chaine quelconque' 'ch*o?'; echo $? → renvoie 1 (non-correspondance) |
|||
=== En [[Haskell]] === |
|||
Il y a deux déclarations <tt>import</tt> ce qui porte en réalité le nombre de lignes du programme à trois. Cet uniligne trie les lignes qu'il prend en entrée selon l'[[ordre lexicographique]] du code [[American Standard Code for Information Interchange|ASCII]]. |
|||
import IO |
|||
import List |
|||
main = (mapM_ putStrLn . sort . lines) =<< getContents |
|||
=== En [[Java (langage)|Java]] === |
|||
[[Hello world]] en Java : |
|||
<syntaxhighlight lang="Java"> |
|||
public class OneLine { public static void main(String[] args) { System.out.println("Hello World!"); } } |
|||
</syntaxhighlight> |
|||
=== En [[Tool Command Language|Tcl-Tk]] === |
|||
Calcul de la [[factorielle]] : |
|||
<syntaxhighlight lang="tcl"> |
|||
proc ! x {expr {$x<2? 1: $x*[! [incr x -1]]}} |
|||
</syntaxhighlight> |
|||
== Voir aussi == |
|||
* [[Code impénétrable]] |
|||
* [[Perl (langage)|Perl]] |
|||
⚫ | |||
⚫ | |||
* {{fr}} [http://wfr.tcl.tk/1831 Uniligne en Tcl-Tk] |
|||
* {{en}} [http://sial.org/howto/perl/one-liner/ Perl One Liners] |
|||
* {{en}} [https://web.archive.org/web/20060504130615/http://www.rollmop.org/oneliners/perl.html Perl Oneliners] |
|||
* {{en}} [http://www.unixguide.net/unix/perl_oneliners.shtml Hot Perl OnLiners] |
|||
⚫ | |||
{{Portail|programmation informatique}} |
|||
[[Catégorie:Programmation informatique]] |
|||
[[Catégorie:Langage de script]] |
|||
[[Catégorie:Développement logiciel]] |
|||
[[Catégorie:Perl]] |
Dernière version du 10 juillet 2023 à 09:30
Un uniligne (one liner pour les anglophones) est généralement un programme informatique jetable, mais peu banal, écrit pour une tâche ponctuelle en un langage de script tel que Perl ou Ruby, et tenant sur une seule ligne. Des langages qui imposent plusieurs phases avant l'exécution, la déclaration explicite de variables, de fonctions ou, pire, de classes, ne se prêtent pas aux unilignes. Les unilignes bénéficient des qualités DWIM (Do What I Mean) et DRY (Don't Repeat Yourself) propres à certains langages.
Parce qu'un uniligne est rarement destiné à être réutilisé, les considérations de lisibilité par un tiers sont secondaires. Certains unilignes sont des assombrissements délibérés. En revanche, ils peuvent être pédagogiques en démontrant de manière concise certains idiotismes du langage. Il faut néanmoins savoir que certains idiotismes deviennent inapplicables ou dangereux dans le cadre de programmes avec beaucoup de lignes de code.
Historique
[modifier | modifier le code]Le mot est apparu pour la première fois dans le livre de Alfred V. Aho, Peter J. Weinberger et Brian W. Kernighan, The AWK Programming Language. Ce livre a pour sujet le langage Awk, utilisé dans le système d'exploitation Unix. Les auteurs expliquent comment leur travail quotidien sur Unix fut à l'origine de ce paradigme : « La version de 1977 d'[Unix] possédait très peu de variables internes et de fonctions prédéfinies. Elle est conçue pour écrire des programmes courts […] Notre modèle était qu'un appel de fonction serait long d'une ou deux lignes, exécutées sitôt tapées. […] Nous, en tant qu'auteurs, « savions » comment le langage était censé être utilisé, et c'est pour cela que nous n'écrivions que des unilignes. »
Exemples
[modifier | modifier le code]En AWK
[modifier | modifier le code]Le livre The AWK Programming Language contient plus de vingt exemples à la fin du premier chapitre.
Voici les premiers :
- 1. Afficher le nombre total de lignes lues en entrée :
END { print NR }
- 2. Afficher la dixième ligne d'un fichier :
NR == 10
- 3. Afficher le dernier champ de chaque ligne :
{ print $NF }
En Perl
[modifier | modifier le code]Inverser tous les octets d'un fichier :
perl -0777e 'print scalar reverse <>' nomFichier
Les unilignes sont également utilisés pour démontrer l'expressivité de certains langages de programmation. Ils servent souvent à démontrer le talent du programmeur, et de nombreux concours sont organisés pour savoir qui fera le plus exceptionnel.
En C
[modifier | modifier le code]Voici un exemple en C, lauréat du concours IOCCC.
main(int c,char**v){return!m(v[1],v[2]);}m(char*s,char*t){return*t-42?*s?63==*t|*s==*t&&m(s+1,t+1):!*t:m(s,t+1)||*s&&m(s+1,t);}
Ce programme permet de vérifier si une chaîne de caractères correspond à un motif, avec les conventions Unix : * pour une suite de caractères quelconques de longueur quelconque, ? pour un seul caractère… Le code de retour est 0 pour vrai et 1 sinon. À noter que la correspondance motif se fait sur toute la chaîne, et non sur un sous-ensemble de celle-ci. Exemples d'exécution :
$ prog foo 'f??'; echo $? → renvoie 0 (correspondance) $ prog 'chaine quelconque' '??ai*e**n?*'; echo $? → renvoie 0 (correspondance) $ prog 'chaine quelconque' 'ch*o?'; echo $? → renvoie 1 (non-correspondance)
En Haskell
[modifier | modifier le code]Il y a deux déclarations import ce qui porte en réalité le nombre de lignes du programme à trois. Cet uniligne trie les lignes qu'il prend en entrée selon l'ordre lexicographique du code ASCII.
import IO import List main = (mapM_ putStrLn . sort . lines) =<< getContents
En Java
[modifier | modifier le code]Hello world en Java :
public class OneLine { public static void main(String[] args) { System.out.println("Hello World!"); } }
En Tcl-Tk
[modifier | modifier le code]Calcul de la factorielle :
proc ! x {expr {$x<2? 1: $x*[! [incr x -1]]}}
Voir aussi
[modifier | modifier le code]Liens externes
[modifier | modifier le code]- (fr) Unilignes Perl
- (fr) Uniligne en Tcl-Tk
- (en) Perl One Liners
- (en) Perl Oneliners
- (en) Hot Perl OnLiners
- (en) Perl One Liners