컴공지식/프로그래밍언어론
-
왜 대부분의 프로그래밍 언어가 대체(substitution)기능을 지원하는가?컴공지식/프로그래밍언어론 2024. 9. 8. 14:52
코드에서 같은 연산을 여러 번 반복해서 사용하게 되면, 그 계산을 매번 다시 하는 건 시간도 낭비고, 실수할 가능성도 커진다.예를 들어 1 + 1 을 직접 계산하는 과정을 1만번 반복한다고 생각해봐라..정말 비효율적이고 이미 증명돼있는 값을 1만번 계산하여 다시 도출하는 꼴이 된다.그래서 많은 프로그래밍 언어는 이걸 최적화하고, 코드 유지보수를 쉽게 하려고 '대체' 기능을 제공하는 거다. # 대체를 안 한 경우 result = 10 + 20 + 30 other_result = 10 + 20 + 30 + 40 # 대체를 한 경우 sum_value = 10 + 20 + 30 result = sum_value other_result = sum_value + 40 # 대체를 안 한 경우 x = 10 * 5 y..
-
BNF로 산술 표현식 정의하기컴공지식/프로그래밍언어론 2024. 9. 8. 14:49
특정 언어를 만든다고 생각해보자이 때 우리는 산술 표현식을 정의해야 할 필요가 있다.일단 정수랑 float의 연산식이나 숫자를 표현하는 문법을 정의하려면 어떻게 해야할까?다음과 같다. ::= | + | - | * | / ::= -? + ? ::= .+ ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 이렇게 정의하면 더하기, 빼기, 곱하기, 나누기와 같은 단순한 산술 표현식을 사용하는 게 가능해지고단순하게 number를 표시하는 게 가능해진다.뒤에 ?(물음표)는 있어도 되고 없어도 되는 것을 뜻한다. -?는 음수일 수도 있으니 물음표를 붙인거고 ?는 소수가 ..
-
Ammonite란?컴공지식/프로그래밍언어론 2024. 9. 7. 15:07
Ammonite는 Scala REPL (Read-Eval-Print Loop) 의 더 모던한 버전이다.REPL은 코드를 바로 실행하고 결과를 바로 볼 수 있는 인터프리터 같은 역할을 한다.그래서 Ammonite도 Scala 코드를 작성하고 바로 실행할 수 있는 도구라고 보면 된다. 일반적인 Scala REPL보다 더 많은 기능을 지원하는 개선된 버전이고기본적인 Scala 인터프리터는 외부 라이브러리를 직접 가져오는(import) 걸 지원하지 않는데, Ammonite는 이걸 지원한다.즉, Ammonite에서는 쉽게 외부 패키지를 가져다 쓸 수 있다는 말이다.Ammonite는 Scala 코드를 빠르게 테스트하고 외부 패키지를 쉽게 가져올 수 있게 도와주는 강력한 도구다. https://ammonite.io/..
-
Parser란?컴공지식/프로그래밍언어론 2024. 9. 7. 14:56
Parser는 인터프리터나 컴파일러의 일부다.프로그램(코드)을 분석해서 이게 뭔지 파악하고, 그 구체적인 문법(Concrete Syntax)을 추상 문법(Abstract Syntax) 으로 변환해 주는 역할을 한다. 구체적 문법(Concrete Syntax)이 뭔지 다시 간단하게 정리를 해보자면예를 들어, x + 1 같은 코드가 구체적 문법이다. 추상 문법(Abstract Syntax)는 x + 1이라는 코드를 Add(Var("x"), Num(1)) 같은 구조로 변환하는 게 추상 문법으로 바꾸는 과정이다. 이 과정을 파싱이라고 한다.그래서 파서를 만들려면, 언어의 구체적 문법(Concrete Syntax)에 대한 명확한 명세(specification)가 필요하다.바로 BNF를 이용하여 명세하는 것이다...
-
BNF (Backus-Naur Form)를 이용한 산술 표현에 대한 문법컴공지식/프로그래밍언어론 2024. 9. 7. 02:04
BNF (Backus-Naur Form)는 프로그래밍 언어에서 문법을 정의할 때 자주 사용하는 형식이다. BNF 문법의 기본 구조는 다음과 같다. expr ::= { "+" expr expr } | { "-" expr expr } | num num ::= "1" | "42" | "17" | ... expr은 non-terminal(비종결 기호)이라고 부른다. 무슨 뜻이냐면, 이게 다른 문법 규칙에 의해 더 구체적인 표현으로 재작성될 수 있다는 뜻이다. ::=은 "뭐뭐로 쓸 수 있다"는 뜻이다. 즉, expr는 뒤에 나오는 여러 가지로 변환될 수 있다는 거다. |는 "또 다른 선택지"를 의미한다. 즉, expr는 +로 시작하는 표현일 수도 있고, -로 시작하는 표현일 수도 있으며, 또는 그냥 숫자일 수도 ..
-
Semantics (의미론)에 대하여컴공지식/프로그래밍언어론 2024. 9. 7. 01:24
프로그래밍 언어에서 'Semantics'는 코드가 어떻게 의미를 갖는지, 즉 코드가 실제로 무엇을 하고 어떻게 동작하는지를 정의하는 거다.몇 가지 의미론을 살펴보자 Mathematical techniques (수학적 기법들) 일단 수학적 방법으로 프로그래밍 언어의 의미를 정의할 수 있는데, 그 대표적인 방법들은 다음과 같다.Denotational semantics (표상 의미론): 이건 프로그램의 각 부분을 수학적인 함수로 표현하는 방식이다. 즉, 코드가 어떤 입력을 받아서 어떤 출력을 내는지, 그 관계를 수학적으로 정의한다.Operational semantics (작동 의미론): 이건 프로그램이 실제로 어떻게 실행되는지를 설명하는 방식이다. 한 단계 한 단계의 실행 과정을 정의하는 거라고 보면 된다...
-
문법(Syntax)에 대하여컴공지식/프로그래밍언어론 2024. 9. 7. 01:16
문법에는 두 가지 타입이 있는데 구체적인(concrete) 문법과 추상적인(abstract) 문법이 있다. Concrete Syntax(구체적인 문법)은 코드가 실제로 어떻게 쓰이는지에 대한 거다.예를 들어 숫자 '3'과 '4'를 더할 때 여러 가지 표기법이 있다. Infix (중위 표기법) : 3 + 4 로 우리가 가장 익숙한 표기법이다. Postfix (후위 표기법) : 3 4 + 로 피연산자가 먼저 나오고 연산자가 나중에 나온다. 계산기 같은 데에서 쓰인다. Prefix (전위 표기법) : + 3 4 로 연산자가 먼저 나오고 피연산자가 그 뒤에 온다. Parenthesized prefix (괄호로 묶인 전위 표기법) : {+ 3 4} 로 전위 표기법에 괄호를 추가한 형태다. 내가 듣는 수업에서는..
-
프로그래밍 언어의 구성컴공지식/프로그래밍언어론 2024. 9. 7. 01:10
프로그래밍 언어는 다음과 같은 것들로 이루어져 있다. 특유의 문법(syntax) : 이건 그 언어가 어떻게 코드를 작성해야 하는지를 말한다. 문장 구조에 대한 규칙 그 문법에 따른 동작 : 언어마다 각 문법 요소가 어떻게 동작하는지 정해져 있다. 예를 들어, 조건문이 어떻게 실행되거나 함수가 어떻게 호출되는지 같은 거다. 유용한 라이브러리들 : 프로그래밍할 때 코드 재사용성을 높이기 위해 라이브러리들이 있다. 프로그래머들이 자주 쓰는 관용구(idioms) : 이건 그 언어를 쓰는 사람들이 자주 사용하는 특정한 코드 패턴을 말한다.