the adventurous developers guide to jvm languages

59
THE ADVENTUROUS DEVELOPERS GUIDE TO JVM LANGUAGES SIMON MAPLE @SJMAPLE Monday, 30 September 13

Upload: simon-maple

Post on 10-May-2015

1.804 views

Category:

Technology


0 download

DESCRIPTION

There are more than 50 actively worked JVM languages in existence today. Some have been ported to the JVM, whereas others were written specifically for the JVM. This hands-on session takes an introductory (but non-Hello, World) look at several JVM languages, including Java 8, Scala, Groovy, Kotlin, Ceylon, Xtend, and Clojure. It covers ZeroTurnaround’s initial experiences, including what rocked and sucked in learning each one. You don’t need any prior knowledge of these languages to attend the session. You will learn whether they are for you and will hear about some real-life experiences of trying these languages for the first time.

TRANSCRIPT

Page 1: The Adventurous Developers Guide to JVM Languages

THE ADVENTUROUS DEVELOPERS GUIDE TO JVM LANGUAGES

SIMON MAPLE @SJMAPLE

Monday, 30 September 13

Page 2: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 3: The Adventurous Developers Guide to JVM Languages

YOUR SPEAKER

SIMON MAPLE @SJMAPLE

Monday, 30 September 13

Page 4: The Adventurous Developers Guide to JVM Languages

MY AUDIENCE

0

25

50

75

100

Heard of the Language Used the languageJava Scala Groovy Clojure Ceylon Kotlin Xtend

Monday, 30 September 13

Page 5: The Adventurous Developers Guide to JVM Languages

JAVA

“Most people talk about Java the language, and this may sound odd coming from me, but I could hardly care less. At the core of the Java ecosystem is the JVM.”

James Gosling,creator of the Java programming language (2011, TheServerSide)

Monday, 30 September 13

Page 6: The Adventurous Developers Guide to JVM Languages

JAVA THE JVM

“Most people talk about Java the language, and this may sound odd coming from me, but I could hardly care less. At the core of the Java ecosystem is the JVM.”

James Gosling,creator of the Java programming language (2011, TheServerSide)

Monday, 30 September 13

Page 7: The Adventurous Developers Guide to JVM Languages

LANGUAGES BUILT FOR THE JVM

Monday, 30 September 13

Page 8: The Adventurous Developers Guide to JVM Languages

LANGUAGES PORTED TO THE JVM

Monday, 30 September 13

Page 9: The Adventurous Developers Guide to JVM Languages

R.I.P ?

Monday, 30 September 13

Page 10: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 11: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 12: The Adventurous Developers Guide to JVM Languages

JAVA 8

1. DON’T BREAK BINARY COMPATIBILITY

2. AVOID INTRODUCING SOURCE INCOMPATIBILITIES

3. MANAGE BEHAVIORAL COMPATIBILITY CHANGES

Monday, 30 September 13

Page 13: The Adventurous Developers Guide to JVM Languages

LET’S EXPERIMENT

Monday, 30 September 13

Page 14: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 15: The Adventurous Developers Guide to JVM Languages

COMPANION CLASS

THERE IS NO STATIC

import HttpServer._ // import statics from companion object

Monday, 30 September 13

Page 16: The Adventurous Developers Guide to JVM Languages

VARIABLES

THERE IS NO FINAL

val name: Type = initializer // immutable value

var name: Type = initializer // mutable variable

Monday, 30 September 13

Page 17: The Adventurous Developers Guide to JVM Languages

CASE CLASScase class Status(code: Int, text: String)

case method @ ("GET" | "HEAD") => ... case method => respondWithHtml( Status(501, "Not Implemented"), title = "501 Not Implemented", ) body = <H2>501 Not Implemented: { method } method</H2> ...

Monday, 30 September 13

Page 18: The Adventurous Developers Guide to JVM Languages

STRINGS

val header = s""" |HTTP/1.1 ${status.code} ${status.text} |Server: Scala HTTP Server 1.0 |Date: ${new Date()} |Content-type: ${contentType} |Content-length: ${content.length} """.trim.stripMargin + LineSep + LineSep

Monday, 30 September 13

Page 19: The Adventurous Developers Guide to JVM Languages

NULL

def toFile(file: File, isRetry: Boolean = false): Option[File] = if (file.isDirectory && !isRetry) toFile(new File(file, DefaultFile), true)

else if (file.isFile)Some(file)

else None

Monday, 30 September 13

Page 20: The Adventurous Developers Guide to JVM Languages

COMPLEXITY

Monday, 30 September 13

Page 21: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 22: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 23: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 24: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 25: The Adventurous Developers Guide to JVM Languages

JAVA SUPERCHARGED!

Monday, 30 September 13

Page 26: The Adventurous Developers Guide to JVM Languages

NULL

def streetName = user?.address?.street

Monday, 30 September 13

Page 27: The Adventurous Developers Guide to JVM Languages

ELVIS LIVES

def displayName = user.name ?: "Anonymous"

Monday, 30 September 13

Page 28: The Adventurous Developers Guide to JVM Languages

CLOSURES

square = { it * it }

[ 1, 2, 3, 4 ].collect(square) // [1, 4, 9, 16]

Monday, 30 September 13

Page 29: The Adventurous Developers Guide to JVM Languages

COLLECTIONS

def names = ["Ted", "Fred", "Jed", "Ned"]

