본문 바로가기

대학교시절

프로그래밍 언어 정리

프로그래밍언어 (출처 : 컴퓨터과학총론)


6.1 역사적 고찰


 - 디버깅(debugging) : 프로그램이 완성되기 위해 오류들을 찾아 고치는 행위


 - 식별자(identifier) : 데이터 항목에 이름을 부여하여 일시적으로 규정하거나, 그 데이터의 어떤 특성을 표시하기 위해서 사용하는 기호


 - 어셈블러(assembler) : 기호 표현을 기계어 명령으로 변환해주는 프로그램


 - 어셈블리 언어(assembly language) : 프로그램 표현에 사용되는 기호체계


 - 단점 : 


  1) 기계 종속적-컴퓨터에 따라 고쳐야됨


  2) 기계어의 단순한 단계들로 주어지는 틀에 맞추어 사고하도록 강요됨


 - 기계독립적(machine independent) : 컴퓨터의 특성에 의존


 - 번역기(translator) : 기계어프로그램으로 번역


 - 컴파일러(compiler) : 고급 수준의 프리미티브들을 기계어 프로그램으로 번역-하나의 고급 수준 프리미티브가 요청하는 활동을 수행하기 위해 여러 개의 기계어 명령을 조합해야 한다는 점이 2세대vs3세대 언어의 차이점


 - 인터프리터(interpreter) : 컴파일러와 유사한 측면이 있지만, 컴파일러가 번역된 버전을 나중에 사용하기 위해 파일로 만드는 반면, 인터프리터는 번역하면서 실행한다는 점에서 차이가 있음


※ 소프트웨어 개발 패러다임


  1) 명령형 패러다임(imperative paradigm) : 문제를 해결하기 위한 알고리즘을 찾고 알고리즘을 일련의 명령으로 표현하는 접근 방법


  2) 선언형 패러다임(declarative paradigm) : 프로그래머가 구체적인 알고리즘이 아닌 해결해야 할 문제를 자체를 기술


  3) 함수형 패러다임(functional paradigm) : 프로그램은 사전 정의된 작은 함수라는 프로그램 단위들을 연결하여 구축됨, 각 함수의 출력은 다른 함수의 입력으로 사용되며 전체적으로 원하는 입력-출력 함수관계를 형성한다. 명령형 패러다임과의 차이점은 명령형은 어떤 계산을 수행하고 그 결과를 나중에 사용하기 위해 저장하는 여러 개의 문장으로 이루어진다.


  4) 객체지향 패러다임(object-oriented paradigm) : 소프트웨어 시스템은 객체라는 단위들의 집합으로 간주되며 객체는 자신에 직접 관련된 행위들을 수행하거나 다른 객체들의 행위를 요청할 수 있다. 이러한 객체들이 모여 당면 문제를 해결하기 위해 상호작용을 수행한다.


 - 클래스(class) : 객체의 성질을 기술하는 것


 - 인스턴스(instance) : 특정 클래스를 사용하여 구축된 객체를 해당 클래스의 인스턴스라고 부름


연습문제


1) 3세대 언어들이 기계 독립적이란 어떤 의미에서 인가? 또한 3세대 언어들의 기계 종속적인 측면은 무엇인가?

답 : 3세대 언어로 작성된 프로그램은 레지스터나 메모리 셀 주소 등과 같은 컴퓨터 속성을 사용하여 단계들을 기술하지는 않으며, 이러한 점에서 기계독립적이라 말할 수 있다. 그러나 산술적 오버플로나 절삭 오차 등이 여전히 발생한다는 면에서는 기계 종속적이라고 할 수 있다.


2) 어셈블러와 컴파일러의 차이는 무엇인가?

답 : 주된 차이점은 어셈블러가 소스 프로그램의 각 명령을 한 개의 기계어 명령으로 변환하는 반면, 컴파일러는 종종 한 개의 소스 프로그램 명령에 해당하는 코드를 얻기 위해 여러 개의 기계어 명령을 만들어낸다는 점이다.


