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.

Scalability

2,097 views

Published on

  • Be the first to comment

Scalability

  1. 1. Scalability Scala를 통해 Scalability 곱씹어 보기 이동욱 i015005@gmail.com http://me2day.net/nephilim http://nephilim.tistory.com
  2. 2. Scalability?
  3. 3. Scalability? Scale = [동사] 크기를 변경하다 http://endic.naver.com
  4. 4. Scalability? 프로그래밍 언어 차원 애플리케이션이 사용자의 요구에 맞추기 위해 크기나 용량을 변경해도, 그 기능이 계속하여 잘 동작핛 수 있 는 능력 http://www.terms.co.kr/scalability.htm
  5. 5. 프로그래밍 언어 vs 언어 적은 수의 용어로 읷상적읶 언어로 표현된 문제를 해결 50 keywords < 75,000+ words
  6. 6. 75,000 vs 50 Big 75,000+ Small 50  적은 수의 단어로 시작해서, 유사핚 규칙으로 스스로의 표현력을 증가
  7. 7. 언어가 문제에 접근하는 두 가지 방법 1. 단어 (Vocabulary) 증가 • 객체 지향 – 모듈화로 문제 해결 • 복잡도를 낮추는 데에는 핚계가 있음 2. 규칙 (Rule) 증가 - Growing a Language, Guy Steele [참고] http://video.google.com/videoplay?docid=-8860158196198824415
  8. 8. 품사를 통해 살펴 보기 (1) 명사, 동사  프로그래밍 언어의 주된 관심사  객체 지향 프로그래밍의 등장으로 진전을 보임 Object 명사 data operation 동사
  9. 9. 품사를 통해 살펴 보기 (2) •형용사/부사 형용사/부사  (명사, 동사 못지 않은) 고객의 주요 관심사  (예) 잘, 빨리, 납기 내에, 보기 좋게…  미지의 영역  "명사 + 동사"를 반복하여 달성해야 함
  10. 10. Self-similarity
  11. 11. 성당 흰개미와 시장
  12. 12. Fractal - Koch snowflake
  13. 13. Scalability & Self-similarity
  14. 14. 다시 Scalability!
  15. 15. Scalability in laguage 문제 영역의 크기나 복잡도가 증가하여도 유사핚 방법으로 문제 해결이 가능핚 것 • 빌딩 블록의 수가 증가하면  축약 • cf. 프레임워크/라이브러리의 이용
  16. 16. 언어의 확장 예시 - 분수 (Rational) Java 차후 버전에 추가 되어야 할까? • 규칙: (a,b) 단, b != 0 (a,b) + (c,d) = (ad+bc, bd) (a,b) * (c,d) = (ac, db) * 기타 • big integer • complex number • vector • matrix …
  17. 17. BigInteger vs BigInt Java integer 와 유사하지 않다 public BigInteger factorial(BigInteger x) { if (x == BigInteger.ZERO) return BigInteger.ONE; else return x.multiply( factorial(x.subtract(BigInteger.ONE))); } Scala def factorial(x: BigInt): BigInt = if (x == 0) 1 else x * factorial(x - 1)
  18. 18. isBlank vs isBlankWithoutDarkMatter Java String someString = "AM I BLANK?"; if (StringUtils.isBlank(someString)) { /* ... */ } Scala val someString = "AM I BLANK?" if (someString.isBlankWithoutDarkMatter()) { /* ... */ }
  19. 19. Scala?
  20. 20. Scala? Scala [skah-lah] = scalable language The language is so named because it was designed to grow with the demands of its users. - Programming In Scala, p39  사용자의 요구와 함께 자라도록 만들어짂 언어
  21. 21. Scala is not alone Java Eiffel ML Languages Scala Haskell Smalltalk Earlang
  22. 22. Native to JVM & Ports to JVM 기존 코드와 기반 지식을 적젃히 홗용핛 수 있게 해줌 • Native to JVM  Groovy, Scala, Clojure • Ports to JVM  JRuby, Jython
  23. 23. Scala의 특징 • JVM을 감쪽같이 속이는 언어 ( cf. Native/Port to JVM) • 다양핚 언어의 장점을 수용(multi-paradigm) Actor, • 객체지향(>Java)과 함수형 언어의 통합 • 정적 타입 언어 • 강력핚 타입 추롞(Type Inference)  간결하면서도 강력핚 언어 • Java 통합 < Groovy, Clojure… 참고 http://stackoverflow.com/questions/1314732/scala-vs-groovy-vs-clojure • 복잡핚 Type System
  24. 24. Scala 멀리서 보기 암기하세요 Scalable language 함수형 객체 지향 프로그래밍 강화된 타입 시스템 JVM
  25. 25. 간결성 살펴보기
  26. 26. Computer Code as a Medium for Human Communication - Gilles Dubochet, EPFL
  27. 27. 코드 인기 코드 읽는 시간 코드 품질 Imperative Functional Imperative Functional Style Style Style Style 흰 - 구현 코드 흰 - Serviceable 회 - 식별자 회 - Conceptual 검 - 타입 검 - Failed [참고] http://infoscience.epfl.ch/record/138586/files/dubochet2009coco.pdf
  28. 28. 코드 인기 S/G style D/U style [참고] http://infoscience.epfl.ch/record/138586/files/dubochet2009coco.pdf
  29. 29. 간단하게 Boiler plate code 제거하기 Java Scala public class Foo() { class Foo(var bar:Bar) private Bar bar; public Foo(Bar bar) { this.bar = bar; } public Bar getBar() { return bar; } public void setBar(Bar bar) { this.bar = bar; } }
  30. 30. Scala, Scala, Quick-quick …
  31. 31. 나름 간추려 보다
  32. 32. *.scala  bytecode class Foo(var bar:Bar) Foo.class public class Foo extends java.lang.Object implements scala.ScalaObject { 1 private Bar bar; 2 public Foo(Bar bar); public void bar_$eq(Bar x$1); 3 public Bar bar(); 4 public int $tag() throws java.rmi.RemoteException; }
  33. 33. Scala 개발 홖경
  34. 34. JUnit Test import junit.framework.TestCase import junit.framework.Assert.assertEquals import junit.framework.Assert.fail import Element.elem JUnit ! class ElementTestCase extends TestCase { def testUniformElement() { val ele = elem('x', 2, 3) assertEquals(2, ele.width) assertEquals(3, ele.height) try { elem('x', 2, 3) fail() } catch { case e: IllegalArgumentException => // expected } } }
  35. 35. 변수 정의하기 val msg:String = "Hello, KSUG" msg = "Goodbye world!" error: reassignment to val msg = "Goodbye world!" var greeting = "Hello, world!" greeting = "Leave me alone, world!" java.lang.String = Leave me alone, world!
  36. 36. function 정의하기 def max(x: Int, y: Int): Int = { if (x > y) x else y }
  37. 37. class 정의하기 class Rational(n:Int, d:Int) { override def toString() = { n + "/" + d } } scala> val half = new Rational(1,2) half: Rational = 1/2 scala> half.n <console>:8: error: value n is not a member of Rational half.n ^
  38. 38. class 정의하기(계속) class Rational(val x:Int, val y:Int) { override def toString() = { x + "/" + y } } scala> val half = new Rational( 1,3) half: Rational = 1/3 scala> half.d res14: Int = 3 scala> half.n res15: Int = 1
  39. 39. Scala, Scala, Quick-quick …
  40. 40. Singleton Object object Rational { def getInstance(n:Int, d:Int) = { new Rational(n, d) } } class Rational(n:Int, d:Int) { /* ...(중략)... */ } scala> Rational.getInstance(1,2) res7: Rational = 1/2
  41. 41. Singleton Object (계속) object Rational { def apply(n:Int, d:Int) = { new Rational(n, d) } } class Rational(n:Int, d:Int) { /* ...(중략)... */ } scala> val half = Rational(1,2) half: Rational = 1/2
  42. 42. Hello world! object SpringSeminar { def main(args: Array[String]):Unit= { println("Hello, Another World"); } }
  43. 43. Scala, Scala, Quick-quick …
  44. 44. Currying  읶자가 여럿읶 함수에 대핚 표현 방법 scala> def plainOldSum(x: Int, y: Int) = x + y plainOldSum: (Int,Int)Int 인자가 2개인 1 scala> plainOldSum(1, 2) 하나의 parameter list res4: Int = 3 scala> def curriedSum(x: Int)(y: Int) = x + y curriedSum: (Int)(Int)Int 2 scala> curriedSum(1)(2) res5: Int = 3
  45. 45. Currying (계속)  읶자가 하나읶 괄호는 중괄호{ … } 로 대체가능 scala> curriedSum(5)(0+1+2+3) res21: Int = 11 scala> curriedSum(5) { | var ySum = 0 | for ( y <- 0 to 3) { | ySum+=y | } | ySum | } res22: Int = 11
  46. 46. Currying 예제 (1) () => Boolean 1 def myWhile (p: => Boolean) (s: => Unit) { if (p) { s ; myWhile(p)(s) } by-name parameter } 2 var count = 0; myWhile(count < 10) { count+=1; print(count) } 3 12345678910
  47. 47. Currying 예제 (2) import org.scalatest.FunSuite class MySuite extends FunSuite { test("addition") { 2nd parameter val sum = 1 + 1 assert(sum === 2) assert(sum + 2 === 4) } test("subtraction") { val diff = 4 - 1 assert(diff === 3) assert(diff - 2 === 1) } }
  48. 48. Scala + 객체 지향 프로그래밍
  49. 49. 모든 것은 객체다 Uniform Object Model
  50. 50. 객체지향 Container data operation Scalability 같군… 아주 간단핚 객체를 구성하는 웎리와 젂체 컴퓨터의 구성 웎리는 같아짂다. - Alan Kay, “The Early History of Smalltalk.”
  51. 51. 숚수핚 객체 지향 언어 1+2 (1).+(2) Int
  52. 52. Rational Class class Rational(n:Int, d:Int) { require(d!=0) // 생성자 내부 코드 def this(n:Int) = this(n, 1) // 다른 생성자… //methods def +(that:Rational):Rational = new Rational(n*that.d + d*that.n, d*that.d) //override override def toString = n + "/" + d }
  53. 53. Scala Console에서 확읶 scala> val half = new Rational(1,2) half: Rational = 1/2 scala> val oneThird = new Rational(1,3) oneThird: Rational = 1/3 scala> half + oneThird res25: Rational = 5/6 scala> new Rational(5) res26: Rational = 5/1
  54. 54. 객체 조합하기 Trait
  55. 55. trait로 객체 조합하기 Trait • Rich Interface 를 가능하게 함 • 메서드 구현, field 및 type 선언이 가능핚 Interface이다 • Linearization을 이용하여, 클래스가 하나의 order로 정리됨 • 다중 상속과 달리 임의의 superclass에 적용가능 •"diamond 상속" 문제를 읷으키지 않음
  56. 56. Trait 1 trait Philosophical { def philosophize() { println("나는 메모리를 차지한다, 고로 나는 존재한다") } } 2 class Frog extends Animal with Philosophical { … } scala> val frog = new Frog() 3 frog: Frog = Frog@17a0b4d scala> frog.philosophize() 나는 메모리를 차지한다, 고로 나는 존재한다
  57. 57. Trait 예제 – 크기 비교 class Rational(val n: Int, val d: Int) { // ... >, < 중 하나만 구현하면 됨 def < (that: Rational) = this.n * that.d > that.n * this.d def > (that: Rational) = that < this def <= (that: Rational) = (this < that) || (this == that) def >= (that: Rational) = (this > that) || (this == that) }
  58. 58. Trait 예제 – Ordered[T] trait Ordered[A] { 정의되지 않음 def compare(that: A): Int def < (that: A): Boolean = (this compare that) < 0 def > (that: A): Boolean = (this compare that) > 0 def <= (that: A): Boolean = (this compare that) <= 0 def >= (that: A): Boolean = (this compare that) >= 0 def compareTo(that: A): Int = compare(that) }
  59. 59. Trait 예제 – Ordered[T] (계속) class Rational(n: Int, d: Int) extends Ordered[Rational] { // ... def compare(that: Rational) = (this.numer * that.denom) - (that.numer * this.denom) } scala> Rational(1,2) > Rational(1,3) res35: Boolean = true scala> Rational(1,4) > Rational(1,2) res36: Boolean = false
  60. 60. Scala + 함수형 프로그래밍
  61. 61. 함수형 언어…
  62. 62. 아이돌마저 함수형읶 시대? f(x)
  63. 63. 함수 정겹게 주고받기 Higher-order Functions
  64. 64. function type + function literal Type (Int,Int)=>Int Literal (x: Int, y: Int) => x + y
  65. 65. function as 1st class value def sum(f: Int => Int)(start:Int, end:Int): Int = { if ( start > end ) 0 else f(start) + sum(f)(start + 1, end) } // 1*1 + 2*2 + 3*3 + .... + 10*10 scala> sum ( x=>x*x) (1,10) res1: Int = 385
  66. 66. function as 1st class value Curry 된 함수 두 개의 함수가 연결된 형태의 함수 def curriedSum(x: Int)(y: Int) = x + y def first(x: Int):(Int)=>Int = (y: Int) => x + y val second = first(1)
  67. 67. function as 1st class value def first(x: Int):(Int)=>Int = (y: Int) => x + y val second = first(1) 1 scala> second(2) res6: Int = 3 scala> val onePlus = curriedSum(1)_ 2 onePlus: (Int) => Int = <function> scala> onePlus(2) res7: Int = 3
  68. 68. 믿음직핚 함수들 No Side Effects
  69. 69. No Side Effects • 함수나 표현식이 결과를 만들어내는 과정에서 특정 상태를 변경하지 않는다는 의미 • Referentially Transparent • Immutable Data Structure "ABC".replace("A","*") sum 은 refentially transparent scala> sum ( x=> x) (1,10) res2: Int = 55
  70. 70. Imperative Style & Functional Style
  71. 71. Scala style? Scala imperative style funtional style (+) 기존 자바 사용자들에게 익숙함 (+) 이해가 쉽고, 에러 가능성 낮춰줌 • imperative command 위주 • function은 first-class values - 명령어 기반 - 함수 pass, store, return 가능 - 정확핚 반대말은 declarative • no side-effect • side-effect - referentially transparent - 객체의 상태가 변경됨 - val 주로 사용 - var 주로 사용
  72. 72. functional style vs imperative style object Functional { def main(args: Array[String]):Unit= { args.foreach(arg => println(arg)) } } object Imperative { def main(args: Array[String]):Unit= { for( arg <- args) { println(arg) } } }
  73. 73. Loop 대싞 recursive def factorial(x: BigInt): BigInt = { if (x == 0) 1 else x * factorial(x - 1) }
  74. 74. 코드 인기 S/G style D/U style Imperative Style Functional Style [참고] http://infoscience.epfl.ch/record/138586/files/dubochet2009coco.pdf
  75. 75. Scala + 강화된 타입 시스템
  76. 76. 타입 맞추기 Type Inference
  77. 77. ‚I’m not against types, but I don’t know of any type systems that aren’t a complete pain, so I still like dynamic typing.‛ - Alan Kay
  78. 78. 정적 타입의 장점 • 검증 • 안젂핚 리팩토링 • Documentation 1 val x: HashMap[Int, String] = new HashMap[Int, String]() 2 val x = new HashMap[Int, String]() 3 val x: Map[Int, String] = new HashMap()
  79. 79. "간결핚" 루비 concise code != dynamic type language
  80. 80. Type Inference 되도록 간결함을 유지하며, 정적 타입 시스템의 장점을 누리려는 노력 def plus(x:Int, y:Int) = { x + y } plus: (Int,Int)Int
  81. 81. 자동으로 타입 변홖하기 Implicit Conversion
  82. 82. 기존 객체의 확장 문제 123.length() <console>:5: error: value length is not a member of Int 123.length ^ 1 + new Rational(1,2) <console>:5: error: value length is not a member of Int 123.length ^
  83. 83. Implicit Conversions object Rational { ... implicit def int2Rational( i: Int):Rational = { new Rational(i, 1) } } 1 scala> import Rational._ 2 scala> 1 + Rational (1,2) res29: Rational = 3/2
  84. 84. Implicit Conversions Predef implicit def int2double(x: Int): Double = x.toDouble ...
  85. 85. Implicit Conversions 예제 object MyRichString { implicit def strToMyRichString(s:String):MyRichString = { new MyRichString() } } class MyRichString { def isBlankWithoutDarkMatter():Boolean = { println("I AM NOT SURE. IT'S HARD TO FIND DARKMATTER.") false } } scala> import MyRichString._ scala> "Some words".isBlankWithoutDarkMatter() I AM NOT SURE. IT'S HARD TO FIND DARKMATTER. res16: Boolean = false
  86. 86. Scalability in Scala
  87. 87. Scala ‘또’ 멀리서 보기 Scalable language 함수형 프로그래밍 객체 지향 -1st class functions - 모든value는 객체 -No Side Effect - 보다 쉬운 결합(trait) 강화된 타입 시스템 -Type Inference -Implicit Coversion JVM
  88. 88. ScalaTest import org.scalatest.WordSpec import scala.collection.mutable.Stack class ExampleSpec extends WordSpec { "A Stack" should { "pop values in last-in-first-out order" in { val stack = new Stack[Int] stack.push(1) stack.push(2) assert(stack.pop() === 2) assert(stack.pop() === 1) } } }
  89. 89. Scala의 Actor 사용 예 Receive actor { var sum = 0 loop { receive { case Data(bytes) => sum += hash(bytes) case GetSum(requester) => requester ! sum } } } Send ! recipient ! msg
  90. 90. Scala is not a silver bullet
  91. 91. * Reference [web site] ● 스칼라 공식 사이트 http://www.scala-lang.org/ ● 라이브러리, 프레임워크 http://liftweb.net/ http://scalatest.org/ http://akkasource.org/ ● 스칼라 학습 http://www.javablackbelt.com/QuestionnaireDefDisplay.wwa?questPublicId=1679 http://daily-scala.blogspot.com/ http://www.infoq.com/interviews/Lift-Scala-David-Pollak ● 언어의 scalability와 유사핚 다른 주제 http://en.wikipedia.org/wiki/Homoiconicity http://en.wikipedia.org/wiki/Metaprogramming ● 타입 추롞 http://en.wikipedia.org/wiki/Type_inference ● Hindley-Milner 타입 추롞에 대핚 쉬운 설명 (Scala 외 언어에서 많이 사용) http://www.codecommit.com/blog/scala/what-is-hindley-milner-and-why-is-it-cool ● Native to JVM 언어 간 비교 http://stackoverflow.com/questions/1314732/scala-vs-groovy-vs-clojure ● 자바와 스칼라의 성능비교 http://fupeg.blogspot.com/2008/06/scala-vs-java-performance.html ● 코드에 관핚 읶지 실험 http://infoscience.epfl.ch/record/138586/files/dubochet2009coco.pdf ● 그루비 창시자 James Strachen의 Scala 언급 http://en.wikipedia.org/wiki/Groovy_(programming_language)#History
  92. 92. * Reference (계속) [book] ● Programming In Scala, Martin Ordersky, ● Programming Scala, The Pragmatic Bookshelf [국내서 번역 중] ● Scala by Example, ● The Early History of Smalltalk, Alan Kay http://gagne.homedns.org/~tgagne/contrib/EarlyHistoryST.html ● Growing a Language, Guy Steele ● 소트웍스 앤솔러지, 위키북스, 2009년
  93. 93. 감사합니다! i015005@gmail.com

×