As linguagens de programação devem ser rígidas ou soltas? [fechadas]


14

Em Python e JavaScript, ponto e vírgula é opcional.

No PHP, aspas em torno de chaves de matriz são opcionais ( $_GET[key]vs $_GET['key']), embora se você as omitir, procurará primeiro uma constante com esse nome. Também permite 2 estilos diferentes para blocos (delimitado por dois pontos ou chave).

Estou criando uma linguagem de programação agora e estou tentando decidir o quão rigoroso devo ser. Existem muitos casos em que caracteres extras não são realmente necessários e podem ser interpretados de maneira inequívoca devido a prioridades, mas estou me perguntando se ainda devo reforçá-los ou não para incentivar a consistência.

O que você acha?


Ok, minha linguagem não é tanto uma linguagem de programação quanto uma linguagem de modelagem sofisticada. Uma espécie de cruzamento entre os modelos Haml e Django . Era para ser usado com minha estrutura da web em C # e era muito extensível.


22
Este é um tópico para uma guerra santa.

1
Os pythonistas desencorajam o uso de ponto e vírgula. Francamente, não tenho certeza se eles são necessários - apenas para permitir várias declarações por linha, o que pode ser totalmente evitado sem sofrimento. Então ... eu sou a favor de línguas mais rígidas. No entanto, às vezes você pode aplicar coisas fora de um idioma com ferramentas de análise de código, como StyleCop.
Job

1
As aspas para chaves de matriz PHP não são opcionais. Eles estavam no PHP2, mas as versões posteriores definiram automaticamente as constantes. Eles não são permitidos na interpolação básica de cadeias "..$_GET[raw]..".
mario

1
@ Ralph: as regras são um pouco mais complicadas. É correto escrever "xx$_GET[raw]xx"- Se você começar a usar chaves, a chave deverá estar "xx{$_GET['raw']}xx"entre aspas. Se chaves entre chaves são usadas, o analisador PHP comum verifica e a sintaxe rigorosa se aplica. É apenas por "$_GET[x]"isso que a chave é tratada como string não processada, e isso também é uma regra estrita, na qual o PHP analisará o erro "$_GET['x']".
mario

2
@ mario: O simples fato de estarmos tendo essa conversa significa que há alguma ambiguidade e confusão na maneira como as chaves do array são manipuladas. Parece dentro de strings, é inequívoco, mas inconsistente (você não pode usar aspas quando já estiver em uma string, a menos que use chaves, então você precisa, mas fora deve). E strings externas, no PHP "normal" ... bem, ele faz uma porcaria estranha assim.
MPEN

Respostas:


19

Tipos diferentes de idiomas têm usos diferentes; portanto, a resposta a essa pergunta realmente depende do motivo pelo qual você a usará.

Por exemplo, Perl é uma linguagem muito flexível, e acho muito útil para escrever scripts de correção rápida ou processamento de números. Para projetos sólidos e robustos, eu uso C #.

Você precisa acertar o saldo para a utilização desejada. Quanto mais rigoroso, mais tempo você precisará gastar escrevendo o código, mas você obtém maior robustez, reutilização e facilidade de manutenção.


26

O que eu procuro em uma linguagem de programação (em oposição a uma linguagem de script) é consistência e digitação forte.

Nas linguagens de programação atuais, é possível omitir o ponto-e-vírgula, por exemplo, em certos lugares, sem se tornar ambíguo (a última expressão em um {}bloco é uma). Se uma linguagem de programação permite omitir caracteres nesses casos, um programador agora tem um problema extra; além da sintaxe geral do idioma, ela agora precisa saber em quais casos também é permitido omitir partes da sintaxe.

Esse conhecimento extra não é problema para o programador que está escrevendo o código, mas se torna um fardo para quem precisa interpretar o código existente posteriormente (incluindo o autor original depois de um tempo).

Seu exemplo PHP abre a possibilidade de erros sutis em um programa quando a constante keyseria adicionada no mesmo contexto. O compilador não tem como saber que não é isso que pretendia, então o problema só se torna aparente no tempo de execução, em vez do tempo de compilação.


1
Concordo, você deve limitar possibilidades para programadores: mais possibilidades => necessidade de pensar mais (eu deveria proceder desta maneira ou daquela maneira) => menos tempo para fazer o trabalho real
Kemoda

Não vejo o que a falta de conversão implícita de tipos tem a ver com a sintaxe de um idioma.
22412 Dan_waterworth

5
Além disso, quando você lê, $_GET[key]não sabe nada. Você acaba cumprimentando todo o projeto apenas para saber se keyé uma constante ou não. Isso economiza 0,5 segundos de escrita e leva 20 segundos para ler.
Moshe Revah

Se o seu idioma lhe dá opções sem distinção, o estilo de codificação - seja codificado ou não - tende a padronizar em um deles ...
Deduplicator

11

Em todos os lugares onde há alguma ambiguidade, o compilador precisa ter alguma maneira de adivinhar o que o programador realmente queria dizer. Toda vez que isso acontece, há a chance de o programador realmente ter significado algo diferente, mas não ter a regra da resolução de ambiguidade.

