2 pontos por GN⁺ 2023-08-28 | 1 comentários | Compartilhar no WhatsApp
  • Uma página que reúne mensagens de erro do compilador MPW C da Apple; segundo ela, são trechos reais obtidos ao decompilar o recurso String do compilador
  • Em vez de diagnósticos comuns de compilador, transmite especificações ANSI C, restrições de tipo e erros de sintaxe com frases que misturam piadas e sátira
  • Os exemplos incluem erros da linguagem C como tamanho de literais de string, labels dentro de switch, posição de typedef, combinação de volatile/register e modificação de constantes
  • Mira diretamente em situações específicas de compilação, como manipulação de void *, casting de void, redefinição de struct e erros envolvendo goto e inicialização de variáveis automáticas
  • Acrescenta que o compilador tem 324 KB, que a lista publicada pode ser apenas um trecho e não o conjunto completo, e que a questão de direitos autorais também não é clara

Coletânea de mensagens de erro do compilador MPW C

  • É uma página que lista algumas mensagens de erro geradas pelo compilador MPW C da Apple
  • As mensagens são apresentadas como saídas reais, obtidas ao decompilar o recurso String do compilador
  • Como o compilador tem 324 KB, a lista pode ser apenas uma seleção, não o conjunto completo
  • A página afirma não ter certeza sobre a questão de direitos autorais

