**ALGOL** (ringkasan bagi **ALGO**rithmic **L**anguage) merupakan keluarga bahasa pengaturcaraan pengaturcaraan imperative yang pada asalnya dibangunkan pada pertengahan 1950-an yang banyak mempengaruhi bahasa pengaturcaraan lain, dan menjadi *de facto* way algorithm yang digambarkan dalam buku teks dan hasil kerja akademik bagi 30 tahun berikutnya. Ia direka bagi mengelakkan apa yang dianggap masalah bagi FORTRAN  dan akhirnya menghasilkan banyak bahasa bahasa pengaturcaraan lain (termasuk Pascal). ALGOL menggunakan blok ayat berkurungan dan merupakan bahasa pengaturcaraan pertama yang menggunakan pasangan **begin** **end** bagi menandakannya. Serpihan sintek seperti-ALGOL kadang kala masih digunakan sebagai notasi bagi algorithm, dikenali sebagai *Pidgin Algol*.

Terdapat tiga cabang rasmi keluarga ALGOL:

* ALGOL 58 - pada asalnya dikenali sebagai **IAL** (mewakili **I**nternational **A**lgorithmic **L**anguage.)
* **ALGOL 60** - dikaji semula pada 1963
* ALGOL 68 - dikaji semula pada 1973

Niklaus Wirth mengasaskan Algol-Wnya sendiri pada ALGOL 60, sebelum berpindah dan memajukan Pascal. Algol-W bertujuan sebagai generasi ALGOL berikutnya, tetapi komitee ALGOL 68 memutuskan bagi reka bentuk yang l;ebih rumit dan maju berbanding ALGOL 60 yang lebih ringkas dan bersih. Versi ALGOL rasmi dinamakan bertahun selepas ia mula diterbitkan.

Sejarah
-------

ALGOL dibangunkan secara bersama oleh komitee pakar sains komputer Eropah dan Amerika dalam perjumpaan pada tahun 1958 di ETH Zurich, yang menghasilkan *Preliminary Report on the International Algorithmic Language*. Lapuran ini menjalani beberapa perubahan sebelum menjadi (‘’Revised Report’’) dari mana kebanyakan perlaksanaan ALGOL diasaskan. Hasilnya, ALGO dan "ALGOL" awal yang lain mempunyai sintak yang amat berlainan dengan ALGOL 60.
Antar alain, ia menetapkan tiga sintak berlainan: sintek rujukan, sintek penerbitan, dan sintek perlaksanaan. Sintek berlainan dibenarkan bagi menggunakan nama kata kunci berlainan dan biasa bagi titik perpuluhan (koma vs. titik) bagi bahasa berlainan.

Beberapa bahasa yang dimajukan dari lapuran Zürich termasuk BALGOL, MAD (Michigan Algorithm Decoder) dan NELIAC.

### Spesifikasi ALGOL 60-an sebenar dan garis masa perlaksanaan

Terdapat sekitar 70 diperkukuh, sambungan, hasilan dan sub-bahasa Algol 60 

| Name | Year | Author | State | Description | Target CPU | Licencing |
| --- | --- | --- | --- | --- | --- | --- |
| Elliott ALGOL | 1960 | C. A. R. Hoare | UK | Tajuk bagi ceramah Turing yang masyhur | National-Elliott 803 & the Elliott 503 |  |
| Case ALGOL | 1961 |  | US | Simula pada asalnya dikontrak sebagai tambahan kepada Case ALGOL | UNIVAC 1107 |  |
| EMIDEC Algol | 1961 |  | US |  | EMIDEC |  |
| GOGOL | 1961 | Bill McKeeman | US | Bagi sistem perkongsian ODIN | PDP-1 |  |
| X1 Algol 60 | 1961 | Edsger Dijkstra dan J.A. Zonneveld | Netherlands | Pusat Mathematik, Amsterdam | X1 |  |
| Dartmouth ALGOL 30 | 1962 | Thomas Eugene Kurtz dll dsb | US |  | LGP-30 |  |
| USS 90 Algol | 1962 | L. Petrone | Itali |  |  |  |
| Algol Translator | 1962 | G. van der May and W.L. van der Poel | Belanda | Staatsbedrijf der Posterijen, Telegrafie en Telefonie | ZEBRA |  |
| Kidsgrove Algol | 1963 | F. G. Duncan | UK |  | English Electric KDF9 |  |
| VALGOL | 1963 | Val Schorre | US | Ujian bagi pengkompil komputer META II |  |  |
| Whetstone | 1964 | Brian Randell dan L J Russell | UK | Atomic Power Division of English Electric. Precursor to Ferranti Pegasus (computer), National Physical Laboratories ACE (computer) dan perlaksanaan English Electric DEUCE. | English Electric KDF9 |  |
| NU ALGOL | 1965 |  | Norway |  | UNIVAC |  |
| ALGEK | 1965 |  | USSR | Minsk-22 | АЛГЭК, diasaskan pada ALGOL-60 dan sokongan COBOL, bagi tugasan ekonomik |  |
| MALGOL | 1966 | publ. A. Viil, M Kotli & M. Rakhendi, | Estonian SSR | Minsk-22 |  |  |
| ALGAMS | 1967 | GAMS group (ГАМС, группа автоматизации программирования для машин среднего класса), cooperation of Comecon Academies of Science | Comecon | Minsk-22, later ES EVM, BESM |  |  |
| ALGOL/ZAM | 1967 |  | Poland |  | komputer ZAM Polish |  |
| RegneCentralen ALGOL | 1967 | Peter Naur | Denmark |  |  |  |
| Simula 67 | 1967 | Ole-Johan Dahl dan Kristen Nygaard | Norway | Algol 60 dengan kelas | UNIVAC 1107 |  |
| DG/L | 1973 |  | US |  | keluarga komputer DG Eclipse |  |
| Chinese Algol | 1974 |  | China | tulisan Cina, digambarkan melalui sistem Symbol |  ? |  |