Escrever código logicamente correto já é bastante difícil. Adicionar ambiguidades sintáticas pode parecer "amigável" na superfície, mas é um convite aberto para introduzir novos e inesperados bugs difíceis de depurar na base de código. Resumindo, seja o mais rigoroso possível.

No seu exemplo, você mencionou que ponto e vírgula é opcional em Python e JavaScript. Para Javascript, pelo menos, isso não é totalmente verdade. Os pontos e vírgulas são tão necessários em JS quanto em qualquer outra linguagem da família C. Mas o analisador JavaScript é requerido pela especificação de idioma para inserir ponto e vírgula ausente em determinadas circunstâncias. Isso é amplamente considerado uma coisa muito ruim, porque tende a errar suas intenções e estragar seu código.


6

A resposta para o quanto você deve soltar o seu idioma é igual à resposta da pergunta dita no sotaque do Texas: "Como você se sente, punk?".


Eu não entendo.
MPEN

4
Minha péssima tentativa de brincadeira foi que a digitação dinâmica pode morder você à medida que os sistemas crescem cada vez mais, especialmente ao adicionar desenvolvedores inexperientes à mistura. Na minha experiência, sistemas de qualquer valor tendem a crescer cada vez mais e têm um número crescente de desenvolvedores desenvolvendo-os. Ter "Localizar todos os usos do símbolo" ou "Renomear tudo" ou "Excluir com segurança" ou "Encontrar erros na solução" é absolutamente inestimável. A digitação dinâmica no sentido limitado de que o VB está atrasado e faz extensa coerção de tipos causou muitos erros no show atual.
19411 Henrik

Portanto, se você tiver sorte com seu projeto, por exemplo, sorte de ter desenvolvedores bons e experientes ou sorte em escrever código correto; você pode usar digitação dinâmica.
Henrik

2
Ah ... mas esta questão nunca era realmente sobre digitação dinâmica :)
MPEN

1
Ah, Raplh muito verdadeiro. Eu apenas costumo pensar em linguagens dinâmicas mais frouxas, pois geralmente são mais frouxas. Você está certo.
Henrik

4

Todo mundo não teria que trabalhar tanto para consistência de codificação se os idiomas não tivessem tanta variação. Não gostamos quando os usuários fazem solicitações que aumentam desnecessariamente a complexidade; então, por que perguntar sobre nossas linguagens de desenvolvimento?


+1: eu concordo totalmente. Não vejo por que princípios como KISS e YAGNI não se apliquem ao design de linguagem.
Giorgio

2

Minha preferência pessoal é a capacidade de ter rigidez suficiente para capturar meus erros de digitação, mas com o mínimo de clichê extra possível. Eu falo sobre esse problema em http://www.perlmonks.org/?node_id=755790 .

Dito isto, você está projetando seu idioma para si mesmo. Você deve fazer o que você quiser.


+1: ... A capacidade de ter rigidez suficiente para capturar meus erros de digitação, mas com o mínimo de clichê extra possível. - Sim. Você conhece o plano de Anders Hejlsberg para C #? Ele está tomando uma decisão consciente para enfatizar a "essência sobre a cerimônia". channel9.msdn.com/Blogs/matthijs/…
Jim G.

@ Jim-g: Obrigado pelo pensamento. Não estou familiarizado com muita coisa sobre c #. Não trabalho no mundo da Microsoft há muitos e muitos anos.
btilly

1

Gosto das minhas línguas para fazer o que quero dizer. Geralmente isso se inclina bastante para soltar. Eu também gostaria de poder marcar "strict" em um elemento ou bloco para poder depurar / analisar essa área limitada.


1

Eu geralmente tendem a ficar do lado de "O que tornaria mais fácil para mim como programador". Claro que isso pode significar mais de uma coisa. No Javascript, quase não há verificação de tipo, o que funciona muito bem até você encontrar um bug estranho. Por outro lado, em Haskell, há muitas verificações de tipo que colocam mais trabalho à frente, mas acabam com algumas classes de erros.

Para ser sincero, eu procurava um monte de idiomas para ver o que eles fazem e tentava encontrar um nicho que nenhum deles atingisse!

Não acho que exista uma maneira óbvia de fazê-lo, ou pelo menos se não houver algo em que as pessoas tenham encontrado um consenso ainda. Então, criando linguagens com sistemas de tipos diferentes, estamos aprendendo.

Boa sorte.


1

Eu sugeriria que uma boa linguagem de programação deveria ter regras estritas, que as implementações deveriam aplicar de maneira consistente, mas as regras devem ser escritas dessa maneira para serem úteis. Sugiro ainda que se pense em projetar uma linguagem para evitar casos em que a "distância de Hamming" entre dois programas substancialmente diferentes seja apenas um. Obviamente, não se pode conseguir isso com literais numéricos ou de string (se um programador que quis dizer 123 digitar 1223 ou 13, o compilador não pode muito bem saber o que o programa significava). Por outro lado, se o idioma fosse usado :=para atribuição e ==comparação de igualdade, e não usar um único= para qualquer finalidade legal, reduziria bastante as possibilidades de atribuições acidentais que deveriam ser comparações e comparações acidentais de não fazer nada que deveriam ser atribuições.

