SlideShare a Scribd company logo
1 of 77
Download to read offline
Georg Heeg eK
Baroper Str. 337
44227 Dortmund
Germany
Tel: +49-231-97599-0
Fax: +49-231-97599-20
Email: georg@heeg.de
http://www.heeg.de
Georg Heeg AG
Seestraße 135
8027 Zürich
Switzerland
Tel: +41(848) 43 34 24
Georg Heeg eK
Mühlenstr. 19
06366 Köthen
Germany
Tel: +49-3496-214 328
Fax: +49-3496-214 712
2
Georg Heeg
Prague, Septem ber 7 th, 2 0 0 6
3
About Georg Heeg eK
Founded 1987, headquarter in Dortmund,
since 1996 in Zurich, since 1999 in Koethen/ Anhalt
Consulting- and training company in Smalltalk
Hotline support, maintenance, bug-fixes for
ObjectStudio, VisualWorks and Visual Smalltalk
VM-laboratory for VisualWorks and ObjectStudio
Porting service of old VisualWorks applications to 5i/ 7
Technology-partner of
Corporate Mission: Make Sophisticated Projects
a Success for the Customer!
4
Som e Background
1994/ 96 Cincom bought ObjectStudio
1999 Cincom bought VisualWorks
ObjectStudio customers keep asking for
VisualWorks features
ObjectStudio 8 integrates VisualWorks
and ObjectStudio
5
ObjectStudio and VisualW orks
Both ObjectStudio and VisualWorks
are Smalltalk systems.
Both
are owned by the same company Cincom
VisualWorks
like Squeak goes back to the original Smalltalk-76/-78/-80
developments at Xerox PARC.
Originally called Smalltalk-80, ObjectWorks later
ObjectStudio
was developed as Enterprise Object-Oriented Development
Environment
Originally called Enfin.
6
Key Features
Enfin/ ObjectStudio
Ease of Use
Enterprise Integration
Smalltalk-80/ ObjectWorks/ VisualWorks
Execution speed
Sophisticated meta-modelling features
Customers want both
Speed: always
Ease of use: to get started
Enterprise integration: mostly
meta-modeling: seldom
but if they need it, they outperform having it.
7
From Forbes.COM
A press conference is called.
The media is alerted.
The top executives gather for much
backslapping and multisyllabic descriptions of
the synergistic opportunities abounding in this,
a fresh new partnership.
There's a champagne toast
and then the most extraordinary thing
happens
...nothing! Nothing at all.
http: / / www.forbes.com/ 2002/ 07/ 01/ 0701alliances.html
8
Synergy doesn t W ork
VisualWorks VM for ObjectStudio
HPOS
Was started and
was not completed
Ideas to integrate ObjectStudio into .NET
didn t make it
9
Theory: Sm alltalk is Different
In Smalltalk programming is modeling.
Thus every theory can be modeled well.
Thus every computer technology can be
modeled well
Thus every other Smalltalk system can
be modeled well.
10
ObjectStudio 8
Model ObjectStudio by VisualWorks in
Smalltalk
Use Meta-Modeling
Use all reflection capabilities
Compiler
Debugger
Namespaces
11
The Goal
Both ObjectStudio and VisualWorks live in the
same image the same time
Both Environments share the same Smalltalk
kernel and base classes to provide identical
functionality
Mixing and matching is seamlessly possible
Both ObjectStudio and VisualWorks application
Smalltalk code works unchanged
There will always be exceptions to this rule
12
The Team
Suzanne Fortman (Program Director, Cincom Smalltalk)
Andreas Hiltner (ObjectStudio 8 Lead Engineer)
Mark Grinnell (ObjectStudio Lead Engineer)
Eduard Maydanik (GUI Engineer)
Kim Thomas (Testing, Packaging, Support)
Eliot Miranda (VisualWorks Lead Engineer)
Alan Knight (Store Consultant)
Jörg Belger (VisualWorks Wrapper)
James Robertson (Product Manager)
Georg Heeg (Idea)
Helge Nowak (Sales Engineer)
Monika Laurent (Marketing)
13
The First Step
Vocal chords surgery in June 2004
No permission to speak for a week
14
15
End of First Step
Smalltalk works
UI does not work
Primitives don t work
16
The Second Step: Prim itives
Jörg Belger starts working at Georg Heeg eK
Köthen October 1, 2004
Coauthor of the original Ce VM as intern (100 days)
Coauthor of computer games
Background in C+ +
ObjectStudio MFC DLL functions are
implemented
One per one at a time
17
The First W indow Opens
User Conference in Frankfurt
December 2004
First customers see it and are impressed
18
Second Step: Proof of Concept
One primitive at a time
One day per primitive
But
There are alone 450 MFC primitives
Second step is stopped in January 2005
19
Third Step: Do it Com pletely
Take the entire ObjectStudio C/ C+ + -
Code
Make it a VisualWorks callable DLL
Started in February 2005
20
June 2 0 0 5
Alpha1 Version made
First time complete
But not tested or bug-free
21
Forth step: Check for Com patibility
Run all components of the system
If they work differently
Add compatibility
Decide for incompatibility
seldom and easy to understand
E.g.: BOSS instead of BinaryObjectStreams
Run real Customer Applications
Details: see later
22
Septem ber 2 0 0 6
Ready for Beta1 at the end of the month
23
Architecture overview
VirtualVirtual MachineMachine
ObjectStudio DLLObjectStudio DLL BaseBase ClassesClasses
VisualWorks CodeVisualWorks Code
ObjectStudio CodeObjectStudio Code
ObjectStudio SmalltalkObjectStudio Smalltalk
compatibilitycompatibility layerlayer
24
I m plem entation Strategy
KISS
Keep modifications of ObjectStudio source
code to a minimum
In Smalltalk and C/ C+ +
Do not modify VisualWorks VM unnecessarily
Fix bugs
Additional features in VW 7.4.1/ 7.5
Use LoadLibraryEx() instead of LoadLibrary()
Event handling in the image
25
General Concepts
Model ObjectStudio by VisualWorks Smalltalk
Preserve syntax and semantics
ObjectStudioCompiler
Embed in a NameSpace
Share code
Collections
Magnitude
Semaphore
Boolean
Undefined Object
26
VisualW orks Nam espaces
Goal
(In-)visibility of global names
Successor to
GlobalDictionary
PoolDictionary
ClassPools
27
System , the GlobalDictionary
In Classic ObjectStudio all global names
live in the Globaldictionary called System
In ObjectStudio 8
Classes live in Namespace ObjectStudio
Globals live in Namespace
ObjectStudio.Globals
Non Identifier entries are Stored in an
IdentityDictionary
28
PoolDictionaries
In Classic ObjectStudio
PoolDictionaries are globals which are IdentityDictionaries
OLEConstants := IdentyDictionary new.
OLEConstants at: # ADVF_DATAONSTOP put: 64.
In ObjectStudio 8
Extra declaration is needed (manually)
ObjectStudio.Globals defineNameSpace: #OLEConstants
Entries in these Dictionaries become SharedVariables with initializers
(automatically)
ObjectStudio.Globals.OLEConstants
defineSharedVariable: #ADVF_DATAONSTOP
private: false
constant: false
category: 'As yet unclassified'
initializer: '64'
29
Shared Classes
ActionSequence, Array, Association, Bag, Behavior,
BlockClosure, Boolean, ByteArray, Character, Class,
Collection, CompiledBlock, CompiledMethod, Compiler,
Date, Dictionary, EncodedStream, False, Fraction,
IdentityDictionary, IdentitySet, Integer,
InternalStream, Magnitude, Metaclass, MethodContext,
Number, OrderedCollection, PeekableStream, Point,
PositionableStream, Random, ReadStream,
ReadWriteStream, Rectangle, Semaphore, Set,
SmallInteger, SortedCollection, Stream, String,
Symbol, Time, Timestamp, True, UndefinedObject,
UserPrimitiveMethod, WeakDictionary, WriteStream,
Exception, Error, MessageNotUnderstood, Notification,
StreamError, PositionOutOfBoundsError,
IncompleteNextCountError, EndOfStreamNotification,
SocketAccessor, SocketAddress
30
Special Renam ing
ObjectStudio defineSharedVariable: # Float
private: false
constant: true
category: 'ObjectStudio Compatibility 2'
initializer: Core.Double'
31
Source Differences
ObjectStudio cls files
One class per file
With class definition: primary files
Class extension: secondary file
Different chunk file format
Method syntax differences
Semantic differences
32
Parsing ObjectStudio Source Code
ObjectStudioCompiler
Calls ObjectStudioParser
ObjectStudioParser
Accepts ObjectStudio Syntax
Creates ObjectStudio Syntax compliant Syntax tree
Specifying to use ObjectStudio Syntax
classCompilerClass
compilerClass
Automatic source transformation of methods of
VisualWorks classes in cls files
33
Syntax differences: Arrays and cond
f: n
^ { { [ n < = 1] [ 1] }
{ [ true] [ (self f: n - 1) * n] } } cond
f: n
^ n < 1
ifTrue: [ 1]
ifFalse: [ true
ifTrue: [ (self f: n - 1) * n]
ifFalse: [ ObjectStudio.Message
newValue: 'No condition satisfied'] ]
34
Syntax differences: param eters
inc: n
n isNil ifTrue: [ n : = 0] .
^ n + 1
inc: _ _ n
| n |
n : = __n.
n isNil ifTrue: [ n : = 0] .
^ n + 1
35
Som e Sem antic Differences
# (7)7(Array new: 1)
at: 1 put: 7
# (1)< Error>Array new add: 1
nil1[ : n | ] value: 1
Falsenil1 = 0 ifTrue: [ 1]
ObjectStudioVisualW orks
36
Modifying ObjectStudio Parse Tree
ProgramNodeEnumerator subclass
OStudioTreeTransformer modifies parse tree
< osprim >
Blocks in literal arrays
Assignments to arguments
Enabling inner returns
Condition results
Substitutions
All this allows for VisualWorks Code generation
37
Messages w ith different Sem antics
Kernel.OStudioTreeTransformer defineSharedVariable:
# Substitutions
private: false
constant: false
category: 'constants'
initializer: '(Dictionary new)
at: # basicAt: put: put: # os_basicAt: put;
;
yourself
38
Substituted Selectors
, os_comma: asText os_asText methods os_methods
// quo: asTime os_asTime nameOfDay: os_nameOfDay:
< os_LessThan: asTimestamp os_asTimestamp new os_new
<= os_LessEqualThan: asValue os_asValue new: os_new:
= os_Equal: at: os_at: nextString os_nextString
> os_GreaterThan: at:put: os_at:put: origin:corner: os_origin:corner: subclasses os_subclasses
>= os_GreaterEqualThan: basicAt:put: os_basicAt:put: origin:extent: os_origin:extent: subtractTime: os_subtractTime:
add: os_add: between:and: os_between:and: perform: os_perform: to:by:do: os_to:by:do:
add:after: os_add:after: changeSizeTo: os_changeSizeTo: perform:with: os_perform:with: to:do: os_to:do:
add:before: os_add:before: coerce: os_coerce: perform:with:with: os_perform:with:with: totalSeconds os_totalSeconds
add:beforeIndex: os_add:beforeIndex: collect: os_collect: perform:with:with:with: os_perform:with:with:with: trimBlanks os_trimBlanks
add:withOccurrences: os_add:withOccurrences: copyFrom:to: os_copyFrom:to: perform:withArguments: os_perform:withArguments: value os_value
addAll: os_addAll: copyReplaceFrom:to:with: os_copyReplaceFrom:to:with: printOn: os_printOn: wait os_wait
addAllFirst: os_addAllFirst: copyWithout: os_copyWithout: printOn:base: os_printOn:base: whileFalse os_whileFalse
addAllLast: os_addAllLast: dependents os_dependents printString os_printString whileFalse: os_whileFalse:
addDependent: os_addDependent: detect: os_detect: readFrom: os_readFrom: whileTrue os_whileTrue
addFirst: os_addFirst: fileName os_fileName remove: os_remove: whileTrue: os_whileTrue:
addLast: os_addLast: first os_first remove:ifAbsent: os_remove:ifAbsent: with:do: os_with:do:
addTime: os_addTime: firstDayOfMonth os_firstDayOfMonth removeAll: os_removeAll: withAllSubclasses os_withAllSubclasses
allInstVarNames os_allInstVarNames flush os_flush removeDependent: os_removeDependent:  rem:
allSubclasses os_allSubclasses fromDays: os_fromDays: removeKey: os_removeKey: ~= os_NotEqual:
asByteArray os_asByteArray ifFalse: os_ifFalse: signal os_signal
asFilename os_asFilename ifTrue: os_ifTrue: size os_size
asFloat os_asFloat includesKey: os_includesKey: storeOn: os_storeOn:
asInteger os_asInteger indexOf: os_indexOf: storeString os_storeString
asNumber os_asNumber inheritsFrom: os_inheritsFrom:
asSet os_asSet inspect os_inspect
associationAt: os_associationAt: isAlphaNumeric os_isAlphaNumeric
associationsDo: os_associationsDo: last os_last
asString os_asString leapYear: isLeapYear:
subclass:instanceVariabl
eNames:classVariableNa
mes:poolDictionaries:
os_subclass:instanceVariabl
eNames:classVariableNames
:poolDictionaries:
subclass:instanceV
ariableNames:class
VariableNames:poo
lDictionaries:catego
ry:
os_subclass:instanceV
ariableNames:classVari
ableNames:poolDiction
aries:category:
39
Different file structure, first version
Reader for .txt and .cls files to get
ObjectStudio code into VisualWorks
ClassReader
Reads txt files and calls
ObjectStudioChangeScanner
ObjectStudioChangeScanner
Reads cls files
40
Second Version: Source Code I ntegration
ObjectStudio.ApplicationDefintionStream
Original Classic ObjectStudio class
Reads .txt files
OStudioChunkSourceFileFormat
Lives in VisualWorks SourceFileFormat class
hierarchy
Reads and writes .cls files
Controls that .cls files
41
ObjectStudio Sm alltalk and C
Strong interconnection between C and Smalltalk
They call each other all the time
There are five ways to call C
Direct primitives
PrimSpecRec
Numbered Primitives
<primitive: 123>
Named Primitives
< osprim: MFC openWindow>
< osprim: #myDll myfunc>
Module/ENFINModule
Programmatic creation of interface methods using osprim
ExternalProcedures
Programmatic creation of interface methods with C datatypes
42
ObjectStudioW rapperDLL
Regular VisualWorks DLL
Uses _oop as parameter and return type
Calls ObjectStudio primitives using a
simulated ObjectStudio stack
43
OPTR and _ oop
In ObjectStudio object pointers OPTR never move
In VisualWorks object pointer _oop are moved by the
garbage collector
ObjectStudio C code relies on not non moving OPTR
Solution:
Define class OPTR with wraps VisualWorks Oops for
ObjectStudio including C+ + reference counting
The real object pointers _oop are stored in a Smalltalk array
which is registered in the Visualworks registry
the index to this array is stored in class OPTR as variable
Reference counts are stored in a normal C array.
44
OPTR class ( extract)
class __declspec(dllexport) OPTR;
typedef OPTR* POPTR;
class OPTR
{
public:
static OPTR& cpp_S2O(LONG value);
[ ]
private:
[ ]
enum Types { TYPE_NIL = 0, TYPE_NORMALOBJECT,
TYPE_NOTNORMALOBJECT, TYPE_UNKNOWN} ;
INT m_IndexOrOop; // index in objecttable or not normal
object
INT m_Type; // type of object
static INT s_NumObjects; // number of registered objects
static INT s_NextFreeObject; // index of next free object
in objecttable
static INT s_ObjectTable; // index of objecttable array in
visualworks registry
static INT* s_LinkTable; // array with linked registry slots
45
Direct Prim itives
Look at definition
Re-implement
mostly in Smalltalk using existing
VisualWorks functionality
In rare cases replace by osprim
46
Num bered Prim itives
< Primitive: 45>
Some are replaced by
VisualWorks Primitive
E.g. Object> > = =
< vwprimitive: 110>
VisualWorks implementation
For most
Auto-generate calling code
47
Auto-Generated Prim itive
disable
<primitive: 7>
^ self primitiveFailed.
disable
< osprimitive: 7>
| argumentArray |
argumentArray := Core.Array os_new: 0.
^ ObjectStudioCallInterface os_new
callPrim: 7
self: self
arguments: argumentArray
ifFail: [^self primitiveFailed]
48
Class ObjectStudioCallI nterface
callPrim: primitiveNumber self: oSelf arguments: args ifFail:
failBlock
self init.
^[self callPrim: primitiveNumber self: oSelf arguments: args]
on: PrimitiveFailException
do: [:ex| ^failBlock value]
callPrim: primitiveNumber self: oSelf arguments: args
<C: _oop callPrim(int primitiveNumber, _oop oSelf, _oop args)>
_errorCode = 0 ifTrue: [PrimitiveFailException raise].
self externalAccessFailedWith: _errorCode
49
The C+ + side
_oop callPrim(int primitiveNumber, _oop oSelf, _oop args)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
[ ]
primReturnCode =
CallUserPrimitiveFunc(primMethodOPTR);
oSelf = PPop().getObject();
[ ]
if (primReturnCode == FALSE)
UPfail(0);
return oSelf;
}
50
Autogenerated osprim
activateExcludeChild: fExclude
< osprim: MFC ActivateForm>
^ self primitiveFailed.
activateExcludeChild: fExclude
< osprim: MFC ActivateForm>
< methodClass: ExternalAnnotatedMethod>
| argumentArray |
(argumentArray := Array new: 1) os_at: 1 put: fExclude.
^ ObjectStudio.External.ObjectStudioCallInterface new
callOSPrim: thisContext method functionSpecification
self: self
arguments: argumentArray
ifFail: [^self primitiveFailed]
51
Manually created osprim ( Class Point)
translateFromForm: aFormOrFormItem to: anOther
"<osprim: TRACK POINTTRANSLATEFROMFORM> "
| args functionSpecification |
args := Array new: 2.
args at: 1 put: aFormOrFormItem.
args at: 2 put: anOther.
functionSpecification := OSPrimSpecifier new.
functionSpecification
module: Root.ObjectStudio.ENFINModule versionTag , 'TRACK'.
functionSpecification function: 'POINTTRANSLATEFROMFORM'.
functionSpecification numArgs: 2.
^ Root.ObjectStudio.ObjectStudioCallInterface new
callOSPrim: functionSpecification
self: self
arguments: args
ifFail: [^self primitiveFailed]
52
OSPrim Specifier
Smalltalk.Kernel defineClass: # OSPrimSpecifier
superclass: # { Object}
indexedType: # none
private: false
instanceVariableNames: 'numArgs numTemps
handle function module '
classInstanceVariableNames: ''
imports: ''
category: 'ObjectStudio Tools
53
ExternalAnnotatedMethod
Smalltalk.Kernel defineClass: # ExternalAnnotatedMethod
superclass: # { Kernel.AnnotatedMethod}
indexedType: # objects
private: false
instanceVariableNames: 'functionSpecification '
classInstanceVariableNames: ''
imports: ''
category: 'ExternalAnnotatedMethod
Variable functionSpecification stores instances of
OSPrimSpecifier
54
Module/ EnfinModule
Autogenerate osprim
privateQueryVolum eNam e: aSmallInteger
< osprim: FILES PRIVATEQUERYDRIVENAME>
":Section Reference
privateQueryVolumeName: aSmallInteger
Description: Returns the name of a drive.
Assumptions: The drive number passed in is a small integer
starting with 1 for drive A: . This function returns
allways an empty strings on operating systems, which
do not support a drive concept.
[ ]
55
External Procedures
Just work unchanged
56
ObjectStudio Unicode
In ObjectStudio 7
Two installations
Two Virtual Machines
Incompatible Images
Compatible Source Code
In ObjectStudio 8
One installation
One Virtual Machine
Two sets of DLLs
One image
Decision at start-up
57
Native W idgets
Use MFC
Callbacks to VisualWorks
58
Calling Sm alltalk from C
PSend is implemented using
OESendMessageMany()
ASend is implemented using
OESendMessageMany()
whenIdleSend: aSelector to: aReceiver withArguments: anArray
"inserts the asend into the queue "
ASendSemaphore critical:
[ASendQueue addLast: (Core.MessageSend
receiver: aReceiver
selector: aSelector
arguments: (anArrayOrObject isArray
ifTrue: [anArrayOrObj
59
The Process Model
VisualWorks process model
Many Smalltalk processes are running in different
priority.
Windows events are handled (almost) any time
Shared queues move the events to target processes
This is emplemented in C
ObjectStudio process model
The caller of all execution is the Windows Event
Loop
All Message Sends in the ASendQueue are executed
when the Windows Event is empty
This is implemented in C+ +
60
Decision of July 2 0 0 6
Move EventLoop to Smalltalk
Available in vw-dev since August 29, 2006
Initialzing in class EventProcessingManager:
prim CallbackEventI nstall: aMethodSelector
"Inform the VM of the callback class (the receiver) and the callback
invocation
method selector for event processing."
| regNames |
regNames := ObjectMemory registrationNames.
((regNames includes: 'callbackEventClass')
and: [regNames includes: 'callbackEventSelector'])
ifTrue:
[ ObjectMemory registerObject: self
withEngineFor: 'callbackEventClass'.
ObjectMemory registerObject: aMethodSelector
withEngineFor: 'callbackEventSelector']
61
Eventloop in Sm alltalk
Class EventProcessingManager
runs the loop
delegates all actions to the handler
Implemented in EventHandler class hierarchy
processEvents
| eventRecord |
handler canHandleMultipleEvents
ifFalse: [self blockEvents ifTrue: [^self]].
[ eventRecord := handler eventRecord.
[ handler nextEvent: eventRecord]
whileTrue: [ handler handleEvent: eventRecord].
handler postHandleEvents]
ensure: [self allowEvents]
62
Subclasses of EventHandler
Example methods in Win32EventHandler
eventRecord
^ self MSG gcMalloc
nextEvent: anEventRecord
^(self
peekMessageA: anEventRecord
window: 0
filterMin: 0
filterMax: 0
flags: (self PM_REMOVE bitOr: self PM_NOYIELD)) ~= self
FALSE
postHandleEvents
^ self
63
OStudioEventHandler
Example methods in OStudioEventHandler
preTranslateMessage: msg
<C: BOOL PreTranslateMessage(LPMSG msg)>
^ self externalAccessFailedWith: _errorCode
postHandleEvents
System wantsBusyCursor
ifTrue: [UI.Cursor wait
showWhile: [System drainASendQueue]]
ifFalse: [System drainASendQueue].
self onIdleApp
onIdleApp
<C: void OnIdleApp(void)>
^ self externalAccessFailedWith: _errorCode
64
Handling an event
In Win32EventHandler
handleEvent: anEventRecord
self translateMessage: anEventRecord.
self dispatchMessageA: anEventRecord
In OStudioEventHandler
handleEvent: anEventRecord
(self preTranslateMessage: anEventRecord) = self FALSE
ifTrue:
[ self translateMessage: anEventRecord.
self dispatchMessageA: anEventRecord]
65
User I nterrupts
< ctrl> Y and < ctrl> < shift> Y work as in
VisualWorks
Implemented as Accelerator Keys
< ctrl> Y interrupts the running process
by sending self halt: in a callBack from C
66
Class Proxies
Class Proxies work
They are shared variables in
Root.ObjectStudio.Global
Loading puts class in Root.ObjectStudio
67
Application Loading
Application loading works
68
Perform ance I ssues
In Classic ObjectStudio
Smalltalk execution is slow
Calling C primitives cost nothing
In VisualWorks
Smalltalk execution is fast
Calling C is expensive
In Classic ObjectStudio
Performance critical methods are moved to C
In ObjectStudio 8
Performance critical primitives are moved back to
Smalltalk
69
VisualW orks .st file-in is slow
Of 1000 seconds
900 are RB refresh
Of 100 seconds
90 are repeatedly relinking the system
Of 10 Seconds
9 are disk flush (Changes file)
1 second compiling
At the end of the optimizations:
Loading as alternative to file-in
Loading a .st is similar speed as parcel loading
Small .st/.cls files load faster than parcels
Large parcel files load faster than .st/.cls files
70
New Concepts for ObjectStudio
Source Code Management
Store
Versioning system
Database based
Smalltalk Archives
File based
One file per application
Code purity
Undeclared
Code Critic
Overrides
71
June 2005
Internal Alpha
October 2005
Internal Alpha2
March 2006
Cincom internal testing
April 2006
First Customer
August 2006
First independent Service Partner
May-September 2006
Solve incompatabilities, Refactoring, Performance issues
October 2006
Next few customers
December 2006
Preview
72
Porting Process Theory
Theory
Load application
Start it
73
Porting Process Practice
Look at base system modifications
Like any other porting this is a source of
many problems
Known incompatibilities
Immutability
Declare Pool Dictionaries
Export Modeling Tool definitions in ASCII
Binary format is incompatible
74
Undeclareds
In Classic ObjectStudio
Each undeclared variable is always considered a
global
In VisualWorks and ObjectStudio 8
Each undeclared variable is considered undeclared
GHUndeclaredBrowser
Shows all Undeclareds and their references
It uncovered some very old ObjectStudio problems
due to typoes.
75
Target Look
76
After loading Modeling Tool
77
W hat can ESUG Audience learn?
Integration of Smalltalk systems is possible
Which systems deserve to be integrated?
VW and Squeak
Very common systems
VSE
VA
Smalltalk-X
Dolphin
Ruby
Java
Frost
GemStone

More Related Content

Similar to Integration of Cincom Smalltalk Systems

Smalltalk speaks dot net
Smalltalk speaks dot netSmalltalk speaks dot net
Smalltalk speaks dot netESUG
 
Open frameworks 101_fitc
Open frameworks 101_fitcOpen frameworks 101_fitc
Open frameworks 101_fitcbenDesigning
 
Hacking the Kinect with GAFFTA Day 1
Hacking the Kinect with GAFFTA Day 1Hacking the Kinect with GAFFTA Day 1
Hacking the Kinect with GAFFTA Day 1benDesigning
 
Oleksii Moskalenko "Continuous Delivery of ML Pipelines to Production"
Oleksii Moskalenko "Continuous Delivery of ML Pipelines to Production"Oleksii Moskalenko "Continuous Delivery of ML Pipelines to Production"
Oleksii Moskalenko "Continuous Delivery of ML Pipelines to Production"Fwdays
 
The Ring programming language version 1.3 book - Part 8 of 88
The Ring programming language version 1.3 book - Part 8 of 88The Ring programming language version 1.3 book - Part 8 of 88
The Ring programming language version 1.3 book - Part 8 of 88Mahmoud Samir Fayed
 
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...Stefan Richter
 
Modelica-OpenModelica-slides para aprender.pdf
Modelica-OpenModelica-slides para aprender.pdfModelica-OpenModelica-slides para aprender.pdf
Modelica-OpenModelica-slides para aprender.pdfCarlos Paredes
 
Elements of DDD with ASP.NET MVC & Entity Framework Code First
Elements of DDD with ASP.NET MVC & Entity Framework Code FirstElements of DDD with ASP.NET MVC & Entity Framework Code First
Elements of DDD with ASP.NET MVC & Entity Framework Code FirstEnea Gabriel
 
An Introductory course on Verilog HDL-Verilog hdl ppr
An Introductory course on Verilog HDL-Verilog hdl pprAn Introductory course on Verilog HDL-Verilog hdl ppr
An Introductory course on Verilog HDL-Verilog hdl pprPrabhavathi P
 
01. introduction to-programming
01. introduction to-programming01. introduction to-programming
01. introduction to-programmingStoian Kirov
 
Unit 2-Design Patterns.ppt
Unit 2-Design Patterns.pptUnit 2-Design Patterns.ppt
Unit 2-Design Patterns.pptMsRAMYACSE
 
Pragmatic Model Driven Development using openArchitectureWare
Pragmatic Model Driven Development using openArchitectureWarePragmatic Model Driven Development using openArchitectureWare
Pragmatic Model Driven Development using openArchitectureWareMichael Vorburger
 
Eclipse e4 Tutorial - EclipseCon 2010
Eclipse e4 Tutorial - EclipseCon 2010Eclipse e4 Tutorial - EclipseCon 2010
Eclipse e4 Tutorial - EclipseCon 2010Lars Vogel
 
Test-Driven Design Insights@DevoxxBE 2023.pptx
Test-Driven Design Insights@DevoxxBE 2023.pptxTest-Driven Design Insights@DevoxxBE 2023.pptx
Test-Driven Design Insights@DevoxxBE 2023.pptxVictor Rentea
 
Markus Voelter Textual DSLs
Markus Voelter Textual DSLsMarkus Voelter Textual DSLs
Markus Voelter Textual DSLsdeimos
 

Similar to Integration of Cincom Smalltalk Systems (20)

Smalltalk speaks dot net
Smalltalk speaks dot netSmalltalk speaks dot net
Smalltalk speaks dot net
 
Open frameworks 101_fitc
Open frameworks 101_fitcOpen frameworks 101_fitc
Open frameworks 101_fitc
 
Hacking the Kinect with GAFFTA Day 1
Hacking the Kinect with GAFFTA Day 1Hacking the Kinect with GAFFTA Day 1
Hacking the Kinect with GAFFTA Day 1
 
Oleksii Moskalenko "Continuous Delivery of ML Pipelines to Production"
Oleksii Moskalenko "Continuous Delivery of ML Pipelines to Production"Oleksii Moskalenko "Continuous Delivery of ML Pipelines to Production"
Oleksii Moskalenko "Continuous Delivery of ML Pipelines to Production"
 
The Ring programming language version 1.3 book - Part 8 of 88
The Ring programming language version 1.3 book - Part 8 of 88The Ring programming language version 1.3 book - Part 8 of 88
The Ring programming language version 1.3 book - Part 8 of 88
 
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...
 
Modelica-OpenModelica-slides para aprender.pdf
Modelica-OpenModelica-slides para aprender.pdfModelica-OpenModelica-slides para aprender.pdf
Modelica-OpenModelica-slides para aprender.pdf
 
Cg 2011
Cg 2011Cg 2011
Cg 2011
 
Elements of DDD with ASP.NET MVC & Entity Framework Code First
Elements of DDD with ASP.NET MVC & Entity Framework Code FirstElements of DDD with ASP.NET MVC & Entity Framework Code First
Elements of DDD with ASP.NET MVC & Entity Framework Code First
 
An Introductory course on Verilog HDL-Verilog hdl ppr
An Introductory course on Verilog HDL-Verilog hdl pprAn Introductory course on Verilog HDL-Verilog hdl ppr
An Introductory course on Verilog HDL-Verilog hdl ppr
 
01. introduction to-programming
01. introduction to-programming01. introduction to-programming
01. introduction to-programming
 
Game Studio
Game StudioGame Studio
Game Studio
 
VR Workshop #1
VR Workshop #1VR Workshop #1
VR Workshop #1
 
Unit 2-Design Patterns.ppt
Unit 2-Design Patterns.pptUnit 2-Design Patterns.ppt
Unit 2-Design Patterns.ppt
 
Introduction to 2D/3D Graphics
Introduction to 2D/3D GraphicsIntroduction to 2D/3D Graphics
Introduction to 2D/3D Graphics
 
Build 2019 Recap
Build 2019 RecapBuild 2019 Recap
Build 2019 Recap
 
Pragmatic Model Driven Development using openArchitectureWare
Pragmatic Model Driven Development using openArchitectureWarePragmatic Model Driven Development using openArchitectureWare
Pragmatic Model Driven Development using openArchitectureWare
 
Eclipse e4 Tutorial - EclipseCon 2010
Eclipse e4 Tutorial - EclipseCon 2010Eclipse e4 Tutorial - EclipseCon 2010
Eclipse e4 Tutorial - EclipseCon 2010
 
Test-Driven Design Insights@DevoxxBE 2023.pptx
Test-Driven Design Insights@DevoxxBE 2023.pptxTest-Driven Design Insights@DevoxxBE 2023.pptx
Test-Driven Design Insights@DevoxxBE 2023.pptx
 
Markus Voelter Textual DSLs
Markus Voelter Textual DSLsMarkus Voelter Textual DSLs
Markus Voelter Textual DSLs
 

More from ESUG

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingESUG
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in PharoESUG
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapESUG
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoESUG
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...ESUG
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsESUG
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6ESUG
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationESUG
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingESUG
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesESUG
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportESUG
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsESUG
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector TuningESUG
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseESUG
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FutureESUG
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the DebuggerESUG
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing ScoreESUG
 
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptESUG
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocESUG
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsESUG
 

More from ESUG (20)

Workshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programmingWorkshop: Identifying concept inventories in agile programming
Workshop: Identifying concept inventories in agile programming
 
Technical documentation support in Pharo
Technical documentation support in PharoTechnical documentation support in Pharo
Technical documentation support in Pharo
 
The Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and RoadmapThe Pharo Debugger and Debugging tools: Advances and Roadmap
The Pharo Debugger and Debugging tools: Advances and Roadmap
 
Sequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in PharoSequence: Pipeline modelling in Pharo
Sequence: Pipeline modelling in Pharo
 
Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...Migration process from monolithic to micro frontend architecture in mobile ap...
Migration process from monolithic to micro frontend architecture in mobile ap...
 
Analyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early resultsAnalyzing Dart Language with Pharo: Report and early results
Analyzing Dart Language with Pharo: Report and early results
 
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
Transpiling Pharo Classes to JS ECMAScript 5 versus ECMAScript 6
 
A Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test GenerationA Unit Test Metamodel for Test Generation
A Unit Test Metamodel for Test Generation
 
Creating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic ProgrammingCreating Unit Tests Using Genetic Programming
Creating Unit Tests Using Genetic Programming
 
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution ModesThreaded-Execution and CPS Provide Smooth Switching Between Execution Modes
Threaded-Execution and CPS Provide Smooth Switching Between Execution Modes
 
Exploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience ReportExploring GitHub Actions through EGAD: An Experience Report
Exploring GitHub Actions through EGAD: An Experience Report
 
Pharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIsPharo: a reflective language A first systematic analysis of reflective APIs
Pharo: a reflective language A first systematic analysis of reflective APIs
 
Garbage Collector Tuning
Garbage Collector TuningGarbage Collector Tuning
Garbage Collector Tuning
 
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame CaseImproving Performance Through Object Lifetime Profiling: the DataFrame Case
Improving Performance Through Object Lifetime Profiling: the DataFrame Case
 
Pharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and FuturePharo DataFrame: Past, Present, and Future
Pharo DataFrame: Past, Present, and Future
 
thisContext in the Debugger
thisContext in the DebuggerthisContext in the Debugger
thisContext in the Debugger
 
Websockets for Fencing Score
Websockets for Fencing ScoreWebsockets for Fencing Score
Websockets for Fencing Score
 
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScriptShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
ShowUs: PharoJS.org Develop in Pharo, Run on JavaScript
 
Advanced Object- Oriented Design Mooc
Advanced Object- Oriented Design MoocAdvanced Object- Oriented Design Mooc
Advanced Object- Oriented Design Mooc
 
A New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and TransformationsA New Architecture Reconciling Refactorings and Transformations
A New Architecture Reconciling Refactorings and Transformations
 

Recently uploaded

AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetEnjoy Anytime
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 

Recently uploaded (20)

AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 

Integration of Cincom Smalltalk Systems

  • 1. Georg Heeg eK Baroper Str. 337 44227 Dortmund Germany Tel: +49-231-97599-0 Fax: +49-231-97599-20 Email: georg@heeg.de http://www.heeg.de Georg Heeg AG Seestraße 135 8027 Zürich Switzerland Tel: +41(848) 43 34 24 Georg Heeg eK Mühlenstr. 19 06366 Köthen Germany Tel: +49-3496-214 328 Fax: +49-3496-214 712
  • 2. 2 Georg Heeg Prague, Septem ber 7 th, 2 0 0 6
  • 3. 3 About Georg Heeg eK Founded 1987, headquarter in Dortmund, since 1996 in Zurich, since 1999 in Koethen/ Anhalt Consulting- and training company in Smalltalk Hotline support, maintenance, bug-fixes for ObjectStudio, VisualWorks and Visual Smalltalk VM-laboratory for VisualWorks and ObjectStudio Porting service of old VisualWorks applications to 5i/ 7 Technology-partner of Corporate Mission: Make Sophisticated Projects a Success for the Customer!
  • 4. 4 Som e Background 1994/ 96 Cincom bought ObjectStudio 1999 Cincom bought VisualWorks ObjectStudio customers keep asking for VisualWorks features ObjectStudio 8 integrates VisualWorks and ObjectStudio
  • 5. 5 ObjectStudio and VisualW orks Both ObjectStudio and VisualWorks are Smalltalk systems. Both are owned by the same company Cincom VisualWorks like Squeak goes back to the original Smalltalk-76/-78/-80 developments at Xerox PARC. Originally called Smalltalk-80, ObjectWorks later ObjectStudio was developed as Enterprise Object-Oriented Development Environment Originally called Enfin.
  • 6. 6 Key Features Enfin/ ObjectStudio Ease of Use Enterprise Integration Smalltalk-80/ ObjectWorks/ VisualWorks Execution speed Sophisticated meta-modelling features Customers want both Speed: always Ease of use: to get started Enterprise integration: mostly meta-modeling: seldom but if they need it, they outperform having it.
  • 7. 7 From Forbes.COM A press conference is called. The media is alerted. The top executives gather for much backslapping and multisyllabic descriptions of the synergistic opportunities abounding in this, a fresh new partnership. There's a champagne toast and then the most extraordinary thing happens ...nothing! Nothing at all. http: / / www.forbes.com/ 2002/ 07/ 01/ 0701alliances.html
  • 8. 8 Synergy doesn t W ork VisualWorks VM for ObjectStudio HPOS Was started and was not completed Ideas to integrate ObjectStudio into .NET didn t make it
  • 9. 9 Theory: Sm alltalk is Different In Smalltalk programming is modeling. Thus every theory can be modeled well. Thus every computer technology can be modeled well Thus every other Smalltalk system can be modeled well.
  • 10. 10 ObjectStudio 8 Model ObjectStudio by VisualWorks in Smalltalk Use Meta-Modeling Use all reflection capabilities Compiler Debugger Namespaces
  • 11. 11 The Goal Both ObjectStudio and VisualWorks live in the same image the same time Both Environments share the same Smalltalk kernel and base classes to provide identical functionality Mixing and matching is seamlessly possible Both ObjectStudio and VisualWorks application Smalltalk code works unchanged There will always be exceptions to this rule
  • 12. 12 The Team Suzanne Fortman (Program Director, Cincom Smalltalk) Andreas Hiltner (ObjectStudio 8 Lead Engineer) Mark Grinnell (ObjectStudio Lead Engineer) Eduard Maydanik (GUI Engineer) Kim Thomas (Testing, Packaging, Support) Eliot Miranda (VisualWorks Lead Engineer) Alan Knight (Store Consultant) Jörg Belger (VisualWorks Wrapper) James Robertson (Product Manager) Georg Heeg (Idea) Helge Nowak (Sales Engineer) Monika Laurent (Marketing)
  • 13. 13 The First Step Vocal chords surgery in June 2004 No permission to speak for a week
  • 14. 14
  • 15. 15 End of First Step Smalltalk works UI does not work Primitives don t work
  • 16. 16 The Second Step: Prim itives Jörg Belger starts working at Georg Heeg eK Köthen October 1, 2004 Coauthor of the original Ce VM as intern (100 days) Coauthor of computer games Background in C+ + ObjectStudio MFC DLL functions are implemented One per one at a time
  • 17. 17 The First W indow Opens User Conference in Frankfurt December 2004 First customers see it and are impressed
  • 18. 18 Second Step: Proof of Concept One primitive at a time One day per primitive But There are alone 450 MFC primitives Second step is stopped in January 2005
  • 19. 19 Third Step: Do it Com pletely Take the entire ObjectStudio C/ C+ + - Code Make it a VisualWorks callable DLL Started in February 2005
  • 20. 20 June 2 0 0 5 Alpha1 Version made First time complete But not tested or bug-free
  • 21. 21 Forth step: Check for Com patibility Run all components of the system If they work differently Add compatibility Decide for incompatibility seldom and easy to understand E.g.: BOSS instead of BinaryObjectStreams Run real Customer Applications Details: see later
  • 22. 22 Septem ber 2 0 0 6 Ready for Beta1 at the end of the month
  • 23. 23 Architecture overview VirtualVirtual MachineMachine ObjectStudio DLLObjectStudio DLL BaseBase ClassesClasses VisualWorks CodeVisualWorks Code ObjectStudio CodeObjectStudio Code ObjectStudio SmalltalkObjectStudio Smalltalk compatibilitycompatibility layerlayer
  • 24. 24 I m plem entation Strategy KISS Keep modifications of ObjectStudio source code to a minimum In Smalltalk and C/ C+ + Do not modify VisualWorks VM unnecessarily Fix bugs Additional features in VW 7.4.1/ 7.5 Use LoadLibraryEx() instead of LoadLibrary() Event handling in the image
  • 25. 25 General Concepts Model ObjectStudio by VisualWorks Smalltalk Preserve syntax and semantics ObjectStudioCompiler Embed in a NameSpace Share code Collections Magnitude Semaphore Boolean Undefined Object
  • 26. 26 VisualW orks Nam espaces Goal (In-)visibility of global names Successor to GlobalDictionary PoolDictionary ClassPools
  • 27. 27 System , the GlobalDictionary In Classic ObjectStudio all global names live in the Globaldictionary called System In ObjectStudio 8 Classes live in Namespace ObjectStudio Globals live in Namespace ObjectStudio.Globals Non Identifier entries are Stored in an IdentityDictionary
  • 28. 28 PoolDictionaries In Classic ObjectStudio PoolDictionaries are globals which are IdentityDictionaries OLEConstants := IdentyDictionary new. OLEConstants at: # ADVF_DATAONSTOP put: 64. In ObjectStudio 8 Extra declaration is needed (manually) ObjectStudio.Globals defineNameSpace: #OLEConstants Entries in these Dictionaries become SharedVariables with initializers (automatically) ObjectStudio.Globals.OLEConstants defineSharedVariable: #ADVF_DATAONSTOP private: false constant: false category: 'As yet unclassified' initializer: '64'
  • 29. 29 Shared Classes ActionSequence, Array, Association, Bag, Behavior, BlockClosure, Boolean, ByteArray, Character, Class, Collection, CompiledBlock, CompiledMethod, Compiler, Date, Dictionary, EncodedStream, False, Fraction, IdentityDictionary, IdentitySet, Integer, InternalStream, Magnitude, Metaclass, MethodContext, Number, OrderedCollection, PeekableStream, Point, PositionableStream, Random, ReadStream, ReadWriteStream, Rectangle, Semaphore, Set, SmallInteger, SortedCollection, Stream, String, Symbol, Time, Timestamp, True, UndefinedObject, UserPrimitiveMethod, WeakDictionary, WriteStream, Exception, Error, MessageNotUnderstood, Notification, StreamError, PositionOutOfBoundsError, IncompleteNextCountError, EndOfStreamNotification, SocketAccessor, SocketAddress
  • 30. 30 Special Renam ing ObjectStudio defineSharedVariable: # Float private: false constant: true category: 'ObjectStudio Compatibility 2' initializer: Core.Double'
  • 31. 31 Source Differences ObjectStudio cls files One class per file With class definition: primary files Class extension: secondary file Different chunk file format Method syntax differences Semantic differences
  • 32. 32 Parsing ObjectStudio Source Code ObjectStudioCompiler Calls ObjectStudioParser ObjectStudioParser Accepts ObjectStudio Syntax Creates ObjectStudio Syntax compliant Syntax tree Specifying to use ObjectStudio Syntax classCompilerClass compilerClass Automatic source transformation of methods of VisualWorks classes in cls files
  • 33. 33 Syntax differences: Arrays and cond f: n ^ { { [ n < = 1] [ 1] } { [ true] [ (self f: n - 1) * n] } } cond f: n ^ n < 1 ifTrue: [ 1] ifFalse: [ true ifTrue: [ (self f: n - 1) * n] ifFalse: [ ObjectStudio.Message newValue: 'No condition satisfied'] ]
  • 34. 34 Syntax differences: param eters inc: n n isNil ifTrue: [ n : = 0] . ^ n + 1 inc: _ _ n | n | n : = __n. n isNil ifTrue: [ n : = 0] . ^ n + 1
  • 35. 35 Som e Sem antic Differences # (7)7(Array new: 1) at: 1 put: 7 # (1)< Error>Array new add: 1 nil1[ : n | ] value: 1 Falsenil1 = 0 ifTrue: [ 1] ObjectStudioVisualW orks
  • 36. 36 Modifying ObjectStudio Parse Tree ProgramNodeEnumerator subclass OStudioTreeTransformer modifies parse tree < osprim > Blocks in literal arrays Assignments to arguments Enabling inner returns Condition results Substitutions All this allows for VisualWorks Code generation
  • 37. 37 Messages w ith different Sem antics Kernel.OStudioTreeTransformer defineSharedVariable: # Substitutions private: false constant: false category: 'constants' initializer: '(Dictionary new) at: # basicAt: put: put: # os_basicAt: put; ; yourself
  • 38. 38 Substituted Selectors , os_comma: asText os_asText methods os_methods // quo: asTime os_asTime nameOfDay: os_nameOfDay: < os_LessThan: asTimestamp os_asTimestamp new os_new <= os_LessEqualThan: asValue os_asValue new: os_new: = os_Equal: at: os_at: nextString os_nextString > os_GreaterThan: at:put: os_at:put: origin:corner: os_origin:corner: subclasses os_subclasses >= os_GreaterEqualThan: basicAt:put: os_basicAt:put: origin:extent: os_origin:extent: subtractTime: os_subtractTime: add: os_add: between:and: os_between:and: perform: os_perform: to:by:do: os_to:by:do: add:after: os_add:after: changeSizeTo: os_changeSizeTo: perform:with: os_perform:with: to:do: os_to:do: add:before: os_add:before: coerce: os_coerce: perform:with:with: os_perform:with:with: totalSeconds os_totalSeconds add:beforeIndex: os_add:beforeIndex: collect: os_collect: perform:with:with:with: os_perform:with:with:with: trimBlanks os_trimBlanks add:withOccurrences: os_add:withOccurrences: copyFrom:to: os_copyFrom:to: perform:withArguments: os_perform:withArguments: value os_value addAll: os_addAll: copyReplaceFrom:to:with: os_copyReplaceFrom:to:with: printOn: os_printOn: wait os_wait addAllFirst: os_addAllFirst: copyWithout: os_copyWithout: printOn:base: os_printOn:base: whileFalse os_whileFalse addAllLast: os_addAllLast: dependents os_dependents printString os_printString whileFalse: os_whileFalse: addDependent: os_addDependent: detect: os_detect: readFrom: os_readFrom: whileTrue os_whileTrue addFirst: os_addFirst: fileName os_fileName remove: os_remove: whileTrue: os_whileTrue: addLast: os_addLast: first os_first remove:ifAbsent: os_remove:ifAbsent: with:do: os_with:do: addTime: os_addTime: firstDayOfMonth os_firstDayOfMonth removeAll: os_removeAll: withAllSubclasses os_withAllSubclasses allInstVarNames os_allInstVarNames flush os_flush removeDependent: os_removeDependent: rem: allSubclasses os_allSubclasses fromDays: os_fromDays: removeKey: os_removeKey: ~= os_NotEqual: asByteArray os_asByteArray ifFalse: os_ifFalse: signal os_signal asFilename os_asFilename ifTrue: os_ifTrue: size os_size asFloat os_asFloat includesKey: os_includesKey: storeOn: os_storeOn: asInteger os_asInteger indexOf: os_indexOf: storeString os_storeString asNumber os_asNumber inheritsFrom: os_inheritsFrom: asSet os_asSet inspect os_inspect associationAt: os_associationAt: isAlphaNumeric os_isAlphaNumeric associationsDo: os_associationsDo: last os_last asString os_asString leapYear: isLeapYear: subclass:instanceVariabl eNames:classVariableNa mes:poolDictionaries: os_subclass:instanceVariabl eNames:classVariableNames :poolDictionaries: subclass:instanceV ariableNames:class VariableNames:poo lDictionaries:catego ry: os_subclass:instanceV ariableNames:classVari ableNames:poolDiction aries:category:
  • 39. 39 Different file structure, first version Reader for .txt and .cls files to get ObjectStudio code into VisualWorks ClassReader Reads txt files and calls ObjectStudioChangeScanner ObjectStudioChangeScanner Reads cls files
  • 40. 40 Second Version: Source Code I ntegration ObjectStudio.ApplicationDefintionStream Original Classic ObjectStudio class Reads .txt files OStudioChunkSourceFileFormat Lives in VisualWorks SourceFileFormat class hierarchy Reads and writes .cls files Controls that .cls files
  • 41. 41 ObjectStudio Sm alltalk and C Strong interconnection between C and Smalltalk They call each other all the time There are five ways to call C Direct primitives PrimSpecRec Numbered Primitives <primitive: 123> Named Primitives < osprim: MFC openWindow> < osprim: #myDll myfunc> Module/ENFINModule Programmatic creation of interface methods using osprim ExternalProcedures Programmatic creation of interface methods with C datatypes
  • 42. 42 ObjectStudioW rapperDLL Regular VisualWorks DLL Uses _oop as parameter and return type Calls ObjectStudio primitives using a simulated ObjectStudio stack
  • 43. 43 OPTR and _ oop In ObjectStudio object pointers OPTR never move In VisualWorks object pointer _oop are moved by the garbage collector ObjectStudio C code relies on not non moving OPTR Solution: Define class OPTR with wraps VisualWorks Oops for ObjectStudio including C+ + reference counting The real object pointers _oop are stored in a Smalltalk array which is registered in the Visualworks registry the index to this array is stored in class OPTR as variable Reference counts are stored in a normal C array.
  • 44. 44 OPTR class ( extract) class __declspec(dllexport) OPTR; typedef OPTR* POPTR; class OPTR { public: static OPTR& cpp_S2O(LONG value); [ ] private: [ ] enum Types { TYPE_NIL = 0, TYPE_NORMALOBJECT, TYPE_NOTNORMALOBJECT, TYPE_UNKNOWN} ; INT m_IndexOrOop; // index in objecttable or not normal object INT m_Type; // type of object static INT s_NumObjects; // number of registered objects static INT s_NextFreeObject; // index of next free object in objecttable static INT s_ObjectTable; // index of objecttable array in visualworks registry static INT* s_LinkTable; // array with linked registry slots
  • 45. 45 Direct Prim itives Look at definition Re-implement mostly in Smalltalk using existing VisualWorks functionality In rare cases replace by osprim
  • 46. 46 Num bered Prim itives < Primitive: 45> Some are replaced by VisualWorks Primitive E.g. Object> > = = < vwprimitive: 110> VisualWorks implementation For most Auto-generate calling code
  • 47. 47 Auto-Generated Prim itive disable <primitive: 7> ^ self primitiveFailed. disable < osprimitive: 7> | argumentArray | argumentArray := Core.Array os_new: 0. ^ ObjectStudioCallInterface os_new callPrim: 7 self: self arguments: argumentArray ifFail: [^self primitiveFailed]
  • 48. 48 Class ObjectStudioCallI nterface callPrim: primitiveNumber self: oSelf arguments: args ifFail: failBlock self init. ^[self callPrim: primitiveNumber self: oSelf arguments: args] on: PrimitiveFailException do: [:ex| ^failBlock value] callPrim: primitiveNumber self: oSelf arguments: args <C: _oop callPrim(int primitiveNumber, _oop oSelf, _oop args)> _errorCode = 0 ifTrue: [PrimitiveFailException raise]. self externalAccessFailedWith: _errorCode
  • 49. 49 The C+ + side _oop callPrim(int primitiveNumber, _oop oSelf, _oop args) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); [ ] primReturnCode = CallUserPrimitiveFunc(primMethodOPTR); oSelf = PPop().getObject(); [ ] if (primReturnCode == FALSE) UPfail(0); return oSelf; }
  • 50. 50 Autogenerated osprim activateExcludeChild: fExclude < osprim: MFC ActivateForm> ^ self primitiveFailed. activateExcludeChild: fExclude < osprim: MFC ActivateForm> < methodClass: ExternalAnnotatedMethod> | argumentArray | (argumentArray := Array new: 1) os_at: 1 put: fExclude. ^ ObjectStudio.External.ObjectStudioCallInterface new callOSPrim: thisContext method functionSpecification self: self arguments: argumentArray ifFail: [^self primitiveFailed]
  • 51. 51 Manually created osprim ( Class Point) translateFromForm: aFormOrFormItem to: anOther "<osprim: TRACK POINTTRANSLATEFROMFORM> " | args functionSpecification | args := Array new: 2. args at: 1 put: aFormOrFormItem. args at: 2 put: anOther. functionSpecification := OSPrimSpecifier new. functionSpecification module: Root.ObjectStudio.ENFINModule versionTag , 'TRACK'. functionSpecification function: 'POINTTRANSLATEFROMFORM'. functionSpecification numArgs: 2. ^ Root.ObjectStudio.ObjectStudioCallInterface new callOSPrim: functionSpecification self: self arguments: args ifFail: [^self primitiveFailed]
  • 52. 52 OSPrim Specifier Smalltalk.Kernel defineClass: # OSPrimSpecifier superclass: # { Object} indexedType: # none private: false instanceVariableNames: 'numArgs numTemps handle function module ' classInstanceVariableNames: '' imports: '' category: 'ObjectStudio Tools
  • 53. 53 ExternalAnnotatedMethod Smalltalk.Kernel defineClass: # ExternalAnnotatedMethod superclass: # { Kernel.AnnotatedMethod} indexedType: # objects private: false instanceVariableNames: 'functionSpecification ' classInstanceVariableNames: '' imports: '' category: 'ExternalAnnotatedMethod Variable functionSpecification stores instances of OSPrimSpecifier
  • 54. 54 Module/ EnfinModule Autogenerate osprim privateQueryVolum eNam e: aSmallInteger < osprim: FILES PRIVATEQUERYDRIVENAME> ":Section Reference privateQueryVolumeName: aSmallInteger Description: Returns the name of a drive. Assumptions: The drive number passed in is a small integer starting with 1 for drive A: . This function returns allways an empty strings on operating systems, which do not support a drive concept. [ ]
  • 56. 56 ObjectStudio Unicode In ObjectStudio 7 Two installations Two Virtual Machines Incompatible Images Compatible Source Code In ObjectStudio 8 One installation One Virtual Machine Two sets of DLLs One image Decision at start-up
  • 57. 57 Native W idgets Use MFC Callbacks to VisualWorks
  • 58. 58 Calling Sm alltalk from C PSend is implemented using OESendMessageMany() ASend is implemented using OESendMessageMany() whenIdleSend: aSelector to: aReceiver withArguments: anArray "inserts the asend into the queue " ASendSemaphore critical: [ASendQueue addLast: (Core.MessageSend receiver: aReceiver selector: aSelector arguments: (anArrayOrObject isArray ifTrue: [anArrayOrObj
  • 59. 59 The Process Model VisualWorks process model Many Smalltalk processes are running in different priority. Windows events are handled (almost) any time Shared queues move the events to target processes This is emplemented in C ObjectStudio process model The caller of all execution is the Windows Event Loop All Message Sends in the ASendQueue are executed when the Windows Event is empty This is implemented in C+ +
  • 60. 60 Decision of July 2 0 0 6 Move EventLoop to Smalltalk Available in vw-dev since August 29, 2006 Initialzing in class EventProcessingManager: prim CallbackEventI nstall: aMethodSelector "Inform the VM of the callback class (the receiver) and the callback invocation method selector for event processing." | regNames | regNames := ObjectMemory registrationNames. ((regNames includes: 'callbackEventClass') and: [regNames includes: 'callbackEventSelector']) ifTrue: [ ObjectMemory registerObject: self withEngineFor: 'callbackEventClass'. ObjectMemory registerObject: aMethodSelector withEngineFor: 'callbackEventSelector']
  • 61. 61 Eventloop in Sm alltalk Class EventProcessingManager runs the loop delegates all actions to the handler Implemented in EventHandler class hierarchy processEvents | eventRecord | handler canHandleMultipleEvents ifFalse: [self blockEvents ifTrue: [^self]]. [ eventRecord := handler eventRecord. [ handler nextEvent: eventRecord] whileTrue: [ handler handleEvent: eventRecord]. handler postHandleEvents] ensure: [self allowEvents]
  • 62. 62 Subclasses of EventHandler Example methods in Win32EventHandler eventRecord ^ self MSG gcMalloc nextEvent: anEventRecord ^(self peekMessageA: anEventRecord window: 0 filterMin: 0 filterMax: 0 flags: (self PM_REMOVE bitOr: self PM_NOYIELD)) ~= self FALSE postHandleEvents ^ self
  • 63. 63 OStudioEventHandler Example methods in OStudioEventHandler preTranslateMessage: msg <C: BOOL PreTranslateMessage(LPMSG msg)> ^ self externalAccessFailedWith: _errorCode postHandleEvents System wantsBusyCursor ifTrue: [UI.Cursor wait showWhile: [System drainASendQueue]] ifFalse: [System drainASendQueue]. self onIdleApp onIdleApp <C: void OnIdleApp(void)> ^ self externalAccessFailedWith: _errorCode
  • 64. 64 Handling an event In Win32EventHandler handleEvent: anEventRecord self translateMessage: anEventRecord. self dispatchMessageA: anEventRecord In OStudioEventHandler handleEvent: anEventRecord (self preTranslateMessage: anEventRecord) = self FALSE ifTrue: [ self translateMessage: anEventRecord. self dispatchMessageA: anEventRecord]
  • 65. 65 User I nterrupts < ctrl> Y and < ctrl> < shift> Y work as in VisualWorks Implemented as Accelerator Keys < ctrl> Y interrupts the running process by sending self halt: in a callBack from C
  • 66. 66 Class Proxies Class Proxies work They are shared variables in Root.ObjectStudio.Global Loading puts class in Root.ObjectStudio
  • 68. 68 Perform ance I ssues In Classic ObjectStudio Smalltalk execution is slow Calling C primitives cost nothing In VisualWorks Smalltalk execution is fast Calling C is expensive In Classic ObjectStudio Performance critical methods are moved to C In ObjectStudio 8 Performance critical primitives are moved back to Smalltalk
  • 69. 69 VisualW orks .st file-in is slow Of 1000 seconds 900 are RB refresh Of 100 seconds 90 are repeatedly relinking the system Of 10 Seconds 9 are disk flush (Changes file) 1 second compiling At the end of the optimizations: Loading as alternative to file-in Loading a .st is similar speed as parcel loading Small .st/.cls files load faster than parcels Large parcel files load faster than .st/.cls files
  • 70. 70 New Concepts for ObjectStudio Source Code Management Store Versioning system Database based Smalltalk Archives File based One file per application Code purity Undeclared Code Critic Overrides
  • 71. 71 June 2005 Internal Alpha October 2005 Internal Alpha2 March 2006 Cincom internal testing April 2006 First Customer August 2006 First independent Service Partner May-September 2006 Solve incompatabilities, Refactoring, Performance issues October 2006 Next few customers December 2006 Preview
  • 73. 73 Porting Process Practice Look at base system modifications Like any other porting this is a source of many problems Known incompatibilities Immutability Declare Pool Dictionaries Export Modeling Tool definitions in ASCII Binary format is incompatible
  • 74. 74 Undeclareds In Classic ObjectStudio Each undeclared variable is always considered a global In VisualWorks and ObjectStudio 8 Each undeclared variable is considered undeclared GHUndeclaredBrowser Shows all Undeclareds and their references It uncovered some very old ObjectStudio problems due to typoes.
  • 77. 77 W hat can ESUG Audience learn? Integration of Smalltalk systems is possible Which systems deserve to be integrated? VW and Squeak Very common systems VSE VA Smalltalk-X Dolphin Ruby Java Frost GemStone