프로그래밍 언어의 간추린 역사
프로그래밍 언어 개발은 컴퓨터의 기계어와 밀접하게 연관된다. 기계어는 이름에서 알 수 있듯이 기계가 실행할 수 있는 명령으로 된 언어다. 여기서 기계는 컴퓨터에 내장된 마이크로프로세서를 의미한다(CPU, 하드 디스크 컨트롤러 등). 프로세서는 특수한 기계 명령어에 따라 동작한다. 이와 같은 명령어가 결합되어 컴퓨터가 하나씩 명령을 실행할 수 있는 이진 기계 프로그램을 구성한다. 사람이 알아보기 어렵고, 개발하기는 더욱 어렵다.
어려운 개발을 용이하게 하기 위해 프로그래밍 언어와 텍스트 편집기, 변환 프로그램이 고안됐다. 첫 걸음은 1948년에 등장한 어셈블리(Assembly)이다. 프로그래머는 텍스트 편집기 안에서 어셈블리어 프로그램을 작성해서 텍스트 파일로 저장한다. 이 파일을 컴퓨터가 직접 실행할 수는 없으므로 중간에 어셈블러라는 보조 프로그램이 필요하다. 어셈블러는 이 파일, 즉 소스 코드를 기계 프로그램으로 변환한다(다음 그림 참조). 컴퓨터는 이렇게 해서 나온 이진수 기계 프로그램만 실행할 수 있다.
어셈블러 소스 코드는 기계어에 비해 이해하기 쉽다. 일련의 세부적인 명령으로 구성되기 때문에 명령의 수가 많고 장황하다. 따라서 간단한 hello world 프로그램도 파스칼과 같은 고수준 언어에 비하면 상당히 길다(다음 그림 참조). 큰 어셈블리어 프로그램을 작성하는 데는 오랜 시간이 걸린다. 또한 어셈블리어는 특정 프로세서에 연계되고 파스칼과 같은 고수준 언어에 비해 읽기가 어렵다. 장점은 잘 프로그램된 어셈블러 프로그램의 경우 실행 속도가 빠르고 메모리 및 하드 디스크 공간 사용량이 적다는 것이다.
이와 같은 확실한 장점이 있긴 하지만 열악한 가독성 및 유지보수 편의성, 낮은 개발자 생산성, 무엇보다 특정 하드웨어(마이크로프로세서)에 대한 의존성과 같은 단점이 너무 커서 불과 몇 년 후에 2세대 언어가 개발됐다. 가장 먼저 나온 고수준 언어는 포트란(Fortran)과 코볼(COBOL)이다. 포트란은 IBM이 1954년에 하드웨어 독립적인 강력한 과학용 언어를 목표로 개발했다. 이름에 성격이 나와 있다. 포트란은 Formula Translation의 줄임말이다. 이름 그대로 이 언어의 핵심 개념은 공식 변환이다.
어셈블러 프로그램은 어셈블러를 통해 기계 프로그램으로 변환되지만 포트란은 같은 목적으로 컴파일러라는 것을 사용한다. 컴파일러라는 이름부터 포트란이 어셈블러의 범위를 명확하게 뛰어넘는다는 것을 보여준다. 컴파일러는 고수준 소스 코드를 기계 코드로 변환할 뿐만 아니라, 최대한의 속도를 내고 최소한의 메모리 요건을 갖도록 프로그램을 최적화하는 역할도 한다.
즉, 컴파일러는 매우 효율적인 기계 프로그램을 생성한다. 이게 왜 중요했을까? 1950년대 초반의 컴퓨터는 지금의 컴퓨터에 비해 프로세서 성능 측면에서 보잘 것 없었다. 컴파일러가 효율성 높은 기계 프로그램을 생성하지 못했다면 1세대 고수준 프로그래밍 언어에 대한 관심이 그처럼 빠르게 증폭되지도 않았을 것이다.
어셈블러에서 최초의 고수준 언어로
포트란의 기반이 된 기본 개념은 1950년대 후반 코볼이라는 프로그램 언어로도 이어졌다. 코볼 역시 초점은 하드웨어 독립성에 있었다. 포트란과 다른 점은 과학용이 아닌 비즈니스 프로그램 개발을 목적으로 만들어졌다는 것이고, 그래서 이름도 코볼이다.
코볼은 “Common Business Oriented Language”의 줄임말이다. 상당부분 자연어에 의존하며, 포트란에 비해 많은 양의 데이터를 처리하도록 설계됐다. 코볼은 처음 등장한 후 가장 널리 사용되는 프로그램 언어 중 하나로 발전했고, 지금까지도 사용되고 있다.
포트란과 코볼, 두 언어 모두 초기에는 여러 문제점이 있었고 이런 문제를 금방 해결할 수도 없었다. 포트란, 코볼 프로그램은 비효율적인 구조로 인해 유지보수하기 어려운 프로그램인 경우가 많았다. 시간이 갈수록 애플리케이션이 점점 더 복잡해지면서 프로그래밍에 필요한 시간도 갈수록 길어졌고, 결과적으로 예산 초과로 인해 프로젝트가 실패하는 경우가 빈번하게 발생했다.
프로젝트 실패 사례가 증가하면서 1960년대 중반 첫 소프트웨어 위기가 촉발됐다. 이 위기를 극복하기 위한 다양한 접근 방법이 등장했다. 개발 프로세스 개선과 검증된 프로그래밍 라이브러리의 도입 외에, 더 비용 효율적인 프로그램 개발을 목적으로 하는 다른 프로그래밍 언어도 만들어졌다.
이때 나온 모든 프로그래밍 언어 중 여기서 짚어볼 중요한 두 언어는 파스칼과 C다. 파스칼은 니클라우스 워스가 1971년 알골(Algol) 68이라는 프로그래밍 언어를 기반으로 개발했다. 초기에는 상용 애플리케이션에서는 별로 사용되지 않았으나 대학에서 인기를 끌었다. 구조적 프로그래밍을 배우기에 좋은 언어였기 때문이다.
파스칼의 또 다른 장점은 엄격한 형식 지정이다. 이 말은 컴파일러에 의해 컴파일되는 시점에 고정된 데이터 형식에 이미 변수가 할당되고 이후 변경할 수 없다는 것을 의미한다. 덕분에 프로그램을 구조화하고 더 명확하게 만들 수 있으며, 처음부터 오류를 방지하기에도 더 유리하다. 유지보수하기 쉬운 견고한 프로그램 개발을 촉진하는 장점이다.
파스칼과 거의 같은 시점에 벨 랩스(Bell Labs)의 데니스 리치가 C라는 극단적으로 간결한 이름의 프로그래밍 언어를 개발했다. 이 언어는 B라는 프로그래밍 언어를 모체로 개발됐고 그래서 C라는 이름이 붙었다. C는 유닉스 운영체제의 프로그래밍을 개선하도록 만들어져 시스템 프로그래밍 분야에서 빠른 속도로 확산됐다.
C는 범용 프로그래밍 언어이므로 애플리케이션 개발 영역에도 도입됐다. C 프로그램은 그 목적에 따라 이식성과 효율성을 중심으로 만들어진다. 간단한 구문과 정교한 컴파일러 덕분에 일반적으로 실행 속도가 매우 빠르다. 단점은 유지보수가 용이하고 견고한 프로그램을 개발하기가 쉽지 않다는 점이다.
고수준 언어에서 객체지향 프로그래밍으로
알골 68, 파스칼, C와 같은 고급 프로그래밍 언어도 완벽하지는 않아서, 그 이후에도 프로그래밍 언어 개발은 계속됐다. 1970년대 초반에 객체 지향 프로그래밍(OOP)이 등장했지만 본격적으로 채택된 시기는 1980년대 중반이다. 객체 지향 프로그래밍의 기본적인 개념은 컴퓨터 프로그램에서 이전의 C와 파스칼에 비해 자연계를 더 효과적으로 표현하는 것이다.
상속과 같은 새로운 접근 방법과 캡슐화, 다형성과 같은 이전 언어에서 확장된 개념은 더 간결하고 견고한 프로그램을 만드는 데 도움이 됐다. 가장 큰 영향을 미친 객체 지향 언어는 시뮬라-67(Simula-67), 스몰토크(Smalltalk), 오브젝티브-C, C++, C#, 자바, 비주얼 베이직이다.
시뮬라-67과 스몰토크는 이제 거의 사용되지 않지만, 다양한 C 변형, 특히 C++는 매우 중요한 언어로 발전했다. C++는 C 언어를 심화 개발한 언어로 1985년에 등장했다. C와 마찬가지로 시스템 프로그래밍에 초점을 두고 개발됐으나 범용 프로그래밍 언어로서 애플리케이션 개발 분야에도 빠르게 확산됐다.
C++ 역시 컴파일러를 사용하며 하드웨어 독립적이지만 C에 비해 배우기는 훨씬 더 어렵다. 모체인 C의 기존 개념 외에 객체 지향 프로그래밍의 새로운 언어 요소가 추가됐기 때문이다. 배우기가 어렵고 오류가 빈번하게 발생한다는 점은 C++가 자주 듣는 비판이다. C++를 만든 비야네 스트롭스트룹 본인도 “C++에서는 자기 발등에 총을 쏠 일이 드물기는 하지만, 그런 일이 생기면 다리가 통째로 날아간다”고 말한 적이 있다.
마이크로소프트가 내놓은 비주얼 베이직(VB)은 C++와는 정반대로 단순함에 초점을 둔다. 비주얼 베이직은 기호 대신 영어 단어를 사용한다. 또한 초기 비주얼 베이직은 프로그램 변환과 실행을 위해 컴파일러가 아닌 더 쉬운 인터프리터를 사용했다. 인터프리터는 마이크로프로세서가 실행할 수 있도록 소스 코드 명령어를 하나씩 기계 코드로 변환한다.
닷넷 프레임워크를 위한 이후 버전의 VB에서는 이 방식이 바뀌어서 자바 프로그래밍 언어와 마찬가지로 다시 컴파일러가 사용된다. 컴파일러는 VB 소스 코드를 가상머신 실행 파일이라는 중간 형식으로 변환한다. 레드몽크(RedMonk)에 따르면, 비주얼 베이직은 더 이상 가장 인기 있는 20개 프로그래밍 언어 순위에 들지 못한다. 최신 레드몽크 순위에서는 예를 들어 자바와 C#이 VB보다 훨씬 더 인기가 높다.
이렇게 해서 지금의 인기 있는 프로그래밍 언어인 자바와 C#에 이르렀다. C#은 마이크로소프트가 자바 모델을 기반으로 개발했으며, 어느정도 시스템 종속적이다. 반면 썬 마이크로시스템즈에서 개발한 언어인 자바는 온전한 시스템 독립성을 강조한다. 두 프로그래밍 언어 모두 C++와 관계가 있지만 언어 범위가 대폭 축소됐고 따라서 C++보다 배우기도 더 쉽다.
예를 들어 1995년에 나온 자바는 사실상 포인터가 없고, 그 대신 자동 메모리 관리를 사용한다. 자바는 C++와 마찬가지로 컴파일러를 사용한다. 그러나 이 컴파일러는 자바 소스 코드에서 실제 마이크로프로세서를 위한 기계 코드를 생성하지는 않고, 그 대신 이른바 바이트코드를 생성한다. 바이트코드는 가상 머신(특수한 컴퓨터 프로그램. 위 그림 참조)에 의해 실행된다. 바이트코드는 모든 운영체제에 대해 동일하므로 자바 프로그램은 적절한 가상 머신이 존재하는 한 모든 운영체제에서 실행이 가능하다.
결론
자바와 C#이 등장한 지금도 프로그래밍 언어 개발은 결코 멈추지 않는다. 그루비, 파이썬, 루비, 스칼라와 기타 신생 언어까지, 프로그래밍 언어를 나열하자면 끝도 없다. 기계어에서 오늘날의 프로그래밍 언어에 이르기까지 비약적인 발전을 해왔다고 정리할 수 있다.
프로그래밍 언어는 점점 더 나아지면서 새 프로그래밍 언어와 이전 언어 간의 차이는 갈수록 더 작아지고 있다. 프로그래밍 언어 개발이 완전히 끝나는 때가 올까? 아마 오지 않을 것이다. 다만 새로운 프로그래밍 언어 개발의 속도는 눈에 띄게 둔화되고 있다.
https://www.itworld.co.kr/news/213089
'ICT와 AI 정보' 카테고리의 다른 글
Malwarebytes 4.5.6 버전으로 업데이트 (0) | 2022.03.22 |
---|---|
통가를 구한 스타링크 #쇼츠 #Shorts (0) | 2022.02.20 |
프로젝트 디버깅 현장 요약 짤 (0) | 2021.12.09 |
USB 케이블 B-타입(type) (0) | 2021.11.09 |
핼러윈 구글(Halloween Google) 대문 (0) | 2021.10.31 |
Windows 11 & Squid Game (0) | 2021.10.13 |
이클립스(Eclipse)도 업데이트 (0) | 2021.10.11 |
비주얼 스튜디오(Visual Studio) 2019 업데이트 (0) | 2021.10.11 |