# Smalltalk

Smalltalk és un llenguatge de programació orientat a objectes, dinàmicament tipat i reflexiu. Va ser creat amb l'objectiu de ser el llenguatge que sostingui el nou món de la informàtica exemplificat per la «simbiosi humà-màquina». Va ser dissenyat en part amb propòsits educatius, i més concretament per a un aprenentatge construccionista. Va ser creat per Alan Kay, Dan Ingalls, Adele Goldberg, Ted Kaehler, Scott Wallace, i d'altres col·laboradors, durant la dècada de 1970.
El llenguatge va ser difós inicialment com Smalltalk-80. Llenguatges com Smalltalk són actius, en desenvolupament continu i tenen al seu voltant comunitats fidels. ANSI Smalltalk és la versió estàndard de Smalltalk, després de ser ratificat el 1998.

## Descripció

Un sistema Smalltalk està compost per:
* Una màquina virtual (Virtual machine, en anglès)
* Un arxiu anomenat "Imatge", que conté a tots els objectes del sistema
* Un llenguatge de programació (també conegut com a Smalltalk)
* Una enorme biblioteca d' "objectes reusables"
* I generalment, un entorn de desenvolupament que a més pot funcionar com un sistema en temps d'execució.

## Història

Els orígens de Smalltalk es troben en les recerques d'Alan Kay, Donen Ingalls, Ted Kaehler, Adele Goldberg i uns altres durant els anys setanta en el Palo Alt Research Institute de Xerox (conegut com a Xerox PARC), per a la creació d'un sistema informàtic orientat a l'educació. L'objectiu era crear un sistema que permetés expandir la creativitat dels seus usuaris, proporcionant un entorn per a l'experimentació, creació i recerca.

## Terminologia

Un programa Smalltalk consisteix únicament d'objectes, un concepte que es fa servir universalment dins de tot sistema Smalltalk. Pràcticament tot, des d'un nombre natural com el 4 fins a un servidor web és un objecte. Els objectes Smalltalk presenten característiques comunes:
* Tenen una memòria pròpia.
* Posseeixen capacitat per comunicar-se amb altres objectes.
* Posseeixen la capacitat d'heretar característiques d'objectes ancestres.
* Tenen capacitat de processament.
Els objectes es comuniquen entre si mitjançant l'enviament de missatges.. Així mateix, un objecte pot proveir moltes operacions (actualment això està determinat per cada implementació)
Les definicions d'aquestes operacions en els objectes són cridades mètodes. Un mètode especifica la reacció d'un objecte quan rep un missatge que és dirigit a aquest mètode. La resolució (en el sentit de lligat) d'un missatge a un mètode és dinàmica. La col·lecció sencera de mètodes d'un objecte és cridada protocol de missatges o interfície de missatges de l'objecte. Els missatges poden ser parametritzats, aquests paràmetres seran objectes, i el resultat o resposta del mateix també serà un objecte.
Les característiques comunes d'objectes està capturat sota la noció de classe, de tal forma que els objectes agrupats sota una classe són cridats instàncies d'ella. Les instàncies són creades durant l'execució d'un programa amb algun propòsit i són escombrats automàticament al moment que no són necessitats més pel recol·lector d'escombraries. Exceptuant alguns objectes especials com els molt simples, anomenats literals (nombres, cadenes, etc), cada objecte té el seu propi estat local i representa una instància diferent de la seva classe.

## Característiques

Smalltalk és considerat el primer dels llenguatges orientats a objectes (OOP), encara que en realitat el primer a implementar programació orientada a objectes va ser Simula. En Smalltalk tot és un objecte, inclosos els nombres reals o el propi entorn Smalltalk.
Com a llenguatge té les següents característiques:
* Orientació a Objectes
* Tipatge dinàmic
* Interacció entre objectes mitjançant enviament de missatges
* Herència simple i amb arrel comuna
* Reflexió computacional completa
* Recol·lecció d'escombraries
* Compilació en temps d'execució o Interpretat (depenent de la distribució o del proveïdor)
* Múltiples Implementacions
Smalltalk ha tingut gran influencia sobre altres llenguatges com Java o Ruby, i del seu entorn han sorgit moltes de les pràctiques i eines de desenvolupament promulgades actualment per les metodologies àgils (refactorización, desenvolupament incremental, desenvolupament dirigit per tests, etc.).

