일부 프로그래밍 언어에서 왜 대 / 소문자를 구분합니까?


44

난독 화 코드를 제외하고 프로그래밍 언어에서 대 / 소문자를 구분하는 용도는 없습니다.

왜 이것을 프로그래밍 언어로 구현해야합니까?

최신 정보:

그것은 모양 이에 성명을 발표했다 아는 사람 .


28
일부 프로그래밍 언어에서 여전히 대소 문자가 구분되지 않는 이유는 무엇입니까?
Thomas Eding

1
영어조차도 일반적으로 대소 문자를 구분합니다. 일반적으로 인용 된 예는 폴란드어와 폴란드어로, 두 가지 다른 용어이며 경우에 따라 서면 양식이 다르고 발음과 의미가 다릅니다. IMO는 프로그래밍 언어가 이와 관련하여 너무 영리하지 않은 것이 더 좋으며 프로그래머 스스로 적절한 서면 규칙을 제시하게합니다. 예를 들어 Person person = new Person()기호 'person'이 임시 객체이고 'Person'이 클래스 유형 인 OO 언어 와 같은 것을 쓰는 것이 일반적 입니다.
Brandin

답변:


113

영어로 대소 문자를 접는 작업은 사소한 것이지만 다른 언어에서는 그렇지 않습니다. 독일 프로그래머가 ß변수 이름을 사용 하는 경우 대문자로 무엇을 고려할 것입니까? 참고로 "ß"는 소문자 에만 사용됩니다. OTOH, "ss" 동일합니다. 컴파일러와 일치해야한다고 생각하십니까? 유니 코드에 들어가면 사전 구성된 분음 부호가있는 문자와 별개의 결합 분음 부호와 같은 더욱 흥미로운 문제가 발생합니다. 그런 다음 두 글자가 아닌 여러 글자로 된 세 가지 형태의 아랍어 스크립트를 얻습니다.

암흑 시대에 대부분의 프로그래밍 언어는 거의 대소 문자를 구분하지 않았습니다. 예를 들어, Pascal은 제어 데이터 메인 프레임에서 시작하여 문자 당 6 비트 (총 64 개) 만 사용했습니다. 대부분의 이러한 시스템은 대문자 만 포함 된 "CDC Scientific"문자 세트를 사용했습니다. 다른 문자 세트로 전환 할 수 있지만 대부분 대문자 또는 소문자를 사용하지만 둘다는 아니지만 둘 다 동일한 코드를 사용했습니다. 고대의 Baudot 코드도 마찬가지였으며 COBOL, FORTRAN, BASIC 등의 초기 시대에는 표준으로 간주되었습니다. 더 유능한 하드웨어가 널리 보급 될 때까지는 대소 문자를 구분하지 않으므로 완전히 변경할 수 없었습니다. .

시간이 지남에 따라 대소 문자를 구분하지 않는 것이 어려워졌고, 언어 디자이너는 대부분 대 / 소문자를 구분하지 않으려는 경우 보조 도구로 처리하는 것이 더 좋다고 결정했습니다. 언어 자체보다.

적어도 IMO 컴파일러는 제시된대로 정확하게 입력해야합니다. "이 글을 썼지 만 실제로 다른 것을 의미한다고 가정하겠습니다." 번역을 원한다면이를 잘 처리 할 수있는 도구를 사용하여 별도로 번역하는 것이 좋습니다.


26
+1, 비슷한 경험을 할 것입니다. 내 경험상 이것에 대해 말하는 사람들은 대부분 다른 언어 / 문자 세트를 고려하지 않은 사람들입니다.
예레미야 Nunn

5
컴파일러가 다른 철자를 알아 채기 시작한다면 내 큰 질문도 임의로 밑줄이나 다른 "단어 구분 기호"를 넣을 수 있어야 하는가? 식별자의 철자를 잘못 입력했을 때 "예상 한 작업을 수행"하려고합니까? 얼마나 멀리 갈까요? (BTW, Ada는 명확성을 위해 임의로 숫자의 밑줄을 허용합니다 .)
dash-tom-bang