Contoh kod (ALGOL 60)
---------------------

(Cara teks tebal ditulis bergantung kepada perlaksanaan, contoh: 'INTEGER' yang disertakan tanda pembuka kata bagi mewakili **integer**.)

```
**procedure** Absmax(a) Size:(n, m) Result:(y) Subscripts:(i, k);
    **value** n, m; **array** a; **integer** n, m, i, k; **real** y;
**comment** The absolute greatest element of the matrix a, of size n by m 
is transferred to y, and the subscripts of this element to i and k;
**begin** **integer** p, q;
    y := 0; i := k := 1;
    **for** p:=1 **step** 1 **until** n **do**
    **for** q:=1 **step** 1 **until** m **do**
        **if** abs(a[p, q]) > y **then**
            **begin** y := abs(a[p, q]);
            i := p; k := q
            **end**
**end** Absmax
```

Ini adalah contoh bagi menghasilkan jadual dengan menggunakan Elliott 803 ALGOL.
.

```
 FLOATING POINT ALGOL TEST'
 BEGIN REAL A,B,C,D'

 READ D'

 FOR A:= 0.0 STEP D UNTIL 6.3 DO
 BEGIN
   PRINT PUNCH(3),££L??'
   B := SIN(A)'
   C := COS(A)'
   PRINT PUNCH(3),SAMELINE,ALIGNED(1,6),A,B,C'
 END'
 END'
```

PUNCH(3) output kepada pencetak dan bukannya penebuk tape.  

SAMELINE menghalang *carriage return + line feed* yangbiasanya dicetak antara pernyataan.  

ALIGNED(1,6) mengawal format output dangan 1 digit sebelum dan 6 selepas titik perpuluhan.

Timeline: Hello dunia
---------------------

Variasi dan ketiadaan pemindahan bagi aturcara dari satu perlaksanaan dengan yang lain dapat ditonjulkan dengan mudah melalui aturcara hello dunia.

### ALGOL 58 (IAL)

Rencana utama: ALGOL 58
ALGOL 58 tidak mempunyai kemudahan I/O.

### keluarga ALGOL 60

Oleh kerana ALGOL 60 tidak mempunyai kemudahan I/O, tidak "Hello world" program terdapat boleh pindah dalam ALGOL. Aturcara berikut boleh (dan masih akan) kompil dan dilaksanakan pada perlaksanaan ALGOL bagi komputer kerangka Unisys A-Series, dan merupakan kod ringkas diambil dari this site Diarkibkan 2010-02-04 di Wayback Machine.

```
BEGIN
  FILE F(KIND=REMOTE);
  EBCDIC ARRAY E[0:11];
  REPLACE E BY "HELLO DUNIA!";
  WRITE(F, *, E);
END.
```

Contoh lain, menggunakan Elliott Algol I/O seperti berikut. Elliott Algol menggunakan huruf berlainan bagi ‘pembuka-kata’ dan ‘penutup kata’, diwakili di sini oleh ‘ dan ’.

```
 **program** HiFolks;
 **begin**
    **print** ‘Hello dunia’;
 **end**;
```

