]]> ]]>
Править | Обсудить | История

Clarion

Русское название:
Кларион
Дата создания:
1984
Создан под влиянием:
Парадигма:
Типизация:
Принятые расширения файлов:
*.cla *.clw
Диалекты:
Реализации и версии (свернуть все | развернуть все):
Язык программирования

Язык программирования Clarion был разработан Брюсом Баррингтоном в 1984 г. В своей статье он так описывает историю его создания: «Как это часто бывает, я просто пытался доставить себе удовольствие. Я купил свой первый персональный компьютер, смотрел на него и хотел писать программы для него. Это моя работа. Моим стимулом в работе было убеждение, что программирование должно быть проще, что языки программирования должны облегчать чтение и написание программ и что низкая производительность, связанная с процессом разработки программ, коренится в неадекватных и слабо спроектированных инструментальных средствах программирования». Первоначально проект создавался в рамках компании “HBO & Company”, но затем был выкуплен McKesson Corporation.

Clarion как язык программирования создавался для быстрой разработки деловых приложений и поэтому относится к категории 4GL языков. А система разработки Clarion относится к семейству RAD-систем (от англ. rapid application development — быстрая разработка приложений).

Основными особенностями языка и среды программирования являются:

— наличие мощного языка шаблонов, который позволяет на основании предлагаемых разработчиком шаблонов осуществить генерацию работоспособного кода за считанные минуты. В шалонах, там где это целесообразно, имеются «точки вставки» (embeds), куда разработчик может вставить свой собственный код, который будет вставлен в сгенерированный текст программы. Эти шаблоны открыты для модификации, а язык шаблонов позволяет добавлять новые возможности, в том числе даже не предусмотренные создателями Clarion.

— механизм замещаемых драйверов данных. Работа с файлами данных строится на основании имеющихся в системе драйверов баз данных. Поэтому сам язык абстрагирован от конкретных форматов файлов данных. В настоящее время поддерживается работа со следующими форматами (ISAM: TopSpeed, Clarion, DBF, FoxPro, Clipper, Btrieve, SQL: MSSQL, Oracle, Pervasive SQL, SQLAnywhere, SQLite, ODBC). Интересно, что работа с текстовыми и бинарными файлами в Clarion также рассматривается как работа с неким абстрактым форматом БД.

— наличие в среде программирования словаря данных (депозитория данных), в котором описываются используемые в программе таблицы баз данных с описанием для каждой таблицы полей, ключей, используемых драйверов БД. Таким образом данные выделяются из текста программы, в который они попадут впоследствии при помощи имеющихся шаблонов генерации кода программы. Выделение данных в депозиторий приводит к тому, что табличные данные можно легко модифицировать, в том числе модификация полей, описание ключей и индексов, описание связей между таблицами, управление каскадностью операций с записями. Каскадность может быть реализована как средствами Clarion (используются стандартные шаблоны), так и отдана в управление серверу. Кроме того есть возможность написания внутрикларионовских триггеров для таблиц любого формата (от ISAM до SQL).

По синтаксису Clarion похож на языки Pascal и, в особенности, Modula-2 — программный код заключается в конструкции “начало-конец”. Из Modula-2 унаследованы операторы IF и LOOP. От языка Си язык почерпнул такие унарные операции как -=, +=, *=, /=, а также операторы управления циклами BREAK и CONTINUE. Есть у языка и свои собственные оригинальные конструкции, например EXECUTE и CASE. Вот как, например, выглядит оператор ветвления CASE:

CASE <выражение> {[OF <выражение1>: <операторы> ! единственное значение]| [OF <выражение2> OROF <выражение3>: <операторы> ! перечисление]| [OF <выражение4> TO <выражение5>: <операторы> ! диапазон]} [ELSE <операторы>] END

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