3
@Barry :이 둘은 거의 동일합니다. 지구상의 거의 모든 다른 언어에는 ASCII로 사용할 수없는 문자가 필요합니다. 이 문제를 해결하기 위해 영어를 사용하는 경우에도 다소 제한적입니다. 예를 들어 "협력"을 "협력"으로 작성해야합니다. 다행스럽게도 타자기는 컴퓨터가 등장하기 오래 전에 사람들이 이러한 제한에 익숙해 져서 한 번 필요하다고 생각되는 모든 문자를 사용할 가능성을 고려하지도 않습니다.
Jerry Coffin

2
@ dash-tom-bang : 컴파일러는 그와 같은 일을하려고 시도했습니다 (맞춤법 철자법). 경험에 따르면 일반적으로 컴파일러를 더 빨리 실행하고 더 나은 오류 메시지를 생성하는 것이 좋습니다.
Jerry Coffin

2
@phresnel 또는 "SZ". 두 가지 모두에 대해 좋은 주장을 할 수 있습니다.
Vatine

114

왜 아무도 무감각을 원합니까? 어떤 시나리오 VARIABLE에서 한 곳, Variable다른 곳 및 variable세 번째에서 와 같이 단일 변수를 참조하는 것이 유용한 가요? 대소 문자가 구분되지 않습니다. 실수로 입력하면 코드와 같은 대소 문자를 입력 VAriable하지 않고 컴파일러 오류가 발생 Variable합니다.

결론적으로, 많은 프로그래밍 언어는 역사적 / 관 성적 이유뿐만 아니라 대 / 소문자 구분도 나쁜 아이디어이기 때문에 대 / 소문자를 구분합니다.


12
당신은 그것을 밖으로보고 있습니다. 예, 여러 철자를 사용하여 동일한 변수를 언급하는 것은 성가신 일이 될 수 있지만 같은 범위에서 두 가지 다른 식별자를 참조하는 경우가 다릅니다. 대소 문자를 구분하지 않기 때문에 대소 문자를 구분하지 않는 것이 좋습니다. (또한, 간단한 오타가 구문 오류가되지 않도록합니다. 질문에 대한 주제에 대한 Jeff의 게시물 링크를 참조하십시오.)
Mason Wheeler

88
그러나 간단한 오타가 구문 오류가되기를 바랍니다! 내 코드에 간단한 오타를 원하지 않고 컴파일러에서 찾을 수 있도록 도와주기를 원합니다. 대소 문자를 구분하지 않으면 찾기가 어렵습니다. 대소 문자를 구분하지 않으면 코딩이 잘못되었습니다.
nohat

4
@ nohat : 입력하려는 것 이외의 것을 입력하면 구문 오류가 좋습니다 .
Tim Goodman

13
@Mason 휠러, 나는 기사를 읽고 나는 단순히 더 동의 할 수 없었다. 대소 문자를 구분하지 않는 많은 언어를 사용했으며 대소 문자 오타로 끊임없이 분노하고 있습니다.
nohat

11
대소 문자에 무관심하다는 말은 절대로 동의하지 않습니다. 대담한 제안은 여전히 ​​낡은 VB / Basic 시절을 갈망하는 사람들로부터 나옵니다.
Tim

27

Java의 경우 감도는 코드에서 더 많은 옵션을 제공하는 데 사용되지 않고 매우 명확하고 일관된 의미 의미를 위해 사용됩니다. 클래스보기 좋아요. objectsLookLikeThis와 같습니다. methodsLookLikeThis (). STATIC_VARIABLES_LOOK_LIKE_THIS. 클래스. 내부 클래스보기처럼. 그것은 더 큰 자유를 제공하지는 않습니다 : 그것은 당신이 다른 정보를 지나치게 장황한 언어로 간결하게 포장 할 수있게합니다.

