As primeiras versões do Unix incluíam a ferramenta de Doug McIlroy tmg
("transmogrifier"), um dos primeiros compiladores-compiladores. O TMG foi implementado na linguagem assembly de Dennis Ritchie, bem como no próprio TMGL (a linguagem que o TMG traduz em assembly). Aqui está o manual do TMG (1972). Aqui está o código fonte completo da versão 6 Unix.
Como estou tentando entender como funcionava a implementação do TMG por McIlroy, estou lendo o arquivo tmgl.s
, uma tradução de tmgl.t
feita pelo TMG. E estou perplexo com os seguintes trechos:
.1=.
1
.2=.
2
.3=.
E:
goto;..2
..3:null
..2:
Li os manuais do PAL-11R e do Unix Assembly , mas não me lembro de uma explicação.
Particularmente:
.
significa "contador de localização", mas o que é.3=.
?..
significa "contador de realocação", mas o que é..3
?
(Para piorar as coisas, esse tipo de sintaxe parece ser encontrado apenas na implementação do TMG, não em qualquer outro arquivo de origem do Unix V6. E, para excluir a possibilidade de um código corrompido ou sintaxe descontinuada, as fontes do TMG compilam em um Python Emulador PDP-11 rodando Unix V6.)
.1
,..1
não têm nenhum significado especial. São identificadores simples (rótulos, variáveis, etc). A menos que declarados com.globl
, eles serão locais por padrão.Era assim naquela época e ainda é assim agora. Por exemplo,
gcc
está usando.
para evitar que variáveis estáticas entrem em conflito com símbolos definidos pelo usuário.Ele atribui ao símbolo local denominado
.3
o valor do contador de localização (o deslocamento dentro do segmento atual).