다양한 언어 구현에 유니 코드 식별자 지원을 추가하는 요점은 무엇입니까?


14

개인적으로 혼란스러운 유니 코드 식별자로 가득 찬 코드를 읽는 것을 발견했습니다. 제 생각에는 코드가 쉽게 유지 관리되지 않습니다. 다양한 번역가들의 저자가 그러한 지원을 구현하는 데 필요한 모든 노력은 말할 것도 없습니다. 또한 다양한 언어 구현의 장점 (실제로 중요한)의 목록에서 유니 코드 식별자 지원의 부족 (또는 존재)을 지속적으로 알 수 있습니다. 나는 그것을 얻지 못한다 : 왜 그렇게 많은 관심을?


1
물건의 이름을 의미합니까, 별, 람다 및 중간 점과 같은 특수 문자를 의미합니까?
Frank Shearar

5
롤! 영어를 사용하는 사람들이 아닌 세상이 존재한다는 것을 알고 있습니까? 놀랍지 않은 발견입니까?
deadalnix

3
deadalnix : 나는 그런 나라에 살고 있으므로 우리는 같은 식별자를 사용할 수 있습니다 größe. 즉, 나는 결코 그렇게하지 않으며 그렇게하지 않는 것이 좋습니다. 따라서 질문이 매우 유효합니다.
user281377

2
deadalnix : 저는 지금까지 영어권 국가에 가본 적이 없습니다. 질문자가 아닌 실제 질문에주의를 기울이지 않겠습니까?
Egor Tensin

6
언어가 문자열 처리에서 유니 코드를 얻는 데 집중하고 멋진 유니 코드 식별자를 생략하기를 바랍니다. 좋은 프로그래밍 리소스는 어쨌든 영어로되어 있으므로 (StackOverflow) 영어로 프로그래밍해야한다는 것을 인정하고 (공유가 더 쉬워 짐) 적절한 유니 코드 문자열 조작을 구현하는 데 집중하십시오.
Matthieu M.

답변:


17

유니 코드를 생각할 때 중국어 또는 러시아어 문자를 생각하면 인터넷에서 본 러시아어로 작성된 소스 코드를 생각할 수 있으며 러시아어를 알지 못하는 경우 사용할 수 없습니다.

그러나 유니 코드를 잘못된 방식으로 사용할 수 있다고해서 소스 코드 자체가 나쁘다는 의미는 아닙니다.

유니 코드를 사용하여 특정 필드에 대한 코드를 작성할 때 코드를 줄이고 더 읽기 쉽게 만들 수 있습니다. 대신에:

const numeric Pi = 3.1415926535897932384626433832795;
numeric firstAlpha = deltaY / deltaX + Pi;
numeric secondAlpha = this.Compute(firstAlpha);
Assert.Equals(math.Infinity, secondAlpha);

당신은 쓸 수 있습니다:

const numeric π = 3.1415926535897932384626433832795;
numeric α₁ = Δy / Δx + π;
numeric α₂ = this.Compute(α₁);
Assert.Equals(math.∞, α₂);

일반 개발자 에게는 읽기 쉽지 않지만 매일 수학 기호를 사용하는 사람에게는 읽기 쉽습니다 .

또는 SLR 사진과 관련된 응용 프로그램을 수행 할 때 대신 :

int aperture = currentLens.GetMaximumAperture();
Assert.AreEqual(this.Aperture1_8, aperture);

조리개 를 기호 ƒ로 대체 할 수 있습니다 ƒ/1.8.

int ƒ = currentLens.GetMaximumƒ();
Assert.AreEqual(this.ƒ1¸8, ƒ);

불편할 수 있습니다 . 일반적인 C # 코드를 입력 할 때는 다음과 같이 작성하는 것이 좋습니다.

var productPrices = this.Products.Select(c => c.Price);
double average = productPrices.Average()
double sum = this.ProductPrices.Sum();

오히려

var productPrices = this.Products.Select(c => c.Price);
double average = productPrices.x̅()
double sum = productPrices.Σ();

