PT2633399T - Método e sistema para gerar um código - Google Patents

Método e sistema para gerar um código Download PDF

Info

Publication number
PT2633399T
PT2633399T PT118078732T PT11807873T PT2633399T PT 2633399 T PT2633399 T PT 2633399T PT 118078732 T PT118078732 T PT 118078732T PT 11807873 T PT11807873 T PT 11807873T PT 2633399 T PT2633399 T PT 2633399T
Authority
PT
Portugal
Prior art keywords
code
source code
jump
destination
instruction
Prior art date
Application number
PT118078732T
Other languages
English (en)
Inventor
Bernecker Thorsten
Original Assignee
Innowake Gmbh
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Innowake Gmbh filed Critical Innowake Gmbh
Publication of PT2633399T publication Critical patent/PT2633399T/pt

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/51Source to source
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Circuits Of Receivers In General (AREA)
  • Stored Programmes (AREA)

Description

DESCRIÇÃO MÉTODO E SISTEMA. PARA GERAR DM CÓDIGO Área da invenção A invenção refere-se a ura método implementado por computador para gerar código para execução em um ambiente de tempo de execução. Além disso, a invenção refere-se a uma unidade de manipulação de código intermediária para gerar código dentro de um ambiente de tempo de execução, bem como a um sistema para gerar código para execução em um ambiente de tempo de execução.
Antecedentes e estado da arte
Na área de sistemas operacionais e aplicações de software, há um longo desejo de aceder e executar aplicativos originalmente criados para sistemas e hospedeiro ou mainframes em sistemas de computadores mais modernos e poderosos. Isso geralmente implica oferecer a mesma funcionalidade disponivel anteriormente no aplicativo de software no sistema de destino. No entanto, muitas vezes é impossível simplesmente recompilar o código-fonte do aplicativo no novo sistema porque os compiladores não estão disponíveis na plataforma de destino.
Além disso, um objetivo concorrente ao mover aplicativos para uma nova plataforma é tornar o código fonte disponível em uma linguagem de programação do modem, por exemplo, uma linguagem de programação orientada a objetos. Tal objetivo pode manifestar-se em um requisito para transformar o código fonte de um aplicativo de COBOL, Natural ou PL/1 em código-fonte Java.
Transformar o código fonte original em uma linguagem de programação do modem permite a compilação em muitas plataformas diferentes, pois esses compiladores estão disponíveis em uma grande variedade de plataformas de hardware e sistemas operacionais. O código-fonte transformado pode então ser facilmente compilado no sistema de destino desejado.
Além disso, os programas transformados são mais facilmente e economicamente mais flexíveis e atualizáveis.
Existem formas conhecidas de transformar o código-fonte de uma linguagem de programação para outra automatizada. As construções de linguagem de um idioma original são mapeadas para construções de idioma em um idioma de destino. 0 objetivo disso é criar a menor diferença possível entre a estrutura do programa da aplicação original e a estrutura do programa de destino, ou seja, criando uma transformação de declaração para declaração do código fonte original. Desta forma, o código-fonte original e o código-fonte de destino são muito parecidas, de facto familiares para quem conhece o código original da aplicação. A alta semelhança garante melhor capacidade de manutenção.
No entanto, diferentes paradigmas de design na linguagem original e de destino muitas vezes tornam impossível essa transformação de declaração a declaração. 0 código-fonte original e de destino exibe enormes diferenças. Isso é exasperado pelo facto de que a linguagem de programação original contém construções de linguagem que não estão disponiveis na linguagem de programação de destino.
Tais construções linguísticas são, por exemplo, instruções de salto. As linguagens processuais, como a Natural e a COBOL, costumam usá-las para controlar o fluxo do programa. A execução do programa para em um ponto e continua em outro. A linguagem de programação Natural tem o comando REINPUT que força a execução do programa a continuar no ponto do programa que a última solicitou a entrada do usuário. REINPUT pode ser usado em qualquer lugar no código Natural. 0 uso intenso de instruções de salto em linguagens de programação processuais leva a grandes partes do código-fonte original que requer uma transformação que não emprega uma transformação de declaração para declaração, Em vez disso, essas partes do código precisam ser reestruturadas massivamente ou mesmo requerem uma reimplementação manual. Mesmo que o código transformado seja semanticamente correto, o código transformado pode não ser sintaticamente equivalente ao código original. Tal transformação, portanto, tem a desvantagem de não ser reconhecível em comparação cora a estrutura original do programa*
David Doolin, Jack Dongarra, Keith Seymour, "jl&pack -Compiling 1APÃCK Fortran to Javaw, (20000525), Citeseer, URL; hf tp: //citesserx. ist, ps-u .· edu /vi ewdo-c / s -aramar y ?do i ~ 10,1.1,33. 6090, XP002630913refere-ge a sub-rotinas numéricas traduzidas de seu sub-módulo Fortran 77 fonte em arquivos de classe, executáveis pela Java Virtual Machine (JVM) e ::ãitá||iidqs uli· ;||$ί&ίϊίϊ iáva:,;:::: isao tqrúa, piÓÉililil· oh: íáppiets;:,. diáÉ^ifedldqS' -na,
World Wide Web (WWW) para usar o código numérico legado ||di :|Íl||ÍiÍpésCé: escrito' p|||FÇtfrãil':, A ............. tradução é realizada usando um compilador fortran-to-Java especial (source-to-source). US 200603182G AI relaciona-se a um método para a transformação do programa e um aparelho para a transformação do programa COBOL para Java, O método consiste era; (1) uma abordagem para a transformação do programa declaração-declaração, facilitada por uma biblioteca de linguagem de destino predefinida, que mantém comentários originais, fluxo de controlo de programa, funcionalidade e complexidade de tempo; (2) uma abordagem para a eliminação da declaração goto, que usa mecanismo de manipulação de exceção existente na linguagem de destino e sua implementação está escondida em uma super classe em uma biblioteca; (3) um BNF estendido para distinguir diferentes ocorrências do mesmo termo em uma produção de BNF; (4) uma nova abordagem para declaração embutida como uma declaração de marcador especial e um comentário, (5) na descrição do acima, uma linguagem de especificação de transformação de programa é definida para descrever a relação entre comentários em duas linguas. (6) um aparelho, como a forma de realização preferida do método, é um sistema de transformação do programa COBOL para Java Cobol2Java; um exemplo de aplicação COBOL e sua tradução Cobol2Java são fornecidas.
Objeto da invenção 0 objetivo da invenção é fornecer um método e um sistema que permitam transformar o código fonte original em uma linguagem de programação original em um código-fonte de destino semanticamente idêntico e sintaticamente quase idêntico em uma linguagem de programação de destino, pelo que a transformação das construções de linguagem na programação original 0 idioma que não está disponível na linguagem de programação de destino ainda é possível, mantendo uma semelhança mais próxima da estrutura original. Um objeto particular da invenção é transformar qualquer código fonte original em uma linguagem de programação original para código fonte em uma linguagem de programação de destino onde o código fonte original contém instruções de salto que não estão disponíveis na linguagem de programação de destino.
Solução de acordo com a invenção
Este objeto é resolvido pelos métodos, unidades de manipulação de código, sistemas e produtos de programas de computador de acordo com as respetivas reivindicações independentes. A solução de acordo com a invenção permite a transformação de programas no código fonte original para o código-fonte de destino que possui uma estrutura similar, mesmo que a linguagem de programação de destino não permita instruções de salto. A invenção permite assim manter a estrutura do programa original quando foi criada em uma linguagem de programação original e transformada em um novo programa em um idioma de destino do modem, criando as instruções de salto que não estão disponíveis na fonte deste idioma de destino do modem em seu executável (objeto) código. Isso permite manter estruturas de programação bem conhecidas e compreendidas a partir de programas existentes na linguagem de programação de destino. 0 código resultante no idioma de destino permanece como reconhecível e sustentável como o código original. Isso também aumenta a probabilidade de o aplicativo na linguagem de programação de destino executar corretamente.
Além disso, isso permite uma transformação declaração-para-indicação do código-fonte original no código-fonte de destino.
As formas de realização preferidas compreendem os seguintes recursos.
Pelo menos, um fragmento de código fonte inserido no código-fonte de destino está adaptado para executar instruções de programa que são funcionalmente equivalentes a uma instrução de salto estático colocada no código-fonte original, se o destino da instrução de salto estiver dentro da moldura da pilha do salto instrução.
Pelo menos, um fragmento de código-fonte inserido no código-fonte de destino está adaptado para executar instruções de programa que são funcionalmente equivalentes a uma instrução de salto dinâmico colocada no código-fonte original, se o destino da instrução de salto estiver fora do quadro da pilha do salto instrução.
Pelo menos, um fragmento de código-fonte inserido no código-fonte de destino é adaptado para executar instruções de programa que são funcionalmente equivalentes a uma instrução de salto dinâmico colocada no código-fonte original, se o destino da instrução de salto estiver dentro da estrutura da pilha do salto instrução. 0 fragmento do código-fonte inserido no código-fonte de destino compreende ainda uma variável auxiliar que contém o destino do salto e que é avaliada pela declaração do interruptor. A linguagem de programação de destino compreende uma linguagem de programação que não permite declarações de salto do tipo GOTO em seu código-fonte. A linguagem de programação de destino compreende pelo menos uma de Java e uma linguagem de programação que é executável no ambiente de tempo de execução .NET. A linguagem de programação de origem compreende uma linguagem de programação que permite declarações de salto em seu código-fonte. A linguagem de programação de origem é pelo menos uma de Cobol, Natural e PL/1. 0 método compreende ainda um passo de criação de código final a partir do código fonte de destino, pelo que o código final compreende código independente de hardware, sendo o código final para execução em um ambiente de tempo de execução. 0 ambiente de tempo de execução compreende uma máquina virtual Java.
Pelo menos, um fragmento de código fonte inserido no código-fonte de destino pode ser adaptado para executar instruções de programa que são funcionalmente equivalentes a uma instrução de salto dinâmico colocada no código-fonte original, se o destino da instrução de salto estiver fora da estrutura de pilha das instruções de salto. A unidade de manipulação de código pode ser adaptada para inserir na fonte de destino, pelo menos, uma variável auxiliar que mantenha o destino do salto e que é avaliada pela declaração de mudança. 0 sistema de acordo pode ainda compreender meios para criar código final a partir do código fonte de destino, pelo que o código final compreende código independente de hardware, sendo o código final para execução em um ambiente de tempo de execução.
Em outras formas de realização preferidas da invenção, uma ou mais das seguintes caracteristicas podem ser compreendidas: A instrução de salto, pelo menos, inserida no código final pode conter o tratamento de exceções.
Pelo menos, uma declaração de salto inserida no código final pode incluir um salto direto dentro do código final, se o destino do salto estiver dentro da área válida do salto direto. A área válida é o quadro de pilha de uma sub-rotina da pilha de chamadas, pelo que a pilha de chamadas é composta por quadros de pilha. Cada quadro de pilha corresponde a uma chamada para uma sub-rotina que ainda não terminou com um retorno. 0 quadro de pilha na parte superior da pilha de chamadas é para a rotina que está sendo executada atualmente. A declaração de manipulação de exceção pode ser adaptada para aceitar e lidar com pelo menos uma exceção de indicação de sinalização. A declaração de manipulação de exceção pode ser adaptada ao sinal, ao aceitar pelo menos a exceção da declaração de sinalização, uma exceção se a declaração de manipulação de exceção não estiver dentro da área válida do destino de salto do salto direto. A indicação de sinalização pode ser inserida no código final através da unidade de manipulação de código intermediário.
Durante a compilação do código-fonte original no código-fonte de destino, podem ser criados dados de controlo que são alimentados para a unidade de manipulação de código intermediário e que contém informações sobre como instruções de sinalização precisam ser inseridas no código final. 0 código intermediário gerado pode conter pelo menos uma declaração de sinalização. 0 código-fonte de destino pode conter pelo menos uma declaração de sinalização. 0 salto direto pode ser do tipo GOTO. 0 código intermediário pode incluir o código do byte a ser interpretado por um intérprete de uma máquina virtual. A linguagem de programação original pode incluir uma linguagem de programação que permita declarações de salto em seu código fonte. A linguagem de programação original pode ser pelo menos uma de Cobol, Natural e PL/1. É particularmente benéfico que o código-fonte original possa estar na linguagem de programação Natural e o código-fonte de destino pode ser Java. 0 Natural oferece um sistema muito fácil de manipulação de declarações de salto que levou ao uso generalizado do idioma em cenários de negócios. Java, por outro lado, encontrou uso generalizado devido à independência da plataforma. Ao usar a invenção, os programas naturais podem ser transformados em programas Java e executados em plataformas arbitrárias e mantidos e aprimorados. A máquina virtual pode compreender uma máquina virtual Java e a unidade de manipulação de código intermediário compreende um Java Classloader da Java Virtual Machine. A unidade de manipulação de código intermediário pode ser derivada do Java Classloader da Java Virtual Machine, ou seja, Classloader-Class da Java Virtual Machine pode ser usada como classe base a partir da qual a classe da unidade de manipulação de código intermediário pode ser derivada. 0 código final gerado pela unidade de manipulação de código intermediário pode ser entregue para execução na máquina virtual. A máquina virtual pode compreender uma máquina virtual Java. 0 código final pode incluir código independente de hardware. A unidade de manipulação de código intermediário de acordo com esta invenção é a ferramenta que permite a implementação do método descrito nesta invenção.
Fazendo a unidade de manipulação de código intermediário uma que seja independente e desacoplada do JVM (Classe Java) Loção de classe e implemente-a de forma que produza código de objeto executável que possa ser carregado pelo JVM Class Loader e executado através da interpretação pela JVM permite criar Java Byte Code para a JVM que, por um lado, é uma representação semântica completa do código fonte natural e, por outro lado, não precisa ser adaptado pelo JVM Class Loader para inserir instruções de salto no Java Byte Code. Um beneficio adicional é que o código do objeto é executável em qualquer ambiente JVM sem exigir uma unidade de manipulação de classe ou de tempo de execução especialmente adaptada para o ambiente de destino. 0 código intermediário pode ter sido criado a partir do código-fonte de destino em uma linguagem de programação de destino, pelo qual o código-fonte de destino foi compilado a partir do código-fonte original que contém pelo menos uma declaração de salto, ao omitir pelo menos uma declaração de salto. A unidade de manipulação de código intermediário pode incluir um Java Classloader. A unidade de manipulação de código intermediário pode ter sido derivada de um Java Classloader. 0 código final pode incluir código independente de hardware.
Se a unidade de manipulação de código intermediário for derivada do Lojador de classe Java Virtual Machine (JVM) e a compreende, a unidade de manipulação de código intermediário faz parte da JVM. A unidade de manipulação de código intermediário pode ser derivada de um Java Classloader. A unidade de manipulação de código intermediário pode ser adaptada para verificar antes de inserir uma instrução de salto no código final que o alvo para a declaração de salto está dentro da área válida da declaração de salto a ser inserida. A unidade de manipulação de código intermediário pode ser adaptada para inserir uma declaração de salto no código final que desencadeia um salto direto para o alvo de salto no código final durante a execução do código final se a área válida da declaração de salto a ser inserida estiver dentro a área válida do alvo do salto. A unidade de manipulação de código intermediário pode ser adaptada para inserir uma declaração de sinalização no código final que sinaliza uma exceção durante a execução do código final, se a área válida da declaração de salto a ser inserida estiver fora da área válida do alvo do salto. A unidade de manipulação de código intermediário pode ser adaptada para inserir uma declaração de manipulação de exceção no código final que pega e manipula a exceção sinalizada. A declaração de manipulação de exceção pode conter o salto direto para o alvo no código final, se a declaração de manipulação de exceção estiver dentro da área válida do alvo do salto. 0 código final pode incluir código independente de hardware.
Um produto de programa de computador com código de aplicativo que, quando carregado em uma unidade de processamento de dados, executa o método descrito acima.
Breve descrição das figuras
Mais detalhes e propriedades da invenção são apresentados na descrição a seguir dos desenhos em que: A Fig. la ilustra um diagrama de blocos para delinear um método de acordo com o segundo aspeto da invenção; A Fig. lb ilustra um diagrama de blocos para delinear um segundo exemplo do método de acordo com o segundo aspeto da invenção; A Figura 2 ilustra a execução de uma condição de exceção em várias etapas que representa uma declaração de salto no código-fonte original como exemplificado no Código de Byte Java;
As Fig. 3a-3b ilustram duas formas de realização possíveis de um sistema de acordo com o segundo aspeto da invenção; A Fig. 4 ilustra um diagrama de blocos para delinear o método de acordo com o primeiro aspeto da invenção;
As Fig. 5a-5b ilustram exemplos de código fonte em uma linguagem de programação de destino; e A Fig. 6 representa uma forma de realização de um sistema de acordo com a invenção para executar o método de acordo com o primeiro aspeto da invenção.
Descrição detalhada O seguinte deve descrever um exemplo que existe como código fonte original na linguagem de programação natural que deve ser executada em um ambiente de tempo de execução de máquina virtual Java (JVM) após a transformação. Para permitir a execução do código fonte natural original na JVM, o código fonte natural deve primeiro ser transferido para o código fonte na linguagem de programação Java. Um compilador Java compila este código-fonte Java no código de objeto executável legível pelo Class Loader da JVM. 0 código do objeto é conhecido como Java Byte Code e pode ser executado pelo Java Runtime Environment. A invenção também é aplicável a outras linguagens de programação e ambientes de tempo de execução. A invenção permite, por exemplo, o código-fonte escrito na linguagem de programação COBOL para ser transformado na linguagem de programação VB.NET que, por sua vez, pode ser executada no ambiente de tempo de execução .NET.
Descrição detalhada do segundo aspeto da invenção A Fig. la mostra a execução exemplar para o método proposto por esta invenção que permite a transferência de código fonte na linguagem de programação original para o código que é executável por um ambiente de tempo de execução. 0 exemplo transforma o código fonte na linguagem de programação Natural em um código que é executável pela JVM. A linguagem de programação Java não permite instruções de salto. 0 código fonte natural 1 contém uma ou mais instruções de salto. Por exemplo, o código fonte Natural pode conter uma ou várias instruções REINPUT que provocam um salto de volta para um destino no código onde o usuário foi solicitado pela entrada. Em Natural, o usuário pode ser solicitado com a instrução INPUT. A instrução REINPUT pode ser colocada arbitrariamente dentro do código fonte natural. 0 código fonte natural 1 pode conter várias sub-rotinas que podem ser aninhadas. A instrução REINPUT pode causar um salto para um ponto de execução fora da sub-rotina que executa a instrução REINPUT.
Em um primeiro passo Sl, o código fonte natural 1 que contém uma ou mais instruções de salto é transformado em código fonte Java 2, pelo que a fonte Java resultante não contém instruções de salto correspondentes. A transformação do código fonte natural 1 no código-fonte Java 2 pode ser conseguida através de um compilador que, por exemplo, converte declarações ou funções naturais em instruções ou funções Java correspondentes.
Uma vez que Java é um idioma orientado a objetos, faz sentido transformar o código fonte Natural em código-fonte Java que consiste em classes Java. As sub-rotinas em natural são de preferência transformadas em métodos Java.
Traduzir o código-fonte no passo S 1 é melhor feito criando o código-fonte Java 2 que é sintaticamente semelhante ao código fonte natural 1. Isso é conseguido fazendo uma transformação de linha a linha ou de indicação para declaração. É assim criado um alto grau de código fonte reutilizável e sustentável que mostra uma forte semelhança entre o código fonte 1 e o código fonte 2.
Como o Java não possui instruções de salto que permitem a transformação direta da instrução REINPUT, o código fonte 2 é criado sem instruções de salto correspondentes. O Java Byte Code é estendido, inserindo fragmentos de código que exibirão o comportamento da instrução REINPUT uma vez executada (veja a etapa S5).
Durante a transformação do código fonte natural 1 no código-fonte 2 de Java, um passo S3 leva à criação de dados de controlo para cada instrução de salto identificada no código fonte natural 2 que permitem que a unidade de manipulação de código intermediário insira fragmentos de código no código Java Byte que são funcionalmente equivalente às instruções de salto encontradas no código fonte Natural 1. Os dados de controlo identificam onde no Código de Byte de Java quais fragmentos de código precisam ser inseridos. Ele pode ser salvo em um arquivo de controlo que a unidade de manipulação de código intermediário usa quando muda o Código de bytes de Java, mostrado na etapa S6. Contudo, os dados de controlo do passo S3 também podem ser armazenados na memória principal do sistema informático.
Depois de transformar o código fonte natural 1 no código-fonte Java 2 ao mesmo tempo em que omitindo instruções de salto, o código-fonte Java 2 é compilado com um compilador Java. 0 resultado é um ou mais arquivos .class 3 que contêm código de byte. Uma vez que o código fonte Java 2 não continha instruções de salto, o Java Byte Code 3 não contém instruções de salto equivalentes às encontradas no código fonte Natural 1.
No passo seguinte, S4, os arquivos .class, ou seja, Java Byte Code 3, são alimentados em uma unidade de manipulação de código intermediário 5 que altera o Java Byte Code 3 e insere fragmentos de código dentro dele como etapa S5 que são funcionalmente equivalentes às instruções de salto encontrado no código fonte natural 1. A unidade de manipulação de código intermediário 5 num passo S6 examina os dados de controlo alcançados no passo S3. A unidade de manipulação de código intermediário 5 então insere declarações de salto no Java Byte Code 3 de acordo com esses dados. 0 método exato para inserir fragmentos de código e/ou declarações de salto no Java Byte Code 3 será explicado agora, referindo-se à Fig. 2.
Depois de inserir declarações de salto no Java Byte Code 3, um Java Byte Code 4 está disponível que é semanticamente completamente equivalente ao código fonte Natural 1. Este Java Byte Code 4 pode ser executado pela JVM
Numa forma de realização da invenção, a unidade de manipulação de código intermediário 5 que insere declarações de salto no Java Byte Code 3 pode ser codificada para ser uma unidade de manipulação independente e desacoplada do JVM Class Loader. Isso é conseguido por uma unidade de manipulação de código intermediário 5 que cria arquivos .class que são passados para o JVM Class Loader e, por sua vez, fornecidos ao intérprete da JVM. A vantagem de tal implementação é que o código Java Byte é simultaneamente idêntico ao código fonte natural 1 e não precisa ser manipulado mais por parte do JVM Class Loader para inserir as respectivas instruções de salto no Código Java Byte. Além disso, os arquivos .class criados pela unidade de manipulação desacoplada,
Outra forma de realização da invenção pode usar uma unidade de manipulação de código intermediário 5 que foi derivada do JVM Class Loader e, se necessário, substitui-la e substitui-la. Esta unidade de manipulação de tempo de execução derivada compreende a funcionalidade do JVM Class Loader e a funcionalidade necessária para inserir fragmentos de código e/ou declarações de salto no Java Byte Code 3. Portanto, a unidade de manipulação de código intermediário torna-se um componente da JVM, de modo que as respectivas instruções de salto são inseridos no Java Byte Code 3 depois que a unidade de manipulação de código intermediária derivada do JVM Class Loader carregou o Java Byte Code 3. Os vários ambientes de tempo de execução de Java para diferentes plataformas exigem, assim, a mesma unidade de manipulação de tempo de execução. A Fig. lb mostra um exemplo de execução de um método de acordo com a invenção. A diferença com o método mostrado na Fig. la é que nenhum dado de controlo é gerado para alimentar a unidade de manipulação de código intermediário 5 para inserir fragmentos de código e/ou declarações de salto.
Assim como em execução do método de acordo com a Fig. la em um passo Sl inicialmente, o código fonte natural que contém instruções de salto é transformado em código-fonte Java. Para cada instrução de salto encontrada durante a transformação do código fonte natural 1 no código-fonte Java 2, um marcador de salto é inserido no código-fonte Java 2 que representa uma declaração de salto. Os fragmentos de código que são funcionalmente equivalentes às instruções de salto no código fonte natural 1 serão inseridos nos marcadores de salto no código de bytes de Java 3 pela unidade de manipulação de código intermediário 5. Uma implementação da invenção pode inserir uma função Java como o marcador de salto que codifica lançar uma exceção, conforme descrito na Figura 2 em maior detalhe. Alternativamente, o marcador de salto pode ser inserido como um token, como um comentário Java. O código-fonte Java 2 criado desta forma no próximo passo S2 é compilado para Java Byte Code por um compilador Java. Este código compilado também contém os marcadores inseridos no passo Sl.
No passo seguinte S4, o Java Byte Code 3 é passado para a unidade de manipulação de código intermediário 5. Ele
determina no próximo passo S5 os marcadores de salto contidos no Código de Byte de Java. A manipulação de código intermediário prossegue para substituir os marcadores de salto por fragmentos de código que são funcionalmente equivalentes às instruções de salto presentes no código fonte natural 1. A substituição é especificamente necessária se os marcadores de salto foram inseridos como tokens ou comentários no código-fonte Java 2. Se o Os marcadores de salto foram inseridos como funções Java, a manipulação de código intermediário 5 pode modificar ainda mais o Código de Byte de Java 3 por fragmentos de código adicionais, de modo que esses, em combinação com a função Java, se tornem funcionalmente equivalentes às instruções de salto no código fonte natural 1. 0 Java Byte Code resultante pode ser executado pela JVM 0 marcador de salto inserido no passo SI pode ser um reinput da função Java () que, basicamente, lança uma exceção, tornando-a sintaticamente próxima de uma instrução REINPUT no código fonte natural 1. A unidade de manipulação de código intermediário 5 adiciona o tratamento de exceções correspondente para capturar e tratar a exceção jogada pela função reinput () para o Java Byte Code 3. Além disso, a unidade de manipulação de código intermediário 5 insere as instruções de salto correspondentes e seus destinos para o Java Byte Code 3, conforme mostrado com mais detalhes na Fig. 2.
No caso de os marcadores de salto terem sido inseridos sob a forma de tokens ou comentários no passo Sl, a unidade de manipulação de código intermediário substitui aqueles por uma função que lança uma exceção muito parecida com o reinput da função Java (). A Fig. 2 é um exemplo de como os fragmentos de código são inseridos no Código de bytes Java para obter instruções de salto que são semânticas como no código fonte natural 1. Para uma melhor legibilidade, isso é mostrado na sintaxe de Java. Os fragmentos de código são inseridos dentro de S5 em Java Byte Code 3 pela unidade de manipulação de código intermediário 5 de acordo com a invenção como descrito por referência à Fig. la e Fig. lb. 0 trecho de código MAIN corresponde a um programa principal no código fonte natural 1. A função FUNCTION A corresponde a uma sub-rotina no código fonte natural 1. 0 programa principal MAIN chama (Cl) a função FUNCTION A implementada como um método da classe Java que representa o programa principal. Uma função adicional FUNCTION B também corresponde a uma sub-rotina no código fonte natural 1. FUCTION A chama FUNCTION B, C2. Dentro do código fonte natural original, a sub-rotina representada pela FUNÇÃO A chama a sub-rotina representada pela FUNÇÃO B. A FUNÇÃO B também é implementada como um método da classe Java que representa o programa principal. A função FUNCTION B pode ser a reinputar função Java () mencionada acima. 0 código fonte natural original 1 contém uma instrução de reinput (na sub-rotina que corresponde a FUNÇÃO A) que salta para um ponto no principal programa que está fora da sub-rotina. Este ponto é marcado como "Alvo" na Fig. 2.
Em contraste com o código-fonte Java, o Java Byte Code permite que as instruções de salto avancem de um ponto para outro. No entanto, esses saltos são válidos somente em um bloco de execução ou no escopo do código do programa Java. Este escopo ou bloco pode ser limitado, por exemplo, a um método. Saltar é, portanto, apenas válido neste método. Esses saltos são executados usando a instrução GOTO no Código de Byte Java.
Para permitir todas as instruções de salto possíveis no código fonte Natural 1 no Código de Byte Java, esta instrução GOTO por si só não é suficiente. Não permite saltar de chamadas de método ou métodos enrolados para o exterior.
Para permitir saltos fora desses escopos ou blocos, a invenção usa o tratamento de exceções.
Dentro da função no código fonte Natural representado pela função FUNÇÃO A é uma instrução REINPUT a ser executada para saltar para um destino no código para a última declaração INPUT executada. No ponto da declaração REINPUT dentro da função FUNCTION A no código de byte Java, uma exceção é lançada. A exceção é lançada chamando a função FUNCTION B. A função FUNCTION A possui um manipulador de exceção que captura a exceção jogada pela função FUNCTION B e controla-a. Monitorando as exceções lançadas quando a função FUNCTION A é chamada é feita com um bloco TRY. Se a função FUNCTION B provoca uma exceção, o bloco de função CATCH correspondente FUNCTION A captura e manipula. 0 manuseio de acordo com a invenção, a exceção é passada para o chamador da função FUNÇÃO A. Esta passagem da exceção é conseguida lançando uma exceção dentro do bloco CATCH. 0 exemplo na Fig. 2 mostra como a exceção causada pela função FUNCTION B é capturada pela função FUNCTION A e passada para o programa principal MAIN, J2.
Se a exceção causada pela função FUNCTION B for uma função de exceção de tempo de execução, a FUNCTION A pode não exigir um manipulador de exceção porque a exceção será capturada e tratada, o mais tardar, pelo manipulador de exceção do principal MAIN do programa, conforme indicado na seguinte descrição. No entanto, se for necessário um tratamento especifico de exceção de tempo de execução, um manipulador de exceção na função FUNCTION A pode ainda ser vantajoso. 0 programa principal MAIN também contém um manipulador de exceção que captura e manipula a exceção, jogado pela função FUNÇÃO A ou jogado pela função FUNÇÃO B e não capturado/ manipulado pela função FUNÇÃO A. Capturando e manipulando a exceção causada pela função FUNÇÃO A é feita em o bloco CATCH do principal programa MAIN. Uma vez que a execução do programa está dentro do bloco de execução ou do alcance do alvo de salto, o tratamento de exceção no MAIN principal não precisa lançar uma exceção adicional, mas pode usar a instrução GOTO para pular para o alvo "Alvo".
Os manipuladores de exceção, as instruções para lançar exceções e as instruções GOTO mostradas na Fig. 2 são inseridas como Código de Byte de Java no Código de Byte de Java 3 pela unidade de manipulação de código 5 no passo S5. 0 método mostrado na Fig. lb só requer a inserção do manipulador de exceção, instruções GOTO e os alvos "Alvo". Lançando as exceções, ou seja, a função reinput () já foi inserida no código-fonte Java no passo S 1. 0 Código Byte Java modificado desta forma agora contém uma série de manipuladores de exceções e instruções GOTO que correspondem às instruções REINPUT no código fonte Natural 1, incluindo quaisquer saltos além de blocos de execução ou áreas de escopo. É claro que o tratamento de exceção nem sempre exige saltar de volta para a principal função MAIN. Se o alvo da declaração de salto estiver dentro da função FUNÇÃO A, basta retornar à função FUNÇÃO A da função FUNÇÃO B usando uma exceção e, em seguida, executando uma declaração GOTO dentro do respectivo bloco CATCH em vez de lançar uma exceção.
Se o código fonte Natural 1 (ou o código fonte original em uma linguagem de programação diferente, como COBOL ou PL / 1) contém diferentes tipos de instruções de salto, pode ser vantajoso fornecer vários blocos CATCH para o tratamento de exceções. A exceção pode ser tratada de forma diferente, dependendo do tipo de instrução de salto. A Fig. 3a mostra um primeiro sistema que foi modificado para executar o método de acordo com a invenção. De dentro de um ambiente de desenvolvimento, o código fonte natural que contém instruções de salto é transformado no código-fonte Java 2, se aplicável, sem instruções de salto. Se o código-fonte Java for criado removendo as instruções de salto, também serão gerados os dados de controlo de adição, conforme referido na Fig. la. O código-fonte Java é compilado com um compilador para criar o Java Byte Code, como um ou vários arquivos .class. 0 ambiente de tempo de execução compreende JVM Java Virtual Machine. Os arquivos .class criados pelo compilador são carregados em uma unidade de manipulação de código intermediário (desacoplada) que insere os respetivos fragmentos de código e / ou instruções de salto no Código de Byte de Java. Os fragmentos de código correspondem funcionalmente às instruções de salto no código fonte natural e podem ser implementados como manipuladores de exceções, como mostrado ao se referir à Figura 2. Se o código-fonte Java foi gerado por omissão de instruções de salto como na Fig. la, o desacoplado unidade de manipulação de código também recebe os dados de controlo criados anteriormente. Caso contrário, como na Fig. lb, as informações necessárias estão contidas no Java Byte Code 3. 0 resultado do processo da unidade de manipulação desacoplada são arquivos .class que foram complementados por instruções de salto. Os arquivos .class são então lidos pelo JVM Class Loader e passados para o intérprete da JVM para execução, a unidade de manipulação de código desacoplada também recebe os dados de controlo criados anteriormente. Caso contrário, como na Fig. lb, as informações necessárias estão contidas no Java Byte Code 3. 0 resultado do processo da unidade de manipulação desacoplada são arquivos .class que foram complementados por instruções de salto. Os arquivos .class são então lidos pelo JVM Class Loader e passados para o intérprete da JVM para execução, a unidade de manipulação de código desacoplada também recebe os dados de controlo criados anteriormente. Caso contrário, como na Fig. lb, as informações necessárias estão contidas no Java Byte Code 3. 0 resultado do processo da unidade de manipulação desacoplada são arquivos .class que foram complementados por instruções de salto. Os arquivos .class são então lidos pelo JVM Class Loader e passados para o intérprete da JVM para execução. A Fig. 3b mostra um segundo sistema que foi modificado para executar o método dado pela invenção. A diferença com o sistema dado na Fig. 3a é basicamente que a unidade de manipulação de código intermediário {a unidade de manipulação desacoplada na Fig. 3a) é uma substituição de unidade de manipulação de tempo de execução para o JVM Class Loader. No caso mostrado aqui, a unidade de manipulação de tempo de execução é uma derivada do JVM Class Loader, ou seja, além da funcionalidade fornecida pelo JVM Class Loader, contém funcionalidades adicionais para modificar o Código de Byte de Java passado para ele. Em uma forma concreta, a funcionalidade do carregador de classe JVM do código de byte de carregamento pode ser substituída para que o carregamento do código de bytes de Java pela unidade de manipulação de tempo de execução já modifica o código de bytes de Java. A vantagem de derivar da JVM Class Load é o pequeno esforço necessário para criar a unidade de manipulação de tempo de execução. Em uma forma diferente, a unidade de manipulação de tempo de execução é criada de forma completamente independente, mas tem a mesma funcionalidade e objeto conforme explicado na Fig. 3b. A compilação do código-fonte Java 2 por um compilador em um ou mais arquivos .class 3, bem como a modificação de Java Byte Code 3 através da unidade de manipulação de tempo de execução, é feita como mostrado na Fig. 3a. Aqui também, desde que o código fonte 2 de Java tenha sido criado a partir do código fonte Natural 1, omitindo as instruções de salto como mostrado na Fig. la, podem ser criados dados de controlo que são dados à unidade de manipulação de tempo de execução. A unidade de manipulação de tempo de execução pode inserir fragmentos de código no Java Byte Code 3 usando os dados de controlo que são funcionalmente equivalentes às instruções de salto no código fonte natural 1. Caso contrário, como na Fig. lb, todas as informações necessárias estão presentes no Java Byte Code 3.
Descrição detalhada do primeiro aspeto da invenção. A Fig. 4 mostra a execução exemplar para o método proposto pelo primeiro aspeto da invenção que permite a transferência de código fonte na linguagem de programação original para um código executável por um ambiente de tempo de execução. No exemplo, o código fonte na linguagem de programação Natural é transformado em código que é executável pela JVM. A linguagem de programação Java, como descrito anteriormente, não permite instruções de salto. 0 código fonte Natural 1 contém uma ou mais instruções de salto. Por exemplo, o código fonte natural 1 pode conter uma ou várias instruções REINPUT que provocam um salto de volta para um destino no código onde o usuário foi solicitado pela entrada. Em Natural, o usuário pode ser solicitado com a instrução INPUT. A instrução REINPUT pode ser colocada arbitrariamente dentro do código fonte natural. 0 código fonte natural 1 pode conter várias sub-rotinas que podem ser aninhadas. A instrução REINPUT pode causar um salto para um ponto de execução fora da sub-rotina que executa a instrução REINPUT.
Num primeiro passo Sl, o código fonte natural 1 que contém uma ou mais instruções de salto é transformado em código fonte Java 2, pelo que o código fonte Java 2 resultante não contém instruções de salto correspondentes. A transformação do código fonte natural 1 no código-fonte Java 2 pode ser conseguida através de um compilador que, por exemplo, converte declarações ou funções naturais em instruções ou funções Java correspondentes.
Traduzir o código-fonte no passo S 1 é melhor feito criando o código-fonte Java 2 que é sintaticamente semelhante ao código fonte natural 1. Isso é conseguido fazendo uma transformação de linha a linha ou de indicação para declaração. É assim criado um alto grau de código fonte reutilizável e sustentável que mostra uma forte semelhança entre o código fonte 1 e o código fonte 2.
Como o Java não possui instruções de salto que permitem a transformação direta da instrução REINPUT, o código fonte 2 é criado sem instruções de salto correspondentes. 0 código fonte Java 2 é estendido pela inserção de fragmentos de código que exibirão o comportamento da instrução REINPUT uma vez executada (veja a etapa S5).
Numa etapa seguinte S2, o código fonte Java 2 é alimentado em uma unidade de manipulação de código 3 que altera o código-fonte Java 2 inserindo fragmentos de código nele (como etapa S3) que são funcionalmente equivalentes às instruções de salto encontradas no código fonte Natural 1.
Depois de manipular o código fonte Java 2, um código fonte Java 4 está disponível que é semanticamente completamente equivalente ao código fonte Natural 1. Este código fonte Java 4 pode ser compilado e executado pela JVM.
Mais detalhadamente, num passo Sl, o código fonte natural 1 que contém instruções de salto é transformado em código fonte Java 2. Para cada instrução de salto encontrada durante a transformação do código fonte Natural 1 no código fonte Java 2, um marcador de salto é inserido na fonte Java código 2 que representa uma declaração de salto. Os fragmentos de código que são funcionalmente equivalentes às instruções de salto no código fonte natural 1 serão inseridos nos marcadores de salto no código fonte Java 4 pela unidade de manipulação de código 3. Uma implementação da invenção pode inserir uma função Java como o marcador de salto que codifica lançar uma exceção, conforme descrito com referência à Fig. 5a com maior detalhe. Alternativamente, o marcador de salto pode ser inserido como um token, como um comentário Java. 0 marcador de salto inserido no passo SI pode ser uma função Java que basicamente lança uma exceção tornando-se sintaticamente próximo a uma instrução REINPUT no código fonte natural 1. A unidade de manipulação de código 3 adiciona o tratamento de exceções correspondente para capturar e tratar a exceção lançada pelo disse a função Java. Além disso, a unidade de manipulação de código 3 insere as instruções de salto correspondentes e os seus destinos para o código fonte Java 4, como mostrado com mais detalhes na Fig. 5a e Fig. 5b. 0 método exato para inserir fragmentos de código que são funcionalmente equivalentes ao código fonte original também será explicado por referência às Figuras 5a e 5b. As Figuras 5a e 5b são exemplos de como os fragmentos de código são inseridos no código fonte Java 4 para obter instruções de salto semanticamente como aquelas no código fonte natural 1. Os fragmentos de código são inseridos dentro de S3 pela unidade de manipulação de código 3 conforme descrito com referência para a Fig. 4. 0 trecho de código A2 na Fig. 5a mostra um código fonte Java que corresponde a um código fonte Cobol 1 {ou PL / 1 e que inclui marcadores de salto). 0 código fonte Cobol original 1 inclui uma declaração GOTO para uma posição especifica. Esta declaração GOTO é transformado em um método "gotoLabel", que representa a Declaração GOTO original e um método de "etiqueta", que marca o destino do salto. 0 trecho de código A3 na Fig. 5a mostra um código-fonte Java que inclui o fragmento de código equivalente à instrução de salto no código original Cobol original 1. A instrução "throw new GotoException" lança uma exceção que interrompe o processamento. 0 bloco de captura correspondente captura a exceção e lida com isso. O código para o tratamento de exceções (try and catch) inclui o código-fonte Java. Para continuar o processamento no destino da instrução jump a loop (while (true) e continue) é inserido dentro do código para o tratamento de exceção. Além da instrução do loop, é inserida uma indicação do interruptor (caixa de interruptor) dentro do loop. 0 código que pertence aos ramos de caso das declarações de troca manipula o processamento no destino do salto. 0 trecho de código B2 na Fig. 5b mostra um código fonte Java 2 que corresponde a um código fonte Natural 1 e que inclui marcadores de salto. 0 código fonte Natural original 1 inclui um Reinput-Statement que causa um salto para a última declaração de entrada. As reinstalações têm a possibilidade de saltar para uma posição dinâmica (para a última declaração de entrada) e eles têm a possibilidade de voltar para um quadro de pilha anterior, ou seja, para pular para um destino fora da função atual. A Declaração Reinput do código fonte original 1 é transformada em um método "reinput" (dentro da função B2-FUNCTION A) e a Declaração de Entrada do código fonte original 1 é transformada em um método de "entrada" (dentro da função B2-MAIN), que marca o destino do salto. A instrução "throw new GotoException" (dentro de B3 FUNCTION A) lança uma exceção que interrompe o processamento. 0 bloco de captura correspondente (dentro da FUNÇÃO B3 MAIN) detecta a exceção e controla. 0 código para o tratamento de exceções (try and catch) inclui o código-fonte Java. Para continuar o processamento no destino da instrução jump a loop (while (true) e continue) é inserido dentro do código para o tratamento de exceção. Além da instrução do loop, é inserida uma indicação do interruptor (caixa de interruptor) dentro do loop. 0 código que pertence aos ramos CASE da declaração switch processa o processamento no destino do salto. 0 destino do salto, ou seja, a última declaração de entrada é
armazenada com uma variável auxiliar "_iw $ jump $ 1". A variável auxiliar é avaliada pela instrução switch (switch (_ iw $ jump $ 1)).
Para desencadear um salto, a Reinput-Statement do Original source code 1 é substituída por uma exceção (lance nova ReinputException). A exceção jogada é captada pelo manipulador de exceção (catch (ReinputException)). No exemplo de código B3-FUNCTI0N A, o destino do salto está fora da função, ou seja, fora do quadro da pilha da função. Assim, quando a exceção é lançada dentro da função B3-FUNCTI0N A, a pilha é desencadeada (ou seja, as entradas são removidas da pilha) até encontrar um manipulador de exceção (no exemplo, o manipulador de exceção de referência é encontrado na função B3-MAIN) que está preparado para lidar com (pegar) a exceção. A exceção é captada pelo manipulador de exceção manipulado conforme descrito com referência à Fig. 5a. A Fig. 6 mostra um sistema que foi modificado para executar o método de acordo com o primeiro aspeto da invenção. Dentro de um ambiente de desenvolvimento, o código fonte natural que contém instruções de salto é transformado em código-fonte Java 2, que inclui marcadores de salto. 0 código-fonte Java é manipulado com uma unidade de manipulação (pré-compilador) para criar código fonte Java 4 que contém fragmentos de código funcionalmente equivalentes às instruções de salto no código-fonte Natural. 0 código-fonte manipulado 4 é compilado por um compilador para criar o código Java Byte que é executável por uma máquina virtual Java. 0 ambiente de execução (execução) compreende a Java Virtual Machine JVM ou um ambiente de tempo de execução .NET. Os arquivos .class criados pelo compilador são carregados na Java Virtual Machine e executados pela Java Virtual Machine.
As técnicas atuais podem ser implementadas em circuitos eletrónicos digitais, ou em hardware, firmware, software ou em combinações de computadores. 0 aparelho da invenção pode ser implementado num produto de programa de computador tangivelmente incorporado num dispositivo de armazenamento legível por máquina para execução por um processador programável. As etapas do método de acordo com a invenção podem ser realizadas por um processador programável executando um programa de instruções para executar funções da invenção operando com base em dados de entrada e gerando dados de saída. A invenção pode ser implementada em um ou vários programas de computador que são executáveis em um sistema programável, que inclui pelo menos um processador programável acoplado para receber dados e transmitir dados para um sistema de armazenamento, pelo menos, um dispositivo de entrada e pelo menos um dispositivo de saída, respetivamente. Os programas de computador podem ser implementados em uma linguagem de programação de alto nível ou orientada a objetos e/ou em código de montagem ou máquina. 0 idioma ou código pode ser um idioma ou código compilado ou interpretado. Os processadores podem incluir microprocessadores de propósito geral e especial. Um processador recebe instruções e dados de memórias, em particular de memórias somente leitura e/ou memórias de acesso aleatório. Um computador pode incluir um ou mais dispositivos de armazenamento em massa para armazenar dados; tais dispositivos podem incluir discos magnéticos, como discos rígidos internos e discos removíveis; discos magneto-óticos; e discos óticos. Os dispositivos de armazenamento adequados para incorporar de forma tangível instruções e dados do programa de computador incluem todas as formas de memória não volátil, incluindo, por exemplo, dispositivos de memória de semicondutores, como EPROM, EEPROM e dispositivos de memória flash; discos magnéticos, como discos rígidos internos e discos removíveis; discos magneto-óticos; e discos de CD-ROM. Qualquer um dos anteriores pode ser complementado ou incorporado em ASIC (circuitos integrados específicos da aplicação).
Os sistemas informáticos ou as redes de computadores distribuídos, como mencionado acima, podem ser usados, por exemplo, para produzir bens, fornecer peças para montagem de produtos, controlar processos técnicos ou económicos ou implementar atividades de telecomunicações.
Para proporcionar interação com um utilizador, a invenção pode ser implementada num sistema de computador que tem um dispositivo de exibição, como um monitor ou tela LCD para exibir informações ao usuário e um teclado e um dispositivo apontador como um mouse ou um trackball pelo qual o utilizador pode fornecer entrada para o sistema informático. 0 sistema de computador pode ser programado para fornecer uma interface de usuário gráfica ou de texto através da qual os programas de computador interagem com os usuários.
Um computador pode incluir um processador, memória acoplada ao processador, um controlador de disco rígido, um controlador de vídeo e um controlador de entrada/saída acoplado ao processador por um bus de processador. 0 controlador do disco rígido é acoplado a uma unidade de disco rígido adequada para armazenar programas de computador executáveis, incluindo programas que incorporam a técnica atual. 0 controlador de E/S é acoplado por meio de um barramento de E/S para uma interface de E/S. A interface de E/S recebe e transmite de forma analógica ou digital ao longo de pelo menos um link de comunicação. Esse link de comunicação pode ser um link serial, um link paralelo, uma rede de área local ou um link sem fio (por exemplo, um link de comunicação RF) . Uma exibição é acoplada a uma interface, que é acoplada a um bus de E/S. Um teclado e dispositivo apontador também são acoplados ao barramento de E/S. Em alternativa, buses separados podem ser usados para o dispositivo apontador do teclado e interface de E/S.

