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.
"..$_GET[raw].."
."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']"
.Respostas:
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.
fonte
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
key
seria 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.fonte
$_GET[key]
não sabe nada. Você acaba cumprimentando todo o projeto apenas para saber sekey
é uma constante ou não. Isso economiza 0,5 segundos de escrita e leva 20 segundos para ler.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.
fonte
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?".
fonte
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?
fonte
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.
fonte
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.
fonte
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.
fonte
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:
com
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.
fonte
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,
client
comocleint
nã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 e1L
é 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
client
pode 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
if
blocos 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 porc*d
, mas dividindo apenas porc
e depois multiplicando pord
?). 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 ...fonte
*
e×
. Ambos5*3
e 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.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.
fonte