126,013 research outputs found
Implementing a Functional Language for Flix
Static program analysis is a powerful technique for maintaining software, with
applications such as compiler optimizations, code refactoring, and bug finding.
Static analyzers are typically implemented in general-purpose programming
languages, such as C++ and Java; however, these analyzers are complex and
often difficult to understand and maintain. An alternate approach is to use
Datalog, a declarative language. Implementors can express analysis constraints
declaratively, which makes it easier to understand and ensure correctness of the
analysis. Furthermore, the declarative nature of the analysis allows multiple,
independent analyses to be easily combined.
Flix is a programming language for static analysis, consisting of a logic
language and a functional language. The logic language is inspired by
Datalog, but supports user-defined lattices. The functional language allows
implementors to write functions, something which is not supported in Datalog.
These two extensions, user-defined lattices and functions, allow Flix to
support analyses that cannot be expressed by Datalog, such as a constant
propagation analysis. Datalog is limited to constraints on relations, and
although it can simulate finite lattices, it cannot express lattices over an
infinite domain. Finally, another advantage of Flix is that it supports
interoperability with existing tools written in general-purpose programming
languages.
This thesis discusses the implementation of the Flix functional language,
which involves abstract syntax tree transformations, an interpreter back-end,
and a code generator back-end. The implementation must support a number of
interesting language features, such as pattern matching, first-class functions,
and interoperability.
The thesis also evaluates the implementation, comparing the interpreter and code
generator back-ends in terms of correctness and performance. The performance
benchmarks include purely functional programs (such as an N-body simulation),
programs that involve both the logic and functional languages (such as matrix
multiplication), and a real-world static analysis (the Strong Update analysis).
Additionally, for the purely functional benchmarks, the performance of Flix
is compared to C++, Java, Scala, and Ruby.
In general, the performance of compiled Flix code is significantly faster
than interpreted Flix code. This applies to all the purely functional
benchmarks, as well as benchmarks that spend most of the time in the functional
language, rather than the logic language. Furthermore, for purely functional
code, the performance of compiled Flix is often comparable to Java and Scala
Stateless HOL
We present a version of the HOL Light system that supports undoing
definitions in such a way that this does not compromise the soundness of the
logic. In our system the code that keeps track of the constants that have been
defined thus far has been moved out of the kernel. This means that the kernel
now is purely functional.
The changes to the system are small. All existing HOL Light developments can
be run by the stateless system with only minor changes.
The basic principle behind the system is not to name constants by strings,
but by pairs consisting of a string and a definition. This means that the data
structures for the terms are all merged into one big graph. OCaml - the
implementation language of the system - can use pointer equality to establish
equality of data structures fast. This allows the system to run at acceptable
speeds. Our system runs at about 85% of the speed of the stateful version of
HOL Light.Comment: In Proceedings TYPES 2009, arXiv:1103.311
An Integrated Development Environment for Declarative Multi-Paradigm Programming
In this paper we present CIDER (Curry Integrated Development EnviRonment), an
analysis and programming environment for the declarative multi-paradigm
language Curry. CIDER is a graphical environment to support the development of
Curry programs by providing integrated tools for the analysis and visualization
of programs. CIDER is completely implemented in Curry using libraries for GUI
programming (based on Tcl/Tk) and meta-programming. An important aspect of our
environment is the possible adaptation of the development environment to other
declarative source languages (e.g., Prolog or Haskell) and the extensibility
w.r.t. new analysis methods. To support the latter feature, the lazy evaluation
strategy of the underlying implementation language Curry becomes quite useful.Comment: In A. Kusalik (ed), proceedings of the Eleventh International
Workshop on Logic Programming Environments (WLPE'01), December 1, 2001,
Paphos, Cyprus. cs.PL/011104
Combining Static and Dynamic Contract Checking for Curry
Static type systems are usually not sufficient to express all requirements on
function calls. Hence, contracts with pre- and postconditions can be used to
express more complex constraints on operations. Contracts can be checked at run
time to ensure that operations are only invoked with reasonable arguments and
return intended results. Although such dynamic contract checking provides more
reliable program execution, it requires execution time and could lead to
program crashes that might be detected with more advanced methods at compile
time. To improve this situation for declarative languages, we present an
approach to combine static and dynamic contract checking for the functional
logic language Curry. Based on a formal model of contract checking for
functional logic programming, we propose an automatic method to verify
contracts at compile time. If a contract is successfully verified, dynamic
checking of it can be omitted. This method decreases execution time without
degrading reliable program execution. In the best case, when all contracts are
statically verified, it provides trust in the software since crashes due to
contract violations cannot occur during program execution.Comment: Pre-proceedings paper presented at the 27th International Symposium
on Logic-Based Program Synthesis and Transformation (LOPSTR 2017), Namur,
Belgium, 10-12 October 2017 (arXiv:1708.07854
Independent AND-parallel implementation of narrowing
We present a parallel graph narrowing machine, which is
used to implement a functional logic language on a shared memory multiprocessor. It is an extensión of an abstract machine for a purely functional language. The result is a programmed graph reduction machine which integrates the mechanisms of unification, backtracking, and independent
and-parallelism. In the machine, the subexpressions of an expression can run in parallel. In the case of backtracking, the structure of an expression is used to avoid the reevaluation of subexpressions as far as possible. Deterministic computations are detected. Their results are maintained and need not be reevaluated after backtracking
Computation in Physical Systems: A Normative Mapping Account
The relationship between abstract formal procedures and the activities of actual physical systems has proved to be surprisingly subtle and controversial, and there are a number of competing accounts of when a physical system can be properly said to implement a mathematical formalism and hence perform a computation. I defend an account wherein computational descriptions of physical systems are high-level normative interpretations motivated by our pragmatic concerns. Furthermore, the criteria of utility and success vary according to our diverse purposes and pragmatic goals. Hence there is no independent or uniform fact to the matter, and I advance the ‘anti-realist’ conclusion that computational descriptions of physical systems are not founded upon deep ontological distinctions, but rather upon interest-relative human conventions. Hence physical computation is a ‘conventional’ rather than a ‘natural’ kind
- …