Среда программирования обладает быстрым компилятором TopSpeed (JPI). Наряду с бизнес-приложениями на языке можно реализовывать системные утилиты, позволяющие взаимодействовать с операционной системой на низком уровне не менее эффективно, чем программам, написанным на общепринятых языках «низкого уровня» таким, как Ассемблер, Си.

Сейчас это мощный и одновременно простой в освоении универсальный язык программирования со встроенными средствами управления БД, на различных версиях которого можно разрабатывать программы для DOS, Microsoft Windows, .Net Framework.

Элементы синтаксиса:

Комментарий до конца строки ! comment
Комментарии, которые не могут быть вложенными {OMIT|COMPILE}('Some text') ... Some text
Регистрозависимость нет
Присваивание значения переменной varname = value
Объявление переменной i LONG, j STRING(32)
Объявление переменной с присваиванием значения i LONG(0), j STRING('Some value')
Группировка выражений ( ... )
Блок BEGIN ... {END|.}
Равенство =
Неравенство >, >=, =>, <, <=, =<, NOT>, NOT<, ~>, ~<
Тождественное равенство =
Тождественное неравенство <>, ~=, NOT=
Сравнение =, <>, >, >=, <, <=
Определение функции MyFunc(Par1 *LONG, Par2 STRING), LONG
Вызов функции RetVal = MyFunc(Var1,'Text')
Вызов функции без параметров RetVal = MyFunc2()
Последовательность {;|перевод строки}
Если - то IF c {THEN|перевод строки} b {END|.}
Если - то - иначе IF c1 {THEN|перевод строки} b1 [ELSIF c2 {THEN|перевод строки} b2] [ELSE b3] {END|.}
Бесконечный цикл LOOP ... {END|.}
Цикл с предусловием LOOP {WHILE c1|UNTIL c2} ... {END|.}
Цикл с постусловием LOOP ... {WHILE c1|UNTIL c2}
Цикл for - next для диапазона целых чисел с инкрементом на 1 LOOP i# = 1 to 100 [by 1] ... {END|.} или LOOP 100 TIMES ... {END|.}
Цикл for - next для диапазона целых чисел с декрементом на 1 LOOP i# = 100 to 1 by -1 ... {END|.}

Примеры:

Факториал:

Пример для версий Clarion C10

используется рекурсия. вычисляются 20 членов ряда.

1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 362880 10! = 3628800 11! = 39916800 12! = 479001600 13! = 6227020800 14! = 87178291200 15! = 1307674368000 16! = 20922789888000 17! = 355687428096000 18! = 6402373705728000 19! = 121645100408832000 20! = 2432902008176640000

  PROGRAM

OMIT('***')
 * User: Shur
 * Date: 29.02.2016
 * Time: 23:49
 ***

  MAP
      include('i64.inc')
Factorial PROCEDURE(SHORT,*INT64 a)
ShowINT64  PROCEDURE(*INT64 a),STRING
  END

a                    LIKE(INT64)
b                    LIKE(INT64)
c                    LIKE(INT64)
str1                 CSTRING(32000)
str2                 CSTRING(32000)

   CODE       
      Factorial(20,a)
      message(str1,'Factorial',,,,10b)

Factorial            PROCEDURE(SHORT n,*INT64 a)
b like(INT64)
   CODE
      if n = 1 then
         i64Assign(a,1)
         str1 = '1! = 1'
         RETURN
      .
      i64Assign(b,n)     
      Factorial(n-1,a)
      if a.lo = 0 and a.hi = 0
         RETURN
      .   
      i64Mult(a,b,c)
      if i64Sign(c) = -1 
         i64Assign(a,0)
         RETURN
      .   
      a :=: c
      str1 = str1 & '|' & n & '! = ' & ShowINT64(a)
      
ShowINT64           PROCEDURE(a)
d DECIMAL(30,0)
   CODE
      i64ToDecimal(d,a)
      return(d)

Числа Фибоначчи:

Пример для версий Clarion C10