## L'entorn Smalltalk

Les implementacions de Smalltalk de major pes (VisualWorks, Squeak, VisualSmalltalk, VisualAge, Dolphin, Pharo Smalltalk, Smalltalk X) posseeixen un entorn d'interacció molt diferent a l'entorn de desenvolupament típic d'altres tecnologies com Microsoft Visual Studio.Net o Eclipsi. L'entorn o ambient Smalltalk és primordialment gràfic i funciona com un sistema en temps d'execució que integra diverses eines de programació (Smalltalk), utilitats multimèdia, interfícies per executar codi no natiu a Smalltalk i serveis del sistema operatiu. Aquestes possibilitats, que han influït en la metodologia de treball i concepció de la programació, es tradueixen en la tendència a considerar a Smalltalk més que un simple llenguatge de programació. La forma de desenvolupar programari en Smalltalk no consisteix en el cicle típic de les tecnologies tradicionals: Arrencar un editor de text, compilar i executar i acabar l'aplicació. En Smalltalk es manipula l'entorn mateix, comunament mitjançant el Navegador del Sistema.

## Sintaxi

Tradicionalment, Smalltalk no posseeix una notació explícita per descriure un programa sencer. Sí es fa servir una sintaxi explícita per definir certs elements d'un programa, tals com a mètodes, però la manera en què tals elements estan estructurats dins d'un programa sencer generalment és definida per les múltiples implementacions. L'estàndard mateix no promou una altra adreça, per la qual cosa defineix una sintaxi abstracta de programes Smalltalk, que defineix tots els elements que constitueixen un programa Smalltalk i la manera en què aquests elements estan lògicament composts per altres elements, no obstant això, cada implementació és lliure de definir i utilitzar les moltes sintaxis possibles que estan conformes a la sintaxi abstracta estàndard. Un exemple d'una sintaxi concreta és el Format d'Intercanvi Smalltalk (o SIF, de Smalltalk Interchange Format) definida en el mateix estàndard.
La sintaxi de Smalltalk-80 tendeix a ser minimalista. Això significa que existeixen un grup petit de paraules reservades i declaracions en comparació de la majoria dels llenguatges populars. Smalltalk posseeix un grup de 5 paraules reservades: self, super, nil, true i false.

## Recol·lecció d'escombraries

En Smalltalk no és necessari desalocar objectes explícitament, per tant no proporciona mecanismes per a això. Les implementacions utilitzen tècniques de recol·lecció d'escombraries per detectar i reclamar espai en memòria associat amb objectes que ja no s'utilitzaran més en el sistema. En Smalltalk la recol·lecció d'escombraries és integrada configurable. La forma d'execució del recol·lector d'escombraries és en background, és a dir, com un procés de baixa prioritat no interactiu, encara que en algunes implementacions és possible executar-ho a demanda, sent possible definir configuracions de memòria especials per a cada sistema mitjançant polítiques (per exemple en VisualWorks). La freqüència i característiques de la recol·lecció depèn de la tècnica utilitzada per la implementació. Addicionalment algunes implementacions de Smalltalk proporcionen suport per a mecanismes de finalització com l'ús d'Ephemerons.

## Reflexió computacional

