-
프로그래밍 언어론 1장공부 2018. 10. 1. 19:55
컴퓨터 과학도와 개발자들이 언어 설계와 평가에 대한 일반적인 개념을 배워야 하는 이유가 뭘까?
1-1 프로그래밍 언어의 개념 학습 이유
1) 생각을 표현할 수 있는 능력이 향상된다.
사람이 생각할 수 있는 깊이는 그들의 언어 표현력에 영향을 받는다. 즉 사람이 말이나 글로 기술할 수 없는 구조를 개념화하는 것은 어렵다.
소프트웨어를 개발하는 과정에서도 데이터 구조, 제어 구조, 추상화의 종류, 알고리즘의 형태 등 제약을 받는다. 프로그래밍 언어의 특징에 대해 다양하게 알고 있으면 소프트웨어 개발에서 이런 제약을 줄일 수 있다.
2) 적합한 언어를 선택할 수 있는 배경이 향상된다.
많은 프로그래머들은 새로운 프로젝트를 위한 언어로 자기가 가장 잘 아는 언어를 쓴다. 근데 그 언어가 프로젝트에 적합하지 않는 경우도 있다. 프로그래머가 언어와 언어구조들에 대해 더 폭넓게 잘 알고 있으면 문제를 가장 잘 해결할 수 있는 특징들을 갖는 언어를 더 잘 선택할 수 있다.
3) 새로운 언어를 배울 수 있는 능력이 향상된다.
컴퓨터 프로그래밍 분야는 항상 새로운 것이 나오므로 프로그래머는 지속적인 학습이 필수적이다. 프로그래밍 언어의 개념들을 이해하는 프로그래머는 새로운 언어를 배울 때 훨씬 쉽게 습득할 수 있다.
4) 구현의 중요성에 대해 보다 많이 이해한다.
언어의 개념을 배울 때 이런 개념에 영향을 미치는 구현상의 고려 사항들을 이해함으로써 언어가 왜 이렇게 설계되었는지를 이해할 수 있다. 따라서 언어를 더 지능적으로 사용할 수 있게 된다.
5) 이미 알고 있는 언어에 대한 더 나은 사용.
많은 오늘날의 프로그래밍 언어는 규모가 크고 복잡하므로 해당 언어의 모든 특징들을 잘 알고 사용하는 것은 힘들다. 프로그래밍 언어의 개념들을 학습함으로써 프로그래머는 이미 사용하고 있는 언어에서 이전에는 몰라서 사용하지 않았던 특징들을 배워 사용할 수 있다.
6) 전반적으로 전자계산 분야의 이해 향상
1-2 프로그래밍 영역
응용 분야별 적절한 언어에 대해 알아봄
1) 과학 응용 분야 - 40년대 말 ~ 50년대 초반에 첫번째 컴퓨터는 과학 응용분야를 위해 고안되었다. 이 분야에서는 상당한 양의 부동 소수점 산술 연산을 요구했다. 가장 일반적인 데이터 구조는 배열과 행렬이며 제어 구조는 루프와 선택문을 사용했다. 당시 개발된 언어는 어셈블리어의 경쟁상대로 포트란과 ALGOL60이었다. 포트란이 채택되어 아직도 이 분야에서 사용된다.
2) 사무 응용 분야
사무 응용 분야는 상세 보고서를 생성하고 십집수와 문자데이터를 정확하게 표현하고 저장할 방법, 십진수의 산술 연산을 표현할 수 있는 능력이 요구된다.
이 분야에서 첫 번째로 성공한 고급 프로그래밍 언어는 코볼이다. 코볼 이외의 사무용 언어는 개발되지 않았다.
3) 인공지능 분야
인공지능 분야는 수치 계산보다는 기호 계산으로 특징지어지는 광범위한 컴퓨터 응용 분야이다. 기호계산이란 숫자보다 이름들로 구성된 기호들이 조작된다는 것을 의미한다.
이런 유형의 프로그래밍은 때때로 더 많은 융통성을 요구한다.
LISP가 처음 널리 사용되었고 70년대 초에 이 분에 대한 다른 접근방식을 사용하는 Prolog언어가 나왔다. Scheme이라는 LISP의 파생형 언어도 나왔음. 최근에는 AI 응용프로그램에 C와 같은 시스템 언어로 작성하는 경우도 있다.
4) 시스템 프로그래밍
시스템은 지속적으로 사용되므로 효율적이어야 하고 더욱이 외부 장치와의 소프트웨어 인터페이스 작성을 위해 저수준의 특징을 포함해야 한다.
60년대와 70년대 PL/S, BLISS, ALGOL등의 언어가 있었는데 최근에는 일반적으로 C나 C++를 사용한다.
5) 웹 소프트웨어
마크업 언어인 HTML부터 JAVA까지 다양한 언어가 쓰인다.
1-3 언어 평가 기준.
프로그래밍 언어의 특징들을 평가하는 기준에 대해 배운다. 여기선 세가지 판독성, 작성력, 신뢰성을 평가기준으로 삼았다.
1) 판독성
프로그래밍 언어를 평가하는 데 있어서 가장 중요한 기준 중 하나는 프로그램을 얼마나 쉽게 읽고 이해할 수 있느냐는 것이다.
프로그래밍 언어의 판독성에 기여하는 특성들은 다음과 같다.
1-1) 전반적인 단순성
판독성에 전반적인 언어자체의 단순성이 큰 영향을 미친다.
많은 기본 구조를 가진 언어는 더 적은 개수의 기본 구조를 가진 언어보다 배우기가 어렵다. 대개 규모가 큰 언어를 배워야 할 때 언어의 일부분만을 배우고 다른 특징을 무시하게 된다. 이러한 방법은 올바르지 않음.
프로그래밍 언어를 복잡하게 만드는 특성으로 특징 다중성이 있다. count++, ++count, count = count + 1, count += 1 과 같이 서로 약간의 의미가 다르긴 하지만 단순 정수 변수의 값을 4가지의 방법으로 증가시킨다. 이와 같이 같은 행동을 표현하는데 여러가지 방법을 갖는 것을 특징 다중성이라고 한다.
한 개의 연산자 기호가 한 개 이상의 의미를 갖는 연산자 중복도 프로그래밍을 복잡하게 만든다. 유용하게 사용 될 수도 있지만 판독성 측면에선 좋지않다.
1-2) 직교성
직교성(orthogonality)이란 적은 개수의 기본 구조가 적은 개수의 방법으로 조합되어 언어의 제어 구조와 데이터 구조가 생성될 수 있다는 의미이다.
예를 들어 데이터 타입(정수, 실수)와 타입 연산자(배열, 포인터) 등을 조합하여 정수형 배열, 실수형 포인터와 같이 데이터 타입을 정의한다는 것이다.
직교적 언어 특징의 의미는 프로그램 형태와는 관계없다.
직교성은 언어의 기본 요소들 간의 관계 대칭성을 의미함. 직교성이 결여되면 언어규칙에서 예외 사항이 초래된다.
직교성은 단순성과 밀접하게 관련된다. 언어 설계가 더 많이 직교적일수록 언어 규칙은 더 적은 예외를 갖는다.
1-3) 데이터 타입
언어가 데이터 타입과 데이터 구조를 정의할 수 있는 충분한 장치를 제공하면 판독성에 도움이 된다. 예를들어 BOOLEAN타입이 제공되지 않아 true false 대신 0과 1로 참 거짓을 표현한다면 판독성에 좋지않다.
1-4) 구문 설계
특수어 – 제어 구조에서 복합문을 형식화 하는 방법에서 어떤 언어는 특수어나 기호들로 구성된 서로 매칭되는 쌍을 사용해 문장그룹을 형식화한다. { ~~~ } 와 같은 방식으로. 이 방식은 문장 그룹들이 항상 동일한 방식으로 끝나기 때문에 어느 그룹의 끝을 나타내는 것인지 혼동이 올 수 있다. Fortran 95와 Ada언어에선 end if, end loop 와 같이 end + 특수어로 문장 그룹의 끝을 나타냈다.
형식과 의미 – 문장의 뜻은 문맥에 따라 다른 의미를 가지면 안된다. 항상 일관된 뜻을 가져야함. C언어의 Static은 함수내부에서는 변수 정의에 사용되면 컴파일 시간에 생성됨을 의미하고 함수 밖에선 그 정의가 나타난 파일 내부에서만 작동함을 의미하므로 문맥에 따라 의미가 달라진다.
2) 작성력
작성력은 선택된 문제 영역에 대해 프로그램을 생성하는데 언어가 얼마나 쉽게 사용될 수 있는가에 대한 척도이다. 판독성에 미치는 언어 특성의 대부분은 작성력에도 영향을 미친다.
작성력의 특징들
2-1) 단순성과 직교성
언어가 너무 많은 구조를 포함하면 프로그래머는 이런 구조를 모두 잘 알고 있지 않을 수 있다. 이런 상황은 어떤 특징에 대한 오용을 초래할 수 있으며 또한 더 우아하거나 더 효율적인 특징들이 사용되지 않을 수 있다.
따라서 적은 수의 기본 구조와 이들을 조합하기 위한 일관된 규칙을 갖는 것이 단순히 많은 기본 구조를 갖는 경우보다 훨씬 더 좋다.
2-2) 추상화의 지원
추상화는 많은 세부 사항이 무시될 수 있는 방식으로 복잡한 데이터 구조나 연산을 정의하여 사용할 수 있는 능력을 의미함.
2-3) 표현력
표현력이란 언어가 계산을 명세하는 데 있어서 상대적으로 편리한 방식을 제공한다는 것이다.
3) 신뢰성
프로그램은 모든 조건에서 주어진 명세에 따라 수행한다면 신뢰적(Reliable)이라고 한다.
프로그램의 오류를 일찍 탐지할수록 시간비용을 줄일 수 있다.
3-1) 타입 검사
3-2) 예외처리
3-3) 별칭
별칭이란 동일한 기억 장소에 접근하는데 두개 이상의 다른 이름을 갖게 할 수 있는 것이다.
예를 들어 동일한 변수를 가리키도록 설정된 두 포인터가 이러한 것이다.
어떤 언어에서는 부족한 데이터 추상화 기능의 보완을 위해 별칭을 사용하며 또 다른 언어에서는 언어의 신뢰성 향상을 위해 별칭을 제약한다.
3-4) 판독성과 작성력
요구된 알고리즘을 표현하기 부적절한 언어로 작성된 프로그램은 어쩔수 없이 부자연스러운 접근 방법을 사용하게 될 것이다.
판독성은 소프트웨어 생명 주기의 코딩과 유지보수단계에서 신뢰성에 영향을 미친다. 판독이 어려운 프로그램은 작성하고 수정하기 어렵다.
4) 비용
프로그래밍 언어의 최종 비용은 언어의 여러가지 특성들로 결정된다
언어를 사용하는 프로그래머를 교육하는 비용, 언어를 사용해 프로그램을 작성하는 비용, 언어로 작성된 프로그램을 컴파일하는 비용, 프로그램을 실행시키는 비용, 언어구현 시스템의 비용, 프로그램 유지보수 비용 등이 든다.
1.4 언어 설계에 미친 영향
1) 컴퓨터 구조
컴퓨터 기본 구조는 언어 설계에 영향을 끼친다. 지난 50년간 널리 사용된 대부분의 언어는 폰노이만 구조에 기반해 설계되었다. 이러한 언어를 명령형 언어라고 한다.
폰노이만 구조에서 기계 코드 프로그램 실행은 반입-실행 주기에 따라 이루어지며 다음으로 실행할 명령어는 프로그램 계수기(PC) 레지스터에 저장된다.
함수형 언어, 즉 적용 언어는 계산 표현의 주요 수단으로 함수를 주어진 매개변수에 적용하는 언어으로 명령형 언어와 달리 변수 유형, 배정문, 반복문 등을 사용하지 않고서 함수형 언어로 이루어 질 수 있다.
2) 프로그래밍 설계 방법론
60말 ~ 70초에 소프트웨어 개발 과정과 프로그래밍 언어 설계에 대한 심층적인 분석이 주로 구조화 프로그래밍 운동에 의해 시작되었다.
이 결과로 등장한 소프트웨어 개발 방법론으로 하향식 설계와 단계적 세분화이다. 그 후 프로세스 지향 프로그램 설계 방법론에서 데이터 지향 프로그램 방법론 그리고 80년 초에 객체지향 설계가 등장한다.
5. 언어부류
프로그래밍 언어는 보통 4가지로 분류된다. 명령형언어, 함수형 언어, 논리 언어, 객체지향 언어.
언어의 다른 유형인 비주얼 언어는 명령형 언어의 서브카테고리에 해당한다. 예로 .NET이 있다.
스크립트 언어는 일반적인 언어 설계 보다는 그 구현방법에 연관되어 있어 따로 분류하지 않는다.
논리 프로그래밍 언어는 규칙-기반 언어이다. 명령형 언어에서 알고리즘은 매우 상세하게 명세되며 명령어나 문장들에 대한 특정 실행 순서가 포함되나 규칙기반 언어에선 규칙들이 특정 순서없이 명세되며 언어구현시스템이 요구된 결과를 생성하기 위해 규칙이 사용되는 순서를 선택해야 한다.
마크업 언어는 프로그래밍 언어가 아니다.
6. 언어 설계 절충
언어 설계 시에 평가 기준이 상충되는 경우가 있다.
예를 들어 자바는 배열 원소에 대한 모든 참조가 적법한지를 검사한다. 이로 인해 신뢰성은 올라가겠지만 실행시간이 늘어난다. C언어는 반대로 배열 원소에 대한 검사를 하지 않음으로써 빠른 실행속도를 가진다.
7. 구현방법
언어 구현 시스템은 운영체제 위의 계층을 차지한다.
프로그래밍 언어 구현의 일반적인 세가지 방법으로 컴파일러 구현, 인터프리터, 혼합형 세가지이다.
컴파일러는 프로그램을 컴퓨터에서 직접 실행될 수 있는 기계어로 번역하는 방법이다. 번역과정을 마치면 매우 빠른 프로그램 실행의 강점을 갖는다 – C, C++, COBOL, Ada
원시프로그램 -> 어휘분석 -> 구문분석 -> 코드 생성 -> 링킹
인터프리터 구현은 프로그램을 어떠한 번역과정 없이 인터프리터라 불리는 또 다른 프로그램에 의해 해석되는 방식이다. 디버깅 연산을 쉽게 구현 가능하다는 장점을 갖는다. 단 컴파일러 방식보다 느린게 단점이다. – LISP, JS, PHP
혼합형 구현시스템은 위 두 방식의 절충이다. 고급 언어 프로그램을 용이한 해석이 가능하도록 중간 언어까지만 해석한다. 인터프리터 보다는 빠르다.
1.8 프로그래밍 환경
소프트웨어 개발에 사용되는 도구의 모임으로 UNIX, 비주얼 스튜디오 등등을 칭함.
'공부' 카테고리의 다른 글
유닉스 프로그래밍 1장 기본개념과 용어 (0) 2018.10.06 프로그래밍 언어론 2장 (0) 2018.10.02 헬로코딩 5장 해시테이블 (0) 2018.09.21 헬로코딩 챕터 4 퀵정렬 (0) 2018.09.21 헬로코딩 챕터 3 재귀 (0) 2018.09.20