pharo tutorial at ecoop 2013

Post on 20-May-2015

807 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Pharo is an open-source live-programming environment and programming language started in 2008. The official web site is http://www.pharo-project.org. By providing a stable and small core system, excellent dev tools, and maintained releases, Pharo is an attractive platform to build and deploy mission-critical applications.

TRANSCRIPT

Pharo: A malleable and powerful platform

Damien Cassou and Camille Teruelhttp://www.pharo.org

What is it?

Programming language + IDEObject-Oriented, Dynamic, Reflective

Explore + Change running systems

The Ultimate Live Programming Environment!

Pharo

MIT licenseGreat community of active doersPowerfulElegant and fun to programLiving system under your fingersMac, Linux, Android, iOS, Windows

2nd most downloaded on Inria gforge40-50 active commiters> 600 mailing-list members180 license agreements50 association members17 industrial consortium membersaround 300 external projects

Pharo in numbersVery HighActivity

Create an ecosystem where business/innovation

can bloom

We want that you can make research and money with Pharo.

We want a powerful innovative dynamic language where we can build our future.

A Little Journey in the Pharo Object Model

A pure and minimal object model

Less is more!

No constructors, no static methods, no operators

No interfaces, no private/protected modifiers

No type declarations, no parametrized types

No primitive types, no boxing/unboxing

Still powerful

Everything is an object

213 class

⇒ SmallInteger

Objects are instances of Classes

class is a message sent to the object 213

SmallInteger is the result of the message sentIn “Java”:

213.getClass()

Objects are instances of Classes

Integer

SmallInteger

213

instance of

inheritsfrom

Sending a message

Integer

SmallInteger

213

factoria

l

instance of

inheritsfrom

Classes are objects too

213 class selectors

⇒ #(#instVarAt: #sizeInMemory #printOn:base:length:padded: #< #bitXor: #'\\' #numberOfDigitsInBase: #'//' #threeDigitName

#highBitOfPositiveReceiver #bitAnd: #isLarge #largeIdentityHash #'>=' #nextObject #nextInstance

#gcd: #printStringBase: #lowBit #pointsTo: #basicIdentityHash #fromString:radix: ...)

Classes are objects too

Number allSubclasses

⇒ an OrderedCollection(Fraction Float Integer ScaledDecimal SmallInteger LargePositiveInteger

LargeNegativeInteger)

Fun with Numbers!

1 class

⇒ SmallInteger

1 class

⇒ SmallInteger

1 class maxVal

⇒ 1073741823

1 class

⇒ SmallInteger

1 class maxVal

⇒ 1073741823

1 class maxVal + 1

⇒ 1073741824

1 class

⇒ SmallInteger

1 class maxVal

⇒ 1073741823

1 class maxVal + 1

⇒ 1073741824

(1 class maxVal + 1) class

⇒ LargePositiveInteger

(1/3) + (2/3)

⇒ 1

(1/3) + (2/3)

⇒ 1

2/3 + 1

⇒ 5/3

(1/3) + (2/3)

⇒ 1

2/3 + 1

⇒ 5/3

1000 factorial

4023872600770937735437024339230039857193748642107146325437999104299385123986290205920442084869694048004799886101971960586316668729948085589013238296699445909974245040870737599188236277271887325197795059509952761208749754624970436014182780946464962910563938874378864873371191810458257836478499770124766328898359557354325131853239584630755574091142624174743493475534286465766116677973966688202912073791438537195882498081268678383745597317461360853795345242215865932019280908782973084313928444032812315586110369768013573042161687476096758713483120254785893207671691324484262361314125087802080002616831510273418279777047846358681701643650241536913982812648102130927612448963599287051149649754199093422215668325720808213331861168115536158365469840467089756029009505376164758477284218896796462449451607653534081989013854424879849599533191017233555566021394503997362807501378376153071277619268490343526252000158885351473316117021039681759215109077880193931781141945452572238655414610628921879602238389714760885062768629671466746975629112340824392081601537808898939645182632436716167621791689097799119037540312746222899880051954444142820121873617459926429565817466283029555702990243241531816172104658320367869061172601587835207515162842255402651704833042261439742869330616908979684825901254583271682264580665267699586526822728070757813918581788896522081643483448259932660433676601769996128318607883861502794659551311565520360939881806121385586003014356945272242063446317974605946825731037900840244324384656572450144028218852524709351906209290231364932734975655139587205596542287497740114133469627154228458623773875382304838656889764619273838149001407673104466402598994902222217659043399018860185665264850617997023561938970178600408118897299183110211712298459016419210688843871218556461249607987229085192968193723886426148396573822911231250241866493531439701374285319266498753372189406942814341185201580141233448280150513996942901534830776445690990731524332782882698646027898643211390835062170950025973898635542771967428222487575867657523442202075736305694988250879689281627538488633969099598262809561214509948717012445164612603790293091208890869420285106401821543994571568059418727489980942547421735824010636774045957417851608292301353580818400969963725242305608559037006242712434169090041536901059339838357779394109700277534720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Point class