Smalltalk-80 proveeix reflexió computacional estructural i comportacional, ja que és un sistema implementat en si mateix. La reflexió estructural es manifesta en què les classes i mètodes que defineix el sistema són en si mateixos objectes també i formen part del sistema mateix. La majoria de les implementacions de Smalltalk tendeixen a exposar el compilador Smalltalk a l'entorn de programació, permetent que dins del sistema es compili codi font (textual), transformant-se en objectes mètodes, que són comunament instàncies de la classe CompiledMethod. El sistema generalment incorpora aquests mètodes a les classes, emmagatzemant-los en el diccionari de mètodes de la classe a la qual es vulgui agregar el comportament encarregat del mètode. Això, així com la incorporació de noves classes al sistema, es fa dins del sistema mateix; encara que la major part de les implementacions posseeixen eines visuals que oculten la complexitat d'interactuar amb la classe que usualment s'encarrega de tals tasques, el ClassBuilder.
La reflexió computacional de Smalltalk-80 es manifesta en la possibilitat d'observar l'estat computacional del sistema. En els llenguatges derivats del Smalltalk-80 original, durant l'enviament de missatges entre objectes, cada objecte receptor d'un missatge consulta la seva classe per tenir accés als mètodes que defineix. En cas de trobar-se el mètode a la classe, es diu que es "activa" el mètode. Aquesta activació d'un mètode actualment en execució, és accessible mitjançant una paraula clau cridada thisContext. Enviant missatges a thisContext es pot consultar qüestions tals com "qui em va enviar aquest missatge?". Aquestes facilitats fan possible implementar co-rutines, continuacions o back-tracking a l'estil Prolog sense necessitat de modificar la màquina virtual. Un dels usos més interessants d'aquesta facilitat, es dona en el framework de web Seaside d'Avi Bryant.

## Exemples de Smalltalk

En Smalltalk tot és un objecte, i a un objecte se li envien missatges. Per exemple:
Significa que a l'objecte "1" li enviem el missatge "+" amb el col·laborador extern, un altre objecte, "1". Aquest exemple llavors resulta en l'objecte "2".
En el típic Hola món, l'objecte és Transcript, que rep el missatge show amb el col·laborador extern 'Hola, món!'.
Per crear una instància d'un objecte, només cal enviar un missatge new a una classe:
Per obtenir les vocals d'una cadena de text:

## Vegeu també

* Display PostScript
* NeXT
* Objective-C
* PostScript
* Ghostscript
* PDF

## Referències

* ↑ Kay, Alan. «The Early History of Smalltalk». [Consulta: 13 setembre 2007].
* ↑ «Smalltalk.org&#153 | versions | ANSIStandardSmalltalk.html». Smalltalk.org. Arxivat de l'original el 2015-09-07. [Consulta: 25 juny 2013].
* ↑ Concepts of Programming Languages.

## Bibliografia

* "Smalltalk-80" Smalltalk-80. The Interactive Programming Environment, Adele Goldberg. Addison-Wesley Seriïs in Computer Science (1983)
* "A Little Smalltalk". A Little Smalltalk, Thimothy Budd. Addison Wesley (abril de 1987).
* "Discovering Smalltalk" Discovering Smalltalk, Wilf Lalonde. Addison-Wesley Object Technology Sèries (1994).
* "The Art and Science of Smalltalk" The Art and Science of Smalltalk, Simon Lewis. Textbook Binding (1995).
* "Smalltalk Best Practice Patterns" Smalltalk Best Practice Patterns, Kent Beck. Prentice Hall PTR (1996).
* "Kent Beck's Guide to Better Smalltalk" Kent Beck's Guide to Better Smalltalk: A Sorted Collection, Kent Beck.
* "Advanced Smalltalk". Advanced Smalltalk, Jonathan Pletzke. Wiley Computer Publishing. John Wiley & Sons, Inc. (1997).
* "The Design Patterns Smalltalk Companion" The Design Patterns Smalltalk Companion, Sherman R. Alpert, Kyle Brown, Bobby Woolf. Programari Patterns Sèries (1998).
* "ANSI NCITS 319-1998". American National Standard for Information Technology - Programming Languages - Smalltalk. American National Standards Institute, Inc (1998).
* "Smalltalk, Objects, and Design" Smalltalk, Objects, and Design, Chamond Liu. iUniverse (April 2000).
* "Smalltalk With Style" Smalltalk With Style, Suzanne Skublics, Edward J. Klimas, David A. Thomas, John Pugh. Prentice Hall (2002).
* "Llibre de Programació amb Smalltalk" de Diego Gómez Deck (en Español) (2006).
* " Mentoring Course Smalltalk. By Andres Valloud" (2008).
* " Hashing Smalltalk Practice. By Andres Valloud" (2008).
* " Fundamentals Smalltalk Programming Techniques. By Andres Valloud" (2009).

## Enllaços externs

* The World of Smalltalk Arxivat 2018-12-21 a Wayback Machine., llibres i vídeos de Smalltalk, implementacions, frameworks i eines, blocs i llistes de correu
* Llibres descarregables de Smalltalk