bc(프로그래밍 언어)
bc (programming language)![]() |
개발자 | 벨 연구소의 로버트 모리스와 로린다 체리 |
---|---|
초기 릴리즈 | 1975년, 46~47년 전 |
운영 체제 | Unix, Unix 라이크, Plan 9, FreeDOS |
플랫폼 | 크로스 플랫폼 |
유형 | 명령어 |
bc는 기본 계산기(종종 벤치 계산기라고도 함)에서 C 프로그래밍 언어와 유사한 구문을 가진 "임의 정밀도 계산기 언어"입니다.bc는 일반적으로 수학 스크립트 언어 또는 대화형 수학 셸로 사용됩니다.
개요
일반적인 대화형 사용법은 명령어 입력입니다.bc
Unix 명령어프롬프트에서 다음과 같은 수식을 입력합니다.(1 + 3) * 2
이 경우 출력됩니다.bc는 임의의 정밀도로 동작할 수 있지만 실제로는 소수점 뒤에 0자리가 되기 때문에 식은2/3
수율(수직선이 잘리고 반올림되지 않음).이로 인해 새로운 bc 사용자는 이 사실을 알지 못할 수 있습니다.그-l
옵션을 bc로 설정하면 기본 스케일(소수점 뒤에 표시됨)이 20으로 설정되고 언어에 몇 가지 수학 함수가 추가됩니다.
역사
bc는 1975년 버전6 Unix에서 처음 등장했습니다.이것은 Bell Labs의 Lorinda Cherry가 dc의 프런트 엔드로 작성한 것으로, Robert Morris와 Cherry가 작성한 임의의 정밀도 계산기.dc는 폴란드어 역표기로 지정된 임의의 정밀도 계산을 수행했습니다.bc는 단순한 컴파일러(단일 yacc 소스 f)를 통해 동일한 기능에 대한 일반적인 프로그래밍 언어 인터페이스를 제공했습니다.수백 줄의 코드로 구성된 ile)을 사용하여 C-like 구문을 dc 표기로 변환하고 결과를 dc를 통해 파이핑합니다.
1991년에 POSIX는 bc를 엄격하게 정의하고 표준화했습니다.현재 이 표준의 3가지 구현이 남아 있습니다.첫 번째는 Unix 및 Plan 9 시스템에서 존속하는 기존의 Unix 구현입니다.이것은 dc로의 프런트 엔드입니다.두 번째는 Philip A에 의해 1991년에 처음 출시된 무료 소프트웨어 GNU bc입니다.넬슨.GNU 구현은 POSIX 표준을 넘어서는 수많은 확장을 가지고 있으며 더 이상 DC의 프런트 엔드가 아닙니다(바이트 코드 인터프리터입니다).세 번째는 2003년 OpenBSD에 의한 재실시입니다.
실장
POSIX bc
POSIX 표준화된 bc 언어는 전통적으로 dc 프로그래밍 언어로 작성되어 dc의 간결한 구문의 복잡함 없이 dc 언어의 기능에 보다 높은 수준의 접근을 제공합니다.
이 형식에서 bc 언어에는 단일 문자 변수, 배열 및 함수 이름, 대부분의 표준 산술 연산자 및 익숙한 제어 흐름 구조가 포함됩니다.if(cond)...
,while(cond)...
그리고.for(init;cond;inc)...
C에서)를 참조해 주세요.C와 달리 절 뒤에 가 붙을 수 없습니다.
함수는 키워드를 사용하여 정의되며 값에서 반환되는 값은 괄호 안의 반환값을 사용하여 반환됩니다.키워드(C에서는 옵션)는 변수가 함수의 로컬임을 선언하기 위해 사용됩니다.
모든 숫자와 변수 내용은 글로벌 변수에 의해 정밀도(소수점 이하)가 결정되는 임의 정밀도 숫자입니다.
입력(인터랙티브 모드), 출력 및 프로그램 상수의 숫자 베이스는 예약된(입력 베이스) 및 (출력 베이스) 변수를 설정하여 지정할 수 있습니다.
계산 결과를 변수에 의도적으로 할당하지 않음으로써 출력이 생성된다.
코멘트는 C 기호와 (시작 및 종료) 기호를 사용하여 bc 코드에 추가할 수 있습니다.
연산자
C와 똑같다
다음 POSIX bc 연산자는 C 연산자와 동일하게 동작합니다.
+ - * / += -= *= /= ++ -- < > == != < > = ( )[ ] { }
C와 비슷하다
계수 연산자,%
그리고.%=
글로벌 변수가 0으로 설정되어 있는 경우에만 C와 동일하게 동작합니다.즉, 모든 계산이 정수만 됩니다.그렇지 않으면 적절한 척도로 계산이 수행됩니다. a%b
로 정의됩니다.a-(a/b)*b
. 예:
bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.이 소프트웨어는 무상 소프트웨어이며 보증은 일절 없습니다.자세한 내용은 'warranty'를 입력하십시오. 척도=0; 5%3 2 척도=1; 5%3 .2 스케일=20, 5%3 .00000000000000000002
C와의 경합
연산자
^ ^=
표면적으로는 C 비트 배타적 연산자와 유사하지만 실제로는 bc 정수 지수 연산자입니다.
특히 주의할 점은,^
음수가 있는 연산자는 C 연산자 우선순위를 따르지 않습니다. -2^2
는 -4가 아닌 bc 아래의 4에 대한 답을 제공합니다.
C에 상대적인 "누락된" 연산자
& ^ & = ^ = & = < > < = > = ? :
는 POSIX bc에서는 사용할 수 없습니다.
내장 기능
제곱근을 계산하는 함수는 POSIX bc의 유일한 내장 수학 함수입니다.다른 기능은 외부 표준 라이브러리에서 사용할 수 있습니다.
인수의 정밀도(변수와 마찬가지로)를 결정하는 함수와 인수의 유효 소수 자릿수를 결정하는 함수도 내장되어 있습니다.
표준 라이브러리 기능
bc의 표준 산술 라이브러리(-l 옵션으로 정의)에는 사인, 코사인, 아크탄젠트, 자연 로그, 지수 함수 및 두 파라미터 베셀 함수 J를 계산하는 함수가 포함되어 있습니다. 대부분의 표준 산술 함수(기타 역 삼각함수 포함)는 이러한 함수를 사용하여 구성할 수 있습니다.그 외의 많은 기능의 실장에 대해서는, 외부 링크를 참조해 주세요.
bc 명령어 | 기능. | 묘사 |
---|---|---|
s(x) | 사인 | 라디안 단위의 각도인 x를 취합니다. |
c(x) | 코사인 | 라디안 단위의 각도인 x를 취합니다. |
a(x) | 아크탄젠트 | 라디안을 반환합니다. |
l(x) | 자연 로그 | |
e(x) | 지수 함수 | |
j(n,x) | 베셀 함수 | x의 order-n Bessel 함수를 반환합니다. |
l 옵션을 지정하면 스케일이 [1]20으로 변경되므로 modulo 등의 동작이 예기치 않게 될 수 있습니다.예를 들어, 쓰기bc -l
그 다음 명령어print 3%2
출력 0 입니다.하지만 글쓰기는scale=0
끝나고bc -l
그 다음 명령어print 3%2
출력 1이 됩니다.
플랜 9 bc
계획 9 bc는 POSIX bc와 동일하지만 추가 문구가 있다.
GNU bc
GNU bc는 POSIX 표준에서 파생되어 많은 확장 기능을 포함하고 있습니다.이는 POSIX 표준의 dc 기반 구현과는 완전히 별개이며 대신 C로 기술되어 있습니다.그럼에도 불구하고 모든 POSIX bc 프로그램은 GNU bc 프로그램으로 변경되지 않고 실행되므로 완전히 하위 호환됩니다.
GNU bc 변수, 배열 및 함수 이름은 여러 문자를 포함할 수 있으며, 일부 연산자는 C에서 포함되며, 특히 절 뒤에 가 이어지는 경우가 있습니다.
계산 결과를 의도적으로 변수에 할당하지 않거나(POSIX 방식) 추가된 문을 사용하여 출력을 얻을 수 있습니다.
또한 스테이트먼트는 실행 중인 계산에 숫자를 대화식으로 입력할 수 있도록 한다.
C스타일의 코멘트에 가세해, 문자 뒤에 있는 모든 것은, 다음의 새로운 행이 무시될 때까지 발생합니다.
마지막 계산 값은 항상 추가 삽입 변수 내에 저장됩니다.
추가 연산자
다음 논리연산자는 POSIX bc 논리연산자에 추가됩니다.
&!
조건문(문장 내 등)에서 사용할 수 있습니다.단, 여전히 동등한 비트 단위 또는 할당 작업이 없습니다.
기능들
GNU bc에서 사용 가능한 모든 함수는 POSIX에서 상속됩니다.GNU 디스트리뷰션에서는 더 이상의 함수는 표준으로 제공되지 않습니다.
코드 예시
기원전부터^
연산자는 오른쪽에 정수 거듭제곱만 허용합니다. bc 사용자가 쓸 수 있는 첫 번째 함수 중 하나는 부동소수점 지수를 갖는 거듭제곱 함수입니다.다음 두 가지 모두 표준 라이브러리가 포함되어 있다고 가정합니다.
POSIX bc의 "전원" 함수
/* x */ define i(x) { auto s = scale = 0 x /= 1 round x down */scale = s return (x) } /* x^y == e^(y*log(x) */define p(x,y) {y(x) returning ^y(y(x) {y}의 정수 부분을 반환하는 경우 x^y}의 사실을 사용합니다.
10000자리까지의 to 계산
내장된 아크탄젠트 함수를 사용하여 파이를 계산합니다.a():
$ bc - lq scale = 설명 4*a(1) # 1의 아탄은 45도, 라디안에서는 pi/4입니다. # 계산에는 몇 분 정도 걸릴 수 있습니다.
변환된 C 함수
bc의 구문은 C의 구문과 비슷하기 때문에 C로 작성된 수치 함수는 종종 bc로 쉽게 번역될 수 있으며, 이는 즉시 bc의 임의의 정밀도를 제공한다.예를 들어 Statistical Software 저널(2004년 7월, Volume 11, Issue 5)에서 George Marsaglia는 누적 정규 분포에 대한 다음 C 코드를 공개했습니다.
이중으로 하다 파이(이중으로 하다 x) { 긴 이중으로 하다 s=x,t=0,b=x,q=x*x,i=1; 하는 동안에(s!=t) s=(t=s)+(b*=q/(i+=2)); 돌아가다 .5+s*exp(-.5*q-.91893853320467274178l); }
bc의 다른 구문을 수용하기 위해 필요한 몇 가지 변경을 가하여 상수 "0.9189..."가 실제로 log(2*PI)/2임을 인식하면 다음 GNU bc 코드로 변환할 수 있습니다.
정의 phi(x) { auto s,t,b,q,i,const s=x;t=x;q=x;i=1인 동안(s!=t) s=(t=s)+(b*=q/(i+=2) const=0.5*l(8*a) #.91893....5+s*e440.5*q-const)를 반환합니다.}
셸 스크립트에서 bc 사용
bc는 파이프를 통한 입력과 함께 비진행적으로 사용할 수 있습니다.이는 셸 스크립트 내에서 유용합니다.예를 들어 다음과 같습니다.
$ result=$("scale=2; 5 * 7 / 3; bc") $ 에코 $result 11.66
반면 bash 셸은 정수 연산만 수행합니다.예를 들어 다음과 같습니다.
$결과=$((5 * 7 /3)) $메아리치다 $결과 11
여기 문자열의 idi(bash, ksh, csh)도 사용할 수 있습니다.
bc - l << "5*7/3" 11.6666666666666666666666666666
「 」를 참조해 주세요.
레퍼런스
- ^ a b 싱글 UNIX 사양, The Open Group 버전 4 : 임의 정밀도 연산 언어– 셸 및 유틸리티 참조,
- 싱글 UNIX 사양, The Open Group 버전 4 : 임의 정밀도 연산 언어– 셸 및 유틸리티 참조,
- GNU bc 매뉴얼 페이지
- POSIX bc 매뉴얼페이지
- Plan 9 프로그래머 매뉴얼, 1권 –
- 7th Edition Unix bc 매뉴얼 페이지
- C-bc의 설계 및 구현에 관한 컴파일러 기사
- 6th Edition Unix bc 소스 코드, 1975년 5월부터 bc의 첫 번째 릴리스, bc 구문을 dc 구문으로 컴파일
- GNU bc 소스 코드
외부 링크

- 디트머, I. 1993다중 정밀도 산술에 대한 Unix 명령 dc 및 bc 오류입니다.SIGNUM Newsl. 28, 2(1993년 4월), 8~11일.
- 유용한 GNU bc 함수 모음
- Free Software Foundation의 GNU bc(및 Alpha 버전)
- GnuWin32의 Windows용 bc
- Gavin Howard bc - Gavin Howard가 GNU 및 BSD 확장을 사용하여 bc를 오픈 소스 구현
- X-bc - bc에 대한 그래피컬 사용자 인터페이스
- extensions.bc - 삼각 함수, 지수 함수, 수 이론 함수 및 일부 수학 상수 함수가 포함됩니다.
- scientific_disc.bc - 입자 질량, 진공 중의 빛의 속도 및 중력 상수 등의 기본 상수를 포함합니다.