4) 3세대 프로그래밍 언어들은 이전 세대의 언어들보다 고급 수준이라고 하는 것은 어떤 의미에서인가?

답 : 3세대 언어들에서 프로그램은 문제의 환경에서 나타나는 요소들로 표현돌 수 있으며, 이전 세대의 언어들에 비해 컴퓨터에 종속된 표현을 적게 사용한다.



6.2 전통적 프로그래밍 개념


※프로그램-문장의 집합으로 이루어짐


  1) 선언문(declarative statement) : 프로그램에서 나중에 사용할 용어들을 정의


  2) 명령문(imperative statement) : 프로그램의 바탕이 되는 알고리즘의 단계들을 기술한다.


  3) 주석(comment) : 프로그램이 수행하는 기능을 사람이 이해하기 쉬운 형식으로 설명함으로써 프로그램을 읽기 쉽게 해줌


 - 변수(variable) : 주기억장치상의 위치들을 숫자 형태의 주소대신 의미 있는 이름을 사용하여 표시할 수 있는데 이러한 주소 위치의 값


 - 데이터타입(date type) : 데이터항목을 어떻게 인코딩할지와 그러한 데이터에 대해 수행될 수 있(는 연산들을 규정하는, 선언문에 표시되는 메모리 위치에 저장할 값의 유형


 - 정수(integer) : 2의 보수 표기법을 사용하여 저장되는 정수를 가리킴


 - 실수(float,real) : 부동소수점 표기법으로 저장되며, 정수 이외의 숫자들도 포함할 수 있느 숫자 데이터를 가리킴


 - 문자(character) : 아스키나 유니코드로 저장되는 기호들로 이루어지는 데이터를 가리킴


 - 부울(boolean) : 참이나 거짓 값만을 가질 수 있는 데이터 항목


 - 프리미티브 데이터 타입(primitive data type) : 프로그래밍 언어에 프리미티브로서 포함된 데이터 타입


 - 데이터 구조(data structure) : 데이터에 대한 개념적 형태나 배치를 의미


 - 동질성배열(homegeneous array) : 1차원 리스트, 가로행과 세로열을 갖는 2차원 테이블, 또는 고차원 테이블 등과 같은 동일한 타입의 값들로 이루어진 블록


 - 이질성배열(heterogeneous array) : 원소들마다 타입이 달라질 수 있는 데이터 블록

 

 - 리터럴(literal) : 값이 미리 정해져서 고정된 값이 프로그램 안에서 사용될 때 값 자체를 표시하는 것


 - 상수(constant) : 변경되지 않는 특정 값에 서술적 이름을 부여하는데 이러한 이름을 상수라 부름(리터럴의 경우 프로그램의 수정작업을 어렵게 만들 수 있으므로)


 - 배정문(assignment statement) : 알고리즘의 기술 시 명령문들을 사용하여 이루어지는데 가장 기본적인 명령문이 배정문인데 이는 변수에 값을 배정하도록 요청한다


 - 연산자우선순위(operator precedence) : 연산 시 각 연산자에 우선순위를 갖게하여 식을 해석할 때 모호성이 없게함


 - 중복정의(overloading) : 많은 프로그래밍 언어들에서는 하나의 기호가 둘 이상의 연산을 나타내기 위해 사용될 수 있다. 이 경우 기호의 의미는 피 연산자의 데이터 타입 따라 정해짐


 - 구조적프로그래밍(structured programming) : 프로그래밍 방식중 일부로 조직적 설계 방법론과 프로그래밍 언어 제어문들의 방식이다.-쉽게 이해하고 명세에 맞는지를 확인하기 쉬운 프로그래밍이 중점


 - 주석(comment) : 번역기가 무시가 가능하는 프로그램 안에 추가적인 설명문



6.3 프로시저 단위


 - 프로시저(procedure) : 다른 프로그램 단위에서 추상적 도구로 사용될 수 있으며 어떤 작업을 수행하는 명령들의 모임


 - 호출(calling) : 제어를 프로시저로 이동하는 과정을 프로시저호출이라 한다.


 - 호출단위(calling unit) : 프로시저의 실행을 요청하는 프로그램 단위


 - 프로시저 헤더(procedure's header) : 프로시저는 대개 개별 프로그램 단위로 작성되는데 프로시저의 이름을 포함하는 프로시저 헤더라고 불리는 문장으로 시작된다.


 - 지역변수(local variable) : 일반적으로 프로시저 안에서 선언되는 변수


 - 참조범위(scope) : 어떤 변수가 참조될 수 있는 프로그램 부분


 - 전역변수(global variable) : 참조범위가 프로그램의 특정 부분으로 제한되지 안는 변수


 - 매개변수(parameter) : 프로시저가 호출될 때 구체화되는 일반형 명칭들을 포함하여 작성되기도 하는데 프로시저 내부의 일반형 명칭들을 매개변수라 부른다


 - 형식 매개변수(formal parameter) : 프로시저 내부의 일반형 명칭 ex) void GetValue(int value) - 여기서 value 부분


 - 실질 매개변수(actual parameter) : 호출될 때 정해지는 형식 매개변수의 정확한 의미 

    ex) GetValue(5) 여기서 5 부분


