프로그래그래밍 언어의 역할
- 자연어: 의사소통의 위해
- 프로그래밍 언어: 프로그램작성을 위해 (컴퓨터가 알아듣도록, 다른사람이 이해하도록
프로그래그래밍 언어를 학습하는 이유
- 효과적인 알로리즘 개발을 위한 능력 향상
- 통상 언어의 모든 기능을 알지 못함
- 언어에서 제공하는 여러 기능을 활용하여 알고리즘 개발
- 잘못 사용하면 수행속도가 느려지고, 자원낭비, 논리적 오류(ex. recursion, objected oriented)
- 프로그래밍언어를 더 잘 이해하여 효과적 사용
- 내부(어떻게 구현되어 있는지)를 잘 알면 언어에 대한 이해도가 높아져 프로그램 작성 늘력 증가
- ex) 속도 증가, 서브프로그램 호출, 배열의 메모리 배정
- 유용한 프로그래밍 요소 사용법을 익히기 위해
- Class,Recursion, Co-routine 등
- 더 적합한 언어를 선택하기 위해
- 어떤 언어를 선택하면 코딩 부담(개발비용,시간 등) 을 줄일수 있을까?
- 새로운 언어를 쉽게 배우기 위해
- 프로그래밍 언어들은 많은 유사한 특징이 존재
- 새로운 언어를 학습하는 시간 절약
- 새로운 언어를 쉽게 설계하기 위해
- 인터페이스 설계, 컴파일러 구현 등에 프로그래밍 언어의 개념이 적용
프로그래그래밍 언어의 분류
1. 해결하려는 문제 영역(domain)에 따른 분류
2. 프로그래밍 패러다임(스타일)에 따른 분류
- 절차언어(Imperative) : FORTRAN, Pascal, C, ...
- f(x) + g(h(z,y),i(j,k) 의 경우 a=f(x) , b= h(z,y) , c= i(j,k) , d= g(b,c) , e= a+d 순으로 저장해나가며 연산
- 함수형 언어(functional) : LISP, Scheme, ML, Haskell, ...
- f(x) + g(h(z,y),i(j,k) 의 경우 j,k계산하여 i / z,y계산하여 h / x->f / i,g 계산하여 f와 다하여 결과, 저장하지 않고 함수의 output이 바로 input이 된다.
- 모듈 기반 언어: Modula-2, Ada, ...
- 객체 지향 언어: Smalltalk, C++, Ada, Java, ...
- 지네릭(generic) 프로그래밍 언어: Ada, ML, C++,...
- 선언적 언어(룰기반): Prolog,...
3. 계산모델(Computational model)에 따른 분류
- 명령형 언어: von Neumann 컴퓨터 구조를 기반으로 함
- 함수형 언어: 순환 함수 이론을 기반으로 함
- 논리 언어: 수학적 논리(연역 논리)를 기반으로 함
프로그래밍 언어의 목표 변천사
- 초창기: 1950년대 중반~1960년대
- 언어와 하드웨어가 밀착되어 있던 시기: 대표적인 예로 go to statement
- 컴퓨터값이 고가이므로 프로그래머의 인건비가 상대적으로 저가였던 시기
- 프로그램 수행 효율이 매우 중요했음
- 현재
- 컴퓨터 값이 저렴하고 프로그래밍 비용이 고비용
- 고성능 컴파일러가 효율적인 변역을 도와 줌
- 고급 개념이 프로그래밍 언어에 도입됨 : 클래스, 상속, 캡슐화, 예외 처리, assertion 등
소프트웨어 아키텍처의 발전
- 1950년대: 일괄처리 환경(batch)
- 고가의 메인 프레임
- 하나의 프로세스만 처리가능 ( 컴퓨터 하나에 단말기가 여러개 붙어 있고 시간을 분배하여 돌라가면서 사용)
- 1960년대: 대화형(time-sharing) 환경
- 메인프레임에 여러 터미널
- 다중 프로세싱
- 1970년대: 미니 컴퓨터와 마이크로컴퓨터의 등장
- 1980년대: PC의 보편화
- 윈도우 기반의 GUI 보급
- 1990년대: 클라이언트-서버 컴퓨팅
- Networking, The Internet, the World Wide Web
- 2000년대: Embedded, Ubiquitous, Cloud, ...
일괄처리 환경(batch)
- IBM704: 1950년대 후반, 전세계 4대, 4K word core memory
- 오퍼레이터만 들어갈 수 있음
- 80-columm punched cards: 카트한장이 코드라인한개정도
- Language: Fortran, ALGOL, LISP
시분할 환경 (time sharing)
- IBM7094: 1963년 개발, 1964~1968 동안 사용됨, 36bit 머신
- Language: COBOL, PL/I, APL, BASIC
미니 컴퓨터, 마이크로 컴퓨터
- 미니 컴퓨터: PDP 11(DEC)
- 마이크로 컴퓨터: Apple 2, Apple Lisa, Macintosh
- OS: UNIX, Apple Dos
- Language: Pascal, C, Smalltalk
좋은 언어의 조건
- 명료성(clarity) : 명확해야 배우기 쉽다
- 간결성(simplicity): 간결해야 배우기 쉽다
- 일관성(unity)
- 직교성(orthogonality)
- 몇개의 다른 기능을 임의로 조합할 수 있는 기능( 예외없이)
- 기능들의 독립성이 보장되어 있다는 의미
- 함수형 언어는 함수에 관한 한 직교성 지원
- 객체지향 언어는 언어에 따라 다음
- 자연스러운 응용 분아 지원(language features)
- 필요한 것을 바로 지원하도록
- 없으면 만들 수 있도록
- 추상화 지원
- Algorithms+Data Structures = Program
- Controll Abstraction + Data Abstraction
- 프로그램 테스트의 용이성
- 검증(vertification)
- 테스트: Desk Checking(읽어 검증), Field Test(여러테스트셋)
- 프로그래밍 환경
- 잘 정리된 문서, 개발 환경, 테스트 도구 등
- 프로그램 이식성
- 지원하는 플랫폼이 다양한가
- 비용
프로그래밍 언어의 비용
- 프로그래밍 언어를 이용하여 프로그램을 개발하고 이를 관리하는 데 드는 비용
- 프로그램 수행 비용
- 프로그램 번역 비용
- 프로그램 작성 비용
- 프로그램 관리(유지보수) 비용
프로그래밍 패러다임
- 패러다임 이란?
- 한시대를 지배하는 총체적인 틀 또는 개념
- 프로그래밍 패러다임: 문제 해결의 일반적인 모델
- 프로그래밍 패러다임과 계산 모델
- 언어가 지원하는 패러다임과 계산모델은 밀접한 관련이 있지만 정확히 일대일 대응 관계인 것은 아님
- 명령형 언어: 폰노이만 모델
- 함수형 언어: Recursive Function Model
- 논리 언어: Deductive Reasoning Model
- 객체지향 패러다임은 명령형 언어로 지원하는 것이 대부분이지만 함수형 언어로 지원할 수도 있다
- 명령형 언어
- 계산모델: 상태전이 기계(state transition machine, 입력은 초기상태에 있고 상태전이를 계속한 후 최종상태에 원하는 출력이 있음
- 특징: 상태를 변경하는 명령문 중심의 언어
- 구문:s1;s2;s3 ...
- FORTRAN, COBOL, C, Pascal
- 함수형 언어
- 계산모델: 입력 값을 받아서 출력 값을 내는 함수
- 출력 값은 입력 값과 아무 연관성이 없음
- 변수도 없고 대입 연산도 없음
- 함수 합성이 주요 프로그래밍 작업
- 자신을 자신에 합성할 수도 있움 -> 재귀함수
- 원하는 함수를 작성하는 것이 주요 프로그래밍 작업
- 구문: P1(P2(P3(X))) , Greates(A,B,C) = Greater(Greater(A,B),C)
- LISP,Scheme,ML,Haskell
- 규칙기반 언어
- 계산모델: 논리규칙에 입각한 추론
- 입력: 명제의 조합
- 출력: 추론 결과 얻은 명제 또는 명제의 일부
- 문제의 여러 특성을 논리 규칙으로 설정하는 것이 주요 프로그래밍 작업
- 엄밀히 말하면 규칙의 순서는 고려되지 않아야 하지만 사실상 순서를 중요시함
- 구문: 'Goal <-Hypotheses'의 목록
- 예: Prolog
- 객체지향 언어
- 계산모델: 실 세계 내의 객체들의 움직임
- 특정 계산 모델을 가정하고 있지 않지만, 주로 명령형 패러다임의 언어에 구현됨
- 유일한 신원을 갖는 객체들로 프로그램을 구성
- 객체는 속청과 행위(행태)를 갖고 있음
- 속성은 데이터로 구현되고 행위는 메소드로 구현됨
- 객체는 클래스의 실체임
- 클래스는 IS-A 관계를 통해 계층을 이룰 수 있음
- 예: Smalltalk, C++, Java
구조화 프로그래밍
- 출현 배경: 프로그램의 흐름 구조를 이해하기 어렵다, GO TO 논란과 관련 있음
- 모든 흐음 제어 구조는 다음 세가지 구조로 표현 가능
- 선택구조
- 반복구조
- 순차구조
- 하향식 설계 밥법
- 프라임 프로그래밍: 시작과 끝이 하나
- 시작 ------------------끝
- 반대: 시작--------끝------시작----끝--시작----시작---끝---끝
스파게티 코드와 구조화 코드
언어 표준화의 배경
- ex) 다음 문장의 의미는? i= 1&&2+3|4;
- 위문제에 답하기 위해서는 아래방법들이 있다
- 언어 메뉴얼을 본다
- 언어 표준을 본다
- 실행해본다
- 대부분 3번 방법을 택하지만 답을 확신할수없다.
언어 표준과 언어 구현
- 언어 표준: 문서(언어 설계도)
- 언어 구현: 컴파일러, 인터프리터
- 표준=구현1=구현2 가 되기를 바라지만 다 다르게 구현한다.
표준화 기구
- 언어 표준화를 담당하는 곳
- ISO - International Standards Organization
- IEEE - Institute of Electrical and Electrocis Engineers
- ANSI - American National Standatds Institue
- 이들 기구의 주요 담당 업무
- 표준을 정의할 워킹그룹 결성(자원자로 이루어짐)
- 새로운 표준안에 포함될 기능들 제시
- 표준안에 대한 투표
- 워킹그룹에서 통과된 표준안은 상위 기구에 상정
- 표준안 공표 및 새로운 표준안 검토( 대략 5-10년 주기로 검토함)
언어 표준화 시기
- 표준화시기
- 너무 빠르면 구현된 것이 없으므로 언어에 대한 경험을 축적할 수 없음
- 너무 느리면 여러 다른 버전이 존재할 수 있음
- 적절하면 가장 좋지만 그런 예가 별로 없음
- 언어표준화의 예
- C-C89,c90,c95,c99,c11
- LIST-1990
- ML- 없음 그러나 SML이 사실상의 표준
- Smalltalk - 없음
- Prolog- 없음
프로그래밍 환경
- 프로그래밍 환경
- 프로그램 작성, 테스트에 사용되는 환경
- 프로그램 수행 환경과는 구별됨
- 프로그래밍 환경과 프로그래밍 언어
- 프로그래밍 환경은 프로그래밍 언어의 사용층에 지대한 영향을 미침
- 프로그래밍 환경은 프로그래밍 언어 설계에서 영향을 미치기도 함
- 분리 컴파일
- 테스트 및 디버깅
분리 컴파일
- 분리 컴파일 시 공유되어야 하는 정보
- 서브 프로그램 호출 정도
- 공유되는 변수의 타입
- 공동으로 사용해야 할 타입의 정의
- 분리컴파일 지원을 위한 방법
- 옵션1: 필요한 것을 다시 선언하도록 함
- 옵션2: 특정 순서로 컴파일 되도록함(specification이 먼저오도록)
- 옵션3: 관련 정보를 라이브러리 형태로 참조할 수 있도록 함
- 용어 구분
- 분리 컴파일: 인터페이스 정보를 필요로 할 수 있음
- 독립 컴파일: 각 컴파일 단위가 독립적
테스트 및 디버깅
- 테스트 및 디버깅 지원 방법
- 실행순서따라가기(execution trace) : Prolog,List 등 대화형 언어
- 중단점 설정(breakpoints) : 수행 순서가 명확한 명령형 언어의 경우
- 조건 점사(assertion) : 프로그램 수행 도중 만족해야할 조건 검사
- 예: assert(X>0 and A=1) or (X=0 and A>B+10)
- Assertion은 배포 버전에서는 제거될 수 있도록 설계됨, 테스트코드 따로 관리하거나 주석처리해두기만 하기도함
'Computer Science > 프로그래밍언어론' 카테고리의 다른 글
Chapter5-2 Structured Data Types (0) | 2023.06.12 |
---|---|
Chapter5-1 Elementary Date Types (0) | 2023.04.20 |
Chapter4 Modeling Language Properties (0) | 2023.04.20 |
Chapter3 Language Translation Issues (0) | 2023.04.20 |
Chapter 2 Impact of Machine Architectures (0) | 2023.04.18 |