Exemplos de diagnósticos reais que parecem piadas

  • Mensagens que brincam com a sintaxe de C e a especificação ANSI

    • Limite de tamanho de literal de string:
      • "String literal too long (I let you have 512 characters, that's 3 more than ANSI said I should)"
    • Erro indicando que dentro de uma instrução switch só deve haver labels case ou default:
      • "...And the lord said, 'lo, there shall only be case or default labels inside a switch statement'"
    • Situação em que um nome typedef inesperado foi encontrado:
      • "a typedef name was a complete surprise to me at this point in your program"
    • Mensagem que cita uma cláusula do ANSI C para apontar que o alvo de um cast deve ser escalar:
      • "type in (cast) must be scalar; ANSI 3.3.4; page 39, lines 10-11 (I know you don't care, I'm just trying to annoy you)"
  • Erros relacionados a tipos e declarações

    • Mensagem dizendo que volatile e register não podem ser usados juntos:
      • "'Volatile' and 'Register' are not miscible"
    • Erro que expressa de forma satírica que uma constante não pode ser modificada:
      • "You can't modify a constant, float upstream, win an argument with the IRS, or satisfy this compiler"
    • Situação em que se tenta redefinir uma struct já definida:
      • "This struct already has a perfectly good definition"
    • Restrição de cast relacionada a void:
      • "Can't cast a void type to type void (because the ANSI spec. says so, that's why)"
    • Mensagem dizendo que não se pode manipular void * de qualquer jeito:
      • "can't go mucking with a 'void *'"
  • Expressões de erro curtas ou exageradas

    • Erro curto e direto:
      • "Huh ?"
    • Situação em que uma função já processada aparece de novo:
      • "we already did this function"
    • Erro longo que trata ao mesmo tempo de um goto vindo de fora do bloco, uma variável automática com initializer e uma janela estreita demais:
      • "This label is the target of a goto from outside of the block containing this label AND this block has an automatic variable with an initializer AND your window wasn't wide enough to read this whole error message"
    • Situação em que /* é encontrado dentro de um comentário:
      • "Call me paranoid but finding '/*' inside this comment makes me suspicious"
    • Situação em que há erros demais em uma linha:
      • "Too many errors on one line (make fewer)"
    • Erro fatal de heap por tabela de símbolos cheia:
      • "Symbol table full - fatal heap error; please go buy a RAM upgrade from your local Apple dealer"

1 comentários

 
GN⁺ 2023-08-28
Comentários do Hacker News
  • Sinto falta da época em que havia essa brincadeira na computação
    Quando eu estava na Amazon, meu gerente disse que, antigamente, ao atualizar a página 404, escaneou um desenho de gato feito pela filha e colocou no corpo da página. Quando entrei em 2009, a imagem ainda estava lá, mas em algum momento alguém deve ter percebido e trocado por uma foto stock de um cachorro. Mesmo assim, o nome do asset ainda era kayli-kitty.jpg e, depois, quando voltou a ser uma rotação de fotos, os vestígios do original desapareceram

  • “Symbol table full - fatal heap error; please go buy a RAM upgrade from your local Apple dealer” me lembra os velhos tempos em que ainda dava para comprar um upgrade de RAM depois de comprar o computador
    Hoje seria: “Symbol table full - fatal heap error; please go buy a new Mac with more RAM”

    • Não necessariamente. O Classic Mac OS não tinha suporte a memória virtual, então tudo precisava caber na RAM, a menos que o próprio programa descarregasse para o disco os dados que não estivesse usando
      Sistemas operacionais modernos todos suportam swapping, então a compilação continua, só fica muito mais lenta. Para realmente ficar “sem memória” em um computador moderno, é preciso encher tanto a RAM quanto o disco
    • Entendo o argumento da memória unificada no SoC, mas ainda assim é uma pena. Nem o novo Mac Pro tem slots de RAM
    • Se você quer RAM com possibilidade de upgrade, sempre pode usar um PC
    • Hoje em dia é ainda mais assim. Um Apple Silicon Mac consegue armazenar o dobro de informação com a mesma quantidade de memória, então até uma configuração modesta de 8 GB comporta 16 GB de boilerplate de FizzBuzz, quatro abas do Google Chrome ou 20% de um node_modules médio
  • “a typedef name was a complete surprise to me at this point in your program”
    Eu gostava da época em que existiam mensagens de erro de compilador engraçadas. Lembro de ter visto esta em um compilador de um fornecedor: “No! But they'll only let me warn you. Danger Will Robinson! Danger!”
    Também havia “Really! If you are fussing around with void *, just go home or at least back to your editor!”. Acho que o gerente de TI continuava usando aquele fornecedor por causa dessa mensagem. O SDK era mais ou menos, mas era divertido

    • Não programei muito em C, então fico curioso sobre o contexto: por que void* era um problema tão grande?
  • Programei no MacOS original desde que isso se tornou possível. Lembro de muitas dessas mensagens de erro. Em especial, lembro de “Too many errors on one line (make fewer)”
    Também me vem à cabeça que, quando um único arquivo de cabeçalho mudava, o build levava 45 minutos

    • Naquela época, eu só fazia extensões de sistema, plug-ins e XCMD misturando 68k, C e Pascal. Os projetos eram todos pequenos, então tempo de compilação não era problema, e o MPW parecia o paraíso
      O maior XCMD tinha as três linguagens, e o MPW linkava tudo sem reclamar; também era fácil automatizar projetos com pequenos blocos de código que precisavam ser colados dentro de um único arquivo. Lembro de cair na gargalhada sempre que aparecia uma mensagem de erro rara. Quem fez isso mandou bem
  • Depois de usar esse compilador por alguns anos, passei a conseguir “descompilar” mentalmente, na hora, o código objeto 68k gerado para código C, desde que as funções não fossem grandes demais
    Com o MacNosy, normalmente era possível recriar o fonte C de um app em poucas horas. Eu tinha um script que convertia o arquivo MacNosy do app em um arquivo assembler e um arquivo rsrc, e dava para ir movendo funções para C uma a uma mantendo um app compilável equivalente ao original. No começo usei isso para hackear jogos, mas às vezes também para corrigir bugs
    O fato de a geração de código do compilador MPW C ser tão previsível se devia em parte à simetria do conjunto de instruções 68k. Eles fizeram um compilador simples, e ele funcionava bem. A maior parte do esforço foi para outros lugares. Como dava para prever com bastante precisão que código sairia, se você não gostasse da geração de código, bastava ajustar o fonte. Também gosto do fato de o compilador javac ter uma filosofia parecida. Depois que você conhece os padrões, dá para produzir bytecode quase ótimo

  • No início dos anos 90, o compilador Glockenspiel C++ usado em uma empresa de treinamento era algo derivado do cfront, e minha mensagem de erro de sintaxe favorita era simplesmente “core dumped”
    Era bem constrangedor explicar isso em um curso pago para alunos que já estavam sofrendo com o próprio C++

    • O usuário só precisa rodar o depurador e ver o backtrace no arquivo core. Com o tempo, ao ganhar experiência, ele vai aprender a associar diferentes endereços hexadecimais a diferentes tipos de erro, então não há mal nenhum
  • “Call me paranoid but finding '/*' inside this comment makes me suspicious” — isso não é da conta do senhor

    • Às vezes penso que seria bom se o compilador tivesse suporte a comentários de bloco aninhados. Algo como: se houver outro /* dentro de um /*, então seriam necessários dois */ para encerrar
      Na prática talvez seja uma ideia horrível, mas houve várias situações em que isso teria economizado tempo
  • Fugindo um pouco do conteúdo da página, eu gostava muito do modo como muitos utilitários do MPW geravam a saída, inclusive mensagens de erro, em forma de comandos
    Como o terminal era um buffer do editor, dava para levar o cursor até aquela linha, ou clicar nela, e então pressionar algo como cmd-enter para abrir o arquivo correspondente

    • Acho que executar o texto selecionado era simplesmente a tecla Enter
    • Parece Plan 9
  • “a typedef name was a complete surprise to me at this point in your program”
    Já vi essa lista incontáveis vezes, mas essa mensagem ainda me faz rir alto toda vez que a vejo

    • É muito melhor do que “Redefinition of ...” ou “Static declaration follows non-static” do gcc
  • Discussão anterior: https://news.ycombinator.com/item?id=30238928
    Para acrescentar contexto: o compilador MPW C que criou essas mensagens, na verdade, não foi desenvolvido internamente pela Apple, mas contratado da Green Hills Software[1]. Isso aparece na página da Wikipedia[2] e na fonte dela[3]; curiosamente, essa própria fonte é justamente sobre este assunto
    [1] https://en.m.wikipedia.org/wiki/Green_Hills_Software
    [2] https://en.m.wikipedia.org/wiki/Macintosh_Programmer%27s_Wor...
    [3] https://web.archive.org/web/20140528005901/http://lists.appl...