2023-2학기/프로그래밍언어
-
[프언] #11. Type System2023-2학기/프로그래밍언어 2023. 12. 4. 20:57
Safe / Unsafe 소스 코드를 받아 그 코드를 실행하는 프로그램, 혹은 환경을 Interpreter, 인터프리터라고 부릅니다. 지금까지 저희가 개발한 프로그래밍 언어는 소스 코드를 인터프리터에 넣었을 때 정상적으로 실행될지, 실행에 실패할지 판단할 수 있는 능력이 없습니다. 인터프리터가 실행할 수 없는 소스 코드를 Unsafe Program이라고 합니다. 예를 들어, 아래와 같은 프로그램들은 전부 Unsafe Program입니다. if 3 then 88 else 99 위 프로그램은 3이 Boolean이 아니기 때문에 실행될 수 없습니다. Let x = iszero 0 in (3 - x) 위 프로그램은 - 기호가 Boolean에 대해 정의되어 있지 않기 때문에 실행될 수 없습니다. 어떤 프로그램이 ..
-
[프언] #10. Concrete/Abstract Syntax2023-2학기/프로그래밍언어 2023. 11. 20. 16:10
Concrete Syntax 모든 문자열의 집합 $S$를 생각해보겠습니다. "1123aaaaa5"도 $S$의 원소일 것이고, "let x = 10 in x + 2"도 $S$의 원소일 것이고, 제가 쓰고 있는 이 글도 $S$의 원소일 것입니다. 어떤 프로그래밍 언어의 Syntax를 정의할 때 보통 $S$의 부분집합 $P$를 정의하는 방식을 사용합니다. 어떤 문자열이 $P$의 원소이면 프로그램인 것이고, $P$의 원소가 아니라면 프로그램이 아닌 것이죠. Syntax의 정의에서 짐작할 수 있듯, 어떤 문자열이 $P$의 원소라는 것을 확인함으로서 이 문자열이 프로그램이라는 사실을 입증해줄 수는 있지만 이 프로그램이 어떤 동작을 하는지는 알 수 없습니다. 이를 Concrete Syntax라 합니다. Abstrac..
-
[프언] #09. Records & Pointers2023-2학기/프로그래밍언어 2023. 11. 20. 15:27
이번 글에서는 C에서의 Struct와 Pointer와 유사한 기능을 한번 추가해보겠습니다. Record Record는 어떤 데이터가 특정한 형태를 가질 때, 이를 묶어서 편리하게 처리할 수 있도록 만들어진 데이터 형식 중 하나입니다. C의 구조체, 오브젝트 등이 바로 Record입니다. 먼저 저희가 제작하고 있는 언어에서 Record를 어떻게 정의하고 호출해야 할 지를 정해야 합니다. 이 언어에서 변수를 정의할 때는 let을 사용했었습니다. let x = 10 in x + 2 이와 비슷하게 아래와 같이 Record를 정의하고 호출하는 방법을 생각할 수 있겠네요. let student = {id := 20231111, age := 20} in student.id + student.age Syntax를 조금..
-
[프언] #08. States2023-2학기/프로그래밍언어 2023. 10. 19. 07:58
이번 글에서는 저희 언어에 State를 한번 추가해 볼 겁니다. let f = proc x x in f (f 1) 이런 프로그램을 실행할 때, 저희는 f가 2번 호출된다는 사실을 알 수 있습니다. 하지만 프로그램은 f가 몇 번 호출되는지 알 길이 없습니다. 왜냐하면 Procedure는 Caller에게 결괏값만을 제공할 뿐, 그 외의 행동은 하지 않기 때문입니다. let count = 0 in let f = proc x (let count = count + 1 in x) in let a = f (f 1) in count 따라서 이런 식으로 변수를 따로 만들어서 f가 호출된 횟수를 세는 것은 가능하지 않습니다. 이번 글에서는 이것이 가능하도록, Procedure가 Procedure 외부에 있는 값들을 수정할..
-
[프언] #07. Lexical Scoping of Variables2023-2학기/프로그래밍언어 2023. 10. 17. 00:14
Static Scope 이전 글에서 Static Scoping을 사용해 정의된 Procedure에서 Environment는 Procedure가 정의된 시점의 Environment를 따른다고 했었습니다. 이렇게 Static Scoping을 사용하면, 어떤 변수에 대한 Scope는 Static 한 성질을 가집니다. 갑자기 모르는 말이 나와서 당황하셨을 분들을 위해 설명드리겠습니다. 어떤 변수의 Scope라는 것은, 이 변수를 사용할 수 있는 범위라는 뜻을 가집니다. 모든 변수는 자기 자신만의 Scope를 가집니다. 프로그램 전체에서 사용 가능한 변수도 있고, 특정 Expression 내부에서만 사용할 수 있는 변수도 있는 법이니깐요. 어떤 성질이 Static 하다는 것은, 그 성질은 프로그램을 굳이 돌려보지..
-
[프언] #06. Procedures2023-2학기/프로그래밍언어 2023. 10. 16. 22:20
저번 글에서 프로그래밍 언어를 하나 설계하는 것을 시작했고 Value, Environment, Expression 등을 정의해보았습니다. 이번 글에서는 이를 더 확장해서 Procedure라는 것을 한번 정의해보겠습니다. Procedure Procedure란, 다른 프로그래밍 언어에서 함수의 역할을 하는 Value입니다. let f = proc (x) (x - 11) Procedure를 정의하기 위해서 "proc"이라는 단어를 사용하며 첫번째 괄호에는 이 함수의 입력값을, 두번째 괄호에는 출력값을 적어줍니다. 위의 예시에서 $f$라는 Procedure는 x를 받아 x-11을 출력하는 함수와 같이 작동합니다. let f = proc (x) (x - 11) in (f 77) 이 Procedure를 Call하기..
-
[프언] #05. Expressions2023-2학기/프로그래밍언어 2023. 9. 25. 21:39
이번 글에서는 이때까지 배웠던 지식을 바탕으로 프로그래밍 언어 하나를 설계해보도록 하겠습니다. Values & Environment Scala와 유사하게 프로그램을 Expression으로 정의할 것인데요. 편의를 위해 저희가 만드는 프로그래밍 언어에는 딱 2가지 Value, Integer와 Boolean만 존재한다고 생각합시다. $$v\in \textbf{Val} = \mathbb{Z}+ \mathit{Bool}$$ 이제 Value를 정의했으니 이에 대한 연산에 대해 한번 생각해보겠습니다. 예를 들어 x에 10을 더해 그 값을 y에 저장한다고 생각을 해 봅시다. 이 때, 계산한 값을 y에 저장하려면 y는 그 값이 바뀔 수 있는 Variable이여야 하며 이 Variable은 Pre-assigned, 이전..
-
[프언] #04. Functional Programming2023-2학기/프로그래밍언어 2023. 9. 24. 22:39
Pure Function 본론으로 들어가기 전에 Pure Function이 뭔지부터 짚고 넘어가도록 합시다. int foo(int* a, int* b) { *a = *b + 10; return *a + 2; } int bar(int a, int b) { return a + b + 2; } 위와 같은 C++ 코드에서, foo 함수는 리턴값을 계산하는 것 외에도 a에 저장된 값에 b에 저장된 값과 10을 더하는 역할을 수행합니다. 즉, 함수를 실행하게 되면 a의 값이 바뀌게 됩니다. 반면 bar 함수는 리턴값을 계산하는 것 외에 a와 b에 저장된 값을 바꾸지는 않습니다. 이렇게 현재 상태를 변경시키지 않고 리턴값만 계산하는 함수를 우리는 Pure Function이라고 부릅니다. Functional Progr..