# Paradigma de programació

Un paradigma és una forma de representar i manipular el coneixement. Representa un enfocament particular o filosofia per a la construcció del programari. No és millor un que un altre, sinó que cada un té avantatges i desavantatges. També hi ha situacions on un paradigma resulta més apropiat que un altre.
Alguns exemples de paradigmes de programació:
* El paradigma imperatiu és considerat el més comú i està representat, per exemple, pel C o per BASIC..
* El paradigma funcional està representat per llenguatges com LISP, Scheme, Haskell..
* El paradigma lògic, un exemple és Prolog.
* El paradigma orientat a objectes. Un llenguatge completament orientat a objectes és Smalltalk.
Nota: La representació orientada a objectes millora l'estructura de les dades i per això s'ha aplicat a diferents paradigmes.
Si bé es pot seleccionar la forma pura d'aquests paradigmes al moment de programar, en la pràctica és habitual que es barregin. Així, llenguatges com C++, Delphi o Visual Basic combinen el paradigma imperatiu amb l'orientat a objectes.
Un altre exemple: Llenguatges com Scheme o Prolog, paradigma funcional i lògic respectivament, compten amb estructures repetitives. Aquestes són més pròpies del paradigma imperatiu que a la forma pura d'aquells.

## Història

Amb el temps s'han desenvolupat diferents disciplines de programació, sent identificades al moment o retrospectivament. Una de les primeres disciplines identificada com a tal va ser la programació estructurada, proposada des de mitjans dels anys 1960. El concepte de "paradigma de programació" com a tal data almenys del 1978, en la conferència del Premi Turing de Robert W. Floyd, titulada The Paradigms of Programming (Els Paradigmes de Programació), que cita la idea de paradigma de programació usada per Thomas Kuhn al seu llibre L'estructura de les revolucions científiques (The Structure of Scientific Revolutions) de 1962.

### Codi màquina

El nivell més baix dels paradigmes de programació és el codi màquina, que representa directament les instruccions (els continguts de la memòria del programa) com una seqüència de nombres, i el llenguatge d'assemblador on les instruccions són representades per mnemònics i adreces de memòria.
En els anys 1960, els llenguatges d'assemblador van ser desenvolupats per suportar la llibreria COPY, CALL a subrutines, variables externes i seccions comunes (globals), permetent reutilització de codi i aïllament del hardware fent servir operadors lògics com READ, WRITE, GET i PUT.

### Llenguatges procedurals

