Charm (programming language)

Charm (programming language)
Charm
Paradigm(s) Structured programming
Appeared in 1996
Designed by P. Nowosad
Influenced by RTL/2, C, Pascal
OS RISC OS
Website charm.qu-bit.co.uk

Charm (language) is a computer programming language devised in the early 1990s with similarities to the RTL/2, Pascal and C languages in addition to containing some unique features of its own. The Charm language is defined by a context-free grammar amenable to being processed by recursive descent parser as described in seminal books on compiler design.[1][2]

A set of Charm tools including a compiler, assembler and linker released for the Acorn market has been reviewed in Acorn User magazine[3] under the category of programming software.

Contents

Grammar

The definition of the Charm grammar in Backus–Naur Form along with descriptive examples of Charm constructs is defined on the Charm language page.[4]

The language is block structured, with each block being introduced by a language keyword that is descriptive of the operation being performed in the block e.g. for, while, repeat (iteration), case (selection). Each block is ended by the same language keyword prefixed by end_ e.g. a while block is ended by end_while. This feature of the language is intended to ease comprehension. Additionally language lines within a block are normally indented for the same reason, though this not required as white space is ignored.

Each grammatically conforming text (with module being the start symbol of the grammar) represents a collection of executable code and associated data which can be used by a Charm tool set as a component when assembling a program that can be run under an operating system utilising the services it provides to do useful work such as data processing or interacting with users through a Graphical user interface.

Data types

Charm is a strongly typed language, but does allow some implicit conversions between numeric and floating point types. The following basic variable types are supported:

  • int - integers
  • char - characters
  • boolean - boolean values (true or false)
  • real - floating point numbers

Data aggregates of the same type may be declared and statically initialised using the array keyword, and these may be multidimensional. Aggregates of different types may be declared using the record keyword, and it is allowable for such a declaration to define a union of record fields that overlay each other in terms of storage allocation.

Referencing

Data or procedures within the scope of a module may be made global to the final application by using the ent keyword. If a module wishes to reference a procedure or data from another Charm module, it does so using the ext keyword.

References to data constructs and procedures may be made using the ref keyword. These can be dereferenced using the val keyword. When using reference variables, comparison operators are available to check whether two reference variables refer to the same item of data ( :=: ) or whether the data they point to is the same ( = ).

Example

The classic Hello world program written in Charm is:

    ext proc write_string (ref array char);
    module hello;
        ent proc start ();
            write_string ("Hello world");
        end_proc;
    end_module;

Tool Set

Tool set implementations are expected to provide a compiler and an assembler to generate object files from Charm source code and assembler source code, which can then be linked together along with library and run time support files to generate an executable program.

At the time of writing only one Charm tool set installation is available (free of charge) for download. The tools are themselves written in the Charm language, and the source code is available under the terms of the GNU General Public License. They run on RISC OS PCs with ARM CPUs and on emulators for RISC OS which are hosted on Windows or Linux platforms (such as RPCEmu).

Compiler

The Charm compiler is a recursive descent single pass compiler which parses Charm source code to generate quadruples of the form result := lhs op rhs in an intermediate language that supports arithmetic, logical and flow of control operations. Data is stored in temporaries which are assigned to registers and memory locations in the back end of the compiler. Two back ends are currently in existence, one generating Motorola 68000 assembly language, and the other generating ARM Architecture [5].

The quadruple output from the hello world example is:

        param   l1$
        call    write_string[proc (ref array char) void]

and the assembler output is:

        string   "hello"
        xdef    _start
        align
_start
        xref    _write_string
        stmfd   sp!,{rp}
        adr     r0,_l1$
        bl     _write_string
        ldmfd   sp!,{pc}
        address
        align
_l1$
        string  "Hello world"
        direct
        end

Note that in more recent releases of Charm, the I/O procedures have been organised along with other standard library procedures into a set of globally available singleton record trees with record references as branches and procedures as leaves. As part of this reorganisation, the write_string method is now invoked through the root run time library record rtl via record reference .out as procedure str i.e. in the hello world example above write_string ("Hello world") becomes rtl.out.str ("Hello world").

