シギルはソースコードを読みやすくしますか?


13

ほとんどのプログラミング言語では、変数にはPHPのような識別文字がありません。PHPでは、変数の前に$文字を付ける必要があります。

例;

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

ビジネスアプリケーション用の新しいスクリプト言語を開発していますが、ターゲットユーザーにはプログラミングのバックグラウンドがありません。これらの文字はコードを読みやすく、使いやすくしますか?

PHPを使用する理由の1つは、$PHPがないと、名前が関数参照か変数参照かを判断できないためです。これは、言語が関数への奇妙な参照を許可しているためです。したがって、この$シンボルは、パーサーが名前空間を分離するのに役立ちます。

パーサーにはこの問題はありません。したがって、私の質問は読みやすさと使いやすさだけです。私はPHPで長年コーディングしてきたので、これを見る$fooと、これを変数として簡単に識別できます。私はこの識別子にバイアス設定を与えているだけですか?


19
IMO、コードはシギルなしで読みやすい
ジョンドヴォルザーク

6
@JanDvorak +1、今日の新しい言葉をくれた。sigils今日は会話で3回使用するようにします。
-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";

深刻な合併症なし。のようなプレフィックスを使用した場合$、問題はありませんでした。

それは意見ですが、シギルはプログラマー以外の人にとっては価値があると信じています。なぜなら、変数名としてキーワードを使用できるようになるからです。


についてreturn = "something";、C#には「コンテキストキーワード」があります。これは、言語を設計するときにチェックする価値のあるオプションです。
ルイスキューバル

1
@luiscubalはC#で驚くべきことにシギルを必要とするので、そのコードをコンパイルするには、を書く必要があります@return = "something;"。はい、ある程度のコンテキストキーワードがありますが、それらをすべてコンテキストキーワードにすると、実装がはるかに複雑になります。
エサイリヤ

7

実際、Sigilはperlでより意味があり、一定量の型チェックを提供します。PHPでは、テンプレート以外ではあまり役に立ちません。さまざまな言語を見てみると、その有用性と読みやすさを感じることができます。ほとんど使用しません。

私が取り組んでいるエンドユーザーターゲット言語では、さらに進んで、大文字と小文字を区別しない識別子を作成し、スペースとアポストロフィを許可します。これにより、そのような変数名Karl's heightを自然言語により近いものにすることができます。


1
変数内のスペースに対して+1ですが、それを実装する方法がわかりません。どちらが読みやすいかわかりません。私はそれに慣れていないだけです。
-Reactgular

1
私はそのアイデアが好きです。しかし、識別子にスペースを含む言語のパーサーを書くのは嫌です。:-)At Karl's for the night = true;
マーティンヨーク

しかし、読みやすくするために言語のトップに追加するこれらの標準をすべて見るのは面白いでしょう。外部ツールによって手動でチェックされるのではなく、言語定義の一部になります。そうすれば、コーディング標準で識別子名について無意味な議論をすることはできません(言語のように)。
マーティンヨーク

2
ただし、大文字と小文字を区別しないことには、国際化の問題があります。多くの言語の文字を許可すると、一部のロケールでは「同じ」名前になりますが、他のロケールではできません。
ルイスキューバル

1
変数に空白を許可することは原則として大したことではありません-それは単に複数の単語を許可する識別子の文法規則を意味します。ただし、曖昧さを生じさせない限り、文法では他のことは不可能かもしれません。たとえば、Haskellではmap sum、部分的に適用された関数呼び出しです。関数sumはにパラメーターとして渡されますmap。しかし、どちらも単なるライブラリ名であるため、マルチワード識別子では、コンパイラmap sumは1つのマルチワード識別子か、2つのシングルワード識別子に基づく関数アプリケーションかを知ることができませんでした。
Steve314

7

何年も前、私はApplesoft Basicを学びました。文字$列には常に接尾辞が付き、配列には接尾辞が付き%ます。それがまさに言語の仕組みです。あなたは何かを見て、それが何であるかを知っていました。なぜそうなのか、そうするようになった設計上の決定がなぜなのかを理解するために、私はインタープリターを深く掘り下げたことがありませんでした。


phpのシギルは、perlの影響(awkandの影響を受けたsh)から来ています。perlのシギルは、$多くの異なるタイプを識別することができるというだけではありません。

  • $ スカラー
  • @ リスト
  • % ハッシュ
  • & コードブロック
  • * タイプグロブ

