Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Алгол-60
 
 автор: Unkind   (22.05.2007 в 01:11)   письмо автору
 
 

Кто нибудь знаком более-менее близко с этим языком программирования?..

   
 
 автор: cheops   (22.05.2007 в 01:36)   письмо автору
 
   для: Unkind   (22.05.2007 в 01:11)
 

Легендарный язык в 60-х годах имел такое же значение, как сейчас Java - т.е. был концептуальной моделью, пусть не совсем удобной в реальном использовании, зато более красивый и выдержанный по сравнению с помойным Cobol (при помощи которого, было удобнее решать реальные задачи - его роль, сейчас PHP выполняет - грязный до жути язык, но удобный).

PS Такие языки не живут долгой жизнью - из них берут здравые идеи и реализуют в других языках. Сам язык при этом отмирает. Единственным исключением является Pascal, который должен был сдохнуть, однако зажил самостоятельной жизнью, в обход Вирта и поэтому выжил. Обычно акдемические языки (т.е. разрабатываемые учёными, а не инженерами) не живут долго.
PPS Пожалуй больше ничего об Алгол сказать не могу :))) Это очень хорошая веха в индустрии, но сам вообще никак не касался - перспективы нулевые у языка были, поэтому сразу углубился в Fortran, который в науке по сей день актуален.

   
 
 автор: Unkind   (22.05.2007 в 01:42)   письмо автору
 
   для: cheops   (22.05.2007 в 01:36)
 

Пожалуй больше ничего об Алгол сказать не могу
Жаль :) У меня тут код на этом ЯП. Что-то трудно разобрать...

   
 
 автор: mefestofel   (22.05.2007 в 02:27)   письмо автору
 
   для: Unkind   (22.05.2007 в 01:42)
 

Покажите ради интереса... Если Вам не тяжело...

   
 
 автор: Trianon   (22.05.2007 в 09:47)   письмо автору
 
   для: cheops   (22.05.2007 в 01:36)
 

Ветви алгола и фортрана (классического) не имеют между собой ничего общего.

У Вирта три детища, если не ошибаюсь... паскаль, модула и оберон.
И паскаль, как мне представляется, выжил как раз потому что являлся академическим языком - его насаждали в вузах, по нему было изрядно литературы. Причем хорошей литературы. Легкой, ясной, авторитетной. Та же самая "Алгоритмы+структуры данных" Вирта - фактически вторая библия, только для студентов - переведена на кучу языков и мне трудно представить даже её общий тираж.
И простой он, как тапочек, не смотря на то, что достаточно полный и практичный. Неудивительно, что была сформирована армия тех, кому на этом языке писать очень даже пришлось по душе. А дальше фирма Borland просто приподняла его , застолбив фактически место. И понеслось.... Остальные не успели.

А алгол-60 - язык, в определении которого слишком много оставили за кадром. Да и не могли не составить, поскольку в то время операционных систем как таковых еще не существовало.
Весь софт на машине - лента с транслятором. Его даже компилятором то обозвать совестно, поскольку средств сборки - никаких. А нету операционного окружения - нету унификации (про стандартизацию я вообще не говорю) представления данных. Фактически - язык оказывается замкнут в конкретной реализации. Отсюда и коллапс.

   
 
 автор: cheops   (22.05.2007 в 10:31)   письмо автору
 
   для: Trianon   (22.05.2007 в 09:47)
 

>Ветви алгола и фортрана (классического) не имеют между собой ничего общего.
Никто этого не утверждал.

   
 
 автор: Trianon   (22.05.2007 в 10:36)   письмо автору
 
   для: cheops   (22.05.2007 в 10:31)
 

Пардон :) Фразу не так понял :)

   
 
 автор: Trianon   (22.05.2007 в 09:43)   письмо автору
 
   для: Unkind   (22.05.2007 в 01:11)
 

