미래의 컴퓨터는 인간이사용하는 자연언어를 척척 알아듣는 똑똑한 기계가 될 것이다.
컴퓨터 언어에 대한 견해는 그 포함되어야 할 대상과 특성에 있어서 아직도 완전한 일지를 보지 못하고 있다. 그렇지만 한가지 공통적인 것은 그것이 사용되는 매체가 컴퓨터라는 것이다.
우리가 자주 거론하는 프로그램이라는 것은 '컴퓨터에 대한 일련의 순서로 된 명령어의 집합'이라고 정의 하는것이 초보자에게는 가장 쉬울 것이다. 그리고 명령어란 프로그램 언어의 발전 단계에 따라 그 모습을 달리 하지만, 가장 최후에 기계에서 처리되는 명령어는 순수한 2진수이다. 즉 이것은 인간 위주의 언어가 아니라 기계위주의 언어로서 오직 기계만이 이해하는 명령어이다.
기계가 이해하는 언어는 2진수
그다음 단계는 'Symbolic Assembly Language'라 할수 있는데 변수가 기호(예:ALPHA, X, Y)로서 표시되고 기계 내부의 저장장소도 번지를 직접 2진수로 적기 보다는 기호로써 표시한다. 세번째 단계는 소위 고급언어(High Level Language)라고 불리우는 명령어들이다. 이들은 사용자들이 작성한 고급언어 프로그램(통상적으로 영문자 형태)을 기계어 형식으로 바꾸어서 목적 모튤이라는 중간 형태로 만드는 컴파일러(번역)프로그램이 요구된다. 이 고급 명령어들을 사용함으로써 인간은 실제 기계 내부의 주소나 특성을 잘 모른다. 하더라도 기계를 용이하게 활용할 수 있게 된다.
그러나 어떤 언어는 고급언어임에도 불구하고 컴파일러를 사용치 않고 인터프리터라고 하는 소프트웨어 시뮬레이션 기법을 사용하는 경우도 있다. 이때는 모듈을 생성하는 것이 아니라 문장 단위로 명령을 해석만 하는 형식인데, 주로 단말기를 이용한 실시간(real time)처리에 널리 쓰인다.
이상과 같이 프로그램의 개념에 대해서 간단히 살펴 보았지만 통상적으로 기계어나 어셈블리 언어는 어렵기 때문에 일반 사용자들이 활용하기에는 많은 노력과 시간이 소요되므로 여기서는 고급언어를 대상으로 그 특성을 살펴 보겠다.
인간위주의 언어로 발전
프로그램 언어로 다음과 같은 4가지의 특성을 갖고 있다.
첫째로 사용자 측면에서 기계어에 대한 별지식이 없이도 사용이 가능하다. 바꾸어말하면 사용자는 기계어에 대한 깊은 지식이 없다하더라도 해당 프로그램 언어에 대한 지식만 갖고 있으면 컴퓨터를 운용 할수 있다. 그러나 이것은 컴퓨터에 대해 전혀 몰라도 된다는 이야기는 아니다. 예를 들면 숫자 및 문자가 기계내에서 어떠한 방식으로 표현되는지 또는 기계를 구성하고 있는 각 구성 요소들의 제한사항, 특징들을 알 수 있다면 더욱 효율적으로 프로그램을 구성 할 수가 있기 때문이다.
두번째로 컴퓨터 언어는 어느 수준까지는 기계에 대해 독립적이기 때문에 다른 기종에서 그 프로그램을 이용하고자 할 경우에도 약간의 수정을 가하면 사용이 가능하다. 원래 이상적인 언어라면 전혀 수정없이도 적용이 가능하겠으나 최소한도의 수정으로도 적응이 가능토록 각종 프로그램 언어들에 대한 새로운 기법개발에 힘을 쏟고 있는 실정이다.
셋째로 사용자가 작성한 프로그램(이하 source program이라 부른다)이 기계어로 번역될때 프로그램에서 수행 가능한 최소 단위는 하나 이상의 기계명령어(machine instruction)로 나누어진다.
예를들어 X=Y*Z+K라는 명령이 있다면, 이것은
CLA Y(CLA=clear accumulator and add)
MPYZ(MPY=MULTIPLY)
ADDK
STO X(STO=store)와 같이 기계명령어로 표현되게 된다.
네째로 컴퓨터 언어는 기계어에 비하여 훨씬 더 문제 자체에 접근하는 방식으로 표현 될 수 있다. 이것은 위의 예에서 보인 것과 같다. 즉 , X=Y*Z+K는 그 아래의 명령어보다 훨씬 이해하기 쉬운 것이다.
이상과 같이 컴퓨터 언어의 특성에 대해 살펴 보았지만 이들은 대체적으로 기계어에 대한 상대적인 장점이라 할 수 있을 것이다. 그러나 단점도 또한 없지 않다. 단점을 간단히 요약 해보면 먼저 컴파일러에 의한 추가적인 번역 처리는 순수한 기계어에 의한 명령보다 시간이 많이 걸리기 쉽고 컴파일러의 디자인이 효율적으로 되지 못했을 경우는 프로그래머가 에러(error)를 찾고 수정하는데 훨씬 더 애로를 겪게 될수도 있다. 그럼에도 불구하고 소프트웨어의 발전 추세는 저수준 언어 보다는, 고급 언어의 개발에 주력하고 있다.
적자생존하는 컴퓨터언어
1950년대 전반에 'FORTRANΦ'라는 언어를 시작으로 30여년 사이에 거의 3백여개에 달하는 컴퓨터 언어들이 생성되었다. 그중 수십개의 언어들은 빛을 보지 못하고 사라져갔다. 이들중 반수이상의 언어는 특수한 분야에만 적용되는 언어란 할 수 있겠다. 예를들면 그래픽, 시뮬레이션, 소프트웨어 개발을 위한 지원언어, 시스템 프로그램 등이 해당된다. 그 나머지 일반적인 목적으로 사용되는 언어중 범용성이 있으면서 그 가치성을 인정받은 언어들은 불과 수십개에 불과하다.
따라서 이들을 대상으로 간략하게 발전 과정을 살펴보자, 먼저 포트란(FORTRAN)의 경우는 상기 기술한 포타란Φ를 근거로 자체 버전(Version)을 점차 개선하여 보완해 나가고 있으며 알골(ALGOL)의 경우는 ALGOL-60같은 보다 정확한 문법 구조와 수리적인 차원을 나타낼 수 있는 언어가 같은 시기에 개발 되었다. 1959년 5월에는 미국무성의 지원을 받아 컴퓨터 제조회사와 사용자들이 CODASYS(conference on data system language)을 조직하여 사무처리를 위한 공통언어를 개발하기 시작하여 1960년도에 코볼(COBOL)을 개발하였다. 60년대 중반에는 이들 FORTRAN과 COBOL의 장점을 흡수하여 개발한 PL/I와 수치적 표현을 편리하게 해줄 수 있는 APL이 개발 되었다. 이어 60년대 후반에는 실용언어 그룹이라할 LISP가 개발 되었으며 이 언어는 종래의 순차적인 처리 중심언어로부터 병행처리가 편리하도록 디자인되었다.
1970년대에 들어와서는 기존 개발된 언어들을 더욱 충실히 발전시키는 한편, ALGOL을 개선한 PASCAL 그리고 종래의 모듈처리 중심언어들로부터 실시간 처리 중심언어들의 형태로 중요성이 변화되어 갔다. 그 대표적인 예가 미국방성이 지원하여 개발한 ADA이다. 이것은 PASCAL의 기능에다 병렬처리(concurrent processing)의 기능이 보강된 언어라 할 수 있겠다. 1980년대에 들어서는 블럭 개념으로 모듈러한 병렬처리가 가능한 언어들과 함께 인공지능의 응용분야 적용을 위한 언어들이 많이 개발되고 있다.
프로그램언어는 크게 절차지향형(procedure oriented)언어와 비절차형(nonprocedural)언어로 나눌 수 있다.
절차형언어는 지금까지 기술한 대부분의 언어가 이에 해당된다. 일정한 실행순서 및 각 실행 명령간의 상호관계에 의해서 처리되는 개념이다. 이에 반해 비절차형언어는 컴퓨터의 실행순서에 관계없이 처리내용을 기술할 수 있는 프로그램언어이다. 비절차형언어에는 조회언어(query language)가 대표적이라 할 수 있는데 종래의 절차형언어에서 기술하던 처리절차를 시스템에 일임하고 원하는 데이타와 처리 결과만을 명세하면 되는 고급언어라 할 수 있다. 다음음 절차형언어와 비절차형언어로 구분하여 사용되는 주요 언어들에 대해 사용용도 특징들을 간략히 요약해 보겠다.
자연언어로의 지속적 연구개발
컴퓨터산업은 타산업에 비해 라이프사이클이 대단히 짧다고 할 수 있다. 그러므로 컴퓨터언어의 발전방향에 대해서 단정적으로 말하기는 어렵다. 그러나 그간의 추세와 연구되고 있는 분야 그리고 상업적인 여건을 고려할때 아래와 같이 요약될수 있을 것 같다.
첫째로 현재 주로 하드웨어 부분에 치중되어 있던 병렬처리(concurrent processing)개념이 프로그램언어에도 도입된 형태가 상당수 개발될 것으로 판단되며 이를 바탕으로 실시간 처리체제의 응용분야가 더욱 광범위하게 될것으로 예측된다. 그 대표적인 케이스가 진술한 바와같이 ADA언어라 할수 있다.
ADA는 몇가지 단점을 가지고 있다. 예를들면 서로 상이한 기종간에 적용하기 위해서는 상당부분을 수정해야하기 때문에 범용성이 부족하다. 또한 완전한 분산처리체제(distributed system)를 이루기도 어렵다. 그럼에도 불구하고 고도의 정밀도와 신속성을 요구하는 군사적 목적의 분산처리용 언어로서 앞으로의 발전방향을 제시해준 강력한 언어임에는 틀림없다.
둘째로 기존절차형 언어와 비절차형 언어 각각의 단점을 보완한 언어들이 사용자들의 요구에 부응해 상당수 개발될 것으로 판단된다. 즉 기존절차형 언어들은 날이 갈수록 유지보수비가 격증하고 있을뿐 아니라 그 수명(life cycle)도 주변환경의 변화에 따라 점점 짧아지고 있다. 비절차형 언어는 그러한 문제점은 어느정도 해결한 반면 아직도 복잡한 처리의 프로그램 서술은 어렵고 그에따른 적용범위가 좁아진다는 문제점이 있다고 할 수 있다. 따라서 상기 2가지 형태의 단점을 최소화하고 장점을 최대한 취할 수 있는 언어로의 욕구가 급증하고 있는 실태이다.
1982년 미국의 'CINCOM sysem'사에서 개발한 MANTIS언어 및 '스페리'에서 개발된 MAPPER언어는 그러한 욕구를 어느정도는 충족시켜준 언어라 할 수 있겠다. 그러나 아직까지 이들은 범용성 등에서 시험적인 단계를 벗어나지 못했기 때문에, 앞으로는 이러한 유형의 보다 개선된 언어 형태가 계속 개발될 것으로 예측된다.
셋째로 현재에도 많은 연구가 진행되고 있지만 자연언어(Natural Language)의 지속적인 연구개발을 통한 인공지능(Artificial Intelligence)분야에의 응용 노력이 특히 두드러질 것으로 판단된다. 예를들면 사무자동화(Office Automation)분야와 전문가시스템(Expert System)분야의 자연스러운 결합을 들 수가 있을 것 같다. 즉 고도의 자동화 기능을 가진 사무자동화 기기를 전문지식을 가진 인간이 보다 넓히면서 고도의 생산성 있는 활동을 하게 되는 것이다. 비단 이분야 외에도 산업 자동화분야 우주항공분야 군사분야 교육분야 등 모든 분야에 걸쳐 이러한 유형의 적용이 점차 확대 되리라는 것은 쉽게 예측될 수 있다.
끝으로 갈수록 급증하는 소프트웨어 유지보수 비용의 감소 및 라이프사이클 증대를 위한 또 하나의 방법으로 이제까지의 수정개발 방식으로 부터 모듈화를 통한 조립 생산방식으로 변화해 나갈 것으로 예측된다. 이것은 자연어의 개발환경이 상당수준 이상된 전제조건 하에서만 가능하겠지만 사용자가 자연어로 지능시스템에 문제를 제기하면 기존의 것을 수정개발하는 대신 헌것을 버리고 자동생산과정에 의해 개발되는 방식이다. 이러한 개념에 의하면 환경변화에 따른 무한적인 유지보수의 딜레머를 거의 해소할 수가 있을 것이다.