The Power of Types, KotlinConf 2019

The Power of Types, KotlinConf 2019

From Assembler, over Fortran and C to modern Kotlin, we came a long way and improved the way we can express our thoughts in code.

One thing that happened during this journey is that languages allow us to use types for our problem domain, independent of the underlying computer architecture. Types became a powerful tool.

Types improve readability which probably is the most important aspect of programming! But types also prevent you from making mistakes at compile time. This is why Kotlin translated the null problem into the type system.

We can use these powers in our daily lives. We can write better code by avoiding “primitive obsession”. I’ll show you how!

A8b79d304b5184e5a5b0a109590f6683?s=128

Danny Preussler

December 06, 2019
Tweet

Transcript

  1. Copenhagen Denmark THE POWER OF TYPES DANNY PREUSSLER @PreusslerBerlin

  2. None
  3. Do you enjoy debugging?

  4. In an ideal world, in the right language, buggy code

    is impossible. The compiler simply refuses to build
  5. In an ideal world, in the right language, buggy code

    is impossible. The compiler simply refuses to build
  6. In an ideal world, in the right language, buggy code

    is impossible. The compiler simply refuses to build
  7. In an ideal world, in the right language, buggy code

    is impossible. The compiler simply refuses to build
  8. No language can prevent us from writing bugs!

  9. But we can avoid as many as possible, as early

    as possible
  10. TYPES

  11. Well-typed expressions do not go wrong A theory of type

    polymorphism in programming. Journal of Computer and System Sciences, Robert Milner, 1978
  12. WHAT IS A TYPE?

  13. abstraction mechanisms over data Several Types of Types in Programming

    Languages Simone Martini, Universit`a di Bologna
  14. A type is a concise, formal description of the behavior

    of a program fragment Type systems for programming languages, Didier Rémy, INRIA Paris
  15. THE HISTORY OF TYPES

  16. 1950 1960 1970 1980 1990 2000 2010 2020

  17. Types are pretty much absent 1950 1960 1970 1980 1990

    2000 2010 2020
  18. 1950 1960 1970 1980 1990 2000 2010 2020 Fortran

  19. “Two types of constants are permissible: fixed points (restricted to

    integers) and floating points” FORTRAN manual, 1956 But at same time, “mode” is used instead 1950 1960 1970 1980 1990 2000 2010 2020 Fortran
  20. 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol

    60 Types were born
  21. Integers are of type integer. All other numbers are of

    type real. Algol 60 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60
  22. the results of any program [..] should be comprehensible without

    knowing anything about the machine or its storage layout. Tony Hoare 1960 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60
  23. I realised that [types] were essential not only for determining

    memory requirements, but also for avoiding machine-dependent error Tony Hoare 1960 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60
  24. 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol

    60 Algol W 1966 Algol W
  25. One missing piece 1950 1960 1970 1980 1990 2000 2010

    2020 Fortran Algol 60 Algol W
  26. the type system (including user-defined types) [should] guarantee that only

    the prescribed operations on a type could operate on its values James H. Morris. Types are not sets, New York, NY, USA, 1973. ACM 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60 Algol W
  27. 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol

    60 Algol W Pascal
  28. Types became a central feature of programming languages as we

    understand them today 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal
  29. The dawn of Object Orientation 1950 1960 1970 1980 1990

    2000 2010 2020 Fortran Algol 60 Algol W Pascal C++
  30. Type structure is a syntactic discipline for enforcing levels of

    abstraction Types, abstraction and parametric polymorphism, John C. Reynolds, 1983 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal C++
  31. The age of the internet languages 1950 1960 1970 1980

    1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal C++ Java
  32. Object-oriented languages had made static typing so painful that many

    preferred to give up and just wing it. Ben Lynn, https://benlynn.blogspot.com/ 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal C++ Java
  33. Dynamic Typed languages 1950 1960 1970 1980 1990 2000 2010

    2020 Fortran Algol 60 Algol W Pascal C++ Java JS Ruby
  34. It is important to note that this is different than

    being typeless Dynamically Typed Languages, Laurence Tratt, Bournemouth University 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal C++ Java JS Ruby
  35. the chief technical difference between them being when types are

    enforced Dynamically Typed Languages, Laurence Tratt, Bournemouth University 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal C++ Java JS Ruby
  36. After you ship, it costs you about 10,000 times as

    much to fix a software bug Bill Joy, Java-One, 1999 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal C++ Java JS Ruby Java Generics
  37. Functional Programming arises from the grave 1950 1960 1970 1980

    1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal C++ Java JS Ruby Scala Java Generics
  38. Functional programming languages are traditionally typed (Scheme and Erlang are

    exceptions) Type systems for programming languages, Didier Rémy, INRIA Paris 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal C++ Java JS Ruby Scala Java Generics
  39. Anders Hejlsberg, 2012 you can write large programs in JavaScript.

    You just can’t maintain them. 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal C++ Java JS Ruby Scala Typescript Java Generics
  40. The typed v.s. untyped flavor [..] should not be confused

    with [..] whether types [..] are explicit or implicit. Type systems for programming languages, Didier Rémy, INRIA Paris 1950 1960 1970 1980 1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal C++ Java JS Ruby Scala Typescript Java Generics
  41. type reconstruction starts spreading 1950 1960 1970 1980 1990 2000

    2010 2020 Fortran Algol 60 Algol W Pascal C++ Java JS Ruby Scala Kotlin Typescript Java Generics
  42. KOTLIN AND TYPES

  43. The type system is Kotlin’s super power Nullability, 1st class

    functions, Nothing
  44. If Kotlin uses the power of Types So can you!

  45. PRIMITIVE OBSESSION

  46. Usage of primitives instead of small objects for simple tasks

  47. Usage of constants for coding information

  48. None
  49. None
  50. None
  51. None
  52. None
  53. None
  54. None
  55. Don’t put in name what can be in type

  56. Encoding the type [..] into the name [..] is brain

    damaged the compiler knows the types Linus Torvalds about Hungarian notation
  57. None
  58. None
  59. None
  60. None
  61. None
  62. actually...

  63. actually...

  64. None
  65. Don’t put in name what could be in type!

  66. Express your Domain knowledge

  67. Sample: At Soundcloud a URN uniquely identifies an entity: a

    user, track playlist… soundcloud:tracks:1234
  68. None
  69. Anytime you find yourself writing code of the form if

    the object is of type T1, then do something, but if it’s of type T2, then do something else, slap yourself. Scott Meyers, Effective C++
  70. “type” properties/functions are a smell

  71. Depending properties might be hint for hidden type

  72. Factory methods are hint for different types

  73. None
  74. None
  75. None
  76. None
  77. Booleans are a smell: 2 things in 1 place

  78. None
  79. Don’t let the creep in

  80. None
  81. None
  82. None
  83. None
  84. None
  85. None
  86. None
  87. COSTS

  88. ALLOCATION COSTS

  89. On JVM, objects allocated in Eden space

  90. To avoid thread synchronization Eden is split into Thread Local

    Allocation Buffer
  91. Allocating space in TLAB is often just a pointer bump

  92. The compiler might even inline the whole class: Allocation elimination

    with escape analysis Urban performance legends, revisited, Brian Goetz 2005
  93. Allocations on JVM are very cheap

  94. A word on Android ART is optimized for allocations

  95. Allocations are OK Types are OK Yes, even enums Modern

    Android development: Android Jetpack, Kotlin, and more (Google I/O 2018)
  96. MEMORY COSTS

  97. Memory A plain Object takes 8 bytes On Sun's JDK

    1.3.1 for Windows
  98. Memory Any wrapper will be 8 bytes larger than wrapped

    primitive On Sun's JDK 1.3.1 for Windows
  99. But careful

  100. Memory An empty String takes 40 bytes On Sun's JDK

    1.3.1 for Windows
  101. Memory Boolean: header has 12 bytes + 1 for the

    boolean + 3 for the granularity On HotSpot JVM 1.7.0_51
  102. Memory its "size" isn't something that's precisely defined https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  103. Kotlin compiler translates to int

  104. Kotlin compiler translates to java.lang.Integer

  105. Kotlin compiler can use primitive int inside Age

  106. Kotlin compiler translates to int

  107. Kotlin keeps Age with int

  108. GARBAGE COSTS

  109. the performance of the garbage collector is not determined by

    the number of dead objects but rather by the number of live ones Analyzing Java Memory, Java enterprise performance book
  110. Short lived objects are cheap

  111. SUM UP

  112. • Types improve readability (documentation) • Types help compile time

    correctness (safety, machine checked documentation) • Types improve abstraction (modularity) -> Types are enabler Sum up
  113. Watch out for “hidden type” smells: • Types information in

    names • Type attributes • Booleans • Primitives Sum up
  114. My goal was to ensure that all use of references

    should be absolutely safe, with checking performed automatically by the compiler Tony Hoare about Algol W
  115. But I couldn't resist the temptation to put in a

    null reference, simply because it was so easy to implement. Tony Hoare about Algol W
  116. call it my billion-dollar mistake Tony Hoare about Algol W

  117. Readability Let the compiler do the work!

  118. TYPE ALL THE THINGS!

  119. • Several Types of Types in Programming Languages Simone Martini,

    Universit`a di Bologna https://arxiv.org/pdf/1510.03726 • History and Philosophy of Computing Third International Conference, HaPoC 2015, Pisa, Italy • Type systems for programming languages Didier Rémy, INRIA Paris, http://gallium.inria.fr/~remy/mpri/cours1.pdf • A theory of type polymorphism in programming. Journal of Computer and System Sciences, Robert Milner, 1978 https://homepages.inf.ed.ac.uk/wadler/papers/papers-we-love/milner-type-polymorphism.pdf • Dynamically Typed Languages Laurence Tratt,Bournemouth University, 2009 https://tratt.net/laurie/research/pubs/html/tratt__dynamically_typed_languages/ Sources History of types
  120. • Type Wars, The Clean Code Blog, Uncle Bob http://blog.cleancoder.com/uncle-bob/2016/05/01/TypeWars.html

    • From Primitive Obsession to Domain Modelling, Mark Seemann https://blog.ploeh.dk/2015/01/19/from-primitive-obsession-to-domain-modelling/ • Phantom types in Kotlin, Danny Preussler https://proandroiddev.com/phantom-types-in-kotlin-afd3f59fde10? • Primitive Data types, Oracle https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html Sources Types
  121. • The cost of object creation in Java, including garbage

    collection https://www.bettercodebytes.com/the-cost-of-object-creation-in-java-including-garbage-collection/ • Thread-Local Allocation Buffers in JVM https://alidg.me/blog/2019/6/21/tlab-jvm • Urban performance legends, revisited https://www.ibm.com/developerworks/java/library/j-jtp09275/index.html#artrelatedtopics • E-book: Java enterprise performance https://www.dynatrace.com/resources/ebooks/javabook/ • Do you know your data size? https://www.javaworld.com/article/2077496/java-tip-130--do-you-know-your-data-size-.html • The impact of Garbage Collection on Application Performance https://www.dynatrace.com/resources/ebooks/javabook/impact-of-garbage-collection-on-performance/ Sources Costs
  122. #KotlinConf THANK YOU AND REMEMBER TO VOTE Danny Preussler @

    PreusslerBerlin