좋은 프로그래밍 언어는 무엇인가? (프로그래밍 언어의 역사)
Programming Languages 라는 (컴퓨터공학 전공)과목을 들으면서 느낀점을 토대로 글을 작성해본다.
비록 쉽게 풀어서 쓰겠지만 (최대한 이해하기 쉽게 순화해서 작성) 약간의 전공용어(예시:유닉스, 객체지향, 스크립트, 인터프리트)를 사용하기 때문에
비전공자는 글 이해에 어려움이 있을 수도 있다.
먼저 글을 쓰기 앞서 구글에서 프로그래밍 언어에 대해서 검색해 보았다.
몇가지 흥미로운 그림을 나열한다.
<그림 : Stackoverflow 커뮤니티의 언어별 검색횟수>
출처 : http://smthngsmwhr.wordpress.com/2012/11/19/measuring-popularity-of-programming-languages/
물론 검색횟수가 인기도를 뜻하는 것은 아니다.
위의 통계를 인용한 작성자가 (조심스럽게 말하길) 현재의 인기있는 12개의 언어는 C#, Java, PHP, JavaScript, C++, Python, Objective-C, C, Ruby, Perl, Shell, Visual Basic 라고 하였다.
<그림 : 어떤 프로그래밍 언어를 배우는 것이 좋을까?>
출처 : http://www.zappable.com/2012/11/picking-a-programming-language-chart/
위의 그림과 글을 작성한 분은 나름대로 철학이 있으시던데 어떤 프로그래밍 언어를 배워야하는지(그림에 대한 해석)에 대해서 적은 http://www.zappable.com/2012/10/learning-how-to-program-picking-a-langauge/ 글을 참고해주세요.
지금부터 좋은 프로그래밍 언어에 대해서 알아 보도록 하자.
좋은 프로그래밍 언어란 무엇인가?
먼저 저보다 훨씬 유명하시고 먼저 생각하신 Allen Perlis 님의 자료를 찾아보았습니다.
이분은 “A good programming language is a conceptual universe for thinking about programming.“이라고 말했습니다.
한글로 풀이하자면 “좋은 프로그래밍 언어는 프로그래밍에 대해 생각(사색)하게 만드는 개념적인 세계이다.“라는 뜻입니다.
프로그래밍 언어에 대해서 배우면서 프로그래밍이란 무엇인가? 를 계속 생각해야 할 것입니다.
프로그래밍 언어의 구성요소
프로그래밍 언어는 다음의 4가지 속성을 가지고 있습니다.
- Syntax(구문구조) : 문법적으로 올바른 프로그램에 대해 정확하게 설명.
- Names(이름) : 프로그램에서의 다양한 개체에 대해 이름을 명명함. (변수명, 타입명, 함수명, 클래스명 등등)
- Types(타입) : 타입이란 값의 그룹과 값이 할 수 있는 연산에 대해서 정의합니다. 이로인해서 올바른 연산을 파악하고 타입에러를 검출할 수 있습니다.
- Semantics(의미) : 프로그램의 의미를 나타냅니다. 각 줄의 의미를 알 수 있으며 프로그램이 실행되면 변수의 변화등을 정의합니다.
언어 디자이너(Language designer)는 이 속성을 반드시 정의하여야 하며 프로그래머(Programmer)는 반드시 정해진 규칙을 따라야 합니다.
프로그래밍 패러다임
프로그래밍 패러다임 : 프로그래밍 패러다임이란 특정한 분야의 문제에 대해 해결 규칙의 기초가 되는 것입니다.
다음의 4가지 주요한 패러다임을 나타냅니다. 특정한 것이 좋다/나쁘다 라는 생각을 하지말고 문제 해결에 대해 적합한 패러다임 및 프로그래밍 언어를 고르는 안목을 길러야 할 것입니다.
- Imperative(명령형 패러다임) : 프로그램을 순차명령의 실행으로 보는 패러다임. 프로그램과 데이터는 메모리안에서 구분되지 않는다. 이 패러다임에서 상태라는 뜻은 특정 순간의 모든 변수의 값을 뜻한다.
Imperative Language : Cobol, Fortran, C, Ada, Perl
- Object-Oriented(객체지향 패러다임) : 객체지향 패러다임은 모든항목을 객체로 놓고 객체간의 메세지 전달(message passing)으로 상태가 바뀌는 것을 뜻한다.
Object-oriented Language : Smalltalk, Java, C++, C#, Python
- Functional(함수형 패러다임) : 함수형 패러다임은 수학적 함수의 모임으로 표시되는 것이다. 함수와 재귀실행으로만 답을 구한다. 인공지능 분야에서 많이 쓰인다.
Functional Language : Lisp, Scheme, ML, Haskell
- Logic(논리적 패러다임) : 논리적 패러다임은 입력과 출력의 정의만으로 이루어진 것이다. 프로그램은 모든 논리 정의를 탐색하여 답을 구한다.
Logic Language : Prolog
<그림 : Programming language 의 역사 >
우리가 현재 쓰는 프로그래밍 언어에 영향을 끼친 언어들을 살펴보자.
*Fortran : 포트란은 IBM에서 최초로 만든 고급언어(High-level language;사람이 이해할 수 있는)이다. 세계 최초의 프로그래밍 언어는 아니고 IBM이라는 회사가 만든 언어중 첫번째 인 것이다.
이것은 초기 컴퓨터의 수요가 있었던 우주항공 분야를 위해 만들어진 언어이며 일반인들이 이해하기 어렵다는 단점도 있었다.
현재 기상관측, 탐사, 우주항공, 양자, 천문학, 동역학등의 분야에서 쓰이는 언어이다. 현재 최신버전은 Fortran 2008이다.
*Cobol : 코볼은 미국 국방부로 납품되는 프로그램들의 언어가 제각각이어서 이에 대한 문제를 해결하고자 만든 언어이다.
Cobol 이 개발되고 미국 행정부에 납품되는 언어는 모두 Cobol로 통일되었다. 사무 행정처리용 언어이다. 현재 최신버전은 Cobol 2002이다.
*Algol 60 : 미국 Fortran에 대항하기위해 유럽에서 만든 언어이다. Precise syntax(올바른 문법이란 무엇인가에 대해 정확하게 정의)를 구현한 최초언어. Algol계열 언어는 현재는 사용되지 않는다.
*PL/I : 프로그래밍 랭귀지 1 이라고 읽는다. Fortran과 Cobol과 Algol을 통합해서 만든 언어이다. 모든 분야에서 어우러져 사용할 수 있는 범용언어를 만든것이다.
하지만 금방 망해버렸다. 아무래도 특정 분야에서 그 분야에 적합한 언어를 사용하는 것이 좋았고 사람들은 이미 각자의 고급화된 언어에 익숙해져 있었다.
*Simula : 객체지향 개념을 최초로 적용한 언어이다.
*Smalltalk : 객체지향 개념을 최초로 완벽구현한 언어이다.
*HCPL : 유닉스 시스템을 관리할 용도로 개발된 언어이다. 이후 C 언어 디자인에 영향을 끼쳤다.
*C++ : C 언어에 객체지향 개념을 더한 언어이다.
*awk : C 언어를 스크립트 방식으로 변경한 언어이다. 스크립트 방식으로 개발하면 유닉스를 더 간편하게 관리할 수 있을 것 같아서 개발된 언어이다.
Perl, PHP, Python 언어 디자인에 영향을 끼쳤다.
*Lisp : 인공지능 분야에서 사용하기 위해 개발된 함수형 언어이다. 최초로 이 언어를 사용해서 만들고자한 것은 자동번역기였다.
*SEQUEL : Structured English QUEry Language 라는 뜻의 약어이며 구조화된 영어 쿼리 언어라고 해석할 수 있다. IBM에서 자신들이 운영하는 관계형 데이터베이스를 다루기위해서 만든 언어이다. Sequel이라는 단어가 영국 항공사와 이름이 겹쳐서 나중에 SQL로 명칭이 변경되었다.
요즘 흔히 쓰이는 MYSQL을 라엘이는 “마이 에스 큐 엘” 이라고 부르지만 일부사람들은 이 SEQUEL의 단어를 사용해서 “마이 시퀄”이라고 읽기도 하더라.
위의 도표 그림에서 오른쪽에 나타난 언어들이 요즘 쓰이는 언어이다.
좋은 프로그래밍 언어는 간결하고 가독성이 높으며 안정적이고.. 등등의 조건들이 있지만 당신이 현재 접할 수 있는 언어는 이 조건들을 모두 만족하며 충분히 검증된 것들이다.
따라서 좋은 프로그래밍 언어란!!
당신이 만들고자 하는 것을 먼저 이해한 후에, 그것의 개발 패러다임을 설정하며, 그 패러다임과 어울리는 프로그래밍 언어가 좋은 언어이다.
(일반적으로 그 분야에서 많이 쓰이는 언어가 좋은 언어이다.)
특정하게 한 언어를 신봉하며 집착하지 말고 유연한 개발자가 되도록 하자.
다음의 링크도 읽어 보아라.