공부

0913) 프로그래밍 언어

투잌 2010. 9. 15. 16:20

* 인터넷 검색의 결과로 한 포스팅이기 때문에 사전적 의미나 정확한 사실과 차이가 날 수 있음을 양해 구합니다. 공부용 목적으로 포스팅 하였습니다.
* 저작권의 문제 발생시 바로 삭제, 비공개하겠습니다. 지적 부탁드립니다.

목표 : 프로그래밍 언어의 시작과 종류에 대해 알아본다.

목차 : 1. 프로그램이란?
         2. 프로그램 언어의 종류

1. 프로그램이란?

 컴퓨터라는 기계는 사람이 지시한 명령을 수행할 수 있는 능력을 가지고 있다. 사람이 1+2를 계산하라는 명령을 내리면 계산을 통해 3이라는 결과를 만들어 내며 결과를 화면으로 출력하라는 명령을 내리면 어김없이 그 값을 화면에 출력한다. 계산식이 다소 복잡하더라도 정확하고 신속하게 명령을 실행한다.

 그러나 컴퓨터 혼자서는 어떤 일도 하지 못하며 반드시 사람의 명령이 필요하다. 매법 사람이 컴퓨터에게 이렇게 해라. 저렇게 하라고 지시를 내려야만 이 지시대로 동작한다. 이런 식이라면 사람이 컴퓨터를 위해 일일이 지시를 내려야 하므로 컴퓨터가 사람을 위해 일을 하는 것이 아니라 오히려 컴퓨터가 사람을 부려먹는 꼴이 될 것이다. 실제로 초창기의 컴퓨터(ENIAC 등)는 명령을 기억할 공간이 좁거나 아예 없이 사람이 케이블 연결을 바꾸거나 이진 스위치를 조작해야 동작하는 식이었다.

 다행이 현대의 컴퓨터는 여러 개의 명령을 순서대로 실행할 수 있는 능력이 있으므로 매번 사람이 명령을 내릴 필요없이 일련의 명령들을 한꺼번에 전달할 수 있다. 1+2를 계산해서 화면에 출력하라, 입력되는 모든 값을 저장하고 합계와 평균을 구해 프린터로 인쇄하라는 식으로 작업에 필요한 명령들을 전달하면 컴퓨터는 이 명령들을 순차적으로 실행한다. 이런 명령의 집합이 바로 프로그램이며 보통 수백~수만개의 명령들이 모여 하나의 실용적인 프로그램이 된다.

 그렇다면 명령을 무조건 모아 놓기만 하면 다 프로그램이 되는가 하면 그렇지는 않다. 프로그램이란 현실의 문제를 해결하기 위해 존재한다. 예를 들어 계산 프로그램은 주어진 값을 연산해서 결과를 출력하는 동작을 하므로 계산하라, 출력하라는 명령이 필요할 것이다. 문제를 해결하기 위한 명령들은 실행 순서를 지켜야 한다. 만약 계산 프로그램에게 출력하라, 계산하라는 명령을 내린다면 순서가 틀렸으므로 제 역할을 하지 못할 것이다.

 또한 조건에 따라 적절한 명령을 선택해야 하고 어떤 명령들은 여러 번 반복 처리해야 하는 것들도 있고 때로는 실행중에 사용자와 상호작용을 할 필요도 있다. 그래서 명령들끼리는 순서가 있을 뿐만 아니라 논리적으로 긴밀하게 연관되어 있어야 한다. 프로그램의 정의를 좀 더 정확하게 내려 보면 다음과 같다.

◆ 프로그램 : 문제를 풀기 위한 명령들의 조직적인 집합

 컴퓨터 프로그램은 컴퓨터가 인식할 수 있는 언어로 구성된다. 근본적으로 컴퓨터는 그렇다와 아니다만 이해할 수 있으므로 0과 1의 상태만 이용할 수 있다. C, C++, 델파이, 베이직 등의 프로그래밍언어로 만든 문자코드를 컴퓨터가 인식할 수 있게 변환시킨 것으로 기계어라고 한다.

 프로그램의 고전적인 정의는 이렇지만 최근의 그래픽 환경에서는 명령 외에 프로그램의 외형을 장식하는 데이터까지도 프로그램의 일부로 포함된다. 예를 들어 프로그램의 배경을 장식하는 그림이나 사용자와의 대화를 위한 대화상자, 사운드, 아이콘, 메뉴 등도 프로그램을 구성하는 일부분이다. 또한 프로그램 사용법을 설명하는 도움말이나 주의 사항 등의 문서도 프로그램의 일부라고 할 수 있다.

 컴퓨터라는 기계는 사람이 지시한 명령을 수행할 수 있는 능력을 가지고 있다. 사람이 1+2를 계산하라는 명령을 내리면 계산을 통해 3이라는 결과를 만들어 내며 결과를 화면으로 출력하라는 명령을 내리면 어김없이 그 값을 화면에 출력한다. 계산식이 다소 복잡하더라도 정확하고 신속하게 명령을 실행한다.
 