※실질매개변수와 형식 매개변수 사이에 데이터를 전달하는 작업 방식


  1.)값에 의한 전달(passed by value) : 프로시저에 주어지는 실질 매개변수가 나타내는 데이터의 복사본이 만들어져 프로시저에 전달 - 복사본에만 변화가 반영되며, 호출 프로그램 단위의 데이터는 전혀 변경되지 않는다


  2)참조에 의한 전달(passed by reference) : 값에 의한 전달은 대규모 데이터 블록의 경우 비효율적 - 실질 매개변수의 주소를 알려줌으로써 프로시저가 실질 매개변수에 접근 할 수 있게 하는 방식으로 프로시저에 전달


 - 함수(function) : 용어는 프로시저와 비슷하지만 어떤 값을 "함수 값" 이라며 호출 프로그램 단위에 전달한다는 차이가 있다.


연습문제


3) 많은 프로그래밍 언어에서 입출력 작업을 프로시저에 대한 호출로 구현하고 있는 이유는 무엇인가?

답 : 입출력 작업 자체가 프로시저들이기 때문이다. 실제로 I/O 작업은 컴퓨터 운영체제 안의 루틴들에 대한 호출로 이루어진다.


4) 형식 매개변수와 실질 매개변수의 차이는 무엇인가?

답 : 형식 매개변수는 프로시저 안에서 사용하는 식별자이며, 프로시저 호출할 때 프로시저 안에 전달되는 실질 매개변수의 값을 받는 자리를 마련하기 위한 것이다.


5) 프로그래머들은 프로시저 이름으로는 동사를 쓰며, 함수 이름으로는 명사를 쓰는 경향이 있다. 어떤 이유에서일까?

답 : 프로시저는 어떤 활동을 수행하도록 설계되어 있는 반면, 함수는 어떤 값을 만들어내도록 설계되어 있다. 따라서 프로시저의 이름이 수행하는 함수를 반영하고 함수이름이 반환하는 값을 반영할 경우 프로그램을 이해하기 쉬울 것이다.


6.4 언어의 구현


 - 번역(translation) : 한 언어에서 다른 언어로 변화하는 과정


 - 소스프로그램(source program) : 원래 형태의 프로그램


 - 목적프로그램(object program) : 번역된 버전


