From OCaml to Javascript
      at Skydeck
   jake.donham@skydeck.com
What is Skydeck?

  o   a tool for managing your mobile phone

  o   reads your mobile phone call log

  o   presents it b...
Where does the data come from?

  o   from your phone carrier's web site
         you give Skydeck your credentials
     ...
Where does OCaml come into this?

  o   most of our system is written in OCaml
        bill parsing, web servers, etc.

 ...
OCamljs

 o   we wrote OCamljs
       Javascript back-end for OCaml compiler

 o   wrote our Mozilla app in OCaml

 o   w...
Really?

match referer with
  | None -> r#send body
  | Some re ->
  (* see http://developer.mozilla.org/en/docs/Setting_H...
Benefits of OCaml for downloader

  o   types types types

  o   can give types to the complicated Mozilla API

  o   cont...
How does OCamljs work?

  o   ocamlc compiles to "lambda" intermediate language

  o   ocamljs translates lambda to Javasc...
Example

OCaml:
 module Test =
 struct
   type foo = Bar of int | Baz of bool | Quux

   let   f = function
     |   Bar i...
module Test =
                       struct
Example                  type foo = Bar of int | Baz of bool | Quux

         ...
(setglobal Test!
                               (let

 Example                         (f/65
                             ...
Gory details

  o   partial application / overapplication

  o   tail recursion via trampolines

  o   heap representation...
Interfacing with Javascript

  o   with "external" like with C
        naming convention for methods, accessors
        ...
Work in progress

  o   orpc for Javascript
        orpc generates RPC code from OCaml signatures
           works with ...
Future work / dreams

  o   finish object support
         write Javascript objects in OCaml

  o   use jslib to support ...
Using OCaml at a startup

  o   a good idea!

  o   better tools let you work faster

  o   static checking keeps you on c...
Thanks!

  o   Skydeck is hiring
        http://skydeck.com/jobs

  o   http://code.google.com/p/ocamljs
  o   http://cod...
Upcoming SlideShare
Loading in...5
×

From OCaml To Javascript At Skydeck

2,220

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,220
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

From OCaml To Javascript At Skydeck

  1. 1. From OCaml to Javascript at Skydeck jake.donham@skydeck.com
  2. 2. What is Skydeck? o a tool for managing your mobile phone o reads your mobile phone call log o presents it back to you in a useful way  attach people to phone numbers  view calls by person  when did I last call Steve?  who did I call yesterday?  etc.
  3. 3. Where does the data come from? o from your phone carrier's web site  you give Skydeck your credentials  we download bills and usage from carrier site  with a Firefox extension  with a standalone XULrunner app  from our servers (a farm of XULrunners) o via our web API  3rd party can add new data sources
  4. 4. Where does OCaml come into this? o most of our system is written in OCaml  bill parsing, web servers, etc. o but the web is Javascript  Mozilla apps are Javascript  Javascript is not my favorite programming language  too forgiving  heavy syntax for functional code o sad programmers
  5. 5. OCamljs o we wrote OCamljs  Javascript back-end for OCaml compiler o wrote our Mozilla app in OCaml o we are happy
  6. 6. Really? match referer with | None -> r#send body | Some re -> (* see http://developer.mozilla.org/en/docs/Setting_HTTP_req ... let os = XPCOM.getService_observer_service () in let observe (s : #XPCOM.supports) _ _ = let hc = s#_QueryInterface XPCOM.httpChannel in if hc == r#_get_channel#_QueryInterface XPCOM.httpChannel then hc#setRequestHeader "Referer" re false in let observer = Ocamljs.obj [ "observe", Ocamljs.jsfun3 observe ] in os#addObserver observer "http-on-modify-request" false; r#send body; os#removeObserver observer "http-on-modify-request";
  7. 7. Benefits of OCaml for downloader o types types types o can give types to the complicated Mozilla API o continuation passing style enforced by types o transparent RPC to server o tool support (Camlp4, ocamlbuild)
  8. 8. How does OCamljs work? o ocamlc compiles to "lambda" intermediate language o ocamljs translates lambda to Javascript o almost everything in the front-end comes for free  type checking  module system  Camlp4 o objects not free  we want OCaml objects = JS objects
  9. 9. Example OCaml: module Test = struct type foo = Bar of int | Baz of bool | Quux let f = function | Bar i -> "Bar " ^ string_of_int i | Baz b -> "Baz " ^ (if b then "true" else "false") | Quux -> "Quux" end
  10. 10. module Test = struct Example type foo = Bar of int | Baz of bool | Quux let f = function | Bar i -> "Bar " ^ string_of_int i | Baz b -> "Baz " ^ (if b then "true" else "false") | Quux -> "Quux" end Lambda: (setglobal Test! (let (f/65 (function param/73 (switch* param/73 case int 0: "Quux" case tag 0: (apply (field 15 (global Pervasives!)) "Bar " (apply (field 19 (global Pervasives!)) (field 0 param/73))) case tag 1: (apply (field 15 (global Pervasives!)) "Baz " (if (field 0 param/73) "true" "false"))))) (makeblock 0 f/65)))
  11. 11. (setglobal Test! (let Example (f/65 (function param/73 (switch* param/73 case int 0: "Quux" case tag 0: (apply (field 15 (global Pervasives!)) "Bar " (apply (field 19 (global Pervasives!)) (field 0 param/73))) case tag 1: Javascript: (apply (field 15 (global Pervasives!)) "Baz " (if (field 0 param/73) "true" "false"))))) (makeblock 0 f/65))) var oc$Test$ = function () { var f$65 = _f(function (param$73) { if (typeof param$73 == "number") switch (param$73) { case 0: return "Quux"; default: return ... else switch ($t(param$73)) { case 0: return __(oc$Pervasives$[15], ["Bar ", _(oc$Pervasives$[19], [param$73[0]])]); case 1: return __(oc$Pervasives$[15], ["Baz ", param$73[0] ? "true" : "false"]); default: return null;} }); return $(f$65); }();
  12. 12. Gory details o partial application / overapplication o tail recursion via trampolines o heap representation  block -> array + tag  int (nativeint, int32), float, char -> number  bool -> number, bool  since JS comparison ops return bool  string -> string, number array  support mutable strings
  13. 13. Interfacing with Javascript o with "external" like with C  naming convention for methods, accessors  special externals for raw Javascript o with object type  naming convention for accessors o OCamljs included libraries:  some Mozilla API  some built-in Javascript  OCaml stdlib
  14. 14. Work in progress o orpc for Javascript  orpc generates RPC code from OCaml signatures  works with Ocamlnet  Javascript backend passes heap rep  on client, just eval it  on server, must check that it's valid for type o jslib  Camlp4 parser, pretty-printer, quotations for JS
  15. 15. Future work / dreams o finish object support  write Javascript objects in OCaml o use jslib to support inline Javascript in OCaml code o improve performance o web programming  like Google Web Toolkit
  16. 16. Using OCaml at a startup o a good idea! o better tools let you work faster o static checking keeps you on course o you get a clean slate o you need to hire great people  OCaml is fun!
  17. 17. Thanks! o Skydeck is hiring  http://skydeck.com/jobs o http://code.google.com/p/ocamljs o http://code.google.com/p/orpc2
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×