Convorbire scurtă

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 18 august 2015; verificările necesită 43 de modificări .
Convorbire scurtă
Semantică orientat pe obiecte
Clasa de limba limbaj de programare
Aparut in Dezvoltarea a început în 1969, a devenit disponibilă pentru utilizare generală în 1980
Autor Alan Kaye , Adele Goldberg , Dan Ingalls, Xerox PARC
Dezvoltator Kaye, Alan Curtis , Adele Goldberg [1] , Daniel Henry Holmes Ingalls [d] și Diana Merry [d]
Eliberare Smalltalk-80 versiunea 2
Versiune de testare 1980  ( 1980 )
Tip sistem dinamic
Implementări majore Pharo , Squeak , VisualWorks , GNU Smalltalk
A fost influențat Simula , Sketchpad , Lisp , Logo
influențat Objective-C , AppleScript , C# , Dylan , Groovy , Io , Java , Lisaac , NewtonScript , Python , Ruby , Scala , Self , C++

Smalltalk ( [ˈsmɔːltɔːk] ) este un limbaj de programare orientat pe obiecte tip dinamic bazat pe ideea de a trimite mesaje , dezvoltat la Xerox PARC de Alan Kay , Dan Ingalls , Ted Kagler , Adele Goldberg și alții în anii 1970 . Este un mediu integrat de dezvoltare și execuție, ale cărui obiecte sunt disponibile pentru modificare prin el însuși și programare în care în cele din urmă se rezumă la modificarea propriului comportament. Limbajul a fost introdus ca Smalltalk-80.

Smalltalk este unul dintre multele limbaje orientate pe obiecte bazate pe limbajul Simula [2] , care în sine a avut o mare influență asupra dezvoltării unor astfel de limbaje orientate pe obiecte precum: Objective-C , Actor , Java , Erlang [ 3] , Groovy , Ruby și mulți alții. Multe dintre ideile de programare din anii 1980 și 1990 au apărut în comunitatea Smalltalk. Acestea includ refactorizarea , modelele de proiectare (așa cum sunt aplicate software-ului), hărțile de interacțiune-responsabilitate-clasă și programarea extremă în general. Fondatorul conceptului wiki , Ward Cunningham , face, de asemenea, parte din comunitatea Smalltalk.

Idei principale

Principalele idei ale Smalltalk sunt:

Smalltalk folosește și alte idei moderne:

Una dintre particularitățile Smalltalk este că chiar și astfel de construcții tradiționale precum if-then-alse, for, while etc. nu fac parte din limbaj. Toate sunt implementate folosind . De exemplu, o decizie este luată prin trimiterea unui mesaj către un ifTrue:obiect boolean și transferă controlul către o bucată de text dacă valoarea booleană este adevărată.

De fapt, există puține construcții sintactice încorporate în limbaj:

și câteva constructe de sintaxă pentru definirea obiectelor literale și variabilelor temporare.

Analogul mecanismului de mesagerie Smalltalk este Internetul: vă puteți imagina fiecare obiect ca pe un server web care răspunde solicitărilor. În același timp, serverul poate emite pur și simplu un răspuns predefinit la solicitări, de exemplu, o pagină web situată de-a lungul unei anumite căi; poate redirecționa mesajul-cerere către un alt obiect, analogul este un server proxy; poate modifica cererea după anumite reguli, analogul este tehnica de rescriere a url-ului și, desigur, poate forma o pagină complet nouă corespunzătoare datelor transmise cu mesajul. Dacă obiectul nu are o metodă predefinită pentru a răspunde la mesaj, cadrul apelează pe receptor metoda #doesNotUnderstand:, la fel cum un server web returnează o pagină de eroare dacă este dată o cale inexistentă a paginii web.

O scurtă prezentare a elementelor de sintaxă:

O pereche separată de caractere |înconjoară lista de nume de variabile care vor fi temporare. La transmiterea unui mesaj, caracterul :este plasat după numele mesajului sau argumentul acestuia, înaintea valorii transmise cu acesta, iar caracterele [și ]limitează blocul de comenzi, sau mai bine zis, literalul funcției anonime. Dar, pentru început, pot fi percepute ca analoge cu bretele și {în }limbaje asemănătoare C. La începutul unei astfel de funcții anonime, până la un caracter |, puteți enumera argumentele necesare. Rezultatul său va fi ultima expresie pe care a evaluat-o. Un simbol .încheie o singură comandă, un simbol ; separă mesajele care trebuie transmise succesiv către același obiect. O pereche de caractere :=denotă atribuirea unei variabile al cărei nume este situat înaintea acesteia, un obiect literal sau un obiect răspuns la mesaj situat după ea.