※번역과정


  1) 어휘분석 : 어휘분석기 - 하나의 개체를 표현하는 기호 열을 인식하는 과정 - 소스 프로그램을 기호단위로 읽어나가면서 각 단위로 분려하여 토큰이라는 꾸러미로 묶어 구문 분석기에 넘겨준다


  2) 구문분석 : 구문분석기 - 토큰단위들을 문장으로 묶는 작업을 한다, - 요즘은 자유 형식 언어 이므로 문장 끝을 표시하기 위해 세미콜론을 사용한다. 구절의 시작에는 ? if, then, else 등과 같은 키워드를 사용하고, 이런 키워드는 다른 용도로 사용될 수 없는 예약어이다. 프로그래밍 언어의 구문을 정의하는 규칙들의 집합(문법(grammer))에 기초하여 이루어진다.


 - 구문다이어그램(syntax diagram) : 프로그램의 문법적 구조를 그림으로 표현한 것


 - 모호한문법(ambigious grammer) : 하나의 문자열에 대해 두 개의 서로 다른 구문 분석 트리를 허용하는 문법 - 문제를 피하기 위해 괄호 사용


 - 심볼테이블(symbol table) : 구문분석기가 선언문을 인식하면 심볼테이블이라는 테이블 안에 선언된 정보를 기록 - 프로그램에 나타나는 변수와 이름과 관련 데이터 타입 및 데이터 구조 등에 관한 정보를 포함하게 된다


 - 묵시적변환(coercion) : 서로 다른 타입의 연산 중 구문분석기는 코드 생성기에게 값 중의 하나를 다른 타입으로 변환한 후 연산을 수행하기 위한 명령들을 생성하도록 요청할 수 있다.


 - 강한 타입 규칙(strongly typed) : (묵시적변환은 곧 프로그래밍 결함을 의미)-> 묵시적 변환 없이도 함께 쓰일 수 있는 데이터 타입을 사용해야 한다고 주장  - 이러한 언어들을 위한 구문분석기는 모든 타입 충동을 오류로 보고 한다.


  3) 코드생성(code generation) : 구문분석기가 인식한 문장을 구현하기 위해 기계어 명령들을 생성하는 과정


 - 코드최적화(code optimization) : 효육적인 기계어 버전 프로그램을 만들어내기 위해 여러 지식을 구현하는 과정


  4) 어휘분석기, 구문분석기 코드생성기는 순차적으로 핮나씩 수행되어야 하는 것이 아니라 교차적으로 수행되기도 한다. 객체지향 패러다임에 같이 소스프로그램, 어휘분석기, 구문 분석기, 코드생성기, 목적프로그램 등은 각자 자신이 맡은 작업을 수행하면서 서로에게 메세지를 보내어 상홪ㄱ용하는 객체들에 해당한다.


연습문제


1. 번역과정의 주요단계 세 개를 설명하라

    - 어휘분석 : 토큰들을 식별하는 과정

      구문분석 : 프로그램의 문법적 구조를 인식하는 과정

      코드생성 : 목적 프로그램의 명령들을 생성하는 과정


2) 심볼 테이블이란 무엇인가

    - 구문 분서긱가 프로그램의 선언문에서 얻은 정보에 대한 기록이다. 


6.5 객체지향 프로그래밍


 - 클래스(class) : 객체지향 패러다임에서 객체들을 위한 틀(template)


 - 인스턴스 변수(instance variable) : 객체 안에 들어 있는 변수


 - 메쏘드(method) : 객체 안의 프로시저(C++ 용어로는 멤버함수)


 - 생성자(constructor) : 클래스의 객체가 생성될 때 자동적으로 실행된다. 클래스 정의 안의 생성자는 클래스 이름과 동일한 이름을 갖는 메쏘드로 정의되며, 이러한 사실에 의해 다른 메쏘들과 구별된다.


 - 상속(inheritance) : 기존의 객체들과 비슷하지만 약간 다른 특성을 갖는 객체들에 대한 기술을 쉽게 할 수 있도록 하기 위해 객체지향 언어들은 상속이라고 불리는 기법을 통해 한 클래스가 다른 클래스의 속성을 포함훌 수 있게 해준다.


 - 다형성(poplymorphism) : 객체마다 메세지를 자신에 맞게 달리 해석하는 것을 다형성이라고 부르며 이러한 메시지를 다형적이라고 한다.


 - 캡슐화(encapsulation) : 객체 내부 속성에 대한 접근을 제한한다는 것을 가리킴. 객체의 어떤 속성이 캡슐화 되어 있다고 말하는 것은 오직 객체 자체에서만 그러한 속성에 접근 할 수 있음을 의미


 - 전용(private)속성 : 캡슐화된 속성

 - 공용(public)속성 : 외부에서 접근할 수 있는 속성

 

