Por que as nomeações de chamadas do sistema UNIX / POSIX são tão ilegíveis?

43

Qual é a razão para usar nomes de chamada não reveladores do sistema como timee em creatvez de getCurrentTimeSecse createFileou, talvez mais adequado para Unix get_current_time_secse create_file. O que me leva ao próximo ponto: por que alguém deveria querer algo como cfsetospeedsem estojo de camelo ou pelo menos sublinhados para torná-lo legível? Claro que as chamadas teriam mais caracteres, mas todos sabemos que a legibilidade do código é mais importante, certo?

Benjoyo
fonte
42
Porque eles foram inventados décadas antes da notação húngara, estojo de camelo, estojo de cobra e coisas semelhantes se tornarem moda. Também porque os compiladores da época tinham muito poucos recursos e os nomes dos identificadores eram limitados a (IIRC) 8 caracteres.
Lcd047
3
@phresnel Não tenho certeza de que relação você vê entre nomes de arquivos e IDs variáveis, mas sim, eu estava hesitando entre 8, 12 e 14. Talvez o limite também fosse 14 para IDs variáveis. Certamente não era 256+. Quanto às anotações: defina "sempre". Será que Armínio usar palavras CamelCase? Talvez não. AFAIR, a notação húngara foi introduzida para Windows no início dos anos 90. CamelCase e sneak_case foram variações posteriores. É claro que ambos foram usados ​​antes disso. O que estou dizendo é que eles se tornaram populares em meados dos anos 90.
Lcd047
6
@ phresnel: Observe que o seu link fala sobre as limitações do primeiro sistema de arquivos Unix . Quando Thompson, Richie et al. estavam projetando o Unix, eles tiveram que inicializar o Unix em máquinas que ainda não executavam o Unix , ou seja, em ambientes provavelmente ainda mais restritos.
DevSolar
11
Você também pode perguntar por que eles não estão escritos em alemão, porque essa é a aproximação mais aproximada da linguagem natural que eu consigo pensar nas monstruosidades longas que Java ensinou os programadores a aceitar ...
R ..
12
Estou tão feliz que é assim. Imagine como um ls -la | grepseria algo como: listAllHiddenAndNormalFiles() | globallySearchARegularExpressionAndPrint().
Pouya

Respostas:

61

É devido às restrições técnicas da época. O padrão POSIX foi criado na década de 1980 e referido ao UNIX, que nasceu na década de 1970. Vários compiladores C na época estavam limitados a identificadores com 6 ou 8 caracteres, de modo que estabeleceu o padrão para o comprimento da variável e função nomes.

Perguntas relacionadas:

dr01
fonte
5
Não acho que restrições técnicas se apliquem. Você pode ter arquivos maiores que 6 bytes, programas que abrangem milhares de linhas de código; árvores de sintaxe abstrata muito mais profundas do que apenas seis níveis e com muito mais nós por nível. Por uma razão, o limite de 6 caracteres não pode ser técnico, mas sim um projetado. E isso não explica por que "creat" é melhor que "create". Além disso, você pode citar os vários compiladores C de que fala? Sua resposta realmente é como "ouvido em algum lugar em algum lugar".
Phresnel
41
@ phresnel: Ele não está falando sobre o tamanho do arquivo, o número de linhas ou a profundidade da árvore de sintaxe. As versões antigas da linguagem C não exigiam que os compiladores e vinculadores mantivessem mais do que os 31 primeiros caracteres de identificadores com vínculo interno ou mais de 6 para identificadores externos . Assim, get_current_date()e get_current_time()não poderia ser diferenciado por algumas dessas cadeias de ferramentas anteriores. A razão era que esses sistemas estavam trabalhando em pequenas pegadas de alguns kilobytes.
DevSolar
34
Mas você está certo creat(). Ken Thompson foi perguntado uma vez o que ele faria de diferente se estivesse redesenhando o sistema UNIX. Sua resposta: "Eu soletraria creat com um e".
DevSolar
8
@ phresnel: Ter apenas memória limitada não é um limite rígido. Ter apenas um comprimento garantido limitado limitado de identificadores é . Se você tem apenas 6 caracteres significativos garantidos, é com isso que você está trabalhando se vale a pena.
DevSolar
6
FWIW, os antigos padrões Fortran limitados identificam-se a 6 caracteres. Deste livro : "A regra Fortran de seis caracteres em um identificador decorre do fato de que seis caracteres podem ser representados em uma palavra IBM 704". Eu não posso falar para C, mas imagino a limitação tem uma origem muito semelhante (ou talvez, de origem idênticas)
tpg2114
26

dr01 está certo, mas também há outro motivo - usabilidade. No passado, você não tinha algo tão confortável quanto um teclado para digitar. Se você teve sorte, tinha algo parecido com uma máquina de escrever da velha escola. Se você não teve sorte, teve que lidar com sistemas que exigiam trabalho físico real para operar (como em, foi preciso muita força para pressionar a "tecla") ou você fez manualmente furos em um cartão.

Isso significava que, mesmo dentro do limite de 6 a 8 caracteres, você tentava manter seus comandos o mais curtos possível. É por isso que você tem lsem vez de list, e createm vez de create. Código daquela época é cheia de variáveis como a, xe i- e, claro, x2e amigos. Digitar era muito trabalhoso - hoje, você é menos exercitado com a digitação listIndexdo que costumava ser com "digitação" i- e nem é mais tão lento assim (especialmente com tecnologias adicionais como o preenchimento automático).

