(ThoughtWorks Away Day 2009) one or two things you may not know about typesystems

Phil Calçado
one or two things
    you may not know

      about
  type systems
      phillip calçado
    http://fragmental.tw
myths
myth:type systems
are just syntax
checkers
“The fundamental purpose of a type system is to
prevent the occurrence of execution errors during
the running of a program.”

                    - Luca Cardelli, Type Systems
what kind of
   errors?
package org.apache.commons.lang.time;



public class DateUtils {
    public static boolean isSameDay(Date date1, Date
date2) {
         if (date1 == null || date2 == null) {
             throw new IllegalArgumentException("The date
must not be null");
         }
         return verifySameDay(date1, date2);
    }
}
package org.apache.commons.lang.time;



public class DateUtils {

 but why would it be
    public static boolean isSameDay(Date date1, Date
date2) {
         if (date1 == null || date2 == null) {

allowed to be null in
             throw new IllegalArgumentException("The date
must not be null");
        }

   the first place?
         Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);
         Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);
         return isSameDay(cal1, cal2);
    }
}
use System;


public class DatePrinter {
    public static void Main(string[] args)
    {
        Print(new DateTime());
    }

    public static void Print(DateTime d)
    {
        Console.WriteLine(d);
    }
}
☑
use System;


public class DatePrinter {
    public static void Main(string[] args)
    {
        Print(new DateTime());
    }

    public static void Print(DateTime d)
    {
        Console.WriteLine(d);
    }
}
use System;


public class DatePrinter {
    public static void Main(string[] args)
    {
        Print(null);
    }

    public static void Print(DateTime d)
    {
        Console.WriteLine(d);
    }
}
☒
use System;


public class DatePrinter {
    public static void Main(string[] args)
    {
        Print(null);
    }

    public static void Print(DateTime d)
    {
        Console.WriteLine(d);
    }
     pcalcado@pcalcado:awayday2009$
gmcs
DatePrinter.cs
}    DatePrinter.cs(7,5):
error
CS1502:
The
best
overloaded
method
match
for

     `DatePrinter.Print(System.DateTime)'
has
some
invalid
arguments
     DatePrinter.cs(10,22):
(Location
of
the
symbol
related
to
previous
error)
     DatePrinter.cs(7,5):
error
CS1503:
Argument
`#1'
cannot
convert
`null'

     expression
to
type
`System.DateTime'
     Compilation
failed:
2
error(s),
0
warnings
use System;


public class DatePrinter {
    public static void Main(string[] args)
    {
        Print(null);
    }

    public static void Print(DateTime? d)
    {
        Console.WriteLine(d);
    }
}
☑
use System;


public class DatePrinter {
    public static void Main(string[] args)
    {
        Print(null);
    }

    public static void Print(DateTime? d)
    {
        Console.WriteLine(d);
    }
}
“I call it my billion-dollar mistake. It was the
invention of the null reference in 1965. At that
time, I was designing the first comprehensive type
system [...] My goal was to ensure that all use of
references should be absolutely safe, with checking
performed automatically by the compiler. But I
couldn’t resist the temptation to put in a null
reference [...] This has led to innumerable errors
[...] which have probably caused a billion dollars of
pain and damage in the last forty years. In recent
years, a number of program analysers [...] in
Microsoft have been used to check references, and
give warnings if there is a risk they may be non-
null. More recent programming languages like Spec#
have introduced declarations for non-null references.
This is the solution, which I rejected in 1965.”

                                       - C.A.R. Hoare
myth:
dynamic
  means
   weak
what is
 weak?
“typeful programming advocates static typing, as much
as possible, and dynamic typing when necessary; the
strict observance of either or both of these
techniques leads to strong typing, intended as the
absence of unchecked run-time type errors.”

                 - Luca Cardelli, Typeful Programming
unchecked run-time type errors
pcalcado@pcalcado:~$
php
‐a
Interactive
mode
enabled
<?php

$i_am_a_string
=
"see?";

$weird_result
=
100
+
$i_am_a_string
+
20;

echo
$weird_result
.
"n";
echo
$i_am_a_string
.
"n";
?>
120
see?
unchecked run-time type errors


   $weird_result
=
100
+
“see”
+
20;

   =>
120
pcalcado@pcalcado:~$
irb
>>
weird_result
=
100
+
"see?"
+
20
TypeError:
String
can't
be
coerced
into

Fixnum

 from