El següent avanç va ser el desenvolupament de llenguatges procedurals. Aquests llenguatge de tercera generació (el primer descrit com a llenguatges d'alt nivell) utilitzen vocabulari relacionat amb el problema que es resol.Per exemple:
* COBOL (COmmon Business Oriente Language) - fa servir termes com file, move i copy.
* FORTRAN (FORmula TRANslation) - fa servir terminologia del llenguatge matemàtic.
* ALGOL (ALGOritmic Language) - enfocat a ser un llenguatge apropiat per definir algoritmes, també fent servir llenguatge matemàtic.
* PL/I (Programing Language One) - un híbrid comercial/científic de propòsit general amb suport per punters.
* BASIC (Begginers All purpose Symbolic Instruction Code) - va ser desenvolupat per permetre escriure programes a més persones.
* C - un llenguatge de propòsit general.
Tots aquests llenguatges segueixen un paradigma procedural. Descriuen, pas a pas, exactament el procés que ha de ser seguit per resoldre un problema específic. L'eficàcia i eficiència de cada solució depenen en l'experiència, la inventiva i l'habilitat del programador.

### Programació orientada a objectes

Després de l'estès ús dels llenguatges procedurals, es van crear els llenguatges orientats a objectes com Simula, Smalltalk, C++, C#, Eiffel i Java. En aquests llenguatges, les dades i els mètodes per manipular-la es mantenen com una sola unitat anomenada objecte. L'única manera en què un usuari pot accedir a les dades és a través dels "mètodes" de l'objecte, com a conseqüència, el funcionament intern d'un objecte pot ser modificat sense afectar cap codi que fa servir l'objecte. Encara hi ha controvèrsia plantejada per Alexander Stepanov, Richard Stallman i altres programadors, sobre l'eficàcia del paradigma POO en comparació amb el paradigma procedural. La necessitat de cada objecte de tenir mètodes associatius porta a alguns escèptics a associar POO amb software inflat. El polimorfisme va ser desenvolupat com un intent per resoldre aquest dilema.
Com que la programació orientada a objectes és considerada un paradigma, i no un llenguatge, és possible fins i tot crear un llenguatge d'assemblador orientat a objectes. L'assemblador d'Alt Nivell (High Level Assembly) és un exemple d'això, que suporta completament els tipus de dades avançats.
Així, els diferents paradigmes de programació es poden veure més aviat com memes motivacionals dels seus defensors, en lloc de representar necessàriament el progrés d'un nivell al següent. Les comparacions precises de l'eficàcia de paradigmes competidors sovint es fan més difícils a causa de la nova i diferent terminologia aplicada a entitats i processos similars, juntament amb nombroses distincions d'implementació entre idiomes.

### Altres paradigmes

La programació literària, com una forma de programació imperativa, estructura els programes com una xarxa centrada en l'ésser humà, com en un assaig d'hipertext: la documentació és part integral del programa, i el programa s'estructura seguint la lògica de l'exposició a prosa, en lloc de la conveniència del compilador.
Independentment de la branca imperativa, es van desenvolupar paradigmes de programació declarativa. En aquests llenguatges, se li diu a l'ordinador quin és el problema, no com resoldre'l el programa s'estructura com un conjunt de propietats a trobar en el resultat esperat, no com un procediment a seguir. Donada una base de dades o un conjunt de regles, l'ordinador intenta trobar una solució que compleixi totes les propietats desitjades. Un arquetip de llenguatge declaratiu és el llenguatge de quarta generació SQL. SQL, i la família dels llenguatges funcionals i la programació lògica.
La programació funcional és un subconjunt de la programació declarativa. Els programes escrits amb aquest paradigma utilitzen funcions, blocs de codi destinats a comportar-se com a funcions matemàtiques. Els llenguatges funcionals descoratgen els canvis en el valor de les variables a través d'assignació, fent un gran ús de recursió al seu lloc.
El paradigma de programació lògica considera la computació com a raonament automatitzat sobre un cos de coneixement. Els fets sobre el domini del problema s'expressen com a fórmules lògiques, i els programes s'executen aplicant regles d'inferència sobre elles fins que es troba una resposta al problema, o es demostra que el conjunt de fórmules és inconsistent.
La programació simbòlica és un paradigma que descriu programes capaços de manipular fórmules i components del programa com a dades. Els programes es poden modificar a si mateixos i semblar que "aprenen", cosa que els fa adequats per a aplicacions com la intel·ligència artificial, els sistemes experts, el processament del llenguatge natural i els jocs d'ordinador. Els llenguatges que suporten aquest paradigma inclouen Lisp i Prolog.
La programació diferenciable estructura els programes perquè puguin ser diferenciats en tot moment, normalment mitjançant diferenciació automàtica.

## Suport per a múltiples paradigme

La majoria de llenguatge de programaciós admeten més d'un paradigma de programació per permetre als programadors utilitzar l'estil de programació més adequat i les construccions de llenguatge associades per a un treball determinat.

## Resum

Així com l'enginyeria de programari (com a procés) es defineix mitjançant diferents metodologies, els llenguatges de programació (com a models de computació) es defineixen mitjançant diferents paradigmes. Alguns llenguatges estan dissenyats per admetre un paradigma (Smalltalk admet programació orientada a objectes, Haskell admet programació funcional), mentre que altres llenguatges de programació admeten múltiples paradigmes (com Object Pascal, C++, Java, JavaScript, C#, Scala, Visual Basic, Common Lisp, Scheme, Perl, PHP, Python, Ruby, Oz i F# ). Per exemple, els programes escrits a C++, Object Pascal o PHP poden ser purament procedimentals, purament orientats a objectes o poden contenir elements de tots dos o altres paradigmes. Els dissenyadors i programadors de programari decideixen com utilitzar aquests elements paradigmàtics.
A la programació orientada a objectes, els programes es tracten com un conjunt d'objectes que interactuen. A la programació funcional, els programes es tracten com una seqüència d'avaluacions de funcions sense estat. Quan es programen ordinadors o sistemes amb molts processadors, a la programació orientada a processos, els programes es tracten com a conjunts de processos concurrents que actuen sobre estructures de dades compartides lògiques.
Molts paradigmes de programació són tan coneguts per les tècniques que prohibeixen com per les que habiliten. Per exemple, la programació funcional pura no permet l'ús d'efectes secundaris, mentre que la programació estructurada no permet l'ús de la instrucció “go to”. En part per aquesta raó, els nous paradigmes sovint són considerats doctrinaris o massa rígids pels que estan acostumats a estils anteriors. Tot i això, evitar certes tècniques pot facilitar la comprensió del comportament del programa i demostrar teoremes sobre la correcció del programa.
Els paradigmes de programació també es poden comparar amb models de programació, cosa que permet invocar un model d'execució utilitzant només una API. Els models de programació també es poden classificar en paradigmes segons les característiques del model d'execució.
Per a la computació paral·lela, és comú fer servir un model de programació en lloc d'un llenguatge. La raó és que els detalls del maquinari paral·lel es filtren a les abstraccions utilitzades per programar el maquinari. Això fa que el programador hagi de mapejar patrons a l'algorisme sobre patrons en el model d'execució (que s'han inserit a causa d'una fuita de maquinari a l'abstracció). Com a conseqüència, cap llenguatge de programació paral·lel no s'adapta bé a tots els problemes de càlcul. Per tant, és més convenient utilitzar un llenguatge seqüencial base i inserir trucades a l'API en models d'execució paral·lela mitjançant un model de programació. Aquests models de programació paral·lela es poden classificar d'acord amb abstraccions que reflecteixen el maquinari, com ara la memòria compartida, la memòria distribuïda amb pas de missatges, nocions de lloc visibles al codi, etc. Aquests es poden considerar sabors del paradigma de programació que s'apliquen només a llenguatges i models de programació paral·lels.

