전체 글

Developer Blog 📜 Lots of rules and no mercy ✨
산술 연산 덧셈, 뺄셈 : 피연산자가 세개 두 개의 소스와 하나의 대상 add a, b, c # a = b + c sub a, b, c # a = b - c 디자인 원칙 1: 단순은 규칙을 선호한다. 규칙성이 있으면 구현이 더 간단하다. 단순성은 더 낮은 비용으로 더 높은 성능이 가능하다. 산술 예제 C 코드 f = (g + h) - (i + j); MIPS 코드 add t0, g, h # temp t0 = g + h add t1, i, j # temp t1 = i + j sub f, t0, t1 # f = t0 - t1 레지스터 피연산자 산술 명령어는 레지스터 피연산자를 사용한다. MIPS에는 32비트 × 32개 레지스터 파일이 있다. 자주 액세스하는 데이터에 사용 0~31번 워드(word) : 32비..
성능 응답 시간(Response time) : 작업을 수행하는 데 걸리는 시간 처리량(Throughput) : 단위 시간당 수행된 총 작업(예: 작업/트랜잭션/… 시간당) 응답 시간과 처리량은 어떤 영향을 받는가? 응답시간 : 프로세서를 더 빠른 버전으로 교체 처리량 : 더 많은 프로세서를 추가 이 수업에서는 응답 시간에 집중 → 싱글코어에 집중한다. 상대적 성능 성능 = 1 / 실행 시간 "X는 Y보다 n배 빠릅니다." X 성능 / Y 성능 = Y 실행시간 / X 실행시간 = n 예: 프로그램을 실행하는 데 걸린 시간 A : 10초, B : 15초 B 실행시간 / A 실행시간 = 15s / 10s = 1.5 따라서 A는 B보다 1.5배 빠릅니다. 실행 시간 측정 경과 시간(Elapsed time) 모든..
컴퓨터 혁명 컴퓨터 기술의 진보는 점점 가속화 되고 있다. 또한 이전에 생각하지 못한 새로운 애플리케이션을 실현 가능하게 만든다. 자동차의 컴퓨터 휴대폰 인간 게놈 프로젝트 월드와이드웹 검색 엔진 이제는 컴퓨터는 널리 보급되어 있다. 컴퓨터의 종류 개인용 컴퓨터(PC) 범용, 다양한 소프트웨어 비용/성능 상충관계에 따라 달라질 수 있다. 서버 컴퓨터 네트워크 기반 고용량, 성능, 신뢰성 소형 서버부터 건물 규모까지 다양하다. 슈퍼컴퓨터 서버 유형 고급 과학 및 공학 계산 최고의 성능을 제공하지만 전체 컴퓨터 시장에서 작은 부분을 차지한다. 임베디드 컴퓨터 시스템의 구성요소로 숨겨져 있다. 엄격한 전력/성능/비용 제약 연산 복잡도에 따라서 배터리가 기하급수적으로 닳는다. 따라서 연산이 복잡하면 안된다. 포..
우리는 컴퓨터를 사용하지만 정작 내부의 구조에 대해서는 잘 알지 못한 채로 사용하고 있다. 컴퓨터 시스템 구조 강좌에서는 디자인 아키텍처(구조)뿐만 아니라 다양한 콘셉트와 기법들에 대해서 알아갈 것이다. 교재는 컴퓨터 구조 및 설계, 하드웨어/소프트웨어 인터페이스(6th Edition)를 사용한다.
지난 강좌의 재귀(Recursion)와 꼬리 재귀(Tail Recursion)로 피보나치 수열을 구현해보고 시간을 측정해보자. 먼저 파이썬에서 시간 측정은 time 모듈을 통해 할 수 있다. import time start_time = time.time() . . . end_time = time.time() print(f"exec.time = {end_time-start_time}") 우리는 피보나치 수열에 40을 넣어보고 값을 구할때 까지의 시간을 측정해볼 것이다. 재귀 import time start_time = time.time() def fib(n): if n == 1 or n == 2: return 1 else: return fib(n-1) + fib(n-2) print("fib(40) = ",..
재귀(Recursion) 함수나 프로시저가 본문 내에서 자신을 호출하는 경우 이를 재귀적이라고 한다. 재귀는 튜링 완전성을 얻기 위한 또 다른 메커니즘이다. 재귀는 수학에서 흔히 나타나는데, 이를 귀납적 정의라고도 합니다. n = 1일 때 : factorial(n) = 1 나머지 : n*factorial(n-1) 프로그래밍 언어에서 재귀 재귀는 반복에 비해 비효율적인 것으로 간주되는 경우가 많다. 계속해서 자신을 호출하기 때문이다. 호출할 때마다 새 활성화 레코드를 스택에 푸시하여 매개변수와 반환 값을 저장해야 한다. int fact(int n) { if(n == 1) return 1; else return n*fact(n-1); } 꼬리 재귀(Tail Recursion) 각 재귀 호출에 대한 활성화 기..
제어 흐름 프로그래밍 언어에는 여러 종류의 제어 흐름이 있다. 순차(Sequence) 조건문(conditional) 반복문(Iteration) 순차 제어문 순차 및 복합: 종종 ";"으로 표시되는 명령문의 순서 S1; S2 → S1이 종료된 직후 S2의 실행이 시작된다. 일련의 명령문을 복합 명령문으로 그룹화할 수 있다. 일반적으로 { } 코드 블록을 사용한다. Goto 어셈블리 언어의 점프 명령어와 유사하다. goto Label 즉시 라벨로 이동한다. 주의 깊게 사용하지 않으면 "스파게티 코드"가 쉽게 생성된다. 스파게티 코드 goto 문이 코드의 임의 위치로 점프하는 경우, 프로그램의 실행을 추적하는 것은 매우 어렵다. 점프로 이루어진 연결을 표현하면,접시에 얽힌 스파게티처럼 보일 수도 있습니다. G..
명령문 명령문은 계산이 반드시 값을 반환할 필요는 없지만 부작용이 있을 수 있는 구문 엔터티이다. 명령문은 모든 프로그래밍 언어에 존재하는 것은 아니지만 일반적으로 명령형 언어에서 사용된다. 명령문을 실행(또는 평가)함으로써 프로그램 상태를 계속 변경할 수 있다. 예) print("Hello World!") 프린트를 함으로써 모니터의 상태가 변경된다. 정의의 모호함 표현식과 명령문을 정의하기 위해 정확하고 정확하게 정의되지 않은 '계산(evaluation)'라는 용어를 사용했다. 다른 언어에서는 표현식에 부작용이 있을 수 있고 명령문에 반환 값이 있을 수 있다. C에서 할당은 변수 값을 수정하고 값을 반환한다. 주요 차이점은 계산 전에 상태가 고정되어 있으면 표현식 계산 결과 : 값 명령문 계산 결과 :..
표현식(Expression) 표현식은 계산식이 값을 생성하거나 정의되지 않음(undefined; 종료에 실패)을 생성하는 구문 엔터티이다. 모든 프로그래밍 언어의 기본 구성 요소 중 하나이다. 함수형 언어처럼 명령문이 없는 언어도 있지만 모든 언어에는 표현식이 존재한다. 어떻게 표현하는가 연산자(Operator) 및 피연산자(Operands) x + y b - 1 f(3) >= 0 전위, 중위, 후위 표기법 연산자의 위치를 기준으로 전위 : ::= | ... 중위 : ::= | ... 후위 : ::= | ... 표기법(Notation) 수학 방정식 : a + b * c + d 중위 표기법 : (a + b) * (c + d) 전위 표기법 : * + a b + c d 폴란드 표기법(Polish notatio..
이전 강좌의 동적 범위 규칙 중 하나인 Central Referencing Table(CRT)를 파이썬을 통해 구현해보자. 우리가 구현하고자하는 그림이다. 큰 블록에 작은 블록이 포함되어 있고 A, B, C, D의 관계는 그림과 같다. A > B, C C > D 각 블록은 x, y, v, w 중 1~2개의 값을 가진다. hidden stack을 이용하여 값을 저장 및 로드한다. 최종적으로 A의 x, B의 y, D의 w가 활성화 되어있다. 코드 구현 #Static information of declared names in block. names = { "A": ["x", "y"], "B": ["x", "v"], "C": ["w", "y"], "D": ["w"] } #Initialize CRT with st..