ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • imperative vs. functional language
    Programming 2018. 4. 18. 00:58

    한동안 functional language 쓰다가 imperative language를 쓸때의 당혹감


    가장 큰 문제는 생각하는 방법을 모르겠다는 것이였다. 전역변수를 선언한다는 게 이해가 안갔고, for문을 어떨때 사용해야하는 건지도 모르겠고, backtracking에서 일반적으로 하는 방식인 visit배열 선언과 dynamic programming 을 위한 배열선언 두가지 방식이 가장 낯설었다 .mutable 배열을 선언한다는 생각을 1도 못했다. 


    functional 사고방식에서 imperative 사고방식 (명령어 언어)으로 전환하기 위한 방법, 도대체 둘이 뭐가 다른거야? 라는 질문에 스스로 답해보고자 한다.


    1. mutable vs. immutable

    함수형언어에서는 변수나 함수를 새로 만들 수는 있어도, 기존의 것을 변경할 수는 없다

    그래서 for문에서 i++와 같은 구문도 존재할 수 없고, 전역변수 혹은 변수의 scope 개념이 없다. 


    그러나 backtracking시 일반적으로 visit이라는 배열을 선언해서 해당영역을 방문했음을 표시하고, 

    이방법이 아니다 싶으면 backtracking해서 해당영역에 표시를 없애주는 일을 해준다. 

    함수형언어에서는 array, list등 대부분 mutable 이기 때문에 배열의 값을 바꾼다는 생각이 존재하지 않는다. 


    1-1. list, array, 2D array

    type Cons<'a> =

    | Cons of 'a * Cons<'a>

    | Nil


    2차원 배열을 굳이 표현하지만 map<int*int> 를 표현할 수 있다. 



    2. recursive function

    함수도 일종의 값이기 때문에 함수형언어에서 리커전을 생각해내는데에 어려움이 없다. 그러나 C에서는 리커전을 쓰는게 어색했다. C에서는 함수가 값을 의미학 보다는 명령들의 나열에 가까운데 이에 리커전이 포함되면 프로그램이 어떻게 진행되는지 상상하는게 불가능에 가까웠다. 머리가 나빠서그런가보다. 

    같은 맥락으로 for문을 사용할 줄 몰랐다. 완전탐색을 하기위해 2차원배열을 순환하려고 이중 for문을 쓰는 점이 나에게는 너무 충격이여서 메모를 해놓아야할 정도였다. 



    3. side effect

    함수가 값을 반환하지 않고, 다른 곳에 있는 값만 변경시키고 종료된다는 사실이 낯설었다. 예를들어 answer라는 전역변수로 선언하고, void solve()함수에서 답을 구한다. solve함수가 종료되고나면 전역변수인 asnwer에 답이 저장되어있는것이다!!

    전역변수 선언하면 확실히 코딩을 쉽게 할 수 있다. 근데 문제는 잘 구현해야 된다. 알고리즘 문제는 간단해서 상관없지만 프로젝트에서는 너무나도 쉽게 코딩오류를 저지를 수 있는 부분이다.


    'Programming' 카테고리의 다른 글

    Visual studio 환경 세팅  (0) 2017.06.24
    fsharp compiler, interpreter 작업환경  (0) 2017.04.21
    python 코딩  (0) 2017.01.31
    C++ 문자열 및 파일  (0) 2016.06.07
    sourceforces 158B - 10  (0) 2016.05.19
Designed by Tistory.