Jump to content
 







Main menu
   


Navigation  



Main page
Contents
Current events
Random article
About Wikipedia
Contact us
Donate
 




Contribute  



Help
Learn to edit
Community portal
Recent changes
Upload file
 








Search  

































Create account

Log in
 









Create account
 Log in
 




Pages for logged out editors learn more  



Contributions
Talk
 



















Contents

   



(Top)
 


1 History and development  





2 Features  



2.1  Security  





2.2  Parallelism  



2.2.1  Channels and communication  





2.2.2  Parallel recursion  









3 Interference control  





4 Structure and syntax  





5 Implementation  





6 References  





7 External links  














SuperPascal







Add links
 









Article
Talk
 

















Read
Edit
View history
 








Tools
   


Actions  



Read
Edit
View history
 




General  



What links here
Related changes
Upload file
Special pages
Permanent link
Page information
Cite this page
Get shortened URL
Download QR code
Wikidata item
 




Print/export  



Download as PDF
Printable version
 
















Appearance
   

 






From Wikipedia, the free encyclopedia
 


SuperPascal
Paradigmconcurrent, imperative, structured
FamilyWirth Pascal
Designed byPer Brinch Hansen
First appeared1993; 31 years ago (1993)
Stable release

1 / 1993; 31 years ago (1993)

Typing disciplineStrong
Websitebrinch-hansen.net
Influenced by
Communicating sequential processes, Pascal, Concurrent Pascal, Joyce, occam

SuperPascal is an imperative, concurrent computing programming language developed by Per Brinch Hansen.[1] It was designed as a publication language: a thinking tool to enable the clear and concise expression of concepts in parallel programming. This is in contrast with implementation languages which are often complicated with machine details and historical conventions. It was created to address the need at the time for a parallel publication language. Arguably, few languages today are expressive and concise enough to be used as thinking tools.

History and development

[edit]

SuperPascal is based on Niklaus Wirth's sequential language Pascal, extending it with features for safe and efficient concurrency. Pascal itself was used heavily as a publication language in the 1970s. It was used to teach structured programming practices and featured in text books, for example, on compilers[2] and programming languages.[3] Hansen had earlier developed the language Concurrent Pascal,[4] one of the earliest concurrent languages for the design of operating systems and real-time control systems.

The requirements of SuperPascal were based on the experience gained by Hansen over three years in developing a set of model parallel programs, which implemented methods for common problems in computer science.[5] This experimentation allowed him to make the following conclusions about the future of scientific parallel computing:

These then led to the following requirements for a parallel publication language:

Features

[edit]

The key ideas in the design of SuperPascal was to provide a secure programming, with abstract concepts for parallelism.[6][7]

Security

[edit]

SuperPascal is secure in that it should enable its compiler and runtime system to detect as many cases as possible in which the language concepts break down and produce meaningless results.[8] SuperPascal imposes restrictions on the use of variables that enable a single-pass compiler to check that parallel processes are disjoint, even if the processes use procedures with global variables, eliminating time-dependent errors. Several features in Pascal were ambiguous or insecure and were omitted from SuperPascal, such as labels and goto statements, pointers and forward declarations.[6]

Parallelism

[edit]

The parallel features of SuperPascal are a subset of occam 2, with the added generality of dynamic process arrays and recursive parallel processes.[7]

Aparallel statement denotes that the fixed number of statements it contains must be executed in parallel. For example:

parallel
    source() |
    sink()
end

Aforall statement denotes the parallel execution of a statement by a dynamic number of processes, for example:

forall i := 0 to 10 do
    something()

Channels and communication

[edit]

Parallel processes communicate by sending typed messages through channels created dynamically. Channels are not variables in themselves, but are identified by a unique value known as the channel reference, which are held by channel variables. A channel is declared, for example, by the declaration

type channel = *(boolean, integer);
var c: channel;

which defines a new (mixed) type named channel and a variable of this type named c. A mixed type channel is restricted to transmitting only the specified types, in this case boolean and integer values. The channel c is initialised by the open statement:

open(c)

Message communication is then achieved with the send(channel, value) and receive(channel, variable) statements. The expression or variable providing the value for send, and the variable in receive, must both be of the same type as the first channel argument. The following example shows the use of these functions in a process that receives a value from the left channel and outputs it on the right one.

var left, right: channel; a: number;
receive(left, a);
send(right, a)

The functions send and receive can both take multiple input and output arguments respectively:

send(channel, e1, e2,..., en);
receive(channel, v1, v2,..., vn)

The following runtime communication errors can occur:

Parallel recursion

[edit]

Recursive procedures can be combined with parallel and forall statements to create parallel recursive processes. The following example shows how a pipeline of processes can be recursively defined using a parallel statement.

procedure pipeline(min, max: integer; left, right: channel);
var middle: channel;
begin
  if min < max then
    begin
      open(middle);
      parallel
        node(min, left, middle) |
        pipeline(min + 1, max, middle, right)
      end
    end
  else node(min, left, right)
end;

Another example is the recursive definition of a process tree:

procedure tree(depth: integer, bottom: channel);
var left, right: channel;
begin
  if depth > 0 then
    begin
      open(left, right);
      parallel
        tree(depth - 1, left) |
        tree(depth - 1, right) |
        root(bottom, left, right)
      end
    end
  else leaf(bottom)

Interference control

[edit]