2. 프로그래밍 언어의 종류

 1) 저급 언어
저급 언어란 컴퓨터 내부에서 바로 처리가능한 프로그래밍 언어로, 일반적으로 기계어와 어셈블리어를 일컫는다. 강력하나 배우기 어려운 것이 단점으로, 현재는 특수한 경우가 아니면 사용되지 않는다. 저급언어와 반대되는 것으로 고급 프로그래밍 언어가 있다.

▶기계어 (Machine Language)
프로세서에서 작업을 직접 지시하기 위한 언어로 0과 1의 2개의 숫자로 작성되며, 작성된 프로그램을 컴퓨터에 기억시켜 놓으면 컴퓨터가 직접 수행할 수 있다.

▶어셈블리어 (Assembly Language)
기계어에 1대 1로 대응하는 연상코드를 정하여 사용하는 언어.
약호는 문자, 숫자, 부호들로 구성되어 있어 프로그램을 작성하기가 난해한 언어

 2) 고급 언어 (High Level Language)
인간이 일상 사용하는 문장과 유사한 자연어로 구성되어 있어 이해와 기술이 용이하며, 대부분의 기계에 통용되는 호환성이 있어 가장 범용성을 갖고 있다.
기계어로 번역하려면 컴파일러 또는 인터프리터가 필요하다. 베이직, C, 자바 등이 있다.

