Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

영우

함수형 프로그래밍은 왜 레이스 컨디션이 발생하지 않을까? 본문

CS

함수형 프로그래밍은 왜 레이스 컨디션이 발생하지 않을까?

duddn 2024. 6. 4. 21:23

made by GPT

왜 그럴까요?

  • 함수형 프로그래밍에서는 데이터가 불변이라 업데이트가 일어나지 않기 때문에 스레드가 어떤 시점에서 데이터를 읽더라도 같은 데이터임을 보장받을 수 있습니다.
  • 함수형 프로그램에서는 순수함수를 사용하기 때문에 외부상태에 관계없이 같은 인자로 함수를 실행하면 같은 결과를 보장받습니다.

함수형 프로그래밍이란 무엇인가요?

  • 함수형 프로그래밍은 프로그램을 함수로 구성하는 패러다임입니다.
  • 함수를 순수함수로 작성합니다.
    • 순수함수는 부수효과가 없는 함수로, 함수의 실행이 외부에 영향을 끼치거나 영향을 받지 않습니다.
    • 평가시점과 무관하게 같은 입력에서 항상 같은 결과를 반환합니다.
  • 문(statement)을 사용해 값을 업데이트하지 않고, 표현식(expression)을 사용해 값을 다른 값에 매핑해 로직을 작성합니다.

명령형 프로그래밍과 무엇이 다른가요?

  • 명령형 프로그래밍은 값을 업데이트하는 일련의 문(statement)로 프로그램을 구성합니다.
    • i, numser[i]는 값이 프로그램이 진행됨에 따라 변경됩니다.
let numbers = [1, 2, 3, 4, 5];

for (let i = 0; i < numbers.length; i++) {
  numbers[i] = numbers[i] * 2;
}
  • 함수형 프로그래밍은 값을 다른 값으로 매핑하는 표현식(expression)을 사용해 프로그램을 구성합니다.
    • 값을 업데이트하는 대신 기존의 값과 매핑되는 새로운 값을 새로운 공간에 저장합니다.
    • numbers와 doubleNumbers는 값이 변경되지 않습니다.
    const numbers = [1, 2, 3, 4, 5];
    const doubleNumbers = [1, 2, 3, 4, 5].map(number=>number*2);
    

함수형 프로그래밍의 장점은 무엇인가요?

  • 코드를 간결하게 작성할 수 있습니다.
  • 입력이외에 다른 스캐폴딩(발판)이 필요하지 않기 때문에 테스트가 쉽습니다.
  • 인자의 값이 같다면 항상 같은 결과를 반환하기 때문에 코딩 및 디버깅이 쉽습니다.
  • 함수형 프로그래밍 언어에서는 함수 자체를 일급객체로 다루기 때문에 함수를 재사용하기 쉽습니다.
    • 일급객체란?
      • 어디든지 사용가능한 객체입니다.
      • 거의모든 프로그래밍 언어에서 숫자를 변수에 담을 수 있고, 함수의 인자로 넘길 수 있고, 함수의 반환값으로 사용할 수 있습니다. 이는 숫자가 일급객체임을 의미합니다.
      • 함수를 변수에 담을 수 있고, 함수를 인자로 사용할 수 있고, 함수 자체를 반환값으로 사용할 수 있다면 함수가 일급객체입니다. 함수형 프로그래밍 언어에서는 보통 함수를 일급객체로 취급합니다.
  • 데이터를 변경할 수 없고, 외부에 영향을 받지 않으므로 동시성 문제가 발생하지 않습니다.

함수형 프로그래밍의 단점이 있나요?

  • 저장공간이 많이 필요합니다.
    • 함수형 프로그래밍에서는 값을 업데이트 할 수 없으므로 매번 다른 저장공간에 실행 결과를 저장해야합니다.
  • 프로그램을 오롯이 함수형 프로그래밍으로 구현하기 힘듭니다.
    • 대부분의 프로그램이 네트워크 통신, 데이터베이스 등을 필요로합니다. 따라서 프로그램 전체를 함수형 프로그래밍으로 구현하기 힘듭니다.

레이스 컨디션이란 무엇인가요?

  • 레이스 컨디션은 여러 스레드의 인터리빙에 따라 프로그램의 결과가 달라지는 것을 의미합니다.
    • 인터리빙이란?
      • 여러 스레드가 교차하며 실행하는것을 의미합니다. A, B 스레드가 동시에 실행될때 각 코드의 실행순서는 다양할 수 있습니다. 인터리빙되었을때 A,B 코드의 실행순서는 보장되지 않고 이로인해 프로그램의 결과가 달라진다면 레이스 컨디션입니다.
    • 위의 이유로 프로그램의 결과가 달라지는 것을 “프로그램이 비결정적이다.”라고 표현합니다.
  • 예시
    • 여러개의 스레드가 있을때, 첫번째 x값이 5라서 if분기 안으로 들어오더라도 두번째 x를 실행하기 전 다른 스레드가 x의 값을 100으로 바꾸어 y가 10이 아닌 200이 될 수 있습니다.
    • 이렇게 프로그램의 결과가 비결정적일때 레이스 컨디션이 있습니다.
    if (x == 5)
    {
       y = x * 2;
    }

'CS' 카테고리의 다른 글

도커는 뭘까?  (0) 2024.06.28
segmentation fault란 뭘까?  (0) 2024.06.12
프레임워크와 라이브러리  (2) 2023.11.20