시길은 소스 코드를보다 쉽게 ​​읽을 수있게합니까? 변수에는 PHP에서와 같이 식별

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

예;

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

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

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

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



답변

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

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

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

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

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

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

foo = "something";
echo foo;

또는

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

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

return = "something";

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

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


답변

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

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


답변

몇 년 전, 저는 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"? 여기서 결정을 내려야합니다.


답변

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

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

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

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

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


답변

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

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

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

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

PS MichaelT의 매우 좋은 의견.


답변

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

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

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

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

$isdir=isdir($dir);

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


답변