Următorul exemplu, care arată găsirea vocalelor într-un șir, ilustrează stilul Smalltalk.

| aVocale șir | aString := „Acesta este un șir” . vocale := aString select: [ : aCaracter | aCaracterul esteVocale ] .

În ultima linie a exemplului, un mesaj este trimis obiectului șir select:cu un argument - un bloc anonim de cod care ia un argument și returnează ceea ce va returna handlerul de evenimente isVowel al obiectului transmis cu acest argument. La procesarea mesajului select, se apelează o metodă select:din clasă Collection(unul dintre strămoșii clasei Stringcăreia îi aparține obiectul creat de literalul șir din a doua linie a exemplului). Textul acestei metode este prezentat mai jos:

selectați: bloc | colecție nouă | newCollection := auto specie nou . self do: [ : fiecare | ( aBlock value: each ) ifTrue: [ newCollection add: each ]] . ^ colecție nouă

Preia funcția anonimă aBlock ca intrare, creează o nouă colecție similară cu ea însăși și își apelează enumerarea elementelor (aceasta este metoda do:), executând blocul care i-a fost transmis aBlockpentru fiecare element; când blocul este executat (în exemplu - aCharacter isVowel), acesta creează o valoare booleană, căreia îi este apoi trimis mesajul ifTrue:. Dacă această valoare este true, atunci litera este adăugată șirului returnat. La sfârșit, colecția creată este returnată ca răspuns la mesaj, indicată de simbolul returnare ca răspuns ^. Deoarece este select:definită într-o clasă abstractă Collection, o putem folosi și astfel:

| dreptunghiuri aPunt | dreptunghiuri := Colectie ordonata cu: ( Dreptunghi stânga: 0 dreapta: 10 sus: 100 jos: 200 ) cu: ( Dreptunghi stânga: 10 dreapta: 10 sus: 110 jos: 210 ) . aPunctul := Punctul x: 20 y: 20 . coliziuni := dreptunghiuri selectează: [ : aRect | aRect containsPoint: aPoint ] .

Istorie

Smalltalk a fost creat de un grup de cercetători, condus de Alan Kay , la Centrul de Cercetare Xerox PARC . Prima implementare, cunoscută sub numele de Smalltalk-71, a fost creată în câteva luni ca rezultat al unei dezbateri conform căreia un limbaj de programare bazat pe ideea Simula de trimitere a mesajelor ar trebui implementat într-o „pagină de cod”. Versiunea ulterioară folosită de fapt pentru munca de cercetare este acum cunoscută sub numele de Smalltalk-72. Sintaxa și modelul său de execuție erau foarte diferite de Smalltalk modern, atât de mult încât trebuie considerat ca un limbaj diferit.

După revizuiri semnificative care au fixat mai multe aspecte ale semanticii execuției pentru eficiență, a fost creată o versiune cunoscută sub numele de Smalltalk-76. Această versiune adaugă moștenire, o sintaxă mai apropiată de Smalltalk-80 și un mediu de dezvoltare care include majoritatea instrumentelor familiare dezvoltatorilor Smalltalk de astăzi.

Metaclasele au fost adăugate în Smalltalk-80, făcând adevărată expresia „totul este un obiect”, asociind proprietăți și comportamente cu clase individuale (de exemplu, acceptând diferite moduri de instanțiere). Smalltalk-80 a fost prima versiune disponibilă în afara PARC – mai întâi ca Smalltalk-80 Versiunea 1, distribuită unui număr mic de companii și universități pentru „evaluare inter pares”. Mai târziu, în 1983, a fost lansată o implementare publică cunoscută sub numele de Smalltalk-80 Versiunea 2 ca imagine (un fișier independent de platformă care conține obiecte) și ca specificație a mașinii virtuale.

În prezent, există două implementări ale Smalltalk care sunt descendenți direcți ai Smalltalk-80, Squeak și VisualWorks . [4] Imaginea Smalltalk-80 versiunea 2 rulează pe Hobbes, o mașină virtuală ST-80 implementată pe VisualWorks.

"Salut Lume!"

Un exemplu simplu

Emisiune de transcriere : „Bună, lume!”

Acest exemplu arată două laturi ale Smalltalk.

În primul rând, trimiterea unui mesaj: în Smalltalk, toate acțiunile sunt efectuate prin trimiterea de mesaje către obiecte. În acest caz, mesajul este show: 'Hello, world!'și este trimis la obiect Transcript. Pentru a procesa acest mesaj, se va apela metoda Transcriere show:, care ar trebui să-și examineze argumentul (șirul „Bună ziua, lume!”) și să mapați acel argument cu transcrierea (rețineți că trebuie să aveți o fereastră Transcriere deschisă pentru a vedea rezultatul).