첫 번째 경우, IntelliSense는 거의 입력하지 않고 특히 마우스를 사용하지 않고 전체 코드를 작성하는 데 도움이되므로 두 번째 경우에는 해당 기호를 찾을 위치를 모르고 마우스를 사용하여 마우스를 사용해야 할 것입니다 자동 완성 목록에서 검색하십시오.

이것은 여전히 ​​어떤 경우에는 유용합니다. currentLens.GetMaximumƒ();필자의 이전 예제 중 IntelliSense를 사용할 수 있으며 입력하기 쉽고 GetMaximumAperture짧고 읽기 쉽습니다 . 또한 기호가 많은 특정 도메인의 경우 키보드 단축키를 사용 하면 소스 코드에서 해당 문자보다 문자를 빠르게 입력 할 수 있습니다.

그건 그렇고, 코멘트에도 동일하게 적용됩니다. 중국어로 자신을 잘 알지 못하는 한, 중국어로 주석으로 가득 찬 코드를 읽고 싶은 사람은 없습니다. 그러나 일부 프로그래밍 언어에서는 유니 코드 기호가 여전히 유용 할 수 있습니다. 한 가지 예가 각주 ¹입니다.


¹ 주석을 작성하는 방법에 대한 엄격한 스타일 규칙이있는 C # 코드에서는 각주를 즐기지 않을 것입니다. 반면에 PHP에서는 설명해야 할 것이 많지만 중요하지 않은 경우 파일의 맨 아래에 배치하지 않고 메소드 의 PHPDoc 에 각주를 작성하십시오 .


ASCII에는 식별자에 사용할 수있는 37자가 포함됩니다. 나는 대부분의 글꼴에서 라틴 알파벳에 유창하지 않은 사람들조차도 다른 글꼴의 두 문자열을 동일한 식별자라고 말할 수 있음을 충분히 시각적으로 구별 할 것으로 기대합니다. 프로그래머가 "Φ"대신 각도에 "Ф"를 사용할 때 얼마나 많은 디버깅 노력이 낭비됩니까?
supercat

1
@ supercat : 좋은 지적입니다. 그러나 당신이 제공하는 예는 도구 자체가 나쁘다는 것보다 도구를 잘못 사용한다는 것을 보여줍니다. Δx또는 -∞유효한 용도 (내 대답에 설명 된 단점이 있음). 반면에 Ф/ Φ는 프로그래머가 변수 이름을 올바르게 지정하는 방법을 이해하지 못한다는 신호일뿐입니다.
Arseni Mourzenko

1
프로그래머가 소문자 그리스 문자 세타 (예 : 수평 각도)를 원한다면 내가 준 기호 중 어떤 것이 올바른지 아십니까? 동일하지 않으면 매우 비슷한 문자 그룹이 많이 있습니다. 소스 파일에 도움이 될 수있는 식별자 내에 어떤 문자가 공존 할 수 있는지 지정하는 지시문이 포함되어 있어야한다면 외래 문자로 정확하게 명명 된 변수와 유사 문자로 명명 된 변수 사이에 많은 잠재적 혼동이 나타납니다.
supercat

1
@ supercat : 그리스 문자 phi를 의미합니까? 필자는 프로그래머가 "누적 분포 함수"라는 용어가 필요한 응용 프로그램에서이 기호를 사용하면 도메인 용어와 기호를 알고있는 사람은 Φ의 의미를 이해할 것입니다. cumulativeDistributionFunction너무 길어. CDFΦ보다 읽기 어렵습니다. cumDistFunc못 생겼어 이것은 또한 프로그래머가이 맥락에서 키릴 문자 EF (Ф)를 대신 사용한다면 그것은 실수라는 것을 의미합니다. 같은 방식으로 프로그래머는 잘못된 용어 나 잘못된 약어를 ​​사용했을 수 있습니다.
Arseni Mourzenko