연습문제


1) 객체와 클래스의 차이는 무엇인가?

답 : 클래스는 객체에 대한 서술이다.


2) 생성자란 무엇인가?

답 : 생성자란 클래스의 인스턴스가 생성될 때 실행되는 클래스 안의 특별한 메쏘드이다.


3. 클래스 안의 일부 항목들이 전용으로 표시되는 이유는 무엇인가?

답 : 클래스 안의 어떤 항목들은 다른 프로그램 단위의 직접적 접근을 막기 위해 전용으로 지정된다. 그 어떤 항목이 전용으로 지정되어 있을 경우, 그 항목에 대한 수정으로 인한 파급 범위가 그 클래스 내부로 제한될 것이다.


6.6 병행 활동 프로그래밍


병렬처리(parallel processing), 병행처리(concurrent processing) : 여러 프로그램에 대한 활성화를 동시에 실행시키는 것, 진정한 병렬처리를 위해서는 각 활성화에 한 개씩 여러개의 CPU가 필요하나, CPU가 하나밖에 없을 경우는 여러개의 활성화가 단일 프로세서의 시간을 나누어 쓰는 방법으로 병렬처리가 이루어지는 것 같은 착각을 일으킨다.


※상호 배제 접근성 한번에 한 쓰레드(활성화)에 의해서만 접근할 수 있는 데이터는 상호 배제 접근성을 갖는다고 표현된다. - 둘이 동시에 데이터를 사용하면 안 되므로.


  - 구현하는 방법 예시 : 한 쓰레드가 공유 데이터를 사용할 때 다른 쓰레드들이 안전하게 접근할 수 있을 때 까지 다른 쓰레드들의 접근을 차단하도록 관련 쓰레들을 기술하는 프로그램 단위를 작성하는 것


  - 단점 : 상호 배제를 보장하는 책임을 프로그램의 다양한 부분에 분산 시키는 단점이 있다.


  - 결론 : 데이터 항목 자체가 자신에 대한 접근을 제어할 수 있는 능력을 갖도록 만들자


  - 해석 : 공유 데이터에 접근하는 쓰레드들이 다중 접근에 대한 보호를 적절히 구현하는 것을 믿기보다는 데이터 항목 자체에 이러한 책임을 맡기자는 것


 - 모니터(monitor) : 자신에 대한 접근 제어 능력을 갖춘 데이터 항목


※ 요약

  - 병렬처리를 위한 프로그래밍 언어의 설계에는 쓰레드의 생성, 쓰레드의 일시적 중단 및 재가동, 임계 구역의 식별, 모니터의 구성 등과 같은 사항을 표현하기 위한 방법을 개발하는 일이 포함되어 있다.


연습문제


1) 일반 프로그래밍 언어에서는 볼 수 없지만 병행 처리를 위한 프로그래밍 언어에서 나타나는 것에는 어떤 것들이 있는가?

답 : 병행 프로세스 실행을 개시하기 위한 기법, 프로세스 간 통신을 구현하기 위한 기법 등을 들 수 있다.


2) 데이터에 대한 상호 배제 접근을 보장하기 위한 두 가지 방법을 설명하라.

답 : 한가지 방식은 프로세스들에 맡기는 방법이며, 또 다른 방식은 데이터에 맡기는 방법이다. 후자의 방식에서는 관련 직업이 프로그램 안의 한 곳에 모여 있게 되는 이점이 있다.


3) 애니메이션 외에 병렬처리가 도움이 되는 상황들을 들어보라

답 : 기상 예측, 항공 트래픽 제어, (핵반응에서 보행자 트래픽에 이르기까지의) 복잡한 시스템의 시뮬레이션, 컴퓨터 네트워킹, 데이터베이스 유지관리


6.7 선언형 프로그래밍(이해가 잘 안감)


 - 분해(resolution) : 연역적 추론 원리의 한 예로 명제들의 집합에서 결론을 유도하는 데 사용되는 추론규칙(inference rule)이라 불리는 많은 기법들 중의 하나