IT이야기/IT Level-up

[Programming Fundamental] 프로그래밍에 대한 이해

FelixShin 2016. 3. 4. 02:16
반응형




1. Prologue

프로그래밍 언어의 이해 라는 책을 읽은 후, 내용을 간추려 적은 것이다.


2. 프로그래밍 기초

1) 소스 프로그램/파일(source program/file) : C, c++, JAVA 등 고급언어로 작성하며, 결과 파일들은 c, cpp, java 등을 확장명으로 가짐. 일반적으로 소스프로그램은 하드디스크 같은 보조 저장장치(auxiliary memory)에 저장됨. 소스 프로그램은 컴퓨터가 아닌 사람만 이해


2) 목적 프로그램/파일(object program/file) : 기계가 이해할 수 있는 2진수로 표현된 기계어로 번역할 결과물, 사람은 이해못하고 기계만 이해 가능, 그러나 프로그램을 컴퓨터가 바로 실행 시킬 수는 없음. .obj라는 확장명을 가짐


3) 실행가능 프로그램/파일(executable program/file) : 라이브러리 함수(기계어로 작성)와 컴파일러의 번역 작업에 의해 생성된 목적 프로그램을 결합하는 일이 필요하며, 결합의 결과 실행가능 파일이 생성되고 보조기억장치에 저장. 실행파일 이름은 .exe확장명을 가짐


4) 프로그램 개발과정

프로그램 작성(by 편집기) -> 컴파일(by 컴파일러) -> 링크 (by 링커) -> 적재(by 로더) -> 실행(by CPU)

(1) 사람이 편집기를 이용해 작업함. 

(2) 컴퓨터가 이해하지 못하므로 컴퓨터가 이해할 수 있는 언어로 번역하는게 컴파일임. 

(3) 컴파일의 결과물과 프로그래밍 언어가 제공하는 라이브러리와 결합하는 과정이 필요한데, 이 것이 링커라는 시스템 소프트웨어에 의해 수행됨. 

(4) 프로그램 실행을 위해서는 주기억장치가 필요. 보조 저장장치에 저장된 실행파일이 주기억장치로 이동해야하는데 이 과정을 로더라는 시스템 소프트웨어가 담당. 

(5) 주기억장치에서 프로그래머가 작성한 프로그램이 수행됨


5) 컴퓨터 구조와 프로그램 실행 과정

(1) 컴퓨터 구조 :  컴퓨터는 중앙처리장치(CPU : Central Processing Unit), 주기억장치(main memory), 입출력장치(I/O)로 구성됨

(2) 중앙처리장치 : 명령(instruction)을 수행

(3) 기억장치 : 프로그램 명령어와 데이터를 보유

(4) 입출력장치 : 컴퓨터 내/외부간의 데이터 이동을 담당


2. 프로그래밍 언어의 정의

1) 컴퓨터의 기본 기능 : 컴퓨터 메모리에 저장되어 있는 명령어를 정해진 순서에 따라 수행하는 것

2) 컴퓨터 프로그램 : 위와 같은 명령어들의 집합합

3) Wikipedia says 컴퓨터프로그램은 특정한 작업을 컴퓨터로 수행하기 위해 작성된 일련의 명령임



3. 프로그래밍 언어론의 학습효과

1) 효과적인 알고리즘을 개발할 수 있는 능력을 향상시킴

2) 현재 사용하고 있는 프로그래밍 언어의 이용도를 증진 시킴 

   : 언어들의 요소들이 어떻게 구현되었는지를 이해함으로써 개발능력 향상이 가능. 배열, 문자열, 레코드 등의 자료구조가 어떻게 생성되고 조작되는지 이해한다면 효율적인 프로그램 작성 가능

3) 유용한 프로그래밍 구조에 대한 어휘력 증진

4) 적절한 프로그래밍 언어 선택 가능, 실행속도가 중요하면 어셈블리어(C언어), 인공지능 응용 프로그램을 작성한다면 LISP, ML, Prolog 등 언어 선택, 기계에 대한 독립성이 요구된다면 JAVA, 보안이나 예외처리를 통한 프로그램 안정성이 요구된다면 JAVA나 C#언어 선택


4. 좋은 프로그래밍 언어의 조건

- 1960년대 : 최초 프로그래밍 언어의 기준은 효율성이였음, 프로그램의 적은 실행 메모리와 짧은 실행시간이 매우 중요했음. 


1) 해독성, 판독성, 가독성

- COBOL언어는 가독성이 중요하여 영어문장처럼 보이게 하여 전문가가 아닌 사람들도 프로그램을 쉽게 이해할 수 있도록 함

ex) C : Z= X + Y   / COBOL : ADD X TO Y GIVING Z

- 1970년 이후 기존 SW의 유지보수가 중요해지며 유지보수 용이성을 위해 판독성이 매우 중요한 요소가 됨. 모든 프로그래밍 언어는 주석을 허용


2) 간결성

- 간결성은 Pascal 언어의 주요 설계 목표였으며, 이에 따라 Pascal은 간결성으로 큰 성공을 거둠, 그러나 LISP와 Prolog는 몇개의 기본 문법구조를 가지고 있어 매우 간결한 언어지만 실행시간이 오래걸리는게 단점임

- C는 주로 전문가에 의해 사용되므로 매우 간결하게 표현할 수 있도록 함

ex) sum = ++index; <- index = index +1; 과 sum = index;를 합침


3) 프로그램 검증의 용이성

작성된 프로그램의 신뢰성은 매우 중요


4) 추상화/단순화(Abstraction)

- 컴퓨터 기술발전의 핵심 개념

- 추상화는 추상화된 객체가 자신의 복잡한 내부구조와 구현방법 등을 외부로 감추어 단순화 한다는 의미, 즉 객체의 필수조건인 속성만을 가지고 객체를 묘사하는 것, 추상화는 복잡한 것을 간단하게 사용할 수 있게 함으로써 복잡한 기능을 수행하는 프로그램을 간단하게 작성할 수 있게 해주는 매우 중요한 프로그래밍 언어의 요건건


- Stack 과 Queue는 추상화 자료의 대표적인 예로 일반적인 프로그래밍 언어에서 기본적으로 지원되는 자료형이 아님

- 스택은 저장할 자료형과 크기를 지정함으로 선엄할 수 있으며, 허용된 연산은 push()와 pop()이 있음.

- 스택 대신에 배열, 정수 변수를 사용하여 스택을 표현하고 프로그램에서 이용할 수 있으니 이렇게 하면 프로그램 이해가 어려워질 뿐만 아니라 프로그램 유지보수 또한 매우 어려워짐


5) 기계 독립성

- 특정한 프로그래밍 언어로 작성된 프로그램이 수정되지 않고서도 모든 컴퓨터 시스템 환경에서 실행될 때, 그 언어는 기계 독립성을 가진다고 할 수 있음

- JAVA가 많이 사용되는 이유가 기계 독립성을 지원하기 때문