맨위로가기

BCPL

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

BCPL은 1967년 마틴 리차즈가 설계하고 구현한 프로그래밍 언어이다. 작고 간단한 컴파일러를 위해 설계되었으며, 시스템 부트스트래핑에 널리 사용되었다. BCPL은 단일 데이터 형식을 사용하고, 형식 검사를 제공하지 않는 특징을 갖는다. BCPL은 최초의 중괄호 프로그래밍 언어였으며, C 언어 및 C++에 영향을 미쳤다. BCPL은 "Hello, World!" 프로그램이 처음 작성된 언어이며, 여러 운영 체제와 프로젝트에서 사용되었다.

더 읽어볼만한 페이지

  • 구조적 프로그래밍 언어 - CPL (프로그래밍 언어)
    CPL은 1960년대에 개발된 프로그래밍 언어로, ALGOL 60의 영향을 받아 과학 및 상업 프로그래밍을 아우르는 넓은 응용 분야를 지향했으나 복잡성으로 인해 널리 보급되지는 못했고, BCPL, B, C 언어에 영향을 주어 현대 프로그래밍 언어 발전에 기여했다.
  • 구조적 프로그래밍 언어 - 베릴로그
    베릴로그는 디지털 시스템 모델링 및 설계를 위한 하드웨어 기술 언어로서, IEEE 표준으로 발전해 왔으며, 모듈 계층 구조, 동시성, 순차적 구문, 다양한 연산자, 4치 논리 등의 특징과 C 언어와 유사한 문법 구조를 갖는다.
  • 시스템 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 시스템 프로그래밍 언어 - 스위프트 (프로그래밍 언어)
    2014년 애플 세계 개발자 컨퍼런스에서 처음 공개된 스위프트는 크리스 래트너가 개발한 애플의 범용 프로그래밍 언어로서, Objective-C를 대체하며 다양한 플랫폼 지원, 모던 문법, 안정성, 인터랙티브한 개발 환경, SwiftUI 등의 특징을 가진다.
  • 절차적 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • 절차적 프로그래밍 언어 -
    펄은 래리 월이 개발한 텍스트 조작에 강점을 가진 다목적 프로그래밍 언어이며, 1987년 펄 1.0이 처음 공개된 이후 여러 버전 업데이트를 거쳐 객체 지향 프로그래밍과 유니코드 지원 기능을 추가했고, 현재 펄 5가 널리 사용되며 CPAN을 통해 방대한 모듈 생태계를 제공한다.
BCPL - [IT 관련 정보]에 관한 문서
기본 정보
이름BCPL
설계자마틴 리처즈
개발자케임브리지 대학교
개발년도1967년
프로그래밍 패러다임절차형 프로그래밍
명령형 프로그래밍
구조적 프로그래밍
타입 시스템타입 없음 (모든 것이 워드)
영향을 받은 언어CPL
영향을 준 언어B 언어
C 언어
Go
추가 정보
웹사이트마틴 리처즈 (2003년 컴퓨터 개척자 상)

2. 디자인

BCPL은 작고 간단한 컴파일러를 작성할 수 있도록 설계되었으며, 일부 컴파일러는 16kB의 메모리만으로도 실행될 수 있었다. 마틴 리처즈가 BCPL로 직접 작성한 컴파일러는 이식성이 매우 뛰어났기 때문에, 시스템 부트스트래핑에 널리 사용되었다.

컴파일러의 높은 이식성은 구조적인 특징 덕분이었다. 컴파일러는 두 부분으로 나뉘었다.


  • 프런트엔드: 소스 코드를 구문 분석하여 O-코드(object code)라는 가상 기계용 중간 언어를 생성했다.
  • 백엔드: O-코드를 받아 대상 기계의 기계어로 변환했다.

새로운 기계를 지원하기 위해서는 컴파일러 코드의 약 5분의 1만 다시 작성하면 되었으며, 이는 보통 2~5 인월(man-month) 정도 소요되었다. 이러한 컴파일러 구조는 이후 파스칼이나 자바 등 다른 언어에서도 일반적인 방식이 되었다.

