¿Por qué los nombres de sistema de UNIX / POSIX son tan ilegibles?

43

¿Cuál es la razón para usar nombres de llamadas de sistema de descalificación como timey en creatlugar de getCurrentTimeSecsy createFileo, tal vez más adecuado en Unix get_current_time_secsy create_file? Lo que me lleva al siguiente punto: ¿por qué alguien debería querer algo como cfsetospeedsin el caso de camello o al menos pone de relieve para que sea legible? Por supuesto, las llamadas tendrían más caracteres, pero todos sabemos que la legibilidad del código es más importante, ¿verdad?

Benjoyo
fuente
42
Debido a que se inventaron décadas antes de la notación húngara, el caso del camello, el caso de la serpiente y demás se pusieron de moda. También porque en aquel entonces los compiladores tenían muy pocos recursos, y los nombres de los identificadores se limitaban a (IIRC) 8 caracteres.
lcd047
3
@phresnel No estoy seguro de qué relación ves entre los nombres de archivo y las ID de variables, pero sí, dudaba entre 8, 12 y 14. Quizás el límite también era 14 para las ID de variables. Ciertamente no era más de 256. En cuanto a las anotaciones: defina "siempre". ¿ Arminius usó palabras de CamelCase? Tal vez no. AFAIR, la notación húngara se introdujo para Windows a principios de la década de 1990. CamelCase y sneak_case fueron variaciones posteriores. Ambos, por supuesto, se usaron antes de eso. Lo que digo es que se han vuelto populares a mediados de la década de 1990.
lcd047
66
@phresnel: Tenga en cuenta que su enlace habla sobre las limitaciones del primer sistema de archivos Unix . Cuando Thompson, Richie et al. estaban diseñando Unix, tuvieron que arrancar Unix en máquinas que aún no ejecutaban Unix , es decir, en entornos probablemente aún más restringidos.
DevSolar
11
También podría preguntar por qué no están escritos en alemán, porque esa es la aproximación más cercana al lenguaje natural que se me ocurre para las monstruosidades demasiado largas que Java ha enseñado a los programadores a aceptar ...
R ..
12
Estoy tan feliz de que sea así. Imagínese cómo un ls -la | grepmirar gustaría: listAllHiddenAndNormalFiles() | globallySearchARegularExpressionAndPrint().
Pouya

Respuestas:

61

Se debe a las limitaciones técnicas de la época. El estándar POSIX se creó en la década de 1980 y se refería a UNIX, que nació en la década de 1970. Varios compiladores de C en ese momento se limitaban a identificadores que tenían 6 u 8 caracteres de largo, por lo que se estableció el estándar para la longitud de la variable y la función nombres

Preguntas relacionadas:

dr01
fuente
55
No creo que se apliquen restricciones técnicas . Podría tener archivos de más de 6 bytes, podría tener programas que abarquen miles de líneas de código; árboles de sintaxis abstracta mucho más profundos que solo seis niveles, y con muchos más nodos por nivel. Solo por razones, el límite de 6 caracteres no puede ser técnico, sino más bien diseñado. Y no explica por qué "creat" es mejor que "crear". Además, ¿puedes nombrar esos varios compiladores de C de los que hablas? Su respuesta realmente se lee como "escuchado en algún lugar cuando".
phresnel
41
@phresnel: Él no está hablando sobre el tamaño del archivo, el número de líneas o la profundidad del árbol de sintaxis. Las versiones anteriores del lenguaje C no requerían que los compiladores y enlazadores mantuvieran más de los primeros 31 caracteres de identificadores con enlace interno, o más de 6 para identificadores externos . Por lo tanto, get_current_date()y get_current_time()algunas de estas primeras cadenas de herramientas no podían distinguirlo. La razón fue que estos sistemas estaban trabajando en pequeñas huellas de unos pocos kilobytes.
DevSolar
34
Pero tienes razón creat(). Una vez se le preguntó a Ken Thompson qué haría de manera diferente si estuviera rediseñando el sistema UNIX. Su respuesta: "Deletrearía creat con una e".
DevSolar
8
@phresnel: Tener solo memoria limitada no es un límite difícil. Tener solo una longitud limitada garantizada de identificadores admitidos es . Si solo tienes garantizados 6 personajes importantes, con eso estás trabajando si vales la pena.
DevSolar
66
FWIW, los viejos estándares Fortran limitados se identifican a 6 caracteres. De este libro : "La regla Fortran de seis caracteres en un identificador se deriva del hecho de que seis caracteres podrían representarse en una palabra IBM 704". No puedo hablar por C, pero imagino que la limitación tiene un origen muy similar (o tal vez, un origen idéntico)
tpg2114
26

dr01 tiene razón, pero también hay otra razón: usabilidad. En el pasado, no tenías algo tan cómodo como un teclado para escribir. Si tuvo suerte, tenía algo parecido a una máquina de escribir de la vieja escuela. Si no tuvo suerte, tuvo que lidiar con sistemas que requerían trabajo físico real para operar (como en, se requería mucha fuerza para presionar la "tecla"), o perforaba agujeros manualmente en una tarjeta.

