Clarion: мощное оружие, бьющее точно в цель
Уважаемые читатели, предлагаем вашему вниманию серию публикаций, знакомящих с языком программирования Clarion известной англо-американской корпорации TopSpeed Corporation. Среди других языков Clarion выделяется прежде всего наличием мощного и гибкого генератора исходных текстов программ, а также простотой освоения. В силу своей наглядности, практичности и кажущейся простоты он почти идеально подходит и для преподавания в вузах, и для реальных серьезных проектов, и для исследовательских работ по новым программным инструментам и технологиям.
Эти особенности делают Clarion чрезвычайно привлекательным не только для программистов-профессионалов, но и для пользователей, не знакомых с программированием. К сожалению, несмотря на то, что он снискал себе заслуженную популярность не только в Америке (как никак это основной язык программирования Пентагона), но и в России, он не достаточно популярен в нашей стране. Отсутствие литературы, позволяющей широкому кругу пользователей и программистов познакомиться с этой технологией, а также местных дилеров TopSpeed Corporation определенным образом ограничивает поле деятельности белорусских разработчиков, работающих прежде всего на ниве экономических и административных приложений. Автор надеется, что данные публикации помогут восполнить образовавшийся пробел.
Как все начиналось
Стремление к универсальности
"Как это часто бывает, я просто пытался доставить себе удовольствие. Я купил свой первый персональный компьютер, смотрел на него и хотел писать программы для него. Это моя работа". С таких слов Брюс Д. Баррингтон, президент TopSpeed Corporation, начинал свое повествование об истории создания языка Clarion. Так зарождался Clarion, универсальный язык программирования со встроенными средствами управления БД. Да, именно стремление к универсальности предопределило создание Clarion.
"Моим стимулом в работе было убеждение, что программирование должно быть проще, что языки программирования должны облегчать чтение и написание программ и что низкая производительность, связанная с процессом разработки программ, коренится в неадекватных и слабо спроектированных инструментальных средствах программирования".
Разработка Clarion началась в 1984 г. Тогда существовало достаточно языков, ориентированных на административные и экономические задачи, но единственное, чего им не доставало, так это универсальности. По большому счету большинство представленных языков БД являли собой скорее набор инструкций, предназначенных для исполнения программой управления базами данных.
Работа над Clarion начиналась с "вечных вопросов": зачем каждый раз оформлять оператор IF в виде IF...THEN BEGIN; "операторы"; END ELSE...(Pascal)? Какой особый смысл ключевых слов THEN, BEGIN, END в этой структуре? Зачем пользоваться знаком ":=" вместо "=" в операторе присваивания (Pascal, Modula-2, ADA)? Почему до разработчика языка не доходило, что оператор присваивания - это самый распространенный оператор в программе, или что знак ":=" трудно набирать на клавиатуре, так как он состоит из комбинаций клавиш, нажимаемых с Shift и без него? Ну а предложение READ...AT END (COBOL), присваивающее значение переменной, которая проверяется для прекращения цикла чтения по достижению конца файла? Почему нельзя просто проверять в цикле конец файла? Почему, объявив переменную, нужно было напоминать компилятору, чтобы он преобразовывал ее в выражении с переменными различных типов. Компилятор не мог помнить об этом сам?
"Вспомните ШЕСТНАДЦАТИРИЧНЫЕ ДАМПЫ! Двадцать лет программирования породили во мне такое чувство, как у главного героя фильма "Сеть", который, высунувшись из окна, закричал: "Я с ума сойду. Я не могу больше этого выносить!"
В качестве ключевых ориентиров при создании Clarion были выбраны компактность (простота написания) и выразительность (простота чтения). Разработчики продвигались в направлении, противоположном общепринятому: сначала было написано много программ с целью экспериментов над синтаксисом и семантикой, пока они не стали на что-то похожи. Потом была проделана работа над небольшим справочником по языку. Когда он был закончен, программисты начали писать компилятор.
"Язык менялся ежедневно. Недавно я перечитал старые записки разработчиков и вспомнил, сколько раз и сколькими людьми был обдуман каждый элемент языка. Одни идеи предлагались и отвергались по эстетическим соображениям, другие - в силу их слабой технологичности, были и просто безумные мысли. Уцелели, по Дарвину, только сильные".
С точки зрения стиля языки программирования можно разделить на три группы: ориентированные на лексемы, на предложения и на операторы. Языки, ориентированные на лексемы, типа Pascal и С, компактны, но не очень выразительны. В этих языках программа - набор лексем (ключевых слов, имен данных, констант, знаков пунктуации и т.д.), разделенных "пропусками" (пробелами, символами CR/LF (возврат каретки и новая строка), комментариями и иногда запятыми). Компилятор собирает лексемы и игнорирует пропуски. Языки лексемного типа - одномерные, поэтому программисты пользуются пропусками, чтобы добавить своей программе второе измерение.
Языки, ориентированные на предложения, типа языков баз данных, выразительны, но не очень компактны. Иногда операторы этих языков читаются в точности как английские предложения.
В своих экспериментах программисты Clarion ориентировались на операторы - старомодный стиль FORTRAN и BASIC. В языках, ориентированных на операторы, программа существует в виде ASCII-файлов с исходным текстом - каждая строка программы соответствует записи файла. Поэтому вместо знаков препинания можно воспользоваться границами записей. Выбранный формат оператора оказался компактным, выразительным и универсальным:
метка ОПЕРАТОР[(параметры)], [АТРИБУТЫ[(параметры)]]...
Атрибуты нужны только для объявления данных. Исполняемые операторы используют формат стандартного вызова процедур. И было определено несколько форматов операторов присваивания (А=В) и операторов управления (IF, CASE, и т.д.). Метка оператора начинается с первой колонки (первая позиция записи). Оператор заканчивается символом конца строки, если не продолжается на следующую строку с помощью символа "|" (вертикальная черта). Кроме того, для разделения нескольких операторов на одной строке можно использовать ";" (точка с запятой). Игнорируя пустые операторы, как в языке Modula-2, разработчики Clarion устранили различия между разделителями операторов и признаками конца операторов.
Такое построение предложений языка позволило избавиться от знаков пунктуации, необходимых в противном случае для идентификации меток и отдельных операторов. Блок операторов начинается со сложного оператора типа IF и заканчивается разделителем типа ELSE (который сам начинает блок операторов) или оператором END (или точкой).
Объявление данных
В качестве языка административных и экономических применений Cla-rion нуждался в развитом наборе базовых типов данных: были включены все имеющиеся длины целых и действительных чисел, чтобы обеспечить совместимость с форматом внешних записей и списком параметров. Упакованные десятичные числа были включены, чтобы решить проблемы округления величин и уменьшить потребности в памяти (они могут быть объявлены в зависимости от диапазона значений). Были также включены различные параметры строк (фиксированный формат, форматы Pascal и С), а также полный набор строковых функций. И наконец, были разработаны типы данных для обозначения дат и времени, чтобы иметь возможность производить арифметические действия над этими переменными (например, Tomorrow=Today+1 (Завтра=Сегодня+1)).
Оставался без ответа один важный вопрос: нужны ли языку Clarion типы, определенные пользователем? В языках с объявлением типов группы и массивы объявляются как типы: сначала объявляется тип, а потом экземпляр этого типа, задающий переменную. Но в программах экономического характера большинство групп и массивов объявляются только один раз. Обдумывание имени типа и кодирование оператора - это обычно ненужная работа. Вообще это спорно считать группу или массив типом данных. Группы и массивы описывают не типы данных, а то, как эти данные располагаются в памяти.
Поэтому в Clarion объявление типов данных было сделано необязательным. Оператор объявления с атрибутом TYPE объявляет тип данных, который можно использовать для повторяющихся структур, передаваемых в качестве параметров. Оператор объявления без атрибута TYPE объявляет и тип данных и имя переменной.
Типы данных
Язык программирования называется строго типизированным, если каждый элемент данных имеет свой единственный тип, и синтаксис языка запрещает рассматривать этот элемент как другой тип данных. Многие эксперты считают, что строгое типизирование повышает надежность программ. Может быть. Но писать программы становится труднее, поскольку ограничивается сфера действия универсальных процедур и требуется дополнительный контроль за типом данных. Было важно, чтобы типы данных Clarion допускали простое построение процедур общего характера. Если процедура ожидает числовой параметр, то должен быть допустим параметр любого числового типа данных. Было смешно требовать наличия разных числовых функций, которые манипулируют данными разных числовых типов, как это имело место в производных от ALGOL языках. Больше того, полиморфизм, реализованный в С++, который предполагает отдельные функции для каждого типа данных, но который позволяет обращаться к ним по одному и тому же имени функции, представляет собой чисто внешнюю симуляцию полиморфизма.
В первоначальной версии языка Clarion параметры даже не надо было описывать в прототипе. Процедура использовала все, что бы ни было указано в списке аргументов при вызове. Сейчас Clarion требует, чтобы параметры были представлены в прототипе, но допускает отсутствие типа данных параметра. Относительно неструктурированных типов данных процедуры в Clarion всегда были истинно полиморфными.
Параметры в Clarion представляются в прототипе для того, чтобы передаваться посредством адреса или самим значением. Сам же язык указатели не поддерживает. По двум причинам: во-первых, указатели не несут в себе информации о типе данных и легко могут быть нарушены. Во-вторых, обозначения косвенных ссылок (синтаксические отличия указателя от того, на что он указывает) неоправданно усложняют программу. Как показывает опыт, большинство ошибок в программах на С связано со сбоями в указателях.
Для того чтобы обеспечить поддержку косвенных ссылок, были выбраны переменные-указатели, наподобие тех, что реализованы в С++. Переменная-указатель содержит и тип данных, и указатель на данные. При использовании указатель в переменной автоматически изменяется. И невозможно разночтение между переменной-указателем и тем, что она указывает.
По материалам журналов "МирПК", "Clarion Magazine"
Подготовил Максим Костюченко
Эти особенности делают Clarion чрезвычайно привлекательным не только для программистов-профессионалов, но и для пользователей, не знакомых с программированием. К сожалению, несмотря на то, что он снискал себе заслуженную популярность не только в Америке (как никак это основной язык программирования Пентагона), но и в России, он не достаточно популярен в нашей стране. Отсутствие литературы, позволяющей широкому кругу пользователей и программистов познакомиться с этой технологией, а также местных дилеров TopSpeed Corporation определенным образом ограничивает поле деятельности белорусских разработчиков, работающих прежде всего на ниве экономических и административных приложений. Автор надеется, что данные публикации помогут восполнить образовавшийся пробел.
Как все начиналось
Стремление к универсальности
"Как это часто бывает, я просто пытался доставить себе удовольствие. Я купил свой первый персональный компьютер, смотрел на него и хотел писать программы для него. Это моя работа". С таких слов Брюс Д. Баррингтон, президент TopSpeed Corporation, начинал свое повествование об истории создания языка Clarion. Так зарождался Clarion, универсальный язык программирования со встроенными средствами управления БД. Да, именно стремление к универсальности предопределило создание Clarion.
"Моим стимулом в работе было убеждение, что программирование должно быть проще, что языки программирования должны облегчать чтение и написание программ и что низкая производительность, связанная с процессом разработки программ, коренится в неадекватных и слабо спроектированных инструментальных средствах программирования".
Разработка Clarion началась в 1984 г. Тогда существовало достаточно языков, ориентированных на административные и экономические задачи, но единственное, чего им не доставало, так это универсальности. По большому счету большинство представленных языков БД являли собой скорее набор инструкций, предназначенных для исполнения программой управления базами данных.
Работа над Clarion начиналась с "вечных вопросов": зачем каждый раз оформлять оператор IF в виде IF...THEN BEGIN; "операторы"; END ELSE...(Pascal)? Какой особый смысл ключевых слов THEN, BEGIN, END в этой структуре? Зачем пользоваться знаком ":=" вместо "=" в операторе присваивания (Pascal, Modula-2, ADA)? Почему до разработчика языка не доходило, что оператор присваивания - это самый распространенный оператор в программе, или что знак ":=" трудно набирать на клавиатуре, так как он состоит из комбинаций клавиш, нажимаемых с Shift и без него? Ну а предложение READ...AT END (COBOL), присваивающее значение переменной, которая проверяется для прекращения цикла чтения по достижению конца файла? Почему нельзя просто проверять в цикле конец файла? Почему, объявив переменную, нужно было напоминать компилятору, чтобы он преобразовывал ее в выражении с переменными различных типов. Компилятор не мог помнить об этом сам?
"Вспомните ШЕСТНАДЦАТИРИЧНЫЕ ДАМПЫ! Двадцать лет программирования породили во мне такое чувство, как у главного героя фильма "Сеть", который, высунувшись из окна, закричал: "Я с ума сойду. Я не могу больше этого выносить!"
В качестве ключевых ориентиров при создании Clarion были выбраны компактность (простота написания) и выразительность (простота чтения). Разработчики продвигались в направлении, противоположном общепринятому: сначала было написано много программ с целью экспериментов над синтаксисом и семантикой, пока они не стали на что-то похожи. Потом была проделана работа над небольшим справочником по языку. Когда он был закончен, программисты начали писать компилятор.
"Язык менялся ежедневно. Недавно я перечитал старые записки разработчиков и вспомнил, сколько раз и сколькими людьми был обдуман каждый элемент языка. Одни идеи предлагались и отвергались по эстетическим соображениям, другие - в силу их слабой технологичности, были и просто безумные мысли. Уцелели, по Дарвину, только сильные".
С точки зрения стиля языки программирования можно разделить на три группы: ориентированные на лексемы, на предложения и на операторы. Языки, ориентированные на лексемы, типа Pascal и С, компактны, но не очень выразительны. В этих языках программа - набор лексем (ключевых слов, имен данных, констант, знаков пунктуации и т.д.), разделенных "пропусками" (пробелами, символами CR/LF (возврат каретки и новая строка), комментариями и иногда запятыми). Компилятор собирает лексемы и игнорирует пропуски. Языки лексемного типа - одномерные, поэтому программисты пользуются пропусками, чтобы добавить своей программе второе измерение.
Языки, ориентированные на предложения, типа языков баз данных, выразительны, но не очень компактны. Иногда операторы этих языков читаются в точности как английские предложения.
В своих экспериментах программисты Clarion ориентировались на операторы - старомодный стиль FORTRAN и BASIC. В языках, ориентированных на операторы, программа существует в виде ASCII-файлов с исходным текстом - каждая строка программы соответствует записи файла. Поэтому вместо знаков препинания можно воспользоваться границами записей. Выбранный формат оператора оказался компактным, выразительным и универсальным:
метка ОПЕРАТОР[(параметры)], [АТРИБУТЫ[(параметры)]]...
Атрибуты нужны только для объявления данных. Исполняемые операторы используют формат стандартного вызова процедур. И было определено несколько форматов операторов присваивания (А=В) и операторов управления (IF, CASE, и т.д.). Метка оператора начинается с первой колонки (первая позиция записи). Оператор заканчивается символом конца строки, если не продолжается на следующую строку с помощью символа "|" (вертикальная черта). Кроме того, для разделения нескольких операторов на одной строке можно использовать ";" (точка с запятой). Игнорируя пустые операторы, как в языке Modula-2, разработчики Clarion устранили различия между разделителями операторов и признаками конца операторов.
Такое построение предложений языка позволило избавиться от знаков пунктуации, необходимых в противном случае для идентификации меток и отдельных операторов. Блок операторов начинается со сложного оператора типа IF и заканчивается разделителем типа ELSE (который сам начинает блок операторов) или оператором END (или точкой).
Объявление данных
В качестве языка административных и экономических применений Cla-rion нуждался в развитом наборе базовых типов данных: были включены все имеющиеся длины целых и действительных чисел, чтобы обеспечить совместимость с форматом внешних записей и списком параметров. Упакованные десятичные числа были включены, чтобы решить проблемы округления величин и уменьшить потребности в памяти (они могут быть объявлены в зависимости от диапазона значений). Были также включены различные параметры строк (фиксированный формат, форматы Pascal и С), а также полный набор строковых функций. И наконец, были разработаны типы данных для обозначения дат и времени, чтобы иметь возможность производить арифметические действия над этими переменными (например, Tomorrow=Today+1 (Завтра=Сегодня+1)).
Оставался без ответа один важный вопрос: нужны ли языку Clarion типы, определенные пользователем? В языках с объявлением типов группы и массивы объявляются как типы: сначала объявляется тип, а потом экземпляр этого типа, задающий переменную. Но в программах экономического характера большинство групп и массивов объявляются только один раз. Обдумывание имени типа и кодирование оператора - это обычно ненужная работа. Вообще это спорно считать группу или массив типом данных. Группы и массивы описывают не типы данных, а то, как эти данные располагаются в памяти.
Поэтому в Clarion объявление типов данных было сделано необязательным. Оператор объявления с атрибутом TYPE объявляет тип данных, который можно использовать для повторяющихся структур, передаваемых в качестве параметров. Оператор объявления без атрибута TYPE объявляет и тип данных и имя переменной.
Типы данных
Язык программирования называется строго типизированным, если каждый элемент данных имеет свой единственный тип, и синтаксис языка запрещает рассматривать этот элемент как другой тип данных. Многие эксперты считают, что строгое типизирование повышает надежность программ. Может быть. Но писать программы становится труднее, поскольку ограничивается сфера действия универсальных процедур и требуется дополнительный контроль за типом данных. Было важно, чтобы типы данных Clarion допускали простое построение процедур общего характера. Если процедура ожидает числовой параметр, то должен быть допустим параметр любого числового типа данных. Было смешно требовать наличия разных числовых функций, которые манипулируют данными разных числовых типов, как это имело место в производных от ALGOL языках. Больше того, полиморфизм, реализованный в С++, который предполагает отдельные функции для каждого типа данных, но который позволяет обращаться к ним по одному и тому же имени функции, представляет собой чисто внешнюю симуляцию полиморфизма.
В первоначальной версии языка Clarion параметры даже не надо было описывать в прототипе. Процедура использовала все, что бы ни было указано в списке аргументов при вызове. Сейчас Clarion требует, чтобы параметры были представлены в прототипе, но допускает отсутствие типа данных параметра. Относительно неструктурированных типов данных процедуры в Clarion всегда были истинно полиморфными.
Параметры в Clarion представляются в прототипе для того, чтобы передаваться посредством адреса или самим значением. Сам же язык указатели не поддерживает. По двум причинам: во-первых, указатели не несут в себе информации о типе данных и легко могут быть нарушены. Во-вторых, обозначения косвенных ссылок (синтаксические отличия указателя от того, на что он указывает) неоправданно усложняют программу. Как показывает опыт, большинство ошибок в программах на С связано со сбоями в указателях.
Для того чтобы обеспечить поддержку косвенных ссылок, были выбраны переменные-указатели, наподобие тех, что реализованы в С++. Переменная-указатель содержит и тип данных, и указатель на данные. При использовании указатель в переменной автоматически изменяется. И невозможно разночтение между переменной-указателем и тем, что она указывает.
По материалам журналов "МирПК", "Clarion Magazine"
Подготовил Максим Костюченко
Компьютерная газета. Статья была опубликована в номере 13 за 1999 год в рубрике программирование :: разное