1 pontos por GN⁺ 2024-09-27 | 1 comentários | Compartilhar no WhatsApp

Os recursos de extensão de linguagem perdidos do compilador High C da MetaWare

Compiladores C dos anos 1980

  • Nos anos 1980, muitas pequenas empresas competiam entre si oferecendo várias extensões de linguagem
  • A Phar Lap desenvolveu um extensor DOS capaz de aproveitar o processador 32-bit 80386, e a MetaWare portou o compilador High C para isso
  • A Fujitsu integrou o extensor DOS da Phar Lap à plataforma FM TOWNS, e o High C se tornou o compilador C padrão dessa plataforma

Extensões de linguagem únicas do High C

  • O High C incluía não apenas extensões específicas de DOS, mas também várias extensões de linguagem voltadas ao usuário
  • Alguns recursos só foram incorporados aos padrões oficiais décadas depois, e alguns ainda não existem em C ou C++

Uso de sublinhado em literais numéricos

  • É possível usar sublinhados para separar literais numéricos longos e facilitar a leitura
  • O C++ introduziu esse recurso no C++14, e o C o introduziu no C23

Argumentos rotulados

  • É possível rotular argumentos ao chamar funções com muitos parâmetros
  • É semelhante a um recurso popular do Python, e, quando há rótulos de argumento, eles podem ser especificados independentemente da ordem
  • O C e o C++ padrão ainda não têm esse recurso

Casos por intervalo

  • Oferece um recurso para corresponder intervalos de valores, como em Pascal
  • O C e o C++ padrão não têm esse recurso

Funções aninhadas

  • É possível declarar uma função aninhada dentro de outra função
  • Funções aninhadas podem ser declaradas com o tipo "valor de função completo", que funciona como um closure sem escape
  • Oferece uma implementação mais completa do que a extensão de funções aninhadas do GCC
  • O C padrão ainda não tem um recurso oficial de funções aninhadas

Geradores

  • Suporta corrotinas geradoras no estilo Python
  • Funções geradoras podem produzir valores várias vezes, e cada valor pode ser processado em sequência usando uma nova sintaxe de loop for
  • Permite interações complexas com o recurso de funções aninhadas
  • É improvável que o C padrão incorpore esse recurso

Resumo do GN⁺

  • O compilador High C da MetaWare oferecia várias extensões de linguagem nos anos 1980, aumentando bastante a expressividade da linguagem C
  • Alguns recursos só foram incorporados aos padrões oficiais décadas depois, e alguns ainda não existem em C ou C++
  • Recursos avançados como geradores e funções aninhadas são difíceis de encontrar até mesmo em muitas linguagens de programação atuais
  • Este artigo ajuda a entender a história e o processo de evolução da linguagem C, além de oferecer insights interessantes sobre design de linguagens de programação

1 comentários

 
GN⁺ 2024-09-27
Comentários no Hacker News
  • Em 2011, alguém escreveu um for orientado por iterador. Na época, imaginou como seria se isso entrasse no padrão do C++

  • Alguém possui o High C/C++ Language Reference

  • Recursos disponíveis em D (ou Das BetterC):

    • permite usar sublinhados em literais
    • permite especificar intervalos em case
    • permite usar argumentos nomeados
    • permite usar funções aninhadas
    • permite usar funções aninhadas estáticas
    • oferece algo semelhante a geradores
  • O compilador C lcc-win adicionou sobrecarga de operadores, argumentos padrão de função e sobrecarga de funções

  • O compilador C do Plan 9 introduziu várias extensões de linguagem, e algumas delas acabaram entrando no padrão C

  • Hoje o GCC oferece suporte à flag -fplan9-extensions, fornecendo recursos como conversão automática de ponteiros para struct em campos anônimos

  • A pessoa que introduziu esses recursos estava muito à frente do seu tempo. É uma pena que isso não tenha influenciado o padrão

  • O assunto relacionado já havia aparecido antes no Hacker News

  • Há quem se pergunte se existe uma cópia em PDF

  • As literais de string no código de exemplo terminam com ¥n em vez de \n por causa da code page Shift-JIS

  • Os geradores fazem lembrar a questão de iteração interna/externa no Rust e try_fold()

  • A tipografia do livro parece ao mesmo tempo bonita e horrível

  • Não conhecem bem a notação japonesa nem as regras de kerning, mas parece que uma fonte de largura variável foi forçada a caber em células monoespaçadas

  • É bom que os exemplos de código não estejam em fonte 8pt

  • Há quem pergunte se o livro foi escrito em japonês ou escrito em inglês e depois traduzido para o japonês

  • Se veio da Fujitsu, é bem provável que tenha sido escrito em japonês. A qualidade do inglês em instruções printf e comentários de código de quem não é nativo impressiona

  • Especialmente os recursos relacionados a geradores estavam muito à frente do seu tempo para aquela época

  • Talvez isso também tenha sido possível porque a Fujitsu não passou por um processo de padronização. Mas esse também é o motivo de essas extensões terem sido redescobertas e reinventadas no C/C++ moderno