5p[5 println names //[Ted, Fred, Jed, Ned]

def shortNames = names.findAll { it.size() <= 3 }

shortNames.each { println it } // Ted // Jed // Ned

Monday, 30 September 13

Page 30: The Adventurous Developers Guide to JVM Languages

GROOVY 2.0 - DYNATIC

void someMethod() {}

void test() {

sommeeMethod()}

Monday, 30 September 13

Page 31: The Adventurous Developers Guide to JVM Languages

GROOVY 2.0 - DYNATIC

void someMethod() {}

void test() {

sommeeMethod()}

import groovy.transform.TypeChecked

@TypeChecked

Monday, 30 September 13

Page 32: The Adventurous Developers Guide to JVM Languages

GROOVY 2.0 - DYNATIC

void someMethod() {}

void test() {

sommeeMethod()}

// compilation error: // cannot find matching method sommeeMethod()

import groovy.transform.TypeChecked

@TypeChecked

Monday, 30 September 13

Page 33: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 34: The Adventurous Developers Guide to JVM Languages

Founder/CEO Jevgeni “Hosselhuff” Kabanov gets ready to save more Java developers from redeploy madness with JRebel

YEH, WE SAVE LIVES

Monday, 30 September 13

Page 35: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 36: The Adventurous Developers Guide to JVM Languages

REPL

<Python user> Can you believe these JVM geeks think this is impressive?<Perl user> Tell me about it! Welcome to the 90s<Python user> Yeh, “Hey the 20th century called to say they wanted their code back”!<Groovy user> Hey, we do this too!

Monday, 30 September 13

Page 37: The Adventurous Developers Guide to JVM Languages

FUNCTIONAL PRINCIPLES1. LITTLE OR NO SIDE EFFECTS

2. FUNCTIONS SHOULD ALWAYS RETURN THE SAME RESULT IF CALLED WITH THE SAME PARAMETERS

3. NO GLOBAL VARIABLES

4. FUNCTIONS AS FIRST ORDER CITIZENS

5. LAZY EVALUATION OF EXPRESSIONS

Monday, 30 September 13

Page 38: The Adventurous Developers Guide to JVM Languages

WHOA!

(defn send-html-response "Html response" [client-socket status title body] (let [html (str "<HTML><HEAD><TITLE>" title "</TITLE></HEAD><BODY>" body "</BODY></HTML>")] send-http-response client-socket status "text/html" (.getBytes html "UTF-8")) ))

Monday, 30 September 13

Page 39: The Adventurous Developers Guide to JVM Languages

LET’S GET FUNCTIONAL

(defn process-request "Parse the HTTP request and decide what to do" [client-socket] (let [reader (get-reader client-socket) first-line (.readLine reader) tokens (clojure.string/split first-line #"\s+")] (let [http-method (clojure.string/upper-case (get tokens 0 "unknown"))] (if (or (= http-method "GET") (= http-method "HEAD")) (let [file-requested-name (get tokens 1 "not-existing") [...]

Monday, 30 September 13

Page 40: The Adventurous Developers Guide to JVM Languages

INTEROP

(ns clojure-http-server.core (:require [clojure.string]) (:import (java.net ServerSocket SocketException) (java.util Date) (java.io PrintWriter BufferedReader InputStreamReader BufferedOutputStream)))

Monday, 30 September 13

Page 41: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 42: The Adventurous Developers Guide to JVM Languages

LET’S EXPERIMENT

Monday, 30 September 13

Page 43: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 44: The Adventurous Developers Guide to JVM Languages

LET’S EXPERIMENT

Monday, 30 September 13

Page 45: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13

Page 46: The Adventurous Developers Guide to JVM Languages

LET’S EXPERIMENT

Monday, 30 September 13

Page 47: The Adventurous Developers Guide to JVM Languages

SUMMARY

FUNCTIONS ARE FIRST CLASS CITIZENS

AND SHOULD BE TREATED AS SUCH!

Monday, 30 September 13

Page 48: The Adventurous Developers Guide to JVM Languages

SUMMARY

STATICALLY TYPED LANGUAGES ROCK

Monday, 30 September 13

Page 49: The Adventurous Developers Guide to JVM Languages

SUMMARY

EVERYONE’S SYNTAX SUCKS...

Monday, 30 September 13

Page 50: The Adventurous Developers Guide to JVM Languages

SUMMARY

EVERYONE’S SYNTAX SUCKS...

TO SOMEONE ELSE.

Monday, 30 September 13

Page 51: The Adventurous Developers Guide to JVM Languages

SUMMARY

THE JVM IS AWESOME

Monday, 30 September 13

Page 52: The Adventurous Developers Guide to JVM Languages

BE ADVENTUROUS!

Monday, 30 September 13

Page 53: The Adventurous Developers Guide to JVM Languages

YOU, ONE HOUR LATER

0

25

50

75

100

Heard of the Lang

Java Scala Groovy Clojure Ceylon Kotlin Xtend

Monday, 30 September 13

Page 54: The Adventurous Developers Guide to JVM Languages

REBEL LABS == AWESOME

99.9% NON-PRODUCT RELATED

TECH REPORTS WRITTEN BY OUR DEVELOPERS

Monday, 30 September 13

Page 55: The Adventurous Developers Guide to JVM Languages

REBEL LABS == AWESOME

JAVA 8, CONTINUOUS DELIVERY,

APP SERVER DEBATE, JVM WEB FRAMEWORKS,

PRODUCTIVITY REPORTS...

Monday, 30 September 13

Page 56: The Adventurous Developers Guide to JVM Languages

REBEL LABS == AWESOME

AND...

THE ADVENTUROUS DEVELOPERS GUIDE TO JVM LANGUAGES

Monday, 30 September 13

Page 58: The Adventurous Developers Guide to JVM Languages

RESOURCES

SIMON MAPLE@SJMAPLE

Monday, 30 September 13

Page 59: The Adventurous Developers Guide to JVM Languages

Monday, 30 September 13