Ini adalah versi Elliott 803 Algol (A104). Elliott 803 piwaian menggunakan tape kertas 5 lubang dan dengan itu hanya memiliki huruf besar. Kod kekurangan sebarang huruf pembuka kata oleh itu £ (Tanda Paun UK) digunakan bagi pembuka kata dan ? (Tanda Soal) bagi penutup kata. Aturan khas diletakkan dalam dua pembuka kata(e.g. ££L?? menghasilkan baris baru pada pencetak).

```
  HIFOLKS’  
  BEGIN
     PRINT £HELLO DUNIA££L??’
  END’
```

Versi ICL 1900 Algol I/O membenarkan input dari tape kertas atau kad tebuk. Tape kertas mod 'penuh' membenarkan huruf kecil. Output kepada pencetak baris.

```
  'BEGIN'
     'WRITE TEXT'("HELLO DUNIA");
  'END'
```

### ALGOL 68

Dalam bahasa "Algol 68 Report", kemudahan Input/output secara keseluruhan dikenali sebagai "Transput".

Kod **ALGOL 68** merupakan kata simpanan diterbitkan biasanya huruf kecil, tetapi tebal atau digaris bawah.

```
begin
  print(("Hello, dunia!",newline))
end
```

OR menggunakan salur transput khas:

```
begin
  putf((stand out,$gl$,"Hello, world!"))
end
```

Bagi memudahkan pengaturcaraan pada komputer 7-bit masa ituterdapat kaedah "rasmi" bagi **TEBALKAN** kata simpanan, secagai contoh, dengan menggunakan huruf besar:

```
BEGIN
  print(("Hello, dunia!",newline))
END
```

Pengaturcara kadang-kala terpaksa memikit "BERFIKIR HURUF BESAR" pada komputer yang hanya memiliki 6-bit huruf, contoh The CDC 6600: mentakrifkan komputer utama". Dalam kes ini kod di atas akan ditulis sebagai:

```
'BEGIN'
  PRINT(("HELLO, DUNIA!",NEWLINE))
'END'
```

"Laporan Algol 68" diterjemah kepada Russian, Jerman, Perancis dan Bulgarian, dan membenarkan pengaturcara dalam bahasa dengan set huruf lebih besar , contoh huruf Cyrillic. contoh BESM-4 Russian.

```
BEGIN
  print(("Здравствуй, мир!",newline))
END
```

Nota: Piwaian 1964 Russia GOST 10859 membenarkan pengkod 4-bit, 5-bit, 6-bit dan 7-bit huruf dalam ALGOL
.

Contoh
------

Ini adalah algorithm Trabb Pardo-Knuth dalam ALGO:

```
1. TITLE TRABB PARDO-KNUTH ALGORITHM
2. SUBSCript I,J
3. DATA A(11)
4. FORMAt FI(2DT), FLARGE(3D)
5. PROCEdure F(T=Z)
6. BEGIN
7. Z=SQRT(ABS(T))+5*T^3
8. END
9. FOR I=0(1)10
10. A[I]=KEYBD
11. FOR J=0(1)10 BEGIN
11. I=J-10
12. F(A[I]=Y)
13. PRINT(FI)=I
14. IF Y > 400
15. GO TO LARGE
16. PRINT(FL)=Y
17. GO TO NEXT
18. LARGE: PRINT(FLARGE)=999
19. NEXT: CARR(1) END
20. END

```

### Nota

* 1. Judul merupakan satu-satunya komen yang dibenarkan. Nombor baris dimasukkan oleh penyunting.
* 2. Jenis data intiger. Huruf kecil bukan kesilapan ejaan, tetapi menunjukkan cara kod ALGO dipaparkan dalam dokumentasi asal.
* 3. Hanya saiz jujukan boleh ditetapkan, had bawah sentiasa sifar.
* 4. Format pertama memerlukan nombor dua digit diikuti oleh tab, yang kedua bagi nombor tiga digit.
* 5. Sintak perlaksanaan prosedur ALGO berbeza sedikit dari apa yang diberikan dalam laporan Zurich. Fungsi yang ditetapkan dalam lapuran Zürich juga tidak dilaksanakan.
* 9. Sintak di sini adalah dari lapuran Zürich dan juga selari dengan pelbagai auto kod era 1950-an.
* 10. KEYBD membaca nilai nombor dari mesin taip.
* 11. ALGO tidak membenarkan peningkatan negetif dalam gelung subscript, menyebabkan trik ini.
* 14. **if either** dari lapuran Zürich tidak dilaksanakan.
* 19. Carriage return.

Kata khas ALGOL 60 dan had pengenalpasti
----------------------------------------