Claims (11)

  1. REIVINDICAÇÕES
    1. Método implementado por computador para gerar código a partir do código fonte original (1), pelo que o código fonte original (1) inclui, pelo menos, uma instrução de salto e existe em uma linguagem de programação de origem, compreendendo o método: - criação de código intermediário (2) do código-fonte original (1) ao omitir a instrução de salto pelo menos, o código intermediário (2) existente em uma linguagem de programação de destino, - carregar (S2) o código intermediário (2) em uma unidade de manipulação de código (3) e - criação (S3), através da unidade de manipulação de código (3) , do código-fonte de destino (4) do código intermediário (2), pelo que a criação compreende uma inserção de pelo menos um fragmento de código fonte no código-fonte de destino (4), pelo que o inserido pelo menos um fragmento de código fonte é funcionalmente equivalente à pelo menos uma instrução de salto omitida, e pelo que, pelo menos, um fragmento de código fonte inserido compreende - uma instrução que lança uma exceção, - pelo menos, uma instrução de loop dentro do código fonte para o tratamento de exceção, - pelo menos, uma instrução de alternância dentro de um bloco de tentativa dentro da instrução de loop, - um bloco de captura correspondente que atinja a exceção e acompanha a instrução do loop e - uma variável auxiliar que contém o destino do salto e que é avaliado pela declaração switch a declaração do switch.
  2. 2. Método implementado por computador para gerar código a partir do código fonte original (1), pelo que o código fonte original (1) inclui, pelo menos, uma instrução de salto e existe em uma linguagem de programação de origem, compreendendo o método: - criação de código intermediário (2) do código-fonte original (1), substituindo pelo menos uma instrução de salto por pelo menos um marcador de salto, o código intermediário (2) existente em uma linguagem de programação de destino, - carregar (S2) o código intermediário (2) em um unidade de manipulação de código (3) e - criação (S3), através da unidade de manipulação de código (3), do código-fonte de destino (4) a partir do código intermediário (2), pelo que a criação compreende uma inserção de pelo menos um código fonte fragmentar o código-fonte de destino (4) , pelo que, o inserido pelo menos um fragmento de código fonte é funcionalmente equivalente a, pelo menos, uma instrução de salto substituída, e pelo que o pelo menos um fragmento de código fonte inserido compreende: uma instrução que lança uma exceção, - pelo menos, uma instrução de loop dentro do código fonte para o tratamento de exceção, - pelo menos, uma instrução de alternância dentro de um bloco de tentativa dentro da instrução de loop, - um bloco de captura correspondente que atinja a exceção e acompanha a instrução do loop e - uma variável auxiliar que contém o destino do salto e que é avaliado pela declaração switch.
  3. 3. Método de acordo com a reivindicação 1 ou 2, em que o pelo menos um fragmento de código fonte inserido no código-fonte de destino (4) executa instruções de programa que são funcionalmente equivalentes: - para uma instrução de salto estático colocada no código fonte original, se o destino da instrução de salto está dentro do quadro de pilha da instrução de salto e/ou - para uma instrução de salto dinâmico colocada no código fonte original, se o destino da instrução de salto estiver fora do quadro de pilha da instrução de salto e/ou - para uma instrução de salto dinâmico inserida no código-fonte original, se o destino da instrução de salto estiver dentro do quadro de pilha da instrução de salto.
  4. 4. Método de acordo com uma das reivindicações anteriores, em que a linguagem de programação de destino compreende: uma linguagem de programação que não permite declarações de salto do tipo GOTO no seu código fonte e/ ou - pelo menos, uma de Java e uma programação idioma que é executável no ambiente de tempo de execução do .NET e/ ou que a linguagem de programação de origem compreende: uma linguagem de programação que permite declarações de salto em seu código fonte e/ou - pelo menos uma de Cobol, Natural e PL/1.
  5. 5. Método de acordo com uma das reivindicações precedentes, compreendendo ainda o método de criação do código final (5) a partir do código fonte de destino (4), pelo que o código final (5) compreende o código independente de hardware, o código final (5) sendo para execução em um ambiente de tempo de execução.
  6. 6. Unidade de manipulação de código (3) para gerar código, pelo que a unidade de manipulação de código (3) está adaptada para carregar código intermediário (2) que foi criado a partir do código fonte original (1), pelo que o código fonte original (1) inclui, pelo menos, uma instrução de salto, omitindo, pelo menos, uma instrução de salto e gerando um código-fonte de destino (4) a partir do código intermediário (2), pelo que a geração do código-fonte de destino (4) compreende a inserção de pelo menos um código fonte fragmenta-se no código-fonte de destino (4), pelo que o fragmento de código de origem inserido pelo menos é funcionalmente equivalente à pelo menos uma instrução de salto omitida, pelo que, pelo menos, um fragmento de código-fonte inserido compreende uma instrução que lança uma exceção, pelo menos, uma instrução de loop dentro do código-fonte para o tratamento de exceção, pelo menos uma instrução de alternância dentro de um bloco de tentativa dentro da instrução de loop, um bloco de captura correspondente que capta a exceção, e retorna ao bloco de tentativa e uma variável auxiliar que detém o destino do salto e que é avaliado pela declaração de mudança.
  7. 7. Unidade de manipulação de código (3) para gerar código, pelo que a unidade de manipulação de código (3) está adaptada para carregar código intermediário (2) que foi criado a partir do código fonte original (1), pelo que o código fonte original (1) inclui, pelo menos, uma instrução de salto, substituindo a, pelo menos, uma instrução de salto por pelo menos um marcador de salto e gerando um código-fonte de destino (4) do código intermediário (2) , pelo que a geração do código-fonte de destino (4) compreende inserir de, pelo menos, um fragmento de código fonte no código-fonte de destino (4), pelo que o fragmento de código de origem pelo menos inserido é funcionalmente equivalente à pelo menos uma instrução de salto substituída, pelo que o pelo menos um fragmento de código-fonte inserido compreende um instrução que lança uma exceção, pelo menos, uma instrução de loop dentro do código-fonte para o tratamento de exceção, pelo menos, uma instrução de alternância dentro de um bloco de tentativa dentro da instrução de loop, um bloco de captura correspondente que capta a exceção, e retorna ao bloco de tentativa e uma variável auxiliar que é avaliado pela declaração de mudança.
  8. 8. Sistema para gerar código, que compreende: - um compilador para criação (Sl) do código intermediário (2) a partir do código fonte original (1), pelo que o código fonte original (1) inclui pelo menos uma instrução de salto, omitido o pelo menos uma instrução de salto ou substituindo, pelo menos, uma instrução de salto por um marcador de salto, o código fonte original existente em uma linguagem de programação de origem e - uma unidade de manipulação de código (3) de acordo com a reivindicação 6 ou a reivindicação 7.
  9. 9. Sistema de acordo com a reivindicação 8, pelo qual o pelo menos um fragmento de código fonte inserido no código-fonte de destino (4) executa instruções de programa que são funcionalmente equivalentes a uma instrução de salto dinâmico colocada no código fonte original, se o destino do A instrução de salto está fora do quadro da pilha das instruções de salto.
  10. 10. Sistema de acordo com uma das reivindicações 8 a 9, compreendendo ainda meios para criar o código final (5) a partir do código fonte de destino (4) , pelo que o código final (5) compreende o código independente de hardware, o código final (5) sendo para execução em um ambiente de tempo de execução.
  11. 11. Produto de programa de computador com código de aplicação que, quando carregado em uma unidade de processamento de dados, executa o método de acordo com uma das reivindicações 1 a 5.
