언어에서 블록의 명시 적 마커보다 들여 쓰기를 선호해야하는 이유는 무엇입니까?


11

저는 Haskell을 배우고 있으며 자동 들여 쓰기 도구를 찾고있었습니다. 나는 많이 보지 않았고 Haskell (파이썬에서와 같이)에서 들여 쓰기가 블록을 의미한다는 것을 알았습니다. 결과적으로 C 계열의 다른 언어와 마찬가지로 {} (중괄호) 또는 begin end키워드 와 같은 명시 적 마커를 사용하는 자동 서식 도구를 만드는 것은 불가능하다고 생각합니다 .

가독성을 위해 들여 쓰기를 시행하는 언어는 신경 쓰지 않지만 들여 쓰기를 시행하고 명시 적 마커를 갖는 것의 이점을 이해할 수 없으므로 자동화 된 도구가 어떤 블록에 속하는지 이해할 수 있습니다.

들여 쓰기를 선호하여 블록을 표시하면 코드 더 좋아 보이 더라도 여전히 이점을 이해하지 못합니다. 탭과 공백이 다른 편집기와 다른 글꼴 (예 : 단정 한 글꼴은 더 ​​깔끔 해짐)로 다르게 표시되면 프로그래머가 코드를 적절하게 제시 할 것으로 기대할 수 없습니다. 현재 텍스트 편집기를 고려할 수있는 도구는 코드를 올바르게 형식화하는 데 훨씬 적합합니다.

언어 설계자가 명시 적 블록 마커보다 들여 쓰기를 선택하는 이유는 무엇입니까?


8
답은 아니지만 Haskell은 파이썬보다 공백 감도를 훨씬 더 선택적으로 만듭니다 . 대부분의 경우 세미콜론을 사용하고 원하는 경우 블록을 중괄호로 묶을 수 있습니다. let x =1; y = 2; z = 3은 그대로 유효합니다 do { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }. 그것들은 같은 줄에있을 필요는 없습니다.
KChaloux

8
"자동 서식 도구를 만들 수 없습니다"-실제로 들여 쓰기 규칙으로 인해 Python에서 자동 서식 도구가 필요하지 않습니다.
Doc Brown

13
음, 들여 쓰기를 증가시키는 것입니다 명시 적 블록 마커.
Karl Bielefeldt

3
@ K.Gkinis : 언어 설계 결정 의 정확한 동기 부여를 위한 최고의 소스 는 언어 설계자 자신입니다.
Robert Harvey

3
이 질문은 실제로 주관적이지 않습니다. 일부 언어 디자이너가 특정 구문을 선택한 이유를 묻습니다. 대답 할 수 있습니다. 질문이 어떤 구문이 가장 좋은지를 물었다면 주관적 일 것입니다.
JacquesB

답변:


13

귀도 폰 로섬

에서 귀도 반 로섬 (Guido van Rossum)과의 인터뷰 전체 텍스트에서 볼 수있는, books.google.com으로 (강조 광산) :

그룹화를위한 들여 쓰기 선택은 파이썬에서 새로운 개념이 아니었다. 나는 이것을 ABC로부터 물려 받았지만 오래된 언어 인 occam에서도 발생했습니다. ABC 작가가 아이디어를 occam에서 얻었는지 또는 독립적으로 발명했는지 또는 공통 조상이 있는지는 알 수 없습니다. 물론 다른 영역에서와 같이 ABC의 리드를 따르지 않기로 선택할 수 있었지만 (예 : ABC는 언어 키워드 및 프로 시저 이름에 대문자를 사용 했지만 복사하지 않은 아이디어) 이 기능을 매우 좋아했습니다 . C를 사용하는 동안 비트 는 중괄호를 배치 할 위치 에 대해 당시 C 사용자에게 공통적 인 특정 유형의 무의미한 토론을 없애는 것처럼 보였습니다 .

Von Rossum은 ABC 에서 많은 영감을 받았으며 , 모든 사본을 복사 할 필요는 없지만, 종교적인 전쟁을 피하는 데 도움이 될 수 있기 때문에 들여 쓰기 사용이 유지되었습니다.

또한 읽을 수있는 코드는 어쨌든 그룹화를 나타 내기 위해 들여 쓰기를 자발적으로 사용 한다는 것을 잘 알고 있었고 , 중괄호를 사용하여 들여 쓰기가 구문 그룹화에 동의하지 않는 코드의 미묘한 버그를 발견했습니다 . 프로그래머와 검토자는 들여 쓰기가 그룹화와 일치한다고 가정했습니다 따라서 버그를 발견하지 못했습니다. 다시 한 번 긴 디버깅 세션에서 유용한 교훈을 얻었습니다.

Rossum은 또한 그룹화와 들여 쓰기 간의 불일치로 인해 버그를 목격했으며 분명히 코드를 구조화하기 위해 들여 쓰기에 의존하는 것이 프로그래밍 오류 1 에서 더 안전 할 것 입니다.

Donald E. Knuth & Peter J. Landin

