Fascination
article thumbnail
[PL] Chapter 04. 변수 및 유효범위
Study/Programming Language 2022. 4. 25. 05:36

↓Chapter 04. 변수 및 유효 범위 프로그래밍 언어론 원리와 실제 - 창병모 교수님 4.1 변수 선언 1) 변수 선언과 유효 범위 - 사용 전 선언(declaration before use): 변수는 사용하기 전에 선언되어야 함 - 변수의 유효 범위(scope) 선언된 변수가 유효한(사용될 수 있는) 프로그램 내의 범위/영역 변수 이름뿐 아니라 함수 등 다른 이름도 생각해야 함 - 정적 유효 범위(Static scope) 선언된 이름은 선언된 블록 내에서만 유효함 대부분 언어에서 표준 규칙으로 사용됨 2) 블록과 변수 선언 - 구문법 → ... | id = ; | let in end → { id [=];} → {} → int | bool | string - 의미 변수 id는 타입 변수이며 초기화가..

article thumbnail
[PL] Chapter 03. 언어 설계와 파서 구현
Study/Programming Language 2022. 4. 24. 04:05

Chapter 03. 언어 설계와 파서 구현 프로그래밍 언어론 원리와 실제 - 창병모 교수님 3.1 프로그래밍 언어 S 1) 언어 설계 목표 간단한 교육용 언어로 쉽게 이해하고 구현할 수 있도록 설계한다 대화형 인터프리터 방시으로도 동작할 수 있도록 설계한다 프로그래밍 언어의 주요 개념을 쉽게 이해할 수 있도록 설계한다. 수식, 실행 문장, 변수 선언, 함수 정의, 예외 처리, 타입 검사 등을 포함한다. 블록 중첩을 허용하는 블록 구조 언어를 설계한다. 전역 변수, 지역 변수, 유효범위 등의 개념을 포함 실행 전에 타입 검사를 수행하는 강한 타입 언어로 설계한다. 안전한 타입 시스템을 설계하고 이를 바탕으로 타입 검사기를 구현 주요 기능을 점차적으로 추가하면서 이 언어의 어휘분석기, 파서, AST, 타입..

article thumbnail
[PL] Chapter 01. 서론
Study/Programming Language 2022. 4. 23. 21:51

Chapter 01. 서론 프로그래밍 언어론 원리와 실제 - 창병모 교수님 1.1 프로그래밍 언어란 무엇인가? 1) 프로그래밍 언어란 무엇인가? - 프로그래밍 언어: 계산 과정을 기계가 읽을 수 있고 사람이 읽을 수 있도록 기술하기 위한 일종의 표기법. 즉, 기계가 해석할 수 있고 사람이 이해할 수 있어야 함 계산(Computation): 컴퓨터가 할 수 있는 연산들을 나타내며 덧셈, 뺄셈, 비교와 같은 데이터 조작, 문자 입출력과 같은 텍스트 처리, 정보 저장 및 검색 등을 의미 기계 읽기(machine readability): 효율적인 번역 혹은 실행이 가능해야 함을 뜻함 사람 읽기(human readability): 사람이 쉽게 프로그래밍할 수 있도록 편의성을 제공해야 하며 컴퓨터 연산들이 이해하기..

article thumbnail
[DS] Sparse Matrix (희소 행렬)
Study/Data Structure 2021. 8. 26. 23:28

# Matrix (m rows * n cols) - 2차원 배열: matrix[m][n] - Space complixity = S(m,n) = m*n → 얼마만큼의 기억장소를 필요로하는지 나타내는 척도 * 배열이 int 형일 때, S(m,n) = m*n*4 ex) 4 : 배열 안의 원소를 entry라고 하며 배열을 사용해 나타낼 때는 matrix[0][2]와 같이 나타냄 # Sparse Matrix - 희소 행렬: 행렬의 값이 대부분 0인 행렬 → 저장 공간은 큰데 의미있는 값은 적음 - A[m,n]: 대부분의 값이 0이며 이 행렬을 효과적으로 저장하는 방법을 찾아야함 → 중요한 목표 # Sparse Matrix solution - 0이 아닌 element만 저장한다 - 3튜플을 가지는 배열을 활용한다 ..

article thumbnail
[DS] Hanoi Tower (하노이 타워)
Study/Data Structure 2021. 8. 26. 22:00