BCPL은 단 하나의 데이터 형식만 가진다는 독특한 특징이 있다. 이 데이터 형식은 고정된 비트 수의 워드로, 일반적으로 해당 아키텍처의 기계어 워드 크기와 일치하며 모든 유효한 메모리 주소를 표현할 수 있을 만큼 충분히 컸다. 당시 많은 기계에서 이 데이터 형식은 16비트 워드였다. 그러나 이후 메모리의 최소 주소 지정 단위가 워드가 아닌 바이트인 기계나, 32비트 또는 64비트처럼 더 큰 워드 크기를 사용하는 기계에서 BCPL을 사용하게 되면서 이 단일 워드 데이터 형식은 상당한 제약이 되었다.

값의 의미는 해당 값을 처리하는 데 사용된 연산자에 따라 결정되었다. 예를 들어, `+` 연산자는 두 값을 정수로 간주하여 덧셈을 수행했고, `!` 연산자는 값을 주소로 간주하여 해당 주소가 가리키는 메모리의 내용을 가져오는 포인터 역참조 연산을 수행했다. 이러한 방식 때문에 BCPL 구현은 형식 검사 기능을 제공하지 않았다. 헝가리안 표기법은 프로그래머가 의도치 않은 형식 오류를 방지하기 위해 이러한 환경에서 고안된 방법 중 하나이다.

워드 단위로 데이터를 처리하는 BCPL과 바이트 단위로 데이터를 처리하는 하드웨어 간의 불일치를 해결하기 위해 여러 방법이 시도되었다. 한 가지 방법은 워드와 바이트 문자열 간의 변환을 수행하는 표준 라이브러리 함수를 제공하는 것이었다. 나중에는 비트 필드 선택 연산자와, 중위 표기법으로 바이트를 간접 참조하는 연산자(`%` 기호 사용)라는 두 가지 언어 기능이 추가되었다.[4]

BCPL은 별도의 컴파일 단위 간의 데이터 공유(바인딩)를 독특한 방식으로 처리한다. 사용자 정의 전역 변수는 없으며, 대신 포트란의 "공용 블록(COMMON block)"과 유사한 전역 벡터(global vector)를 사용한다. 여러 컴파일 단위에서 공유되는 모든 데이터(스칼라 값, 배열 또는 구조체에 대한 포인터 등)는 이 전역 벡터 내의 미리 정해진 위치에 저장된다. 헤더 파일(컴파일 시 `GET` 지시문을 통해 포함됨)은 `GLOBAL` 지시문을 사용하여 공유할 변수나 함수의 이름과 해당 이름이 전역 벡터 내에서 차지하는 숫자 오프셋(주소)을 명시함으로써 전역 데이터 동기화의 핵심 수단이 된다. 전역 벡터는 변수뿐만 아니라 외부 프로시저(함수)에 대한 바인딩 정보도 포함한다. 이 방식은 컴파일 단위의 동적 로딩을 매우 간단하게 만들며, 일반적인 링커에 의존하는 대신 프로그래머가 직접 링킹 과정을 제어할 수 있게 해준다.

전역 벡터 방식은 표준 라이브러리 루틴을 교체하거나 확장하는 것을 매우 쉽게 만들었다. 프로그램은 특정 라이브러리 루틴의 원래 주소를 전역 벡터에서 다른 곳에 저장해 둔 다음, 그 자리에 새로운 버전의 루틴 주소를 넣을 수 있다. 새로 추가된 루틴은 필요에 따라 내부적으로 원래 루틴을 호출할 수도 있었다. 이는 디버깅에 유용하게 사용될 수 있었다.

BCPL은 세계 최초로 중괄호 ‘{ }’를 문법 규칙에 사용한 언어로 여겨진다. 최초의 BCPL 매뉴얼에는 중괄호에 대한 설명이 없고 $($)가 사용되었지만, 나중에 TX-2로 이식된 BCPL에서는 중괄호가 사용되었으며, 그것을 설명한 매뉴얼은 B 언어의 개발 시기보다 오래된 것이다.[16][17] C 언어에서는 채택되지 않았던 BCPL의 //에 의한 단일 행 주석은 C++이나 후의 C99에서 다시 채용되었다. 다만, 초창기 BCPL 환경에서는 키보드 제약으로 인해 $($) 또는 [] 같은 기호 쌍이 중괄호 대신 사용되기도 했다.

