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

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

ProgrammingLanguages

목록 보기
3/4

OCaml Basic

  • OCaml의 소스코드 확장자는 ".ml"
  • OCaml의 컴파일러(compiler)는 "ocamlc"
  • OCaml의 build system은 "dune"
  • OCaml은 명시적인 main 함수가 존재하지 않습니다.

Q. 실습환경 구축에서 다운 받은 opam은 뭔가요?
A. 걔는 패키지 매니저입니다.

프로그래밍 언어에서 타입은 뭔가요?

  • 타입은 값의 집합으로 이해합니다.
    -> 하나의 타입은 특정 집합에 속한 값을 표현합니다.
    e.g.
    1. value 3은 int type ⇒ 3은 int set의 원소
    2. 변수 x는 char type ⇒ 변수 x는 char set의 원소를 저장하는 공간
    3. 표현식 x + 1.2는 float type ⇒ 표현식 x + 1.2의 연산 결과는 float set의 원소
    4. 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입니다!!

  • 때문에 string type의 내장 연산자 또한 존재합니다.

    • ^: string concatenation
      e.g. "Hello" ^ "World" ⇒ "Hello world"
    • .[n]: random access
      e.g. "Hello".[1] ⇒ 'e'
  • 유용한 Library Module로 String이 있기는 합니다.

    • String.length: 문자열 길이 반환
      e.g. String.length "Hello" ⇒ 5
    • String.sub: subsstring 반환
      e.g. String.sub "Hello" 2 3 ⇒ "ll"

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)

한 줄 한 줄 설명해보겠습니다.

  1. (include_subdirs unqualified)
    • 현재 directory 및 하위 directory의 모든 소스 파일을 "같은 수준"의 코드로 간주하여 컴파일 할 거예요.
  2. (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 명령어는 프로그램을 컴파일하여 바이너리를 생성한 후 실행합니다.

0개의 댓글