1
변수 이름이 밑줄, 0-9, az 및 AZ로 구성된 경우 복사 / 붙여 넣기를 지원하지 않는 코드 사본 (예 : 인쇄물)이있는 사람은 합리적으로 정확하게 재현하기를 원할 수 있습니다. 의미를 모르고 "without"을 복사하려고하는 사람은 "Ф"로 매우 쉽게 끝날 수 있습니다. 프로그래머가 "phi"로 알고 있다고해도 "φ"또는 "ɸ"가 적당한. [하나는 "Latin Small Letter Phi"이고 하나는 "Greek Small Latter Phi"입니다.이 주석 글꼴에서는 명확하게 구분되지만 Lucida Sans Unicode에서는 그렇지 않습니다].
supercat

8

내가 말할 것:

  1. (예 : 학교에서) 프로그래밍을 배우고 영어를 모르는 비전문가 및 초보자를 용이하게합니다. 그들은 어쨌든 생산 코드를 작성하지 않습니다. 나는 여러 번 코드를 보았다 :

    double upsos, baros;
    cin >> upsos >> baros;
    

    가난한 사람이 자신의 언어로 쓰도록하세요.

    double ύψος, βάρος;
    cin >> ύψος >> βάρος;
    
  2. 마음에 들지 않습니까?

    class ☎ {
    public:
        ☎(const char*);
        void 📞();
        void 🎧(👨);
    };
    
    ☎ ☏("031415926");
    ☏.🎧(👨("Bob"));
    ofstream f;
    f.💾();
    

아이러니하게도, "당신이 좋아하지 않아요"아래의 코드는 제대로 렌더링되지 않습니다.이 코드는 펑키 한 캐릭터를 사용하지 않는 이유를 보여줍니다.
Kris

5

물론 현대의 모든 컴파일러는 오늘날 유니 코드 소스 코드를 처리해야합니다. 예를 들어, 문자열 상수에는 유니 코드 문자가 포함되어야합니다. 그러나 이것이 달성되면 왜 유니 코드 식별자를 허용하지 않습니까? 컴파일러 코드가 7 비트 코드 인 문자에 의존하지 않는 한 큰 문제가되지 않습니다.

그러나 OP는 지금까지 진행 중이다. 힌디어를 사용하는 인디언은 러시아어 식별자와 아랍어 주석으로 코드를 유지해야 할 수있다. 품질 검사를해야하고 위의 3 개 알파벳 중 어느 것도 읽을 수없는 가난한 중국인에게는 악몽입니다!

따라서 이제는 프로그램 식별자와 주석이 공통 언어로 작성되도록하는 것이 조직 작업입니다. 나는 그것을 도울 수 없지만 이것은 앞으로 영어가 될 것이라고 생각합니다.


유니 코드 식별자를 허용 할 때의 문제점은 소스 코드에 의미 적으로 중요하지만 인쇄 할 수없는 정보를 포함 할 수 있다는 것입니다. 클래스는 필드를 선언하는 경우 예를 들어 А, 생성자는 매개 변수를 받아 Α, 생성자의 문은 말한다 var x = A.boz();것, A필드, 매개 변수, 또는 다른 아마도 뭔가를 참조하십시오? 어떻게 말할 수 있습니까?
supercat

1
그렇습니다.하지만 몇 문자 만 닮은 경우가 많으므로 스타일, 코딩 지침 및 품질 보증 문제로 A와 같은 3 가지 문자를 사용하지 않아야합니다. 한 곳. OTOH, 자유를 사랑하는 사람이기 때문에 누군가가 남용을 당할 가능성이 확실하지 않기 때문에 무언가를 금지하는 것을 싫어합니다.
Ingo

