Некоторые «вкусности» Алгол-68
Элегантный синтаксис
В Алгол-68 (прошу обратить внимание, что
Алгол-68 и
Алгол-60 —
это совершенно разные языки!) есть весьма элегантные конструкции вида «if» — «fi».
Очень доходчиво!
if — fi
do — od
case — esac
Симпатично, но ...
А что если нам необходимо закончить некий блок, начинающийся словом «function»?
Ему, вероятно, должно соответствовать «noitcnuf»?
А пару «operation» должно составить «noitarepo».
Это уже похоже на шаманские заклинания.
Здесь Алгол-68 и его идея повернулась к нам некрасивым местом.
Поэтому от такого стиля лучше отказаться.
История, сделав виток по спирали, возвратила нам идеи Алгола-68, воплощённые в HTML:
<title> — </title>
<table> — </table>
<p> — </p> и т.д.
Очень логично. Но громоздко.
Языку разметки текста, наверное, простительна такая расточительность в символах.
Но языку програмирования лишнее не к лицу.
Действительно, если убрать «<» и «>», то смотрится лучше:
if — /if
switch — /switch
for — /for
do — /do
while — /while
class — /class
function — /function
Это смотрится симпатичнее, чем вариант с «end»:
if — end if
do — end do
function — end function
Условный оператор
В Алгол-68 возможно такое:
a := if a = 0 then b else c fi;
На C это записывается так:
a = (a==0)? b : c;
или:
if (a == 0) a = b; else a = c;
Сейчас такими трюками никого не удивишь.
Но они включают фантазию тем, кто придумывает языки.
Не знаю, возможно ли такое на Алгол-68 (а это очень даже вероятно — это очень мощный язык),
оператор «if» может, по идее, возвращать не только какой-то объект и какое-то значение, но и операции!
a := b if b > 0 then * else + fi c; // выбор операции * или + в зависимости от b > 0
То же, но на C:
if (a == 0) a = b * c; else a = b + c;
Не правда ли, красивое решение?
Хотя и бесполезное: всё тоже самое можно сделать без пижонства.
Уроки провала Алгол-68
Комитет, занимавшийся выработкой языка, создал язык, чрезвычайно богатый выразительными возможностями.
Он же оказался чрезвычайно сложен в реализации.
Первые компиляторы появились спустя годы после описания языка.
При этом они охватывали лишь часть возможностей языка.
Полностью соответствующий стандарту языка компилятор появился лишь десятилетие спустя.
О чём это говорит и какие выводы из этого можно сделать?
-
Чем сложнее язык, тем сложнее компилятор.
Тем дольше этот компилятор разрабатывается.
Тем больших усилий это требует.
-
Сложный язык затрудняет не только написание компилятора, но и изучение самого языка программистами.
Чем проще язык, тем больше будет желающих изучить его «за один вечер».
-
Если хотим иметь обозримые сроки создания компилятора, невысокую сложность языка, то нужно уметь выделить главное, от чего нельзя отказаться.
Не надо в язык впихивать «невпихуемое».
Что ещё почитать на эту тему
Опубликовано: 2012.09.25, последняя правка: 2015.01.23 03:23
Отзывы
✅ 2015/04/04 08:27, rst256 #0
Все же ключевым фактором стоит считать именно сложность языка. Вот сайт проекта, новая версия вышла в январе 2015 г.: http://algol68.sourceforge.net/ размер исходников (преимущественно код на С) ~ 3Mb✅ 2021/03/27 02:33, Виталий Монастырский #1
Да, я уже писал об этом здесь в комментариях. Нужно пресс-ядро, то есть предельно сжатый базовый синтаксис языка исключительно для разработчиков языка, который позволяет реализовать любые другие структуры. А для пользователей уже на базе этого пресс-ядра, создать полноценный расширенный вариант синтаксиса. Тогда все будет быстро и реально реализуемо в приемлемые сроки.
Ну ладно, давайте грубо говоря с примером. Реально пользователям удобно иметь и if, и switch, и for, и while, и ещё кучу плюшек со сладостями. Однако разработчикам языка все это нужно реализовывать по всей линии компилятора. Но для компьютера то нужен всего лишь один if и goto...
Таким образом создаем ядро-синтаксис, в котором ничего вышеупомянутого не будет, а будут только два указанных оператора. Реализуем их в компиляторе, а уже через них будем в автоматическом режиме собирать с помощью транслятора любые комбинации операторов второго уровня языка. Например, пользователь пишет: for i=0; i<10; i++ { что-то там... }
транслятор это все переводит в наше ядро-чудо:
var i uint i:0 #back if i>=10 goto end что-то там... i++ if i<10 goto back #end
Ну вот так как-то...✅ 2021/04/01 13:03, Александр Коновалов aka Маздайщик #2
Виталий, возможно, Ваш комментарий был бы более актуален под статьёй «Синтаксический сахар».
Разработка компилятора как транслятора (рассахаривателя) богатого входного языка в бедный промежуточный и генератора кода из промежуточного языка в целевой, в Вашем случае, машинный — хороший подход к проектированию. У меня самого примерно также устроен компилятор Рефала-5λ.
Однако я бы не советовал раскручивать компилятор со столь бедного промежуточного языка. Трансляция блочного if’а и while в код с метками и условными/безусловными переходами довольно проста, и её лучше реализовать сразу — это заметно ускорит разработку.✅ 2023/11/20 13:37, Деньги на WWWетер #3
В HTML двойная симметрия конструкций: сперва в пределах самого тега (тег начинается левой угловой скобкой, а заканчивается правой), а затем симметрия в начале и конце конструкции (в начале <тег> и в конце </тег>).✅ 2024/01/16 16:23, Александр #4
А есть компиляторы, полностью реализующие популярные языки программирования С++ и SQL ?✅ 2024/01/16 17:11, Автор сайта #5
Насчёт C++ точнее всего Вам ответит, наверное, Евгений Александрович Зуев, когда-то разработчик компилятора и представитель страны в международном комитете по стандартизации C++. А вот по поводу SQL даже не знаю, что сказать. По идее стандарт стабилен и невелик в сравнении с C++. Думаю, что полных реализаций немало. Добавить свой отзыв
Написать автору можно на электронную почту mail(аt)compiler.su
|