PT118078732T 2010-10-28 2011-10-28 Método e sistema para gerar um código PT2633399T (pt)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/EP2010/066414 WO2012055441A1 (en) 2010-10-28 2010-10-28 Method and system for generating code

Publications (1)

Publication Number Publication Date
PT2633399T true PT2633399T (pt) 2017-11-15

Family

ID=43778370

Family Applications (1)

Application Number Title Priority Date Filing Date
PT118078732T PT2633399T (pt) 2010-10-28 2011-10-28 Método e sistema para gerar um código

Country Status (13)

Country Link
US (1) US9519465B2 (pt)
EP (1) EP2633399B1 (pt)
CY (1) CY1119758T1 (pt)
DK (1) DK2633399T3 (pt)
ES (1) ES2645010T3 (pt)
HR (1) HRP20171622T1 (pt)
HU (1) HUE035094T2 (pt)
LT (1) LT2633399T (pt)
PL (1) PL2633399T3 (pt)
PT (1) PT2633399T (pt)
RS (1) RS56555B1 (pt)
SI (1) SI2633399T1 (pt)
WO (2) WO2012055441A1 (pt)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9276829B2 (en) * 2013-02-07 2016-03-01 International Business Machines Corporation Transparently tracking provenance information in distributed data systems
US9710243B2 (en) * 2013-11-07 2017-07-18 Eagle Legacy Modernization, LLC Parser that uses a reflection technique to build a program semantic tree
CN107179935B (zh) * 2016-03-11 2021-01-29 华为技术有限公司 一种指令执行方法及虚拟机
CN110825386B (zh) * 2019-11-01 2023-07-14 腾讯科技(深圳)有限公司 代码的编译方法和装置、存储介质
US11899570B2 (en) 2019-12-12 2024-02-13 Cognizant Technology Solutions India Pvt. Ltd. System and method for optimizing assessment and implementation of microservices code for cloud platforms
CN111399850B (zh) * 2020-03-27 2023-05-16 象链网络科技(上海)有限公司 基于区块链的多语言智能合约编译方法
CN111475152B (zh) * 2020-04-14 2023-03-14 中国人民解放军战略支援部队信息工程大学 一种代码处理方法及装置
US11294649B1 (en) * 2021-01-13 2022-04-05 Amazon Technologies, Inc. Techniques for translating between high level programming languages
CN113254023B (zh) * 2021-05-14 2023-08-11 网易(杭州)网络有限公司 对象读取方法、装置和电子设备

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6002874A (en) * 1997-12-22 1999-12-14 International Business Machines Corporation Method and system for translating goto-oriented procedural languages into goto-free object oriented languages
US6993751B2 (en) * 2001-05-14 2006-01-31 Microsoft Corporation Placing exception throwing instructions in compiled code
US8332828B2 (en) * 2002-11-20 2012-12-11 Purenative Software Corporation System for translating diverse programming languages
US20060031820A1 (en) * 2004-08-09 2006-02-09 Aizhong Li Method for program transformation and apparatus for COBOL to Java program transformation