나는 프로그램이 사람이 읽을 수있는 형식으로 또는 통일 된 텍스트 파일로 제한되지 않는 형식으로 입력되어야한다고 생각하는 경향이 있다고 생각합니다 (그러나 선으로 연결된 상태, 사물에 첨부 된 주석이 포함될 수 있음) 등). 나는 "당신이 보는 것이 (적어도 의미 론적으로는 무엇이 있는지)"라는 것을 아는 것에는 상당한 가치가 있다고 생각하며, 다른 프로그램은 다르게 보일 것이라고 생각합니다 . 근접한 범위의 식별자에 가깝지만 일치하지 않는 식별자의 사용을 금지하는 표준이 있다면 도움이 될 수 있습니다.
supercat

4

문자열과 주석에 유니 코드 문자를 허용하는 것이 합리적이라고 생각합니다. 어쨌든 렉서 & 파서가 유니 코드를 지원해야한다면 컴파일러 라이터는 식별자에서 유니 코드 문자 지원을 무료로 얻을 수 있으므로 식별자에 ASCII 문자 만 허용하는 것은 임의의 제한처럼 보일 것입니다.


8
실제로는 아닙니다. 문자열 리터럴에서 비 ASCII 문자는 불투명으로 처리 될 수 있습니다. 식별자를 사용하면 어떤 문자가 유효한지, 문자를 정규화할지 여부를 결정해야합니다 (예 : ? vár와 동일 vár)
dan04

4

내가 아는 한 이것은 순수한 마케팅 상의 이유입니다. 또한 우리의 삶이 더 어려워 질 수 있습니다.

마케팅 논증

대부분의 언어가 자랑하는이 미친 기능 목록을 알고 있습니까? 그것은 언어와는 거리가 멀기 때문에 일반적으로 거의 쓸모가 없습니다. 특정에 대한 많은 정보를 제공하지는 않지만 틱과 십자가로 테이블을 빠르게 드레싱하고 X가 Y보다 많은 틱을 가지고 있기 때문에 합리적으로 결론을 내릴 수 있습니다. 나아지 다.

식별자에 대한 유니 코드 지원은 이러한 행 중 하나입니다. Lambda 지원, 일반 프로그래밍 지원 등과 비교할 때 중요하지는 않습니다. 테이블을 그리는 사람들은 각 라인의 품질에 신경 쓰지 않고 그 수에 대해서만 신경 쓰지 않습니다.

따라서 그들은 "아, 당신은 당신의 식별자를 유니 코드로 지원하지 않습니다! X에서는 우리는 학생들에게 훨씬 더 쉽습니다!"라고 자랑 할 수 있습니다.

접근성의 오류

불행히도, 접근성에 대한 주장은 틀렸다.

오, 나는 "diceThrowResult"(예 : 프랑스어) 대신 "résultatDuJetDeDé"를 쓸 수 있다는 것이 단기적으로는 승리처럼 보일 수 있다는 것을 이해합니다. 그러나 단점이 있습니다!

프로그래밍은 의사 소통에 관한 것입니다

귀하의 프로그램은 컴파일러를위한 것일뿐 아니라 (사용하는 식별자에 대해서는 덜 신경 쓸 수있는) 동료를위한 것이기도합니다. 그들은 그것을 읽고 이해할 수 있어야합니다.

  • 읽은 문자는 사용 된 문자를 시각화 할 수 있음을 의미하며 모든 글꼴에서 유니 코드를 잘 지원하지는 않습니다.
  • 그것을 이해한다는 것은 식별자에 의존한다는 것을 의미합니다-주석을 보충하지 않으면 DRY 규칙을 위반하는 것입니다.

물론, 당신의 반 친구는 당신이하는 것과 같은 언어를 말할 수 있습니다. 갑자기 도움이 필요합니다. 인터넷은 훌륭합니다. 해결책을 아는 수천만 명의 사람들과 대화 할 수 있습니다. 그들은 질문을 이해 한 경우에만 답변을합니다. 그리고 뿐만 아니라 자신의 대답을 이해할 필요가있다.

프로그래밍에는 이해가 필요합니다