シギルは、シンボルテーブル構造のどの部分を見ているかを識別します。舞台裏では、fooのシンボルテーブルエントリ(typeglob経由でアクセス*foo)には、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します-perlでは、これはシギルが本当に何のためにあるのですか、あなたがこれを行うべきではなく、むしろ彼らが行う舞台裏のものがあります。

読みやすさのためにシギルはあまりありませんが、名前空間で衝突$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;

これは良いアイデアだとは言いませんが、言語に慣れている人はネイティブでこれを読むことができ、読みやすさを向上させると思う一方で、言語に慣れていない人は追加するだけだと思う​​かもしれません言語へのノイズの束。

しかし、この方法で定義された言語で作業した後、おそらく問題なく読むことができました。

彼らが好きな人もいればそうでない人もいます。さまざまなフォーラムでこれを議論している偉大な聖戦があり、それは本当にあなたがそれらをどれだけ使ったかに要約されます。

シギルを使用する非プログラマ向けの新しい言語を設計できます。これまでプログラミングをしたことがない人は、シギルについて少しも文句を言うことはありません。一方、言語の一部としてそれらを使用することはできず、Rubyまたはperlのプログラマーは、いくつかの重要な情報を見逃していると不平を言うようになります。

本当に関係ありません。重要なのは、シギルを使用するかどうかにかかわらず、シギルがどのように言語に適合するかです。あなたができるようにしたいですか、"123 $foo 456"あなたがしなければなりません"123 " + foo + " 456"か?これは、決定が行われるべき場所です。


1
などの文字列補間"123 $foo 456"は、シギル接頭辞によって有効にされず、完全に直交します。
エサイリヤ