필자는 컴파일러와 IDE가 지원되는 정적으로 정적으로 유형이 지정된 언어에서 대 / 소문자 구분은 정보 (예 : Java)를 전달하는 좋은 방법이라고 생각합니다. 루비와 같은 언어를 사용하면 대소 문자를 구분하지 않는 루비를 사용할 수는 있지만 대소 문자를 구분하지 않으면 예기치 않은 결과가 발생할 수 있습니다.

엄격한 시스템의 대소 문자 구분은 코드를 난독 화하지 않지만 실제로 명확하게 만듭니다. 가능한 Java 코드를 고려하십시오.

      joe blah = new hUf();

그것은 분명하지만, 어떻습니까 :

      hUf.WTF();

Java 그대로는 이것이 무엇인지 자동으로 알 수 있습니다. 대소 문자를 구분하지 않는 Java의 경우 모호하므로 클래스와 인스턴스를 패키지와 메소드와 구별하기 위해 다른 메커니즘을 사용해야합니다. 그리고 그 메커니즘은 아마도 그것이 얼마나 추악한 지 토할 것입니다 :)


2
누우! 더 이상 언더 스코어가 아닙니다 !! int package_class_method_var_name? !!
Michael K

2
@Michael, 밑줄이 타이핑하기가 번거 롭다는 것을 아무도 모르는 것 같습니다.
Dan Rosenstark

2
키보드에 따라 다릅니다. 저에게 (프랑스어 키보드를 사용하는) _는 입력하기 쉽고 {}는 훨씬 더 어렵습니다 (AltGr을 사용하여 도달).
PhiLho

6
아, 대소 문자 구분은 새로운 헝가리 표기법입니다.
David Thornley

1
만약 컴파일러가 그것을 강제한다면 그것은 " 매우 명확하고 일관된 의미 론적 의미 "입니다. 이제 클래스 이름이 대문자로 시작하고 메소드 이름이 소문자로 필요한 컴파일러 는 실제로 대소 문자를 구분하는 흥미로운 이유 일 수 있습니다.
로스 패터슨

24

나는 그것이 "허용 된 것"만큼 "구현되었다"고 생각하지 않는다. 대소 문자 구분은 문자열 비교의 기본 상태입니다. 대소 문자를 구분하지 않는 비교를 수행하고 정확한 오류 및 경고보고를 위해 원래 토큰 이름을 보존해야하기 때문에 코드를 추가하여 대소 문자를 구분하지 않도록하려면 컴파일러 엔지니어가 추가 작업을 수행해야합니다.

그것이 거의 확실하게 C로 끝난 이유입니다. 그들은 유용성을 희생하면서 컴파일러를 구현하기 쉬운 간단한 언어를 만들고 싶었습니다. 왜 현대 언어로되어 있습니까? 물론 C로되어 있으므로 올바른 방법 이어야 합니다! </ sarcasm 모드>


3
또한 프로그래밍 언어가 발명되었을 때 60 년대와 70 년대에 공간과 속도가 매우 중요하다고 생각합니다. 대소 문자를 구분하지 않는 추가 지침과 공간을 제공 할 수 없습니다. 현대 언어에서는 "항상 그렇게 된 것"문제에 가깝습니다. C #과 같은 새로운 언어가이를 수행 할 이유가 없습니다.
Jay

1
@Jay : 그럼에도 불구하고 C에 우선하고 디자인에 영향을 준 Pascal은 대소 문자를 구분하지 않고 컴파일 속도가 빠릅니다. ;)
Mason Wheeler

@Mason : 파스칼이 C에 영향을 미치지 않았다고 생각했습니다. 기본적으로 모두 Algol / Fortran에서 왔습니다! people.mandriva.com/~prigaux/language-study/diagram.png
Jay

