Un limbaj de programare este o modalitate stabilă de a exprima un construct compus în unul sau mai multe limbaje de programare . Un idiom este un model pentru rezolvarea unei probleme, scrierea unui algoritm sau a unei structuri de date prin combinarea elementelor de limbaj încorporate.
Un idiom poate fi considerat modelul de proiectare de cel mai scăzut nivel aplicat la intersecția dintre proiectare și codificare într-un limbaj de programare. Un idiom prescrie o modalitate specifică de a implementa anumite detalii și relațiile dintre ele folosind mijloacele unei anumite limbi. Setul de idiomuri depinde de limbajul de programare, iar același idiom poate arăta diferit în două limbi diferite, sau poate să nu fie necesar într-una dintre ele [1] .
Un idiom poate fi o reproducere într-o limbă a unor elemente dintr-o limbă diferită din punct de vedere semantic, care pot fi aplicabile și în această limbă, dar nu sunt provocate de limba în sine (adică nu sunt printre idiomurile sale). Din această perspectivă, multe modele în designul orientat pe obiecte sunt văzute ca reproduceri idiomatice ale elementelor limbajelor funcționale [2] [3] .
În limbi precum BASIC , expresia de creștere a valorii unei variabile cu una este:
i = i + 1Versiune prescurtată în limbaje asemănătoare C :
i += 1 ; /* i = i + 1; */ ++ i ; /* acelasi rezultat */ i ++ ; /* acelasi rezultat */Pascal conține o procedură de atribuire similară:
i := i + 1 ; Inc ( i ) ; (*acelasi rezultat*)În majoritatea limbilor, schimbul de valori între două variabile arată astfel:
temp = a ; a = b _ b = temp ;În Perl , aceasta arată mai elegant:
( $a , $b ) = ( $b , $a );Pascal :
în timp ce true do begin do_something () ; sfârşitul ;În limbajele asemănătoare C , există multe moduri de a organiza bucle infinite, dar următorul exemplu arată acest lucru în cel mai evident mod:
pentru (;;) { face_ceva (); }Perl acceptă atât sintaxa C, cât și alte variante:
face_ceva () în timp ce ( 1 ); # buclă infinită scurtată while ( 1 ) { face_something () }; # asemănătoare # Folosind un „bloc gol” și operatorul redo { do_something (); reface ; }Ada :
bucla face_ceva ; buclă de capăt ;Python :
în timp ce este adevărat : fă_ceva ()Multe limbi au o implementare a unui tablou asociativ , așa-numita. masa hash .
Implementarea matricei asociative în Perl :
my %elements = map { $_ => 1 } @elements ;Autorul cărții Learn Ruby The Hard Way, Zed Shaw, observă că atitudinea față de idiomuri în comunitățile de dezvoltatori sugerează că utilizarea idiomurilor ar trebui clasificată drept moravuri , deoarece atunci când scrieți în limbaj natural, care necesită claritate în prezentare, idiomurile ar trebui fi evitat [4 ] . El dă următorul exemplu din Ruby Styleguide [5] :
arr = [ 1 , 2 , 3 ] # rău pentru elem în arr do pune capăt elem # bun arr . fiecare { | element | pune elem }Utilizarea unei bucle for , conform stilului oficial Ruby , este depreciată, iar .each. Poziția lui Shaw este că studenții limbajelor de programare ar trebui să învețe nu numai idiomurile unui anumit limbaj de programare, ci și modalități alternative de codificare - acest lucru evită îndoctrinarea și facilitează tranziția către alte limbi.