OCaml Basic
- OCaml의 소스코드 확장자는 ".ml"
- OCaml의 컴파일러(compiler)는 "ocamlc"
- OCaml의 build system은 "dune"
- OCaml은 명시적인 main 함수가 존재하지 않습니다.
Q. 실습환경 구축에서 다운 받은 opam은 뭔가요?
A. 걔는 패키지 매니저입니다.
프로그래밍 언어에서 타입은 뭔가요?
- 타입은 값의 집합으로 이해합니다.
-> 하나의 타입은 특정 집합에 속한 값을 표현합니다.
e.g.
- value 3은 int type ⇒ 3은 int set의 원소
- 변수 x는 char type ⇒ 변수 x는 char set의 원소를 저장하는 공간
- 표현식 x + 1.2는 float type ⇒ 표현식 x + 1.2의 연산 결과는 float set의 원소
- function foo의 return type은 void ⇒ 함수 foo의 반환 값은 공집합인 void의 원소 (foo는 어떤 것도 return 하지 않음)
Primitive types
Unit
unit type은 "()" 하나로 구성된 singleton 집합입니다.
- "아무것도 없음"을 나타내는 값입니다.
- OCaml의 모든 표현식은 반드시 값으로 계산합니다.
- 필요에 따라 값이 필요가 없는 경우도 있습니다.
- 이 경우 "()"값을 통해 "없음"을 표현합니다.
int
int type은 모든 정수의 집합입니다.
- int type의 내장 연산자는 아래와 같습니다.
- Unary arithmentic: - (sign)
- Binary arithmentic: +, -, *, /, mod
- Unary bitwise: lnot
- Binary bitwise: lsl, lsr, asl, asr, land, lor, lxor
float
float type은 모든 실수의 집합입니다.
- float type의 내장 연산자는 아래와 같습니다.
(C, Java 등에서 사용했던 연산자와 다르게 생김을 유의해야 합니다)
- Unary arithmentic: -.
- Binary arithmentic: +., -., *., /.
※ OCaml 에서는 int와 float 사이의 연산이 불가능합니다
반드시 타입 변환이 필요하기 때문에!! 다음과 같은 연산자를 사용합니다.
- type 변환 내장 함수
- int_of_float: float -> int
- float_of_int: int -> float
char
char type은 모든 문자의 집합입니다.
- Escape sequence (다른 언어들과 거의 같습니다.)
- \: backslash character
- \': single quote
- \": double quote
- \t: tab
- \r: carriage return
- \n: line feed
- \b: backspace
- \space: space
- \ddd: the character with ASCII code ddd in decimal
- \xhh: the character with ASCII code hh in dexadecimal
- \o000: the character with ASCII code 000 in octal
string
string type은 모든 문자열의 집합입니다.
※ OCaml은 string type이 built-in type입니다!!
bool
bool type은 true와 false로 이루어진 집합입니다.
※ OCaml은 C, C++과 다르게 0,1이 호환되지 않습니다!!
- bool 값을 return하는 비교 연산자
- x < y: x is less than y
- x > y: x is greater than y
- x <= y: x is less than or equal to y
- x >= y: x is greater than or equal to y
- x = y: x equals y (structural equality)
- x <> y: x does not equals y (structural equality)
- x == y: x is identical with y (physical equality)
- x != y: x is not identical with y (physical equality)
x = y와 x == y는 무슨 차이인가요?
- x = y 는 x와 y의 값을 비교합니다
- x == y는 x와 y의 memory address를 비교합니다
C, C++처럼 pointer를 사용하지 않습니다.
따라서 Ocaml에서는 memory address에 접근할 일이 잘 없기 때문에
structural equality에 해당하는 비교 연산자를 주로 사용할 예정이에요.
Basic Compilation using Dune
컴파일을 할 때 빌드 시스템인 dune을 이용합니다.
Directory 내 Dune file을 다음와 같이 작성 (dune)
한 줄 한 줄 설명해보겠습니다.
- (include_subdirs unqualified)
- 현재 directory 및 하위 directory의 모든 소스 파일을 "같은 수준"의 코드로 간주하여 컴파일 할 거예요.
- (executable (name helloworld)):
- helloworld.ml 파일을 프로그램의 entry point(main)으로 간주하고 컴파일 할 거예요.
라는 의미입니다.
지금까지 써왔던 C, C++, Java 같은 언어에서는 이런 작업이 필요하지 않았기에 꽤나 생소합니다. 그러니까 연습을 해야겠습니다.
- helloworld.ml 작성 후 directory 구조는 아래와 같습니다.
Q. dune-project 파일은 뭐하는 애인가요?
A. 프로젝트의 메타 데이터를 작성하는 파일입니다!
> dune build helloworld.exe
- 컴파일 후 directory 구조는 아래와 같습니다.
> _build/default/hello_world.exe
- 컴파일과 실행을 한 번에 수행할 수도 있습니다.
> dune exec ./helloworld.exe
※ exec 명령어는 프로그램을 컴파일하여 바이너리를 생성한 후 실행합니다.