76 research outputs found

    Code Generation = A* + BURS

    Get PDF
    A system called BURS that is based on term rewrite systems and a search algorithm A* are combined to produce a code generator that generates optimal code. The theory underlying BURS is re-developed, formalised and explained in this work. The search algorithm uses a cost heuristic that is derived from the termrewrite system to direct the search. The advantage of using a search algorithm is that we need to compute only those costs that may be part of an optimal rewrite sequence

    A Compiler and Runtime Infrastructure for Automatic Program Distribution

    Get PDF
    This paper presents the design and the implementation of a compiler and runtime infrastructure for automatic program distribution. We are building a research infrastructure that enables experimentation with various program partitioning and mapping strategies and the study of automatic distribution's effect on resource consumption (e.g., CPU, memory, communication). Since many optimization techniques are faced with conflicting optimization targets (e.g., memory and communication), we believe that it is important to be able to study their interaction. We present a set of techniques that enable flexible resource modeling and program distribution. These are: dependence analysis, weighted graph partitioning, code and communication generation, and profiling. We have developed these ideas in the context of the Java language. We present in detail the design and implementation of each of the techniques as part of our compiler and runtime infrastructure. Then, we evaluate our design and present preliminary experimental data for each component, as well as for the entire system

    Survey on Instruction Selection: An Extensive and Modern Literature Review

    Full text link
    Instruction selection is one of three optimisation problems involved in the code generator backend of a compiler. The instruction selector is responsible of transforming an input program from its target-independent representation into a target-specific form by making best use of the available machine instructions. Hence instruction selection is a crucial part of efficient code generation. Despite on-going research since the late 1960s, the last, comprehensive survey on the field was written more than 30 years ago. As new approaches and techniques have appeared since its publication, this brings forth a need for a new, up-to-date review of the current body of literature. This report addresses that need by performing an extensive review and categorisation of existing research. The report therefore supersedes and extends the previous surveys, and also attempts to identify where future research should be directed.Comment: Major changes: - Merged simulation chapter with macro expansion chapter - Addressed misunderstandings of several approaches - Completely rewrote many parts of the chapters; strengthened the discussion of many approaches - Revised the drawing of all trees and graphs to put the root at the top instead of at the bottom - Added appendix for listing the approaches in a table See doc for more inf

    On hardcoding finite state automata processing

    Get PDF
    In this paper, we present various experiments in hardcoding the transition table of a finite state machine directly into stringrecognizing code. Measurements are provided to show the time efficiency gains by various hardcoded versions over the traditional table-driven approach

    A development approach to industrial robots programming

    Get PDF
    This paper proposes a development approach to industrial robot programming, that includes: a truly high level and declarative language; an easy-to-use frontend; an intermediate representation; an automatic generator of the robot code generators. So, we introduce a new paradigm to program industrial robots, that focus on the modeling of the system, rather than on the robot. It will improve the programming and maintenance tasks, allowing the reuse of source code, because this source code will be machine independent

    IBURG: su aplicación para la generación de generadores de código en un proyecto de compiladores

    Get PDF
    En numerosas carreras de Ciencias de Computación se incluye la realización de un proyecto de diseño e implementación de un compilador. La etapa de generación de código, por su complejidad y por la extensión global del proyecto, suele simplificarse adoptando como lenguaje objeto el mismo lenguaje en que se realiza el desarrollo o el de alguna máquina abstracta definida ad hoc. Sin embargo desarrollar esta etapa en condiciones reales, para una arquitectura existente, es de gran valor formativo y quizás la mejor forma de enfrentar al alumno con la práctica de la programación a bajo nivel. En este trabajo se discute la aplicación de las técnicas usadas en la construcción de generadores de código y el uso de una herramienta iburg, cuya utilización permitió, generar código assembler optimizante para el ambiente linux como última etapa de un compilador Mini c. Trabajo realizado en una asignatura cuatrimestral. Generalmente un compilador genera una representación intermedia del programa fuente para realizar las operaciones requeridas en la generación de código optimizante. Esto permite además abstraerse de la plataforma (hardware y sistema operativo) sobre el cual se desea generar el código objeto, permitiendo desarrollar un front-end portable. El front_end utiliza un (o viarios) back_end que se encarga de la generación de código final para una plataforma determinada. El código intermedio generado, generalmente tiene la forma de árbol, ya que se asemeja a la forma del árbol de parsing construido por el reconocedor sintáctico (parser). Para producir código objeto a partir de esta representación es conveniente utilizar alguna herramienta que permita realizar un reconocimiento de patrones (subárboles) que se relacionan con las entidades semánticas mínimas y seleccionar las instrucciones de máquina más apropiadas que las implementen, esto es, secuencias de instrucciones que tengan el menor costo ( según un criterio de uso de recursos preestablecido). Un recorrido posible para un árbol no necesariamente es el que lleva a producir código de menor costo (en términos de uso de recursos), por lo cual es necesario evaluar todos los posibles recorridos para determinar el óptimo. En este artículo se analizará la herramienta, iburg, que toma como entrada una gramática libre de contexto que describe el árbol de representación elegido (aumentada con información de costos) y genera como salida un reconocedor de patrones (parser o BURS authomata) sobre el árbol. El reconocedor generado realiza una cobertura óptima en término de los costos asociados para un nodo del árbol dado como entrada. La determinación de recorridos (covers) se realiza en el momento en que se construye el autómata BURS (Bottom-Up Rewrite System) utilizando programación dinámica. Esto permite que el autómata generado sea extremadamente rápido y simple. Se ven ejemplos de aplicaciones para selección de instrucciones, inferencia de tipos y simplificaciones de árboles y se describe la experiencia realizada.VI Ateneo de Profesores Universitarios de Computación (APUC)Red de Universidades con Carreras en Informática (RedUNCI

    IBURG: su aplicación para la generación de generadores de código en un proyecto de compiladores

    Get PDF
    En numerosas carreras de Ciencias de Computación se incluye la realización de un proyecto de diseño e implementación de un compilador. La etapa de generación de código, por su complejidad y por la extensión global del proyecto, suele simplificarse adoptando como lenguaje objeto el mismo lenguaje en que se realiza el desarrollo o el de alguna máquina abstracta definida ad hoc. Sin embargo desarrollar esta etapa en condiciones reales, para una arquitectura existente, es de gran valor formativo y quizás la mejor forma de enfrentar al alumno con la práctica de la programación a bajo nivel. En este trabajo se discute la aplicación de las técnicas usadas en la construcción de generadores de código y el uso de una herramienta iburg, cuya utilización permitió, generar código assembler optimizante para el ambiente linux como última etapa de un compilador Mini c. Trabajo realizado en una asignatura cuatrimestral. Generalmente un compilador genera una representación intermedia del programa fuente para realizar las operaciones requeridas en la generación de código optimizante. Esto permite además abstraerse de la plataforma (hardware y sistema operativo) sobre el cual se desea generar el código objeto, permitiendo desarrollar un front-end portable. El front_end utiliza un (o viarios) back_end que se encarga de la generación de código final para una plataforma determinada. El código intermedio generado, generalmente tiene la forma de árbol, ya que se asemeja a la forma del árbol de parsing construido por el reconocedor sintáctico (parser). Para producir código objeto a partir de esta representación es conveniente utilizar alguna herramienta que permita realizar un reconocimiento de patrones (subárboles) que se relacionan con las entidades semánticas mínimas y seleccionar las instrucciones de máquina más apropiadas que las implementen, esto es, secuencias de instrucciones que tengan el menor costo ( según un criterio de uso de recursos preestablecido). Un recorrido posible para un árbol no necesariamente es el que lleva a producir código de menor costo (en términos de uso de recursos), por lo cual es necesario evaluar todos los posibles recorridos para determinar el óptimo. En este artículo se analizará la herramienta, iburg, que toma como entrada una gramática libre de contexto que describe el árbol de representación elegido (aumentada con información de costos) y genera como salida un reconocedor de patrones (parser o BURS authomata) sobre el árbol. El reconocedor generado realiza una cobertura óptima en término de los costos asociados para un nodo del árbol dado como entrada. La determinación de recorridos (covers) se realiza en el momento en que se construye el autómata BURS (Bottom-Up Rewrite System) utilizando programación dinámica. Esto permite que el autómata generado sea extremadamente rápido y simple. Se ven ejemplos de aplicaciones para selección de instrucciones, inferencia de tipos y simplificaciones de árboles y se describe la experiencia realizada.VI Ateneo de Profesores Universitarios de Computación (APUC)Red de Universidades con Carreras en Informática (RedUNCI
    corecore