언급 된 인터뷰에서 Guido는 Don Knuth의 들여 쓰기 사용 아이디어를 언급합니다. 자세한 내용은 Knuth Indentation Quote rediscovered에 자세히 설명되어 있으며 goto 문으로 구조화 된 프로그래밍 을 인용합니다 . Knuth는 또한 Peter John Landin의 다음 700 가지 프로그래밍 언어를 참조합니다 (들여 쓰기에 대한 토론 섹션 참조). Landin 은 시작 / 종료 블록 대신 들여 쓰기가있는 첫 번째 언어처럼 보이는 ISWIM 을 설계 했습니다 . 이 논문은 프로그램을 구조화하기 위해 들여 쓰기를 사용하는 것이 타당성이 아니라 실제 주장이 유리하다는 주장에 더 가깝습니다.


1. 나는 이것이 실제로 발생해야 할 프로그래밍 오류를 포착하고 복구하기 위해 그룹화 구문과 자동 서식을 모두 선호 한다는 주장이라고 생각합니다 . 파이썬에서 들여 쓰기를 망치면 코드를 디버깅하는 사람이 올바른 것을 추측해야합니다.

if (test(x)):
  foo(x)
  bar(x)

bar테스트가 성공한 경우에만 항상 전화 해야 합니까?

그룹화 구문은 코드를 자동 들여 쓰기 할 때 실수를 발견하는 데 도움이되는 중복 수준을 추가합니다. C에서 동등한 코드는 다음과 같이 자동 들여 쓰기 할 수 있습니다.

if (test(x))
  foo(x);
bar(x);

bar와 동일한 수준에 있도록 의도 한 경우 foo코드 구조에 따라 자동 들여 쓰기를 사용하면 foo및에 괄호를 추가하여 수정할 수있는 문제가 있음을 알 수 있습니다 bar.

에서 파이썬 : 신화는 들여 쓰기에 대해 , C에서 가정으로 나쁜 예는있다 :

/*  Warning:  bogus C code!  */

if (some condition)
        if (another condition)
                do_something(fancy);
else
        this_sucks(badluck);

위와 같은 경우입니다. Emacs에서 전체 블록 / 기능을 강조 표시하고 Tab 키를 누르면 모든 코드가 다시 들여 쓰기됩니다. 인간의 들여 쓰기와 코드 구조의 불일치로 인해 무언가 잘못되었다는 것을 알 수 있습니다 (앞의 주석!).

또한 C에서 들여 쓰기가 해제 된 중간 코드는 단순히 마스터 분기를 통해 코드를 작성하지 않으며 모든 스타일 검사를 수행하면 GCC / Jenkins가 비명을 지 릅니다. 나는 최근에 파이썬에서 위에서 설명한 것과 비슷한 문제를 겪었고 한 단계의 들여 쓰기로 문을 닫았습니다. 때로는 C에 닫는 중괄호를 넘어서는 코드가 있지만 Tab 키를 누르면 코드가 "잘못"들여 쓰기됩니다. 버그를 볼 기회가 한 번 더 있습니다.


3
"종교 전쟁을 피하기 위해 ..."나는 진정한 이유가 사소한 것에 놀랐습니다.
Robert Harvey

1
@RobertHarvey :이 문구에 중점을 두는 것은 반 로섬이 아니라 코어 덤프입니다. 문맥에서 van Rossum 인용문을 읽는 것이 주된 이유는 아닙니다.
JacquesB

@JacquesB 답변을 편집 할 수 있도록 따옴표에서 누락 된 컨텍스트를 알려주십시오.
coredump 2016 년

4
나는 당신에게 개인적인 의견을 얻지 못합니다 : 파이썬에서 들여 쓰기를 망치면 버그가 있습니다. C에서 중괄호를 조이면 버그가 있습니다. 자동 들여 쓰기를 사용하면 두 언어에서 모두 동일합니다. 그리고 자동 들여 쓰기를 사용하지 않으면 C에서는 버그를 숨길 수 있습니다. 파이썬에서는 불가능합니다.
JacquesB

2
닫는 중괄호를 입력하는 것이 당신이하는 일이기 때문에 @JacquesB 들여 쓰기가 충분하지 않으면 잊을 수 있습니다. 물론 적절한 시점에 버팀대를 닫는 것을 잊을 수는 있지만 결국에는 버팀목을 닫고 다시 생각할 기회를 가져야합니다. 파이썬은 들여 쓰기에주의를 기울이기 때문에 초보자에게 효과적이라고 생각합니다.
marstato

7

이것은 매우 주관적이고 많은 화염 전쟁의 원인입니다. 하나:

블록 들여 쓰기를 구분하는 기호 가 두 가지 방법으로 동일한 정보를 표현하기 때문에 DRY 원칙을 위반합니다 . 자동 들여 쓰기 도구의 존재는 이 DRY 위반 의 증상 입니다. 들여 쓰기를 자동으로 생성 할 수 있다는 것은 중복 정보임을 나타내며 , 들여 쓰기와 기호 동기화되지 않아 코드를 오도 할 수 있습니다.