BCPL의 철학은 책 "''BCPL, the language and its compiler''"의 인용으로 간결하게 보여진다.

:''BCPL의 철학은 최선을 안다고 모두가 생각하는 폭군이 있는 것이 아니고, 무엇이 허용되고 무엇이 허용되지 않는가 하는 규칙이 정해져 있는 것도 아니다. 오히려 BCPL은, 비록 명백히 어리석은 상황에 직면했을 때조차도, 불평하지 않고 자신의 능력을 최대한 발휘하여 서비스를 제공하려고 하는 하인처럼 행동한다. 그가 무엇을 하고 있으며, 세세한 제한에 구애받지 않는다는 것을, 프로그래머는 항상 이해하고 있다고 생각한다.''[5]

3. 역사

BCPL은 1967년 케임브리지 대학교의 마틴 리처즈가 처음 구현했다.[6] 이는 1960년대 초 설계된 통합 프로그래밍 언어(Combined Programming Language, CPL)의 복잡함에 대응하여 만들어졌다. 리처즈는 "컴파일을 어렵게 만드는 전체 언어의 기능을 제거함"으로써 BCPL을 만들었다. 최초의 컴파일러 구현은 1967년 봄, 리처즈가 매사추세츠 공과대학교(MIT)의 프로젝트 MAC을 방문했을 때 호환 시분할 시스템(CTSS) 환경의 IBM 7094용으로 작성되었다. 이 언어는 1969년 봄 합동 컴퓨터 컨퍼런스(Joint Computer Conference)에서 발표된 논문을 통해 처음으로 설명되었다.

BCPL이 원래 "부트스트랩 케임브리지 프로그래밍 언어(Bootstrap Cambridge Programming Language)"를 의미했다는 소문이 있지만, CPL 개발이 완료되지 않은 상태였고, 이 약어는 나중에 BCPL 책을 위해 재해석되었다는 설이 있다.

BCPL은 최초의 "Hello, World!" 프로그램이 작성된 언어로 알려져 있다.[7] 최초의 MUD(Multi-user dungeon)인 MUD1 역시 BCPL로 작성되었다.

TRIPOS 운영 체제와 아미가OS(AmigaOS) 초기 버전의 일부 핵심 요소(예: 부팅 프로세스) 등 여러 운영 체제가 BCPL로 부분적 또는 전체적으로 작성되었다. 또한 BCPL은 제록스 PARC의 알토(Alto) 프로젝트(최초의 현대적 개인용 컴퓨터 중 하나)에서 사용된 초기 언어였으며, 브라보(Bravo) 문서 편집 시스템 등 여러 중요한 프로그램이 BCPL로 개발되었다.

1969년, 리처즈의 아틀라스 2 컴파일러에서 생성된 O-코드(중간 언어 코드) 종이테이프를 이용하여 ICT 1900 시리즈 컴퓨터용 컴파일러를 부트스트랩(초기 구동)하는 작업이 이루어졌다. 두 기계는 워드 길이(48비트 대 24비트), 문자 인코딩, 문자열 표현 방식이 달랐음에도 성공적으로 부트스트랩되어 이 방법의 실용성을 입증했다.

1970년 말까지 Honeywell 635 및 645, IBM 360, PDP-10, TX-2, CDC 6400, UNIVAC 1108, PDP-9, KDF 9, 아틀라스 2 등 다양한 기종에서 BCPL 구현이 이루어졌다. 1974년에는 BBN 테크놀로지스에서 중간 O-코드를 사용하지 않는 BCPL의 독자적인 방언이 구현되었다. 이 구현은 BBN의 TENEX 운영체제가 설치된 PDP-10에서 호스트되는 크로스 컴파일러였으며, ARPANET에 사용된 BBN의 2세대 인터페이스 메시지 프로세서(IMP)용 PDP-11 코드를 생성했다.

