ALGOL 68 (short for Algorithmic Language 1968) is an imperativeprogramming language that was conceived as a successor to the ALGOL 60 programming language, designed with the goal of a much wider scope of application and more rigorously defined syntax and semantics.
The complexity of the language's definition, which runs to several hundred pages filled with non-standard terminology, made compiler implementation difficult and it was said it had "no implementations and no users". This was only partly true; ALGOL 68 did find use in several niche markets, notably in the United Kingdom where it was popular on International Computers Limited (ICL) machines, and in teaching roles. Outside these fields, use was relatively limited.
Nevertheless, the contributions of ALGOL 68 to the field of computer science have been deep, wide-ranging and enduring, although many of these contributions were only publicly identified when they had reappeared in subsequently developed programming languages. Many languages were developed specifically as a response to the perceived complexity of the language, the most notable being Pascal, or were reimplementations for specific roles, like Ada.
Many languages of the 1970s trace their design specifically to ALGOL 68, selecting some features while abandoning others that were considered too complex or out-of-scope for given roles. Among these is the language C, which was directly influenced by ALGOL 68, especially by its strong typing and structures. Most modern languages trace at least some of their syntax to either C or Pascal, and thus directly or indirectly to ALGOL 68.
Overview
ALGOL 68 features include expression-based syntax, user-declared types and structures/tagged-unions, a reference model of variables and reference parameters, string, array and matrix slicing, and concurrency.
ALGOL 68 was defined using a formalism, a two-level formal grammar, invented by Adriaan van Wijngaarden. Van Wijngaarden grammars use a context-free grammar to generate an infinite set of productions that will recognize a particular ALGOL 68 program; notably, they are able to express the kind of requirements that in many other programming language technical standards are labelled semantics, and must be expressed in ambiguity-prone natural language prose, and then implemented in compilers as ad hoc code attached to the formal language parser.
ALGOL 68 was the first (and possibly one of the last) major language for which a full formal definition was made before it was implemented.
ALGOL 68 has been criticized, most prominently by some members of its design committee such as C. A. R. Hoare and Edsger Dijkstra, for abandoning the simplicity of ALGOL 60, becoming a vehicle for complex or overly general ideas, and doing little to make the compiler writer's task easier, in contrast to deliberately simple contemporaries (and competitors) such as C, S-algol and Pascal.
In 1970, ALGOL 68-R became the first working compiler for ALGOL 68.
Though European defence agencies (in Britain Royal Signals and Radar Establishment (RSRE)) promoted the use of ALGOL 68 for its expected security advantages, the American side of the NATO alliance decided to develop a different project, the language Ada, making its use obligatory for US defense contracts.
ALGOL 68 also had a notable influence in the Soviet Union, details of which can be found in Andrey Terekhov's 2014 paper: "ALGOL 68 and Its Impact on the USSR and Russian Programming",[15] and "Алгол 68 и его влияние на программирование в СССР и России".[16]
Steve Bourne, who was on the ALGOL 68 revision committee, took some of its ideas to his Bourne shell (and thereby, to descendant Unix shells such as Bash) and to C (and thereby to descendants such as C++).
The complete history of the project can be found in C. H. Lindsey's A History of ALGOL 68.[17][18]
For a full-length treatment of the language, see "Programming ALGOL 68 Made Easy"[19] by Dr. Sian Mountbatten, or "Learning ALGOL 68 Genie"[20] by Marcel van der Veer which includes the Revised Report.
History
Origins
ALGOL 68, as the name implies, is a follow-on to the ALGOL language that was first formalized in 1960. That same year the International Federation for Information Processing (IFIP) formed and started the Working Group on ALGOL, or WG2.1. This group released an updated ALGOL 60 specification in Rome in April 1962. At a follow-up meeting in March 1964, it was agreed that the group should begin work on two follow-on standards, ALGOL X which would be a redefinition of the language with some additions, and an ALGOL Y, which would have the ability to modify its own programs in the style of the language LISP.[21]
Definition process
The first meeting of the ALGOL X group was held in Princeton University in May 1965. A report of the meeting noted two broadly supported themes, the introduction of strong typing and interest in Euler's concepts of 'trees' or 'lists' for handling collections.[22]
At the second meeting in October in France, three formal proposals were presented, Niklaus Wirth's ALGOL W along with comments about record structures by C.A.R. (Tony) Hoare, a similar language by Gerhard Seegmüller, and a paper by Adriaan van Wijngaarden on "Orthogonal design and description of a formal language". The latter, written in almost indecipherable "W-Grammar", proved to be a decisive shift in the evolution of the language. The meeting closed with an agreement that van Wijngaarden would re-write the Wirth/Hoare submission using his W-Grammar.[22]
This seemingly simple task ultimately proved more difficult than expected, and the follow-up meeting had to be delayed six months. When it met in April 1966 in Kootwijk, van Wijngaarden's draft remained incomplete and Wirth and Hoare presented a version using more traditional descriptions. It was generally agreed that their paper was "the right language in the wrong formalism".[23] As these approaches were explored, it became clear there was a difference in the way parameters were described that would have real-world effects, and while Wirth and Hoare protested that further delays might become endless, the committee decided to wait for van Wijngaarden's version. Wirth then implemented their current definition as ALGOL W.[24]
At the next meeting in Warsaw in October 1966,[25] there was an initial report from the I/O Subcommittee who had met at the Oak Ridge National Laboratory and the University of Illinois but had not yet made much progress. The two proposals from the previous meeting were again explored, and this time a new debate emerged about the use of pointers; ALGOL W used them only to refer to records, while van Wijngaarden's version could point to any object. To add confusion, John McCarthy presented a new proposal for operator overloading and the ability to string together and or constructs, and Klaus Samelson wanted to allow anonymous functions. In the resulting confusion, there was some discussion of abandoning the entire effort.[24] The confusion continued through what was supposed to be the ALGOL Y meeting in Zandvoort in May 1967.[22]
Publication
A draft report was finally published in February 1968. This was met by "shock, horror and dissent",[22] mostly due to the hundreds of pages of unreadable grammar and odd terminology. Charles H. Lindsey attempted to figure out what "language was hidden inside of it",[26] a process that took six man-weeks of effort. The resulting paper, "ALGOL 68 with fewer tears",[27] was widely circulated. At a wider information processing meeting in Zürich in May 1968, attendees complained that the language was being forced upon them and that IFIP was "the true villain of this unreasonable situation" as the meetings were mostly closed and there was no formal feedback mechanism. Wirth and Peter Naur formally resigned their authorship positions in WG2.1 at that time.[26]
The next WG2.1 meeting took place in Tirrenia in June 1968. It was supposed to discuss the release of compilers and other issues, but instead devolved into a discussion on the language. van Wijngaarden responded by saying (or threatening) that he would release only one more version of the report. By this point Naur, Hoare, and Wirth had left the effort, and several more were threatening to do so.[28] Several more meetings followed, North Berwick in August 1968, Munich in December which produced the release of the official Report in January 1969 but also resulted in a contentious Minority Report being written. Finally, at Banff, Alberta in September 1969, the project was generally considered complete and the discussion was primarily on errata and a greatly expanded Introduction to the Report.[29]
The effort took five years, burned out many of the greatest names in computer science, and on several occasions became deadlocked over issues both in the definition and the group as a whole. Hoare released a "Critique of ALGOL 68" almost immediately,[30] which has been widely referenced in many works. Wirth went on to further develop the ALGOL W concept and released this as Pascal in 1970.
Implementations
ALGOL 68-R
The first implementation of the standard, based on the late-1968 draft Report, was introduced by the Royal Radar Establishment in the UK as ALGOL 68-R in July 1970. This was, however, a subset of the full language, and Barry Mailloux, the final editor of the Report, joked that "It is a question of morality. We have a Bible and you are sinning!"[31] This version nevertheless became very popular on the ICL machines, and became a widely-used language in military coding, especially in the UK.[32]
Among the changes in 68-R was the requirement for all variables to be declared before their first use. This had a significant advantage that it allowed the compiler to be one-pass, as space for the variables in the activation record was set aside before it was used. However, this change also had the side-effect of demanding the PROCs be declared twice, once as a declaration of the types, and then again as the body of code. Another change was to eliminate the assumed VOID mode, an expression that returns no value (named a statement in other languages) and demanding the word VOID be added where it would have been assumed. Further, 68-R eliminated the explicit parallel processing commands based on PAR.[31]
Others
The first full implementation of the language was introduced in 1974 by CDC Netherlands for the Control Data mainframe series. This saw limited use, mostly teaching in Germany and the Netherlands.[32]
A version similar to 68-R was introduced from Carnegie Mellon University in 1976 as 68S, and was again a one-pass compiler based on various simplifications of the original and intended for use on smaller machines like the DEC PDP-11. It too was used mostly for teaching purposes.[32]
A version for IBM mainframes did not become available until 1978, when one was released from Cambridge University. This was "nearly complete". Lindsey released a version for small machines including the IBM PC in 1984.[32]
Three open source Algol 68 implementations are known:[33]
"Van Wijngaarden once characterized the four authors, somewhat tongue-in-cheek, as: Koster: transputter, Peck: syntaxer, Mailloux: implementer, Van Wijngaarden: party ideologist." – Koster.
October 1968: Penultimate Draft Report on the Algorithmic Language ALGOL 68 — Chapters 1-9[44] Chapters 10-12[45] — Edited by: A. van Wijngaarden, B.J. Mailloux, J. E. L. Peck and C. H. A. Koster.
December 1968: Report on the Algorithmic Language ALGOL 68 — Offprint from Numerische Mathematik, 14, 79-218 (1969); Springer-Verlag.[46] — Edited by: A. van Wijngaarden, B. J. Mailloux, J. E. L. Peck and C. H. A. Koster.
1968: On 20 December 1968, the "Final Report" (MR 101) was adopted by the Working Group, then subsequently approved by the General Assembly of UNESCO's IFIP for publication. Translations of the standard were made for Russian, German, French and Bulgarian, and then later Japanese and Chinese.[48] The standard was also made available in Braille.
1984: TC 97 considered ALGOL 68 for standardisation as "New Work Item" TC97/N1642 [2][3]. West Germany, Belgium, Netherlands, USSR and Czechoslovakia willing to participate in preparing the standard but the USSR and Czechoslovakia "were not the right kinds of member of the right ISO committees"[4] and Algol 68's ISO standardisation stalled.[5]
1988: Subsequently ALGOL 68 became one of the GOST standards in Russia.
GOST 27974-88 Programming language ALGOL 68 — Язык программирования АЛГОЛ 68[49]
GOST 27975-88 Programming language ALGOL 68 extended — Язык программирования АЛГОЛ 68 расширенный[50]
The standard language contains about sixty reserved words, typically bolded in print, and some with "brief symbol" equivalents:
MODE, OP, PRIO, PROC,
FLEX, HEAP, LOC, LONG, REF, SHORT,
BITS, BOOL, BYTES, CHAR, COMPL, INT, REAL, SEMA, STRING, VOID,
CHANNEL, FILE, FORMAT, STRUCT, UNION,
AT "@", EITHERr0, IS ":=:", ISNTIS NOTr0 ":/=:" ":≠:", OF "→"r0, TRUE, FALSE, EMPTY, NIL "○", SKIP "~",
CO "¢", COMMENT "¢", PR, PRAGMAT,
CASE ~ IN ~ OUSE ~ IN ~ OUT ~ ESAC "( ~ | ~ |: ~ | ~ | ~ )",
FOR ~ FROM ~ TO ~ BY ~ WHILE ~ DO ~ OD,
IF ~ THEN ~ ELIF ~ THEN ~ ELSE ~ FI "( ~ | ~ |: ~ | ~ | ~ )",
PARBEGIN ~ END "( ~ )", GO TO, GOTO, EXIT "□"r0.
Units: Expressions
The basic language construct is the unit. A unit may be a formula, an enclosed clause, a routine text or one of several technically needed constructs (assignation, jump, skip, nihil). The technical term enclosed clause unifies some of the inherently bracketing constructs known as block, do statement, switch statement in other contemporary languages. When keywords are used, generally the reversed character sequence of the introducing keyword is used for terminating the enclosure, e.g. ( IF ~ THEN ~ ELSE ~ FI, CASE ~ IN ~ OUT ~ ESAC, FOR ~ WHILE ~ DO ~ OD ). This Guarded Command syntax was reused by Stephen Bourne in the common UnixBourne shell. An expression may also yield a multiple value, which is constructed from other values by a collateral clause. This construct just looks like the parameter pack of a procedure call.
mode: Declarations
The basic data types (called modes in Algol 68 parlance) are real, int, compl (complex number), bool, char, bits and bytes. For example:
INT n = 2;
CO n is fixed as a constant of 2. COINT m := 3;
CO m is a newly created local variable whose value is initially set to 3. COCO This is short for refint m = locint := 3; COREAL avogadro = 6.0221415⏨23; CO Avogadro number COlong long real long long pi = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510;
COMPL square root of minus one = 0 ⊥ 1;
However, the declaration REAL x; is just syntactic sugar for REFREAL x = LOCREAL;. That is, x is really the constant identifier for a reference to a newly generated local REAL variable.
Furthermore, instead of defining both float and double, or int and long and short, etc., ALGOL 68 provides modifiers, so that the presently common double would be written as LONGREAL or LONGLONGREAL instead, for example. The prelude constantsmax real and min long int are provided to adapt programs to different implementations.
All variables need to be declared, but declaration does not have to precede the first use.
For ALGOL 68, only the NEWMODE mode-indication appears to the left of the equals symbol, and most notably the construction is made, and can be read, from left to right without regard to priorities. Also, the lower bound of Algol 68 arrays is one by default, but can be any integer from -max int to max int.
Mode declarations allow types to be recursive: defined directly or indirectly in terms of themselves.
This is subject to some restrictions – for instance, these declarations are illegal:
MODEA = REFAMODEA = STRUCT (A a, B b)
MODEA = PROC (A a) A
while these are valid:
MODEA = STRUCT (REFA a, B b)
MODEA = PROC (REFA a) REFA
Coercions: casting
The coercions produce a coercee from a coercend according to three criteria: the a priori mode of the coercend before the application of any coercion, the a posteriori mode of the coercee required after those coercions, and the syntactic position or "sort" of the coercee. Coercions may be cascaded.
The six possible coercions are termed deproceduring, dereferencing, uniting, widening, rowing, and voiding. Each coercion, except for uniting, prescribes a corresponding dynamic effect on the associated values. Hence, many primitive actions can be programmed implicitly by coercions.
Context strength – allowed coercions:
soft – deproceduring
weak – dereferencing or deproceduring, yielding a name
meek – dereferencing or deproceduring
firm – meek, followed by uniting
strong – firm, followed by widening, rowing or voiding
Coercion hierarchy with examples
ALGOL 68 has a hierarchy of contexts which determine the kind of coercions available at a particular point in the program. These contexts are:
Context
Context location
Coercions available
Coercion examples in the context
Soft
Weak
Meek
Firm
Strong
Strong
Right hand side of:
Identity-declarations, as "~" in: REAL x = ~
Initialisations, as "~" in: REAL x := ~
Also:
Actual-parameters of calls, as "~" in:PROC: sin(~)
Enclosed clauses of casts, as "~" in: REAL(~)
Units of routine-texts
Statements yielding VOID
All parts (but one) of a balanced clause
One side of an identity relation, as "~" in: ~ IS ~
deproceduring
All SOFT then weak dereferencing (dereferencing or deproceduring, yielding a name)
All WEAK then dereferencing (dereferencing or deproceduring)
All MEEK then uniting
All FIRM then widening, rowing or voiding
Widening occurs if there is no loss of precision. For example: An INT will be coerced to a REAL, and a REAL will be coerced to a LONGREAL. But not vice versa. Examples:
to LONGINT from INT
to REAL from INT
to COMPL from REAL
to []BOOL from BITS
to STRING from BYTES
A variable can also be coerced (rowed) to an array of length 1.
For example:
to [1]INT from INT
to [1]REAL from REAL etc.
Firm
Operands of formulas as "~" in:~ OP ~
Parameters of transput calls
Example:
UNION(INT,REAL) var := 1
Meek
Trimscripts (yielding INT)
Enquiries: e.g. as "~" in the following
IF ~ THEN ... FI and
FROM ~ BY ~ TO ~ WHILE ~ DO ... OD etc
Primaries of calls (e.g. sin in sin(x))
Examples:
to BOOL from REFREFBOOL
to INT from REFREFREFINT
Weak
Primaries of slices, as in "~" in: ~[1:99]
Secondaries of selections, as "~" in: value OF ~
Examples:
to REFINT from REFREFINT
to REFREAL from REFREFREFREAL
to REFSTRUCT from REFREFREFREFSTRUCT
Soft
The LHS of assignments, as "~" in: ~ := ...
Example:
deproceduring of: PROCREAL random: e.g. random
For more details about Primaries, Secondaries, Tertiary & Quaternaries refer to Operator precedence.
pr & co: Pragmats and Comments
Pragmats are directives in the program, typically hints to the compiler; in newer languages these are called "pragmas" (no 't'). e.g.
PRAGMAT heap=32 PRAGMATPR heap=32 PR
Comments can be inserted in a variety of ways:
¢ The original way of adding your 2 cents worth to a program ¢
COMMENT "bold" comment COMMENTCO Style i comment CO
# Style ii comment #
£ This is a hash/pound comment for a UK keyboard £
Normally, comments cannot be nested in ALGOL 68. This restriction can be circumvented by using different comment delimiters (e.g. use hash only for temporary code deletions).
REAL half pi, one pi; one pi := 2 * ( half pi := 2 * arc tan(1) )
This notion is present in C and Perl, among others. Note that as in earlier languages such as Algol 60 and FORTRAN, spaces are allowed in identifiers, so that half pi is a single identifier (thus avoiding the underscores versus camel case versus all lower-case issues).
As another example, to express the mathematical idea of a sum of f(i) from i=1 to n, the following ALGOL 68 integer expression suffices:
(INT sum := 0; FOR i TO n DO sum +:= f(i) OD; sum)
Note that, being an integer expression, the former block of code can be used in any context where an integer value can be used. A block of code returns the value of the last expression it evaluated; this idea is present in Lisp, among other languages.
Compound statements are all terminated by distinctive closing brackets:
IF choice clauses:
IF condition THEN statements [ ELSE statements ] FI
"brief" form: ( condition | statements | statements )
IF condition1 THEN statements ELIF condition2 THEN statements [ ELSE statements ] FI
"brief" form: ( condition1 | statements |: condition2 | statements | statements )
This scheme not only avoids the dangling else problem but also avoids having to use BEGIN and END in embedded statement sequences.
CASE choice clauses:
CASE switch IN statements, statements,... [ OUT statements ] ESAC
"brief" form: ( switch | statements,statements,... | statements )
CASE switch1 IN statements, statements,... OUSE switch2 IN statements, statements,... [ OUT statements ] ESAC
"brief" form of CASE statement: ( switch1 | statements,statements,... |: switch2 | statements,statements,... | statements )
PROC days in month = (INT year, month)INT:
CASE month IN
31,
IF year MOD 4 EQ 0 AND year MOD 100 NE 0 OR year MOD 400 EQ 0 THEN 29 ELSE 28 FI,
31, 30, 31, 30, 31, 31, 30, 31, 30, 31
ESAC;
Choice clause example mixing Bold and Brief symbols:
PROC days in month = (INT year, month)INT:
CASE month IN
¢Jan¢ 31,
¢Feb¢ ( year MOD 4 = 0 AND year MOD 100 ≠ 0 OR year MOD 400 = 0 | 29 | 28 ),
¢Mar¢ 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ¢ to Dec. ¢
ESAC;
Algol68 allowed the switch to be of either type INTor (uniquely) UNION. The latter allows the enforcing strong typing onto UNION variables. c.f. union below for example.
[ FOR index ] [ FROM first ] [ BY increment ] [ TO last ] [ WHILE condition ] DO statements OD
The minimum form of a "loop clause" is thus: DO statements OD
This was considered the "universal" loop, the full syntax is:
FOR i FROM 1 BY -22 TO -333 WHILE i×i≠4444 DO ~ OD
The construct have several unusual aspects:
only the DO ~ OD portion was compulsory, in which case the loop will iterate indefinitely.
thus the clause TO 100 DO ~ OD, will iterate only 100 times.
the WHILE "syntactic element" allowed a programmer to break from a FOR loop early. e.g.
INT sum sq:=0;
FOR i
WHILE
print(("So far:",i,newline));
sum sq≠70↑2
DO
sum sq+:=i↑2
OD
Subsequent "extensions" to the standard Algol68 allowed the TO syntactic element to be replaced with UPTO and DOWNTO to achieve a small optimisation. The same compilers also incorporated:
Further examples can be found in the code examples below.
struct, union & [:]: Structures, unions and arrays
ALGOL 68 supports arrays with any number of dimensions, and it allows for the slicing of whole or partial rows or columns.
MODEVECTOR = [1:3] REAL; # vector MODE declaration (typedef) #MODEMATRIX = [1:3,1:3]REAL; # matrix MODE declaration (typedef) #VECTOR v1 := (1,2,3); # array variable initially (1,2,3) #
[]REAL v2 = (4,5,6); # constant array, type equivalent to VECTOR, bounds are implied #OP + = (VECTOR a,b) VECTOR: # binary OPerator definition #
(VECTOR out; FOR i FROM ⌊a TO ⌈a DO out[i] := a[i]+b[i] OD; out);
MATRIX m := (v1, v2, v1+v2);
print ((m[,2:])); # a slice of the 2nd and 3rd columns #
Matrices can be sliced either way, e.g.:
REFVECTOR row = m[2,]; # define a REF (pointer) to the 2nd row #REFVECTOR col = m[,2]; # define a REF (pointer) to the 2nd column #
ALGOL 68 supports multiple field structures (STRUCT) and united modes. Reference variables may point to any MODE including array slices and structure fields.
For an example of all this, here is the traditional linked list declaration:
MODENODE = UNION (VOID, REAL, INT, COMPL, STRING),
LIST = STRUCT (NODE val, REFLIST next);
NODE n := "1234";
REAL r; INT i; COMPL c; STRING s
CASE r,i,c,s::=n IN
print(("real:", r)),
print(("int:", i)),
print(("compl:", c)),
print(("string:", s))
OUT print(("?:", n))
ESAC
NODE n := "1234";
# or n := EMPTY; #
CASE n IN
(VOID): print(("void:", "EMPTY")),
(REAL r): print(("real:", r)),
(INT i): print(("int:", i)),
(COMPL c): print(("compl:", c)),
(STRING s): print(("string:", s))
OUT print(("?:", n))
ESAC
proc: Procedures
Procedure (PROC) declarations require type specifications for both the parameters and the result (VOID if none):
PROC max of real = (REAL a, b) REAL:
IF a > b THEN a ELSE b FI;
or, using the "brief" form of the conditional statement:
PROC max of real = (REAL a, b) REAL: (a>b | a | b);
The return value of a proc is the value of the last expression evaluated in the procedure. References to procedures (ref proc) are also permitted. Call-by-reference parameters are provided by specifying references (such as ref real) in the formal argument list. The following example defines a procedure that applies a function (specified as a parameter) to each element of an array:
PROC apply = (REF [] REAL a, PROC (REAL) REAL f):
FOR i FROMLWB a TOUPB a DO a[i] := f(a[i]) OD
This simplicity of code was unachievable in ALGOL 68's predecessor ALGOL 60.
op: Operators
The programmer may define new operators and both those and the pre-defined ones may be overloaded and their priorities may be changed by the coder. The following example defines operator MAX with both dyadic and monadic versions (scanning across the elements of an array).
PRIOMAX = 9;
OPMAX = (INT a,b) INT: ( a>b | a | b );
OPMAX = (REAL a,b) REAL: ( a>b | a | b );
OPMAX = (COMPL a,b) COMPL: ( ABS a > ABS b | a | b );
OPMAX = ([]REAL a) REAL:
(REAL out := a[LWB a];
FOR i FROMLWB a + 1 TOUPB a DO ( a[i]>out | out:=a[i] ) OD;
out)
Array, Procedure, Dereference and coercion operations
LWS: In Algol68r0 the operators LWS and ⎩ ... both return TRUE if the lower state of the dimension of an array is fixed.
The UPS and ⎧ operators are similar on the upper state.
The LWB and UPB operators are automatically available on UNIONs of different orders (and MODEs) of arrays. eg. UPB of union([]int, [,]real, flex[,,,]char)
:=: (alternatively IS) tests if two pointers are equal; :/=: (alternatively ISNT) tests if they are unequal.
Why :=: and :/=: are needed
Consider trying to compare two pointer values, such as the following variables, declared as pointers-to-integer:
REFINT ip, jp
Now consider how to decide whether these two are pointing to the same location, or whether one of them is pointing to NIL. The following expression
ip = jp
will dereference both pointers down to values of type INT, and compare those, since the = operator is defined for INT, but not REFINT. It is not legal to define = for operands of type REFINT and INT at the same time, because then calls become ambiguous, due to the implicit coercions that can be applied: should the operands be left as REFINT and that version of the operator called? Or should they be dereferenced further to INT and that version used instead? Therefore the following expression can never be made legal:
ip = NIL
Hence the need for separate constructs not subject to the normal coercion rules for operands to operators. But there is a gotcha. The following expressions:
ip :=: jp
ip :=: NIL
while legal, will probably not do what might be expected. They will always return FALSE, because they are comparing the actual addresses of the variables ip and jp, rather than what they point to. To achieve the right effect, one would have to write
ip :=: REFINT(jp)
ip :=: REFINT(NIL)
Special characters
Most of Algol's "special" characters (⊂, ≡, ␣, ×, ÷, ≤, ≥, ≠, ¬, ⊃, ≡, ∨, ∧, →, ↓, ↑, ⌊, ⌈, ⎩, ⎧, ⊥, ⏨, ¢, ○ and □) can be found on the IBM 2741 keyboard with the APL "golf-ball" print head inserted; these became available in the mid-1960s while ALGOL 68 was being drafted. These characters are also part of the Unicode standard and most of them are available in several popular fonts.
transput: Input and output
Transput is the term used to refer to ALGOL 68's input and output facilities. It includes pre-defined procedures for unformatted, formatted and binary transput. Files and other transput devices are handled in a consistent and machine-independent manner. The following example prints out some unformatted output to the standard output device:
print ((newpage, "Title", newline, "Value of i is ",
i, "and x[i] is ", x[i], newline))
Note the predefined procedures newpage and newline passed as arguments.
Books, channels and files
The TRANSPUT is considered to be of BOOKS, CHANNELS and FILES:
Books are made up of pages, lines and characters, and may be backed up by files.
A specific book can be located by name with a call to match.
CHANNELs correspond to physical devices. e.g. card punches and printers.
Three standard channels are distinguished: stand in channel, stand out channel, stand back channel.
A FILE is a means of communicating between a program and a book that has been opened via some channel.
The MOOD of a file may be read, write, char, bin, and opened.
position enquires: char number, line number, page number.
layout routines include:
space, backspace, newline, newpage.
get good line, get good page, get good book, and PROC set=(REFFILE f, INT page,line,char)VOID:
A file has event routines. e.g. on logical file end, on physical file end, on page end, on line end, on format end, on value error, on char error.
formatted transput
"Formatted transput" in ALGOL 68's transput has its own syntax and patterns (functions), with FORMATs embedded between two $ characters.[51]
Examples:
printf (($2l"The sum is:"x, g(0)$, m + n)); ¢ prints the same as: ¢
print ((new line, new line, "The sum is:", space, whole (m + n, 0))
par: Parallel processing
ALGOL 68 supports programming of parallel processing. Using the keyword PAR, a collateral clause is converted to a parallel clause, where the synchronisation of actions is controlled using semaphores. In A68G the parallel actions are mapped to threads when available on the hosting operating system. In A68S a different paradigm of parallel processing was implemented (see below).
PROC
eat = VOID: ( muffins-:=1; print(("Yum!",new line))),
speak = VOID: ( words-:=1; print(("Yak...",new line)));
INT muffins := 4, words := 8;
SEMA mouth = LEVEL 1;
PARBEGINWHILE muffins > 0 DODOWN mouth;
eat;
UP mouth
OD,
WHILE words > 0 DODOWN mouth;
speak;
UP mouth
ODEND
Miscellaneous
For its technical intricacies, ALGOL 68 needs a cornucopia of methods to deny the existence of something:
SKIP, "~" or "?"C – an undefined value always syntactically valid,
EMPTY – the only value admissible to VOID, needed for selecting VOID in a UNION,
VOID – syntactically like a MODE, but not one,
NIL or "○" – a name not denoting anything, of an unspecified reference mode,
() or specifically [1:0]INT – a vacuum is an empty array (here specifically of MODE []INT).
undefined – a standards reports procedure raising an exception in the runtime system.
ℵ – Used in the standards report to inhibit introspection of certain types. e.g. SEMA
The term NILISvar always evaluates to TRUE for any variable (but see above for correct use of IS :/=:), whereas it is not known to which value a comparison x < SKIP evaluates for any integer x.
ALGOL 68 leaves intentionally undefined what happens in case of integer overflow, the integer bit representation, and the degree of numerical accuracy for floating point.
Both official reports included some advanced features that were not part of the standard language. These were indicated with an ℵ and considered effectively private. Examples include "≮" and "≯" for templates, the OUTTYPE/INTYPE for crude duck typing, and the STRAIGHTOUT and STRAIGHTIN operators for "straightening" nested arrays and structures
Examples of use
Code sample
This sample program implements the Sieve of Eratosthenes to find all the prime numbers that are less than 100. NIL is the ALGOL 68 analogue of the null pointer in other languages. The notation xOFy accesses a member x of a STRUCTy.
BEGIN # Algol-68 prime number sieve, functional style #
PROC error = (STRING s) VOID:
(print(( newline, " error: ", s, newline)); GOTO stop);
PROC one to = (INT n) LIST:
(PROC f = (INT m,n) LIST: (m>n | NIL | cons(m, f(m+1,n))); f(1,n));
MODELIST = REFNODE;
MODENODE = STRUCT (INT h, LIST t);
PROC cons = (INT n, LIST l) LIST: HEAPNODE := (n,l);
PROC hd = (LIST l) INT: ( l ISNIL | error("hd NIL"); SKIP | h OF l );
PROC tl = (LIST l) LIST: ( l ISNIL | error("tl NIL"); SKIP | t OF l );
PROC show = (LIST l) VOID: ( l ISNTNIL | print((" ",whole(hd(l),0))); show(tl(l)));
PROC filter = (PROC (INT) BOOL p, LIST l) LIST:
IF l ISNILTHENNILELIF p(hd(l)) THEN cons(hd(l), filter(p,tl(l)))
ELSE filter(p, tl(l))
FI;
PROC sieve = (LIST l) LIST:
IF l ISNILTHENNILELSEPROC not multiple = (INT n) BOOL: n MOD hd(l) ~= 0;
cons(hd(l), sieve( filter( not multiple, tl(l) )))
FI;
PROC primes = (INT n) LIST: sieve( tl( one to(n) ));
show( primes(100) )
END
Operating systems written in ALGOL 68
Cambridge CAP computer – All procedures constituting the operating system were written in ALGOL 68C, although several other closely associated protected procedures, such as a paginator, are written in BCPL.[52]
Flex machine – The hardware was custom and microprogrammable, with an operating system, (modular) compiler, editor, garbage collector and filing system all written in ALGOL 68RS. The command shell Curt[54] was designed to access typed data similar to Algol-68 modes.
VME – S3 was the implementation language of the operating system VME. S3 was based on ALGOL 68 but with data types and operators aligned to those offered by the ICL 2900 Series.
Note: The Soviet Era computers Эльбрус-1 (Elbrus-1) and Эльбрус-2 were created using high-level language Эль-76 (AL-76), rather than the traditional assembly. Эль-76 resembles Algol-68, The main difference is the dynamic binding types in Эль-76 supported at the hardware level. Эль-76 is used for application, job control, system programming.[55]
Applications
Both ALGOL 68C and ALGOL 68-R are written in ALGOL 68, effectively making ALGOL 68 an application of itself. Other applications include:
TORRIX – a programming system for operations on vectors and matrices over arbitrary fields and of variable size by S. G. van der Meulen and M. Veldhorst.[57]
Program representation
A feature of ALGOL 68, inherited from the ALGOL tradition, is its different representations. There is a representation language used to describe algorithms in printed work, a strict language (rigorously defined in the Report), and an official reference language intended to be used in compiler input. The examples contain BOLD typeface words, this is the STRICT language. ALGOL 68's reserved words are effectively in a different namespace from identifiers, and spaces are allowed in identifiers, so this next fragment is legal:
INT a real int = 3 ;
The programmer who writes executable code does not always have an option of BOLD typeface or underlining in the code as this may depend on hardware and cultural issues. Different methods to denote these identifiers have been devised. This is called a stropping regime. For example, all or some of the following may be available programming representations:
INT a real int = 3; # the STRICT language #
'INT'A REAL INT = 3; # QUOTE stropping style #
.INT A REAL INT = 3; # POINT stropping style #
INT a real int = 3; # UPPER stropping style #
int a_real_int = 3; # RES stropping style, there are 61 accepted reserved words #
All implementations must recognize at least POINT, UPPER and RES inside PRAGMAT sections. Of these, POINT and UPPER stropping are quite common, while RES stropping is a contradiction to the specification (as there are no reserved words). QUOTE (single apostrophe quoting) was the original recommendation, while matched apostrophe quoting, common in ALGOL 60, is not used much in ALGOL 68.[58]
This reflected a problem in the 1960s where some hardware didn't support lower-case, nor some other non-ASCII characters, indeed in the 1973 report it was written: "Four worthy characters — "|", "_", "[", and "]" — are often coded differently, even at installations which nominally use the same character set."
Base characters: "Worthy characters" are a subset of "base characters".
Example of different program representations
Representation
Code
Algol68 "strict" as typically published
¢ underline or bold typeface ¢MODEXINT = INT;
XINT sum sq:=0;
FOR i WHILE
sum sq≠70×70
DO
sum sq+:=i↑2
OD
.PRPOINT.PR
.MODE.XINT=.INT;
.XINTSUMSQ:=0;
.FORI.WHILE
SUM SQ .NE 70*70
.DO
SUM SQ .PLUSAB I .UP 2
.OD
Algol68 using RES stropping (reserved word)
.PRRES.PR
mode .xint = int;
.xintsumsq:=0;
for i while
sum sq≠70×70
do
sum sq+:=i↑2
od
ALGOL 68 allows for every natural language to define its own set of keywords Algol-68. As a result, programmers are able to write programs using keywords from their native language. Below is an example of a simple procedure that calculates "the day following", the code is in two languages: English and German.[citation needed]
# Next day date - English variant #
MODEDATE = STRUCT(INT day, STRING month, INT year);
PROC the day following = (DATE x) DATE:
IF day OF x < length of month (month OF x, year OF x)
THEN (day OF x + 1, month OF x, year OF x)
ELIF month OF x = "December"
THEN (1, "January", year OF x + 1)
ELSE (1, successor of month (month OF x), year OF x)
FI;
# Nachfolgetag - Deutsche Variante #
MENGEDATUM = TUPEL(GANZ tag, WORT monat, GANZ jahr);
FUNKTION naechster tag nach = (DATUM x) DATUM:
WENN tag VON x < monatslaenge(monat VON x, jahr VON x)
DANN (tag VON x + 1, monat VON x, jahr VON x)
WENNABER monat VON x = "Dezember"
DANN (1, "Januar", jahr VON x + 1)
ANSONSTEN (1, nachfolgemonat(monat VON x), jahr VON x)
ENDEWENN;
Russian/Soviet example:
In English Algol68's case statement reads CASE ~ IN ~ OUT ~ ESAC, in Cyrillic this reads выб ~ в ~ либо ~ быв.
Revisions
Except where noted (with a superscript), the language described above is that of the "Revised Report(r1)".
The language of the unrevised report
The original language (As per the "Final Report"r0) differs in syntax of the mode cast, and it had the feature of proceduring, i.e. coercing the value of a term into a procedure which evaluates the term. Proceduring would be intended to make evaluations lazy. The most useful application could have been the short-circuited evaluation of Boolean operators. In:
As defined in ALGOL 68, it did not work as expected, for example in the code:
IFFALSEANDFCO proc bool: CO ( print ("Should not be executed"); TRUE)
THEN ...
against the programmers naïve expectations the print would be executed as it is only the value of the elaborated enclosed-clause after ANDF that was procedured. Textual insertion of the commented-out PROCBOOL: makes it work.
Some implementations emulate the expected behaviour for this special case by extension of the language.
Before revision, the programmer could decide to have the arguments of a procedure evaluated serially instead of collaterally by using semicolons instead of commas (gommas).
For example in:
PROC test = (REAL a; REAL b) :...
...
test (x PLUS 1, x);
The first argument to test is guaranteed to be evaluated before the second, but in the usual:
PROC test = (REAL a, b) :...
...
test (x PLUS 1, x);
then the compiler could evaluate the arguments in whatever order it felt like.
Extension proposals from IFIP WG 2.1
After the revision of the report, some extensions to the language have been proposed to widen the applicability:
partial parametrisation (aka Currying): creation of functions (with fewer parameters) by specification of some, but not all parameters for a call, e.g. a function logarithm of two parameters, base and argument, could be specialised to natural, binary or decadic log,[59]
module extension: for support of external linkage, two mechanisms were proposed, bottom-up definition modules, a more powerful version of the facilities from ALGOL 68-R and top-down holes, similar to the ENVIRON and USING clauses from ALGOL 68C[60]
mode parameters: for implementation of limited parametrical polymorphism (most operations on data structures like lists, trees or other data containers can be specified without touching the pay load).[61]
So far, only partial parametrisation has been implemented, in Algol 68 Genie.
True ALGOL 68s specification and implementation timeline
The S3 language that was used to write the ICL VME operating system and much other system software on the ICL 2900 Series was a direct derivative of Algol 68. However, it omitted many of the more complex features, and replaced the basic modes with a set of data types that mapped directly to the 2900 Series hardware architecture.
Implementation specific extensions
ALGOL 68R from RRE was the first ALGOL 68 subset implementation, running on the ICL 1900. Based on the original language, the main subset restrictions were definition before use and no parallel processing. This compiler was popular in UK universities in the 1970s, where many computer science students learnt ALGOL 68 as their first programming language; the compiler was renowned for good error messages.
ALGOL 68RS(RS) from RSRE was a portable compiler system written in ALGOL 68RS (bootstrapped from ALGOL 68R), and implemented on a variety of systems including the ICL 2900/Series 39, Multics and DEC VAX/VMS. The language was based on the Revised Report, but with similar subset restrictions to ALGOL 68R. This compiler survives in the form of an Algol68-to-C compiler.
In ALGOL 68S(S) from Carnegie Mellon University the power of parallel processing was improved by adding an orthogonal extension, eventing. Any variable declaration containing keyword EVENT made assignments to this variable eligible for parallel evaluation, i.e. the right hand side was made into a procedure which was moved to one of the processors of the C.mmp multiprocessor system. Accesses to such variables were delayed after termination of the assignment.
CambridgeALGOL 68C(C) was a portable compiler that implemented a subset of ALGOL 68, restricting operator definitions and omitting garbage collection, flexible rows and formatted transput.
Algol 68 Genie(G) by M. van der Veer is an ALGOL 68 implementation for today's computers and operating systems.
"Despite good intentions, a programmer may violate portability by inadvertently employing a local extension. To guard against this, each implementation should provide a PORTCHECK pragmat option. While this option is in force, the compiler prints a message for each construct that it recognizes as violating some portability constraint."[68]
Quotes
... The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of. The central notion I captured from Algol was a type structure based on atomic types (including structures), composed into arrays, pointers (references), and functions (procedures). Algol 68's concept of unions and casts also had an influence that appeared later.Dennis Ritchie Apr 1993.[2]
... C does not descend from Algol 68 is true, yet there was influence, much of it so subtle that it is hard to recover even when I think hard. In particular, the union type (a late addition to C) does owe to A68, not in any details, but in the idea of having such a type at all. More deeply, the type structure in general and even, in some strange way, the declaration syntax (the type-constructor part) was inspired by A68. And yes, of course, "long".Dennis Ritchie, 18 June 1988[4]
The more I see of it, the more unhappy I become – E. W. Dijkstra, 1968[70]
[...] it was said that A68's popularity was inversely proportional to [...] the distance from Amsterdam – Guido van Rossum[71]
[...] The best we could do was to send with it a minority report, stating our considered view that, "... as a tool for the reliable creation of sophisticated programs, the language was a failure." [...] – C. A. R. Hoare in his Oct 1980 Turing Award Lecture[72]
"[...] More than ever it will be required from an adequate programming tool that it assists, by structure, the programmer in the most difficult aspects of his job, viz. in the reliable creation of sophisticated programs. In this respect we fail to see how the language proposed here is a significant step forward: on the contrary, we feel that its implicit view of the programmer's task is very much the same as, say, ten years ago. This forces upon us the conclusion that, regarded as a programming tool, the language must be regarded as obsolete. [...]" 1968 Working Group minority report on 23 December 1968.[73]
^Influence on C: union, structure, syntax and long precision – Dennis Ritchie[4]
^"A History of C++: 1979−1991"(PDF). March 1993. Page 12, 2nd paragraph: Algol68 [gave] operator overloading(§3.3.3), references (§3.3.4), and the ability to declare variables anywhere in a block (§3.3.1). Retrieved 2008-05-06.
^Terekhov, Andrey (2014). "ALGOL 68 and Its Impact on the USSR and Russian Programming". 2014 Third International Conference on Computer Technology in Russia and in the Former Soviet Union. pp. 97–106. doi:10.1109/SoRuCom.2014.29. ISBN978-1-4799-1799-0. S2CID16097093.
^Sidney Marshall, "ALGOL 68 Implementation", Proceedings of the IFIP Working Conference on ALGOL 68 Implementation, Munich, July 20–24, 1970, J. E. L. Peck, editor, North Holland, pages 239–243.
^Sidney Marshall, On the implementation of ALGOL 68, PhD Thesis, Dartmouth College, 1972.
Mesin BMW N55PembuatBMWProduksi2009–sekarangPendahuluBMW N54Konfigurasi6 segaris 3.0 L (2979 cc/181 in³) BMW N55 adalah mesin piston 6 segaris injeksi turbocharger DOHC yang telah diproduksi sejak tahun 2009 dan digunakan pada BMW 535i Gran Turismo (F07).[1] N55 secara umum menggantikan N54, tetapi masih ada beberapa versi N54 yang masih diproduksi.[2][3] Dengan keluaran tenaga dan volume silinder yang sama dengan N54, N55 lebih irit 15%, emisi lebih ...
« Einstein » redirige ici. Pour les autres significations, voir Einstein (homonymie). Albert Einstein Albert Einstein en 1947. Données clés Naissance 14 mars 1879Ulm (Empire allemand) Décès 18 avril 1955 (à 76 ans)Princeton (États-Unis) Nationalité Allemand (1879-1896 et 1919-1933) Apatride (1896-1901) Suisse (1901-1955) Autrichien (1911-1912) Américain (1940-1955)Einstein a été apatride et a eu plusieurs fois une double nationalité Conjoint Mileva MarićElsa Eins...
العلاقات السنغالية الليبية السنغال ليبيا السنغال ليبيا تعديل مصدري - تعديل العلاقات السنغالية الليبية هي العلاقات الثنائية التي تجمع بين السنغال وليبيا.[1][2][3][4][5] مقارنة بين البلدين هذه مقارنة عامة ومرجعية للدولتين: وجه المقارنة الس�...
Italian prima ballerina Alessandra FerriOMRIAlessandra Ferri and Mikhail Baryshnikov in 1986Born (1963-05-06) 6 May 1963 (age 60)Milan, ItalyYears active1980–2007, 2013-CareerFormer groupsRoyal BalletAmerican Ballet TheatreLa Scala Theatre Ballet Alessandra Ferri OMRI (born 6 May 1963) is an Italian prima ballerina. She danced with the Royal Ballet (1980–1984), American Ballet Theatre (1985–2007) and La Scala Theatre Ballet (1992–2007) and as an international guest arti...
Краковский рынок со стороны улицы Клепаровской Кра́ковский ры́нок (укр. Краківський ринок) — один из крупнейших продуктово-вещевых рынков во Львове (Украина). Находится вблизи центральной части города, на территории бывшего Краковского предместья. Адрес: улица Базар�...
Hotel at Walt Disney World 28°24′54″N 81°34′26″W / 28.415°N 81.574°W / 28.415; -81.574 Disney's Contemporary ResortThe monorail runs through the interior of the resortLocationMagic Kingdom Resort AreaResort typeDeluxeOpenedOctober 1, 1971 (1971-10-01)ThemeModern, contemporary, Tomorrowland, The IncrediblesAreasMain TowerSouth Garden WingBay Lake Tower (Disney Vacation Club)Rooms655Villas428 (Bay Lake Tower)Green lodgeYes Disney's Contemporary...
This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Veľká Lodina – news · newspapers · books · scholar · JSTOR (July 2019) (Learn how and when to remove this template message)Košice-okolie District in the Kosice Region Veľká Lodina (Hungarian: Nagyladna) is a village and municipality in Košice-okolie District in the Kosice ...
Felix Film CoNama asli株式会社FelixFilmNama latinKabushiki-gaisha Ferikkusu FirumuJenisKabushiki gaishaIndustriAnimasi JepangDidirikan14 Mei 2014; 9 tahun lalu (2014-05-14)Kantorpusat6-13-33 Shimorenjaku, Mitaka, Tokyo, JepangTokohkunciTomohito Naka (CEO)Garyuu Tanaka (anggota dewan)Total ekuitas¥ 5,000,000Karyawan30Situs webfelixfilm.co.jpCatatan kaki / referensi[1] Felix Film Corporation (Jepang: 株式会社FelixFilmcode: ja is deprecated , Hepburn: Kabushiki-gaisha ...
Державний комітет телебачення і радіомовлення України (Держкомтелерадіо) Приміщення комітетуЗагальна інформаціяКраїна УкраїнаДата створення 2003Керівне відомство Кабінет Міністрів УкраїниРічний бюджет 1 964 898 500 ₴[1]Голова Олег НаливайкоПідвідомчі ор...
Municipal political party in Vancouver, British Columbia, Canada Non-Partisan Association Active municipal partyAbbreviationNPAPresidentDavid MawhinneyFoundedNovember 13, 1937 (1937-11-13)IdeologyConservatismFiscal conservatismPolitical positionCentre-right to right-wingColoursPurpleCity council0 / 11Park board0 / 7School board0 / 9Websitenpavancouver.caPolitics of VancouverPolitical parties The Non-Partisan Association (NPA) is a municipal political party in Vancouver, Br...
Active volcano in Arusha Region, Tanzania Ol Doinyo Lengai (Oldoinyo Lengai)Highest pointElevation2,962 m (9,718 ft)[1]Prominence1,360 m (4,460 ft) Isolation16.68 km (10.36 mi) Coordinates2°45′50″S 35°54′50″E / 2.764°S 35.914°E / -2.764; 35.914[1]GeographyOl Doinyo Lengai (Oldoinyo Lengai)Tanzania Parent rangeEast African RiftGeologyMountain typeStratovolcanoLast eruption2023 AD Ol Doinyo Lengai i...
Electronically distributed racial harassment or racist information Racism on the Internet sometimes also referred to as cyber-racism and more broadly considered as an online hate crime or an internet hate crime consists of racist rhetoric or bullying that is distributed through computer-mediated means and includes some or all of the following characteristics: ideas of racial uniqueness, racist attitudes towards specific social categories, racist stereotypes, hate-speech, nationalism and commo...
Distance between wingtips For other uses, see Wingspan (disambiguation). The distance A to B is the wingspan of this Boeing 777-200ER The wingspan (or just span) of a bird or an airplane is the distance from one wingtip to the opposite wingtip. For example, the Boeing 777–200 has a wingspan of 60.93 metres (199 ft 11 in),[1] and a wandering albatross (Diomedea exulans) caught in 1965 had a wingspan of 3.63 metres (11 ft 11 in), the official record for a living bi...
International athletics championship event2017 IAAF Diamond LeagueEdition8thDates5 May – 1 SeptemberEvents32Meetings14Individual Prize Money (US$)US$ 8 million← 2016 2018 → The 2017 IAAF Diamond League was the eighth season of the annual series of outdoor track and field meetings, organised by the International Association of Athletics Federations (IAAF). It is the first to feature the new championship-style system in which overall event winners are determined only by the result...
Museo della Basilica di Sant'Eustorgio UbicazioneStato Italia LocalitàMilano IndirizzoPiazza Sant'Eustorgio, 3 - Milano, Piazza Sant'Eustorgio 3, 20123 Milano e Piazza Sant'Eustorgio 3, 20122 Milano Coordinate45°27′13.31″N 9°10′51.75″E45°27′13.31″N, 9°10′51.75″E CaratteristicheVisitatori13 725 (2022) Sito web Modifica dati su Wikidata · Manuale Il Museo della Basilica di Sant'Eustorgio è un museo italiano situato a Milano, collocato all'interno del chiost...
2008 2015 Élections cantonales de 2011 dans l'Ain 22 des 43 cantons de l'Ain 20 et 27 mars 2011 Type d’élection Élections cantonales Majorité départementale – Rachel Mazuir Liste PSPRGDVG Sièges obtenus 27 3 Opposition départementale Liste UMPDLRDVD Sièges obtenus 16 3 Président du Conseil général Sortant Élu Rachel Mazuir PS Rachel Mazuir PS modifier - modifier le code - voir Wikidata Jaune : Cantons renouvelables en 2011 Blanc ...
French politician (1812–1896) Emmanuel Arago (6 August 1812, Paris – 26 November 1896, Paris) was a French politician of the French Second Republic, Second French Empire and French Third Republic. He was the son of François Arago. He was a member of the 1848 Constituent Assembly and the National Assembly of 1871. He was a deputy for Pyrénées-Orientales (1848–1851, 1871–1876) and la Seine (1869–1870) and senator for Pyrénées-Orientales (1876–1896). He served as minister of the...
Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada Desember 2022. Michael TongeInformasi pribadiNama lengkap Michael William Eric Tonge[1]Tanggal lahir 7 April 1983 (umur 41)[3]Tempat lahir Manchester, InggrisTinggi 1,83 m (6 ft 0 in) [2]Posisi bermain GelandangInformasi k...
Sejad SalihovićSalihović ai tempi dell'Hoffenheim nel 2008Nazionalità Bosnia ed Erzegovina Altezza182 cm Peso79 kg Calcio RuoloCentrocampista Squadra Hoffenheim II CarrieraGiovanili 1995-1998Minerva Berlino1998-2000 Hertha Zehlendorf2000-2003 Hertha Berlino Squadre di club1 2003-2006 Hertha Berlino II88 (35)2004-2006 Hertha Berlino5 (0)2006-2015 Hoffenheim228 (62)[1]2015-2016 Guizhou Renhe28 (5)2017 San Gallo13 (0)2017-2018 Amburgo1...