본문 바로가기

Programming Project/FunctionalProgrammingPrinciples in Scala

Lecture 1.1 - Programming Paradigms (Functional Programming Principles in Scala / Coursera 강의 정리)


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

https://www.coursera.org/learn/progfun1/home/welcome

너무 조하요 강의 짱짱!

 

함수형 프로그래밍의 패러다임을 공부 할 것. 

완전 새로운것이다 (!!!! NEW !!!!)

 

패러다임의 의미를 살펴보면, 과학에서의 패러다임은 독립적인 개념이나 과학적 원리의 사고 패턴을 의미한다.

프로그래밍에서는 크게 세가지의 프로그래밍 패러다임이 있다.

우선 imperative programming (명령형 프로그래밍)이다. (Java , C 등이 여기에 해당한다)

그리고 functional programming이 있으며 (우리가 이제 배울 것)

잘 알려지지는 않았지만 logic programming이 있다.

 

객채지향 프로그래밍이 새로운 패러다임이라고 말하는 사람도 있지만, 교수님 생각에는 저 세가지 패러다임에 전반에 걸쳐있는 개념이라고 생각하신단다. 

 

 

Imperative programming이 무엇인지 알아보자.

명령형 프로그래밍은 값을 바꿀 수 있는 변수(int, char 등등 우리가 써오던 그 변수)를 assign하고 변경하는 것에 대한 것이다.

이 것들이 if-then-else, loops, break, continue , return 등으로 엮여있다.

 

가장 잘 알려진 Imperative program은 폰 노이만 컴퓨터이다. 반드시 프로세서와 메모리로 구성되며, 메모리에서 프로세스로 넘겨주는 Bus가 있다.

 

폰 노이만 컴퓨터는 다음 쌍에 대해서 강한 상관성이 존재한다

메모리 셀과 프로그래밍 언어의 변수가 대응된다.

변수 역참조(dereferences)는 load 명령(instructions)과 대응된다.

변수 할당(assignments)은 store 명령(instructions)과 대응된다.

control구조는 jumps 와 대응된다.

 

이렇게 잘 번역이 되지만, 규모가 점점 커지니 문제가 생겼고, (어셈블리 언어로 규모가 큰 큰 프로그래밍을 하는 것을 생각해보면 될 듯)

 

우리는 프로그램을 글자 하나하나에 매칭시켜려고 하지 않고, 좀더 큰 구조에서 사고하려고 한다. 라는 개념을 John Backus가 주장했다! (사실상 처음으로 고수준 언어의 발명자이다) 그렇게 포트란이 나왔으며, 시간이 좀 더 지나자, 전통적인 명령형 프로그래밍 동작이 힘을 잃고 새로운 필요성이 대두되었다. 그 때 제시된 것이 함수형 프로그래밍이다. 

 

 

John Backus는 폰노이만 bottleneck에 의해 한계에 다다를 것이라고 주장했다. 폰노이만 bottleneck이란, 데이터 구조를 하나 하나 1:1 대응하는 것을 말하며, 만약 규모를 늘리려 한다면 collections, polynomials(다항식), geometric shapes(기하 도형), strings, documents와 같은 고수준의 추상화 정의와 이를 묶어줄 이론(Theory)이 필요하므로 힘들 것이라는 의견이었다.

그렇다면 Theory(이론)이란 무엇일까?

수학에서 Theory이란 하나 혹은 그 이상의 데이터 타입, 이 타입들에 대한 동작들, values와 operations사이의 관계를 설명할 수 있는 법칙들로 구성되어 있다. 여기에서 중요한 것은, 일반적으로 theory는 mutations에 대해 다루지 않는다는 것이다. mutation은 내가 무엇을 바꿨을 때, 그 정체성은 동일하게 유지되는 것을 의미한다. 

위 슬라이드에 오타! (a+c)*x 이다

예를들어, polynomials의 theory는 두 polynomials의 덧셈을 다음과 같이 정의한다. 같은 차수를 묶어서 계산을 한다던가 하는 등의 이론이 존재한다. 그러나 theory는 다항식의 coefficient(계수)를 바꿔가며 polynomial을 동일하게 유지하는 연산은 정의하고 있지 않는다. (컴퓨터의 대입 연산같은)

 