1
@ 매트 : 음 .. 어디에서 왔어요? 내가 본 모든 자료는 Pascal과 1970 년, C는 1972 년 사이였다.
Mason Wheeler

16
요즘 아이들. 제 시절에는 소문자가 없었고 마음에 들었습니다. 6 비트면 충분했다. 물론, 이제 우리는 외침에서 청각 장애인입니다.
KeithB

23

다른 것이 없으면 구문 분석을 단순화하고 변수 / 클래스 이름에 대한 더 많은 조합을 허용합니다.

대소 문자를 구분하지 않는 구문 분석을 사용하면 'myClass'와 'MyClass'가 동일하므로 고유 식별자를 사용해야합니다. 또는 컨텍스트에 따라 사용되는 식별자를 확인할 수 있도록 구문 분석기에 복잡한 계층을 추가해야합니다.

다음과 같은 경우를 고려하십시오.

XmlWriter xmlWriter = new XmlWriter();
xmlWriter.Write("blah");

XmlWriter 클래스에도 "쓰기"라는 정적 메서드가 있다고 가정합니다. 여기에 대 / 소문자를 구분하지 않으면 인스턴스 또는 클래스에서 호출합니까?


14
그래도 나쁜 명명 규칙입니다. 만약 누군가 목을 졸라 것입니다 writeWrite두 개의 완전히 다른 방법이었다.
TheLQ

5
이것에 대해 TheLQ에 동의해야합니다. 일부 C 라이브러리에서 작업 할 때 "HWND hwnd;"와 같은 선언이 표시됩니다. 이와 같은 대소 문자 구분을 남용하는 사람은 모두 꺼내서 촬영해야합니다.
메이슨 휠러

4
@ TheLQ 메소드는 동일한 경우를 갖습니다. 클래스 / 변수 이름에 다른 사례를 사용했습니다.
Adam Lear

6
@Anne Lear, 이것이 나쁜 예라고 생각합니다. 대소 문자를 구분하지 않는 언어를 사용하면 변수 이름에 클래스 이름을 사용하려고 시도하는 구문 오류가 이미 있기 때문에 호출 할 메소드에 대해 걱정할 필요가 없습니다.
Matt Olenik

5
@Matt 구문 강조 표시 없이 코드를 작성해서는 안됩니다 . IDE 없이는 이해할 수 있지만 구문 강조없이 편집기에서 코딩하는 것은 ... 누구나 왜 그렇게할까요?
Davy8

13

코드를 더 자기 문서화하는 것 외에 다른 이유가 없다면 대소 문자 구분을 좋아합니다.

this is a CONSTANT
this is a ClassName
this is a methodName
this is a local variablename

필자는 일반적으로 Python으로 프로그래밍하지만 C # 시절에는 클래스와 동일한 클래스 인스턴스 이름을 지정하는 것이 매우 편리하지만 다른 사람들이 말한 것처럼 소문자 (또는 낙타)의 경우 이름이 매우 편리하다는 것을 알았습니다.

Thing thing = new Thing();

대소 문자를 구분하지 않는 언어를 사용하려면 이와 같은 다른 규칙이 필요합니다.

Thing oThing = new Thing()
Thing instanceOfThing = new Thing()

어느 것이 "나쁜 것"입니다.

또한 클래스 대 변수 사용에 대한 참조를 찾기 위해 grep (대소 문자 구분)을 사용하는 것이 편리하다는 것을 알았습니다. 대소 문자를 구분하지 않는 언어를 사용하면 쉽지 않습니다. 검색 및 교체와 동일합니다.

마지막으로, 프로그래머로서, 다른 경우를 가진 단어를 볼 때, 그것들이 다른 것이라는 것을 나에게 뛰어 넘습니다 ... 나는 컴파일러가 도움을 줄 동적 스크립트 스크립트 언어에서도 가변 사례가 잘못 된 버그는 거의 없습니다.


10