Assembler

The assembler accepts instruction mnemonics, data declarations and directives and constructs an object file containing information readily understandable by the CPU of the target processor, in particular code instructions coded in binary.

                 Assembler listing of @.arm.hello
 
   1:0000:6D795F6D              string  "hello"
   2:                           xdef    _start
   3:                           align
   4:                   _start
   5:                           xref    _write_string
   6:0000:E92D4000              stmfd   sp!,{rp}
   7:0004:                      adr     r0,_l1$
   8:000C:EBFFFFFE              bl      _write_string
   9:0010:E8BD8000              ldmfd   sp!,{pc}
  10:                           address
  11:                           align
  12:                   _l1$
  13:0000:48656C6C              string  "Hello world"
  14:                           direct
  15:                           end

Linker

One and only one of the Charm modules linked to form an executable program must contain a procedure matching the external signature:

    ext proc start (int |argc|, ref array ref array char |argv|);

This is analogous to the main function in the C and Java languages. Here |argc| contains the number of parameters passed on the command line and |argv| contains a reference to an array of |argc| + 1 strings (one string per positional parameter in order and a terminating nil).

The linker adds any necessary header information required by the operating system in order to execute the program, and ensures the run time library assembler support code is run which sets up the run time environment (data and stack pointers) and passes control to the start procedure of the application.

A map file showing the names of all modules linked to form the program along with global data and code references is optionally produced which can be used by debuggers and profilers.

References

  1. ^ ISBN D-201-10073-8 Aho, Ullman Principles of Compiler Design
  2. ^ ISBN D-201-10194-7 Aho, Sethi, Ullman Compilers Principles, Techniques and Tools
  3. ^ June 1996 Stephen Wade Acorn User Magazine, Charm or trinket? review
  4. ^ Charm risc OS, language page
  5. ^ ISBN 0-9512579-0-0 Peter Cockerell ARM Assembly Language Programming

External links


Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Look at other dictionaries:

  • Charm++ — Paradigm(s) Message driven parallel programming, Object based Appeared in late 1980s (late 1980s) Developer Wennie Shu, Kevin Nomura, Laxmikant Kale Stable release 6.2.1 …   Wikipedia

  • Charm++ — [1] ist eine parallele objektorientierte Programmiersprache basierend auf C++ und wurde im Parallel Programming Laboratory der University of Illinois entwickelt. Charm++ wurde mit dem Ziel entwickelt, eine höhere Produktivität durch eine höhere… …   Deutsch Wikipedia

  • Charm — or charms may refer to: Charm or charisma, a number of socially desirable characteristics such as courtesy, wit and sexiness Charm offensive Superficial charm In mythology Prince Charming, a traditional name for a fairy tale hero Lucky charms… …   Wikipedia

  • List of programming languages by category — Programming language lists Alphabetical Categorical Chronological Generational This is a list of programming languages grouped by category. Some languages are listed in multiple categories. Contents …   Wikipedia

  • List of programming languages — Programming language lists Alphabetical Categorical Chronological Generational The aim of this list of programming languages is to include all notable programming languages in existence, both those in current use and historical ones, in… …   Wikipedia

  • Parallel programming model — A parallel programming model is a set of software technologies to express parallel algorithms and match applications with the underlying parallel systems. It encloses the areas of applications, programming languages, compilers, libraries,… …   Wikipedia

  • Concurrent computing — Programming paradigms Agent oriented Automata based Component based Flow based Pipelined Concatenative Concurrent c …   Wikipedia

  • Parallel computing — Programming paradigms Agent oriented Automata based Component based Flow based Pipelined Concatenative Concurrent computing …   Wikipedia

  • Message Passing Interface — MPI, the Message Passing Interface, is standardized and portable message passing system designed by a group of researchers from academia and industry to function on a wide variety of parallel computers. The standard defines the syntax and… …   Wikipedia

  • Maniac Mansion — This article is about the video game. For the television series, see Maniac Mansion (TV series). Maniac Mansion …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”