B
는
AT&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');
}
같이 보기
[
編輯
]
外部 링크
[
編輯
]