# Estratègia d'avaluació

En un llenguatge de programació, una estratègia d'avaluació és un conjunt de regles per avaluar expressions. El terme s'utilitza sovint per referir-se a la noció més específica d'una estratègia de pas de paràmetres que defineix el tipus de valor que es passa a la funció per a cada paràmetre (l'estratègia d'enllaç) i si cal avaluar els paràmetres d'una crida de funció, i si és així, en quin ordre (l'ordre d'avaluació). La noció d'estratègia de reducció és diferent, tot i que alguns autors combinen els dos termes i la definició de cada terme no està àmpliament d'acord.
Per il·lustrar-ho, l'execució d'una crida a una funció f(a,b) pot avaluar primer els arguments a i b, emmagatzemar els resultats en referències o ubicacions de memòria ref_a i ref_b, i després avaluar el cos de la funció amb aquestes referències passades. Això li dona a la funció la possibilitat de buscar els valors dels arguments, modificar-los mitjançant l'assignació com si fossin variables locals i retornar valors mitjançant les referències. Aquesta és l'estratègia d'avaluació de crida per referència.
L'estratègia d'avaluació forma part de la semàntica de la definició del llenguatge de programació. Alguns llenguatges, com PureScript, tenen variants amb diferents estratègies d'avaluació. Alguns llenguatges declaratius, com Datalog, admeten múltiples estratègies d'avaluació. Alguns idiomes defineixen una convenció de crida.

## Taula

Es tracta d'una taula d'estratègies d'avaluació i idiomes representatius per any introduït. Les llengües representatives s'enumeren per ordre cronològic, començant per la o les llengües que van introduir l'estratègia i seguides per les llengües destacades que utilitzen l'estratègia. $^{:434}$
| Estratègia d'avaluació | Llengües representatives | Primer any introduït |
| crida per referència | FORTRAN II, PL/I | 1958 |
| crida per valor | ALGOL, C, Esquema, MATLAB | 1960 |
| crida pel nom | ALGOL 60, Simula | 1960 |
| crida per còpia-restauració | Fortran IV, Ada | 1962 |
| crida per necessitat | SASL, Haskell, R | 1971 |
| crida compartint | CLU, Java, Python, Ruby, Julia | 1974 |
| paràmetres de crida per referència | C++, PHP, C#, Visual Basic . NET | 1985 |
| crida per referència a const | C++, C | 1985 |

## Estratègies de vinculació estrictes
### Crida per valor

En la crida per valor, el valor avaluat de l'expressió argument està lligat a la variable corresponent de la funció (freqüentment copiant el valor en una nova regió de memòria). Si la funció o procediment és capaç d'assignar valors als seus paràmetres, només s'assigna la seva variable local, és a dir, qualsevol cosa que es passi a una crida de funció no canvia en l'àmbit de la persona que crida quan la funció torna.

### Crida per referència

La crida per referència (o passa per referència) és una estratègia d'avaluació on un paràmetre està lligat a una referència implícita a la variable utilitzada com a argument, en lloc d'una còpia del seu valor.
La crida per referència es pot simular en llenguatges que utilitzen crida per valor i no admeten exactament la crida per referència, fent ús de referències (objectes que fan referència a altres objectes), com ara punters (objectes que representen les adreces de memòria d'altres objectes) . Llenguatges com C, ML i Rust utilitzen aquesta tècnica. No es tracta d'una estratègia d'avaluació separada —el llenguatge crida per valor—, però de vegades s'anomena "crida per adreça" o "pass per adreça". En ML, les referències són segures per a tipus i memòria, de manera similar a Rust.

## Referències

* ↑ Turbak, Franklyn. Design Concepts in Programming Languages (en anglès). MIT Press, 18 juliol 2008, p. 309. ISBN 978-0-262-30315-6.
* ↑ Crank, Erik. «Parameter-passing and the lambda calculus». A: Proceedings of the 18th ACM SIGPLAN-SIGACT symposium on Principles of programming languages - POPL '91 (en anglès), 1991, p. 2. DOI 10.1145/99583.99616. ISBN 0897914198.
* ↑ Wilhelm, Reinhard. Compiler Design: Virtual Machines (en anglès). Springer Science & Business Media, 10 novembre 2010, p. 61. ISBN 978-3-642-14909-2.
* ↑ Nita, Stefania Loredana. «Introduction». A: Practical Concurrent Haskell (en anglès), 2017, p. 3. DOI 10.1007/978-1-4842-2781-7_1. ISBN 978-1-4842-2780-0.
* ↑ Pierce, Benjamin C. Types and Programming Languages (en anglès). MIT Press, 2002, p. 56. ISBN 0-262-16209-1.
* ↑ Pierce, Benjamin C. Types and Programming Languages (en anglès). MIT Press, 2002, p. 56. ISBN 0-262-16209-1.
* ↑ Daniel P. Friedman. Essentials of Programming Languages (en anglès). third. Cambridge, MA: The MIT Press, 2008. ISBN 978-0262062794.
* ↑ Scott, Michael Lee. Programming language pragmatics (en anglès). Fourth. Waltham, MA: Elsevier, 2016. ISBN 9780124104778.
* ↑ «Avoid Unnecessary Copies of Data - MATLAB & Simulink» (en anglès). www.mathworks.com. [Consulta: 28 gener 2023].
* ↑ Hasti, Rebecca. «Parameter Passing» (en anglès). CS 536: Introduction to Programming Languages and Compilers. University of Wisconsin. [Consulta: 22 agost 2021].
* ↑ Bundy, Alan. «SASL». A: Catalogue of Artificial Intelligence Tools (en anglès), 1984, p. 117. DOI 10.1007/978-3-642-96868-6_222. ISBN 978-3-540-13938-6.
* ↑ Fay, Colin. «About lazy evaluation» (en anglès). R-bloggers, 30-07-2018. [Consulta: 21 agost 2021].
* ↑ Liskov, Barbara. «CLU Reference Manual» (en anglès). Laboratory for Computer Science p. 14–15. Massachusetts Institute of Technology, 01-10-1979. Arxivat de l'original el 2006-09-22. [Consulta: 19 maig 2011].
* ↑ «PHP: Passing by Reference - Manual» (en anglès). www.php.net. [Consulta: 4 juliol 2021].
* ↑ BillWagner. «Passing Parameters - C# Programming Guide» (en anglès americà). docs.microsoft.com. [Consulta: 4 juliol 2021].
* ↑ KathleenDollard. «Passing Arguments by Value and by Reference - Visual Basic» (en anglès americà). docs.microsoft.com. [Consulta: 4 juliol 2021].
* 1 2 «History of C++» (en anglès). en.cppreference.com. [Consulta: 11 juny 2022].