선택적 세미콜론


10

대부분의 경우 범용 명령형 언어에서 문장 구분 기호로 세미콜론이 필요하거나 완전히 허용되지 않습니다 (예 : C 및 Python).

그러나 JavaScript와 같은 일부 언어에서는 다른 구분 기호 (예 : 줄 바꿈)를 위해 세미콜론으로 명령문을 구분하지 않을 수 있습니다.

이 뒤에 디자인 결정은 무엇입니까? 나는 같은 줄에 여러 문장을 쓸 때 세미콜론이 필수적이라는 것을 이해하지만 그것들을 필수로 만드는 또 다른 이유가 있습니까 (C를 제외하고)?


1
명령문 종결 자 (perl, c) 및 명령문 분리 문자 (javascript, pascal)를 고려해야합니다.

5
파이썬에서는 세미콜론을 사용하여 같은 줄에서 여러 문장을 분리 할 수 ​​있습니다. "빈"문이 허용되므로 대부분의 문 끝에 세미콜론을 사용할 수 있습니다.
Greg Hewgill

1
I understand that semicolons are essential when writing multiple statements on the same line-언어에 따라 다릅니다. 내가 선호하는 것은 그러한 구분 기호가 전혀 없으며 모든 함수 인수가 모두 사용되면 다음 문장이 시작됩니다.
Izkata

1
@MichaelT : 당신의 분류가 맞지 않다고 생각합니다 : Perl은 분명히 두 그룹 모두에 속하며 JavaScript는 실제로 "statement terminators"캠프에 있습니다 (구현은 }파일 앞 이나 끝에 세미콜론을 유추해야하기 때문에 ).
ruakh

예, 언어에 따라 다릅니다. 내 개인적인 추측은 세미콜론은 대부분의 언어 디자이너가 따르는 일종의 일반적으로 동의되는 규칙 일뿐입니다. 적어도 좀 더 자연스러운 언어 관점에서 말이됩니다. 그런데 블록에 대해서는 {및}와 동일하지만 많은 언어에서 사용되지만 전부는 아니므로 실제로는 그렇게 할 필요가 없습니다. 이것 뒤에 보편적 인 이유는 없습니다.
JensG

답변:


24

필수 (또는 완전히 허용하지 않음)로 설정하면 코너 사례 수가 줄어들고 잠재적으로 모호한 버그가 발생하지 않으며 컴파일러 / 통역사 설계가 간소화됩니다.

그것들을 선택적으로 선택하기로 선택한 언어 설계자들은 더 큰 구문 유연성에 대한 대가로 모호성과 함께 살기로 선택했습니다.


7
@RobertHarvey Heretic! 그것을하는 하나의 명백한 방법이 있어야하며 하나만 있어야합니다. 덧붙여서, 펄에서 그것을 할 수있는 유일한 방법이 있습니다.

1
BTW-일부 언어는 일반적으로 문법에 상당한 양의 중복성이 있으므로 세미콜론을 선택적으로 만드는 것은 실제로는 모호합니다. 즉, 세미콜론은 중복을 제거하는 데 약간의 중복성이 있다고 생각합니다. 대신 인수에 대해 괄호와 쉼표를 삭제하는 Haskell이 좋습니다. 자, 세미콜론을 Haskell에서도 삭제할 수 있지만 실제로는 Javascript와 동일하지 않습니다.
Steve314

2
IIRC의 문제는 공식 모델에는 적합하지 않지만 파서 생성기는 좋은 오류 메시지를 생성하지 않는다는 것입니다. 즉, 손으로 쓴 파서는 훨씬 유용한 오류 메시지를 얻을 수 있지만 일반적인 실수에 대한 지식은 제한적입니다. 예를 들어 Gcc는 C 문법에 들소를 사용하는 데 사용됩니다. 마찬가지로 문제는 '에지 케이스'가 공식적인 엣지 케이스가 아니라 부드러운 것입니다. 즉 파서를 위해 AST는 명확하고 인간에게는 AST는 '투명'하지만 AST가 어떤 것인지에 동의하지 않습니다.
Maciej Piechotka

2
@Maciej Piechotka-하스켈에서 파렌이 옵션이라는 것을 의미하지는 않았습니다. 언어 디자인 결정으로 불필요한 것을 버리는 것에 대해 이야기하고 있습니다. 요점은 Haskell에서 함수 호출에 괄호 나 쉼표를 사용하지 않는다는 것입니다. 당신은 할 수 있습니다 인수로 튜플을 통과,하지만하지 인수를 전달하는, 튜플 여전히 구문입니다. Haskell (및 ML 및 기타)은 다른 언어 (Algol 이후로) 에서이 공통 규칙이 있다는 의미에서 함수 인수에 대한 괄호와 쉼표를 "삭제"했지만 Haskell은 그렇게하지 않습니다.
Steve314

1
@Maciej Piechotka-물론 어쨌든 보편적 인 관습은 아니 었습니다. Algol-family 언어가 다른 언어가 그와 관련하여 자신을 정의한다는 것을 의미하지는 않습니다. 요즘 C 계열 언어는 조금 느낍니다.
Steve314

15

JavaScript는 이것이 매우 나쁜 아이디어라는 것을 보여주었습니다. 예를 들면 다음과 같습니다.

return
0;

C에서는 0의 값을 반환합니다. JavaScript에서는 undefined세미콜론이 return 문 뒤에 삽입되기 때문에 반환됩니다. 자동 세미콜론 삽입에 대한 세부 정보를 알지 못하면 코드가 왜 깨지는 지 즉시 알 수 없습니다.