⇒ Point class

Classes are objects too

Point class

⇒ Point class

Classes are objects too

“Point class” is an anonymous class with only one instance: Point.

We call such classes “metaclasses”

Integer

SmallInteger

Class Parallel Inheritance

213

instance of

Integer

SmallInteger

Integer class

SmallInteger class

Class Parallel Inheritance

213

instance of

instance of

instanceof

Integer

SmallInteger

Integer class

SmallInteger class

A “static” method is just a method of

the metaclassInteger readFrom: '123'

⇒ 123

Class Parallel Inheritance

factorial

class

class

readFrom:

Class extensions

A method can be defined in a class that belongs to another package!Powerful to build DSLs

$x ctrl , $f ctrl⇒ Ctrl + X , Ctrl + F

ctrl method in Character class

Summary

Everything is an object

One single model

Classes are objects too

A class is instance of another class

One unique method lookup, look in the class of the receiver

Pharo: Syntax in a Nutshell

asm push: asm RBP; mov: asm RSP -> asm RBP; mov: 1024 -> asm RAX; mov: asm RBP -> asm RSP; pop: asm RBP; ret.

identifier := #letter asParser , #word asParser star

Assembly

Parsers

Syntax Examples

Syntax on a PostCardexampleWithNumber: x

|y|

true & false not & (nil isNil) ifFalse: [ self halt ].

y := self size + super size.