Also Published As

Publication number Publication date
HUE035094T2 (en) 2018-05-02
LT2633399T (lt) 2018-02-12
WO2012056023A1 (en) 2012-05-03
US20130247017A1 (en) 2013-09-19
EP2633399A1 (en) 2013-09-04
WO2012055441A1 (en) 2012-05-03
CY1119758T1 (el) 2018-06-27
US9519465B2 (en) 2016-12-13
RS56555B1 (sr) 2018-02-28
EP2633399B1 (en) 2017-07-26
HRP20171622T1 (hr) 2017-12-01
DK2633399T3 (da) 2017-11-06
SI2633399T1 (sl) 2017-12-29
PL2633399T3 (pl) 2018-01-31
ES2645010T3 (es) 2017-12-01

Similar Documents

Publication Publication Date Title
PT2633399T (pt) Método e sistema para gerar um código
US9690709B2 (en) Variable handles
US7516441B2 (en) Method and system for program editing and debugging in a common language runtime environment
US7120898B2 (en) Intermediate representation for multiple exception handling models
US8156482B2 (en) System and method for efficiently generating native code calls from byte code in virtual machines
Nicoara et al. Controlled, systematic, and efficient code replacement for running java programs
Brachthäuser et al. Effect handlers for the masses
Kossakowski et al. JavaScript as an Embedded DSL
Flatt et al. Adding delimited and composable control to a production programming environment
Cho et al. Sequential reasoning for optimizing compilers under weak memory concurrency
US20060174230A1 (en) Methods for hosting general purpose computer languages on speical purpose systems
US6976249B1 (en) Method for embedding object codes in source codes
Zaytsev Modelling of Language Syntax and Semantics: The Case of the Assembler Compiler.
US10592387B2 (en) Dataflow analysis to reduce the overhead of on stack replacement
Schwarz Peeking inside the box: Attribute-oriented programming with java 1.5, part
Clark et al. An eXecutable metamodelling facility for domain specific language design.
Tröger Specification-driven dynamic binary translation
Aranega et al. Tool demo: fine-grained run-time reflection in Python with Reflectivipy
Licker Low-level cross-language post-link optimisation
Kats Supporting language extension and separate compilation by mixing Java and bytecode
Atkinson Application binary interface compatibility through a customizable language
Kramer AspectClang: Moving AspectC++’s Weaver to the Clang C++ Front End
Lumpe Using Metadata Transformations as a Means to Integrate Class Extensions in an Existing Class Hierarchy
Filardo Porting QEMU to plan 9: QEMU internals and port strategy
Hlopko Java implementation for Smalltalk/X VM