시길은 소스 코드를보다 쉽게 ​​읽을 수있게합니까?


13

대부분의 프로그래밍 언어에서 변수에는 PHP에서와 같이 식별 문자가 없습니다. PHP에서는 $문자 앞에 변수를 접두어로 붙여야합니다 .

예;

 var $foo = "something";
 echo $foo;

비즈니스 응용 프로그램을위한 새로운 스크립팅 언어를 개발 중이며 대상 사용자에게 프로그래밍 배경이 없습니다. 이 문자들은 코드를 읽고 사용하기 쉽게합니까?

PHP가 사용하는 한 가지 이유는 $그것이 없으면 PHP가 이름이 함수 참조인지 변수 참조인지 알 수 없기 때문입니다. 언어가 함수에 대한 이상한 참조를 허용하기 때문입니다. 따라서이 $기호는 파서가 네임 스페이스를 분리하는 데 도움이됩니다.

파서 에이 문제가 없습니다. 그래서 내 질문은 순전히 가독성과 사용 편의성에 관한 것입니다. 나는 수년 동안 PHP로 코딩하여 이것을 볼 때 $foo변수로 쉽게 식별 할 수 있습니다. 이 식별자에 대한 편견을 선호합니까?


19
IMO, 코드는시길없이 더 읽기 쉽다
John Dvorak

6
나에게 오늘의 새로운 단어를 줘서 @JanDvorak +1. 나는 sigils오늘 대화에서 세 번 사용하려고합니다 .
Reactgular

6
IMO 편집기에 구문 강조가 있는지 여부에 따라 다릅니다.
CodeBeard

5
당신이 사용한다면 var $x = ...또는 type $x = ...$는 과잉이라고 생각합니다. 방금 가지고 있다면 할 $x = ...가치가 있습니다. 특히 일반적인 편집기에서 구문 강조를 지원하지 않으려는 경우. 그러나 선호하는 점은 마음에 들지 않습니다sigils
CodeBeard

5
시길은 강제 헝가리 표기법과 같습니다
래칫 괴물

답변:


13

실제 기술 가능성과 한계는이 글에서 제안 된 것과는 전혀 다릅니다. 먼저 정리해 봅시다.

PHP에서 $가 가능한 것은 다음과 같습니다.

  • 변수 변수
  • 키워드 이름이 $return있거나 변수에 동일한 이름을 사용할 수있는 변수 및 기능 / 일정한 변수$__FILE__

$ 접두사와 관련이없는 제한 또는 기능 :

  • 그렇지 않으면 구현은 함수와 변수의 차이를 알 수 없습니다
  • PHP 문자열 보간 또는 템플릿 구문
  • 필수 변수 선언

그것은 당신이 가질 수 없었던 기술적 이유가 없다는 것을 의미합니다

foo = "something";
echo foo;

또는

foo = "something";
echo "foo = $foo";
//would print
//foo = something 

그러나 당신은 가질 수 없습니다 ( return키워드 라고 가정 )

return = "something";

심각한 합병증없이. 와 같은 접두사를 사용했다면 $아무런 문제가 없었을 것입니다.

그것은 의견이지만 나는 프로그래머가 아닌 사람들에게 키워드를 변수 이름으로 사용할 수 있기 때문에시길이 가치가 있다고 생각합니다. 그렇지 않으면 임의의 제한처럼 보일 것입니다 : P


에 대해 return = "something";C #에는 "컨텍스트 키워드"가 있으며 이는 언어를 디자인 할 때 확인할 가치가있는 옵션입니다.
luiscubal

1
@luiscubal C #에서 놀랍게도시길이 필요하므로 코드를 컴파일하려면을 작성해야합니다 @return = "something;". 문맥 키워드는 다소 있지만, 문맥 키워드로 작성하면 구현이 훨씬 더 복잡해집니다.
Esailija

7

Sigils는 실제로 특정 유형의 유형 검사를 제공하는 perl에서 훨씬 더 의미가 있습니다. PHP에서는 템플릿 외부에서 많이 도움이되지 않습니다. 다른 언어를 살펴보면 유용성과 가독성을 얻을 수 있습니다. 거의 사용하지 않습니다.

작업중 인 최종 사용자 대상 언어에서 식별자를 대소 문자를 구분하지 않고 공백과 아포스트로피를 허용하도록 추가로 진행합니다. 이를 통해 Karl's height자연어에 훨씬 가까운 변수 이름을 만들 수 있습니다.


1
변수의 공백은 +1이지만 구현 방법을 모릅니다. 읽기가 더 쉽다는 것을 확신하지 못합니다. 나는 그것에 익숙하지 않다.
Reactgular

1
나는 그 아이디어를 좋아한다. 그러나 식별자에 공백이있는 언어의 파서를 작성하는 것을 싫어합니다. :-)At Karl's for the night = true;
Martin York