{ 1 . 2 . #($a #a ‘a’ 1 1.0) }

do: [ :each | Transcript show: (each class name); show: (each printString); show: ‘ ‘ ].

^ x < y

Language Constructs

^ return“ comments # symbol or array‘ string[] block. separator; cascade| local or block variable:= assignment$ character<...> annotation

Examplescomment: “a comment”character: $c $. string: 'a nice string' 'lulu' 'l''idiot'symbol: #mac #+ array: { 1 . 123 + 1 }literal array: #(1 2 3 (1 3) $a 4)byte array: #[1 2 3]block: [ :x | x * 2 ]integer: 1 2r101real: 1.5 6.03e-34 4 2.4e7keywords: true false nil self super thisContext

Not Syntax

& conjunction (and)| disjunction (or)+ addition< lower thanifTrue: conditiondo: iteration...

all of these are plain methods!

Not Syntax

& conjunction (and)| disjunction (or)+ addition< lower thanifTrue: conditiondo: iteration...

Boolean>>

Boolean>>

Number>>

Magnitude>>

Boolean>>

Collection>>

their classes

3 = 2 ifTrue: [ Error signal: 'Help' ]

3 kinds of messagesUnary messages

Binary messages

Keywords messages

5 factorialTranscript cr

3 + 4

2 between: 0 and: 5

Transcript show: 'hello world'

postman.send( mail, recipient);

Keyword messages

postman.send( mail, recipient);

Keyword messages

postman send mail recipient

Keyword messages

postman send mail to recipient

Keyword messages

postman send: mail to: recipient

Keyword messages

postman send: mail to: recipient

Keyword messages

send:to: method in the Postman class

receiver argument 1 argument 2

message send

strings := OrderedCollection new

ArrayList<String> strings = new ArrayList<String>();

Some Comparisons

persons collect: [:person | person name]

ArrayList<String> strings

= new ArrayList<String>();

for(Person person: persons) {

strings.add(person.name());

}

Some Comparisons

persons collect: #name

ArrayList<String> strings

= new ArrayList<String>();

for(Person person: persons) {

strings.add(person.name());

}

Some Comparisons

[ self doSomething ] fork

new Thread(

new Runnable() {

public void run() {

this.doSomething();}}).start();

Some Comparisons

(10 between: 1 and: 20 + 2) not

⇒ false

( ) > Unary > Binary > Keywords

A method definition in PointMethod name

<= aPoint "Answer whether the receiver is neither below nor to the right of aPoint."

^ x <= aPoint x and: [y <= aPoint y]

(2@3) <= (5@6)⇒ true

A method definition in PointArgument

<= aPoint "Answer whether the receiver is neither below nor to the right of aPoint."

^ x <= aPoint x and: [y <= aPoint y]

(2@3) <= (5@6)⇒ true

A method definition in PointComment

<= aPoint "Answer whether the receiver is neither below nor to the right of aPoint."

^ x <= aPoint x and: [y <= aPoint y]

(2@3) <= (5@6)⇒ true

A method definition in Point

Return

<= aPoint "Answer whether the receiver is neither below nor to the right of aPoint."

^ x <= aPoint x and: [y <= aPoint y]

(2@3) <= (5@6)⇒ true

A method definition in Point

Instance variable

<= aPoint "Answer whether the receiver is neither below nor to the right of aPoint."

^ x <= aPoint x and: [y <= aPoint y]

(2@3) <= (5@6)⇒ true

A method definition in Point

Binary message

<= aPoint "Answer whether the receiver is neither below nor to the right of aPoint."

^ x <= aPoint x and: [y <= aPoint y]

(2@3) <= (5@6)⇒ true

A method definition in Point

Keyword message

<= aPoint "Answer whether the receiver is neither below nor to the right of aPoint."

^ x <= aPoint x and: [y <= aPoint y]

(2@3) <= (5@6)⇒ true

A method definition in Point

Block

<= aPoint "Answer whether the receiver is neither below nor to the right of aPoint."

^ x <= aPoint x and: [y <= aPoint y]

(2@3) <= (5@6)⇒ true

Point>> <= aPoint "Answer whether the receiver is neither below nor to the right of aPoint."

^ x <= aPoint x and: [y <= aPoint y]

in books and slides, we specify the class name

Class name

Statements and Cascades

Temporary variables Statement

Cascade

| p pen |p := 100@100.pen := Pen new.pen up; goto: p; down; goto: p+p

Anonymous methodPassed as method argument or stored

f := [:x | x * x + 3].f value: 2

⇒ 7

Blocks (aka Closure)

BlockClosure>>value:

Block usage

Integer>> factorial self = 0 ifTrue: [ ^ 1 ]. self > 0 ifTrue: [ ^ self * (self - 1) factorial ]

#(1 2 3) do: [ :each | each crLog ]

Control StructuresEvery control structure is realized by message sends

[ stream atEnd ] whileFalse: [ self process: stream next ].

Magnitude>> max: aMagniture ^ self > aMagnitude ifTrue: [ self ] ifFalse: [ aMagnitude ]

Iterating Collections#(2 3 4 -35 4)

collect: [ :each| each abs ]

⇒ #(2 3 4 35 4)

Iterating Collections#(2 3 4 -35 4)

select: [ :each| each odd ]

⇒ #(-3 -35)

Iterating Collections#(2 3 4 -35 4)

do: [ :each| Transcript crShow: each ]

⇒ 2

3...

Pharo, a live programming environment

DemoModifying classes and methods while

the program is running

Nice libraries and frameworks

Gofer new

smalltalkhubUser: 'PharoExtras'

project: 'XMLParser';

loadStable.

data := 'http://picasaweb.google.com/data/feed/api/all?q=puppy' asUrl retrieveContents.

doc := XMLDOMParser parse: data.

entries := doc allNodesSelect: [ :n | n name = 'entry' ].

entry := entries anyOne.

content := entry nodesDetect: [ :n | n name = 'content'].

url := content attributeAt: 'src'.

'http://lh3.ggpht.com/[...]/puppy-and-kitten.jpg'

data := 'http://picasaweb.google.com/data/feed/api/all?q=puppy' asUrl retrieveContents.

doc := XMLDOMParser parse: data.

path := XPath for: 'entry/content/@src'.

urls := path in: doc.

url := urls anyOne.

'http://lh3.ggpht.com/[...]/puppy-and-kitten.jpg'

(ZnEasy getGif: url) asMorph openInHand

Your turn

Black magic

Execution Stack as an Object

To define exceptions from within the language

Debugger support!

Advanced debugging

Continuation

thisContext

returns an object that represents the method invocationcan walk (even modify!) the stack

Serializing Continuations[ "some code causing an error" ] on: Error do: [ :error | FLSerializer serialize: error toFileNamed: 'error.fuel' ]

Then in a new image open a debugger on the serialized error:

FLMaterializer materializeFromFileNamed: 'error.fuel'; debug.

Powerful Breakpoints?

Would be so good if we could say:“Stop method bar only if it is called from method named foo” i.e.,bar ... Halt whenCalledFrom: #foo. ...

Halt>> whenCalledFrom: aSelector | ctxt | ctxt := thisContext. [ ctxt sender isNil ] whileFalse: [ ctxt := ctxt sender. ctxt selector = aSelector ifTrue: [ self signal ] ]

Pointer Swapping

anObject become: anotherObject

| pt1 pt2 ref |

pt1 := 0@0.

pt2 := 100@100.

ref := pt1.

pt1 become: pt2.

self assert: ref = (100@100).

self assert: pt2 = (0@0).

self assert: pt1 = (100@100).

Pointer Swapping

Some Pharo’s success stories

Continuous API Testingkeep your services under control 24/7

Norbert Hartl norbert@2denker.dewww.2denker.de

WEBDRUCK.CHWeb-To-Print Solution

• Design and create individual printed matter

• eShop with credit card payment

• High quality PDF output with Printing Process integration

• Thousands of orders for seven Swiss printing companies

NTed: disaster scenario recovery

iBizLog - http://www.ibizlog.com

A product by SmallworksTuesday, May 15, 12

Pinesoft MBagger

We want more success stories!

We are a cool community

www.10pines.comwww.2denker.dewww.agilitic.com

www.airflowing.comwww.anymorphic.comwww.ardishealth.com

www.beta9.bewww.bombardier.com

www.cmsbox.comwww.finworks.biz

seaside.gemstone.comwww.ibizlog.comwww.inceptive.bewww.jooshr.comwww.majcon.de

www.mindclue.chwww.miriamtech.com

www.myneat.orgwww.netstyle.ch

www.objectfusion.frwww.panasoft.comwww.pinesoft.co.uk

www.promedmedical.netwww.sharedlogic.ca

www.smallworks.com.arwww.trantaria.com www.square-i.net

yesplan.be

Companies

Lafhis (University of Bueno Aires )Software Composition Group (scg.unibe.ch)CAR (Ecole des mines www.ensm-douai.fr)RMoD (Inria)Ummisco (IRD)Reveal (University of Lugano) Lysic (University of Bretagne Occidentale)Pleiad (University of Santiago)CEA-List

Research Groups

Community Ongoing WorkBetter widgets, UI Builder (A. Plantec, G. Chambers, B. van Ryseghem)

Better browsers (B. van Ryseghem, C. Bruni)

Proxy (M. Martinez-Peck)

New compiler (J. Ressia/M. Denker/C. Bera/)

Vectorial canvas (I. Stasenko)

Better FFI (I. Stasenko, E. Lorenzano)

Bootstrap (G. Polito/S. Ducasse/N. Bouraqadi/L. Fabresse)

PDF generation (O. Auverlot, G. Larcheveque)

Network (WebSocket, Oauth, Zinc, Zodiac S. van Caekenberghe)

Consortium & Association

How to sustain Pharo?

How to structure the community?

Consortium MembersManaged by Inria for nowWho: companies, institutions, user groupsPrivileged access to the core development teamInfluence priorities of the next developmentEngineering support timeJob postsTraining/Conferences special prices

Pharo User Association

Managed by the Pharo AssociationIndividuals

Premium (99 €/year)Normal (40 €/year)

Join and participate!

Pharo books

Pharo by example translated to french, merci!translated to spanish, gracias!translated to japanese, ありがとう!

german started

http://pharobyexample.org

New books are coming

Deep into Pharo

Pharo for the Enterprise

A glimpse at VM

Everybody can helpReporting bugs

Confirming bugs

Writing tests

Writing examples

Writing comments

Simple contributing fixes

Discussion, feedback

May 2008 BernJuly 2009 BernOctober 2009 LilleNovember 2009 Buenos AiresMarch 2010 BernMay 2010 Buenos AiresJune 2010 BernJune 2010 BruxellesJuly 2010 LondonSeptember 2010 BarcelonaSeptember 2010 LilleJanuary 2011 LilleJuly 2011 LilleOctober 2011 BruxellesFebruary 2012 BernOctober 2012 BernApril 2012 LilleAugust 2012 GhentOctober 2012 Perto MadrynJanuary 2013 SantiagoFebruary 2013 LilleApril 2013 LilleJune 2013 Lille

Open Pharo Sprints

To Take AwayBecause it is simple and extensible, Pharo is a nice platform to experiment on

Use it for your own research (language design or implementation, types, modularity, empirical studies…)

http://www.pharo.org

top related