Я знаком.
С него начинал. Правда, поскольку не писал на нем более четверти века, детали мог и подзабыть.

   
 
 автор: Unkind   (22.05.2007 в 17:10)   письмо автору
 
   для: 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. ≠ - "!="

   
 
 автор: Trianon   (22.05.2007 в 18:27)   письмо автору
 
   для: 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&#8800;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:54)   письмо автору
 
   для: Trianon   (22.05.2007 в 18:27)
 

во время перевода посещали весьма противоречивые мысли... то ли это нутро блочного шифра... то ли сумасшедшая реализация "пузырька" :)))

   
 
 автор: Trianon   (22.05.2007 в 19:33)   письмо автору
 
   для: Trianon   (22.05.2007 в 18:27)
 

слегка причесал подстрочник в комментариях, чтоб легче было выдирать.

   
 
 автор: Unkind   (22.05.2007 в 20:05)   письмо автору
 
   для: Trianon   (22.05.2007 в 19:33)
 

А что значит "end" на конце "go to iter end;"?
Просто цикл теряет смысл...

if(2 >= n)
А почему "2 >= $n"? Вроде в коде "n>2".

continue;
Это еще тут зачем? :))

   
 
 автор: Trianon   (23.05.2007 в 00:42)   письмо автору
 
   для: Unkind   (22.05.2007 в 20:05)
 

begin означает открывающую фигурную скобку - начало составного оператора или блока.
end означает закрывающую фигурную скобку - конец составного оператора или блока.
Поскольку оператора goto в php нет, пришлось развернуть созданный им циклический код, и записать его в виде оператора цикла. Отсюда for, break, continue. Насколько аккуратно у меня это получилось - бог весть...

Еще одно важное замечание . Если я правильно помню, ключевое слово own означает примерно то же самое, что и static в С/PHP . Учтите пожалуйста. Массив там похоже статический. А сама процедура - с побочными эффектами.

выражение 2 >= n эквивалентно not (n>2)
continue - лишний.
А что Вы хотите - я операторы этого цикла раз двадцать тасовал, пока уложил.

   
 
 автор: Unkind   (23.05.2007 в 13:35)   письмо автору
 
   для: 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(=> "a""b""c""d");

for(
$i 1$prim115 true$i <= factorial(count($x)); $i++)
{
echo(
$i " " implode(permutation(count($x))) . "\r\n");
}
?>

   
 
 автор: Trianon   (23.05.2007 в 14:53)   письмо автору
 
   для: 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 */

   
 
 автор: Unkind   (23.05.2007 в 14:59)   письмо автору
 
   для: Trianon   (23.05.2007 в 14:53)
 

OK, $q = 1; можно вообще удалить, $prim115 = false; вынести из цикла.

   
 
 автор: Trianon   (23.05.2007 в 15:01)   письмо автору
 
   для: Unkind   (23.05.2007 в 14:59)
 

если n <= 2 то оба эти оператора выполняются. Что я и написал в подстрочнике..как раз строками
/// if(2 >= n)
/// {
/// $q = 1;
/// $prim115 = true;
/// break;
/// }


$prim115 = true; - тоже выполняется не всякий раз. Внимательнее читайте код.

   
 
 автор: Unkind   (23.05.2007 в 15:08)   письмо автору
 
   для: 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;

   
 
 автор: Trianon   (23.05.2007 в 15:13)   письмо автору
 
   для: Unkind   (23.05.2007 в 15:08)
 

а после break - что пиши else - что не пиши - всё едино.
Соответственно, else - становится сорным оператором, никогда не получающим управления. вроде continue, который я случайно забыл в конце тела цикла.

   
 
 автор: Unkind   (23.05.2007 в 15:42)   письмо автору
 
   для: Trianon   (23.05.2007 в 15:13)
 

Логично.

Кстати, а оператор "не равно" в Алголе правда как в математике, то есть зачеркнутый знак "равно"? Вроде он есть только в Unicode.

   
 
 автор: Trianon   (23.05.2007 в 15:45)   письмо автору
 
   для: 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' ....

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования