컴공지식/프로그래밍언어론
-
함수 정의하기컴공지식/프로그래밍언어론 2024. 9. 28. 19:56
함수를 정의하기 위해선 구체적인(concrete) 문법과 추상적인(abstract) 문법을 정의해야 한다.구체적인 문법은 프로그래밍 언어에서 실제로 작성되는 코드 형태이고 추상적인 문법은 코드를 프로그램 내부에서 어떻게 해석하고 처리하는지에 대한 구조다. 우리는 지금까지 단순한 연산 과정인 AE를 거쳐 with를 쓰는 WAE까지 알아봤다.이제 함수가 추가된 형태인 F1WAE를 알아볼 차례이다.이 F1WAE에서는 함수를 다음과 같이 정의할 수 있다.{deffun {twice x} {+ x x}}twice라는 함수를 만든건고, 옆의 x는 파라미터가 된다.그 옆의 괄호는 x와 x를 더하는거다. 그러니 만약 {twice 2}라는 함수가 있다면 4가 반환되는거다. 아무튼 함수 정의는 위처럼 {deffun {id ..
-
Substitution(치환)에 관하여컴공지식/프로그래밍언어론 2024. 9. 22. 22:21
치환은 어떤 코드에서 변수를 다른 값으로 바꾸는 과정을 얘기한다. 일단 다음과 같이 정하고 시작하자x : 나중에 바꿀 식별자5 : 이 값으로 바꿀거임(+ x x) : 식별자가 들어있는 코드, x와 x를 더한다. 근데 이 표현식에서 x를 5로 바꾸는 과정이 필요한데.. 이제 알아보자 다음 코드를 살펴보자{with {x 5} {+ 10 y}}이 코드가 x를 5로 치환하려고 하는 코드다.근데 문제는 이 표현식 안에 x가 없다!+ 10 y라는 표현식에는 x가 들어있지 않기 때문에 치환할 게 없는 상황이다.잘못된 코드라는 거다.. 다음 코드를 살펴보자{with {x 5} {+ x {with {x 3} 10}}}바깥쪽에서 x는 5로 치환되고 있다. 즉, + x 부분의 x는 5로 바뀐다.근데 안쪽 {with {x 3..
-
Scala로 WAE 정의하기컴공지식/프로그래밍언어론 2024. 9. 11. 15:51
WAE의 문법을 Scala의 case class를 사용해 정의할 수 있다. trait Expr case class Num(n: Int) extends Expr case class Add(lhs: Expr, rhs: Expr) extends Expr case class Sub(lhs: Expr, rhs: Expr) extends Expr case class With(name: Symbol, nameExp: Expr, body: Expr) extends Expr case class Id(name: Symbol) extends Expr 각 클래스를 설명하자면,Num(n: Int): 숫자를 나타내는 클래스로 Num(5)는 숫자 5를 의미한다.Add(lhs: Expr, rhs: Expr): 덧셈을 나타내는 클..
-
BNF로 식별자 정의하기컴공지식/프로그래밍언어론 2024. 9. 11. 15:40
식별자를 아무렇게나 지을 수는 없고, 규칙이 있어야 한다. ::= * ::= | ! | $ | _ ::= | ::= a | b | c | ... | z ::= 0 | 1 | 2 | 3 | ... | 9 규칙을 설명하자면,: 식별자는 로 시작하고, 그 뒤에 여러 개의 가 올 수 있다.: 식별자는 반드시 문자(letter), 특수 기호(!, $, _)로 시작해야 한다.: 이후에는 숫자(digit)나 다른 문자가 나올 수 있다. 다음은 규칙의 예시다.x123 // 올바른 식별자 (문자로 시작) $money // 올바른 식별자 (특수 기호로 시작) !value // 올바른 식별자 (특수 기호로 시작) 123abc // 잘못된 식별자 (숫자로 시작)
-
Bound and Free Identifiers (바운드/자유 식별자)컴공지식/프로그래밍언어론 2024. 9. 11. 15:30
식별자(Identifier)에 대해 더 깊이 들어가 보자.식별자에는 바운드 식별자(Bound Identifier) 와 자유 식별자(Free Identifier) 라는 개념이 있다. 바운드 식별자는 프로그램 내에서 값이 바인딩된(할당된) 식별자다.즉, 어떤 값에 연결된 변수라고 보면 된다.예를 들어, with 구문에서 변수가 값을 할당받으면 그 변수는 바운드 식별자가 된다.with {x {+ 1 2}} {+ x x} 여기서 x는 with 구문에서 {+ 1 2} 로 정의되고, 이는 3으로 계산된다. 이제 x는 3이라는 값에 바운드된 식별자가 된 거다.이후 x는 3으로 해석돼서, x + x는 3 + 3으로 계산된다. 자유 식별자는 프로그램 내에서 정의되지 않은(바인딩되지 않은) 식별자를 의미한다.자유 식별자는..
-
Arithmetic Expressions (AE)와 WAE컴공지식/프로그래밍언어론 2024. 9. 11. 15:27
산술 표현식(AE: Arithmetic Expressions)과 WAE (With Arithmetic Expressions)에 대해 설명해보겠다 AE는 가장 기본적인 산술 표현식이다.덧셈과 뺄셈 같은 간단한 산술 연산을 나타낸다.AE의 기본 요소는 다음과 같다.1. 숫자(Num): AE의 가장 기본적인 표현식은 숫자다. 예를 들어 5, 10 같은 값이다. 이를 추상 문법에서는 Num(5), Num(10)과 같이 표현할 수 있다.2. 덧셈(Add): 두 개의 표현식을 더하는 연산이다. 예를 들어 {+ 5 3}은 5 + 3을 의미한다. 이를 추상 문법으로는 Add(Num(5), Num(3))로 나타낼 수 있다.3. 뺄셈(Sub): 두 개의 표현식을 빼는 연산이다. WAE는 with 구문을 도입해서, 변수를..
-
Inference Rules (추론 규칙)컴공지식/프로그래밍언어론 2024. 9. 11. 15:22
추론 규칙은 프로그래밍 언어나 수학에서 특정 조건이 충족되었을 때, 어떤 결론을 내릴 수 있는지에 대한 논리적인 규칙이다.특히 Operational Semantics에서 이러한 규칙은 프로그램의 동작을 수학적으로 설명하는 데 사용된다. 추론 규칙은 크게 두 부분으로 나눌 수 있다. 추론 규칙 예시 : H1 H2 ... Hn ----------------- C 1. 전제 (Hypotheses) 프로그램의 특정 조건을 나타낸다. 여기서 H1, H2처럼 표현되는 부분들이 전제다. 여러 전제가 있을 수 있고, 이들이 참일 때 결론을 도출할 수 있다.2. 결론 (Conclusion) 전제들이 참이면, 그에 따라 도출되는 결론이다. C로 표시되며, 전제들로부터 유추할 수 있는 결과를 말한다..
-
BNF의 한계컴공지식/프로그래밍언어론 2024. 9. 8. 15:17
Linux에서는 공백을 허용하지 않는다.예를 들어 다음과 같은 파일 이름이 있다고 해보자filename with spaces and quotes 12.3.txt우리가 BNF에 공백 문자("\"")를 정의해 놓아도 Linux는 이것을 6개의 식별자(identifier)로 본다. 근데 만약 escape 처리를 해놓으면 안전하게 공백을 처리할 수 있게 된다.예를 들어 다음과 같이 말이다.filename\ with\ spaces\ and\ quotes\ 12.3.txt 또한 BNF는 중복 처리적으로 한계가 있다.예를 들어 다음과 같은 코드가 있다고 해보자public public int x; BNF 문법적으로 틀렸다고 하지는 않지만 실제로는 컴파일 오류가 난다..BNF로는 이 중복 오류를 체크할 방법이 없다는 게..