세미콜론이 다른 기호 대신 줄 종결 자로 선택된 이유가 있습니까?
저는이 결정의 역사를 알고 싶습니다. 그리고 그 대답이 미래의 결정에 영향을 줄 수있는 통찰력으로 이어지기를 바랍니다.
세미콜론이 다른 기호 대신 줄 종결 자로 선택된 이유가 있습니까?
저는이 결정의 역사를 알고 싶습니다. 그리고 그 대답이 미래의 결정에 영향을 줄 수있는 통찰력으로 이어지기를 바랍니다.
답변:
영어에서 세미콜론은 문장 목록에서 항목을 구분하는 데 사용됩니다 (예 :
그녀는 세 남자를 보았다 : Jamie, 뉴질랜드 출신. 우유 배달원의 아들 존; 그리고 건전한 남자 조지.
프로그래밍 할 때 많은 문장을 분리하고 완전 정지를 사용하면 소수점을 쉽게 혼동 할 수 있습니다. 세미콜론을 사용하면 일반적인 영어 문장 부호에 가깝게 유지하면서 개별 프로그램 문장을 분리하는 방법을 쉽게 파싱 할 수 있습니다.
추가 편집
메모리가 비싸고 처리 속도가 느리고 첫 번째 프로그래밍 언어가 고안된 초기에는 처리를 위해 프로그램을 별도의 명령문으로 분할해야했습니다. 일부 언어에서는 캐리지 리턴이 명령문 분리 문자로 작동 할 수 있도록 각 명령문을 줄에 배치해야했습니다. 다른 언어는 텍스트 레이아웃에 더 자유로운 형식을 허용하므로 특정 구분 문자가 필요했습니다. 이 문자는 세미콜론으로 선택되었습니다. 영어에서 사용하는 것과 유사하기 때문에 (이것은 가정이 아니어야합니다. 당시에는 없었습니다.) 다른 구두점과 충돌하지 않았기 때문입니다. 수학 또는 기타 구문 목적으로 필요한 마크 및 기호.
다시 편집
일부 종료 문자가 필요하면 언어 텍스트 구문 분석 요구 사항으로 돌아갑니다. 초기 컴파일러는 어셈블리 언어로 작성되거나 경우에 따라 직접 제작 된 이진 기계 명령어로 작성되었습니다. 명령문의 끝을 식별하고 처리중인 텍스트 청크를 구분하는 특수 문자를 사용하면 처리가 훨씬 쉬워집니다. 위에서 말했듯이 다른 언어는 캐리지 리턴 또는 괄호를 사용했습니다. Algol, Pascal, Ada, BCPL, B, C, PL / M 및 기타 언어 군은 세미콜론을 사용합니다. 이 특정 인물을 처음 사용한 사람에 관해서는, 나는 역사상 기억하기에 충분하지 않습니다. 선택과 채택은 다음과 같이 완벽합니다.
마지막으로, 나는 이런 식으로 사용 된 첫 번째 언어를 설계 할 때 세미콜론을 사용하여 진술을 끝내기로 결정하는 데 소비 한 것보다 이러한 답변과 의견에 더 많은 시간을 소비했다고 생각합니다.
많은 언어들이 C 이후에 모델링 된 구문을 사용합니다 ( B 이후에 모델링되었습니다 -thanks @Crollster). 주석에서 볼 수 있듯이, 그러한 언어의 긴 사슬이 있습니다 ... B는 PL / I에서 영감을 얻었으며 ALGOL ;
은 분리 기호로 사용했습니다 .
C에서는 명령문 종결자가이므로 ;
이러한 언어가 적합합니다.
가능성이 있기 때문에 영어의 사용의 -이 C에서 문 종료로 선정 된 이유에 대해서는 "상호 의존적 문을 나타 내기 위해" .
C는 또한 문자 집합에 사용 가능한 메모리의 양이 제한되어있는 PDP-11에서 발명되었으므로 언어의 발명가는 이러한 제약 내에서 작동해야했습니다.
FORTRAN은 캐리지 리턴을 사용하여 명령문을 설명했습니다. COBOL 사용 기간. LISP는 모든 것을 괄호에 의존하여 아무것도 사용하지 않았습니다. ALGOL은 세미콜론을 사용하여 명령문을 구분하는 첫 번째 언어입니다. PASCAL은 세미콜론을 사용하여 명령문을 구분하여 ALGOL의 리드를 따랐습니다.
PL / I는 세미콜론을 사용하여 명령문을 종료했습니다. 차이가 있으며 PASCAL에서 쉽게 볼 수 있습니다. Ada는 ALGOL이 아닌 PL / I의 한 가지 항목을 이끌었습니다.
컴퓨터 과학 커뮤니티는 명령문 구분 기호 또는 종결 자로 사용되는 세미콜론을 유용한 표기법으로 빠르게 받아들였으며, 내가 아는 한 이후의 모든 블록 구조 언어는 ALGOL의 리드를 따르고 세미콜론을 사용하여 명령문을 분리하거나 종료했습니다.
BCPL은 수년 전에 세미콜론 과 캐리지 리턴을 명령문 구분 기호 / 종료 자로 사용한다고 들었지만 언어를 직접 사용한 적이 없으며이를 확인할 수 없습니다. 어느 시점에서 BCPL 자손으로부터 분리 또는 종료 명령문에 캐리지 리턴을 사용하지 않았습니다. BCPL은 B, B는 C, C는 C ++, Java, D, PASCAL 및 Ada보다 훨씬 덜 고려 된 것들을 낳았습니다.
왜 다른 상징이 아닌가?
일부 언어는 다른 기호를 사용했습니다. 예를 들어, 이전 버전의 BASIC은 대신 콜론을 사용했습니다.
그러나 몇 가지 예외를 무시하면 두 가지 주된 이유가 있다고 생각합니다. 첫 번째는 단순히 모호하지 않은 것을 찾고 있다는 것입니다. 일반적인 구문 분석기에서 현재 명령문 구문 분석을 계속할 수없는 심각한 오류가 발생하는 경우 일반적으로 명령문 종결 자로 건너 뛰고 구문 분석기를 다시 시작하여 구문 분석기를 다시 동기화하려고합니다. 다음 진술의 시작. 이를 위해 코드의 다른 곳에서는 일반적으로 발생하지 않는 것을 원하고 세미콜론은 다른 의미가 거의없는 기호이므로 이러한 목적에 맞게 쉽게 사용할 수 있습니다.
두 번째 이유는 다소 비슷하지만 사람들이 코드를 읽고 사용하는 것을 목표로합니다. 다시 말하지만, 실제로 사용하는 기호는 중요하지 않습니다. 가능한 경우 독자가 특정 목적을 위해 익숙한 기호를 사용하여 얻을 수있는 가독성에는 상당한 이점이 있습니다. 그렇다고 C가 하나의 완벽한 구문이고 다른 모든 것들이 노예로 따라야한다는 것을 의미하지는 않지만, 유사하게 유사한 언어가 다음과 같이함으로써 모호하게 유사한 언어가 많이 얻음 (그리고 거의 잃지 않음)을 알고 있습니다. 가능한 동일한 구문입니다.
이것은 거의 다른 프로그램을 디자인하는 것과 매우 흡사합니다. 일종의 창을 사용하는 프로그램을 작성하면 대상 플랫폼의 기본 기능을 사용하려고합니다. 구현하는 많은 결정은 대부분 임의적이며 기능의 큰 손실없이 다르게 수행 될 수 있습니다. 그러나 기능의 실질적인 이득 없이 결정을 변경하면 유용한 작업을 수행하지 않고도 사용자를 혼란스럽게합니다. "언어에서 문장을 종료 (또는 분리)해야하는 것은 무엇입니까?"에도 동일한 기본 원칙이 적용됩니다. "스크롤 막대의 모양"또는 "트리 컨트롤의 작동 방식" 이 모든 경우에있어서, 결정은 대부분 임의적이며, 균일 성은 그 자체로 실질적인 이점을 제공한다.
필자는 프로그래밍하기 전에 대부분의 사람들이 익숙해 져서 거의 모든 사람들이 그것에 대해 생각하는 방식으로 많은 언어에서 똑같은 일이 발생한다고 덧붙였다. 왜 모두가 "+"를 사용하여 더하기를 나타내거나 "-"를 사용하여 빼기를 나타 냅니까? 심볼의 모양은 중요하지 않지만 각 심볼에 동일한 의미를 적용하는 데 동의하는 모든 사람은 매우 중요합니다.
세미콜론은 원래 Algol 60 에서 종결자가 아닌 명령문 분리 자로 제안되었습니다 .
Algol 60 이전에는 유일하게 존재하는 고급 프로그래밍 언어 인 Fortran은 각 문장이 별도의 줄에 있어야했습니다. do-loops와 같이 여러 줄에 걸친 문장은 이상한 것으로 간주되어 'statement blocks'로 간주되었습니다.
Algol 60의 설계자들은 진술이 계층 구조 (if-then-else, do-loops, case statement 등)를 필요로하며 서로 중첩 될 수 있음을 깨달았습니다. 따라서 각 진술이 별도의 줄에 있다는 생각은 더 이상 의미가 없었습니다. 형태 S1의 진술의 순차적 인 구성; S2; ...; 선택적으로 시작 - 말 괄호로 묶인 Sn을 복합 문장 이라고 하며 Algol 60에 의해 구상 된 문장의 계층 적 구조에 맞습니다. 따라서 세미콜론은 분명히 종결자가 아닌 문장 구분 기호 입니다.
이것은 실제로 문제를 일으켰다. Algol 60은 또한 아무 것도 쓰지 않는 "빈 문장"을 가지고있었습니다. 따라서 세미콜론이 마치 S1을 종료하는 것처럼 나타나는 곳에 " begin S1; end "를 쓸 수 있습니다. 그러나 Algol 60 컴파일러는 이것을 S1과 그 뒤에 나오는 보이지 않는 빈 명령문 사이의 분리 자로 취급했습니다. 이 미묘한 부분은 실제 프로그래머에게는 약간이었습니다. Assembly와 Fortran과 같은 행 지향 언어에 익숙해 졌으므로 세미콜론은 문장의 종결 자로 생각했습니다. 프로그램이 작성 될 때 일반적으로 세미콜론은 다음과 같이 명령문 끝에 넣습니다.
a [i] : = 0; 나는 : = i + 1
세미콜론은 실제로 첫 번째 문장의 종결 자처럼 보였습니다. 프로그래머가 세미콜론을 종결 자로 처리하면 다음과 같은 구문으로 구문 오류가 발생합니다.
i> 0이면 a [i] : = 0; 그밖에 a [i] : = 1;
세미콜론이 "if"를 종료하고 "else"가 매달려 있기 때문입니다. 프로그래머들은 완전히 혼란 스러웠다.
따라서 라인 지향 Fortran의 후속 제품인 PL / I는 세미콜론을 구분 기호 가 아닌 명령문 종결 자로 설정하기로 결정했습니다 . 프로그래머는 그 선택에 만족했습니다. 대부분의 프로그래밍 언어가 뒤 따랐다. (파스칼은 이러한 추세에 저항했지만 후계자 인 아다는 포기했다.)
[참고 사항 추가 : 프로그래밍 언어 비교에 관한 Wikipedia 기사 에는 다양한 프로그래밍 언어에서 세미콜론을 처리하는 방법을 요약 한 훌륭한 표가 있습니다.]
이것은 순수한 추측 작업이지만 ASCII 값으로 제한된 표준 QWERTY 키보드를 보면 종료 / 분리의 자연 문자는.!?, :; 운송비가 반환됩니다. 그 중!? :은 여러 키를 가져 오기 위해 즉시 실격 처리되어야하며 명령문 종료는 매우 일반적인 것입니다. 마침표는 소수점과 쉽게 혼동되어 초기 컴퓨터의 공간이 제한되어 있으면 터미네이터로 불필요하게 복잡해지기 때문에 실격 처리됩니다. 코드 줄이 화면의 한 줄에 표시 될 수있는 것보다 길면 캐리지 리턴이 실격되므로 줄을 가로로 스크롤해야 할 경우 프로그램을 읽기가 더 어려워집니다. 또는 다음 줄에 연속을 작성하기 위해 추가 문자가 필요하므로 다시 복잡성이 추가됩니다. 이 나뭇잎, 그리고; 옵션의 옵션은 다음에 비해 글쓰기에서 훨씬 더 자주 사용됩니다. 따라서 세미콜론은 입력하기 쉽고, 의미가 제한적인 캐릭터에 의미를 추가하기 때문에 혼동이 적고, 특수한 경우가 실제로 사용되지 않기 때문에 복잡하지 않기 때문에 선택됩니다.
세미콜론은 게으름과 단순성에 기반한 최고의 캐릭터이기 때문에 선택되었습니다.
대체로 임의의 선택입니다. 일부 언어는 다른 선택을했습니다. COBOL은 .
문자 가 포함 된 명령문을 종료합니다 . FORTRAN, BASIC 및 Python은 일반적으로 줄 바꾸기 (여러 줄 문의 특수 구문 사용)로 명령문을 종료합니다. 그리고 Lisp는 문장을 괄호로 묶습니다.
주 ;
구분 기호 / 종료 자로 인기가 높은 주된 이유 는 오늘날 인기있는 대부분의 언어가 ALGOL을 기반으로 하기 때문에 해당 규칙을 사용했기 때문입니다.
다른 상징 대신에?
다른 상징을 선택할 수 있습니까?
ASCII 문자 # $ @ [] ^ _`{|} ~가 ISO 646 과 같은 초기 문자 인코딩에 항상있는 것은 아닙니다 .
문자 ()*+-/<=>
는 일반적으로 수학 연산자로 사용되며 명령문 종결 자로 사용되는 경우 구문 분석 모호성을 생성합니다.
product = a * b * // If '*' were a statement terminator,
c * d * // Are there two factors, or four?
비슷한 문제가 '
and에 적용 "
되며 일반적으로 문자열 구분 기호로 사용됩니다. ,
, 함수 인수를 구분하는 데 주로 사용되며 .
,는 일반적으로 소수점 (또는와 같은 구문에서 구분 기호)으로 사용됩니다 some_struct.some_field
.
그 나뭇잎 !%&:;?
.
선택 !
하거나 ?
기술적 인 어려움을 유발하지는 않지만 영어의 의미는 프로그램에 잘못된 분위기를 줄 것입니다.
print(x)? # Yes, you should.
# It's an IMPERATIVE language; stop questioning my commands.
print(x)! # OK! You don't have to shout!
가 &
있기 때문에, 성명 분리 (안 종료)와 같은 더 현명한 선택이 될 것입니다
do_thing_a() &
do_thing_b()
점 A를 할 수있는 명령으로 읽을 수 및 다음과 것은 B. 그러나 대부분의 언어를 할 &
연산자는 논리 또는 비트 단위로 사용 AND 대신.
%
기호 같은 문장에서 혼란이 발생할 수 있습니다 interest_rate = 2.99%
(에 변수를 설정합니다 2.99
대신 예상의를 0.0299
). 물론, 잘 알려진 수학적 의미는 %
C를 나머지 연산자로 사용하는 것을 막지 못했습니다.
그래서 그 나뭇잎 :
과 ;
.
:
는 현명한 선택이며, 실제로 대부분의 BASIC 방언에서 인라인 문장 구분 기호로 사용됩니다.
그러나 ;
영어 문법이 있습니다. 문장 내에서 절을 분리하는 데 사용할 수 있습니다.
헤드 라인 질문에 대답하기보다는 암시적인 질문에 초점을 두는 것이 좋습니다.
저는이 결정의 역사를 알고 싶습니다. 그리고 그 대답이 프로그래밍 언어의 설계와 구현에서 미래의 결정에 영향을 줄 수있는 통찰력으로 이어지기를 바랍니다.
프로그래밍 언어 설계 및 구현 히스토리에 대해 배우고 프로세스에 대한 통찰력을 얻으려면 프로그래밍 언어 컨퍼런스 히스토리의 진행이 시작하기에 좋은 장소입니다. (프로세스에 액세스하려면 ACM 멤버십이 필요하다고 생각합니다.)
많은 프로그래밍 언어의 문장이 세미콜론으로 끝나는 이유는 무엇입니까? 세미콜론이 다른 기호 대신 줄 종결 자로 선택된 이유가 있습니까?
HOPL 절차를 읽음으로써 대답하고자하는 예시 질문으로 헤드 라인 질문을하면서, 나는 다음과 같은 점을 제안하고자합니다. 어떻게 든 고장 / 결함. 그들의 새로운 언어는 한편으로이 결함을 고치기 위해 고안되었습니다. 반면에 언어 디자이너는 자신이 좋아하는 다른 언어의 디자인 요소를 복사하거나 문제가없는 요소는 변경하지 않습니다.
특히 마지막 부분은 중요합니다. 세미콜론을 터미네이터로 사용한 최초의 프로그래밍 언어를 찾고 다른 많은 프로그래밍 언어가 왜 그것을 복사 했는지 알아 보는 대신 복사 하지 않은 언어를 살펴보면 더 많은 것을 배우게 될 것입니다 그것. 스몰 토크는 시뮬에서 많은 영감을했다 예를 들어, 그것은 짓 하지구문과 특히 세미콜론을 명령문 종결 자로 사용하는 문구를 복사하십시오. 터미네이터 (실제로 분리 자)를 완전히 멈추고 세미콜론을 사용합니다. 반대로, 세미콜론을 명령문 종결 자로 사용한 첫 번째 언어는이를 이전 언어에서 사용 된 언어와 다르게 변경했을 수 있습니다. 명령문 종료 기의 전체 개념을 도입 한 것이 첫 번째 언어 였거나 다른 언어와는 독립적으로 수행 된 것이었고 현재는 시간이 지남에 따라 세미콜론이 사용되었을 수도 있습니다. (다른 응답자는 세미콜론이 좋은 선택 인 이유에 대한 개조 된 가정을 제안하기보다는 세미콜론을 도입 한 사람의 인용문을 발굴 할 수 없었기 때문에 후자가 여기에 해당한다고 생각합니다.) 포인트, 언어 디자이너가 왜 복사 / 보관했는지가 아니라 왜 언어가 바뀌 었는지 살펴보면 더 많은 내용을 배우게 될 것입니다. 사람들이 물건을 바꿀 때 그들은 일반적으로 변화를 원하거나 설명해야하지만“왜 우리가 바꾸어야합니까? 그게 끝났어!”
가시성에 관한 것입니다.
초기 문장 구분 기호는 '.'입니다. COBOL 및 줄 바꾸기에서와 같이 캐리지 리턴은 FORTRAN입니다.
CR은 여러 줄에 걸쳐 문장을 전달하기가 어렵다는 점에서 한계를 입증했습니다.
완전히 멈 추면 더 흥미로운 문제가 발생했습니다. 영어 텍스트를 읽을 때 뇌가 잠재 정지 수준에서 전체 정지 점을 처리하면 문장이 끝났음을 인식하고 숨을 쉬기 위해 일시 정지 할 수 있지만 실제로는 눈치 채지 못합니다. 그것은 그것을 신호했다. 또한 많은 글꼴에서 '.' 는 단일 픽셀로 렌더링되는 가장 작은 문자입니다. 누락되거나 추가 기간은 COBOL 프로그램에서 가장 일반적인 오류의 원인이되었습니다.
ALGOL은 초기 실수로부터 배우는 것이 특정 종결자를 선택하여 문장이 여러 줄로 흐를 수있게하고 인간 독자가 쉽게 알아볼 수있는 것을 선택했습니다. 세미콜론은 무의식적으로 처리되지 않는 일반적인 영어로 충분히 크고 비정상적입니다.
캐리지 리턴 / 개행 이외의 명시적인 명령문 종결자가 필요했기 때문에 선택한 것으로 이해했습니다. 80 줄짜리 화면 시절에 실제로 여러 줄에 걸쳐 한 줄의 코드 줄이 있으면 문 종결 자에 \ r 또는 \ n을 사용할 수 없을 정도로 일반적이었습니다.
세미콜론은 논리 / 수학 설명에 사용되지 않기 때문에 편리했습니다. 따라서, 그들은 진술의 실제 내용과 어느 정도 충돌하지 않습니다.
개인적으로, 80 자 이하로 줄을 유지하기 위해 스타일 요구 사항과 함께 세미콜론을 계속 사용하는 것은 솔직하고 어리석은 생각입니다. 파이썬과 같은 언어는 이해하기 쉽고, 간결한 코드없이 더 쉽게 작성할 수 있음을 광범위하게 보여주었습니다. 또한 80 자보다 긴 행에 문제가있는 경우 더 큰 모니터가 필요합니다.
나는 틀릴 수도 있지만, 이것은 많은 어셈블러에서 세미콜론이 주석을 시작하는 데 사용되었다는 사실과 관련이 있다고 생각합니다. a 다음의 모든 것은 ;
주석이었고 더 이상 명령 자체의 일부가 아닙니다.
그런 다음 통역사에 명령어를 입력 할 때 명령어를 종료해야합니다. 간단한 지시 사항 (예 : 수학 표현식)은 Enter 키를 누르기 만하면 종료 될 수 있으며, 인터프리터에게 표현식을 계산할 준비가되어 결과를 생성했음을 알려줍니다. 그러나 때로는 명령에 여러 줄의 코드를 입력하고 싶었으므로 Enter 키에만 의존하는 대신 특수 문자를 명령의 종결 자로 사용하는 것이 었습니다. 이런 식으로, 사용자는 아직 코드를 인터프리터로 보내지 않았기 때문에 한 번에 더 많은 코드 줄을 입력 할 수 있습니다. 인터프리터는 Enter로 입력 한 행에서 종료 문자를 찾은 경우에만이를 실행하고 결과를 계산합니다.
이제이 두 가지를 함께 결합하면 세미콜론은 종료 문자에 대한 명백한 선택 인 것처럼 보입니다. 명령 부분이 끝나고 주석 부분이 시작되는 위치를 알려주므로 인터프리터가 줄에 닿으면 플러시 될 수 있음을 알 수 있습니다 명령이 방금 끝났기 때문에 지금까지 버퍼링 한 표현식의 모든 줄을 실행하십시오. 이제 주석에 있습니다 (최소한이 줄 끝까지, 다음 줄은 코드에서 시작하기 때문에) 새로운 표현 / 지시를 시작하십시오).
물론 이것은 이것을 세미콜론이라고 가정하고 그것을 지시 종결 자로 재사용한다는이 아이디어를 생각 해낸 사람의 의견에 사용되었습니다. 다른 문자 였으므로 다른 명령어 종결 자로 끝났을 수도 있습니다.
Inb4 : 아니요, 이것은 역사적인 계정이 아닙니다. 이것이 세미콜론이 실제로 생겨난 방법이라는 증거는 없습니다. 그것이 아마 일어날 수 있다고 상상하는 방법입니다.
대부분의 언어는 이미 세미콜론을 사용했는데, 그 목적으로 이미 광범위하게 사용되었고 변경이 불가능했기 때문입니다.
그리고 첫 번째 언어를 선택하면 그 대안이 무엇인지 고려해야합니다. 언어를 디자인 할 때 필요한 문자를 사용할 수 있기를 원하며, 현재 문자 세트는 6 비트로 코딩되었으며, 일부 패턴은 예약되어 있고, 일부 문자는 제대로 정의되지 않은 경우가 많습니다. ISO-646의 국가 변종 - 미국의 변형은 물론 이름 ASCII에서 알고있다 - "일반적인"등의 문자 코드를 재사용 [
, #
또는 $
, 단지 절반 많은 코드 위치가 어디 상황에서 효과를 볼 사용 가능한 문자 및 숫자를 반 이상 보유).
같은 직관적으로 문 구분 기호로 사용 될 수있는 다른 문자가 아마 없었다은 ( .
(그리고 렉싱을 도입하거나 구문 분석 및 렉싱 이론이 정교 아직 때 한 번에 어려움을 구문 분석하지 않고 이미 아마 그 기준에 대한 심각한 경쟁자) .
지금 실수로 사용하기 때문에 의문의 여지가 없습니다).