(irb):1:in
`+'

 from
(irb):1
>>

myth:
     static
     means
     safe
“typeful programming advocates static typing, as much
as possible, and dynamic typing when necessary; the
strict observance of either or both of these
techniques leads to strong typing, intended as the
absence of unchecked run-time type errors.”

                 - Luca Cardelli, Typeful Programming
“typeful programming advocates static typing, as much
as possible, and dynamic typing when necessary; the
strict observance of either or both of these
techniques leads to strong typing, intended as the
absence of unchecked run-time type errors.”

                 - Luca Cardelli, Typeful Programming
type error:
$weird_result
=
100
+
“see”
+
20;

=>
120
public class NoError{
    public static void main(String[] args){

      Triangle t = new Triangle();
       t.addVertex(0,0);
       t.addVertex(10,10);
       t.addVertex(20,20);
       t.addVertex(30,30);
        System.out.println("Your triangle has "+
t.getVertices().size() + " vertices");
    }
}

class Triangle{
private List<int[]> vertices = new ArrayList<int[]>();

    public void addVertex(int x, int y){
        vertices.add(new int[]{x, y});
    }
    public List<int[]> getVertices(){

     return vertices;

   }
}
no type error:
=>
Your
triangle
has
4
vertices
myth:
static means




bureaucratic
public class Sum {

    public static int add(int a,
int b) {
        return a + b;
    }

}
add(a, b) {
            return a + b
        }


Is this hypothetical language dynamic or static?
Ruby




def add(a, b)
    a + b
end


      Dynamic
C#




((a, b) => a + b)



      Static
Clojure




(defn add [a b]
  (+ a b))


     Dynamic
Haskell




add a b = a + b



     Static
static can be
    smart
add a b = a + b



Prelude>
:load
add.hs
[1
of
1]
Compiling
Main










(
add.hs,
interpreted
)
Ok,
modules
loaded:
Main.
*Main>
:type
add
add
::
(Num
a)
=>
a
‐>
a
‐>
a
*Main>
:type
(add
1
2)
(add
1
2)
::
(Num
t)
=>
t
*Main>

myth:




only dynamic
 is flexible
>>
my_func()
NoMethodError:
undefined
method

`my_func'
for
main:Object

 from
