프로그래밍언어
-
데이터 타입(2) - 배열프로그래밍언어 2020. 5. 4. 17:38
오늘은 이전 포스팅(데이터 타입)에 이어서 배열 타입에 대해 알아볼게요 배열의 구성요소 배열은 배열의 이름과 인덱스로 나뉘어요 array_name(index) -> element 어? 왜 괄호로 접근하냐구요? 옛날 컴퓨터 키보드에는 대괄호 []가 없어서 괄호로 접근했다고해요 근데 이게 함수 호출이랑 너무 헷갈리고 키보드에 대괄호가 들어오면서 오늘날의 접근 방식으로 바뀌었다고합니다~ array_name[index] -> element 배열의 종류 Static array(고정 크기 및 고정 위치 배열, Fixed size & Fixed location array) 고정된 메모리 위치에 고정된 크기의 배열을 할당하는 방식이에요. 항상 같은 위치에 같은 크기의 배열을 할당한다면 Load time 에 배열을 할당..
-
재귀-하강 파싱 (Recursive-descent parsing)프로그래밍언어 2020. 5. 3. 22:33
재귀하강 파싱 방법은 함수들의 재귀를 통해 파싱하는 방법을 말해요 다음 문법을 예시로 들어볼게요 -> if [ else ] -> { , } 대괄호 안에 있는 구문은 옵션으로 있거나 없을 수 있다는 뜻이에요 중괄호 안에 있는 구문은 있거나 없을 수 있지만 여러개 있을수도 있다는 뜻이에요 int get_token() { // 토큰을 구해주는 함수 } void expr() { // 모든 expression 처리하는 함수 // if 문이 또 나올수도 있다. } void if_stat() { int token = get_token(); if (token == IF) { // 여는 괄호 if (get_token() == LEFT_PAR) { expr(); // 닫는 괄호 if (get_token() != RIGHT..
-
구문 분석 및 파싱프로그래밍언어 2020. 5. 3. 20:52
구문 분석의 이유 1. 소스 코드가 구문(문법)적으로 올바른지 판단하기 위함 소스코드의 구문이 올바르지 못하다면 이를 복구합니다. 복구한다는 것은 구문 분석기가 정상적인 상태로 돌아가 계속 검사해나간다는 것을 말합니다. 복구가 중요한 이유는 오류가 하나 발견되더라도 이후 구문에 새로운 오류가 있을 수 있기때문에 이들 또한 한 번에 검사하기 위함입니다. 2. 구문적으로 올바른 코드의 완전한 파스 트리를 생성하거나 파스 트리 구조를 추적 파스트리는 이후 언어 번역을 위한 기반이 됩니다. 파스트리 생성 방식 하향식(Top-down) 파서 루트노드로부터 시작하여 하위 노드를 만들어나간다고 하여 하향식 파서입니다. 전위 순서(Preorder) 로 파스 트리를 생성하거나 추적하는 방식입니다. 전위 순서라고 함은 루..
-
데이터 타입 (1)프로그래밍언어 2020. 5. 1. 20:55
프로그래밍 언어에서의 데이터 타입은 어떻게 하면 현실세계의 데이터 구조를 프로그래밍 세계에 잘 반영할까에 대한 생각에서부터 출발했어요 C언어의 데이터 타입 카테고리 Scalar type Arithmetic type Integral type integer ( short, int, long, unsigned ... ) char enumeration Floating-point type (float, double ... ) Pointer type Aggregate type array structure Union type Function type Void type 이외에도 2진수 10진수, int, float 상관없이 숫자면 다 numeric type 0 또는 1의 값만 가지는 boolean (or logical..
-
프로그래밍 언어 Names, Binding, Scopes프로그래밍언어 2020. 5. 1. 17:38
프로그래밍 언어에서 Names 라 하면 변수, Label, 함수, 키워드 등에 사용됩니다. Names Design issues 변수명의 최대 길이는 얼마나 길게 할 것인가? 언더바(_) 와 같은 Connector character 를 허용할 것인가? 대소문자를 구분할 것인가? 키워드나 예약어를 변수명으로서 허용할 것인가? Name forms 이름의 형태에 제약이 있는 언어들이 있었습니다. 포트란 같은 언어들은 6글자, 30자 제한이 있었고, SQL 구문의 경우에는 대소문자를 구분하지 않는 등 다양한 형태가 있죠 물론 제가 주로 사용하는 C/C++, java 에서는 예약어를 사용하지 않는 한 특별한 제약은 없습니다. ( 숫자로 시작하면 안된다거나 그런거를 빼면요 ) Special words 키워드(keyw..
-
Lexical And Syntax Analysis프로그래밍언어 2020. 4. 30. 12:35
프로그래밍 언어의 동작 방식 - 컴파일 : C / C++ 수행시간이 빨라야함 - 순수 인터프리터 : Python, Javascript in HTML 작은 프로그램 - 하이브리드 ( 컴파일 + 인터프리터 ) : Java 효율적이지만 컴파일 언어보다는 느림 Syntax analyzer or Parser CFG, BNF 장점 명확하고, 유지보수가 쉬움 컴파일러의 분석 방법 2가지 Lexical analysis(어휘 분석) 이름, 리터럴과 같은 소규모의 검사로, 컴파일러의 Syntax analysis 앞 쪽에 먼저 수행된다. 일종의 패턴 매칭이라고 보면 되는데 문자들을 모아서 논리적인 단위로 그룹핑을 함 : lexemes 이들을 하나의 token 으로 취급. 이 토큰이 변수인지, expression 인지 뭔지는..
-
프로그래밍 언어 Semantic 표현프로그래밍언어 2020. 4. 29. 18:34
프로그래밍 언어 Semantic 표현은 어려워서 여러 가지 표현 방법들이 있어요 크게 Static(Formal) Semantics, Dynamic Semantics로 나뉘는데 Static Semantics 정적의미론은 BNF 만으로는 표현될 수 없는 규칙들을 표현하기 위해 고안된 것입니다. 대표적인 예시로 프로그램 내에서 어떤 변수는 참조되기 전에 선언된 상태여야 함이라는 규칙을 BNF로는 표현할 수 없습니다. (이건 증명됐다고하네요) 실제로 프로그래밍 언어에서는 이런 정적의미들을 컴파일 타임에 처리할 수 있는데 그래서 Static 이라는 이름이 붙여졌다고합니다. - Attribute Grammars Dynamic Semnatics - Operational semantics - Axiomatic sema..
-
프로그래밍 언어 Syntax 표현(기술)프로그래밍언어 2020. 4. 27. 20:12
Terminologies - Alphabet - String - Language (알파벳으로 만들 수 있는 모든 String 의 집합) - Sentence : Language 의 한 String - Lexeme : 의미적 요소의 최소 단위 - Token : lexeme 의 카테고리 - Language recognizer / generator (인식기, 생성기) Lexeme (어휘 항목) : 구문 기술이 아닌 어휘 명세에 의해 주어지는 것으로, literal, operator, special word 등으로 이루어짐 즉 프로그래밍 언어는 문자가 아닌 Lexeme 으로 이루어졌다고 말할 수 있음 프로그래밍 언어의 구문 기술에는 Lexeme 은 고려되지 않음 Syntax (구조, 문법) : expression..