Contenidos sobre el arte de la programación UNIX
Prefacio xxv
Parte I 1
Capítulo 1 Filosofía 3
1.1 ¿Cultura? Qué cultura 3
1.2 La vitalidad de Unix 4
1.3 Razones en contra de aprender la cultura Unix 5
1.4 Desventajas de Unix 6
1.5 Beneficios de Unix 7
1.5.1 Software de código abierto 7
1.5.2 Portabilidad multiplataforma y estándares abiertos 8
1.5.3 Internet y todo el mundo Web 8
1.5.4 Comunidad de código abierto 9
1.5.5 Flexibilidad de pies a cabeza 9
1.5.6 La diversión de Unix Hack 10
1.5.7 La experiencia de Unix también se puede aplicar en otros lugares11
1.6 Conceptos básicos de la filosofía Unix11
1.6.1 Principio del módulo: utilice interfaces simples para ensamblar componentes simples14
1.6.2 Principio de claridad: la claridad es mejor que la astucia14
1.6.3 Principio de combinación: considere el empalme y la combinación al diseñar15
1.6.4 Principio de separación: estrategia y mecanismo Separación, la interfaz está separada del motor16
1.6.5 Principio de simplicidad: el diseño debe ser simple y la complejidad debe ser lo más baja posible17
1.6.6 Principio de parsimonia: A menos que no haya otra manera, no escriba programas enormes18
1.6.7 Principio de transparencia: El diseño debe ser visible para revisión y depuración18
1.6.8 Principio de robustez: la robustez proviene de la transparencia y la simplicidad18
1.6.9 Principio de presentación: superponer conocimiento en datos para lograr una lógica simple y sólida19
1.6.10 Principio popular: evitar la novedad en diseño de interfaz20
1.6 .11 Principio de silencio: si un programa no tiene nada que decir, manténgase en silencio20
1.6.12 Principio de remedio: cuando ocurre una excepción, salga inmediatamente y proporcione suficiente error información21
1.6.13 Principio económico: es mejor gastar un punto en la máquina que un segundo en el programador22
1.6.14 Principio de generación: evitar hacks manuales e intentar escribir programas para generar programas22
1.6.15 Principio de optimización: debes tener un prototipo antes de tallar y debes aprender a caminar antes de correr23
1.6.16 Principio de diversidad: Nunca creas en la afirmación del llamado "método único"24
1.6.17 Principio de extensión: Diseñar pensando en el futuro, el futuro siempre es más rápido de lo esperado24
1.7 La filosofía Unix en pocas palabras25
1.8 Aplicando la filosofía Unix26
1.9 La actitud también importa 26
Capítulo 2 Historia - Shuangliu Ji 29
2.1 El origen y la historia de Unix, 1969-1995 29
2.1 .1 Génesis: 1969-1971 30
2.1.2 Éxodo: 1971-1980 32
2.1.3 TCP/IP y Unix Civil War: 1980-1990 35
2.1.4 Contraataque al Imperio: 1991-1995 41
2.2 El origen y la historia de los hackers : 1961-1995 43
2.2.1 Juegos en el bosque del campus: 1961 -1980 44
2.2.2 La gran convergencia de Internet y el movimiento del software libre: 1981- 1991 45
2.2.3 Linux y la respuesta de los pragmáticos: 1991-1998 48
2.3 El movimiento del código abierto: 1998 y después 49
2.4 Lecciones históricas de Unix 51
Capítulo 3 Comparación: Comparación de la filosofía Unix con otras filosofías 53
3.1 Elementos estilísticos del sistema operativo53
3.1.1 ¿Qué es la unidad? concepto del sistema operativo54
3.1.2 Capacidad multitarea54
3.1.3 Proceso colaborativo55
3.1.4 Límites internos57
3.1.5 Atributos de archivo y estructura de registros 57
3.1.6 Formato de archivo binario 58
3.1.7 Estilo de interfaz de usuario preferido 58
3.1.8 Público objetivo 59
p>3.1.9 Umbral de desarrollo 60
3.2 Comparación de sistemas operativos 61
3.2.1 VMS 61
3.2.2 MacOS 64
p>3.2.3 OS/2 65
3.2.4 Windows NT 68
3.2.5 BeOS 71
3.2.6 MVS 72
3.2.7 VM/CMS 74
3.2.8 Linux 76
3.3 Cosechas lo que siembras 78
Parte II 81
Capítulo 4 Modularidad: Mantenlo claro, mantenlo simple83
4.1 Encapsulación y tamaño óptimo del módulo85
4.2 Compacidad y ortogonalidad 87
4.2 .1 Compacidad 87
4.2.2 Ortogonalidad 89
4.2.3 Principio SPOT 91
4.2.4 Compacidad y centro único fuerte92
4.2.5 El valor de la separación94
4.3 El software tiene varias capas95
4.3.1 De arriba hacia abajo y de abajo hacia arriba95
4.3.2 Capa de pegamento97
4.3.3 Ejemplo de análisis: lenguaje C considerado como una fina capa de pegamento98
4.4 Biblioteca de programas 99
4.4.1 Ejemplo de análisis: complemento GIMP 100
4.5 Unix y lenguajes orientados a objetos 101
4.6 Codificación modular 103
Capítulo 5 Textualización: Los buenos protocolos producen buenas prácticas 105
5.1 La importancia de la textualización 107
5.1.1 Análisis de ejemplo: formato de archivo de contraseña Unix 109
5.1.2 Análisis de ejemplo: formato .newsrc 110
5.1.3 Análisis de ejemplo: formato de archivo gráfico PNG 111
5.2 Metaformato de archivo de datos 112
5.2.1 Estilo DSV 113
5.2.2 Formato RFC 822 114
5.2.3 Formato Cookie-Jar 115
5.2.4 Formato Record-Jar 116
5.2.5 XML 117
5.2.6 Formato INI de Windows 119
5.2.7 Convenciones de formato de archivos de texto Unix 120
5.2.8 Pros y contras de la compresión de archivos 122
5.3 Protocolo de aplicación diseño 123
5.3.1 Análisis de ejemplo: SMTP, un protocolo de socket simple 124
5.3.2 Análisis de ejemplo: POP3, protocolo de oficina postal 124
5.3. 3 Análisis de ejemplo: IMAP, Protocolo de acceso a mensajes de Internet 126
5.4 Metaformato del protocolo de aplicación 127
5.4.1 Metaprotocolo de aplicación de Internet clásico 127
5.4.2 HTTP como protocolo de aplicación general 128
5.4.3 BEEP: Protocolo de intercambio extensible en bloque 130
5.4.4 XML-RPC, SOAP y Jabber 131
Capítulo 6 Transparencia: algo de luz 133
6.1 Ejemplo de investigación 135
6.1.1 Ejemplo de análisis: audacia 135
6.1.2
Análisis de ejemplo: opción –v de fetchmail 136
6.1.3 Análisis de ejemplo: GCC 139
6.1.4 Análisis de ejemplo: kmail 140
6.1.5 Análisis de ejemplo : SNG 142
6.1.6 Análisis de ejemplo: base de datos Terminfo 144
6.1.7 Análisis de ejemplo: archivo de datos Freeciv 146
6.2 Para transparencia y accesibilidad Diseño para Explicidad148
6.2.1 El Zen de la Transparencia149
6.2.2 Codificación para lograr transparencia y explicidad150
6.2.3 Transparencia y evitar la sobreprotección151
6.2.4 Transparencia y representación editable 152
6.2.5 Transparencia, diagnóstico de fallas y recuperación de fallas 153
6.3 Diseño para mantenibilidad 154
Capítulo 7 Multiprogramación: Separación de procesos en funciones independientes 157
7.1 Separar el control de la complejidad del ajuste del rendimiento 159
7.2 Clasificación de los métodos Unix IPC 160
7.2.1 Transferir tareas a programas especializados 160
7.2.2 Pipes, redirecciones y filtros 161
p>7.2.3 Wrappers 166
7.2.4 Wrappers de seguridad y cadenas Bernstein 167
7.2.5 Procesos esclavos 168
7.2 .6 Comunicación entre procesos de igual a igual169
7.3 Problemas y métodos a evitar176
7.3.1 Métodos obsoletos de Unix IPC176
7.3.2 Llamadas a procedimientos remotos 178
7.3.3 Subprocesos: intimidación o amenaza 180
7.4 Partición de procesos en el nivel de diseño 181
Capítulo 8 Mini lenguajes: la búsqueda Cantar notas musicales 183
8.1 Comprender la taxonomía del lenguaje 185
8.2 Aplicar el microlenguaje 187
8.2 .1 Estudio de caso: sng 187
8.2.2 Estudio de caso: Expresión regular 188
8.2.3 Estudio de caso: Glade 191
8.2.4 Estudio de caso : m4 193
8.2 .5 Análisis de caso: XSLT 194
8.2.6 Análisis de caso: Las herramientas de Documenter's Workbench 195
8.2.7 Análisis de caso: fetchmail's ejecutar sintaxis de control 199
8.2.8 Estudio de caso: awk 200
8.2.9 Estudio de caso: PostScript 202
8.2.10 Estudio de caso: bc y dc 203
8.2.11 Estudio de caso: Emacs Lisp 205
8.2.12 Estudio de caso: JavaScript 205
8.3 Diseño de mini lenguajes 206
8.3.1 Elegir la complejidad adecuada 207
8.3.2 Extender e incorporar lenguajes 209
8.3.3 Escribir sintaxis personalizada 210
8.3 .4 Macros: úselas con precaución 210
8.3.5 Lenguaje o protocolo de aplicación 212
Capítulo 9 Generación: aumento del nivel de especificación 215
9.1 Datos Programación dirigida 216
9.1.1 Análisis de ejemplo: ascii 217
9.1.2 Análisis de ejemplo: estadísticas estadísticas de spam 218
9.1.3 Análisis de ejemplo: cambios de metaclase en fetchmailconf 219
9.2 Generación de código especial 225
9.2.1 Análisis de ejemplo: Generar visualización ascii
El código mostrado 225
9.2.2 Análisis de ejemplo: Generar código HTML para la lista 227
Capítulo 10 Configuración: Dar el primer paso correcto 231
10.1 Qué debe ser configurable 231
10.2 ¿Dónde está la configuración? 233
10.3 Ejecución del archivo de control 234
10.3.1 Análisis de ejemplo: archivo .netrc 236
10.3.2 Portabilidad a otros sistemas operativos 238
10.4 Variables de entorno 238
10.4.1 Variables de entorno del sistema 238
10.4.2 Variables de entorno del usuario 240
10.4.3 Cuándo usar variables de entorno 240
10.4.4 Portabilidad a otros sistemas operativos 242
10.5 Opciones de línea de comando 242
10.5.1 Opciones de línea de comando de –a a –z 243
10.5.2 Portabilidad a otros sistemas operativos 248
10.6 Cómo elegir un método 248
10.6.1 Análisis de ejemplo: fetchmail 249
10.6.2 Análisis de ejemplo: servidor XFree86 251
10.7 Sobre romper las reglas 252
Capítulo 11 Interfaz: Patrón de diseño de interfaz de usuario en entorno Unix 253
11.1 Aplicación del principio de innovación mínima 254
11.2 Historia del diseño de interfaz Unix 256
11.3 Evaluación del diseño de interfaz 257
11.4 Compensaciones entre CLI e interfaces visuales 259
11.4.1 Análisis de ejemplo: dos formas de escribir programas de calculadora 262
11.5 Transparencia, expresividad y configurabilidad 264
11.6 Patrones de diseño de interfaz Unix 266
11.6.1 Patrón de filtro 266
11.6.2 Modo Cantrip 268
11.6.3 Modo fuente 268
11.6.4 Modo receptor 269
11.6.5 Modo compilador 269
11.6.6 Modo ed 270
11.6 .7 Modo Roguelike 270
11.6.8 Modo "Separación de motor e interfaz" 273
11.6.9 Modo servidor CLI 278
11.6.10 Basado en lenguaje modo de interfaz 279
11.7 Aplicación del patrón de diseño de interfaz Unix 280
11.7.1
11.8 Navegador web como interfaz universal 281
11.9 El silencio es oro 284
Capítulo 12 Optimización 287
12.1 No hagas nada, simplemente quédate ahí parado 287
12.2 Estima primero, luego optimiza 288 p>
12.3 El daño de la no localidad 290
12.4 Rendimiento y retraso 291
12.4.1 Operación por lotes 292
12.4.2 Operación superpuesta 293
12.4.3 Resultados de la operación de almacenamiento en caché 293
Capítulo 13 Complejidad: tanto como sea posible Puede que sea simple, pero no lo simplifique demasiado295
13.1 Hablar sobre la complejidad296
13.1.1 Tres fuentes de complejidad296
13.1.2 Compensación entre complejidad de interfaz y complejidad de implementación 298
13.1.3 Complejidad necesaria, posible y accidental 299
13.1.4 Complejidad del mapeo 300
13.1.5 Cuando la simplicidad falla302
13.2 La historia de cinco editores302
13.2.1 edición 304
13
.2.2 vi 305
13.2.3 Sam 306
13.2.4 Emacs 307
13.2.5 Wily 308
13.3 Editor El tamaño apropiado de 314
13.4 Dimensionamiento moderado del software 316
Parte III 319
Capítulo 14 Idioma: C o no C 321
14.1 Unix La fertilidad del lenguaje 321
14.2 Por qué no C 323
14.3 Lenguajes interpretados y estrategias de mezcla 325
14.4 Evaluación del lenguaje 325
14.4.1 C 326
14.4.2 C++ 327
14.4.3 Shell 330
14.4.4 Perl 332
14.4.5 Tcl 334
14.4.6 Python 336
14.4.7 Java 339
14.4.8 Emacs Lisp 342
14.5 Tendencias futuras 344
14.6 Seleccionar el p>15.2 Elección del editor 350
15.2.1 Comprender vi 351
15.2.2 Comprender Emacs 351
15.2.3 La elección no religiosa: ambos Uso combinado 352
15.3 Generador de códigos especiales 352
15.3.1 yacc y lex 353
15.3 .2 Análisis de ejemplo: sintaxis fetchmailrc 356
15.3.3 Análisis de ejemplo: Glade 356
15.4 make: compilación automatizada 357
15.4.1 Teoría básica de make 357
15.4.2 Desarrollo sin marca en C/C++ 359
15.4.3 Objetivo de generación universal 359
15.4.4 Generar Makefile 362
15.5 Sistema de control de versiones 364
15.5.1 Por qué es necesario el control de versiones364
15.5.2 Control de versiones manual365
15.5.3 Control de versiones automatizado366
15.5.4 Herramientas de control de versiones de Unix 367
15.6 Depuración en tiempo de ejecución 369
15.7 Análisis de rendimiento 370
15.8 Uso de herramientas de integración de Emacs 370
15.8.1 Emacs y make 371
15.8.2 Emacs y depuración en tiempo de ejecución 371
15.8.3 Emacs y control de versiones 371
15.8.4 Emacs y creación de perfiles 372
15.8.5 Como IDE, pero más potente 373
Capítulo 16 Reutilización: sobre no reinventar la rueda 375
16.1 La historia de Pig Soldier 376
16.2 La transparencia es la clave para la reutilización 379
16.3 De la reutilización al código abierto 380
16.4 Lo mejor en la vida es la "apertura" 381
16.5 Dónde encontrarlo 384
16.6 Problemas con el uso de software de código abierto 385
16.7 Problemas de licencia 386
>
16.7.1 Cualificaciones de código abierto386
16.7.2 Licencias estándar de código abierto388
16.7.3 Cuándo necesita un abogado390
Parte IV 391
Capítulo 17 Portabilidad: Portabilidad del software y cumplimiento de estándares 393
17.1 La evolución del lenguaje C 394
17.1.1 Lenguaje C temprano 395
17.1.2 Estándar del lenguaje C 396
17.2 Estándar Unix 398
17.2.1 La batalla entre los estándares y Unix 398
17.2.2 El fantasma en la fiesta de celebración 401
17.2.3 Estándares Unix en el mundo del código abierto 402
17.3 Proceso de estandarización IETF y RFC 403
17.4 Especificación ADN, Código ARN 405
17.5 Programación de portabilidad 408
17.5.1 Portabilidad y selección del lenguaje de programación 409
17.5.2 Evitar dependencias del sistema 412
17.5. 3 Herramientas de migración 413
17.6 Internacionalización 413
17.7 Portabilidad, estándares abiertos y código abierto 414
Capítulo Capítulo 18 Documentación: Explicando el código al mundo en línea 417
18.1 Concepto de documento 418
18.2 Estilo Unix 420
18.2.1 Preferencia por documentos grandes 420
18.2.2 Estilo cultural 421
18.3 Varios formatos de documentos Unix 422
18.3.1 troff y Documenter's Workbench Tools 422
18.3.2 TEX 424
18.3.3 Texinfo 425
18.3.4 POD 425
18.3.5 HTML 426
18.3.6 DocBook 426
18.4 Caos actual y posibles soluciones 426
18.5 DocBook 427
18.5.1 Definición del tipo de documento 427
18.5.2 Otros DTD 428
18.5.3 DocBook cadena de herramientas 429
18.5.4 Herramienta de migración 431
18.5.5 Herramienta de edición 432
18.5 .6 Normas y prácticas relacionadas 433
18.5.7 SGML 433
18.5.8 Libros de referencia de XML-DocBook 433
18.6 Mejores prácticas para escribir documentos Unix 434
Capítulo 19 Código abierto: programación en la nueva comunidad Unix 437
19.1 Unix y código abierto 438
19.2 Mejores consejos para trabajar con desarrolladores de código abierto Mejores prácticas 440
19.2.1 Buenos parches prácticas 440
19.2.2 Buenas prácticas de denominación de archivos de archivos y proyectos 444
19.2.3 Buenas prácticas de desarrollo 447
19.2.4 Buenas prácticas de distribución y producción 450
19.2.5 Buenas prácticas de comunicación 454
19.3 La lógica de las licencias: cómo elegir 456
19.4 Por qué deberías utilizar una licencia estándar457
19.5 Varias licencias de código abierto457
19.5.1 Licencia MIT o X Consortium457
19.5.2 Licencia BSD clásica 457
19.5.3 Licencia artística 458
19.5.4 Público en General*
**Licencia 458
19.5.5 Mozilla Pública*** Licencia 459
Capítulo 20 El Futuro: Crisis y Oportunidad 461
20.1 Unix Tradición Necesidad y oportunidad 461
20.2 Plan 9: El camino hacia el futuro 464
20.3 Problemas en el diseño de Unix 466
20.3.1 Los archivos de Unix son solo una gran bolsa de palabras Sección 466
20.3.2 Unix tiene soporte GUI débil 467
20.3.3 La eliminación de archivos es irreversible 468
20.3.4 Unix asume que el sistema de archivos es estático 469
20.3.5 Control de trabajos mal diseñado 469
20.3.6 La API de Unix no utiliza excepciones 470
20.3.7 ioctl(2) y fcntl ( 2) Es una vergüenza471
20.3.8 El modelo de seguridad de Unix puede ser demasiado primitivo471
20.3.9 Hay demasiados tipos de nombres Unix472
20.3 .10 Teoría de archivos de que el sistema puede ser dañino 472
20.3.11 Hacia el espacio global de direcciones de Internet 472
20.4 Cuestiones ambientales de Unix 473
20.5 Cuestiones en la cultura Unix 475
p>20.6 Razones para confiar 477
Apéndice A Lista de abreviaturas 479
Apéndice B Referencias 483
Apéndice Colaboradores de C 495
Apéndice D Rootless Roots: La biografía del corazón del maestro desconocido de Unix 499
Colofón 510
Índice 511