## Referències

* ↑ Michael A. Covington. «CSCI/ARTI 4540/6540: First Lecture on Symbolic Programming and LISP». University of Georgia, 23-08-2010. Arxivat de l'original el 2012-03-07. [Consulta: 20 novembre 2013].
* ↑ «Glosario de negocios: Definición de programación simbólica». allbusiness.com. [Consulta: 30 juliol 2014].
* ↑ Wang, Fei; Decker, James & Wu, Xilun et al. (2018), pdf Backpropagation with Callbacks: Foundations for Efficient and Expressive Differentiable Programming, Curran Associates, Inc., pàg. 10201-10212, <http://papers.nips.cc/paper/8221-backpropagation-with-callbacks-foundations-for-efficient-and-expressive-differentiable-programming. pdf>. Consulta: 13 febrer 2019
* ↑ Innes, Mike «sysml.cc/doc/37.pdf On Machine Learning and Programming Languages». SysML Conference 2018, 2018.
* ↑ «Multi-Paradigm Programming Language». developer.mozilla.org. Mozilla Foundation. Arxivat de l'original el 21 August 2013.
* ↑ Peter Van Roy. «Programming Paradigms: What Every Programmer Should Know». info.ucl.ac.be, 12-05-2009. [Consulta: 27 gener 2014].
* ↑ Peter Van-Roy. Concepts, Techniques, and Models of Computer Programming. MIT Press, 2004. ISBN 978-0-262-22069-9.
* ↑ Frank Rubin «'GOTO Considered Harmful' Considered Harmful». Communications of the ACM, vol. 30, 3, 01-03-1987, pàg. 195–196. DOI: 10.1145/214748.315722.
* Nørmark, Kurt. Overview of the four main programming paradigms.
* Frans Coenen (1999-10-11). "Characteristics of declarative programming languages".
* Michael A. Covington (2010-08-23). "CSCI/ARTI 4540/6540: First Lecture on Symbolic Programming and LISP Arxivat 2012-03-07 a Wayback Machine." (PDF).
* Peter Van Roy (2009-05-12). "Programming Paradigms for Dummies: What Every Programmer Should Know" (PDF).
* Frank Rubin (March 1987). "'GOTO Considered Harmful' Considered Harmful" (PDF).
* Krishnamurthi, Shriram (novembre 2008). "Teaching programming languages in a post-linnaean age".
* Floyd, R. W. (1979). "The paradigms of programming".

## Vegeu també

* Programació reactiva