그러나 우리가 읽을 수 있도록 언어의 최상위에 추가 한 모든 표준을 보는 것이 흥미로울 것입니다. 외부 도구에 의해 수동으로 확인되지 않고 언어 정의의 일부가됩니다. 그렇게하면 코딩 표준의 식별자 이름에 대한 무의미한 주장을 할 수 없습니다 (언어와 마찬가지로).
Martin York

2
그러나 대소 문자를 구분하지 않으면 국제화 문제가 있습니다. 여러 언어의 문자를 허용하면 일부 로케일에서는 "동일한"이름을 사용할 수 있지만 다른 언어에서는 그렇지 않을 수 있습니다.
luiscubal

1
변수에 공백을 허용하는 것은 원칙적으로 큰 문제가 아니며 여러 단어를 허용하는 식별자에 대한 문법 규칙을 의미합니다. 그러나 이는 모호성을 만들지 않으면 서 문법에서 다른 것이 불가능할 수도 있음을 의미합니다. 예를 들어, Haskell에서 map sum부분적으로 적용되는 함수 호출입니다.이 함수 sum는에 매개 변수로 전달됩니다 map. 그러나 둘 다 라이브러리 이름이므로 다중 단어 식별자를 사용하면 컴파일러 map sum는 하나의 다중 단어 식별자 또는 두 개의 단일 단어 식별자를 기반으로하는 함수 응용 프로그램 인지 알 수 없습니다 .
Steve314

7

몇 년 전, 저는 Applesoft Basic을 배웠습니다. 문자열은 항상 접미사가 붙고 $배열의 접미사는 %입니다. 그것이 언어가 작동하는 방식입니다. 당신은 무언가를 보았고 그것이 무엇인지 알았습니다. 나는 이것이 왜 그런지 또는 그 결정을 내리게 한 디자인 결정을 이해하기 위해 해석기에 너무 깊이 파고 들지 않았습니다.


PHP의시길은 펄의 영향 ( awk및에 의해 영향을 받음 sh) 에서 비롯됩니다 . 펄의시길은 $많은 다른 유형을 식별 할 수있는 것보다 훨씬 더 많습니다 .

  • $ 스칼라
  • @ 명부
  • % 해시시
  • & 코드 블록
  • * 타입 글로브

시길은보고있는 심볼 테이블 구조의 어떤 부분을 식별합니다. 무대 뒤에서 foo의 기호 테이블 항목 ( *footypeglob 를 통해 액세스 )에는 foo 일 수있는 모든 것이 있습니다. 이 $foo, @foo, %foo형식 foo , &foo, 파일 핸들 foo는, 등 ...

또한 한 변수의 별칭을 다른 변수의 별칭으로 만들 수 있습니다.

#!/usr/bin/perl

$foo = "foo";
@qux = (1,2);
*bar = \$foo;
*bar = \@qux;

print "$bar @bar\n";

이것은 인쇄합니다 foo 1 2-펄로, 이것은시길이 실제로 하는 것입니다. 당신이 이것을 해야하는 것이 아니라 오히려 그들이하는 장면 뒤에 있습니다.

sigils는 가독성을 위해 너무 많은 존재하지 않고, 그래서 하나가 가질 수 $foo@foo네임 스페이스에서 충돌을하지 않고는 (하나는 모두를 가질 수 없습니다 경우 다른 언어를 비교 int foo; int[] foo;)


가독성을위한시길은 모든 언어의 일부로 학습되는 것으로 구문을 읽는 것입니다. 가설 적으로 유형 자체 (헝가리어 표기법)를 식별자의 일부로 적용 할 수 있습니다.

lex의 내용은 다음과 같습니다.

typeChar  [is]
capLetter [A-Z]
letter    [a-z]
digit     [0-9]
%%
{typeChar}{capLetter}(letter}|{digit})* { prientif("iddentifier");}
%%

그리고 당신은 같은 코드를 가질 수 있습니다

iFoo = 42;
sFoo = "a string";
iBar = iFoo * 2;

나는 이것이 좋은 생각이라고 말하지는 않지만 언어에 익숙한 사람은 이것을 기본적으로 읽을 수 있고 언어에 익숙하지 않은 사람은 가독성을 향상시킬 것이라고 생각하지만 언어에 익숙하지 않은 사람은 단지 언어에 많은 소음.

그러나이 방법으로 정의 된 언어로 작업 한 후에는 문제없이 읽을 수 있습니다.

어떤 사람들은 좋아하지만 어떤 사람들은 그렇지 않습니다. 이것을 토론하는 여러 포럼에서 큰 성전이 벌어졌으며 실제로는 얼마나 많이 사용했는지에 달려 있습니다.

