B (프로그래밍 언어)

위키백과, 우리 모두의 백과사전.

B
패러다임절차적
설계자켄 톰슨
개발자켄 톰슨, 데니스 리치
자료형 체계없음
영향을 받은 언어
BCPL, Bon
영향을 준 언어
C, C++

BAT&T 벨 연구소켄 톰슨이 개발한 프로그래밍 언어이다. C 언어로 흡수되는 형태로 거의 사장되었다. 켄 톰슨이 데니스 리치의 감수를 받는 형태로 설계하였으며 1969년에 최초로 등장했다.

소개[편집]

B는 실질적인 C의 조상 언어로 볼 수 있다. B 언어로 만든 프로그램은 컴파일러에 의해 중간 코드로 변환되어 실행하는 인터프리터를 필요로 한다. 실행시에는 인터프리터 번역 순서대로 처리되기 때문에 실행 속도가 극도로 느렸다. 단 PDP-7 버전은 기계어로 처리할 수 있도록 개량되었다.

역사[편집]

켄 톰슨은 DEC의 컴퓨터 PDP-7로 유닉스를 개발하고 있었지만 당시 유닉스는 프로그램 개발을 어셈블리 언어로 밖에 할 수 없었다. 그래서 켄 톰슨은 유닉스에서 동작하는 고급언어 개발을 시작했다. 그는 유닉스 개발 이전 멀틱스 개발에 종사하고 있었는데 멀틱스의 BCPL을 바탕으로 B 언어를 개발했다.

이후 B 언어는 켄 톰슨 자신과 데니스 리치, 브라이언 커니핸에 의해 개량되어 NewB(NB)를 거쳐 이윽고 C 언어로 발전하게 된다.

B언어는 켄 톰슨이 당시의 미니 컴퓨터의 메모리 용량에서 작동할 수 있게 하려고 불필요한 구성 요소(컴포넌트)를 제거한 일종의 BCPL 시스템이다.

BCPL이나 Forth와 같이 B 언어는 워드 형태의 1개의 데이터형만 가지고 있었다. 많은 연산자(사칙 연산 등)는 이 데이터를 정수로 취급하였고, 그 이외에는 모두 포인터로 다루었다. 그 이외의 부분은 C 언어의 초기 버전과 비슷하다. C 언어의 표준 입출력 라이브러리에 비견되는 라이브러리를 가지고 있었다.

초기에는 유닉스를 사용한 DEC의 PDP-7용과 PDP-11에서 사용되었고 한편 GCOS라고 하는 OS가 동작하는 허니웰의 36비트 메인프레임에도 사용하였다. 최초의 PDP-7용에서는 스레드 코드로 컴파일 하여 데니스 리치가 기계어로 출력하는 컴파일러를 만들었다. 1970년에 PDP-11에 도입되었지만 역시 이식에는 스레드 코드가 사용되었다. 이때 최초의 yacc가 PDP-11용으로 개발되었다. 데니스 리치는 이 시기에 유지보수를 담당했다.

B 언어는 자료형이 없는 설계로 허니웰이나 PDP-7과 같은 낡은 컴퓨터에서는 쓸모있었지만, PDP-11이나 현대적인 컴퓨터가 지원하는 문자 자료형을 적절히 처리할 수 없었기 때문에 문제가 되었다. 1971년 데니스 리치는 전면적인 변경을 시도해 컴파일러가 기계어 코드를 생성할 수 있도록 하는 한편 자료형을 변수를 추가했다. 1971년부터 1972년까지 B 언어는 NewB 언어로 진화했고 앨런 슈나이더(Alan Snyder)의 강한 요구로 전처리기가 더해져서 1972년, 1973년 두해 동안 초기의 C 언어로 진화했다. 1973년 여름에 드디어 PDP-11용 유닉스가 C 언어로 다시 씌여져서 이러한 노력은 완전한 결실을 맺게 되었다. 1973년에는 허니월 635 시스템에서 IBM 360/370 시스템으로 이식할 필요성이 제기되었는데 이 와중에 마이크 레스크(Mike Lesk)는 나중에 C 언어 표준 입출력 라이브러리(stdio)가 되는 《범용 I/O 패키지》를 작성했다.

B 언어는 허니웰의 메인프레임에서 1990년대까지 계속 이용되었다. 또한 단순 업무 활용에 필요하다든가 툴 및 라이선스 문제 등의 이유로 인해 일부 임베디드 시스템에서도 사용되고 있었다. 한편 유명한 오픈소스 다중 사용자 온라인 게임 AberMUD도 B 언어로 제작되었다.

B 언어는 BCPL의 영향을 그대로 받았기 때문에 명칭인 B 마저 BCPL의 머리글자를 따왔을 가능성이 높다. 하지만 켄 톰슨은 멀틱스에서 사용하기 위해 전혀 다른 방식의 언어인 Bon를 고안했는데 이것이 이름의 유래일 가능성이 있다.

코드 예제[편집]

켄 톰슨이 쓴 《Users' Reference to B》에서 발췌됨

/* 다음 함수는 비음(非陰)의 숫자 n을 b진수 형태로 출력한다 (단, 2<=b<=10)
  이 루틴은 ASCII 문자 코드 값이 0에서 9까지 연속하고 있음을 이용하고 있다. */

printn(n,b) {
        extrn putchar;
        auto a;

        if(a=n/b) /* 대입문. 등차 비교가 아님 */
                printn(a, b); /* 재귀 호출 */
        putchar(n%b + '0');
}

같이 보기[편집]

외부 링크[편집]