Python Design and History FAQ 는이를 매우 명확하게 설명합니다.

왜 파이썬은 문장 그룹화에 들여 쓰기를 사용합니까?

귀도 반 로섬 (Guido van Rossum)은 그룹화에 들여 쓰기를 사용하는 것이 매우 우아하며 일반적인 파이썬 프로그램의 명확성에 크게 기여한다고 믿고 있습니다. 대부분의 사람들은 잠시 후에이 기능을 좋아하는 법을 배웁니다.

시작 / 끝 괄호가 없기 때문에 파서가 인식하는 그룹화와 인간 독자 사이에 의견 차이가있을 수 없습니다.

파이썬 용 자동 들여 쓰기 도구를 만들 수 없다는 것은 사실이지만 좋은 일입니다. 즉, 구문을 조정하기 위해 자동화 된 도구가 필요한 구문에 중복성이 없음을 의미합니다.

탭 대 공백은 Python에서 합법적 인 문제이므로 동일한 코드베이스에서 탭과 공백 (들여 쓰기)을 혼합하지 않는 것이 좋습니다.

파이썬은 (이전의) 이전 언어 인 ABC에서 상당한 들여 쓰기를 물려 받았습니다. ABC는 사용성 테스트 를 사용 하여 디자인을 지시 한 프로그래밍 언어 중 하나입니다 . 따라서 구문에 대한 논의는 일반적으로 주관적인 의견과 개인적 선호에 달려 있지만, 중요한 들여 쓰기의 선택은 실제로 더 견고한 기초를 가지고 있습니다.


6
이중 입력 회계도 DRY를 위반합니다. 중복성은 때때로 기능입니다.
coredump

3
@coredump : 사실이지만 의도적으로 설계된 중복성입니다. Python을 포함한 대부분의 프로그래밍 언어에는 의도적으로 선택된 중복성이 포함되어 있습니다. 예를 들어 pass자동으로 추론 할 수 있지만 명시 적으로 지정해야하는 키워드는 실수를 발견하는 데 도움이됩니다. 시작 / 종료 기호 (컴파일러 용)와 들여 쓰기 (인간 독자 용)가 실수로 중복되면 잡는 것보다 많은 실수가 발생하는 것 같습니다. 적어도 이것은 반 로섬의 견해 인 것 같습니다.
JacquesB

@coredump-이제 회계사가 아닌 이유를 알고 있습니다.
JeffO

3
@coredump COBOL PROCEDURE DIVISION.도 그리워 ? DATA DIVISION이 새로운 언어로 끝과 절차 가 어디서 시작 되는지 알 수 없습니다 .
msw

2
@coredump : "들여 쓰기가 내가 생각한 것과 모순되는 것은 오류를 방지하기에 충분합니다"-정확하게.
JacquesB

2

언어 설계자는 코드를 읽을 때 세미콜론과 중괄호에 노이즈가 추가되어 생산성이 저하된다고 생각하기 때문에 구문 적으로 중요한 공백을 선택합니다. 또 다른 일반적인 이유는 잘못된 / 일관되지 않은 코딩 스타일이 가독성을 떨어 뜨리기 때문입니다. 공통 들여 쓰기 체계를 강요하면 언어의 가독성이 전반적으로 향상됩니다. 나중에 자동 포맷 IDE가 더 일반적이지만 여전히 적용 할 수 있기 때문에 그 이후의 이유는 덜 중요합니다.


1
세미콜론과 중괄호 노이즈를 고려하는 이유를 알 수 있습니다. 그러나 4/8/12 배의 공간을 입력하는 것이 덜 생산적이지 않습니까? 그리고 당신이 하나를 그리워하면 (보이지 않기 때문에) 당신은 곤경에 처합니다.
Reinstate Monica

5
따라서 공백 대신 탭을 사용하거나 탭을 4 칸 블록으로 변환하는 방법을 이해하는 IDE를 사용하는 것입니다.
Robert Harvey

@ K.Gkinis : 들여 쓰기가 보이지 않습니다. 줄 끝의 공백 만 보이지는 않지만 이것은 모든 언어에서 중요하지 않습니다. 탭과 공백을 혼합 한 경우에만 문제가 발생합니다. 그러지 마
JacquesB

@JacquesB : 들여 쓰기의 가시성 / 보이지 않는 문제는 인간이 종종 공간과 탭의 차이를 말할 수는 없지만 컴퓨터는 할 수 있고 자주하는 것입니다. 따라서 들여 쓰기가 표시되는 동안 컴퓨터가 들여 쓰기를 해석하는 방식이 다를 수 있습니다. 컴퓨터가 보이지 않는 캐릭터를 인간과 다르게 취급 할 때의 실제 문제입니다. 인간은 들여 쓰기를 화면상의 거리로 측정하고 컴퓨터는 문자를 문자 수로 측정 할 수 있습니다. 그것은 보이지 않는 부분입니다.
Bryan Oakley

@BryanOakley : 예, 탭과 공백을 들여 쓰기하지 않아야하는 이유입니다.
JacquesB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.