Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

0

Share

Download to read offline

Artur Skowroński – Ten Typ tak ma - O systemach typów na przykładzie TypeScript'a

Download to read offline

Systemy typów kojarzą się większości programistów z czymś naprawdę ciężkim, mocno akademickim i trudnym do zrozumienia, dodatkowo nie przydatnym w codziennym życiu developera. Postaram się to zmienić, przynajmniej cześciowo. O ile sam nie wierzę że świetna znajomość systemów typów uczyni Cię znacznie bardziej produktywnym, to postaram się rozwiać mit że jest to coś trudnego i niezrozumiałego. W przystępny i interaktywny sposób przedstawię odrobinę “Computer Science” które może pomóc nam zrozumieć dlaczego niektóre rzeczy w używanych przez nas językach są zaprojektowane tak, a nie inaczej.

Przede wszystkim odpowiemy zaś sobie na prawdę - jak bardzo “Typed” TypeScript tak naprawdę jest?

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

Artur Skowroński – Ten Typ tak ma - O systemach typów na przykładzie TypeScript'a

  1. 1. T E N TY P TA K M A O S Y S T E M A C H T Y P Ó W N A P R Z Y K Ł A D Z I E T Y P E S C R I P T ’ A A R T U R S KO W R O Ń S K I  
  2. 2. T H E R E A R E T W O H A R D T H I N G S I N C O M P U T E R S C I E N C E : P H I L K A R LT O N C A C H E I N VA L I D AT I O N N A M I N G T H I N G S
  3. 3. T H E R E A R E T W O H A R D T H I N G S I N C O M P U T E R S C I E N C E : P H I L K A R LT O N C A C H E I N VA L I D AT I O N N A M I N G T H I N G S
  4. 4. N A M I N G T H I N G S
  5. 5. O N T O L O G Y
  6. 6. O N T O L O G Y   " O N T O "   O Z N A C Z A „ T O , C O J E S T ” , „ C O K O LW I E K ”
  7. 7. I N T O W H AT C AT E G O R I E S , I F A N Y, C A N W E S O R T E X I S T I N G T H I N G S ?
  8. 8. T Y P E S T H E O RY
  9. 9. INTEGER SET OF
 VALUES SET OF
 OPERATIONS TYPES
  10. 10. INTEGER SET OF
 VALUES SET OF
 OPERATIONS 1, 2, 3, 4, 5, 
 6, 7, 8, 9, 10… NO IMPOSSIBLE VALUES
  11. 11. INTEGER TYPES SET OF
 VALUES SET OF
 OPERATIONS
  12. 12. INTEGER NO IMPOSSIBLE OPERATIONS SET OF
 OPERATIONS +, -, /, * SET OF
 VALUES
  13. 13. DIVISION ON INTEGER? SET OF
 OPERATIONS INTEGER +, -, /, * SET OF
 VALUES
  14. 14. W E A K & S T R O N G T Y P I N G
  15. 15. L I G H T W E I G H T T E C H N O L O G Y
  16. 16. S TAT I C & D Y N A M I C T Y P I N G
  17. 17. S TAT I C T Y P I N G
  18. 18. ASSEMBLER
  19. 19. HOW CAN WE PROVE THAT THIS PROGRAM WORKS?
  20. 20. RICE’S THEOREM (1957) KAŻDA NIETRYWIALNA WŁASNOŚĆ JĘZYKÓW REKURENCYJNIE PRZELICZALNYCH JEST NIEROZSTRZYGALNA
  21. 21. S E T O F R U L E S
  22. 22. F O R T R A N ( 1 9 5 7 )
  23. 23. D ATA A R E A N N O TAT E D W I T H T Y P E I N F O
  24. 24. S E L F - D O C U M E N TAT I O N
  25. 25. F O R H U M A N S
  26. 26. F O R M A C H I N E S
  27. 27. A N Y F O O L C A N W R I T E C O D E T H AT A C O M P U T E R C A N U N D E R S TA N D . G O O D P R O G R A M M E R S W R I T E C O D E T H AT H U M A N S C A N U N D E R S TA N D . M A R T I N F O W L E R
  28. 28. S TAT I C F I L E C H E C K I N G D O N E O N C O M P I L AT I O N T I M E SOURCE CODE TYPE CHECKER
  29. 29. TYPE CHECKER T Y P E C H E C K E R P R O V E S C H O S E N P R O P E R T I E S “PROVEN” CODE
  30. 30. TYPE CHECKER D O N ’ T N E E D T O B E I N C O R R E C T ?
  31. 31. PERFECTLY VALID PROGRAM… let stringValue: unknown = "Value"; stringValue.trim();
  32. 32. …STILL WILL FAIL let stringValue: unknown = "Value"; stringValue.trim();
  33. 33. …STILL WILL FAIL let stringValue: unknown = "Value"; stringValue.trim();
  34. 34. L O W E R B O N D O F C O R R E C T N E S S
  35. 35. T R A D E O F F : E A S Y T O U S E / C O R R E C T
  36. 36. DIVISION ON INTEGER? SET OF
 VALUES SET OF
 OPERATIONS SUPER-STRICT-INTEGER +, -, /, *
  37. 37. N O T Y P E S I N R U N T I M E
  38. 38. S TAT I C & D Y N A M I C T Y P I N G
  39. 39. D Y N A M I C T Y P I N G
  40. 40. HOW CAN WE PROVE THAT THIS PROGRAM WORKS?
  41. 41. P R O B L E M - N O I N F O A B O U T T Y P E S I N R U N T I M E
  42. 42. VA R I A B L E I N C O D E int variable = 1 RUNTIME
  43. 43. RUNTIME D E C O R AT E D W I T H T Y P E O N R U N T I M E value = 1 type = int variable
  44. 44. E V E RY T H I N G I S C O R R E C T RUNTIME Math.abs() value = 1 type = int variable
  45. 45. R U N T I M E E X C E P T I O N value = 1 type = int variable String.trim() RUNTIME
  46. 46. P E R F O R M A N C E
  47. 47. G R A D U A L T Y P I N G
  48. 48. S TAT I C C O R E
  49. 49. D Y N A M I C N E W C O D E ( W I T H A N Y )
  50. 50. I N T E R O P E R A B I L I T Y W I T H J AVA S C R I P T
  51. 51. T Y P E E R A S U R E
  52. 52. S T R U C T U R A L T Y P I N G
  53. 53. N O M I N A L T Y P I N G class Foo { method(input: string): number { ... } } class Bar { method(input: string): number { ... } } let foo: Foo = new Bar();
  54. 54. N O M I N A L T Y P I N G class Foo { method(input: string): number { ... } } class Bar { method(input: string): number { ... } } let foo: Foo = new Bar();
  55. 55. N O M I N A L T Y P I N G class Foo { method(input: string): number { ... } } class Bar { method(input: string): number { ... } } let foo: Foo = new Bar();
  56. 56. S T R U C T U R A L T Y P I N G class Foo { method(input: string): number { ... } } class Bar { method(input: string): number { ... } } let foo: Foo = new Bar();
  57. 57. S T R U C T U R A L T Y P I N G class Foo { method(input: string): number { ... } } class Bar { method(input: string): number { ... } } let foo: Foo = new Bar();
  58. 58. E X P L I C I T T Y P I N G let foo: Foo = new Foo();let foo: Foo = new Foo();
  59. 59. M L & H I N D L E Y – M I L N E R M E T H O D T Y P E I N F E R E N C E
  60. 60. IMPLICIT TYPING let foo = new Foo();
  61. 61. WHAT-A-TYPE? let a = 'x' let b = true let c = 3
  62. 62. WHAT-A-TYPE? let a = 'x' //string let b = true //boolean let c = 3 //number
  63. 63. WHAT-A-TYPE? const a = 'x' const b = true const c = 3
  64. 64. WHAT-A-TYPE? const a = 'x' // ‘x’ const b = true // true const c = 3 // 3
  65. 65. WITHOUT TYPE OF GUARD let stringValue: unknown = "Value"; stringValue.trim()
  66. 66. TYPE OF GUARD function withTypeGuards(value: unknown) { if (typeof value === "string") { return value.trim(); } }
  67. 67. TYPE OF GUARD function withTypeGuards(value: unknown) { if (typeof value === "string") { return value.trim(); } }
  68. 68. TYPE OF GUARD function withTypeGuards(value: unknown) { if (typeof value === "string") { return value.trim(); } }
  69. 69. TYPE OF GUARD function withTypeGuards(value: unknown) { if (typeof value === "string") { return value.trim(); // string } }
  70. 70. PA R A M E T R I Z E D P O LY M O R P H I S M
  71. 71. E X . A R R AY S let message: Array<string> = [] message.push("test"); message.push(2);
  72. 72. E X . A R R AY S let message: Array<string> = [] message.push("test"); message.push(2);
  73. 73. E X . A R R AY S let message: Array<string> = [] message.push("test"); message.push(2);
  74. 74. E X . A R R AY S function unsafeAdd(arr: Array<string | number>): void { arr.push(3) } let message: Array<string> = [] unsafeAdd(message) const el: string = message[0] console.log(el.toLowerCase())
  75. 75. U N S O U N D T Y P E S function unsafeAdd(arr: Array<string | number>): void { arr.push(3) } let message: Array<string> = [] unsafeAdd(message) const el: string = message[1] console.log(el.toLowerCase())
  76. 76. U N S O U N D T Y P E S function unsafeAdd(arr: Array<string | number>): void { arr.push(3) } let message: Array<string> = [] unsafeAdd(message) const el: string = message[1] console.log(el.toLowerCase())
  77. 77. U N S O U N D T Y P E S function unsafeAdd(arr: Array<string | number>): void { arr.push(3) } let message: Array<string> = [] unsafeAdd(message) const el: string = message[1] console.log(el.toLowerCase())
  78. 78. U N S O U N D T Y P E S function unsafeAdd(arr: Array<string | number>): void { arr.push(3) } let message: Array<string> = [] unsafeAdd(message) const el: string = message[1] console.log(el.toLowerCase())
  79. 79. U N S O U N D T Y P E S function unsafeAdd(arr: Array<string | number>): void { arr.push(3) } let message: Array<string> = [] const el: string = message[1] console.log(el.toLowerCase())
  80. 80. U N S O U N D T Y P E S function unsafeAdd(arr: Array<string | number>): void { arr.push(3) } let message: Array<string> = [] unsafeAdd(message) const el: string = message[1] console.log(el.toLowerCase())
  81. 81. U N S O U N D T Y P E S function unsafeAdd(arr: Array<string | number>): void { arr.push(3) } let message: Array<string> = [] unsafeAdd(message) const el: string = message[1] console.log(el.toLowerCase())
  82. 82. U N S O U N D T Y P E S function unsafeAdd(arr: Array<string | number>): void { arr.push(3) } let message: Array<string> = [] unsafeAdd(message) const el: string = message[0] console.log(el.toLowerCase())
  83. 83. U N S O U N D T Y P E S function unsafeAdd(arr: Array<string | number>): void { arr.push(3) } let message: Array<string> = [] unsafeAdd(message) const el: string = message[0] console.log(el.toLowerCase())
  84. 84. U N S O U N D T Y P E S function unsafeAdd(arr: Array<string | number>): void { arr.push(3) } let message: Array<string> = [] unsafeAdd(message) const el: string = message[0] console.log(el.toLowerCase()) / int
  85. 85. VA L I D J S C O D E function unsafeAdd(arr) { arr.push(3) } var message = [] unsafeAdd(message) var el = message[0] console.log(el.toLowerCase())
  86. 86. S O U N D ?
  87. 87. H O W T O M A K E I T S O U N D function checkIfTypeOk(el, type) { if(!el instanceof type) throw new ClassCastException() } var message: Array<string> = [] unsafeAdd(message) var el = message[0] checkIfTypeOk(el, string) console.log(el.toLowerCase())
  88. 88. H O W T O M A K E I T S O U N D function checkIfTypeOk(el, type) { if(!el instanceof type) throw new ClassCastException() } var message: Array<string> = [] unsafeAdd(message) var el = message[0] checkIfTypeOk(el, string) console.log(el.toLowerCase())
  89. 89. H O W T O M A K E I T S O U N D function checkIfTypeOk(el, type) { if(!el instanceof type) throw new ClassCastException() } var message: Array<string> = [] unsafeAdd(message) var el = message[0] checkIfTypeOk(el, string) console.log(el.toLowerCase())
  90. 90. H O W T O M A K E I T S O U N D function checkIfTypeOk(el, type) { if(!el instanceof type) throw new ClassCastException() } var message: Array<string> = [] unsafeAdd(message) var el = message[0] checkIfTypeOk(el, string) console.log(el.toLowerCase())
  91. 91. T R A D E O F F : E A S Y T O U S E / C O R R E C T C O M PAT I B L E W I T H J S
  92. 92. GRADUAL (STATIC WITH TYPE ERASURE) STRUCTURALLY TYPED IMPLICITELY TYPED UNSOUND
  93. 93. S O U R C E S https://www2.ccs.neu.edu/racket/pubs/ecoop2015-takikawa-et-al.pdf https://users.soe.ucsc.edu/~abadi/Papers/FTS-submitted.pdf UNDERSTANDING TYPESCRIPT https://blog.steveklabnik.com/posts/2010-07-17-what-to-know-before-debating-type-systems WHAT TO KNOW BEFORE DEBATING TYPE SYSTEMS TOWARDS PRACTICAL GRADUAL TYPING https://papl.cs.brown.edu/2014/safety-soundness.html SAFETY AND SOUNDNESS
  94. 94. S O U R C E S https://www2.ccs.neu.edu/racket/pubs/ecoop2015-takikawa-et-al.pdf https://users.soe.ucsc.edu/~abadi/Papers/FTS-submitted.pdf UNDERSTANDING TYPESCRIPT https://blog.steveklabnik.com/posts/2010-07-17-what-to-know-before-debating-type-systems WHAT TO KNOW BEFORE DEBATING TYPE SYSTEMS TOWARDS PRACTICAL GRADUAL TYPING https://papl.cs.brown.edu/2014/safety-soundness.html SAFETY AND SOUNDNESS Q U E S T I O N S ? T H A N K Y O U !

Systemy typów kojarzą się większości programistów z czymś naprawdę ciężkim, mocno akademickim i trudnym do zrozumienia, dodatkowo nie przydatnym w codziennym życiu developera. Postaram się to zmienić, przynajmniej cześciowo. O ile sam nie wierzę że świetna znajomość systemów typów uczyni Cię znacznie bardziej produktywnym, to postaram się rozwiać mit że jest to coś trudnego i niezrozumiałego. W przystępny i interaktywny sposób przedstawię odrobinę “Computer Science” które może pomóc nam zrozumieć dlaczego niektóre rzeczy w używanych przez nas językach są zaprojektowane tak, a nie inaczej. Przede wszystkim odpowiemy zaś sobie na prawdę - jak bardzo “Typed” TypeScript tak naprawdę jest?

Views

Total views

189

On Slideshare

0

From embeds

0

Number of embeds

0

Actions

Downloads

1

Shares

0

Comments

0

Likes

0

×