AC# Primer - robburke.NET

advertisement
A C# Primer
Robert Burke
MLE
28 jan 03
Obligatory Strong Start
• “C# still on track to
become number 1
[programming language]
within 2 years time”
• Tremendous Momentum:
–
–
–
–
–
DirectX API
Compact devices
Next version of Office
Platform for XML
If you’ve used Visual
Studio…
What’s on tap today
Part I:
Language
Evolution
(C, C++, Java, C#)
Part II:
About C#
Pros and Cons
A closer look at
speed
Part III:
Proof by
Example
Ching and
collaboration
possibilities
Execution
Development
• In Summary: Why would you consider using C#
for your next project?
Disclaimer
• Haven’t traditionally been a huge Microsoft
fan
• But, when they’re right…
• So, if you can, put aside biases, religious
attachment to (or disdain for) an OS, etc.
Part I: Language Evolution
C
C++
Java
C#
Part I: Language Evolution: C
• Intimate with
hardware, therefore
very fast language
• Primarily used
primitive types for
working with data
• You handle all
memory allocation
and deallocation
#include <stdio.h>
void main(void)
{
printf("Hello world!");
}
Image: Kernigan, Ritchie et al, C Programming Language
Part I: Language Evolution: C++
• Superset of C
• Introduction of
objects and objectoriented
programming to C
• Inheritance, etc.
• A very powerful
language
– the power comes at a
cost of complexity
class Greeter {
public:
virtual void ExtendGreeting() = 0;
};
class EnglishGreeter : public Greeter {
public:
void ExtendGreeting() {
printf("Hello!");
}
};
class FrenchGreeter : public Greeter {
public:
void ExtendGreeting() {
printf("Bonjour!");
}
};
int _tmain(int argc, _TCHAR* argv[]) {
Greeter *myGreeter = new
FrenchGreeter();
myGreeter->ExtendGreeting();
delete myGreeter;
return 0;
}
Image: Stroustrup, The C++ Programming Language
Part I: Language Evolution: Java (1/3)
• Purely object-oriented
• Handles all memory
deallocation – “garbage
collection”
• (Geek alert)
“Elimination” of pointers
• Polished set of libraries
(API) available on all
platforms
public interface Greeter {
public void extendGreeting();
}
public class EnglishGreeter implements
Greeter {
public void extendGreeting() {
System.out.println("Hello!");
}
}
public class GraciousApplication {
public static void main(String[] args)
{
new
EnglishGreeter().extendGreeting();
}
}
Part I: Language Evolution: Java (2/3)
• Possible to interact with “native” C/C++
code.
• Very useful for:
– Integrating “legacy” code
– Speed: optimizing a critical bit of code
• But, difficult to debug, for example:
– Primitive type size can change between
platforms
– No common debugging environment
Part I: Language Evolution: Java (3/3)
• Garbage collection and crossplatform made possible by the
Java Virtual Machine (JVM)
– Compiles to interpreted
bytecode instead of machine
instructions
• Multiple benefits:
Your Java app
Java API
• Cross-platform
• Garbage collection
• Downsides:
• Abstraction between you and
hardware, therefore less deep
control
• A little slower, but “Just-InTime” (JIT) compiling helps
JVM (Virtual Machine)
Operating System
Part II: About C#
Part II: Enter C#
• A hybrid language
incorporating features
from C++ and Java (and
Smalltalk, and…)
Your C# app .NET Framework
• Looks a lot like Java, with
Class Libraries
keywords from C/C++
• Object oriented
CLR (Common
• Has a virtual machine,
Language Runtime)
and garbage collection,
among other Java
Operating System
parallels
Hold up… What’s all this .NET
malarky?
• The .NET framework in context.NET for the
common man.NET
Comparative Language Studies
C
C++
Java
C#
Object-Oriented No
Yes,
Yes,
partially fully
Yes,
fully
Compiled?
Yes
Yes
If JIT
Yes, JIT
Virtual Machine
with garbage
collection?
No
No
JVM
CLR
Does
programmer
handle dealloc.,
pointers?
Yes
Yes
No
In ‘Unmanaged’
Code
C# Pros and Cons
• Biggest Cons
– Compared to C++: Simpler programming model
comes at cost of some geek-power
– Compared to Java: Currently, no CLR implementation
for Mac
• (but, a word on cross-platform: “Mono,” for Linux, in the pipe)
• Biggest Pros
– Compared to Java: Execution Speed
• Java JVM code is designed to be interpreted
• C# CLR code is always compiled
(despite common misconception)
– Compared to C, C++, Java: Development Speed
The Need for Execution Speed
• “98% of the speed, for 50% of the code”
– That’s the Managed (C#) DirectX 9.0 stat
• Well, Dolphin demo:
565 lines C#
/ 738 lines C++ = 76% of the code, but who’s counting.
– DEMO:
• Dolphin 37 fps C++, 36 fps C#
• PointSprites 37 fps C++, 37 fps C#
• Something hard to quantify - the smooth, smooth
lovin’ of the CLR’s garbage collector.
– StillLife’s 1600 particles/s, smooth, is unthinkable
using existing Java JVM implementations
Development Speed
(because our time is worth it)™
• C# language design theme: making the intent explicit
in situations which can easily lead to subtle bugs.
– (geek alert) e.g. ‘Versioning’ keywords (override, new, virtual)
• Language features not available to Java
– Delegates
– Properties
– Type system
• Rich capacity for interop with native code…
3 different methods:
– 1. "unsafe" (unverifiable) code blocks provide access to pointers
– 2. “Platform invoke" - access other DLLs (Java's only option)
– 3. COM interop - tap into old COM stuff
Development Environment:
Language doesn’t exist in a vacuum!
• The .NET Framework
Class Library
• New set of very polished
libraries
• Accessible from C++, C#,
Visual Basic.NET
• C#’s objects and
interfaces perfectly
tailored
• Common development
environment hand-holds
you
• Comments
• step into native code. etc.
(DEMO)
Deployment
• And, importantly, the deployment method:
– You make .EXEs and .DLLs.
• What does someone else need to run a
C# .exe?
– Just the free .NET Framework
Part III: Proof by Example
Or, how to demo development
speed, and where we might go
from here.
How to demo Development Speed?
•
Ching (Dec 2001 - present)
– libraries for signal processing, as
well as serial port communication,
audio, video...
– the foundation of all the projects
I've built this year
•
Sponge (Half a week)
– uses UDP to poll for computers on
the LAN, considers their
processor speed and available
processing power, and distributes
signal processing tasks between
them. has the capacity to deploy
signal processors to the other
machines first
•
Still Life (<6 days)
– built on an early version of Ching.
Particle system, video input, video
processing effects all in C#, using
OpenGL
How to demo interoperability,
powerful libraries, collaboration?
•
Contributions to Breathing Space
– Great demo of interop with
existing software in C++.
– Daragh has built and worked with
an extensive amount of graphics
code in C++. Used remote signal
processing. He just calls a DLL’s
get function
•
Heartheard (crappy working title)
(2 days)
– Exposed DirectSound3D and
made an application with 3D audio
and effects, which maps heart rate
and breathing to audio.
•
Eva's Anthropos robot
– Uses vision tracking modified from
Still Life, using Signal Processing
Network from Ching (which leads
nicely to...)
Collaboration?
• If there is interest, I
would manage the
source tree more
carefully
• Could it lead to more
complex projects?
• 90% of the codebase
compiled for the
CompactFramework
… how about that?
Summary: Why would you use C#
for your next project?
• In a word: productivity
– Just as Java learned from C++…
– Nominal speed hit, tremendous productivity
boost
– Possibility of making use of existing Ching
and MiniChing libraries
Some props, and where to go next
• Thanks
–
–
–
–
Eric Gunnerson and the GotDotNet team
MindGames, for letting me get away with this
Eva for being the world’s most patient guinea pig
You, for expressing interest…
• Places to learn more
–
–
–
–
–
Jesse Liberty’s Programming C#, O’Reilly
http://www.gotdotnet.com (semi-official site)
http://www.csharphelp.com (community site)
news://microsoft.public.dotnet.languages.csharp
The third floor
• Thoughts?
Download