프로그래밍 언어란 무엇인가
언어와 프로그래밍 언어의 정의
언어란 의사전달도구로서, 다른 사람에게 뜻과 감정을 전달하려 할 때 말하고 글을 쓴다. 이러한 언어는 모두 상대방에게 의사 전달 목적을 달성하기 위해 이용한다. 프로그래밍 언어는 전달해야 되는 대상이 컴퓨터이고 이는 궁극적으로 컴퓨터가 수행해야 하는 계산을 목표로 한다. 계산이란 주어진 문제로부터 원하는 답을 찾기 위해 수행하여야 하는 명확한 절차를 뜻하는데 이 절차가 유한한 단계 안에 끝나야 알고리즘이라고 부른다. 따라서 프로그래밍 언어는 계산을 표기하는 방법이라고 할 수 있으며 컴퓨터를 대상으로 하고 있어 전달하고자 하는 상대방은 컴퓨터이다. 하지만 이러한 계산은 사람마다 다르게 작성할 수 있어서 서로 비교하여 더욱 더 좋은 방법을 비교할 수 있어야 하기 때문에 사람이 읽을 수 있어야 하므로 사람도 고려해야 한다. 프로그래밍 언어란 결국 컴퓨터가 수행할 수 있고 사람이 읽을 수 있는 형태로 계산을 나타낼 수 있도록 하는 표기 체계이다.
프로그래밍 언어의 특징
첫번째 특징은 주로 글의 형태로 사용된다는 것이다. 가장큰이유는 말을 인식 못하기 때문인데 최근 몇 가지 명령어로 인공지능 도우미가 개발되었지만 이경우 프로그래밍 언어라고 하지 않는다.
두 번째 특징은 정확한 규칙에 따르고 있다는 점이다. 자연어 같은 경우 애매모호함, 함축성등이 예술로 전달될 수 있지만 프로그래밍언어는 조금이라도 정확하지 않다면 컴퓨터는 이를 수행할 수 없다.
세 번째 특징은 단방향성을 가지고 있다는 점이다. 자연어는 서로 주고받고 하는 양방향의 언어로 "대화"라고 표현할 수 있지만 프로그래밍 언어는 일방적으로 사람이 기계에게 명령하는 단방향을 가지고 있다.
예외로 첫 번째 특징에 그림형태의 프로그램이 존재하기도 하는데 이런 언어를 시각적 언어라고 하며 MIT의 스크래치나 내셔널 인스트루먼트의 랩뷰 등이 있다. 또한 세 번째 특징에서 사람-프로그램-컴퓨터로 이어지는 단방향이 목적이지만 사람이 봤을 때 가독성을 고려하면 양방향의 특징도 가지고 있다고 볼 수 있다.
자연어 | 프로그래밍언어 | |
형식 | 말과글 | 주로 글 |
내용 | 모호, 함축 | 엄밀한 규칙과 정확한의도 |
방향성 | 양방향 | 단방향 |
프로그래밍 언어를 배워야 하는 이유
기본적으로 언어를 배워야 하는 이유와 같다 언어는 우리의 사고능력과 밀접한 관련이 있는데 프로그래밍 언어도 마찬가지이다. 이러한 프로그래밍을 배워야 하는 이유로는 체계적으로 생각하는 방법을 가르쳐 주기 때문이다. 프로그래밍은 본질적으로 프로세스를 상상하며 글을 쓰는 작업이므로 변화되고 있는 상황을 가정할 수밖에 없다. 하여 동적으로 변화하는 어떤 대상을 표현하는 방법을 가르쳐준다.
프로그래밍 언어의 기능
기본 기능
프로그래밍 언어의 기능에는 프로그래머의 의도를 작성된 프로그램을 컴퓨터가 수행할 수 있는 형태로 바꿔주는 것이다. 이렇게 의도를 수행하는 형태로 작성하는 것을 작성력이라고 한다. 또한 작성된 프로그램을 쉽게 사람이 해독할 수 있는 기능을 가독성이라고 한다. 이는 프로그래머끼리의 프로그램의 내용을 잘 전달이 되면 특히 프로그램 유지보수에 중요하다. 또한 프로그래밍 언어로 작성한 프로그램은 컴퓨터에서 실행할 수 있어야 하며 이를 실행 가능성이라고 한다.
부가기능
추상화란 어떤 대상을 간략하게 추려서 나타내는 것으로 말하며, 예를 들면 스틱맨의 경우 사람을 추상화한 모습이다. 이처럼 구체적인 대상에서 원하는 특징을 잡아 간략하게 나타내는 것을 추상화라고 한다.
모듈화란 복잡한 대상을 나누어 구성하는 것이다. 곤충을 머리, 가슴, 배로 나눈 것이 모듈화의 예이다. 모듈화는 단순히 나누는 것에서 끝이 아니라 연결도 염두에 두어야 한다.
프로그래밍 언어의 특성
프로그래밍언어의 첫 번째 특성은 기계적으로 처리될 수 있어야 한다는 것이다. 엄밀한 규칙에 따라 작성된 프로그램은 기계가 처리하기에 적합하며 의도대로 처리될 수가 있다. 두 번째로 구조적이라는 특성을 갖는다. 복잡한 문제를 다루는 경우가 많아 다양한 구조를 지원하여 복잡성을 처리할 수 있도록 한다. 크게 두 가지로 분류하면 자료 구조와 제어구조로 나뉜다. 세 번째로 가변적이라는 특성이 있다. 시대의 흐름 환경의 변화에 따른 요구사항에 따라 변화한다. 프로그래밍언어들은 항상 버전 업데이트를 하며 발전하여 가변적이며 새로운 기능을 추가하는 형태로 발전한다.
스펙트럼
프로그래밍언어는 컴퓨터의 제약사항과 프로그래머의 요구사항 사이에서 다양한 스펙트럼으로 존재한다. 이는 추상화 수준에 따라 달라진다. 추상화 수준이란 얼마나 고급 수준까지 나타낼 수 있느냐는 것인데 어셈블리어는 기계어와 밀접하여 추상화 수준이 낮지만 C언어나 파이선은 기계에 독립적으로 사용할 수 있기 때문에 추상화 수준이 높다. 이러한 추상화 수준은 서로의 변환가능성으로 가늠할 수 있는데 C코드를 어셈블리어로 바꿀 수 있지만 어셈블리어로 작성된 코드를 C코드로 바꾸는 것은 매우 어렵다. 또한 파이선 코드를 C코드로 바꾸는 것이 C코드를 파이선 코드로 바꾸는 것보다 쉽다. 따라서 어셈블리어보다는 C언아가C언어보다는 파이선이 추상화 수준이 높다고 할 수 있다. 이는 고급언어와 저급언어를 구분하는 기준이 되며 고급언어는 기계에 독립적이다 따라서 고급언어로 작성된 프로그램은 특정 기계에 한정되지 않고 여러 기계에서 수행이 가능하다 반대로 저급언어로 작성된 프로그램은 작성된 기계에서만 실행된다.
프로그래밍 언어의 구성요소
데이터
프로그램은 데이터를 처리한다 데이터란 어떤 자료를 프로그램이 처리할 수 있는 형태로 나타낸 것이다. 이러한 데이터는 모두 이진수 형태로 나타낸다. 텍스트 데이터는 특별한 인코딩 방법을 가정하여 우리에게 보여준다. 컴퓨터가 처리하는 데이터를 크게 두 가지로 나눈다면 텍스트 테이터와 이진 데이터로 나눌 수 있다.
이진데이터란 이진수로 나열된 데이터를 말하고 대부분 정수의 형태로 나타내며 정수의 범위는 한 워드로 나타낼 수 있는 범위로 한정되어 있다. 요즘은 음수를 나타내기 위해 2의 보수 표기를 사용하는데 나타내 수 있는 양수의 범위를 늘리기 위해 무부호 정수표기를 사용하기도 한다. 그리고 과학 계산에 중요한 수 표현으로는 부동소수점 수 표현이 있다. 이는 소수점 이하를 나타내는 가수와 2의 거듭제곱 횟수를 나타내는 지수, 부호 비트로 나누어 표기하는 방법이다.
텍스트 데이터는 문자열을 나타낼 때를 말한다. 문자열을 나타낼 때는 문자에 대응하는 이진 표현이 무엇인가 중요하고 문자와 이진 표현 사이의 대응 관계를 코드라고 부른다. ASCII코드가 대표적이다. 7비트로 표현할 수 있다는 장점이 있지만 영문만 나타낼 수 있다는 한계가 있고 이를 극복하기 위해 유니코드가 개발되었다. 유니코드는 문자집합과 인코딩의 조합으로 코드를 나타낸다.
또한 미디어 데이터들은 이진 데이터로 볼 수 있는데 비영어권 문자를 나타내기 위해 인코딩 기법을 사용한 것처럼 미디어데이터는 이와 유사한 프로그램을 코덱이라고 부르기도 한다. 이러한 특별한 인코딩을 하는 이유는 데이터의 크기를 압축하여 효율적으로 표현하기 위함이다.
연산
데이터 처리 방법을 연산이라고 한다. 연산을 수행하는 함수를 연산자라고 하는데 2라는 정수와 3이라는 정수 데이터를 받아 5라는 합을 생성하는 함수는 프로그래밍 언어에서 통상 덧셈 연사자 +로 나타낸다. 그리고 이러한 연산결과를 저장하는 이름을 변수라고 부른다. 이러한 변수에 처음 값을 저장하면 값을 저장하는 연산이 필요한데 이를 대입 연산 또는 대입이라고 부른다. 대입연산자는 계산한 값을 나중에 이름으로 사용이 가능하다. 쉽게 아파트 이름 같은 것을 말할 수 있다.
대부분의 프로그래밍 언어는 수식과 문장의 구조를 통해 연산을 나타낸다. 수식이란 값을 나타내는 표현을 통칭하기 때문에 연산자가 없어도 값을 나타낸다면 수식이라고 부른다. 2+3을 놓고 보면 2도 수식이고 3도수식이고 2+3도 수식이다.
abc="Hello C?"
이러한 표현은 수식이지만 이 값을 출력하는
printf(abc);
의 표현은 문장이다. 사실 C언어에서는 모든 수식의 끝에 ;을 찍으면 문장이 된다.
abc="Hello C?"; 은 대입문이 된다.
그리고 printf(abc) 쌍반점을 빼면 수식이 된다. 이때 수식의 값은 표준 출력으로 제대로 출력된 글자수 가 된다. 그래서 print가 아닌 printf로 명명하는 것이고 f는 함수라는 뜻으로 어떤 값을 반환한다는 의미이다.
명령어
명령어는 if나 while처럼 특정작업을 지시하는 단어를 의미한다. C프로그램의 경우 특정 함수를 이용하여 사용자 지정 명령어를 구현할 수 있으며 이때 함수가 명령어를 대신한다는 것을 void함수로 만들기도 한다. 대부분의 프로그래밍 언어는 다양한 연산자와 명령어를 통해 수식과 문장을 구성한다. 하지만 이것만으로는 충분하지 않아 사용자정의 연산으로 프로그래머가 추가로 연산을 정의할 수 있도록 하고 있다.
이것과 대비해서 프로그래밍 언어가 기본적으로 제공하는 것을 원시연산이라고 하고 여기에 포함되지는 않지만 자주 사용할 것 같은 연산을 미리 정의해 두는데 이를 라이브러리라고 하고 해당프로그래밍언어에서 기본적으로 제공하는 것을 표준 라이브러리라고 한다. 이는 C언어에서 발전해서 대부분의 언어가 제공하고 있다.
서브 프로그램
변수는 값에 이름을 부여한 것이고 코드에 이름을 부여한 것이 서프 프로그램이다. 여러 작은 코드에 이름을 붙이면 프로그램을 구조화할 수 있고 이러한 정의는 여러 번 사용할 수 있는 장점이 있다. 이러한 이유로 서브 루틴이라 하기도 한다. 또한 이름을 붙이면 이름 자체를 통해 의미 파악이 돼서 프로그램 문서화에도 도움이 된다.
서브 프로그램은 값 반환 여부에 따라 두 가지로 분류가 가능하다. 연산 수행결과 값을 반환하는 함수가 결과 값을 반환하지 않는 서브프로그램인 프로시저이다. 함수는 덧셈연산자등과 마찬가지로 값을 반환한다. 그리고 프로시저는 void함수 같은 것으로 부수효과를 통해 목적을 달성하는데 전역변수나 화면, 파일 등 광범위한 것을 환경이라고 하며 이러한 환경이 변화되는 효과를 의미한다. pirntf가 발생하는 부대효과는 값을 나타내는 것이 아니라 화면 출력하는 부수효과를 생각하면 되겠다.
타입
데이터의 집합과 연산 집합을 합친 개념으로 전통적으로 타입은 int 타입이라고 하면 정수집합을 의미하고 float 타입이라면 소수의 집합을 의미하는 데이터 집합이었다.
현대에는 해당 데이터에 적용 가능한 연산 집합도 포함한다. 예를 들어 함수 f의 타입이 f(x):A→B라면 모든 a∈A에 대해 f(a)∈B이라고 한다면 이 프로그램은 타입안전이라고 한다 이는 오류가 발생하지 않는다. 그래서 타입은 연산의 안정성을 보장하기 위해 필요하다.
강타입언어 : 오류를 모두 검출하는 언어 Haskell이나 ML, 자바는 강타입과 약타입에 특징이있다.
약타입 : 일부 타입에 오류를 허용하는 언어 C언어
무타입 : 타입 선언문도 없고 어떤 대상의 타입이 계속 변경될 수 있는 언어 파이선과 같은 스크립트 언어
모듈
독립적인 프로그램 구성단위를 모듈이라고 한다. 모듈은 내부와 외부를 구별하여 독자적인 이름공간을 차지하고 있어 프로그램을 구성하기에 적합한 단위라고 볼 수 있다. 작게는 서브프로그램도 모듈이라고 할 수 있으며 이러한 집합을 모듈로 활용할 수있다. 모듈이름의 충돌을 줄이기 위해 이름공간이라는 새로운 개념을 C++에서는 사용하였고 자바등 객체지향언어에서는 클래스를 모듈로 활용할수 있다. 또한 모듈은 컴파일 단위에 해당하거나 상위에 해당한다 따라서 운영체제 파일시스템에 파일이나 폴더로 구현되는 경우가 많고 여러 프로그래머가 협업할 경우에도 각각 담당한 모듈의 인터페이스를 먼저 정해두고 개별적으로 동시 구현할 수가 있다. 이럴 때에 간단한 임시코드를 구연하는 거를 스텁이라고 하며 담당 개발자가 그 코드를 만들 때까지 다른 개발자는 스텁을 이용해 코드를 테스트해 볼 수 있다. 또한 이름 충돌을 해결하는데도 도움이 된다 여러 사람이 작성하면 이름이 충돌될 수 있는데 모듈은 내부와 외부에 정의된 이름을 구별할 수 있다. 자바에서 클래스가 다르면 이름이 같아도 사용하는데 문제가 없었다. 이것이 모듈의 이름공간을 뜻하는것일까 하는 생각이 든다.
그럼 데이터 - 연산 - 명령어 - 타입 - 모듈(서브프로그램) 이라고 생각하면 되려나 이렇게 점점 확장되는 느낌이라고 생각이든다.
프로그래밍 언어 학습 방법
프로그래밍 언어의 두 가지 측면
구문론:프로그램 형태에 관한 이론
쉽게 엄밀한 규칙이 정해져 있다는 것이다. 알파벳을 쓰거나 이러한 구문의 프로그램형태를 규정하는 것을 말한다.
의미론 : 프로그램 수행 의미에 관한 이론
구문론을 실제작성하는 방법을 나타낸다면 의미론은 프로그램이 수행해서 동작하는 과정을 나타내는 것을 말하는 것으로 보인다.
프로그래밍 언어 어떻게 배워야 하나
좋은 프로그램을 많이 읽고 많이 작성해 보고 직접 실행해 보며 생각해 봐야 함
프로그래밍 언어의 선택방법
초보자는 자신이 조금이라도 알고, 사용해 볼 수 있으며 주위에서 정보를 얻을 수 있는 언어이고 관리하기 쉬운 언어
숙련자는 자신이 아는 언어와 유사한 언어와 업무 분야에서 사용되는 언어
프로그래밍 언어 학습요령
눈보다 손으로 기계적으로 타이핑하고 실행시켜 봐야 하며 샘플코드를 눈으로 실행하는 것보다 직접 손으로 익히는 것이 최고
그림으로 생각 데이터의 형태를 그림으로 그려보는 것이 좋음, 변화 과정을 직접 적어 가면서 생각해 봄
점진적 변경 처음부터 완벽히 작성하려고 하지 말고 조금씩 넓혀 나감 또 한문제를 풀기 위해 여러 버전의 코드를 만들 생각을 해야 함
왜 프로그래밍 언어론을 배워야 할까?
세상 모든 언어를 다 배울 순 없고, 대표적인 기능을 배움으로써 새로운 언어 학습에 두려움이 없도록 해야 한다.
내가 사용되는 언어를 잘 이해하기 위해 언어 기능이 어떻게 구연되는지 알면 실행 과정을 이해할 수 있다.
현명한 언어 설계자가 되기 위해서 데이터 구조, 서브프로그램을 설계하는 것이 곧 언어를 설계하는 것과 마찬가지라고 볼 수 있다.
'척척학사 > 프로그래밍 언어론' 카테고리의 다른 글
프로그래밍 언어의 구현 (1) | 2023.10.04 |
---|---|
프로그래밍 언어론 구문분석 (1) | 2023.09.15 |
구문론과 의미론 , 프로그래밍 언어 (1) | 2023.09.04 |
프로그래밍 패러다임 (0) | 2023.08.28 |
프로그래밍 언어의 발전과 동작원리 (1) | 2023.08.19 |