string을 이어붙이는 연산 ++이 있다고 해 보자. 연결을 위한 law은 string들을 이어붙이는 것이다. theory에서는 문자열 원소의 값을 바꾸는 연산자는 정의하지 않는다. (그치만 명령형 프로그래밍에서는 문자열, 숫자(int)등을 바꾼다. 

 

이것들이 수학적인 theory에 대해 살펴본 것이며, 만약 이를 수학적 이론에 맞게 high level로 구현하려 한다면 mutation은 일어나지 않아야 한다. 우선, theory는 mutation연산자를 갖도록 허용하지 않으며 만약 mutation을 사용하게 된다면 많은 유용한 theory laws를 파괴하게 된다.

그렇기 때문에 새로운 스타일의 프로그래밍 방향으로 향하게 된다.

-function으로 표현되는 연산자들을 위한 theories를 정의하는 것에 집중하며 

-mutations를 사용하지 않으려고 하고 (int a = 3; a = 4;와 같이 재 할당하거나 a++등의 행위를 하는 것)

-이를 통해 더욱 강력하게 함수를 추상화(abstract)하고 합성(compose)할 수 있게 된다.

 

요게 함수형 프로그래밍의 시작이다.

 

 

함수형 프로그래밍을 바라보는 두가지 관점이 있는데, 하나는 엄격한(restructed) 관점이고 하나는 관대한(wider) 관점이다.

제한적인(restructed) 관점에서는, 값이 변하는 변수가 없고, 그 변수들에 값을 할당하는 것이 없으며, loops나 명령형 제어 구조가 없다. 그래서 이 상태에서는  함수형 프로그래밍은 많은 것을 빼앗아 간다.

관대한(wider)  관점에서는 함수형 프로그래밍은 프로그램에서 함수에 좀더 초점을 맞추는 것을 의미하게 된다. 함수들을 사용할 수 있는 새로운 가능성을 준다. 함수는 변수가 될 수 있으며, 변수처럼 생산되고, 소비되고, 합성될 수 있다. (이건 모든 프로그래밍 언어에서 가능하지만, 함수형 프로그래밍 언어에서는 더 쉽게 될 수 있다)

 

이제 함수형 언어를 엄격한 관점과, 보다 관대한 관점으로 바라볼 수 있다. 

엄격한 관점에서의 함수형 프로그래밍에서는 가변 변수와 assignment, 명령형 제어 구문이 없으며

관대한 관점에서의 함수형 프로그래밍은 함수에 중점을 둔 멋진 프로그램 개발을 가능하게 한다.

 

특히 함수형 프로그래밍에서 함수는 1급 객체(first-class citizens)이다.

이 말은, 근본적으로 함수를 data다루듯 할 수 있다는 의미이다.

문자열을 어디에서나 정의할 수 있듯, 함수도 그러하다. 함수 안에 다른 함수를 정의 할 수도 있다.

변수들처럼 함수를 다른 함수의 매개변수로 넘길 수 있으며

변수들처럼 함수를 더 큰 함수로 합성하는 연산자 또한 있어야 한다.

 

JavaScript도 wider sense에서는 비슷한 기능을 제공한다고 한다.

위는 제한적인 / 넓은 의미의 함수형 프로그래밍의 종류들이다.

위는 함수형 프로그래밍 언어들이 등장한 역사..

 

추천하는 책 1번

다운로드 링크

 

추천하는 책 2번

 

추천하는 책 3번

자바에 대해 아는 사람들에게 스칼라를 빠르게 알려줌

다운로드 링크

 

 

함수형 프로그래밍을 배워야 하는 이유 중 하나는 멀티코어와 클라우드 컴퓨팅에서 병렬성을 잘 활용할 수 있다는 점이다.

 

더 알아보고 싶으면

Working hard to keep it simple을 보자.

https://www.youtube.com/watch?v=3jg1AheF4n0

 

FP가 Imperative programming보다 어떤 면에서 Concurrency, parallelism에 좋은지에 대해 소개하는 부분이 인상적이다.