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
- The (very unofficial) History of JPI, Clarion and SoftVelocity
- Clarion: мощное оружие, бьющее точно в цель
- Clarion: мощное оружие, бьющее точно в цель. Часть 2
- Clarion: мощное оружие, бьющее точно в цель. Часть 3
- Wikipedia: Clarion (programming language)
- Wikipedia: Clarion (язык программирования)
- Wikipedia: JPI
Примеры:
Факториал:
Пример для версий 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
]]>