1980년대 중반에는 마틴 리처즈의 형제인 존 리처즈가 설립한 리처즈 컴퓨터 프로덕츠(Richards Computer Products)에서 BBC 마이크로용 버전을 개발했다.[8] 이 버전은 BBC 도메스데이 프로젝트에 사용되었다. 영국의 소프트웨어 회사 아르노(Arnor Ltd)는 1985년(또는 1986년)에 암스트래드 CPC와 암스트래드 PCW 컴퓨터용 BCPL 버전을 출시했다. 런던 켄싱턴의 토펙스프레스(Topexpress Ltd)는 1985년에 애플 매킨토시용 MacBCPL을 출시했다.

BCPL의 설계와 철학은 B 언어에 큰 영향을 미쳤고, B 언어는 다시 C 언어 개발에 영향을 주었다.[9] 당시 프로그래머들 사이에서는 C의 후속 언어가 알파벳 순서에 따라 "D"가 될지, 아니면 BCPL의 'P'를 따라 "P"가 될지에 대한 농담 섞인 논쟁이 있었다. C의 후속 언어 중 가장 널리 받아들여진 것은 C++ (++는 C의 증가 연산자를 의미)이지만,[10] 이후 D 언어도 등장했다.

1979년까지 최소 25개의 서로 다른 컴퓨터 아키텍처에 대한 BCPL 구현이 존재했다. 그러나 유닉스 이외의 시스템에서도 C 언어의 인기가 높아지면서 BCPL은 점차 사용 빈도가 줄어들었다.

마틴 리처즈는 자신의 웹사이트에서 최신 버전의 BCPL을 계속 유지 관리하고 있으며, 마지막 업데이트는 2023년이다.[11] 이 버전은 리눅스, FreeBSD, macOS 등 다양한 시스템에서 실행될 수 있도록 설정 가능하다. 최신 배포판에는 그래픽 및 사운드 라이브러리가 포함되어 있으며, 포괄적인 설명서도 제공된다. 그는 음악 자동 악보 추적(Score following) 연구를 포함하여 BCPL을 이용한 프로그래밍 작업을 계속하고 있다.

BCPL의 일반적인 비공식 MIME 유형은 `text/x-bcpl`이다.

4. 프로그램 예제

BCPL 언어로 작성된 몇 가지 프로그램 예제는 다음과 같다. 아래 예제들은 마틴 리처드의 BCPL 배포판에서 가져온 것이다.


  • 팩토리얼 계산: 주어진 수의 팩토리얼 값을 계산하여 출력하는 예제이다.
  • N-퀸 문제 해결: 체스판 위에 N개의 을 서로 공격할 수 없도록 배치하는 N-퀸 문제의 해 개수를 찾는 예제이다.


각 프로그램 예제의 구체적인 코드와 설명은 아래의 해당 하위 섹션에서 자세히 확인할 수 있다.

4. 1. Hello, world!

리차드와 휘트비-스트리븐스[12]는 표준 시스템 헤더 'LIBHDR'를 사용하는 BCPL의 "Hello, World!" 프로그램 예시를 다음과 같이 제시했다.



GET "LIBHDR"

LET START() BE WRITES("Hello, World")


4. 2. 팩토리얼 출력

아래 코드는 마틴 리처드의 BCPL 배포판에서 가져온 팩토리얼 계산 및 출력 예제이다.



GET "LIBHDR"

LET START() = VALOF $(

FOR I = 1 TO 5 DO

WRITEF("%N! = %I4*N", I, FACT(I))

RESULTIS 0

$)

AND FACT(N) = N = 0 -> 1, N * FACT(N - 1)



이 코드는 1부터 5까지의 정수에 대한 팩토리얼 값을 계산하여 출력한다. `FACT(N)` 함수는 재귀적으로 팩토리얼을 계산하며, `START()` 함수 내의 `FOR` 루프를 통해 각 결과를 `WRITEF` 함수로 형식에 맞춰 출력한다.

