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 |
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.
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 ] .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.
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.
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.
![]() | |
---|---|
În cataloagele bibliografice |
Limbaje de programare | |
---|---|
|
Limbaje orientate pe obiecte | |
---|---|
Compilat | |
Scenizat |
|
Ambele spectacole |