Os sigilos facilitam a leitura do código-fonte?


13

Na maioria das linguagens de programação, as variáveis ​​não possuem caracteres de identificação como no PHP. No PHP, você deve prefixar uma variável com o $caractere.

Exemplo;

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

Estou desenvolvendo uma nova linguagem de script para um aplicativo de negócios, e meus usuários de destino não têm experiência em programação. Esses caracteres facilitam a leitura e o uso do código?

Uma razão pela qual o PHP usa o $é porque, sem ele, o PHP não pode dizer se um nome é uma referência de função ou referência de variável. Isso ocorre porque o idioma permite referências estranhas a funções. Portanto, o $símbolo ajuda o analisador a separar o espaço para nome.

Eu não tenho esse problema no meu analisador. Portanto, minha pergunta é puramente sobre legibilidade e facilidade de uso. Eu tenho codificado por tantos anos em PHP que, quando vejo $foo, é fácil para mim identificar isso como uma variável. Estou apenas dando uma preferência de viés a esse identificador?


19
IMO, o código é mais legível, sem sigilos
John Dvorak

6
@JanDvorak +1 por me dar uma nova palavra do dia. Vou tentar usar sigilstrês vezes hoje em conversas.
Reactgular 17/08/13

6
IMO Depende se o seu editor tiver destaque de sintaxe.
CodeBeard

5
Se você usa var $x = ...ou type $x = ...então acho que $ é um exagero. Se você tivesse, $x = ...então poderia valer a pena. Especialmente se você não deseja dar suporte ao realce de sintaxe em editores comuns. No entanto, como uma preferência, eu não gostosigils
CodeBeard

5
sigilos são como um húngaro notação aplicadas
aberração catraca

Respostas:


13

As reais possibilidades e limitações técnicas não são do tipo sugerido ao longo deste segmento. Vamos esclarecer aqueles primeiro.

Aqui está o que $ está possibilitando no PHP:

  • Variáveis ​​variáveis
  • Variáveis ​​com nome de palavra-chave, por exemplo, $returnou poder usar o mesmo nome para uma variável e uma função / constante, por exemplo$__FILE__

Limitações ou recursos não relacionados ao prefixo $:

  • Caso contrário, a implementação não pode diferenciar funções e variáveis
  • Interpolação de string PHP ou sintaxe do modelo
  • Declaração de variável necessária

Isso significa que não há razão técnica que você não poderia ter

foo = "something";
echo foo;

ou

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

No entanto, você não pode ter (supondo que returnseja uma palavra-chave)

return = "something";

Sem complicações sérias. Se você usasse um prefixo como $, não haveria nenhum problema.

É uma opinião, mas acredito que um sigilo valeria a pena para não programadores, pois permite que eles usem palavras-chave como nomes de variáveis; para eles, de outra forma, seria uma limitação arbitrária: P


Sobre return = "something";, o C # possui "palavras-chave contextuais", que também é uma opção que vale a pena conferir ao criar idiomas.
precisa saber é o seguinte

1
@ Escrita fluiscubal que em C # requer um sigilo de maneira não surpreendente; portanto, se você deseja que esse código seja compilado, é necessário escrever @return = "something;". Existe alguma quantidade de palavras-chave contextuais, sim, mas torná-las contextuais significaria uma implementação muito mais complicada.
Esailija

7

Os sigilos realmente fazem muito mais sentido em perl, onde fornecem uma certa quantidade de verificação de tipo. No php, eles não ajudam muito fora do modelo. Você pode ter uma idéia de sua utilidade e legibilidade olhando em diferentes idiomas. Quase ninguém os usa.

Em uma linguagem direcionada ao usuário final em que estou trabalhando, vou ainda mais longe, tornando os identificadores sem distinção entre maiúsculas e minúsculas e permitindo espaços e apóstrofes. Isso me permite criar nomes de variáveis ​​assim Karl's heightmuito mais próximos das linguagens naturais.


1
+1 para espaços em variáveis, mas não faço ideia de como implementar isso. Não tenho certeza que eu acharia isso mais fácil de ler também. Eu simplesmente não estou acostumado a isso.
Reactgular