1
@delnan : Python은 C처럼 보이도록 설계되지 않았습니다. 들여 쓰기 기반이므로 행 지향성이 뛰어나며 세미콜론이 필요하지 않습니다. 자바 스크립트는 기술적 수행 을 필요로; 하나의 누락 된 것을 발견하면 하나를 삽입하여 구문 적으로 유효한 하나의 문장처럼 보이는 것을 완전히 다른 의미론을 가진 두 개의 별개의 문장으로 변환합니다.
메이슨 휠러

7
나쁜 생각은 아니지만 자동 세미콜론 삽입에 대해 배우지 않고 JavaScript를 사용하려는 사람들에게는 혼란 스럽습니다 . 아마도 "이것은 매우 나쁜 생각입니다"라고 말하는 대신 "세미콜론을 선택적으로 만드는 것은 나가지 않고 모든 세부 사항을 배우지 않는 프로그래머에게 함정을 소개합니다"라고 더 정확하게 말할 수 있습니다.
TehShrike

4
@delnan : 놀라운 이유는 JavaScript는 일반적으로 유효하지 않은 프로그램을 수정 하지 않는 한 줄 끝에 세미콜론을 삽입 하지 않기 때문 입니다. After return는 프로그램이 없으면 프로그램이 유효하더라도 JavaScript가 세미콜론을 삽입하는 소수의 경우 중 하나입니다. (물론 이것은 메이슨 휠러의 요점을 약화시킨다. 문제는 세미콜론이 선택적인 것이 아니라 규칙이 일치하지 않는다는 것이다.)
ruakh

6
@TehShrike : 세미콜론을 선택적으로 만들면 모든 프로그래머 에게 함정이 생겨납니다. 왜냐하면 어떤 의미인지 묻지 않고 오타 를 임의로 해석하기 때문 입니다. 모두가 오타를하고 있습니다.
Jan Hudec

1
자바 스크립트는 선택적 세미콜론의 구현에 결함이 있음을 보여주었습니다. 선택적 세미콜론은 그 자체로 나쁘다는 것을 보여주지 않습니다.
코드 InChaos

4

문법과 파서를 약간 단순화하여 세미콜론을 필수로 만듭니다. 본질적으로, 그것은 렉서가 개행을 포함하여 모든 공백을 덤프 할 수있게하며 파서는 전혀 신경 쓸 필요가 없습니다.

다른 한편으로, 어쨌든 파서에 공백에 대해 알리고 싶다면 세미콜론을 선택적으로 만드는 것이 어렵지 않습니다. 당신은 종종 그것들을 whitespace토큰과 함께 묶을 수 있고 파서는 그것을 잘 처리 할 수 ​​있습니다.

예를 들어, 세미콜론을 다음 일련의 C 문에 삽입하십시오.

functionCall(3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

더 이상 할 수없는 이상한 일이 있지만 while(1);, 대부분의 경우 현대적인 구문 분석 기술을 사용하면 문장이 특정 구분 기호없이 끝나는 위치를 쉽게 결정할 수 있습니다. 여전히 이상한 것을 허용하고 싶더라도 newline_or_semicolon터미널 이 아닌 것을 만드는 것은 어렵지 않습니다 .


C가 1970 년대 초에 개발되었을 때, 컴파일러를 단순화하기 위해 명령문 종결자가 필요했습니다. 90 년대 중반, 자바 스크립트가 개발되었을 때, 그다지 걱정하지 않았습니다.
Sean McSomething

3

세미콜론은 두 가지 이유로 문법에 유용합니다. 첫째, 긴 연속 문자를 사용하지 않고도 긴 문장을 여러 줄로 나눌 수 있습니다 (Fortran 및 Basic에 대해 이야기하고 있습니다). 둘째, 구문 분석기가 오타로 인해 구문이 실제로 복잡해지면 구문 분석을 "제공"할 수있는 방법을 보자. 칼 빌레펠트의 예를 들어서

functionCall(3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

여분의 열린 par을 입력했다고 상상해보십시오.

functionCall((3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

이제 실수는 어디입니까? 세미콜론이 있으면 파서가 첫 번째 세미콜론에서 포기하는 것이 더 쉽습니다. 원하는 경우 세미콜론 이후에도 구문 분석을 계속할 수 있습니다.

functionCall((3, 4);  <- something is wrong here. emit error and keep going.
                      9 + (3 / 8); variable++; while(1) { printf("Hello, world\n"); }

이제 구문 분석기에서 오류를보고하는 것이 더 쉽고 오류가 발생한 행 / 열을 쉽게 찾을 수 있습니다.


1
포트란과 베이직은 적어도 적당히 선 연속 마커 (각각 &와 _)를 선택했습니다. "OMG, 그들이 생각한 것"에 대해서는 FoxPro를 능가하는 것이 없습니다. 줄을 계속하기 위해 세미콜론을 사용했습니다.
DougM

2

세미콜론은 항상 당신이 당신의 질문에 언급 한 것처럼 전부가 아닙니다. 예를 들어 Lua 의 문법은 자유 형식 (줄 바꿈을 포함한 모든 공백은 무시할 수 있음)으로 설계되었지만 세미콜론을 사용할 필요가 없습니다. 예를 들어 다음 프로그램은 동일합니다.

--One statement per line
x = 1
y = 2

--Multiple statements per line
x = 1 y = 2

--You can add semicolons if you want but its just for clarity:
x = 1; y = 2

0

모든 디자인과 구성을 제쳐두고, 많은 프로그래머들이 다른 배경에서 왔으며 일부는 세미콜론을 사용하는 법을 배우고 일부는 그렇지 않았다고 생각합니다. 새로운 언어가 많이 나오면 세미콜론이 필요하지 않지만 여전히 존재합니다. 새로운 언어로 코딩하는 법을 배우기 시작했을 때부터 습관을 포기하지 않고도 더 많은 프로그래머를 얻는 방법 일 수 있다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.