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

Tower of Babel: A tour of programming languages

Tower of Babel: A tour of programming languages

A tour of 7 programming languages: Ruby, JS, CoffeeScript, Objective-C, Go, Clojure and Scala.

Matt Aimonetti

September 28, 2012
Tweet

More Decks by Matt Aimonetti

Other Decks in Programming

Transcript

  1. Sapir-Whorf Hypothesis linguistic differences have consequences on human cognition and

    behavior The principle of linguistic relativity holds that the structure of a language affects the ways in which its speakers conceptualize their world, i.e. their world view, or otherwise influences their cognitive processes. Sunday, October 21, 12
  2. interpreted compiled dynamically typed statically typed object oriented functional difficulty

    JavaScript X X X* X easy Ruby/Python X X X X normal CoffeeScript X X X X normal Objective-C X X X X * nightmare Java X X X hard Go X * structural X X* X normal Clojure X X (hints) * X normal/ nightmare/ hell Scala X * structural X inferred X X normal/ nightmare Sunday, October 21, 12
  3. class Presentation attr_accessor :name, :topic def initialize(name, topic) self.name =

    name self.topic = topic end def start puts "Hi, my name is #{name} \ and I will talk about #{topic}." end end talk = Presentation.new("Matt", "Ruby") talk.start Sunday, October 21, 12
  4. class Post < ActiveRecord::Base attr_accessible :content, :name, :title validates :name,

    :presence => true validates :title, :presence => true, :length => { :minimum => 5 } end Sunday, October 21, 12
  5. class PostsController < ApplicationController def index @posts = Post.all respond_to

    do |format| format.html # FYI, render index.html.erb format.json { render :json => @posts } end end end Sunday, October 21, 12
  6. Ruby what I dislike Often abused Overly complex specs Hard

    to follow/debug Not designed for parallelism Can’t be easily optimized Design choices that are hard to revert Sunday, October 21, 12
  7. Ruby what I like Expressive Malleable Human oriented Business efficient

    Everything is an object Functional language Great “go to” language Influenced other languages Great for DSL Sunday, October 21, 12
  8. var Presentation = function(name, topic) { this.name = name; this.topic

    = topic; }; Presentation.prototype.start = function(){ return "Hi, my name is " + this.name + " and I will talk about " + this.topic + "." }; var talk = new Presentation('Matt', 'JS'); talk.start(); Sunday, October 21, 12
  9. class Presentation constructor: (@name, @topic) -> start: () -> return

    "Hi, my name is " + this.name + " and I will talk about " + this.topic + "." talk = new Presentation("Matt", "CoffeeScript") talk.start() Sunday, October 21, 12
  10. what I dislike debugging space delimited o_O effect too many

    ways to do a simple thing compilation phase still requires to know JS not for everyone Sunday, October 21, 12
  11. what I like Nicer syntax Tries to fix the scoping

    issues Easier to read (sometimes) More expressive Sunday, October 21, 12
  12. #import <Foundation/Foundation.h> @interface Presentation : NSObject @property (strong, nonatomic) NSString

    *name; @property (strong, nonatomic) NSString *topic; - (Presentation*) initWithNameAndTopic:(NSString*)name topic:(NSString*)topic; - (NSString*) start; @end presentation.h Sunday, October 21, 12
  13. #import "Presentation.h" @implementation Presentation - (Presentation*)initWithNameAndTopic:(NSString *)name topic:(NSString *)topic {

    self = [super init]; if (self) { self.name = name; self.topic = topic; } return self; } - (NSString*)start{ return [NSString stringWithFormat:@"This is %@, \ and I will talk about %@.", self.name, self.topic]; } @end presentation.m Sunday, October 21, 12
  14. what I dislike Header/Implementation Feels very 80s (with a new

    carpet) Annoying syntax Apple centric Sunday, October 21, 12
  15. what I like Object Oriented C Weakly typed New literals

    Blocks Good tooling Performant Designed with Cocoa in mind Cocoa Sunday, October 21, 12
  16. package demo import "fmt" type Presentation struct { " Name,

    Topic string } func (p *Presentation) start() string { " return "This is " + p.Name + ", and I will talk about " + p.Topic + "." } func main() { " talk := &Presentation{Name: "Matt", Topic: "Go"} " fmt.Println(talk.start()) } Sunday, October 21, 12
  17. package main import ( " "fmt" " "net/http" " "time"

    ) var urls = []string{ " "http://pulsoconf.co/", " "http://golang.org/", " "http://matt.aimonetti.net/", } type HttpResponse struct { " url string " response *http.Response " err error } Sunday, October 21, 12
  18. func asyncHttpGets(urls []string) []*HttpResponse { " ch := make(chan *HttpResponse,

    len(urls)) // buffered " responses := []*HttpResponse{} " for _, url := range urls { " " go func(url string) { " " " fmt.Printf("Fetching %s \n", url) " " " resp, err := http.Get(url) " " " ch <- &HttpResponse{url, resp, err} " " }(url) " } " for { " " select { " " case r := <-ch: " " " fmt.Printf("%s was fetched\n", r.url) " " " responses = append(responses, r) " " " if len(responses) == len(urls) { " " " " return responses " " " } " " default: " " " fmt.Printf(".") " " " time.Sleep(5e7) " " } " } " return responses } Sunday, October 21, 12
  19. func main() { " results := asyncHttpGets(urls) " for _,

    result := range results { " " fmt.Printf("%s status: %s\n", result.url, result.response.Status) " } } Sunday, October 21, 12
  20. $ go build concurrency_example.go && ./a.out .Fetching http://pulsoconf.co/ Fetching http://golang.org/

    Fetching http://matt.aimonetti.net/ .....http://golang.org/ was fetched .......http://pulsoconf.co/ was fetched .http://matt.aimonetti.net/ was fetched http://golang.org/ status: 200 OK http://pulsoconf.co/ status: 200 OK http://matt.aimonetti.net/ status: 200 OK Sunday, October 21, 12
  21. what I dislike A bit too low level for some

    Not so great GC Limited adoption Odd conventions at times Sunday, October 21, 12
  22. what I like simple specs modern std libs concurrency (goroutines/channels)

    sensible conventions fast compilation flexible code organization simpler take on OO features of FP error handling documentation source as documentation Sunday, October 21, 12
  23. (defprotocol Talk "A conference talk" (start [p] "return the speaker

    and topic.")) (defrecord Presentation [name topic] Talk; implement the Talk protocol (start [_] (str "Hi, this is " name " and I will talk about " topic "."))) (def talk (Presentation. "Matt" "Clojure")) (start talk) Sunday, October 21, 12
  24. (ns example.word-count (:use clojure.contrib.io clojure.contrib.seq-utils)) (defn parse-line [line] (let [tokens

    (.split (.toLowerCase line) " ")] (map #(vector % 1) tokens))) (defn combine [mapped] (->> (apply concat mapped) (group-by first) (map (fn [[k v]] {k (map second v)})) (apply merge-with conj))) (defn sum [[k v]] {k (apply + v)}) (defn reduce-parsed-lines [collected-values] (apply merge (map sum collected-values))) (defn word-frequency [filename] (->> (read-lines filename) (map parse-line) (combine) (reduce-parsed-lines))) Sunday, October 21, 12
  25. what I dislike not so simple not always consistent need

    to know a lot of functions/macros not really web focused brain stack overflow hard mental context switch meaningless error stacks Sunday, October 21, 12
  26. what I like really great for data processing isolate problems

    efficiently fast java interop Sunday, October 21, 12
  27. class Presentation(val name: String, val topic: String) { val start

    = "My name is "+ name + " and I will talk about " + topic +"." } val talk = new Presentation("Matt", "Scala") talk.start Sunday, October 21, 12
  28. val authenticatedUser: Future[User] = User.authenticate(email, password) val lookupTweets: Future[Seq[Tweet]] =

    authenticatedUser flatMap { user => Tweet.findAllByUser(user) } Sunday, October 21, 12
  29. val service = new Service[HttpRequest, HttpResponse] { def apply(request: HttpRequest)

    = Future(new DefaultHttpResponse(HTTP_1_1, OK)) } val address = new InetSocketAddress(10000) val server: Server[HttpRequest, HttpResponse] = ServerBuilder() .name("MyWebServer") .codec(Http()) .bindTo(address) .build(service) Sunday, October 21, 12
  30. what I dislike huge surface stiff learning curve abused o_O

    syntax poor documentation feels like it’s trying to do everything JVM Sunday, October 21, 12
  31. what I like Close to Ruby/Python Easy to get started

    Inferred types Flexible functional approach Modern concerns (parallelism) Pattern matching Relatively rich ecosystem JVM/CLR Sunday, October 21, 12
  32. where to get started Twitter’s Scala school A Tour of

    scala Coursera’s online class Sunday, October 21, 12