General
Hansen and MacNamee -
Efficient Reading of Papers in Science and Technology -
The SLDG Filing Cabinet contains a psuedo-random collection of papers that describe things useful for SLDG students to be aware of. The list is necessarily incomplete and is being updated continuously.
Hansen and MacNamee -
Efficient Reading of Papers in Science and Technology -
Graham Hutton -
Fold and Unfold for Program Semantics -
Luc Duponcheel -
Using catamorphisms, subtypes and monad transformers
for writing modular functional interpreters -
Phillip Wadler -
How to declare an imperative -
Phillip Wadler -
Monads for Functional Programming -
Phillip Wadler -
The Essence of Functional Programming -
Liang, Hudak, and Jones -
Monad Transformers and Modular Interpreters -
Mark Jones -
Composing Monads -
Ralf Hinze -
Deriving Backtracking Monad Transformers -
Hughes -
Generalising Monads to Arrows -
C. Barry Jay -
An Introduction to Categories in Computing -
Benjamin Pierce -
Basic Category Theory for Computer Scientists -
Andrea Asperti and Giuseppe Longo -
Categories, Types and Structures -
Lambert Meertens -
Category Theory for Program Construction by
Calculation -
Meijer, et al -
Functional Programming with Bananas, Lenses, Envelopes,
and Barbed Wire -
Meijer and Hutton -
Bananas in Space: Extending Fold and Unfold to
Exponential Types -
Duponcheel -
Writing Interpreters using Catamorphisms, Subtypes, and
Monad Transformers -
Gayo -
Reusable Monadic Semantics of Logic Programs with
Arithmetic Predicates -
Jansson and Jeuring -
Polytypic Unification -
- Bandera -
Patrick Cousot -
Abstract Interpretation -
David Schmidt and Bernhard Steffen -
Program Analysis as Model Checking of Abstract Interpretations
-
Flemming Nielson, Hanne R. Nielson and Chris Hankin -
Principles of Program Analysis -
Greg Morrisett, et. al. -
From System F to Typed Assembly Language -
George Necula -
Proof-Carrying Code -
Douglas Smith -
KIDS: A Semiautomatic Program Development System -
Manna and Waldinger -
Fundamentals of Deductive Program Synthesis -
ML - A
call-by-value, strict, functional language somewhat like
Haskell in appearance, but very different in
implementation. The ML module system and type inference
systems are quite interesting. ML and it's derivative OCAML
have attracted significant recent interest.
OCAML -
An object-oriented derivative of ML. Growing in popularity
in several areas such as network programming. Compiles to
an interesting virtual machine that is an alternative to the
Java virtual machine. Definitely worth a look.
Haskell
- A lazy, non-strict functional language. Interesting class
system in contrast to the C++/Java style. We do most of our
development in Haskell.
Haskore - A domain specific language
built on Haskell for functional representation of music. We
may play around with Haskore in one of our projects.
Scheme - A functional language in the
Lisp family. Highly consistent and relatively small, Scheme
is a favorite among language researchers. The PLT folks
have done a wonderful job of supporting and promoting Scheme
in teaching as well as research.
Common
Lisp - An alternate implementation of Lisp that shares
many concepts with Scheme. While Scheme is intended to be
small and highly consistent, Common Lisp has an expansive
feature set. Of particular interest is the excellent
object-oriented extension called CLOS (Common Lisp Object
System).
Erlang
- A functional / parallel programming language. Erlang
computations are purely functional and embedded in a
parallel programming language based on the pi calculus.
SmallTalk - Largely viewed as the first
fully object oriented language, SmallTalk was developed in
the 1970s and still enjoys substantial usage. The terms
"message" and "method" commonly used in
describing object oriented systems emerged from the
SmallTalk language. While languages like Common Lisp, C++
and Java use generic functions to implement object-oriented
features, SmallTalk uses the classic message-method
approach. Loosely defined, a message is sent to an object
requesting an action be performed. The object responds with
a method associated with the message. Note that this is not
parallel programming or message passing in the distributed
programming sense.
Prolog - A widely used logic programming
language. Instead of describing how a computation is
performed, properties of the solution are defined. The prolog
interpreter takes the problem description and determines how
to satisfy it. Prolog is particularly popular in the European
artificial intelligence community.
Perl -
Perl is among the most popular scripting languages currently
in use. With bindings to many libraries, a powerful pattern
matching capability, and many other scripting features, you
will definitely find Perl useful for scripting, CGI writing
and other day-to-day tasks. Perl will be installed by
default in virtually any Linux environment. Take a look at
the FAQ and info to find out more.
Python -
Rapidly approaching perl, python is another example of a
scripting language useful for day-to-day computing
tasks. Although python shares features with perl, it is much
better suited for developing larger applications. It's
dictionary capability is particularly useful and
interesting. Python will be installed by default on any
Linux environment. Take a look at the FAQ and info to find
out more.
Ruby - An object-oriented scripting
language.
Esterel - A synchronous language used
for describing control systems and hardware
systems. Synchronous refers to the concept of a clock and
triggering execution on changes in signals.
SETL - A language whose basic data
structures and operations center on using sets.
CafeOBJ - A formal language environment
implementing the OBJ formal specification language. The
language implements algebraic theories and insitutions
providing both formal analysis capabilities and
executability. CafeOBJ differs from most langauges in that
it is highly formal with a clean mathematical syntax.
VHDL - A special purpose
simulation language for digital hardware systems. VHDL is
much like Ada in style, but much different in
implementation. VHDL centers on entities that represent
chips or processes. A collection of interconnected entities
is used to describe a system. All entities execute in
parallel and respond to changes in signals to control
execution. While traditional languages traditionally check
the value of a variable, VHDL signals can be monitored for
changes in value using wait statements and sensitivity
lists. Electrical Engineers and Computer Engineers at KU
learn VHDL in EECS 443.
Verilog - A special
purpose simulation langauge for digital hardware systems.
Verilog was originally developed by Cadence as a proprietary
modeling language. The emergence of VHDL in the 1980's
brought Verilog into the public domain. Where VHDL tends to
be Ada-like, Verilog tends to be more C-like in philosophy.
SystemVerilog - An
extension of Verilog into "system-level" design.
Subsumes Verilog.
SystemC - A C++ based
open source language and simulation kernel for modeling and
implementing electronic systems. SystemC is an excellent
example of a domain-specific embedded language for hardware
modeling.
Lava - A domain specific embedded language
extending Haskell for hardware system modeling.
Rosetta - A specification
language for heterogeneous systems developed by researchers
at The University of Kansas working through ITTC. Rosetta is
being standardized by Accellera for use modeling and
simulating heterogeneous hardware and software
systems. Rosetta is loosely based on concepts from Haskell,
VHDL and many other languages.