Slide 1

Slide 1 text

ooc The Quest for the Holy Grail OSDC.fr 2010 ooc-lang.org Amos Wenger

Slide 2

Slide 2 text

Roadmap I. The origins II. The best of both worlds III. Syntactic sweets IV. Rocking out V. The legacy VI. Agora OSDC.fr 2010 ooc-lang.org Amos Wenger

Slide 3

Slide 3 text

The Original Sin ● After years of self-teaching ➔ The Games Factory/MultiMedia Fusion ➔ C++/OpenGL/SDL ➔ Java/Xith3D/JOODE ● Back to the real world ➔ A C school project ➔ Deadline: 6 months ➔ No object-orientation in sight ooc-lang.org I. The origins

Slide 4

Slide 4 text

The fool who challenged the gods ● A dead-end idea ➔ Java-derived syntax ➔ No structure ➔ ...instead of working on the actual project ● MOD (Miracle-Oriented Development) ➔ Naive « translator » ➔ No error checking ➔ Bug-ridden ooc-lang.org I. The origins

Slide 5

Slide 5 text

The first-born ● ooc 0.1 ➔ Written in Java, 11K SLOC ➔ Generates C code ➔ Handed in along with the real project ➔ « Real » project developed in a few days ➔ Success! « Version 1.0 sucks, but ship it anyway » Jeff Atwood (CodingHorror) ooc-lang.org I. The origins

Slide 6

Slide 6 text

A curious alchemy ooc-lang.org I. The origins

Slide 7

Slide 7 text

The test of time ● 4 rewrites later ➔ Syntax evolved ➔ Still written in Java ➔ Type inference ➔ Generics (horribly implemented) ● Meanwhile, on #ooc-lang/Freenode ➔ A self-hosting effort is started ooc-lang.org I. The origins

Slide 8

Slide 8 text

A dream come true ● In just a few weeks ➔ rock = ooc port of the j/ooc compiler ➔ first real community effort ➔ serious cleanups ● A few more weeks, and ➔ rock compiled itself! ➔ again... ➔ and again... ➔ (with a spoon) ooc-lang.org I. The origins

Slide 9

Slide 9 text

C vs Java ● Low-level ● « Simple » ● « Lightweight » ● Fuckload of libraries ● « Object-oriented » ● « Safe » ● « Modular » ● Garbage-collected Can't we have both? ooc-lang.org II. The best of both worlds

Slide 10

Slide 10 text

ooc in a nutshell ● Modularity ➔ import = Modules ➔ use = Libraries ● Types ➔ cover = base types from C ➔ class = simple inheritance, interface, enum ● Functions ➔ name: func (…) -> Type { … } ➔ first-class, overload, defaults, varargs ooc-lang.org II. The best of both worlds

Slide 11

Slide 11 text

ooc in a coconut shell ● Generics ➔ identity: func (t: T) T { t } → ● try, catch = Exceptions ➔ Exception new("You dun goofed!") println() ● version = Platform-specific blocks ➔ version(trial) { Time sleepSec(5) } ● operator = Operator overload ➔ operator + (a, b: Int) { a - b } // huhu. ooc-lang.org II. The best of both worlds

Slide 12

Slide 12 text

Sweet #1 ● Before Person: class { firstname, lastname: String init: func (firstname, lastname: String) { this firstname = firstname this lastname = lastname } } ● After init: func (=firstname, =lastname) {} ooc-lang.org III. Syntactic sweets

Slide 13

Slide 13 text

Sweet #2 ● Before import structs/ArrayList import structs/HashMap import structs/Stack ● After import structs/[ArrayList, HashMap, Stack] ooc-lang.org III. Syntactic sweets

Slide 14

Slide 14 text

Sweet #3 ● Before set := Set new() set add(a) set add(b) set add(c) ● After set := Set new(). add(a). add(b). add(c) ooc-lang.org III. Syntactic sweets

Slide 15

Slide 15 text

Sweet #4 ● Before if(o instanceOf?(LeftBound)) { e as LeftBound left } else if(i instanceOf?(RightBound)) { e as RightBound right } ● After match o { case lb: LeftBound => lf left case rb: RightBound => rb right } ooc-lang.org III. Syntactic sweets

Slide 16

Slide 16 text

Sweet #5 ● Before f: func (key: String, value: UInt) { … } map each(f) ● After list each(|key, value| …) ooc-lang.org III. Syntactic sweets

Slide 17

Slide 17 text

covers ● Most C apis are OO ➔ include someaudiolib ➔ SomeType: cover from some_sound { ... } ➔ new: static extern(some_sound_load) func ➔ play: extern(some_sound_play) func ● We're only revealing their true nature ➔ Sound new("ka-ching.ogg") play() ooc-lang.org III. Syntactic sweets

Slide 18

Slide 18 text