1
Eu gosto da ideia. Mas eu odiaria escrever o analisador para uma linguagem com espaço no identificador. :-)At Karl's for the night = true;
Martin York

Mas seria interessante ver todos esses padrões que adicionamos ao topo de um idioma para nos ajudar a lê-lo. Em vez de ser verificado manualmente por uma ferramenta externa, mas se tornar parte da definição de idioma. Dessa forma, não podemos ter argumentos inúteis sobre nomes de identificadores nos padrões de codificação (como estão no idioma).
Martin York

2
A insensibilidade ao caso tem o problema da internacionalização. Se você permitir caracteres de vários idiomas, poderá encontrar nomes "iguais" em alguns locais, mas não em outros.
luiscubal

1
Permitir espaço em branco nas variáveis ​​não é um grande problema em princípio - significa apenas uma regra gramatical para identificadores que permite várias palavras. No entanto, isso significa que outras coisas podem não ser possíveis na gramática sem criar ambiguidade. Por exemplo, em Haskell, map sumé uma chamada de função parcialmente aplicada - a função sumé passada como um parâmetro para map. Mas esses dois são apenas nomes de bibliotecas; portanto, com identificadores de várias palavras, o compilador não pode saber se map sumé um identificador de várias palavras ou um aplicativo de função baseado em dois identificadores de uma única palavra.
Steve314

7

Anos atrás, eu aprendi a Applesoft Basic. As strings sempre tinham o sufixo $e as matrizes tinham o sufixo %. É assim que a linguagem funcionou. Você olhou para algo, sabia o que era. Eu nunca mergulhei muito no intérprete para entender por que esse era o caso ou as decisões de design que o fizeram.


O sigil no php vem de sua influência perl (que foi influenciada por awke sh). O sigil no perl é um pouco mais do $que pode identificar muitos tipos diferentes:

  • $ escalar
  • @ Lista
  • % cerquilha
  • & codeblock
  • * typeglob

O sigilo identifica qual parte da estrutura da tabela de símbolos você está vendo. Nos bastidores, a entrada da tabela de símbolos para foo (acessada via *foo- o typeglob) tem tudo o que pode ser um foo. Há $foo, @foo, %foo, o formato foo , &fooo foo filehandle, etc ...

Isso também permite criar um alias de uma variável para outra:

#!/usr/bin/perl

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

print "$bar @bar\n";

Isto imprime foo 1 2- em perl, isso é o que os sigilos são realmente para, não que você deve fazer isso, mas sim que há esta por trás da cenas coisa que eles fazem.

Os sigilos não existem tanto para facilitar a leitura, mas para que se possa ter $fooe @foosem ter uma colisão no espaço para nome (compare outros idiomas onde não se pode ter os dois int foo; int[] foo;)


Sigilos para facilitar a leitura são algo que é aprendido como parte de qualquer idioma - lendo a sintaxe. Hipóteses, você pode impor o próprio tipo (como notação húngara) para fazer parte do identificador.

Algo no lex ao longo das linhas de:

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

E então você poderia ter código como

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

Não estou dizendo que essa é uma boa ideia, mas alguém que está acostumado ao idioma poderá lê-lo nativamente e pensar que ele aprimora a legibilidade, enquanto alguém que não está familiarizado com o idioma pode pensar que apenas acrescenta um monte de barulho para o idioma.

No entanto, depois de trabalhar com um idioma definido dessa maneira, eu provavelmente poderia lê-lo sem problemas.

Algumas pessoas gostam deles, outras não. Existem grandes guerras sagradas em vários fóruns debatendo isso e realmente se resume ao quanto você as usou.

Pode-se projetar uma nova linguagem para não-programadores que usa sigils e quem nunca programou antes nunca reclamará um pouco sobre eles. Por outro lado, você não pode tê-los como parte do idioma e, em seguida, os programadores de ruby ​​ou perl reclamam que estão perdendo algumas informações importantes.