손쉬운 사용과 시작을 위해서는 라이브러리를 기반으로해야 할 일이 많습니다. 첫 번째 작업에서 IO 레이어를 다시 작성하여 콘솔에서 읽거나 쓰지 않으려는 경우.

  • 이 라이브러리는 어떤 언어로 작성됩니까?
  • 해당 라이브러리는 어떤 언어로 문서화되어 있습니까?

Morrocan Arabic에 대답하면 놀랄 것입니다.

당신은 단지 강의에 의존하지 않는 당신에게 도움이, 모든 라이브러리 기능에 대한 출석 포괄적 인 문서 당신은, 당신은 사용 (그리고 아마도 번역 라이브러리)에 필요 합니다 영어의 modicrum을 배울 수있다. 그러나 어쨌든이 프로그래밍 과정을 시작하기 오래 전에 이미 시도했을 것입니다.

영어는 ...

... 프로그래머 (및 대부분의 과학자)의 링구아 프랑카.

빨리 그것을 인정하고 그것에 맞서 싸우기보다는 그것과 함께 갈수록, 빨리 배우고 발전 할 수 있습니다.

일부 사람들은 필연적으로이 문제에 반대하여 모국어를 구사할 권리를 옹호하지만 바벨이 보여 주듯이 언어가 많을수록 의사 소통이 어려워집니다.

아직도...

예, 계속해서 논쟁의 여지가 있지만, 일부 유니 코드 지원 (주로 기호)은 수학 또는 물리 공식을 코드로 변환해야하는 사람들이 이해를 크게 쉽게 해줄 수 있습니다. 일부 심볼에 과부하가 걸린다는 단점이 있지만 여전히 도움이 될 수 있습니다.

왜 ?

말했듯이, 마케팅 주장에 관한 것만 큼 사용자 편의에 관한 것이 아닙니다. 파서는 이미 문자열과 주석에 대해 유니 코드를 인식하므로 어쨌든 쉽게 죽을 수 있습니다.

그리고 특정 사용자에게는 이점이있을 수 있습니다.

그러나 나는 개인적으로 영어 식별자로 작성된 코드만을 다룰 것입니다. 코드 조각에 대한 도움이 필요하거나 라이브러리가 멋지고 그것을 사용하여 많은 것을 얻을 수 있는지 상관하지 않습니다. 이해할 수 없으면 무시해야합니다.


그래서 당신은 역사적 사실을 기꺼이 구사할 수있는 사람들 중 한 사람입니다 (강세의 부족을 용서하십시오.
Milind R

@MilindR : 저는 모두가 같은 언어를 사용한다면 세상이 더 좋은 곳이 될 것이라고 생각하는 사람들 중 하나입니다. 프랑스어에도 불구하고 그 역할에 대해 영어를 고려할만큼 실용적입니다. 유니 코드의 하위 집합이 일반적으로 도움이 될 수 있다고 확신 할 수 있습니다 (그리스 문자, 수학 / 물리학). 본인은 프로그래밍을 가르치기 위해 학생이 자신의 언어로 식별자를 표현할 수있는 프로그래밍 언어가 도움이된다는 것을 이해합니다. 그러나 모든 언어가 완전한 유니 코드 식별자를 지원할 필요는 없습니다. 그것은 내 개인적인 의견입니다, 당신이 뭘 할 것인지를 결정하십시오 :)
Matthieu M.

3

중국어 키보드에서 ASCII 식별자를 어떻게 입력 하시겠습니까? 몇 가지 언어 키워드는 한 가지 일이며, 그런 식으로 전체 코드를 수행해야하는 것도 다른 일입니다.

프로그래머는 원하는대로 변수를 호출 할 수있는 권리와 능력을 가져야합니다. 어떤 언어를 사용하든 비즈니스가 아닙니다.

그렇게 그들에 다른 사람의 언어의 기호가 식별자 코드를 읽고 혼란을 느끼는 경우에, 나는 당신이 정확히 혼동 방법을 알고있어 그들이 그들이에서 기호 식별자를 사용해야 할 때 느끼는 당신 의 언어.