Esto significaba que incluso dentro del límite de 6-8 caracteres, trataste de mantener tus comandos lo más cortos posible. Es por eso que tienes en lslugar de list, y en creatlugar de create. El código de esa época está lleno de variables como a, xy i, por supuesto, x2y amigos. Mecanografiar fue mucho trabajo: hoy en día, te esfuerzas menos por escribir listIndexde lo que solías ser por "mecanografiar" i, y ya ni siquiera es más lento (especialmente con tecnologías adicionales como la finalización automática).

La verdadera pregunta es: ¿por qué persisten tantos modismos de Unix a pesar de que ya no son deseables?

Luaan
fuente
23
El día que mi kernel cambia de timea getCurrentTimeSecs, o algo por el estilo, sólo voy a la mejora detenerlo. Incluso con mi teclado cómodo y hardware reciente, estos nombres siguen siendo extremadamente convenientes y simples (la simplicidad es uno de los fundamentos de UNIX). Realmente no siento la necesidad de llevar ese tipo de nombres de estilo Java / C # al lenguaje C, y mucho menos en un kernel de Linux. En mi opinión, desde la perspectiva de un desarrollador de kernel, o un desarrollador de UNIX en general, estos modismos no son nada indeseables .
John WH Smith
11
@Benjoyo unRootlyLongNamed.Packaged.nonsensicalFunctiones feo para mí, y prefiero estar seguro de lo que hace haciendo man 2 timeque adivinar lo que parece hacer.
muru
77
@Benjoyo Bueno, cualquiera que no esté acostumbrado a este entorno no debe usar las llamadas del sistema en primer lugar, ya que están específicamente destinadas a aquellos que sí lo están. Las bibliotecas (estándar) están aquí para los demás. UNIX no sigue estas "reglas" de diseño de moda que lo harían fácilmente comprensible a primera vista. Quienes lo usan sin buscar ningún documento tienen muchos problemas, y pocas personas en la comunidad UNIX considerarían que un problema está resuelto.
John WH Smith
44
@JohnWHSmith está seguro de que los desarrolladores del modo kernel conocerán su sistema y sus documentos, pero esa no es razón para no tener nombres concisos y concisos .
Benjoyo
77
@JohnWHSmith Como discreto desarrollador que solo escribió controladores de kernel y prefiere nombres significativos que no están llenos de abreviaturas, tengo que estar en desacuerdo. Pero está bien, porque si buscas, por ejemplo, el código fuente original de git, encontrarás que al menos un desarrollador de kernel está de acuerdo conmigo. Aunque si le dice a Linus que su get_Xo remove_file_from_cache(¿podría proponerlo rmfc?) No son deseables para los desarrolladores del kernel, hágalo públicamente; me encantaría ver su reacción.
Voo
22

Además de las otras respuestas, me gustaría señalar que Unix se desarrolló como una reacción a Multics, CTSS y otros sistemas operativos contemporáneos, que fueron significativamente más detallados sobre sus convenciones de nomenclatura. Puede tener una idea de estos sistemas operativos en http://www.multicians.org/devdoc.html . Por ejemplo, http://www.multicians.org/mspm-bx-1-00.html da change_namecomo el comando para renombrar un archivo; comparar Unix mv.

Además, la razón principal por la que persisten los nombres de sistema muy cortos es la compatibilidad con versiones anteriores. Notarás que las API más nuevas tienden a ser más explícitas; por ejemplo, gettimeofdayy en clock_gettimelugar de solo time.

(Incluso hoy, usar en whateverIndexlugar de iun índice de bucle es un error de revisión automática de código en mi libro ;-)

zwol
fuente
2
Sí. Es divertido escuchar el argumento tecnológico sobre las capacidades de hardware cuando las máquinas LISP son anteriores a UNIX. Claro, las máquinas UNIX eran más baratas de comprar , pero eso es todo. Agregar costos de mantenimiento (que por supuesto no cuentan en la tierra * nix) cambió las cosas incluso entonces, pero de todos modos no fue un argumento lo suficientemente persuasivo. (Y sí, iestá bien para un índice cuando, por ejemplo, está iterando una matriz. ¿Coordenadas? ¿Usar xy y. Atravesar un ordinal? Sea descriptivo.)
Luaan
Las máquinas @Luaan LISP NO son anteriores a Unix. Fallaste.
pizdelect
@pizdelect Eso es técnicamente cierto, pero la verdad técnica no es razón suficiente para criticar a alguien.
zwol
@pizdelect Lo siento, quise decir que Lisp es anterior a UNIX (y C). Pero las máquinas LISP eran esencialmente contemporáneas, si se compara su impacto comercial (UNIX tenía una ventaja de aproximadamente tres años, pero cuando llegaron las máquinas LISP, las máquinas UNIX comerciales todavía eran pocas y distantes; la mayoría de UNIX estaba en el mundo académico o sin soporte). En cualquier caso, es una respuesta a los argumentos tecnológicos comunes en ese momento, que fue en los años 80, cuando las personas realmente decidían entre máquinas UNIX y LISPM, y estaban equivocados. Eso cambió con las microcomputadoras que podrían ejecutar LISP más rápido de todos modos.
Luaan
10

Dennis Ritchie se impuso una restricción con C de que no se basaría en ninguna función de enlace que no fuera requerida por Fortran. De ahí el límite de 6 caracteres en los nombres externos.

usuario207421
fuente
@downvoter Puede que no esté de acuerdo con Denni Ritchie sobre esto, pero eso fue lo que hizo. Sacarlo en esta respuesta es inútil.
user207421