프로그래밍언어개론 - 1. Introduction to OCaml (1)

ensalada.de.pollo·2024년 3월 9일
0

ProgrammingLanguages

목록 보기
2/4
post-thumbnail

OCaml이란?

: Objective Caml을 의미합니다.

Caml

: Caml은 ML family에 속하는 프로그래밍 언어입니다.

특징은 아래와 같습니다.

  1. Functional Programming Language
  2. Strongly Typed Language
  3. Type Inference
  4. Polymorphism
  5. Pattern Matching
  6. Module System

위의 특징들을 하나하나 다뤄보겠습니다.

1. Functional Programming Language

: 이는 함수가 first-class values(1급 객체)임을 의미합니다.

아래 3가지 조건을 충족하면 1급 객체라고 합니다.

  • 변수나 데이터에 할당될 수 있어야 한다.
    : C, Java, C++등의 언어는 void 타입의 함수를 변수에 할당하지 못합니다.
    하지만 Ocaml은 변수에 함수를 묶을 수 있습니다.

  • 객체의 반환 값으로 반환될 수 있어야 한다.
    : C, Java, C++등의 언어는 함수의 반환 값으로 함수 타입을 반환하지 못합니다.
    하지만 OCaml은 함수의 반환 값으로 함수 타입을 반환할 수 있습니다.

  • 객체의 인자로 넘어갈 수 있어야 한다.
    : C, Java, C++등의 언어는 함수의 인자로 함수 타입을 넘겨주지 못합니다.
    하지만 OCaml은 함수의 인자로 함수 타입을 넘겨줄 수 있습니다.

OCaml은 세 가지 조건 모두를 만족할 수 있어 함수를 1급 객체라고 칭합니다.

2. Strongly Typed Language

: 이는 모든 변수 및 표현식의 타입이 "컴파일 시점"에 결정됨을 의미합니다.
반대의 예시로는 런타임에 타입이 결정되는 파이썬이 존재합니다.

3. Type Inference

: 이는 타입 시스템이 변수 및 표현식의 타입을 추론할 수 있음을 의미합니다.
OCaml에서는 변수의 선언에 타입을 붙이지 않습니다.
대신 타입 시스템이 타입을 추론해 변수에 타입을 붙여줍니다.

4. Polymorphism

: 이는 데이터 구조 및 알고리즘을 일반적으로 구현할 수 있음을 의미합니다.
타입을 컴파일 시점에 추론을 해주기 때문에 자료 구조 및 알고리즘이 일반적으로 구현될 수 있습니다.
(e.g. Java에서 오버로딩을 이용해야 하는 경우, OCaml에서는 타입을 명시하지 않기 때문에 일반적인 구현이 가능합니다.)

5. Pattern Matching

: 이는 Case 분석을 지원함을 의미합니다.
OCaml의 match with 구문이 이에 해당합니다. match with 구문은 OCaml의 문법을 다룰 때 자세하게 소개하겠습니다.

6. Module System

: 이는 프로그램을 여러 모듈로 나누어서 구현할 수 있음을 의미합니다.
OCaml로 작성된 모든 소스파일은 모듈화가 되어 모듈로 사용이 가능합니다.

OCaml

OCaml은 Caml에 객체지향개념을 추가해 확장한 버전입니다.
따라서 Caml과 다르게 객체지향에서 추가된 다음과 같은 특징들이 있습니다.

  • Data abstract
  • Inheritance and reuse
  • Separate compilation
  • ...

왜 OCaml을 사용하나요?

  • 함수형 언어의 유용한 특징을 다양한 언어에서 사용하는 추세입니다.
    - e.g. C++, Java 등 프로그래밍 언어에서 람다 표현식(Lambda Expression)을 도입했습니다. 이와 함께 다양한 함수형 라이브러리를 활용 코드를 보다 간결하고 명확하게 작성할 수 있습니다.
  • OCaml은 대표적인 함수형 언어 중 하나로, 다양한 곳에서 활용이 됩니다.

Example (OCaml 맛보기)

  1. 짝수 선별 예제

C

int main() {
  int arr[10] = {1, 2, 3, 4, 5, 6};
  int even_arr[3];
  int index = 0;
  // Filtering
  for (int i = 0; i < 10; ++i) {
    if(arr[i] % 2 == 0) {
      even arr[index++] = arr[i];
    }
  }
  // Printing
  for (int i = 0; i < 3; ++i) {
    printf("%d ", even_arr[i]);
  }
  return 0;
}

OCaml

let _ =
  let arr = [1;2;3;4;5;6] in
  let res = List.filter
    (fun x -> (x mod 2) = 0) arr
  in
  List.iter
    (fun x -> Format.print "%d " x) res
  1. 최대공약수 계산 예제

C

int gcd (int a, int b) {
  int r = a % b;
  if (r == 0) return b;
  else return gcd(b, r);
}

OCaml

let rec gcd a b =
  let r = a mod b in
  if r = 0 then b
  else gcd b r

0개의 댓글