# 하노이 타워 (1) - 세 개의 기둥과 크기가 다양한 원판들이 존재 > 초기 상태: 한 기둥에 모든 원판이 꽂혀 있음 - 목표: 한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥에 옮기는 것 - 조건 ① 한 번에 하나의 원판만 옮길 수 있다 ② 큰 원판이 작은 원판 위에 놓일 수 없다 - 알고리즘 더보기 세 개의 기둥 A, B, C가 있고 기둥 A에서 B로 n개의 원판을 옮긴다고 가정 1. 기둥 A에서 n-1개의 원판을 A, B가 아닌 기둥 C로 옮긴다 2. 기둥 A에 남은 1개의 원판을 B로 옮긴다 3. 기둥 C에 있는 n-1개를 기둥 B로 옮긴다 > 2번 과정: 1개의 원판이 이동하면 됨 > 1, 3번 과정: 원판의 수가 1개 줄어든 또 다른 하노이 타워 문제 → 재귀적인 방법으로 해결 가능 >..

article thumbnail
[DS] Euclidean algorithm(유클리드 호제법) 과 최대 공약수
Study/Data Structure 2021. 8. 26. 21:54

# 유클리드 호제법 - 2개의 자연수의 최대공약수를 구하는 알고리즘의 하나 - 호제법이란? > 두 수가 서로 상대방 수를 나누어 원하는 수를 얻는 알고리즘을 나타냄 - 내용 > 2개의 자연수 a, b에 대해서 a를 b로 나눈 나머지를 r이라 함 (이때 a>b) > a와 b의 최대공약수는 b와 r의 최대 공약수와 같음 > 위의 성질에 의해 b를 r로 나눈 나머지 r'을 구하고 다시 r을 r'으로 나눈 나머지를 구하는 과정을 반복함 > 위의 과정에서 나머지가 0이 될 때 나누는 수가 a와 b의 최대 공약수가 되는 것 # 최대 공약수 (greatest common divisor) gcd(x,y) = gcd(s,x%y) if y>0 gcd(x,0) = x - 최대 공약수를 구하는 알고리즘 > y가 0이면 x를 ..

article thumbnail
[DS] Pointer (포인터)
Study/Data Structure 2021. 8. 25. 22:44

# 포인터 - 포인터: 메모리 주소를 값으로 갖는 변수 - 간접 참조를 통하여 원본 데이터를 복사하거나 공유할 수 있음 - 메모리 주소를 직접 다루기 때문에 잘못 사용할 경우 예기치 못한 상황으로 시스템이 다운되거나 문제가 발생할 수 있음 - 함수 간의 매개 변수 참조 전달(call by reference), 연결 리스트에서 동적 메모리 관리(dynamic memory management) 등에 사용됨 - *(asterisk)와 &(ampersand) 연산자 > *은 사용되는 위치에 따라 의미가 달라지며 포인터형 변수에만 적용 가능 → 아래 소스코드 (1), (2), (3), (4) 참고 > &는 모든 변수에 붙일 수 있는 주소 연산자 [코드] #include void main() { int i = 3,..

article thumbnail
[DS] 구조체
Study/Data Structure 2021. 8. 25. 22:36

# 구조체 - 구조체는 자료형이 상이한 복수의 멤버들을 하나의 자료로 묶어 처리할 수 있는 복합 자료형 - 선언 위치: 전처리기와 main 사이 - 예약어: struct - 예시: 나이(age), 학년(grade), 전공(major) 세 개의 멤버를 갖는 학생(student) 구조체를 정의 // 구조체의 선언 1. 구조체의 이름을 줄 수 있음 struct student { int age; int grade; char major[20] }kim, lee; // 구조체의 선언 2. 구조체 이름을 생략하고 구조체 변수를 생성 struct { int age; int grade; char major[20]; }kim, lee; // 구조체의 선언 3. 구조체 변수명이 생략되어 선언된 경우 --> struct 키워..

article thumbnail
[DS] 소수 찾기
Study/Data Structure 2021. 8. 25. 22:15

# 소수 판별 - 소수: 1과 자신 이외의 수로는 나누어지지 않는 수 [코드] int prime(int n) { if (n < 2) return 0; // n이 2보다 작으면 1이므로 소수가 아님 for (int i = 2; i < n; i++) { // 2부터 n-1까지의 수를 탐색 if (n % i == 0) return 0; // i로 나누어서 1이 되는 경우가 있다면 소수 X } return 1; } * n이 2인 경우에는 i