사람들은 실제로 읽기 전에 단어의 모양에주의를 기울입니다. 대소 문자 구분은 코드 전체에서 심볼의 모양을 일관되게 유지합니다. 또한 다른 관습은 다른 유형의 기호를 나타냅니다. 대소 문자 구분과 둔감성 모두 악용 될 수 있습니다. 나쁜 프로그래머는 항상 나쁜 코드를 생성 할 것입니다 ... 그들은 길을 찾을 것입니다.

언어를 예로 들어 보자. 왜 우리는 문장으로 시작하고 대문자로 물건을 명명합니까? 그것은 유닉스 때문입니까?


@JUST 의견은 광범위한 토론이 아니라 설명을 구하기위한 것입니다. 해결책이 있다면 답을 남기십시오. 솔루션이 이미 게시 된 경우 투표하십시오. 이 답변에 대해 다른 사람들과 논의하고 싶다면 chat을 사용하십시오 . 자세한 내용 은 FAQ 를 참조하십시오.
Adam Lear

9

C # 및 Java와 같이 정적으로 유형이 지정된 언어를 생각하면 실제로 값을 추가하지는 않습니다. 대부분의 경우, 어쨌든 자동으로 대소 문자가 일치하지 않는 IDE를 가지고 있기 때문에 실수로 "VAriable"을 입력하면 IDE가 자동으로 " 가변 "입니다. MyClass myClass;스타일 규칙을 추가하면 대소 문자 구분이 반드시 나쁜 것은 아닙니다.

동적 유형 언어의 경우 IDE가 자동 수정을 추측하기가 더 어렵 기 때문에 더 많은 논증이있을 수 있지만 동적 유형 언어의 경우 이미 걱정해야 할 부분이 많습니다. 일관성있는 케이싱 규칙을 사용한다고해서 더 많은 부담이 발생하지는 않을 것입니다.

따라서 언어가 대소 문자를 구분할 수없는 실제 이유는 없지만, 언어가 대소 문자를 구분 해야하는 실제 이유도 없습니다 .

"SignOn"과 "Signon"에 대한 Scott Hanselman의 기사는 문자열 비교에 관한 것이며 프로그래밍 언어와는 아무런 관련이 없습니다. 사용자가 입력 하는 문자열 은 항상 대소 문자를 구분하지 않아야 하지만 동의 는 프로그래밍 언어의 식별자와 다른 게임이라고 생각합니다.


1
"사례 불일치를 자동으로 수정하는 IDE"를 언급하여 +1
DavRob60

3
IDE는 mp 용입니다. 연필과 종이로 프로그램 한 다음 코드를 스캔합니다.
Dan Rosenstark

6

언어가 대 / 소문자를 구분할 때 수학 및 과학에서 일반적인 사례 사용을 재현하기 위해 사용합니다. 다음은 몇 가지 경우에 대한 규칙 목록입니다 (완전한 것은 아님).

  • 확률 이론에서 소문자는 f일반적으로 확률 밀도 함수 (pdf)를 나타내고 대문자 F는 해당 누적 분포 함수 (cdf)를 나타냅니다.
  • 또한 확률 이론에서 대문자는 임의 변수를 나타내고 X, 해당하는 소문자 x는 $ Pr [X = x] \ leq 0.05 $에서와 같이 실현을 나타냅니다 .
  • 선형 대수에서 대문자는 일반적으로 행렬을 나타내는 데 사용되고 소문자는 일반적으로 숫자를 나타내는 데 사용됩니다 (예 : $ A = [a_ {ij}] $).
  • 단위 기호는 리터 (L)와 사람의 이름에서 파생 된 단위 (W는 와트, Pa는 파스칼, N은 뉴턴 등)를 제외하고 소문자 (예 : 미터의 경우 m)로 표시됩니다.
  • 백만 이상을 의미하는 접두사 기호는 대문자로 표시하고 (M은 M), 백만 미만은 소문자 (M)를 나타냅니다.