A verdadeira questão é - por que tantos idiomas Unix persistem mesmo que não sejam mais desejáveis?

Luaan
fonte
23
No dia meu kernel muda de timea getCurrentTimeSecsou algo assim, eu vou parar de atualizá-lo. Mesmo com o teclado confortável e o hardware recente, esses nomes permanecem extremamente convenientes e simples (a simplicidade é um dos fundamentos do UNIX). Realmente não sinto a necessidade de trazer esse tipo de nomeação no estilo Java / C # para a linguagem C, muito menos em um kernel Linux. Na IMO, da perspectiva de um desenvolvedor de kernel ou do UNIX em geral, esses idiomas não são nada indesejáveis .
John WH Smith
11
@ Benjoyo unRootlyLongNamed.Packaged.nonsensicalFunctioné feio para mim, e eu prefiro ter certeza do que faz, do man 2 timeque adivinhar o que parece fazer.
muru 9/07/2015
7
@ Benjoyo Bem, qualquer pessoa que não esteja acostumada com esse ambiente não deve usar chamadas de sistema em primeiro lugar, uma vez que elas são especificamente destinadas a quem o é. As bibliotecas (padrão) estão aqui para as outras. O UNIX não segue essas "regras" do design da moda que o tornariam facilmente compreensível à primeira vista. Aqueles que usá-lo sem olhar para qualquer doc está em um monte de problemas, e poucas pessoas na comunidade UNIX iria considerar que um problema a ser resolvido.
John WH Smith
4
O @JohnWHSmith garante que os desenvolvedores do modo kernel conhecerão seu sistema e seus documentos, mas isso não é motivo para não ter nomes concisos e com nomes.
Benjoyo 9/07/2015
7
@JohnWHSmith Como um desenvolvedor humilde que só escreveu drivers de kernel e prefere nomes significativos que não estão cheios de abreviações, tenho que discordar. Mas tudo bem, porque se você olhar, por exemplo, o código-fonte original do git, encontrará pelo menos um desenvolvedor de kernel concordando comigo. Embora se você contar Linus que seu get_Xou remove_file_from_cache(pode proponho rmfc?) São indesejáveis para kernel desenvolvedores, por favor, fazê-lo publicamente - Eu amo ver a reação dele.
Voo
22

Além das outras respostas, gostaria de salientar que o Unix foi desenvolvido como uma reação ao Multics, CTSS e outros sistemas operacionais contemporâneos, que eram significativamente mais detalhados sobre suas convenções de nomenclatura. Você pode ter uma idéia desses sistemas operacionais em http://www.multicians.org/devdoc.html . Por exemplo, http://www.multicians.org/mspm-bx-1-00.html fornece change_namecomo o comando para renomear um arquivo; compare o Unix mv.

Além disso, a principal razão pela qual os nomes de chamadas muito curtos do sistema persistem é a compatibilidade com versões anteriores. Você notará que as APIs mais recentes tendem a ser mais explícitas; por exemplo, gettimeofdaye em clock_gettimevez de apenas time.

(Ainda hoje, usar em whateverIndexvez de ipara um índice de loop é uma falha automática de revisão de código no meu livro ;-)

zwol
fonte
2
Sim. É engraçado ouvir o argumento tecnológico sobre os recursos de hardware quando o LISP Machines é anterior ao UNIX. Claro, as máquinas UNIX eram mais baratas de comprar , mas é isso. A adição de custos de manutenção (que obviamente não contam na terra * nix) virou a mesa mesmo assim, mas não foi um argumento suficientemente convincente. (E sim, ié bom para um índice quando você está, digamos, repetindo uma série coordena o uso.? xE yAtravessar alguns ordinal Seja descritivo.?.)
Luaan
As máquinas @Luaan LISP NÃO são anteriores ao Unix. Você falhou.
pizdelect 17/06
@pizdelect Isso é tecnicamente verdade, mas a verdade técnica não é motivo suficiente para se rebelar contra alguém.
zwol 17/06
@pizdelect Desculpe, eu quis dizer que o Lisp é anterior ao UNIX (e C). Mas as máquinas LISP eram essencialmente contemporâneas, se você comparar seu impacto comercial (o UNIX teve um avanço de cerca de três anos, mas quando as máquinas LISP chegaram, as máquinas comerciais UNIX ainda eram poucas e distantes; a maioria do UNIX estava na academia ou sem suporte). De qualquer forma, é uma resposta aos argumentos tecnológicos comuns da época, que eram os anos 80, quando as pessoas estavam realmente decidindo entre máquinas UNIX e LISPMs, e estavam erradas. Isso mudou com os microcomputadores, que poderiam executar o LISP mais rapidamente.
Luaan 18/06
10

Dennis Ritchie estabeleceu uma restrição a C de que não confiaria em nenhum recurso de vinculador que também não fosse exigido pelo Fortran. Daí o limite de 6 caracteres em nomes externos.

user207421
fonte
@ downvoter Você pode não concordar com Denni Ritchie sobre isso, mas foi o que ele fez. Retirar essa resposta é inútil.
user207421