Terdapat 35 perkataan sedemikian dalam sistem besar Burroughs piwaian:  `ALPHA, ARRAY, BEGIN, BOOLEAN, COMMENT, CONTINUE, DIRECT, DO, DOUBLE, ELSE, END, EVENT, FALSE, FILE, FOR, FORMAT, GO, IF, INTEGER, LABEL, LIST, LONG, OWN, POINTER, PROCEDURE, REAL, STEP, SWITCH, TASK, THEN, TRUE, UNTIL, VALUE, WHILE, ZIP.`

Terdapat 71 had pengenalpasti dalam sistem besar Burroughs piwaian sub-bahasa: `ACCEPT, AND, ATTACH, BY, CALL, CASE, CAUSE, CLOSE, DEALLOCATE, DEFINE, DETACH, DISABLE, DISPLAY, DIV, DUMP, ENABLE, EQL, EQV, EXCHANGE, EXTERNAL, FILL, FORWARD, GEQ, GTR, IMP, IN, INTERRUPT, IS, LB, LEQ, LIBERATE, LINE, LOCK, LSS, MERGE, MOD, MONITOR, MUX, NEQ, NO, NOT, ON, OPEN, OR, OUT, PICTURE, PROCESS, PROCURE, PROGRAMDUMP, RB, READ, RELEASE, REPLACE, RESET, RESIZE, REWIND, RUN, SCAN, SEEK, SET, SKIP, SORT, SPACE, SWAP, THRU, TIMES, TO, WAIT, WHEN, WITH, WRITE` termasuk nama kesemua fungsi intrinsik.

Lihat juga
----------

* ALGOL 58
* ALGOL 68
* Algol-W
* Atlas Autocode
* CORAL66
* Edinburgh IMP
* Jensen's Device
* ISWIM
* JOVIAL
* Simula

Nota
----

1. ↑  Nama keluarga bahasa ini kadang kala diberikan dalam campuran huruf besar dan kecil (*Algol 60*), dan kadang kala semua huruf besar (*ALGOL 68*). Untuk ringkas, rencana ini menggunakan *ALGOL*.
2. ↑  "Revised Report on the Algorithmic Language Algol 60". 1963. Unknown parameter `|accessyear=` ignored (`|access-date=` suggested) (bantuan); Unknown parameter `|accessmonthday=` ignored (bantuan)
3. ↑  "Revised Report on the Algorithmic Language ALGOL 68". 1973. Unknown parameter `|accessyear=` ignored (`|access-date=` suggested) (bantuan); Unknown parameter `|accessmonthday=` ignored (bantuan)
4. ↑  "803 ALGOL" Buku panduan Elliott 803 ALGOL
5. ↑  "GOST 10859 standard". Unknown parameter `|accessyear=` ignored (`|access-date=` suggested) (bantuan); Unknown parameter `|accessmonthday=` ignored (bantuan)

Rujukan
-------

* B. Randell and L.J. Russell, *ALGOL 60 Implementation: The Translation and Use of ALGOL 60 Programs on a Computer*. Academic Press, 1964. The design of the **Whetstone Compiler**. One of the early published descriptions of implementing a compiler. See the related papers: Whetstone Algol Revisited, and The Whetstone KDF9 Algol Translator by B. Randell
* E. W, Dijkstra, *Algol 60 translation: an algol 60 translator for the x1 and making a translator for algol 60*, report MR 35/61. Mathematisch Centrum, Amsterdam, 1961.

Pautan luar
-----------

* Revised Report on the Algorithmic Language Algol 60 by Peter Naur, et al. ALGOL definition
* A BNF syntax summary Diarkibkan 2011-07-20 di Wayback Machine of ALGOL 60
* "The Emperor’s Old Clothes" Diarkibkan 2007-11-27 di Wayback Machine – Hoare’s 1980 ACM Turing Award speech, which discusses ALGOL history and his involvement
* MARST, a free Algol-to-C translator
* AN IMPLEMENTATION OF ALGOL 60 FOR THE FP6000 Diarkibkan 2020-07-25 di Wayback Machine Discussion of some implementation issues.
* "The European Side of the Last Phase of the Development of ALGOL 60" by Peter Naur
* Edinburgh University wrote compilers for Algol60 (later updated for Algol60M) based on their Atlas Autocode compilers initially bootstrapped from the Atlas to the KDF-9. The Edinburgh compilers generated code for the ICL1900, the ICL4/75 (an IBM360 clone), and the ICL2900. Here is the BNF for Algol60 and the ICL2900 compiler source, library documentation, and a considerable test suite including Brian Wichmann’s tests. Also there is a rather superficial Algol60 to Atlas Autocode source-level translator.
* Eric Raymond's Retrocomputing Museum, among others a link to the NASE Algol-60 interpreter written in C.