Eu sugeriria que, embora existam lugares em que é útil para os compiladores inferirem coisas, essa inferência costuma ser mais valiosa nos casos mais simples e menos valiosa nos casos mais complicados. Por exemplo, permitindo a substituição de:

  Dicionário <complicadoTipo1, complicadoTipo2> item =
    novo dicionário <complicadoTipo1, complicadoTipo2 ()>;

com

  var item = new Dictionary <complicadoTipo1, complicadoTipo2 ()>;

não requer nenhuma inferência de tipo complicada, mas torna o código muito mais legível (entre outras coisas, usando a sintaxe mais detalhada apenas nos cenários onde é necessário, por exemplo, porque o tipo de local de armazenamento não corresponde exatamente ao tipo da expressão criá-lo, ajudará a chamar atenção extra para locais que possam exigir).

Uma grande dificuldade de tentar inferência de tipo mais sofisticada é que situações ambíguas podem surgir; Eu sugeriria que uma boa linguagem deveria permitir que um programador incluísse informações que o compilador poderia usar para resolver essas ambiguidades (por exemplo, considerando algumas previsões tipográficas como preferíveis a outras), determinando que elas não importam (por exemplo, apesar de duas possíveis Como sobrecargas podem executar códigos diferentes, o programador indicou que eles deveriam se comportar de forma idêntica nos casos em que qualquer um poderia ser usado) ou sinalizar aqueles (e somente aqueles) que não podem ser manipulados de nenhuma das maneiras acima.


1

Para mim, a legibilidade é mais importante.

Para alguém experiente com a linguagem, o significado de um fragmento de código deve ser claro sem ter que analisar profundamente o contexto.

O idioma deve ser capaz de sinalizar erros o mais rápido possível. Se toda sequência aleatória de caracteres cria um programa sintaticamente correto, isso não ajuda. E se as variáveis ​​são criadas automaticamente na primeira vez em que são usadas, então, erros de ortografia, clientcomo cleintnão irão gerar um erro de compilação.

Além da sintaxe, a linguagem deve ter uma semântica claramente definida, e talvez isso seja ainda mais difícil do que decidir sobre uma sintaxe decente ...

Bons exemplos:

  • Em Java, "1"é uma string, 1é um int, 1.0é um duplo e 1Lé um longo. Um olhar e você sabe o que é.

  • Em Java, =é a atribuição. Ele atribui o valor para tipos primitivos e a referência para tipos de referência. Ele nunca copia dados complexos ou compara.

  • Em Java, chamar um método precisa de parênteses e dessa maneira é claramente diferenciado das variáveis ​​- portanto, se não houver parênteses, você não precisa procurar uma definição de método, é apenas a leitura de dados.

Exemplos ruins:

  • Em Java, um símbolo como clientpode ser quase qualquer coisa: um elemento do caminho do pacote, um nome de classe ou interface, um nome de classe interna, um nome de campo, um nome de método, uma variável local e muito mais. Cabe ao usuário introduzir ou obedecer às convenções de nomenclatura ou não.

  • Em Java, o ponto .é usado em excesso. Pode ser separador dentro do nome do pacote, separador entre pacote e classe, separador entre classe externa e interna, conector entre expressão da instância e método a ser chamado na instância e muito mais.

  • Em muitos idiomas, as chaves dos ifblocos são opcionais, levando a erros desagradáveis ​​se alguém adicionar mais uma instrução ao bloco (na verdade não existe).

  • Operadores de infix: às vezes eu tenho que parar em uma expressão numérica e pensar bem no que significa, passo a passo. Todos nós estamos acostumados a escrever expressões matemáticas em notações infix como a * b / c * d + e. Na maioria das vezes, lembramos da precedência da multiplicação e divisão sobre adição e subtração (mas você percebeu que não estamos dividindo por c*d, mas dividindo apenas por ce depois multiplicando por d?). Mas existem tantos operadores de infix adicionais com suas próprias regras de precedência e, em alguns idiomas, sobrecarregando que é difícil acompanhar. Talvez reforçar o uso de parênteses tenha sido uma abordagem melhor ...


Você falou principalmente sobre ambiguidade, mas pode haver várias maneiras de fazer a mesma coisa sem criar ambiguidade. Talvez possamos ter dois operadores de multiplicação, *e ×. Ambos 5*3e 5 × 3` significam a mesma coisa, e um programador experiente sabe exatamente o que eles significam sem ter que olhar ao redor no contexto circundante. O problema, no entanto, é que agora existem duas maneiras de fazer a mesma coisa e alguém pode trocar entre elas durante o programa. Acredito que era isso que me preocupava mais quando fiz a pergunta.
MPEN

-2

Você pode considerar uma analogia com a linguagem natural. Por e-mail, você é um nazista da gramática? Ou você concorda com alguns erros gramaticais, como infinitivos divididos, conjunções ausentes ou modificadores extraviados? A resposta se resume a preferência pessoal.

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.