4
"러시아어"키보드를 사용하여이 메시지를 입력하고 있습니다. 나는 중국어 키보드 (인터넷 검색 한 goo.gl/U1q0m을 ) 내가 정말 러시아의 한 (어떤 차이가 표시되지 않습니다 goo.gl/af04R을 ). 그런데 둘 다 기본 레이아웃과 함께 라틴 레이아웃을 가지고 있습니다.
Egor Tensin

2
Cyrillic을 사용하여 식별자를 사용한다고 가정 해 봅시다. 그러나 내 코드를 유지 관리하는 중국어는 어떻습니까? 그는 라틴 문자에 익숙하지만 이제 완전히 다른 문자 집합을 처리하도록 만들어졌습니다! 아랍어 화려한 글자 등은 말할 것도 없습니다.
Egor Tensin

2
세 번째 단락은 영어 만 사용하는 정확한 이유입니다.
Anton Barkovsky

9
@ 에고 르 : 이것이 팀이나 프로젝트 관리자가 규칙을 만드는 이유입니다. 그러나 언어 나 구현이 언어를 시행 할 이유는 없습니다. 팀이나 회사는 항상 식별자를 더 제한하도록 선택할 수 있으며 사용 가능한 세트를 확장하도록 선택할 수 없습니다. 그렇기 때문에 원본 세트는 가능한 한 커야합니다.
DeadMG

3
"중국어 키보드에서 ASCII 식별자를 어떻게 입력 하시겠습니까?" -실제로 영어 키보드와 동일합니다. 당신은 나쁜 예를 선택했습니다. 중국어 (및 일본어)는 일반적으로 발음을 설명하는 영어 문자로 입력 된 후 기본값이 올바르지 않은 경우 사용자가 올바른 것을 선택할 수있는 일치하는 중국어 / 일본어 목록이 표시됩니다 (현대 시스템은 컨텍스트 분석을 사용하여이를 확인합니다). 보통)입니다.
Michael Borgwardt

2

PEP 3131-2007 년에 발표 된 비 ASCII 식별자 지원 에 따르면 , 근거의 첫 부분은 다음과 같습니다.

파이썬 코드는 영어에 익숙하지 않거나 라틴어 쓰기 시스템에 익숙하지 않은 세계의 많은 사람들이 작성합니다. 그러한 개발자들은 종종 이름을 짓고 자하는 개념을 (종종 잘못된) 영어 번역으로 만들지 않고 모국어로 된 이름으로 클래스와 함수를 정의하기를 원합니다. 자국어로 식별자를 사용함으로써, 그 언어의 화자 사이에서 코드의 명확성 및 코드의 유지 관리 성이 향상된다.

아직 다른 언어를 조사하지는 않았지만 지원을 추가 한 이유 중 하나 여야합니다.


1

만약 컴파일러가 유니 코드를 지원 하지 않는다면 실제로는 우리의 삶을 더 쉽게 만들어 줄 것 입니다. 오른쪽에서 왼쪽으로 식별자가 끔찍합니다. 결합 된 로마자 알파벳과 오른쪽에서 왼쪽으로 유니 코드 식별자는 훨씬 더 나쁩니다.

지원되지 않는 것에 대한 나쁜 점은 특정 GUI 마법사가 항목에 넣은 텍스트를 가져와 해당 텍스트를 항목의 식별자로 자동 사용한다는 것입니다. 그렇다면 해당 항목에서 유니 코드 텍스트로 정확히 무엇을할까요? 쉬운 대답은 없습니다.

유니 코드 오른쪽에서 왼쪽으로 쓰는 주석도 재미있을 수 있습니다. 예를 들어, VS 2010에서 XML 주석은 코드에서 RTL로 (올바로) 표시되지만 ... Intellisense를 사용하여 코드의 다른 곳에서 식별자를 가져 오면 툴팁에 LTR이 (올바르게) 표시됩니다. 처음에 지원이 없다면 더 좋을 것입니다. 다시는 쉬운 전화가 아닙니다.

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