Realmente não importa. O que importa é como os sigilos se encaixariam no idioma, se você os usar ou não. Você quer poder fazer "123 $foo 456"ou precisa fazer "123 " + foo + " 456"? É aqui que a decisão deve ser tomada.


1
A interpolação de cadeias, como "123 $foo 456"não é ativada pelo prefixo sigil e é completamente ortogonal a ela.
Esailija

1
É parte da interpolação de variáveis ​​e depende de como alguém analisa uma string. Os sigils podem facilitar isso (isso pode ser feito de outras maneiras, como mostrado pela Best way para interpolação de variáveis ​​em javascript - mas isso não faz parte da linguagem principal. Os sigils, sem dúvida, facilitam muito a escrever e entender isso.

1
@ MichaelT Não, o fato de as variáveis ​​terem prefixos não facilita ou dificulta a implementação da interpolação de strings. São apenas duas coisas completamente independentes. Para um leitor humano, poderia ter sido uma boa escolha usar $asdna sintaxe de interpolação de cadeias se $já fosse usada para prefixos de variáveis, mas não tinha nada a ver com a possibilidade real de implementar a interpolação de cadeias em primeiro lugar.
Esailija

2
@Esailija, você poderia descrever como eles não estão relacionados? Além disso, en.wikipedia.org/wiki/Variable_interpolation - "Os idiomas que suportam interpolação de variáveis ​​incluem Perl, PHP, Ruby, Tcl, Groovy e a maioria dos shells do Unix. Nesses idiomas, a interpolação de variáveis ​​ocorre apenas quando o literal da string é aspas duplas, mas não quando aspas simples. As variáveis ​​são reconhecidas porque as variáveis ​​começam com um sigilo (geralmente "$") nesses idiomas. "

@MichaelT O símbolo do dólar usado em prefixos de variáveis ​​e interpolação de strings é uma escolha completamente superficial (que possui apenas argumentos de legibilidade, não tem nada a ver com implementação, pode ser também o #que é usado no coffeescript, por exemplo. E coffeescript não prefixa variáveis com #- na verdade ele não prefixo variáveis em tudo)
Esailija

3

Não concordo que o PHP use $ para diferenciar vars de funcs. Pelo menos porque o PHP tem sintaxe do tipo C e funcs () parens após o nome.

Leia este post no stack overflow sobre por que $ está no PHP.

Muitas linguagens populares, como C, C ++, C #, Java, não usam $ e podemos diferenciar var fácil de função.

No PHP $ ajuda, por exemplo, quando você escreve: echo "var = $ var"

Sem $ esse truque será impossível.


+1 ah que faz mais sentido. Obrigado.
Reactgular

3
Uma linguagem ter sigilos não tem nada a ver com isso ter interpolação string como no seu exemplo deecho "var = $var"

4
-1. As peculiaridades da sintaxe do PHP não são causadas por alguma limitação real, mas porque as regras gramaticais são extremamente mal projetadas, se são projetadas. É por isso que eles precisam de hacks para habilitar fn()[]onde, com gramática sensata, que teria funcionado imediatamente, sem sequer pensar nisso.
Esailija

@svidgen Sim. Você não pode executar com segurança a interpolação de cadeias sem alguma maneira de indicar qual parte da cadeia deve mapear para uma variável. Outras linguagens terminam com o que considero verbos irritantes / desnecessários, como a formatação de strings do Python. No entanto, há outras vantagens também no PHP: RuslanZasukhin está incorreto ao dizer que as funções sempre serão indicadas com parênteses, pois também podem ser passadas como referências.
Izkata

@ Izkata A maneira como você usa variáveis ​​em um idioma não tem nada a ver com a sintaxe de interpolação de strings. Mas isso estava implícito nesta resposta, portanto ...
#

3

Depois de todas essas respostas, quero dar mais alguns pontos a Mathew Foscarini.

  • Você considera o problema agora como um "construtor de idiomas". Você tenta entender por que outro idioma tem esse ou aquele recurso para escolher se deseja usar algo em seu próprio idioma. Estou na mesma posição há muitos anos, porque desenvolvo um analisador SQL para o nosso banco de dados Valentina.
  • Aconselho que você dê uma olhada no antlr.org e até leia o livro de Terence. Tem muitas coisas boas para desenvolvedores de idiomas.
  • Ainda não concordo com "razões" expostas por outras respostas. Eles assumem que o autor do PHP decidiu decidir usar $ para poder usar palavras-chave reservadas e distinguir melhor variáveis ​​de não variáveis. Acho que não ... embora provar possa ser apenas a sua própria história.
  • Muito provavelmente eles seguem apenas idiomas perl e mais antigos. Como sublinha Terrence, a maioria dos idiomas é semelhante, especialmente na parte LEXER. E, geralmente, o construtor de uma nova linguagem pode simplesmente escolher que tipo de linguagem ele irá desenvolver e depois se dedicar mais à sua gramática. E é isso que você deve fazer agora. Não há necessidade de inventar do zero. E eu aposto que o mesmo fez autores PHP.
  • Tudo o mais que as pessoas mencionam:
    • distinguir variáveis ​​de não variáveis
    • reserver palavras como nomes de variáveis
    • capacidade de colocar variável dentro da string
    • pode ser outra coisa (não sou grande especialista em PHP)

são efeitos colaterais deste LEXER , porque é capaz de reconhecer um token.

Tomemos como exemplo: no SQL, usamos "" para poder usar identificadores com palavras reservadas e até identificadores com espaços "Primeiro Nome", "Nome do Grupo". GROUP é uma palavra-chave. Houve um problema - houve uma solução especial.

PS Muito bom comentário de MichaelT.


+1 obrigado pelo ótimo link. Acabei usando este, mas seu link parece muito melhor. goldparser.org
Reactgular

Obrigado também pelo seu link. Eu não vi esse analisador de ouro antes. Parece também interessante.
Ruslan Zasukhin 18/08/13

@RuslanZasukhin, se você estiver fazendo referência à minha resposta, nunca disse que era intenção do desenvolvedor habilitar palavras-chave. Eu disse apenas que o uso de palavras-chave como nomes de variáveis ​​se torna tecnicamente possível quando as variáveis ​​são prefixadas com um símbolo como $. Além disso, a "capacidade de colocar variável dentro da string" não se deve ao fato de as variáveis ​​serem prefixadas com um símbolo como $. Ou seja, "123 $foo 456"funcionará se a sintaxe da variável for semelhante foo = 3ou @foo = 3. Eles não estão relacionados um com o outro.
Esailija

3

... um sigilo permite:

  • Melhor distinguir variáveis ​​de não variáveis . As pessoas que ainda estão aprendendo conceitos básicos podem ter problemas para descobrir quais palavras são variáveis ​​e quais não. Eles geralmente começam lendo exemplos ou códigos de outras pessoas sem formação adequada.

  • Use palavras - chave reservadas ou nomes de funções como nomes de variáveis . Às vezes, eu achava que alguns desses nomes eram os corretos para uma variável (ou seja, $countenquanto havia uma count()função definida) e agradecia aos sigilos por me permitir usá-los.

Também acontece que eu reutilize esse nome de função frequentemente, para manter o resultado de uma função em uma variável descartável, por exemplo:

$isdir=isdir($dir);

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


1
ZHR, o que significa melhor? Em C ++, escrevemos todas as nossas variáveis ​​sem $ e as distinguimos de maneira fácil e perfeita. Exemplo: {int z = 0; z = 55; z (z); } E em C ++ também podemos usar o nome da função se precisar atribuir, por exemplo, ponteiro para a função.
Ruslan Zasukhin 18/08/13

@RuslanZasukhin, analfabetos do computador, você conhece algum? Tente ensiná-los C ++, você ficará surpreso.
ZJR 18/08

Além disso: não acho que um sigilo deva sempre ser um $sinal. Lembro-me do cifrão me confundindo quando eu era criança por causa de sua associação monetária inerente. %pode ser uma alternativa viável.
ZJR 18/08
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.