▶베이직
베이직(BASIC : Beginnr's All-purpose Symbolic Instruction Code)은 프로그래밍 언어의 하나입니다. 절차형 언어로 1964년 다트머스 대학교의 존 케메니(John Kemeny)와 토머스 커츠(Thomas Kurtz)가 개발했습니다.
 교육용으로 개발되어 언어의 문법이 쉬우며, 다트머스의 최초 제품 이래로 인터프리터 방식이 많았으나 최근에는 컴파일러 방식도 많습니다. 현재는 다양한 종류의 베이직이 존재하며 서로 문법도 많이 차이가 나고, 서로 다른 종류 사이의 소스코드는 호환되지 않습니다.

▶C언어
C프로그래밍 언어는 1970년대 초 켄 톰슨과 데니스 리치가 당시 새로 개발된 유닉스 운영체제에서 사용하기 위해 만든 프로그래밍 언어입니다. 켄 톰슨은 BCPL언어를 필요에 맞추어 개조해서 "B"언어라 명명했고, 이 B언어에서 C언어가 탄생했습니다. 유닉스 시스템의 바탕프로그램은 모두 C로 씌여졌고, 많은 운영체제의 커널도 또한 C로 만들어졌습니다. 오늘날 많이 쓰이는 C++은 C에서 객체 지향형 언어로 발전된 것이다. 또 다른 다양한 최신 언어들도 그 뿌리를 C언어에 두고 있다.
C#은 마이크로소프트에서 개발한 객체지향 프로그래밍 언어로, 닷넷 프레임워크의 한 부분으로 만들었으며 나중에 ECMA(ECMA-334)와 ISO(ISO/IEC/23270)의 표준으로 자리 잡았습니다. C++와 자바와 비슷한 문법을 가지고 있습니다.

C#은 닷넷 프로그램이 동작하는 닷넷 플랫폼을 가장 직접적으로 반영하고, 또한 닷넷 플랫폼에 강하게 의존하는 프로그래밍 언어이다. C#은 그 문법적인 특성이 자바와 상당히 유사하며 C#을 통하여 다룰 수 있는 닷넷 플랫폼의 기술들 조차도 자바를 염두에 둔 것이 많아서 자바와 가장 많이 비교되고 있다. 하지만 C#은 자바와 달리 불안전 코드(unsafe code)와 같은 기술을 통하여 플랫폼 간 상호 운용성에 상당히 많은 노력을 기울이고 있다. C#의 기본 자료형은 닷넷의 객체 모델을 따르고 있고, 런타임 차원에서의 메모리 수거(garbage collection)가 되며 또한 클래스, 인터페이스, 위임, 예외와 같이 객체 지향 언어로서 가져야 할 모든 요소들이 포함되어있다.

▶C++
C++는 AT&T 벨 연구소의 비야네 스트롭스트룹이 1983년 발표하여 발전한 프로그래밍 언어이다. C언어의 문법을대부분 사용할 수 있으며, 객체지향성이 더해진 C언어의 확장형이라고 생각할 수도 있다.
C언어에 객체지향 프로그래밍을 지원하기 위한 내용이 덧붙여진 것이라고 할 수도 있지마, 애초부터 객체지향을 염두에 두고 만들어진 언어와는 다르게, 단지 더 좋은 C언어로서 수속형 언어로 취급하기도 한다. 초기의 C++은 C위에 놓인 트랜스레이터로 구현되었다. 즉, C++프로그램을 일단 C프로그램으로 변환하고 나서 C 컴파일러로 컴파일하는 식이었고 따라서 C언어에 대해 상위 호환성을 갖는 언어였다.
그 후, C언어의 표준 규격이 바뀔 때 const 수식 등 C++의 기능이 C언에 받아들이기도 했다. 현재 C언어와 C++와의 사이에는 엄격한 호환성은 없다. 특히 C99의 출현으로 C언어와의 호환성은 완전하게 없어져 버렸다. 현재는 C와 C++가 명확한 구별없이 혼재되어 사용되는 컴파일러가 대부분이다.

▶D
D는 디지털 마르스의 월터 브라이드가 설계한 객체 지향 명령형 프로그래밍 언어이다. D는 C++의 후손으로 만들어졌으며, C++의 복잡도를 줄이면서 몇몇 기능을 추가하여 설계되었다. C++의 후손으로 제시된 다른 언어에는 Java와 C#등이 있다.

▶파이썬(Python)
파이썬(Python)은 1991년 프로그래머인 귀도 반 로섬(Guido van Rossum)이 발표한 고급 프로그래밍 언어로, 플랫폼 독립적이며 인터프리터식, 객체지향적, 동적 타이핑(dynamically typed)대화형 언어이다. 파이썬이라는 이름은 귀도가 좋아하는 코미디 <Monty Python's Flying Circus>에서 따온 것이다. 파이썬은 비영리의 파이썬 소프트웨어 재단이 관리하는 개방형, 공동체 기반 개발 모델을 가지고 있다. 사실상의 표준은 CPython의 구현이다.

▶루비(Ruby)
루비(Ruby)는 동적 객체 지향 프로그래밍 언어이다. 현재 루비 온 레일즈라는 신속한 웹 개발을 지원하는 웹 개발 프레임워크의 인기로 많은 주목을 받고 있다.

▶자바(Java)
자바(Java)는 썬마이크로시스템즈의 제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 객체지향적 프로그래밍 언어이며, 썬마이크로시스템즈에서 무료로 제공하고 있다. 1991년 그린 프로젝트(Green Project)라는 이름으로 시작해 1995년에 발표했다. 처음에는 가전제품 내에 탑재해 동작하는 프로그램을 위해 개발했지만 현재 웹어플리케이션 개발에 가장 많이 사용하는 언어 가운데 하나이고, 모바일 기기용 소프트웨어 개발에도 널리 사용하고 있다. 현재 버전 6까지 출시했다.

▶파스칼(Pascal)
파스칼(Pascal)은 1980년대와 1990년 초반에 걸쳐 널리 사용된 프로그래밍언어로, 당대의 가장 인기있는 교육용 언어 중 하나였으며, 현재까지도 폭넓은 분야에서 사용되고 있다.
파스칼은 1969년에 스위스의 컴퓨터 과학자 니클라우스 버트가 개발하였다. 발표당시에는 아주 기본적인 컴퓨터 언어의 요소만을 가지고 있었으므로 시스템을 직접 다루기에는 부족하였다. 파스칼이라는 이름은 프랑스의 수학자이자 철학자 블레즈 파스칼의 이름을 딴 것이다. 포인터를 사용한 구조적 프로그래밍을 그 특징으로 한다.
과학연구를 목적으로 만들어진 고급언어인 알골 60의 영향을 받은 까닭에, 같은 시기에 마찬가지 영향을 받아 제작된 C와 여러가지 면에서 유사한 점을 갖는다. 그러나 코드를 간결하게 하고 버그를 더 쉽게 잡아내기 위한 목적으로 몇가지 기능을 제한함으로써 결과적으로 C언어에 비해 활용도가 떨어지는 언어가 되었다. 그러나 완전히 비실용적인 언어라는 뜻은 아니며, 실제로 TeX나 초기 매킨토시 운영체제 제작에 사용되기도 하였다. 최근에는 파스칼 컴파일러 자체가 크게 개선되고 소프트웨어 개발 기술의 발전으로 이런 사소한 차이점은 거의 무시할 수 있는 단점이 되었다. 어셈블리를 직접 사용하기도 한다. 현재는 초기의 파스칼에 비해 많은부분이 추가되고 개선되어 다른언어의 장점들을 따와 상용 파스칼 컴파일러인 델파이는 C++과 거의 기능 차이가 없습니다.