The most difficult aspect of concurrent programming is unpredictableornon-reproducible behaviour caused by time-dependent errors. Time-dependent errors are caused by interference between parallel processes, due to variable updates or channel conflicts. If processes sharing a variable, update it at unpredictable times, the resulting behaviour of the program is time-dependent. Similarly, if two processes simultaneously try to send or receive on a shared channel, the resulting effect is time-dependent.

SuperPascal enforces certain restrictions on the use of variables and communication to minimise or eliminate time-dependent errors. With variables, a simple rule is required: parallel processes can only update disjoint sets of variables.[1] For example, in a parallel statement a target variable cannot be updated by more than a single process, but an expression variable (which can't be updated) may be used by multiple processes. In some circumstances, when a variable such as an array is the target of multiple parallel processes, and the programmer knows its element-wise usage is disjoint, then the disjointness restriction may be overridden with a preceding [sic] statement.

Structure and syntax

[edit]

SuperPascal is a block structured language, with the same basic syntax as Pascal. A program consists of a header, global variable definitions, functionorprocedure definitions and a main procedure. Functions and procedures consists of blocks, where a block is a set of statements. Statements are separated by semicolons, as opposed to languages like CorJava, where they are terminated by semicolons.

The following is an example of a complete SuperPascal program, which constructs a pipeline communication structure with 100 nodes. A master node sends an integer token to the first node, this is then passed along the pipeline and incremented at each step, and finally received by the master node and printed out.

program pipeline;

const
    len = 100;

type
    channel = *(integer);

var
    left, right: channel;
    value: integer;

procedure node(i: integer; left, right: channel);
var value: integer;
begin
    receive(left, value);
    send(right, value+1)
end;

procedure create(left, right: channel);
type row = array [0..len] of channel;
var c: row; i: integer;
begin
    c[0] := left;
    c[len] := right;
    for i := 1 to len-1 do
        open(c[i]);
    forall i := 1 to len do
        node(i, c[i-1], c[i])
end;

begin
    open(left, right);

    parallel
        send(left, 0) |
        create(left, right) |
        receive(right, value)
    end;

    writeln('The resulting value is ', value)
end.

Implementation

[edit]

The SuperPascal software can be accessed freely from the Brinch Hansen Archive.[9] It consists of a compiler and interpreter, which are both written in normal, sequential Pascal (ISO Level 1 standard Pascal). This is supported by the GNU Pascal compiler and newer versions of the Free Pascal compiler (2.7.1+) with the -Miso switch, with the following respective small modifications to the code.

For GPC, the file interpret.p uses the non-standard clock function (line 1786), which is used to obtain the system time. Instead, the Extended Pascal getTimeStamp function can be used (which is supported by the GNU Pascal compiler), by declaring a variable of type TimeStamp, setting that with the current time using getTimeStamp and assigning the Second field of the TimeStamp to the variable t.

Free Pascal also needs a solution to the above "clock" problem (On windows, just declare gettickcount as external with "clock" as name). Further, the reset/rewrites that are marked as non-standard in the source code must be changed to assign/reset (or rewrite) pairs. (GPC probably only errors on this if you enable strict flags), and the C preprocessor commands #include 'xx' must be changed to {$include 'xx'}.

{ Time code for readtime in Freepascal on unix systems }
Function  FpTime(var tloc : integer): integer; external name 'FPC_SYSC_TIME';

procedure readtime(
 var t:  integer);
begin
  { A nonstandard function reads
    the processor time in ms }
  t:=fptime(t);
end;

References

[edit]
  1. ^ a b Hansen, Per Brinch (1993), SuperPascal: a publication language for parallel scientific computing
  • ^ Welsh, Jim (1980). Structured System Programming. Upper Saddle River, NJ, USA: Prentice-Hall. ISBN 0-13-854562-6.
  • ^ Tennent, R. D. (1981). Principles of Programming Languages. Upper Saddle River, NJ, USA: Prentice-Hall. ISBN 0-13-709873-1.
  • ^ Hansen, Brinch (1977). The Architecture of Concurrent Programs. Prentice-Hall. ISBN 978-0130446282.
  • ^ Hansen, Brinch (May 1993), "Model programs for computational science: A programming methodology for multicomputers", Concurrency: Practice and Experience, pp. 407–423
  • ^ a b Hansen, Brinch (1994). "The programming language SuperPascal". Software: Practice and Experience. 24, 5: 399–406.
  • ^ a b Hansen, Brinch (1977). The invention of concurrent programming. New York: Springer-Verlag. ISBN 0-387-95401-5.
  • ^ Hoare, C. A. R. (1974). "Hints on programming language design". Computer System Reliability: 505–534.
  • ^ Hayden, C.C. (2008-06-11). "Per Brinch Hansen Archive". Retrieved 2020-03-03.
  • [edit]
    Retrieved from "https://en.wikipedia.org/w/index.php?title=SuperPascal&oldid=1207422957"

    Categories: 
    Concurrent programming languages
    Procedural programming languages
    Pascal programming language family
    Programming languages created in 1993
    Hidden categories: 
    Articles with short description
    Short description is different from Wikidata
    Articles lacking reliable references from June 2018
    All articles lacking reliable references
    Official website different in Wikidata and Wikipedia
     



    This page was last edited on 14 February 2024, at 20:01 (UTC).

    Text is available under the Creative Commons Attribution-ShareAlike License 4.0; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization.



    Privacy policy

    About Wikipedia

    Disclaimers

    Contact Wikipedia

    Code of Conduct

    Developers

    Statistics

    Cookie statement

    Mobile view



    Wikimedia Foundation
    Powered by MediaWiki