En la novela Jurassic Park de Michael Crichton , el programador descontento Dennis Nedry instala una puerta trasera en el código informático que controla el parque. Para desenredar el lío de Nedry, el ingeniero del parque Ray Arnold va "detrás de escena para mirar el código, las instrucciones línea por línea que le decían a la computadora cómo comportarse. Arnold estaba tristemente consciente de que el programa completo de Jurassic Park contenía más de la mitad de un millones de líneas de código, la mayoría sin documentar, sin explicación". [página 219] Crichton nos da al menos tres ejemplos del código de Nedry, que puede encontrar al final de esta pregunta.
Ahora, yo mismo soy un programador. Soy muy consciente de que este "código" no es ningún lenguaje vivo, no es sintácticamente plausible para ningún lenguaje informático y está claramente fabricado por parte de Crichton. Sin embargo, con eso como un hecho, todavía hay algunas semánticas que podemos inferir de este código, ¿verdad? ¿Qué podemos inferir sobre el propósito de estos fragmentos de código? y ¿ cómo logran su propósito? Las explicaciones dentro y fuera del universo son igualmente bienvenidas. :)
(página 219)
*/Jurassic Park Main Modules/
*/
*/ Call Libs
Include: biostat.sys
Include: sysrom.vst
Include: net.sys
Include: pwr.mdl
*/
*/Initialize
SetMain [42]2002/9A{total CoreSysop %4 [vig. 7*tty]}
if ValidMeter(mH) (**mH).MeterVis return
Term Call 909 c.lev { void MeterVis $303 } Random(3 #*MaxFid)
on SetSystem(!Dn) set shp_val.obj to lim(Val{d}SumVal)
if SetMeter(mH) (**mH).ValdidMeter(Vdd) return
on SetSystem(!Telcom) set mxcpl.obj to lim(Val{pd})NextVal
(página 230)
curV = GetHandl {ssm.dt} tempRgn {itm.dd2}.
curH = GetHandl {ssd.itl} tempRgn2 {itm.dd4}.
on DrawMeter(!gN) set shp_val.obj to lim(Val{d})-Xval.
if ValidMeter(mH) (**mH).MeterVis return.
if Meterhandl(vGT) ((DrawBack(tY)) return.
limitDat.4 = maxBits (%33) to {limit .04} set on.
limitDat.5 = setzero, setfive, 0 {limit .2 - var(szh)}.
on whte_rbt.obj call link.sst {security, perimeter} set to off.
vertRange = {maxRange+setlim} tempVgn(fdn-&bb+$404).
horRange = {maxRange-setlim/2} tempHgn(fdn-&dd+$105).
void DrawMeter send_screen.obj print.
(página 238)
Vg1 = GetHandl {dat.dt} tempCall {itm.temp}
Vg2 = GetHandl {dat.itl} tempCall {itm.temp}
if Link(Vg1,Vg2) set Lim(Vg1,Vg2) return
if Link(Vg2,Vg1) set Lim(Vg2,Vg1) return
on whte_rbt.obj link set security (Vg1), perimeter (Vg2)
limitDat.1 = maxBits (%22) to {limit .04} set on
limitDat.2 = setzero, setfive, 0 {limit .2 - var(dzh)}
on fini.obj call link.sst {security, perimeter} set to on
on fini.obj set link.sst {security, perimeter} restore
on fini.obj delete line rf whte_rbt.obj, fini.obj
Vg1 = GetHandl {dat.dt} tempCall {itm.temp}
Vg2 = GetHandl {dat.itl} tempCall {itm.temp}
limitDat.4 = maxBits (%33) to {limit .04} set on
limitDat.5 = setzero, setfive, 0 {limit .2 - var(szh)}
(página 239)
Vg1 = GetHandl {dat.dt} tempCall {itm.temp}
Vg2 = GetHandl {dat.itl} tempCall {itm.temp}
if Link(Vg1,Vg2) set Lim(Vg1,Vg2) return
if Link(Vg2,Vg1) set Lim(Vg2,Vg1) return
limitDat.1 = maxBits (%22) to {limit .04} set on
limitDat.2 = setzero, setfive, 0 {limit .2 - var(dzh)}
Vg1 = GetHandl {dat.dt} tempCall {itm.temp}
Vg2 = GetHandl {dat.itl} tempCall {itm.temp}
limitDat.4 = maxBits (%33) to {limit .04} set on
limitDat.5 = setzero, setfive, 0 {limit .2 - var(szh)}
Y aquí está el rastro que registró KeyCheck de las acciones de Nedry justo antes de que se apagara la seguridad. [página 228] Para que conste, los códigos ASCII son basura ( .*y XM..z.,4MZ.c.d.m7g?.cW<.,...+?..9Ygz.,4X.....9bdfg.p.?...MCX...
) que indican que Nedry simplemente estaba golpeando el teclado ("Probablemente solo estaba matando el tiempo", dijo Wu. "Hasta que finalmente decidió ponerse manos a la obra" [página 228 ] ] ) o que estaba en una GUI usando los códigos del teclado para la navegación (pero eso es inverosímil dado el rango de teclas que está presionando).
13,42,121,32,88,77,19,13,122,13,44,52,77,90,13,99,13,100,13,109,55,103
144,13,99,87,60,13,44,12,09,13,43,63,13,46,57,89,103,122,13,44,52,88,9
31,13,21,13,57,98,100,102,103,13,112,13,146,13,13,13,77,67,88,23,13,13
system
nedry
goto command level
nedry
040/#xy/67&
mr goodbytes
keycheck off
safety off
sl off
security
whte_rbt.obj
Desde una perspectiva puramente fuera del universo , estos fragmentos parecen ser un ejemplo perfecto del tropo Hollywood Hacking , con cada bloque de código que contiene una porción de texto legible por humanos.
en whte_rbt.obj llame a link.sst {seguridad, perímetro} desactivado.
aplastado en un trozo de basura sin sentido (para que el lector trabaje por ello y se sienta inteligente). Hay un ejemplo de esto en casi todos los fragmentos;
en fini.obj llamar a link.sst {seguridad, perímetro} activado
en fini.obj establecer link.sst {seguridad, perímetro} restaurar
en fini.obj eliminar línea rf whte_rbt.obj, fini.obj
Para que conste, Crichton era en realidad un programador bastante consumado por derecho propio. De hecho, su 'Oscar' fue en realidad un premio técnico que se le otorgó en 1995 por ser pionero en el software de programación y contabilidad de películas que todavía utilizan muchos estudios, por lo que definitivamente habría conocido la diferencia entre el software que realmente hizo algo, en oposición al software que simplemente parecía un software, pero no tiene ningún propósito real.
Esta discusión se publicó originalmente como parte de la pregunta, pero la estoy moviendo a una respuesta en su lugar:
Un fragmento termina la mayoría de sus declaraciones con un punto .
; el otro no usa ningún terminador de declaración en absoluto (excepto las líneas nuevas). Supongo que esto fue solo un descuido por parte de Crichton, pero hay algunos lenguajes reales en los que los terminadores de declaraciones son opcionales: por ejemplo, Javascript .
En un par de lugares, el código tiene if (some-condition) some-expression return
, como si fuera un lenguaje Sujeto-Objeto-Verbo. El único lenguaje SOV remotamente convencional que conozco es Forth . ¿Habría conocido Crichton a Forth? No estoy seguro de cuán plausible hubiera sido para Nedry escribir el sistema informático en Forth (y medio millón de líneas en Forth, para el caso).
Uno de los aspectos menos plausibles del código, en mi humilde opinión, es la gran variedad de caracteres de puntuación que utiliza. Expresiones como [42]2002/9A
y 3#*MaxFid
me parecen completamente inverosímiles... pero ¿hay algún idioma en el que tales expresiones sean significativas? ¿Qué pasa con el uso repetido de prefijo- !
(¿significa "no" como en C?) y prefijo- %
?
Una de las características más poderosas del lenguaje de Crichton parece ser la on
construcción, que parece configurar lo que hoy llamaríamos un "controlador de eventos" para monitorear el sistema y tomar medidas cuando se cumple una condición determinada. El código de Nedry contiene las cláusulas on SetSystem(!Dn)
, on SetSystem(!Telcom)
(anidadas dentro de la cláusula anterior, lo cual es emocionante) y, on whte_rbt.obj
la última de las cuales en realidad está escuchando el texto whte_rbt.obj
que se escribe .en el símbolo del sistema! (Página 230: "El gordo bastardo puso lo que parecía una llamada de objeto, pero en realidad es un comando...") ¿Cuál es el precedente más cercano para este tipo de cosas en los sistemas informáticos reales? La estrecha integración del lenguaje con el analizador de comandos me sugiere que esto se parece más a un antiguo sistema de mainframe (es decir, esto no es Unix; no lo sé).
La última característica ingeniosa del código de Nedry es que "El comando llamado fini.obj
restablece los parámetros vinculados... Pero hace algo más. Luego borra las líneas de código que se refieren a él. Destruye toda evidencia de que alguna vez estuvo allí. Bastante ingenioso". [página 238] No tengo conocimiento de ningún idioma, excepto quizás INTERCAL , que admita una automodificación tan fácil. Y simplemente "borrar [ing] las líneas de código" en realidad no sería lo suficientemente bueno, a menos que se interprete el lenguaje ... ¡o a menos que lo que estamos viendo aquí sea en realidad un volcado desensamblado del código binario real! Pero la idea de que esta es la idea de alguien de un volcado de ensamblador legible es aún más difícil de tragar para mí.
!
, &
, %
, **
parece similar a alguno de esos idiomas? Sospecho que no, pero realmente no lo sé. (¡Publica una respuesta! :))
FuzzyBoots
Quuxplusone
Mooz
Quuxplusone
NKCampbell
Quuxplusone
Valorum
usuario45485
Apolo
Aegon
Grandes apilamientos