În al doilea rând, acest exemplu arată sintaxa de bază pentru trimiterea unui mesaj în Smalltalk: <destinatarul mesajului> <spațiu> <mesaj>. Spre deosebire de C++ , nu există puncte după receptor și nu există paranteze în jurul argumentelor.

Un exemplu de obiect

Definiția clasei Subclasa obiect : #MessagePublisher instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' categorie: 'Exemple Smalltalk'

Aceasta este o definiție simplă de clasă cu o definiție de nume și categorie. De obicei, mediul de dezvoltare oferă un stub cu cea mai mare parte a textului pentru acest exemplu.

Definiția metodei publica Transcript show: „Bună, lume!”

Aceasta este definiția unei metode numite publish. Corpul metodei este același ca în exemplul simplu.

Apel de metodă Publicare nouă MessagePublisher

În acest exemplu, este creată o instanță a clasei MessagePublisher( MessagePublisher new), apoi i se trimite un mesaj publish. Rețineți că un cuvânt cheie de limbă nu este folosit pentru a crea un obiect (ca în C++, Java, C#), dar un mesaj normal este trimis newcătre MessagePublisher. Mesajele pentru crearea obiectelor sunt uneori suprascrise. De exemplu, o clasă abstractă poate răspunde newreturnând o instanță a uneia dintre subclasele sale concrete.

Implementări

Note

  1. 1 2 https://www.cs.umd.edu/hcil/muiseum/goldberg/goldberg_page.htm
  2. Limbajul Simula a fost, de asemenea, orientat pe obiecte și precedat și a fost recunoscut ca o influență asupra limbajului Smalltalk, dar a fost un limbaj de modelare, nu un limbaj de uz general.
  3. Cesarini F., Thompson S. Programming in Erlang = Erlang Programming. - M. : DMK Press, 2012. - S. 200. - 488 p. - ISBN 978-5-94074-617-1 .
  4. Captură de ecran Smalltalk-80 Arhivată 19 aprilie 2003.
  5. Site-ul web Cincom Smalltalk Arhivat la 27 august 2008 la Wayback Machine , Wiki arhivat 2006-10-10 . , Blogul Cincom Smalltalk Arhivat la 13 ianuarie 2005 la Wayback Machine
  6. Site-ul Pharo Smalltalk . Preluat la 19 mai 2022. Arhivat din original la 11 mai 2020.
  7. net.net - Una dintre adresele principale ale Internetului  (link indisponibil)
  8. IBM - VisualAge Smalltalk - Prezentare generală a produsului . Consultat la 10 ianuarie 2005. Arhivat din original pe 8 aprilie 2002.
  9. Smalltalk/X - un IDE orientat pe obiecte . Preluat la 18 februarie 2018. Arhivat din original la 13 aprilie 2022.
  10. GNU Smalltalk | Smalltalk pentru cei care pot scrie . Preluat la 1 octombrie 2007. Arhivat din original la 1 martie 2020.
  11. Object Connect Home . Consultat la 10 ianuarie 2005. Arhivat din original pe 26 februarie 2021.
  12. LSW Vision-Smalltalk 2008 . Consultat la 10 ianuarie 2005. Arhivat din original la 9 ianuarie 2005.
  13. Ambrai Smalltalk . Consultat la 11 aprilie 2005. Arhivat din original pe 5 aprilie 2005.
  14. Sitio Web de Guillermo Adrián Molina . Consultat la 6 mai 2008. Arhivat din original pe 18 mai 2008.

Literatură

  • Robert W. Sebesta. 2.15. Programare orientată pe obiecte: limbajul Smalltalk // Concepte de bază ale limbajelor de programare = Concepte ale limbajelor de programare / Per. din engleza. - a 5-a ed. - M .: Williams , 2001. - S.  109 -112. — 672 p. - 5000 de exemplare.  — ISBN 5-8459-0192-8 (rusă), ISBN 0-201-75295-6 (engleză).
  • Yu. A. Kiryutenko, V. A. Saveliev. Programare orientată pe obiecte. Limbajul Smalltalk . - M . : Cartea Vuzovskaya, 2007. - 328 p. — ISBN 5-9502-0097-7 . Arhivat pe 4 martie 2016 la Wayback Machine
  • Număr special pe Smalltalk  // BYTE  :  revistă. - McGraw-Hill, 1981. - August ( vol. 6 , nr. 8 ). Arhivat din original pe 7 mai 2016.

Link -uri