1장 기본적인 사항(3) 2016. 3. 14 순천향대학교 컴퓨터공학과 하상호
목차 언어 설계에 미친 영향 언어 부류 언어 구현 방법
언어 설계에 미친 영향 컴퓨터 구조 프로그래밍 설계 방법론
언어 설계 영향: 컴퓨터 구조 폰 노이만 구조(von Neumann architecture) 명령어/데이터가 메모리에 저장 메모리가 CPU로부터 분리 명령어/데이터는 기억장소로부터 CPU에 전달 명령어의 순차적 실행: CPU의 인출-해석-실행 주기 산술 및 논리장치 제어 장치 명령어 / 데이터 메모리(명령어/데이터) 연산 결과 입출력장치
언어 설계 영향: 컴퓨터 구조 명령형 언어(imperative languages) 폰 노이만 구조에 기반한 언어 언어 특징 변수 배정문 반복문
언어 설계 영향: 컴퓨터 구조 함수형 언어/적용 언어(applicative language) 특정 기계 구조에 독립 계산 표현의 주요 수단이 함수를 주어진 매개변수에 적용하는 언어 변수, 할당, 반복문을 사용하지 않음 비효율적
언어 설계 영향: 프로그래밍 설계 방법론 1950년대, 1960년대 초반 1960년대 후반 기계 효율성이 중요 단순 응용 프로그램 1960년대 후반 컴퓨팅 주요 비용이 하드웨어에서 소프트웨어로 이동 인간 효율성이 중요하게 되고, 판독성, 더 나은 제어 구조 고려 구조화 프로그래밍 하향식 설계 (top-down design), 단계적 세분화(stepwise refinement) 타입 검사, 제어구조 지원(과도한 goto 문 사용 제한)
언어 설계 영향: 프로그래밍 설계 방법론 70년대 후반 80년대 중반 최근 데이터 추상화 지원 => 추상 데이터 타입 프로세스 지향으로부터 데이터-지향 으로 이동 데이터 추상화 지원 => 추상 데이터 타입 Ex. SIMULA 67 80년대 중반 객체지향 프로그래밍(객체지향 설계 지원) 데이터 추상화 + 상속 + 동적 메소드 바인딩(다형성) Ex. Java, C++, C#, F#, Prolog++ 최근 프로세스 지향 프로그래밍에서 동시성(concurrency) 연구 동시적 프로그램 단위를 생성하고 제어하기 위한 언어 기능 제공 Java, C#
언어 부류 명령형 언어 함수형 언어 논리형 언어 객체-지향 언어 마크업/프로그래밍 하이브리드 언어 특정 목적 언어 9
언어 부류 명령형 언어(imperative languages) 폰 노이만 구조에 기반 중심 특징: 변수, 배정문, 반복문 객체-지향 언어, 비쥬얼 언어, 스크립트 언어는 명령형 언어에 속함
언어 부류 함수형 언어(functional languages) 특정 컴퓨터 구조에 독립 수학 함수에 기반 함수를 매개변수에 적용하여 주요 계산 표현 수학에 기반하여 프로그램 의미를 명확하게 정의 가능 언어 특징 변수, 배정문, 반복문을 사용하지 않음 재귀 함수 사용
예제: 명령형 vs. 함수 언어 명령형 프로그램 int gcd(int u, v) { while (u != v) { if (u > v) u = u-v; else v = v-u; } return u; 함수형 프로그램 (define (gcd u v) (if (= v 0) u (gcd v (remainder u v)) ) 12
언어 부류 논리형 언어 (logic languages) 기호 논리에 기반 규칙-기반 언어(rule-based language) ‘how to do’보다는 ‘what to do’를 기술 언어 특징 제어 구조가 없다 규칙이 특정 순서 없이 기술 언어 시스템이 요구된 결과를 생성하기 위해 규칙이 실행 순서를 선택 Ex. Prolog gcd(u, v, u) :- v = 0 gcd(u, v, x) :- v >0, gcd(v, u mod v, x)
언어 부류 마크업 / 프로그래밍 하이브리드 언어 프로그래밍 능력을 갖는 XHTML, XML의 확장 버전 제어 흐름과 계산 명세 가능 Ex. XSLT, JSTL
언어 부류 특정 목적 언어 RPG(report program generator) APT(Automatically programmed tools) GPSS(General purpose simulation system)
구현 방법 컴파일 구현 순수해석 혼합형 구현 시스템
컴파일 구현 컴파일 구현(compiler implementation)은 소스 프로그램을 실행 가능한 기계 언어로 번역하는 방법 링킹(linking) / 적재(loading) 시스템 호출, 라이브러리 함수, 프로그램 모듈들을 통합 적재 모듈(load module) 또는 실행 가능 이미지(executable image)
컴파일 링커 원시 프로그램 어휘 분석기 구문 분석기 심 볼 테이블 중간코드 생성기 (의미 분석기) 최적화 코드 생성기 어휘단위 구문 분석기 파스트리 심 볼 테이블 중간코드 생성기 (의미 분석기) 최적화 (선택 사항) 중간코드 코드 생성기 기계어 링커 입력 데이터 실행 이미지 컴퓨터 결과
컴파일 폰 노이만 병목(von Neumann bottleneck) 컴퓨터의 기억공간과 프로세서간의 연결 이 연결 속도가 프로세서의 속도보다 느림 폰 노이만 컴퓨터의 속도를 제한하는 중요한 요소
순수 해석 순수 해석(pure interpretation)은 프로그램이 번역되지 않고, 인터프리터에 의해서 해석되면서 실행되는 방식 인터프리터는 언어에 대한 가상기계 제공 단순한 구조의 언어에 적합 APL, LISP, JavaScript 등 원시프로그램 장점: - 구현에 용이 - 원시코드 수준 디버깅 연산 구현 용이 단점: - 느린 실행(컴파일 코드에 비해 10~100배) - 더 많은 기억공간 요구 입력데이터 해석기 결과
혼합형 구현 시스템 혼합형 구현 시스템(hybrid implementation system)은 컴파일러와 순수해석의 절충 프로그램을 중간 코드로 번역하고, 이 중간 코드를 해석 - 순수 해석보다 더 빠른 실행 - ex. Perl, 초창기 Java 원시프로그램 어휘 분석기 구문 분석기 중간코드 생성기 입력데이터 해석기 결과
혼합형 구현 시스템 JIT(Just-In-Time) 메쏘드 호출시 중간 코드를 기계 코드로 번역하여 실행 번역된 코드는 보관되어 다음 호출에 이용 Java, .NET 언어
혼합형 구현 시스템 언어에 대해서 컴파일 구현과 인터프리터 구현 모두 제공하는 경우 인터프리터는 프로그램 개발과 디버깅에 사용 프로그램이 완성되면 실행 속도 향상을 위해서 컴파일함
사전처리기(preprocessor) 사전처리기(preprocessor)는 프로그램을 번역하기 직전에 프로그램을 처리하는 프로그램 사전처리기 명령어는 프로그램에 포함 기본적으로 매크로 확장기(macro expander) Ex. #include “myLib.h” #define max(A, B) ((A) > (B) ? (A) : (B)) … x = max(2*y, z/1.73); x = max(2*y++, z/1.73); // 문제점은?
프로그래밍 환경 프로그래밍 환경(programming environment)은 소프트웨어를 개발하는데 사용되는 도구들의 집합 파일시스템, 텍스트 편집기, 링커, 컴파일러, 디버거 등 단일의 사용자인터페이스를 갖는 통합된 도구 소프트웨어 개발/유지보수에 도움 Ex. UNIX + GUI (CDE, GNOME, KDE 등) Borland Jbuilder, MS Visual Studio.NET NetBeans, Eclipse
퀴즈 #1 예고 일시: 3/21 (월요일) 범위: 1장 용어