использование 64-битной арифметики

  PROGRAM

OMIT('***')
 * User: Shur
 * Date: 29.02.2016
 * Time: 21:18
 ***

  MAP
      include('i64.inc')
ShowINT64  PROCEDURE(*INT64 a),STRING
  END

a                    LIKE(INT64)
b                    LIKE(INT64)
c                    LIKE(INT64)
str1                 CSTRING(32000)
str2                 CSTRING(32000)

   CODE
      a.lo = 1
      str1 = '1=' & ShowINT64(a)         
      b.lo = 1
      str1 = str1 & '|2=' & ShowINT64(b) 
      str2 ='1, 1'
      loop i# = 3 to 200 
         i64Add(a,b,c)
         if i64Sign(c) = -1
            break
         end   
         a :=: b ! deep assignment uses for structures
         b = c   ! usual assignment can be also used     
         str1 = str1 & '|' & i# & '=' & ShowINT64(c)         
         str2 = str2 & ', ' & ShowINT64(c)         
      end
      message(str2,'Fibonacci',,,,10b)
      message(str1,'Fibonacci',,,,10b)
            
ShowINT64           PROCEDURE(a)
d DECIMAL(30,0)
   CODE
      i64ToDecimal(d,a)
      return(d)

Квадратное уравнение:

Пример для версий Clarion C7

максималистичная версия с проверкой найденных корней. попутно реализована арифметика комплексных чисел

   PROGRAM

OMIT('***')
 * User: Shur
 * Date: 28.02.2016
 * Time: 14:05
 ***
complex          GROUP,TYPE
a                       REAL(0)
b                       REAL(0)
                 END

  MAP
cxSum             PROCEDURE(*complex cxA, *complex cxB, *complex cxRes)
cxMul             PROCEDURE(*complex cxA, *complex cxB, *complex cxRes)
cxDiv             PROCEDURE(*complex cxA, *complex cxB, *complex cxRes)
  END

A REAL
B REAL
C REAL

X                   GROUP,PRE(X),DIM(2)
X                       LIKE(complex)
F                       CSTRING(64)
R                       LIKE(complex)
                     END

root               CSTRING(64)
check_               CSTRING(256)