3
타당한 점이지만, 거의 모든 일반적인 프로그래밍 언어의 코딩 규칙을 위반하는 것입니다.이 언어는 고유 한 목적에 따라 대소 문자를 구분합니다.
Ken Bloom

3

방금 유닉스와 C 때문이라고 생각했습니다. 그러나 그것은 일종의 닭고기와 계란 문제로, 간헐천 만 제대로 대답 할 수 있습니다.

나는 "부활절 토끼가 마을에오고있다"의 닭이 계란보다 먼저 왔는지 물었을 때 사용 된 근거를 사용합니다. 노아의 방주에는 닭이 있었기 때문에 닭이 먼저 나왔습니다. 따라서 GCC가 Unix에서 실행되기 때문에 Unix가 먼저 나왔으므로 Unix는 C, 모든 변형 및 하위 항목, 즉 중괄호를 부과하는 모든 항목에 관심이 많기 때문에 대소 문자를 관리합니다.

중괄호와 대 / 소문자 구분도 연결되어있을 수 있습니다.


유닉스는 GCC보다 몇 년 전에 왔지만 원래 BCPL 컴파일러는 유닉스보다 먼저 왔으며 일반적으로 "C 구문"을 만들었습니다.
로스 패터슨

2

지금까지의 훌륭한 답변 외에도 대소 문자를 구분하면 추가 "네임 스페이스"가 제공됩니다. 예를 들어 Perl에는 일반 코드 BEGINEND는 다른 시간에 실행되는 특수 블록 (컴파일시 BEGIN, 일반 프로그램 종료 후 END)이 있으며 모두 대문자로 표시하면 눈에 띄게됩니다. 변형은 예약어가 아닙니다.

더 나아가서 나중에 언어에서 사용할 수 있도록 모든 대문자 이름을 예약 할 수 있으며 일반적으로 코드에서 소리 지르지 않는 일반 프로그래머에게는 해를 끼치 지 않습니다.


2

"대소 문자 구분"은 기술 담당자가 모호성을 줄이기 위해 항상 더 좋습니다. 파일 이름을 예로 들어 보겠습니다. Windows의 파일 이름은 대소 문자를 구분하지 않는 반면 Windows의 파일 이름은 대소 문자를 구분하지 않기 때문에 Windows 파일 이름을 처리하는 것이 Unix 파일 이름보다 문제가 많습니다.

프로그래밍으로 돌아갑니다. 클래스 이름, 메서드 이름, 변수 이름의 경우 대부분의 언어는 명명 스타일 규칙을 적용하지 않습니다. 간혹 단순하게 "반사"를 수행하기 위해 "대소 문자 구분"이름을 사용하여 변환하지 않고 다른 데이터 소스에 바인드하거나 동일한 이름의 문제를 처리하지만 다른 경우에 처리 할 수 ​​있습니다.


무의미한 말. 대소 문자를 구분하는 동작을 이미 기대하기 때문에 모호성을 줄이는 것으로 보입니다.
로스 패터슨

1

이 소리에 놀랐습니다. 이제 아무도 m_C #에서 밑줄이나 필드 이름 을 사용하기를 원하지 않으므로 낙타 경우를 사용했습니다. 필드 이름이 공용 속성 이름과 동일한 경우 공용 속성 이름은 Pascal case입니다. 그리고 뒷받침 분야는 낙타의 경우입니다. "그래서"-그것이 프로그래밍 커뮤니티가 원하는 것 같습니다. 지금까지 아무런 문제가 발생하지 않았습니다.


0

특히 일부 프로그래머는 BASIC의 초기에 왔으며 여기서 변수 이름은 2 자까지만 가능합니다.

따라서 여러 문자가 될 수 있으면 매우 행복해집니다. 또한 대소 문자 구분과 함께- SomeName실수로 동일 SOMENAME하거나 버그로 인해 버그가 발생하는 것을 원치 않기 때문 입니다.

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