|
|
|
| Кто нибудь знаком более-менее близко с этим языком программирования?.. | |
|
|
|
|
|
|
|
для: Unkind
(22.05.2007 в 01:11)
| | Легендарный язык в 60-х годах имел такое же значение, как сейчас Java - т.е. был концептуальной моделью, пусть не совсем удобной в реальном использовании, зато более красивый и выдержанный по сравнению с помойным Cobol (при помощи которого, было удобнее решать реальные задачи - его роль, сейчас PHP выполняет - грязный до жути язык, но удобный).
PS Такие языки не живут долгой жизнью - из них берут здравые идеи и реализуют в других языках. Сам язык при этом отмирает. Единственным исключением является Pascal, который должен был сдохнуть, однако зажил самостоятельной жизнью, в обход Вирта и поэтому выжил. Обычно акдемические языки (т.е. разрабатываемые учёными, а не инженерами) не живут долго.
PPS Пожалуй больше ничего об Алгол сказать не могу :))) Это очень хорошая веха в индустрии, но сам вообще никак не касался - перспективы нулевые у языка были, поэтому сразу углубился в Fortran, который в науке по сей день актуален. | |
|
|
|
|
|
|
|
для: cheops
(22.05.2007 в 01:36)
| | Пожалуй больше ничего об Алгол сказать не могу
Жаль :) У меня тут код на этом ЯП. Что-то трудно разобрать... | |
|
|
|
|
|
|
|
для: Unkind
(22.05.2007 в 01:42)
| | Покажите ради интереса... Если Вам не тяжело... | |
|
|
|
|
|
|
|
для: cheops
(22.05.2007 в 01:36)
| | Ветви алгола и фортрана (классического) не имеют между собой ничего общего.
У Вирта три детища, если не ошибаюсь... паскаль, модула и оберон.
И паскаль, как мне представляется, выжил как раз потому что являлся академическим языком - его насаждали в вузах, по нему было изрядно литературы. Причем хорошей литературы. Легкой, ясной, авторитетной. Та же самая "Алгоритмы+структуры данных" Вирта - фактически вторая библия, только для студентов - переведена на кучу языков и мне трудно представить даже её общий тираж.
И простой он, как тапочек, не смотря на то, что достаточно полный и практичный. Неудивительно, что была сформирована армия тех, кому на этом языке писать очень даже пришлось по душе. А дальше фирма Borland просто приподняла его , застолбив фактически место. И понеслось.... Остальные не успели.
А алгол-60 - язык, в определении которого слишком много оставили за кадром. Да и не могли не составить, поскольку в то время операционных систем как таковых еще не существовало.
Весь софт на машине - лента с транслятором. Его даже компилятором то обозвать совестно, поскольку средств сборки - никаких. А нету операционного окружения - нету унификации (про стандартизацию я вообще не говорю) представления данных. Фактически - язык оказывается замкнут в конкретной реализации. Отсюда и коллапс. | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 09:47)
| | >Ветви алгола и фортрана (классического) не имеют между собой ничего общего.
Никто этого не утверждал. | |
|
|
|
|
|
|
|
для: cheops
(22.05.2007 в 10:31)
| | Пардон :) Фразу не так понял :) | |
|
|
|
|
|
|
|
для: Unkind
(22.05.2007 в 01:11)
| | Я знаком.
С него начинал. Правда, поскольку не писал на нем более четверти века, детали мог и подзабыть. | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 09:43)
| | Вот такой код:
procedure perm(n) dataresult:(x);
value n; integer n; array x;
begin real t;integer k,q; own integer array p,d[2:n];
if prim115 then
begin prim115:=false;
for k:=2 step 1 until n do
begin p[k]:=0; d[k]:=1 end k
end prim115;
k:=0
index: p[n]:=q:=p[n]+d[n];
if q=n then
begin d[n]:=-1; go to iter end;
if q≠0 then go to trans;
d[n]:=1; k:=k+1;
iter: if n>2 then
begin n:=n-1; go to index end iter;
q:=1; prim115:=true;
trans: q:=q+k;t:=x[q];
x[q]:=x[q+1];x[q+1]:=t
end perm;
|
n должно быть integer, x - array.
Если не трудно, можно подробнее объяснить какой кусок кода что обозначает, чтобы я на PHP перевел? :)
P.S. ≠ - "!=" | |
|
|
|
|
|
|
|
для: Unkind
(22.05.2007 в 17:10)
| |
procedure perm(n) dataresult:(x);
value n; integer n; array x;
объявляется процедура с именем perm (одним целочисленным параметром n , передаваемым по значению. И видимо(тут идет явно местный диалект), возвращающая результат в виде массива x
процедура имеет следующее тело:
begin real t;integer k,q; own integer array p,d[2:n];
в котором создаются переменные
double $t;
int $k, $q;
и два int-массива $p, $d - оба с индексами 2....n
if prim115 then /// if($prim115) // эта переменная определена где-то извне (глобальный параметр)
begin prim115:=false; /// { $prim115 = false;
for k:=2 step 1 until n do /// for($k=2; $n <= $n; $k++)
begin p[k]:=0; d[k]:=1 end k /// { $p[$k] = 0; $d[$k] = 1;}
end prim115; /// } // закрылся begin выше
k:=0 /// $k = 0;
/// грязный неструктурированный код переведен целым куском ниже
index: p[n]:=q:=p[n]+d[n];
if q=n then
begin d[n]:=-1; go to iter end;
if q≠0 then go to trans;
d[n]:=1; k:=k+1;
iter: if n>2 then
begin n:=n-1; go to index end iter;
q:=1; prim115:=true;
trans:
/// как-то так:
/// for(;;)
/// {
/// $p[$n] = $q = $p[$n] + $d[$n];
/// if($q == $n)
/// $d[$n] = -1;
/// else
/// {
/// if($q != 0)
/// break;
/// $d[$n] = 1; ++$k;
/// }
/// if(2 >= n)
/// {
/// $q = 1;
/// $prim115 = true;
/// break;
/// }
/// --$n;
/// continue;
/// }
q:=q+k;t:=x[q]; /// $q += $k; $t = $x[$q];
x[q]:=x[q+1];x[q+1]:=t /// $x[$q] = $x[$q+1];$x[$q+1] = $t;
end perm; /// }//конец процедуры.
|
| |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 18:27)
| | во время перевода посещали весьма противоречивые мысли... то ли это нутро блочного шифра... то ли сумасшедшая реализация "пузырька" :))) | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 18:27)
| | слегка причесал подстрочник в комментариях, чтоб легче было выдирать. | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 19:33)
| | А что значит "end" на конце "go to iter end;"?
Просто цикл теряет смысл...
if(2 >= n)
А почему "2 >= $n"? Вроде в коде "n>2".
continue;
Это еще тут зачем? :)) | |
|
|
|
|
|
|
|
для: Unkind
(22.05.2007 в 20:05)
| | begin означает открывающую фигурную скобку - начало составного оператора или блока.
end означает закрывающую фигурную скобку - конец составного оператора или блока.
Поскольку оператора goto в php нет, пришлось развернуть созданный им циклический код, и записать его в виде оператора цикла. Отсюда for, break, continue. Насколько аккуратно у меня это получилось - бог весть...
Еще одно важное замечание . Если я правильно помню, ключевое слово own означает примерно то же самое, что и static в С/PHP . Учтите пожалуйста. Массив там похоже статический. А сама процедура - с побочными эффектами.
выражение 2 >= n эквивалентно not (n>2)
continue - лишний.
А что Вы хотите - я операторы этого цикла раз двадцать тасовал, пока уложил. | |
|
|
|
|
|
|
|
для: Trianon
(23.05.2007 в 00:42)
| | выражение 2 >= n эквивалентно not (n>2)
Конечно, но тут я не увидил ничего, указывающего отрицание: "if n>2 then".
В общем, у меня получилось с Вашей помощью перевести этот код на PHP. Огромное спасибо.
<?php
set_time_limit(1);
header("Content-type: text/plain");
function factorial($a)
{
if((int) $a <> $a || $a <= 0) return false;
$factorial = 1;
for($i = 2; $i <= $a; $i++) $factorial = bcmul($factorial, $i);
return $factorial;
}
function permutation($n)
{
$k = $q = 0;
static $p, $d;
global $prim115, $x;
if($prim115)
{
$prim115 = false;
for($k = 2; $k <= $n; $k++)
{
$p[$k] = 0;
$d[$k] = 1;
}
}
$k = 0;
while(true)
{
$p[$n] = $q = $p[$n] + $d[$n];
if($q == $n)
{
$d[$n] = -1;
}
else
{
if($q != 0) break;
$d[$n] = 1;
$k++;
}
if($n > 2)
{
$n--;
$q = 1;
$prim115 = false;
}
}
$q += $k;
list($x[$q], $x[$q + 1]) = array($x[$q + 1], $x[$q]);
return $x;
}
$x = array(1 => "a", "b", "c", "d");
for($i = 1, $prim115 = true; $i <= factorial(count($x)); $i++)
{
echo($i . " " . implode(permutation(count($x))) . "\r\n");
}
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(23.05.2007 в 13:35)
| | >В общем, у меня получилось с Вашей помощью перевести этот код на PHP. Огромное спасибо.
>выражение 2 >= n эквивалентно not (n>2)
>Конечно, но тут я не увидил ничего, указывающего отрицание: "if n>2 then".
>
плохо перевели.
Код на алголе
if n>2 then
begin n:=n-1; go to index end iter;
| означает на php
if($n>2) { --$n; далее продолжить выполнение кода с точки, помеченной меткой "index:" } //iter
|
а на С
if(n>2) { --n; goto index; } /* iter */
|
| |
|
|
|
|
|
|
|
для: Trianon
(23.05.2007 в 14:53)
| | OK, $q = 1; можно вообще удалить, $prim115 = false; вынести из цикла. | |
|
|
|
|
|
|
|
для: Unkind
(23.05.2007 в 14:59)
| | если n <= 2 то оба эти оператора выполняются. Что я и написал в подстрочнике..как раз строками
/// if(2 >= n)
/// {
/// $q = 1;
/// $prim115 = true;
/// break;
/// }
$prim115 = true; - тоже выполняется не всякий раз. Внимательнее читайте код. | |
|
|
|
|
|
|
|
для: Trianon
(23.05.2007 в 15:01)
| | Если я правильно Вас понял, то тогда надо было писать не
/// if(2 >= $n)
/// {
/// $q = 1;
/// $prim115 = true;
/// break;
/// }
/// --$n;
|
, а
/// if(2 >= $n)
/// {
/// $q = 1;
/// $prim115 = true;
/// break;
/// } else --$n;
|
| |
|
|
|
|
|
|
|
для: Unkind
(23.05.2007 в 15:08)
| | а после break - что пиши else - что не пиши - всё едино.
Соответственно, else - становится сорным оператором, никогда не получающим управления. вроде continue, который я случайно забыл в конце тела цикла. | |
|
|
|
|
|
|
|
для: Trianon
(23.05.2007 в 15:13)
| | Логично.
Кстати, а оператор "не равно" в Алголе правда как в математике, то есть зачеркнутый знак "равно"? Вроде он есть только в Unicode. | |
|
|
|
|
|
|
|
для: Unkind
(23.05.2007 в 15:42)
| | в алголе относились к этому проще. Авторы какие хотели знаки такие и вводили .
begin - это тоже один отдельный знак . И if и procedure и прочие. А не как в C
В конце концов, множество знаков как-то отображалось на имеющийся набор символов.
На машине, на которой мне довелось работать, код { k = 1e6; } выглядел примерно так:
'BEGIN' 'REAL' K; K := 1Ю6; 'END'
Сравнения выглядели почти как в фортране 'IF' K 'NE' 1.57Ю3 'THEN' .... | |
|
|
|