마틴 리처드의 최신 Cintsys 버전(2018년 12월 기준)을 사용하여 이 프로그램을 실행하는 경우, 오류를 방지하기 위해 `LIBHDR`, `START`, `WRITEF`를 소문자(`libhdr`, `start`, `writef`)로 변경해야 한다.

4. 3. N-퀸 문제

아래는 마틴 리처드의 BCPL 배포판에서 가져온 N-퀸 문제의 해 개수를 계산하는 예제 코드이다.



GET "LIBHDR"

GLOBAL $(

COUNT: 200

ALL: 201

$)

LET TRY(LD, ROW, RD) BE

TEST ROW = ALL THEN

COUNT := COUNT + 1

ELSE $(

LET POSS = ALL & ~(LD | ROW | RD)

UNTIL POSS = 0 DO $(

LET P = POSS & -POSS

POSS := POSS - P

TRY(LD + P << 1, ROW + P, RD + P >> 1)

$)

$)

LET START() = VALOF $(

ALL := 1

FOR I = 1 TO 12 DO $(

COUNT := 0

TRY(0, 0, 0)

WRITEF("%I2-QUEENS PROBLEM HAS %I5 SOLUTIONS*N", I, COUNT)

ALL := 2 * ALL + 1

$)

RESULTIS 0

$)



마틴 리처드의 최신 Cintsys 버전(2018년 12월 기준)에서 위 프로그램을 실행할 경우, 오류를 방지하기 위해 `LIBHDR`, `START`, `WRITEF`를 소문자(`libhdr`, `start`, `writef`)로 변경해야 한다.

참조

[1] 웹사이트 Hello Gophers https://talks.golang[...] 2014-04-24
[2] pdf The BCPL Cintsys and Cintpos User Guide, 2.1.4 Section brackets https://www.cl.cam.a[...]
[3] 웹사이트 Martin Richards (2003 Computer Pioneer Award) https://www.computer[...] IEEE Computer Society 2017-11-24
[4] 웹사이트 Clive Feather on CPL and BCPL https://www.lysator.[...] 2024-03-01
[5] 서적 BCPL: The Language and its Compiler Cambridge University Press
[6] 웹사이트 Martin Richards (2003 Computer Pioneer Award) https://www.computer[...] IEEE Computer Society 2017-11-24
[7] 웹사이트 BCPL http://www.catb.org/[...]
[8] 웹사이트 Reuters technical development: Glossary - THE BARON http://www.thebaron.[...]
[9] 서적 The C Programming Language https://archive.org/[...] Bell Telephone Laboratories 1978
[10] 웹사이트 History of C++ http://www.cplusplus[...] 2017-12-12
[11] 웹사이트 BCPL/README (BCPL Cintcode distribution) https://www.cl.cam.a[...]
[12] 서적 BCPL: The Language and its Compiler Cambridge University Press
[13] 웹사이트 Hello Gophers https://talks.golang[...] 2014-04-24
[14] 간행물 BPL - コンパイラ記述とシステムプログラミングのためのツール Spring Joint Computer Conference Proceedings
[15] pdf The BCPL Cintsys and Cintpos User Guide, 2.1.4 Section brackets https://www.cl.cam.a[...]
[16] pdf MASSACHUSETTS INSTITUTE OF TECHNOLOGY http://bitsavers.tra[...]
[17] 웹사이트 The strange birth and long life of Unix https://spectrum.iee[...]
[18] 웹사이트 BCPL Reference Manual (1967) https://www.bell-lab[...]
[19] 블로그 세계에서 처음으로 {}를 사용 https://www.wizfores[...] 2016-02
[20] 블로그 BCPL에 대한 수정 https://www.wizfores[...] 2016-02-13
[21] 웹사이트 BCPL http://www.catb.org/[...]
[22] 웹사이트 Reuters technical development: Glossary - THE BARON http://www.thebaron.[...] 2020-06-06
[23] 웹사이트 History of C++ http://www.cplusplus[...] 2017-12-12
[24] 서적 Expert C Programming: Deep C Secrets Prentice Hall



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com