O que podemos inferir sobre a linguagem de programação usada em “Jurassic Park” (o livro, não o filme)?

8

No romance de Michael Crichton Jurassic Park, o desapontado programador Dennis Nedry cria um backdoor no código do computador que controla o parque. Para desembaraçar a bagunça de Nedry, o engenheiro de parque Ray Arnold fica "nos bastidores para examinar o código - as instruções linha por linha que informavam ao computador como se comportar. Arnold estava infelizmente tristemente ciente de que o programa completo do Jurassic Park continha mais da metade de milhões de linhas de código, a maioria não documentada, sem explicação ".[página 219] Crichton nos fornece pelo menos três exemplos do código de Nedry, que você pode encontrar no final desta pergunta.

Agora, eu também sou programador. Estou ciente de que esse "código" é não qualquer língua viva, é não sintaticamente plausível para qualquer linguagem de computador e é claramente fabricado por parte de Crichton. No entanto, com isso como dado, ainda existem algumas semânticas que podemos inferir desse código, certo? O que podemos inferir sobre a finalidade desses trechos de código? e como eles cumprem seu propósito? Explicações dentro e fora do universo são igualmente bem-vindas. :)

(página 219)

* / Módulos principais do Jurassic Park / * / * / Call Libs Inclui: biostat.sys Inclui: sysrom.vst Inclui: net.sys Inclui: pwr.mdl * / * / Inicializa o SetMain [42] 2002 / 9A {total de CoreSysop% 4 [vig. 7 * tty]} se ValidMeter (mH) (** mH) .MeterVis retornar chamada de prazo 909 c.lev {void MeterVis $ 303} Aleatório (3 # * MaxFid) no SetSystem (! Dn) defina shp_val.obj como lim ( Val {d} SumVal) se SetMeter (mH) (** mH) .ValdidMeter (Vdd) retornar no SetSystem (! Telcom) defina mxcpl.obj como lim (Val {pd}) NextVal

(página 230)

curV = GetHandl {ssm.dt} tempRgn {itm.dd2}. curH = GetHandl {ssd.itl} tempRgn2 {itm.dd4}. no DrawMeter (! gN), defina shp_val.obj como lim (Val {d}) - Xval. se ValidMeter (mH) (** mH) .MeterVis retornar. se Meterhandl (vGT) ((DrawBack (tY)) retornar. limitDat.4 = maxBits (% 33) para {limite .04} definido como. limitDat.5 = setzero, setfive, 0 {limite .2 - var (szh) }. on whte_rbt.obj chame link.sst {segurança, perímetro} desativado. vertRange = {maxRange + setlim} tempVgn (fdn- & bb + $ 404). horRange = {maxRange-setlim / 2} tempHgn (fdn- & dd + $ Nulo DrawMeter send_screen.obj print.

(página 238)

Vg1 = GetHandl {dat.dt} tempCall {itm.temp} Vg2 = GetHandl {dat.itl} tempCall {itm.temp} se Link (Vg1, Vg2) definir Lim (Vg1, Vg2) retornar Lim (Vg2, Vg1) retornar se Link (Vg2, Vg1) configure Lim (Vg1, Vg2) retorne no whte_rbt.obj segurança do conjunto de links (Vg1), perímetro (Vg22) limitDat.04 = maxBits (% 2) como {limit .0} definido em limitDat.2 = setzero, setfive, XN limit .1 - var (dzh)} na chamada fini.obj link.sst {segurança, perímetro} ativada em fini.obj conjunto link.sst {segurança, perímetro} restauração no fini.obj excluir linha rf whte_rbt.obj, fini.obj Vg2 = GetHandl {dat.dt} tempCall {itm.temp} Vg4 = GetHandl {dat.itl} tempCall {itm.temp} limitDat.33 = maxBits (% 04) para {limitar .5} definido em limitDat. 0 = setzero, setfive, 2 {limite .XNUMX - var (szh)}

(página 239)

Vg1 = GetHandl {dat.dt} tempCall {itm.temp} Vg2 = GetHandl {dat.itl} tempCall {itm.temp} se Link (Vg1, Vg2) definir Lim (Vg1, Vg2) retornar Lim (Vg2, Vg1) retornar se Link (Vg2, Vg1) defina Lim (Vg1, Vg22) retorne limitDat.04 = maxBits (% 2) como {limit .0} definido em limitDat.2 = setzero, setfive, 1 {limit .2 - var (dzh)} Vg4 = GetHandl {dat. dt} tempCall {itm.temp} Vg33 = GetHandl {dat.itl} tempCall {itm.temp} limitDat.04 = maxBits (% 5) para {limitar .0} definido em limitDat.2 = definido em limitDat.XNUMX = setzero, setfive, XNUMX {limit .XNUMX - var (szh)}

E aqui está o rastro que o KeyCheck registrou das ações de Nedry, pouco antes da segurança ser desligada.[página 228] Para o registro, os códigos ASCII são lixo (.*y XM..z.,4MZ.c.d.m7g?.cW<.,...+?..9Ygz.,4X.....9bdfg.p.?...MCX...), indicando que Nedry estava apenas pressionando o teclado ("Provavelmente apenas matando o tempo", disse Wu. "Até que ele finalmente decidisse fazer isso")[página 228]) ou então ele estava em uma GUI usando os códigos do teclado para navegação (mas isso é implausível, considerando o intervalo de teclas que ele está pressionando).

Sistema 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 nedry goto nível de comando nedry 040 / # xy / 67 e mr goodbytes keycheck off safety off sl off security whte_rbt.obj
por Quuxplusone 26.07.2016 / 05:45

2 respostas

De um puramente fora do universo perspectiva, esses trechos parecem ser um exemplo perfeito da Hollywood Hacking tropeço, com cada bloco de código contendo um pedaço de texto legível por humanos

on whte_rbt.obj call link.sst {security, perimeter} set to off.

esmagado em um pedaço de lixo sem sentido (para fazer o leitor trabalhar por ele e se sentir esperto). Há um exemplo disso em praticamente todos os trechos;

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


Para constar, Crichton era na verdade um programador bastante talentoso. De fato, seu 'Oscar' era na verdade um prêmio técnico dado a ele no 1995 por ser pioneiro no software de programação e contabilidade de filmes ainda usado por muitos estúdios, então ele definitivamente saberia a diferença entre o software que realmente fez alguma coisa, em oposição ao software que apenas olhou como software, mas não serve a nenhum propósito real.

28.07.2016 / 12:12

Esta discussão foi originalmente postada como parte da pergunta, mas estou passando para uma resposta:

  • Um trecho termina a maior parte de suas declarações com um período .; o outro não usa nenhum terminador de instrução (exceto as novas linhas). Acho que isso foi apenas um descuido da parte de Crichton, mas existem alguns idiomas reais nos quais os terminadores de instruções são opcionais: por exemplo Javascript.

  • Em alguns lugares, o código tem if (alguma condição) alguma expressão retornar, como se fosse uma linguagem Subject-Object-Verb. A única linguagem SOV convencionalmente remota que conheço é Adiante. Crichton teria se familiarizado com Forth? Não tenho certeza de quão plausível teria sido para Nedry escrever o sistema de computadores na Forth (e meio milhão de linhas da Forth, nesse caso).

  • Um dos aspectos menos plausíveis do código, IMHO, é a grande variedade de caracteres de pontuação que ele usa. Expressões como [42] 2002 / 9A e 3 # * MaxFid me parece completamente implausível ... mas existem idiomas nos quais essas expressões sejam significativas? E o uso repetido de prefixos-! (significa "não" como em C?) e prefixo%?

  • Uma das características mais poderosas da linguagem de Crichton parece ser a on construção, que parece configurar o que hoje chamaríamos de "manipulador de eventos" para monitorar o sistema e tomar medidas quando uma determinada condição for atendida. O código de Nedry contém as cláusulas no SetSystem (! Dn), no SetSystem (! Telcom) (aninhado dentro a cláusula anterior, que é empolgante) e em whte_rbt.obj - o último dos quais está de alguma forma ouvindo o texto whte_rbt.obj ser digitado no prompt de comando! (Página 230: "O bastardo gordo colocou o que parecia ser uma chamada de objeto, mas na verdade é um comando ...") Qual é o precedente mais próximo desse tipo de coisa em sistemas de computador reais? A forte integração da linguagem com o analisador de comandos sugere que isso é mais como um sistema antigo de mainframe (isto é, é não Unix; eu faço não Saiba isso.)

  • A característica final bacana do código de Nedry é que "o comando chamado fini.obj redefine os parâmetros vinculados ... Mas faz outra coisa. Em seguida, apaga as linhas de código que se referem a ele. Destrói todas as evidências que já existiram. Muito liso. "[página 238] Não conheço nenhum idioma, exceto talvez INTERCAL que suportam essa auto-modificação fácil. E apenas "apagar as linhas de código" não seria bom o suficiente, a menos que a linguagem fosse interpretada ... ou a menos que o que estamos vendo aqui seja realmente um lixeira desmontada do código binário real! Mas a ideia de que essa é a ideia de alguém de um despejo de montador legível é ainda mais difícil para eu engolir.

26.07.2016 / 06:26