시길을 사용하는 프로그래머가 아닌 사람들을 위해 새로운 언어를 설계 할 수 있으며 이전에 프로그래밍을 한 적이없는 사람은 그에 대해 조금도 불평하지 않을 것입니다. 반면에 언어의 일부로 사용할 수는 없으며 루비 또는 펄 프로그래머가 핵심 정보가 누락되었다고 불평하게합니다.

정말 중요하지 않습니다. 중요한 것은시길이 언어를 사용하거나 사용하지 않을 때 언어에 어떻게 적용되는지입니다. 할 수 있기를 원합니까 "123 $foo 456"아니면해야합니까 "123 " + foo + " 456"? 여기서 결정을 내려야합니다.


1
"123 $foo 456"시길 접두사에 의해 활성화되지 않고 문자열 과 직교하는 문자열 보간 .
Esailija

1
변수 보간의 일부이며 문자열을 구문 분석하는 방법에 따라 다릅니다. Sigils 만들 수 있습니다 쉽게 (같이가 다른 방법을 수행 할 수 있습니다 자바 스크립트 변수 보간을 수행하는 가장 좋은 방법은? 하지만 그건 Sigils는, 틀림없이 쓰기에 훨씬 더 쉽게 만들고 이것을 이해 핵심 언어의 일부가 아닙니다..

1
@MichaelT 아니요, 변수에 접두사가 있다는 사실은 문자열 보간을 더 쉽게 또는 더 어렵게 만들지 않습니다. 그들은 완전히 관련이없는 2 가지 일뿐입니다. 인간 독자 에게는 변수 접두사에 이미 사용 된 $asd경우 문자열 보간 구문에 $사용하는 것이 좋았지 만, 실제로 문자열 보간을 구현할 수는 없었습니다.
Esailija

2
@ Esailija 어떻게 관련이 없는지 설명 할 수 있습니까? 그 외에도 en.wikipedia.org/wiki/Variable_interpolation- "변수 보간을 지원하는 언어에는 Perl, PHP, Ruby, Tcl, Groovy 및 대부분의 Unix 쉘이 포함됩니다. 이러한 언어에서 변수 보간은 문자열 리터럴이 변수는이 언어에서시길 (일반적으로 "$")로 시작하므로 변수가 인식됩니다. "

@MichaelT 변수 접두사와 문자열 보간에 사용되는 달러 기호는 완전히 피상적 인 선택입니다 (구현과 관련이없는 가독성 인수 만 가지고 있습니다 #. 예를 들어 coffeescript와 같이 사용됩니다) 변수 #-실제로 변수를 접두사로 사용하지 않습니다)
Esailija

3

PHP가 $를 사용하여 func와 vars를 다르게한다는 것에 동의하지 않습니다. 적어도 PHP는 C와 같은 구문을 가지고 있기 때문에 funcs ()는 이름 뒤에 parens를 가지고 있습니다.

왜 $가 PHP에 있는지 에 대한 스택 오버플로 에서이 게시물을 읽으십시오 .

C, C ++, C #, Java와 같은 많은 인기있는 언어는 $를 사용하지 않으며 함수와 쉽게 다른 변수를 사용할 수 있습니다.

예를 들어 PHP $에서는 다음과 같이 쓸 때 도움이됩니다. echo "var = $ var"

$가 없으면 그러한 트릭은 불가능합니다.


+1 아 더 이해가됩니다. 감사.
Reactgular

3
sigils가있는 언어는 다음과 같이 문자열 보간이있는 것과 관련이 없습니다.echo "var = $var"

4
-1. PHP 구문 문제는 실제 제한으로 인한 것이 아니라 문법 규칙이 완전히 설계되지 않은 경우 설계가 잘못되어 있기 때문입니다. 그렇기 때문에 fn()[]합리적인 문법으로 생각할 필요없이 즉시 사용할 수 있는 해킹이 필요 합니다.
Esailija

@svidgen 예. 문자열의 어떤 부분이 변수에 매핑되어야하는지 나타내는 방법이 없으면 문자열 보간을 안전하게 수행 할 수 없습니다. 다른 언어는 무엇으로 끝낼 내가 파이썬의 문자열 포맷과 같은 성가신 / 불필요한 상세,이라고 생각. 그러나 PHP에는 다른 장점도 있습니다. RuslanZasukhin은 함수가 참조로 전달 될 수 있기 때문에 함수가 항상 괄호로 표시된다는 말이 잘못되었습니다.
이즈 카타

@Izkata 언어에서 변수를 사용하는 방법은 문자열 보간 구문과 아무 관련이 없습니다. 그러나 이것은이 답변에서 암시되었으므로 -1 ...
Esailija

3

이 모든 대답을 마친 후, 나는 Mathew Foscarini에게 더 많은 포인트를주고 싶습니다.

  • 이제 문제를 "언어 생성자"로 간주합니다. 다른 언어에 왜이 기능이 있거나 자신의 언어로 무언가를 사용할 것인지 선택하는 기능을 이해하려고 노력하십시오. Valentina 데이터베이스에 대한 SQL 파서를 개발하기 때문에 몇 년 동안 같은 위치에 있습니다.
  • antlr.org를보고 Terence의 책을 읽어 보라고 조언합니다. 언어 개발자에게 좋은 점이 많이 있습니다.
  • 나는 여전히 다른 답변에 노출 된 "이유"에 동의하지 않습니다. 그들은 PHP 작성자가 예약 키워드를 사용하고 변수와 비 변수를 더 잘 구별하기 위해 $를 사용하기로 결정했다고 가정합니다. 나는 그렇게 생각하지 않습니다 ... 비록 자신만의 이야기 일 수 있습니다.
  • 아마도 그들은 단지 펄과 더 초기의 언어를 따라갈 것입니다. Terrence에 밑줄을 긋는 것처럼 대부분의 언어는 특히 LEXER 부분에서 비슷합니다. 그리고 일반적으로 새로운 언어의 생성자는 그가 개발할 언어의 종류를 선택한 다음 해당 언어 문법을 선택합니다. 그리고 이것이 지금해야 할 일입니다. 처음부터 발명 할 필요가 없습니다. 그리고 PHP 저자들도 마찬가지였습니다.
  • 사람들이 언급 한 다른 모든 것 :
    • 변수와 비 변수를 구별
    • 단어를 변수 이름으로 복원
    • 문자열 내부에 변수를 배치하는 기능
    • 그렇지 않을 수도 있습니다 (PHP 전문가는 아닙니다)

아르 이 LEXER의 부작용 이 토큰을 인식 할 수 있기 때문이다.

예를 들어, SQL에서 ""를 사용하여 예약어가있는 식별자와 공백이 "이름", "그룹 이름"인 식별자를 사용할 수 있습니다. GROUP은 키워드입니다. 문제가있었습니다-특별한 해결책이있었습니다.

PS MichaelT의 매우 좋은 의견.


훌륭한 링크에 감사드립니다. 나는 이것을 사용했지만 결국 링크가 훨씬 좋아 보입니다. goldparser.org
Reactgular

귀하의 링크에 대해서도 감사합니다. 나는이 금 파서를 한 번도 보지 못했습니다. 흥미로운 것 같습니다.
Ruslan Zasukhin

@RuslanZasukhin 내 답변을 참조하는 경우 키워드를 사용하려는 것이 개발자의 의도라고 말한 적이 없습니다. 변수 앞에 접두사를 붙일 때 키워드를 변수 이름으로 사용하는 것이 기술적으로 가능하다고 말했다 $. 또한 "문자열 안에 변수를 배치 할 수있는 기능" 은 변수 앞에 접두사가 붙기 때문이 아닙니다 $. 즉, "123 $foo 456"변수 구문이 foo = 3또는 과 같더라도 작동합니다 @foo = 3. 그들은 서로 관련이 없습니다.
Esailija

3

...시길은 다음을 허용합니다.

  • 변수와 변수를 더 잘 구별하십시오 . 여전히 기본 개념을 배우는 사람들은 어떤 단어가 변수이고 어떤 단어가 아닌지 알아내는 데 어려움을 겪을 수 있습니다. 그들은 종종 적절한 배경이없는 예제 나 다른 사람들의 코드를 읽는 것으로 시작합니다.

  • 예약 키워드 또는 함수 이름변수 이름 으로 사용하십시오 . 때때로 나는 그 이름 중 일부가 변수에 대한 올바른 이름이라는 것을 알았습니다 (즉 함수가 정의 된 $count동안 count()).

또한 함수의 결과를 버리기 변수로 유지하기 위해 함수 이름을 자주 재사용 합니다.

$isdir=isdir($dir);

if(/* complex condition implying $isdir */) {
/* etc */
}


1
ZHR, 더 나은 의미는 무엇입니까? C ++에서는 모든 변수를 $없이 작성하고 완벽하고 쉽게 구별 할 수 있습니다. 예 : {int z = 0; z = 55; z (z); } 그리고 C ++에서는 함수에 대한 포인터와 같이 할당이 필요한 경우 함수 이름을 사용할 수도 있습니다.
Ruslan Zasukhin

@RuslanZasukhin, 컴퓨터 문맹, 당신은 몇 가지를 알고 있습니까? 그들에게 C ++를 가르치면 놀랄 것이다.
ZJR

또한 : 나는시길이 항상 $표시 되어야한다고 생각하지 않습니다 . 나는 본질적으로 돈을 연결했기 때문에 내가 어렸을 때 혼란스러운 달러 기호를 기억합니다. %가능한 대안이 될 수 있습니다.
ZJR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.