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. 2.
  2. 4.

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

    is impossible. The compiler simply refuses to build
  3. 5.

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

    is impossible. The compiler simply refuses to build
  4. 6.

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

    is impossible. The compiler simply refuses to build
  5. 7.

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

    is impossible. The compiler simply refuses to build
  6. 10.
  7. 11.

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

    polymorphism in programming. Journal of Computer and System Sciences, Robert Milner, 1978
  8. 13.

    abstraction mechanisms over data Several Types of Types in Programming

    Languages Simone Martini, Universit`a di Bologna
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 25.
  15. 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
  16. 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
  17. 29.

    The dawn of Object Orientation 1950 1960 1970 1980 1990

    2000 2010 2020 Fortran Algol 60 Algol W Pascal C++
  18. 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++
  19. 31.

    The age of the internet languages 1950 1960 1970 1980

    1990 2000 2010 2020 Fortran Algol 60 Algol W Pascal C++ Java
  20. 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
  21. 33.

    Dynamic Typed languages 1950 1960 1970 1980 1990 2000 2010

    2020 Fortran Algol 60 Algol W Pascal C++ Java JS Ruby
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 48.
  31. 49.
  32. 50.
  33. 51.
  34. 52.
  35. 53.
  36. 54.
  37. 56.

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

    damaged the compiler knows the types Linus Torvalds about Hungarian notation
  38. 57.
  39. 58.
  40. 59.
  41. 60.
  42. 61.
  43. 64.
  44. 67.

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

    user, track playlist… soundcloud:tracks:1234
  45. 68.
  46. 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++
  47. 73.
  48. 74.
  49. 75.
  50. 76.
  51. 78.
  52. 80.
  53. 81.
  54. 82.
  55. 83.
  56. 84.
  57. 85.
  58. 86.
  59. 87.
  60. 92.

    The compiler might even inline the whole class: Allocation elimination

    with escape analysis Urban performance legends, revisited, Brian Goetz 2005
  61. 95.

    Allocations are OK Types are OK Yes, even enums Modern

    Android development: Android Jetpack, Kotlin, and more (Google I/O 2018)
  62. 98.

    Memory Any wrapper will be 8 bytes larger than wrapped

    primitive On Sun's JDK 1.3.1 for Windows
  63. 101.

    Memory Boolean: header has 12 bytes + 1 for the

    boolean + 3 for the granularity On HotSpot JVM 1.7.0_51
  64. 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
  65. 111.
  66. 112.

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

    correctness (safety, machine checked documentation) • Types improve abstraction (modularity) -> Types are enabler Sum up
  67. 113.

    Watch out for “hidden type” smells: • Types information in

    names • Type attributes • Booleans • Primitives Sum up
  68. 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
  69. 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
  70. 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
  71. 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
  72. 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