compound covers ● C structs on steroids ➔ Point: cover { x, y, z: Float } ● Stack vs Heap allocation ➔ p := (3.0, 6.0, 7.0) as Point ➔ init: func@ (=x, =y, =z) {} ● By-value semantics ● Per-method by-ref semantics with func@ ➔ norm: func -> Float { Math sqrt(x*x + y*y + z*z) } ➔ set: func@ (=x, =y, =z) {} ooc-lang.org III. Syntactic sweets

Slide 19

Slide 19 text

apropos allocation ● So far, every object is heap-allocated ➔ Boehm GC - conservative & fast (si si.) ➔ -gc=off ● But since new is a method like any other... ➔ pool := static Pool new() ➔ new: static func -> This { pool acquire() } ➔ destroy: func { pool release(this) } ➔ v := Vector3 new() // sha-zam. ooc-lang.org III. Syntactic sweets

Slide 20

Slide 20 text

extend ● User-side addition of methods to any type extend SSizeT { times: func (f: Func(SSizeT)) { f(this) (this - 1) times(f) } } 3 times(|| knock()) ooc-lang.org III. Syntactic sweets

Slide 21

Slide 21 text

rock ➔ ooc compiler in ooc ➔ 22K SLOC ➔ 132 modules ➔ 1900 commits – Amos Wenger – Friedrich Weber – Rofl0r – Yannic Ahrens – Joshua Rösslein – Scott Olson – Michael Tremel – Anthony Roja Buck – Noel Cower – Mark Fayngersh – Peter Lichard – Patrice Ferlet – Nick Markwell – Daniel Danopia – Michael Kedzierski – Tim Howard – Mickael9 – Viraptor – ... ooc-lang.org IV. Rocking out

Slide 22

Slide 22 text

The plan ooc-lang.org IV. Rocking out Parsing Resolving Error reporting C backend Generating C C compilation Other backends

Slide 23

Slide 23 text

Drivers ● combine ➔ All at the same time ➔ Legacy ● sequence (default) ➔ One by one, lib cache ➔ Partial recompilation ● make ➔ Generates a Makefile with the C code ➔ Ideal for distribution ooc-lang.org IV. Rocking out

Slide 24

Slide 24 text

Dependencies ● import text/json/Parser ➔ Not transitive (unlike include) ➔ Cyclic deps are handled ● use antigravity, sdl ➔ Name, Description, Version, Requirements ➔ Includes, Linker and compiler flags – pkg-config ➔ SourcePath, Imports ● Bye-bye auto-tools! ooc-lang.org IV. Rocking out

Slide 25

Slide 25 text

The SDK ● Mainline SDK ➔ is comfortable (net, text, structs, io, math, os...) ➔ ...but a bit large for some ● There's no such thing as « The SDK » ➔ -sdk=, $OOC_SDK ➔ Bare minimum – Object – Class – a few base types ooc-lang.org IV. Rocking out

Slide 26

Slide 26 text

The legacy ● oos ooc operating system, runs on x86 real hw, custom sdk, bits of asm but 0% C ● ooc-ti sdk for tigcc, compiles+runs stuff on TI89! ● pyooc use ooc code from python, json backend zero-configuration ● ruby-inline-ooc load+evaluate ruby code inside ooc ooc-lang.org V. The legacy

Slide 27

Slide 27 text

ooc-ti ooc-lang.org V. The legacy

Slide 28

Slide 28 text

The legacy II ● reincarnate package manager, in ooc, for ooc. deps based on usefiles, python server backend (nirvana) ● stako a stack-based language inspired by factor ● langsniff analyzes a text and find which language it's in ● yajit simple just-in-time assembler - used in rock for flattening closures ooc-lang.org V. The legacy

Slide 29

Slide 29 text

teeworlds-ai ooc-lang.org V. The legacy

Slide 30

Slide 30 text

The legacy III ● spry IRC bot framework in ooc ● proof small testing framework for ooc ● ooc-web ooc web applicaton framework ● mustang templating engine based on the infamous mustache ooc-lang.org V. The legacy

Slide 31

Slide 31 text

inception-engine ● game engine, OpenGL+SDL, ingame console ooc-lang.org V. The legacy

Slide 32

Slide 32 text

The legacy IV http://github.com/languages/ooc ooc-lang.org V. The legacy

Slide 33

Slide 33 text

Questions ➔ Languages – What about Go/Vala? – What about Scala/Clojure? – What about C++? – What about C#? ➔ Development – Can I contribute? – Do you want money? – What's next for rock? – Where else can I help? ➔ Performance – Is it fast? ➔ Bindings – Does lib X have bindings yet? – Isn't it tedious to do bindings? ➔ Interoperability – Let's do rbooc! – Let's do Perl::ooc! – Let's do Y! ooc-lang.org VI. Agora

Slide 34

Slide 34 text

Thanks for listening! Web http://ooc-lang.org IRC #ooc-lang on Freenode Twitter @ooc_lang Mail ndd@rylliog.cz OSDC.fr 2010 ooc-lang.org Amos Wenger