본문 바로가기

CS/프로그래밍언어개론(OCaml)

[프로그래밍언어개론] OCaml basic - 1

 

 

Ocaml?

OCaml은 Caml에 객체지향(OOP)개념을 추가하여 확장한 프로그래밍 언어이다.

아래는 OCaml언어의 대표적인 특징이다.

📝 특징

🔍 Functional programming language

함수는 first-class values (함수도 변수처럼 사용 가능하다)

🔍 Strongly typed language

모든 변수 및 표현식의 타입은 컴파일 시점에 결정

🔍 Type inference

타입 시스템이 변수 및 표현식의 타입을 추론

🔍 Polymorphism

데이터 구조 및 알고리즘을 일반적으로 구현

🔍 Pattern matching

Case 분석 지원

🔍 Module system

프로그램을 여러 모듈로 나누어 구현

 

Primitive types

1. unit

unit 타입은 "()" 하나로 구성된 singleton 집합이다. "아무것도 없음"을 나타내는 값으로 C/C++, Java의 void타입과 유사하다. OCaml의 모든 표현식은 반드시 값으로 계산되고 존재한다. 따라서 C/C++, Java의 void와는 다르게 unit이 반환되면 "아무것도 없음"을 나타내는 값이 반환된 것이다. C/C++, Java의 void처럼 아무것도 반환하지 않는 것이 아니다.

 

() 값을 통해 "아무것도 없음" 을 표현한다는 것을 기억하면 좋을 것 같다.

 

2. Int

int 타입은 모든 정수의 집합이다.

3. float

float 타입은 모든 실수의 집합이다.

4. char

char 타입은 모든 문자의 집합이다.

 

5. bool

bool 타입은 true와 false로 이루어진 집합이다. 여기서 조심해야 할 부분이 있다. 아래 그림을 확인해보자.

위 그림을 보면, 같은 값을 가지는 List에 대해 '='와 '=='의 결과가 다른 것을 확인할 수 있다. 그 이유는 OCaml의 '='는 structural equality(구조적 동등성)을 확인하고 '=='는 physical equality(물리적 동등성)을 확인하기 때문이다. 따라서, '='의 경우 비교하는 두 리스트의 값이 같기 때문에 true를 반환하고, '=='의 경우 두 리스트의 물리적인 주소, 즉 두 리스트 자체가 서로 같은 지를 검사하기 때문에 false를 반환하는 것이다.

 

Basic compilation using Dune

1. Dune?

Dune이란, C/C++의 Makefile과 같이 OCaml 프로젝트를 쉽게 컴파일하고 실행할 수 있도록 도와주는 빌드 시스템이다.

 

2. How to use?

Dune을 사용하여 프로그램을 컴파일하는 기본적인 방법은 다음과 같다.

우선 실행하고자 하는 파일 디렉토리 내에 dune 파일을 생성한 후, 아래와 같이 작성한다.

(inclue_subdirs unqualified)
(excutable (name hello_world))

▶ (inclue_subdirs unqualified) :

     현재 디렉토리를 포함하여 하위 디렉토리의 모든 소스파일을 하나의 프로젝트 코드처럼 간주한다는 의미이다.

     좀 더 쉽게 말하자면, 현재 디렉토리 아래의 모든 .ml파일들을 하나의 폴더 안에 있는 것처럼 취급한다는 의미이다.

▶ (excutable (name hello_world)) : 

     hello_world.ml 파일을 프로그램의 entry point(다른 언어의 표현으로 main)로 간주하고,

     실행가능한 바이너리 파일로 컴파일한다.

 

이렇게 작성한 dune 파일에 대하여 아래 명령어를 실행하면 hello_world.ml 파일을 .exe 파일로 컴파일 할 수 있다.

dune build hello_world.exe

명령어 실행 후, 디렉토리의 파일 구조를 살펴보면 다음과 같다.

이렇게 생성된 실행파일(hello_world.exe)을 실행하기 위해서는 아래 명령어를 한번 더 작성해야 한다.

_build/default/hello_world.exe

그러나 위와 같은 방식은 (compile -> execute) 과정을 두 번에 나누어서 진행하기 때문에 코드를 수정할 때마다 두 번의 명령어를 작성해야 한다.

 

따라서 코드를 수정해야 할 일이 많을 경우, exec이라는 명령어를 활용한다.

dune exec ./hello_world.exe

exec 명령어를 수행하면 (compile -> execute) 과정을 한 번에 진행하기 때문에 좀 더 편하게 사용 가능하다. 물론, 시간은 더 오래 걸릴 수 있다.

 

Statement? Expression?

Statement? Expression?

Statement(구문)와 Expression(표현식)은 프로그래밍 언어의 구성 요소이다. 언어에 따라 statement와 expression이 명확하게 분리되지 않는 경우도 존재하지만 우선 일반적인 경우를 확인해보자. 

📝 Feature of (Statement & Expression)  

🔍Statement

▶프로그램의 동작을 수행하는 코드이다. 값을 반환하지 않는 코드라고 이해하면 편하다.

🔍Expression

▶값으로써 계산되는 코드이며, 값을 반환하는 코드이다.

▶실행 전과 실행 후의 메모리 상태가 동일하다.

Expression의 특징을 살펴 보면 "실행 전과 실행 후의 메모리 상태가 동일하다" 라는 특징이 있다. OCaml의 변수는 기본적으로 Immutable(불변성)한 특성을 가지고 있다. 따라서, OCaml의 대부분의 코드들은 expression으로 이루어져 있다. 그렇다고 해서 OCaml이 expression으로만 구성되는 pure functional language(순수 함수형 언어)인 것은 아니다.

 

다음 게시글에서는 OCaml의 comment, I/O, variable, function, let-in 등등 OCaml언어의 기본적인 내용들을 알아보자.