(irb):1
>>
instance_eval("def
my_func()n
puts

666n
end")
=>
nil
>>
my_func()
666
=>
nil
>>

(ThoughtWorks Away Day 2009) one or two things you may not know about typesystems
“we think that people use eval as a poor
   man’s    substitute   for    higher-order
   functions. Instead of passing around
   a function and call it, they pass around
   a string and eval it. [...]
   A final use of eval that we want to
   mention is for partial evaluation,multi-
   stage programming, or meta programming.
   We argue that in that case strings are
   not really the most optimal structure to
   represent programs and it is much better
   to   use programs to represent programs,
   i.e. C++-style templates, quasiquote/
   unquote as in Lisp, or code literals as
   in the various multi-stage programming
   languages.”

- The End of the Cold War Between Programming
     Languages, Erik Meijer and Peter Drayton
main =    runBASIC $ do
    10    GOSUB 1000
    20    PRINT "* Welcome to HiLo *"
    30    GOSUB 1000

    100    LET I := INT(100 * RND(0))
    200    PRINT "Guess my number:"
    210    INPUT X
    220    LET S := SGN(I-X)
    230    IF S <> 0 THEN 300

    240    FOR X := 1 TO 5
    250    PRINT X*X;" You won!"
    260    NEXT X
    270    STOP

    300 IF S <> 1 THEN 400
    310 PRINT "Your guess ";X;" is too low."
    320 GOTO 200

    400 PRINT "Your guess ";X;" is too high."
    410 GOTO 200

    1000 PRINT "*******************"
    1010 RETURN

    9999 END
652 lines of
   Haskell
what does the
 future hold?
does typing
  matter?
=>typing influences
      language features and
      tools
      =>static typing is

YES
      being wrongly bashed
      because of C#/Java just
      as dynamic was bashed
      because of PHP/Perl
      =>schools are merging
      (e.g. C# 4) and it’s
      important to know each
      one’s sweet spot
=>saying that something
     is static or dynamic
     doesn’t tell much about
     what it can do
     =>most nice features in

NO   Python/Ruby/JavaScript
     are related to meta-
     model, not typing
     =>Java/C# are
     bureaucratic for
     historical reasons, not
     limitations on typing
refs:
=>http://pico.vub.ac.be/~wdmeuter/RDL04/papers/
Meijer.pdf
=>http://lucacardelli.name/Papers/TypefulProg.A4.pdf
=>http://sadekdrobi.com/2008/12/22/null-references-
the-billion-dollar-mistake/

=>http://www.flickr.com/photos/twindx/
=>http://www.flickr.com/photos/darwinbell/
=>http://www.flickr.com/photos/wainwright/
=>http://www.flickr.com/photos/fikirbaz/
1 of 47

More Related Content

What's hot(20)

Bind me if you canBind me if you can
Bind me if you can
Ovidiu Farauanu32 views
JavaScript ES6JavaScript ES6
JavaScript ES6
Leo Hernandez1.4K views
Fun with Lambdas: C++14 Style (part 2)Fun with Lambdas: C++14 Style (part 2)
Fun with Lambdas: C++14 Style (part 2)
Sumant Tambe51.6K views
What's New In C# 7What's New In C# 7
What's New In C# 7
Paulo Morgado1K views
EcmaScript 6 EcmaScript 6
EcmaScript 6
Manoj Kumar1.7K views
Java Generics - by ExampleJava Generics - by Example
Java Generics - by Example
Ganesh Samarthyam767 views
ES6 in Real LifeES6 in Real Life
ES6 in Real Life
Domenic Denicola5.5K views
Building fast interpreters in RustBuilding fast interpreters in Rust
Building fast interpreters in Rust
Ingvar Stepanyan4.7K views
JavaScript - new features in ECMAScript 6JavaScript - new features in ECMAScript 6
JavaScript - new features in ECMAScript 6
Solution4Future21.8K views
Java Class DesignJava Class Design
Java Class Design
Ganesh Samarthyam342 views
Tuga IT 2017 - What's new in C# 7Tuga IT 2017 - What's new in C# 7
Tuga IT 2017 - What's new in C# 7
Paulo Morgado475 views
Rust ⇋ JavaScriptRust ⇋ JavaScript
Rust ⇋ JavaScript
Ingvar Stepanyan10.2K views
Functional Algebra: Monoids AppliedFunctional Algebra: Monoids Applied
Functional Algebra: Monoids Applied
Susan Potter4.1K views
The best language in the worldThe best language in the world
The best language in the world
David Muñoz Díaz556 views
ES6 PPT FOR 2016ES6 PPT FOR 2016
ES6 PPT FOR 2016
Manoj Kumar2.8K views

Similar to (ThoughtWorks Away Day 2009) one or two things you may not know about typesystems

Similar to (ThoughtWorks Away Day 2009) one or two things you may not know about typesystems(20)

Novidades do c# 7 e 8Novidades do c# 7 e 8
Novidades do c# 7 e 8
Giovanni Bassi454 views
TechTalk - DotnetTechTalk - Dotnet
TechTalk - Dotnet
heinrich.wendel882 views
.NET Foundation, Future of .NET and C#.NET Foundation, Future of .NET and C#
.NET Foundation, Future of .NET and C#
Bertrand Le Roy3.2K views
Chapter i(introduction to java)Chapter i(introduction to java)
Chapter i(introduction to java)
Chhom Karath694 views
Design problemDesign problem
Design problem
Sanjay Kumar Chakravarti473 views
How to Adopt Modern C++17 into Your C++ CodeHow to Adopt Modern C++17 into Your C++ Code
How to Adopt Modern C++17 into Your C++ Code
Microsoft Tech Community296 views
How to Adopt Modern C++17 into Your C++ CodeHow to Adopt Modern C++17 into Your C++ Code
How to Adopt Modern C++17 into Your C++ Code
Microsoft Tech Community205 views
C# Today and TomorrowC# Today and Tomorrow
C# Today and Tomorrow
Bertrand Le Roy1.9K views
Cpp tutorialCpp tutorial
Cpp tutorial
Vikas Sharma260 views
A la découverte de TypeScriptA la découverte de TypeScript
A la découverte de TypeScript
Denis Voituron413 views
CppTutorial.pptCppTutorial.ppt
CppTutorial.ppt
HODZoology33 views
Introduction to typescriptIntroduction to typescript
Introduction to typescript
Mario Alexandro Santini90 views
Kotlin Developer Starter in Android projectsKotlin Developer Starter in Android projects
Kotlin Developer Starter in Android projects
Bartosz Kosarzycki5.1K views
.net progrmming part1.net progrmming part1
.net progrmming part1
Dr.M.Karthika parthasarathy53 views
ASP.NETASP.NET
ASP.NET
chirag patil39 views
C++ L09-Classes Part2C++ L09-Classes Part2
C++ L09-Classes Part2
Mohammad Shaker630 views

More from Phil Calçado(20)

Ten Years of Failing MicroservicesTen Years of Failing Microservices
Ten Years of Failing Microservices
Phil Calçado1.8K views
The Next Generation of MicroservicesThe Next Generation of Microservices
The Next Generation of Microservices
Phil Calçado1.3K views
Evolutionary  Architecture at WorkEvolutionary  Architecture at Work
Evolutionary Architecture at Work
Phil Calçado3.8K views
Structuring apps in ScalaStructuring apps in Scala
Structuring apps in Scala
Phil Calçado1.6K views
SoundCloud Masterclass on BrazilSoundCloud Masterclass on Brazil
SoundCloud Masterclass on Brazil
Phil Calçado1.2K views

(ThoughtWorks Away Day 2009) one or two things you may not know about typesystems