CX1                   LIKE(complex)
CX2                   LIKE(complex)
CX3                   LIKE(complex)

   CODE
      A=1; B=3; C=3
      !A=1; B=-5; C=3
      !A=1; B=2; C=1
      D$ = B * B - 4 * A * C
      if A = 0
         root = 'Not a quadratic equation.'
      elsif D$ = 0
         X[1].X.a = -B/2/A
         root = 'x = ' & X[1].X.a
      elsif D$ > 0 then
         X[1].X.a = (-B-sqrt(D$))/2/A         
         X[2].X.a = (-B+sqrt(D$))/2/A         
         root = 'x1 = ' & X[1].X.a & '|' & |
                  'x2 = ' & X[2].X.a
      else   
         X[1].X.a = -B/2/A; X[1].X.b = sqrt(-D$)/2/A         
         X[2].X.a = -B/2/A; X[2].X.b = -sqrt(-D$)/2/A         
         root = 'x1 = (' & X[1].X.a & ', ' & X[1].X.b & ')' & '|' & | 
                'x2 = (' & X[2].X.a & ', ' & X[2].X.b & ')'
      end
      loop i# = 1 to 2 
         !loop j# = 1 to 2 
            if X[i#].X.a or X[i#].X.b
               if D$ ~< 0
                  X[i#].F = choose(A=0,'',A&'*'&X[i#].X.a&'^2')&choose(B=0,'',choose(B>0,'+','')&B&'*'&X[i#].X.a)&choose(C=0,'',choose(C>0,'+','')&C)
                  X[i#].R.a = round(EVALUATE(X[i#].F),0.0000000000001)
                  check_ = check_ & choose(check_<>'','|','') & X[i#].F&'=' & X[i#].R.a
               else   
                  CX1.a = X[i#].X.a; CX1.b = X[i#].X.b
                  CX2.a = A; CX2.b = 0
                  cxMul(CX1, CX1, CX3) ! x^2
                  cxMul(CX2, CX3, CX3) ! a*x^2
                  X[i#].R = CX3
                  CX2.a = B; CX2.b = 0
                  cxMul(CX1, CX2, CX3) ! b*x
                  CX2 = X[i#].R
                  cxSum(CX2,CX3,CX1) ! a*x^2 + b*x
                  X[i#].R = CX1
                  CX2.a = C; CX2.b = 0
                  cxSum(CX1,CX2,CX3) ! a*x^2 + b*x + c
                  X[i#].R = CX3
                  check_ = check_ & choose(check_<>'','|','') &'= (' & X[i#].R.a & ', ' & X[i#].R.b & ')'
               end   
            end   
         !end   
      end   
      message(choose(A=0,'','D='&D$&'|----------|')&|
         root&|
         choose(A=0,'',choose(check_>'',|
         '|----------|'&|
         check_,'')),'Quadratic equation')

cxSum            PROCEDURE(cxA, cxB, cxRes)
      CODE
         cxRes.a = cxA.a + cxB.a
         cxRes.b = cxA.b + cxB.b

cxMul            PROCEDURE(cxA, cxB, cxRes)
      CODE
         cxRes.a = cxA.a*cxB.a - cxA.b*cxB.b
         cxRes.b = cxA.a*cxB.b + cxB.a*cxA.b

cxDiv            PROCEDURE(cxA, cxB, cxRes)
      CODE
         cxRes.a = (cxA.a*cxB.a + cxA.b*cxB.b) / (cxB.a^2 + cxB.a^2)
         cxRes.b = (cxB.a*cxA.b - cxB.b*cxA.a) / (cxB.a^2 + cxB.a^2)

Квадратное уравнение:

Пример для версий Clarion C7

минималистическая версия

   PROGRAM

OMIT('***')
 * User: Shur
 * Date: 28.02.2016
 * Time: 14:05
 ***
  MAP
  END

A REAL
B REAL
C REAL

root               CSTRING(64)

   CODE
      
      A=0; B=2; C=3
      !A=1; B=-5; C=3
      !A=1; B=2; C=1
      
      D$ = B * B - 4 * A * C
      if A = 0
         root = 'Not a quadratic equation.'
      elsif D$ = 0
         root = 'x = ' & -B/2/A
      elsif D$ > 0 then
         root = 'x1 = ' & (-B-sqrt(D$))/2/A & '|' & |
                  'x2 = ' & (-B+sqrt(D$))/2/A
      else   
         root = 'x1 = (' & -B/2/A & ', ' &  sqrt(-D$)/2/A & ')' & '|' & | 
                  'x2 = (' & -B/2/A & ', ' & -sqrt(-D$)/2/A & ')'
      end
      message(choose(A=0,'','D='&D$&'|----------|')&root,'Quadratic equation')

Hello, World!:

Пример для версий Clarion C7
   PROGRAM
     MAP
     END
   CODE
     MESSAGE('Hello World!','Clarion')
     RETURN

CamelCase:

Пример для версий Clarion C7
  PROGRAM

  MAP
  END

InitStr              STRING('Some string with any symbols')
Str                  CSTRING(100),AUTO
symbol               STRING(1)

   CODE
      j# = 1 ! implicit variable
      loop i# = 1 to len(InitStr) by 1
         symbol = lower(InitStr[i#]) ! string can be considered as array
         case symbol
         of 'a' to 'z'
            Str[j#] = choose(was_letter#,symbol,upper(symbol))
            j# += 1 ! using of add equals operator for increment
            was_letter# = TRUE
         else 
            was_letter# = FALSE
         end   
      end   
      message(Str,'CamelCase')

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам