본문 바로가기

공부/프로그래밍언어론

프로그래밍 언어란?

* 본 게시물과 앞으로 프로그래밍언어론 카테고리에 올라갈 모든 게시물은 개인적인 공부 용도로 올리는 것이며, 개념에 대한 오류와 비효율적인 코드들이 있을 수 있습니다.

* 제가 모든 게시물을 공개로 올리는 이유는 학교 컴퓨터와 같은 공공장소에 있는 PC에 로그인 없이 바로바로 게시물을 보기 위해서 입니다.

* 기본적으로 게시물은 교수님의 강의자료를 기초로 두고 있으며, 이외에 '프로그래밍 언어 개념-원유헌'이라는 책과 각종 위키백과, 제타위키, 구글링하면 나오는 여러 블로그를 참고할 것입니다. 저작권 문제가 있을시 hjl3066@gmail.com으로 연락해주시면 빠르게 조치하겠습니다.

* 블로그의 모든 게시물은 PC 환경에 최적화되어 있습니다.

=================

프로그래밍 언어란 무엇인가?

기계와 사람이 읽을 수 있는 형식으로써 계산을 표현하는 체계이다.

 

이때의 계산(computation)은 일반적으로 컴퓨터가 처리할 수 있는 모든 작업이며,

산술연산 뿐만 아니라 컴퓨터가 인간의 명령문에 의해서 처리하는 모든 작업을 의미한다.

그리고 이 계산은 수학적으로 형식적인 정의가 가능해야 한다. (튜링 머신)

 

기계가 읽을 수 있는 형식

machine-readable

기계가 읽을 수 있도록 간결한 구조의 언어로 효과적인 번역이 가능해야하고 이러한 번역을

하는 알고리즘이 존재해야한다. 또한 제한된 시간 내에 빠른 번역이 가능해야한다.

 

사람이 읽을 수 있는 형식

human-readable

인간이 사용하는 자연어에 가까울수록 좋다.

프로그램이 대형화가 되면서 인간이 읽고 이해하는 판독성이 중요해지고 지역성이 요구된다.

소프트웨어를 개발하는데 필요한 컴파일러, 디버거, 에디터와 같은 도구들을 모아둔 통합개발환경이

포함되는 경향이 있다.

 

프로그래밍 언어의 역사

1940년대 이전에는 전기가 켜진 것을 1, 꺼진 것을 0으로 표현하는 2진법으로 전선을 연결하는 방식의

프로그래밍을 하였다.

 

1940년대 폰 노이만이 인간이 컴퓨터에게 내리고 싶은 명령문들을 프로그래밍해서 저장된 내부의

프로그램의 명령문을 한줄씩 실행해서 명령을 내리는 방식인 폰 노이만 구조를 주장하였다.

현재와 같은 CPU, 메모리, 프로그램 구조를 갖는 범용 컴퓨터 구조를 확립시켰다.

 

이후 인간의 언어와 더 유사한 어셈블리 언어가 탄생했다. 더하기, 빼기, 곱하기, 나누기의 산술 연산문의

명령문의 명령 심볼(symbol)을 이용한다. 다만, 어셈블리 언어는 컴퓨터 구조에 따라 사용하는 기계어가

달라서, 이 기계어에 대응하여 만들어지는 어셈블리어도 각각 달랐다. 또한, 저급 수준의 추상화를 가지고

있다. 읽고 쓰기도 어려웠다.

 

*추상화 수준이 높아지는 것은 하나의 명령문이 여러가지의 명령을 포함한다는 의미이다.

 

추상화 설명 예시

LDA XX의 값을 가져와라, ADD YXY의 값을 더하라는 의미, STA Z XY의 결과물을 Z에 저장하라는 의미이다.

이를 고급 프로그래밍언어에서는 Z:=X+Y로 표현할 수 있다. 3줄을 1줄로 표현하는 것은 그 내용이 다 포함되었기 때문에

추상화 수준이 높다고 할 수 있다.

 

컴퓨터 기술이 발전함에 따라 컴퓨터가 수행할 수 있는 기능이 많아지고 프로그래밍 언어도 자연스럽게

그 기능을 수행할 수 있도록 변화하면서 고급 수준의 추상화가 요구되었다. 이는 고급 언어가 등장하는

배경이 된다.

고급 언어는 어셈블리에 비해 상대적으로 프로그램이 간략해지고 인간이 사용하는 자연어와 가까워서 이해가

용이하다. 이는 위의 '사람이 읽을 수 있는 형식'에서 자세히 언급했다. 또한, 기계에 종속적이지 않아서 한번

개발한 프로그램을 다른 기계에 이식성이 높다.

고급 프로그래밍은 배정문, 반복문, 선택문의 개념으로 구성되어 있다.

 

프로그래밍언어를 배워야 하는 이유

프로그래밍 언어의 개념을 고찰하면서 그 언어의 특징들에 대한 기본개념을 알 수 있다.

다시말해 고급 프로그래밍 언어가 되려면 적어도 어떤 특징을 가져야 하는지 알 수 있다.

이 특징들의 구현과 이로 인해 발생하는 문제점을 알 수 있고, 특징들의 설계에 대한 기본 개념을 알 수 있다.

궁극적으로 프로그래밍 언어의 개념을 알고 있을 때, 내가 무언가를 프로그래밍으로 개발해야할 때 어떤

프로그래밍 언어를 도입해야지 더 쉽고, 효율적으로 구현할 수 있을지 비교할 수 있게 된다.

위에서 한말을 정리해보자.

 

  • 언어의 특징들에 대한 기본 개념

    각각의 고급 프로그래밍 언어의 특징들이 왜 제공되고 그것에 대해 앎으로써 그 언어에 대해 잘 이해하고
    그 언어에서 제공하는 문법구조, 명령문, 자료형을 잘 사용하여 더 효율적인 알고리즘을 작성할 수 있다.

    프로그래밍을 할 때 각 고급 프로그래밍 언어들의 특성을 제대로 이용하지 못하고 일부 특성만 알고
    프로그램을 개발하면 그 외의 특징과 특성은 거의 사용하지 않고 이해를 못하게 된다. 프로그램을 개발하는
    프로그래머가 시행착오에 의존해서 그 프로그래밍 언어의 특징을 이해하게 되므로 능률이 떨어진다.


  • 특징들의 사용과 이 때 발생하는 효율성과 비효율성

    recursion, 동적 기억 장소 할당, 포인터 등 각각의 프로그래밍 언어들의 특징들을 제대로 알고 있어야 효율적인
    알고리즘을 작성할 수 있다. 중구난방으로 사용하면 비효율적이고 유지보수가 힘들어진다.


  • 특징들의 설계와 대한 기본 개념

    우리가 머리속에서 생각하는 방식을 언어로 표현할 수 있어야한다. 프로그래밍 언어의 개념을 잘 알고
    있어야 내 머리속의 사고방식을 언어의 특징을 활용하여 잘 바꿀 수 있다. 다양한 문법적 구조의 특징을 알고
    있음으로써 알고리즘 작성 시 어휘 구사력이 증가한다. 문법적 구조에는 명령문 종류, 자료형태들이 있다.
    적재적소에 맞는 명령문, 자료형태를 사용할 수 있어야 한다.


  • 프로그래밍 언어 선택, 학습, 설계 능력

    고급 프로그래밍 언어의 개념을 앎으로써 새로운 프로그래밍 언어를 학습할 수 있는 능력이 올라간다.
    기존 언어의 특징에 새로운 언어의 특징만 조합해서 습득하면 된다.
    최종적으로, 내가 새로운 프로그래밍 언어를 설계할 수 있는 능력을 가질 수 있다.
    기존 언어의 좋은 점을 선택하고 새로운 기능을 추가하여 새로운 언어를 만들 수 있다.