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. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. ooc in a coconut shell • Generics ➔ identity: func

    <T> (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
  10. 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
  11. Sweet #2 • Before import structs/ArrayList import structs/HashMap import structs/Stack

    • After import structs/[ArrayList, HashMap, Stack] ooc-lang.org III. Syntactic sweets
  12. 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
  13. 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
  14. Sweet #5 • Before f: func (key: String, value: UInt)

    { … } map each(f) • After list each(|key, value| …) ooc-lang.org III. Syntactic sweets
  15. 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
  16. 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
  17. 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<This> new() ➔ new: static func -> This { pool acquire() } ➔ destroy: func { pool release(this) } ➔ v := Vector3 new() // sha-zam. ooc-lang.org III. Syntactic sweets
  18. 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
  19. 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
  20. The plan ooc-lang.org IV. Rocking out Parsing Resolving Error reporting

    C backend Generating C C compilation Other backends
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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