1
変数の補間の一部であり、文字列の解析方法に依存します。シギルは作ることができるより簡単(で示したように、それは他の方法を行うことができますJavaScriptで変数補間を行うための最善の方法?それはシギルは、間違いなく、書き込みがはるかに容易にし、これを理解コア言語の一部ではありません。。

1
@MichaelTいいえ、変数に接頭辞が付いているという事実は、文字列補間の実装を簡単にも難しくもしません。それらは、完全に無関係な2つのものにすぎません。人間の読者にとって、既に変数プレフィックスに使用されている$asd場合$は、文字列補間構文で使用するのが適切な選択かもしれませんが、そもそも文字列補間を実装する実際の可能性とは何の関係もありませんでした。
エサイリヤ

2
@Esailijaは、それらがどのように関連していないか説明できますか?余談ですが、en.wikipedia.org / wiki / Variable_interpolation から-「変数補間をサポートする言語には、Perl、PHP、Ruby、Tcl、Groovy、およびほとんどのUnixシェルが含まれます。これらの言語では、文字列リテラルがこれらの言語では、変数はシギル(通常は「$」)で始まるため、変数は認識されます。」

@MichaelT変数接頭辞と文字列補間で使用されるドル記号は完全に表面的な選択です(これは読みやすさの引数のみを持ち、実装に関係するもの#ではありません。変数#-実際には変数の接頭辞はありません)
エサイリージャ

3

PHPが$を使用してvarsとfuncsを区別することに同意しません。少なくともPHPにはCのような構文があり、funcs()には名前の後に括弧が付いているためです。

PHPに$が含まれている理由について、スタックオーバーフローに関するこの投稿をお読みください。

C、C ++、C#、Javaなどの多くの一般的な言語は$を使用せず、簡単な変数と関数を区別できます。

PHPでは、たとえば次のように書くと$が役立ちます。echo "var = $ var"

$がなければ、このようなトリックは不可能です。


+1ああ、もっと理にかなっています。ありがとう。
-Reactgular

3
シギルを持つ言語は、例のように文字列補間を持つこととは関係ありませんecho "var = $var"

4
-1。PHPの構文の癖は、実際の制限によるものではなく、文法ルールの設計が非常に不十分であるためです。これはfn()[]、賢明な文法のように、それについて考えさえしなくてもすぐに機能するハックを必要とする理由です。
エサイリヤ

@svidgenはい。文字列のどの部分が変数にマッピングされるかを示す何らかの方法がなければ、文字列補間を安全に行うことはできません。他の言語は、Pythonの文字列フォーマットのように、が迷惑な/不必要な冗長性と考えるものになります。ただし、PHPには他にも利点があります。RuslanZasukhinは、関数は常に括弧で示されると言っていますが、関数は参照として渡すこともできます。
イズカタ

@Izkata言語で変数を使用する方法は、文字列補間構文とは関係ありません。しかし、それはこの答えで暗示されていたため、-1
...-エサイリージャ

3

このすべての答えの後、マシュー・フォスカリーニにもう少しポイントを与えたいです。

  • ここで、問題を「言語コンストラクター」とみなします。自分の言語で何かを使用するかどうかを選択するために、別の言語にこの機能またはその機能がある理由を理解しようとします。Valentinaデータベース用のSQLパーサーを開発しているので、私は何年も同じ立場にいます。
  • antlr.orgをご覧になるか、Terenceの本を読むことをお勧めします。言語開発者にとっては素晴らしいものがたくさんあります。
  • 私はまだ、他の答えによって明らかにされた「理由」に同意しません。彼らは頭のPHPの作者が予約語を使用できるようにするために$を使用することを決定し、非変数から変数をよりよく区別すると仮定します。私はそうは思いません...証明は彼/彼ら自身の物語にしかならないかもしれませんが。
  • 最も可能性が高いのは、彼らがperlやより初期の言語に従っていることです。Terrenceを強調するように、特にLEXERの部分では、ほとんどの言語は類似しています。そして、通常、新しい言語のコンストラクターは、開発する言語の種類を選択し、その言語の文法のレクサーを取得することができます。そして、これはあなたが今すべきことです。ゼロから発明する必要はありません。そして、PHPの作者も同じだと思います。
  • 人々が言及する他のすべて:
    • 変数を非変数と区別する
    • 変数名として予約語
    • 文字列内に変数を配置する機能
    • 他の人かもしれません(私はPHPの専門家ではありません)

あるこのレクサーの副作用は、トークンを認識することができるので、。

例として考えてください。SQLでは、 ""を使用して、予約語を含む識別子と、スペース "First Name"、 "Group Name"を含む識別子を使用できます。GROUPはキーワードです。問題がありました-特別な解決策がありました。

PS MichaelTからの非常に良いコメント。


+1すばらしいリンクをありがとう。私はこれを使用することになりましたが、あなたのリンクはずっと良く見えます。goldparser.org
Reactgular

リンクもありがとうございます。このゴールドパーサーはこれまで見たことがありません。面白そうです。
ルスランザスヒン

@RuslanZasukhinあなたが私の答えに言及している場合、私はそれがキーワードを有効にすることを開発者の意図であると言ったことはありません。変数にのような記号を接頭辞として付けると、変数名としてキーワードを使用することが技術的に可能になるとだけ言いました$。また、「変数を文字列内に配置する能力」は、変数のような記号が接頭辞として付けられているためではありません$。つまり、"123 $foo 456"変数の構文は次のようであっても、場合に動作しますfoo = 3@foo = 3。それらは互いに関連していません。
エサイリヤ

3

...シギルは以下を可能にします:

  • 変数と非変数をより適切に区別します。まだ基本的な概念を学んでいる人々は、どの単語が変数であり、どの単語が変数でないかを理解するのに苦労するかもしれません。多くの場合、十分な背景のない例や他の人のコードを読むことから始めます。

  • 予約済みのキーワードまたは関数名変数名として使用します。時々、それらの名前のいくつかが変数に適切なものであるとわかり(つまり$countcount()関数が定義されている間)、それらを使用できるようにしてくれたシギルに感謝しました。

また、関数の結果をスローアウェイ変数に保持するために、関数名を頻繁に再利用しています

$isdir=isdir($dir);

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


1
ZHR、どういう意味ですか?C ++では、すべての変数を$なしで記述し、それらを完全かつ簡単に区別します。例:{int z = 0; z = 55; グーグー); また、C ++では、たとえば関数へのポインターなど、割り当てる必要がある場合は関数名を使用できます。
ルスランザスヒン

@RuslanZasukhin、コンピューター文盲、あなたはいくつか知っていますか?C ++を教えてみてください、あなたは驚くでしょう。
ZJR

また、シギルは常に$サインであるに違いないと思います。私は子供の頃、ドル記号がお金の連想のために混乱していたことを覚えています。%実行可能な代替案かもしれません。
ZJR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.