Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ooc - The Quest for the Holy Grail (OSDC.fr 2010)

ooc - The Quest for the Holy Grail (OSDC.fr 2010)

A talk I gave in Paris for OSDC.fr back in 2010. It covers some of the progress made on the ooc language one year in.

Amos Wenger

October 09, 2010
Tweet

More Decks by Amos Wenger

Other Decks in Programming

Transcript

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

    View full-size slide

  2. 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

    View full-size slide

  3. 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

    View full-size slide

  4. 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

    View full-size slide

  5. 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

    View full-size slide

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

    View full-size slide

  7. 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

    View full-size slide

  8. 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

    View full-size slide

  9. 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

    View full-size slide

  10. 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

    View full-size slide

  11. 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

    View full-size slide

  12. 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

    View full-size slide

  13. Sweet #2

    Before
    import structs/ArrayList
    import structs/HashMap
    import structs/Stack

    After
    import structs/[ArrayList, HashMap, Stack]
    ooc-lang.org
    III. Syntactic sweets

    View full-size slide

  14. 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

    View full-size slide

  15. 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

    View full-size slide

  16. Sweet #5

    Before
    f: func (key: String, value: UInt) {

    }
    map each(f)

    After
    list each(|key, value| …)
    ooc-lang.org
    III. Syntactic sweets

    View full-size slide

  17. 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

    View full-size slide

  18. 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

    View full-size slide

  19. 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

    View full-size slide

  20. 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

    View full-size slide

  21. 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

    View full-size slide

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

    View full-size slide

  23. 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

    View full-size slide

  24. 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

    View full-size slide

  25. 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

    View full-size slide

  26. 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

    View full-size slide

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

    View full-size slide

  28. 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

    View full-size slide

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

    View full-size slide

  30. 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

    View full-size slide

  31. inception-engine

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

    View full-size slide

  32. The legacy IV

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

    View full-size slide

  33. 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

    View full-size slide

  34. Thanks for listening!
    Web http://ooc-lang.org
    IRC #ooc-lang on Freenode
    Twitter @ooc_lang
    Mail [email protected]
    OSDC.fr 2010 ooc-lang.org Amos Wenger

    View full-size slide