맨위로가기

REXX

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

REXX는 1979년 마이크 콜리셔에 의해 개발된 스크립트 프로그래밍 언어이다. 처음에는 EXEC 및 EXEC 2 언어를 대체하기 위해 설계되었으며, 다양한 운영 체제에서 매크로 및 스크립트 언어로 사용되었다. IBM의 VM/CMS에서 시작하여 SAA의 표준 절차적 언어로 채택되었고, OS/2, PC DOS 등에서도 널리 사용되었다. 1990년대 중반 이후 Java 바이트 코드로 컴파일되는 NetRexx와 객체 지향 버전인 Object REXX가 등장했다. 1996년에는 ANSI에서 Rexx 표준을 발표했으며, 2004년에는 25주년을 기념했다. REXX는 문자열 기반이며, 동적 자료형, 자유 형식 문법, 다양한 내장 함수를 제공하며, 오류 처리 및 예외 처리를 위한 기능을 갖추고 있다. RexxUtil, Rexx/Tk, RxxxEd 등의 툴킷이 개발되어 REXX 개발을 지원한다.

더 읽어볼만한 페이지

  • 셸 - 파워셸
    파워셸은 마이크로소프트에서 개발한 작업 자동화 솔루션으로, 명령줄 셸과 스크립트 언어의 기능을 결합하여 윈도우 시스템 관리를 위해 설계되었으며, .NET 프레임워크 기반의 객체 지향적 특징을 갖고 다양한 플랫폼에서 자동화 스크립트 작성 및 실행, 시스템 구성 관리 등에 활용된다.
  • 셸 - COMMAND.COM
    COMMAND.COM은 MS-DOS 운영체제에서 명령줄 인터페이스를 제공하는 명령어 해석기로, 파일 관리 및 프로그램 실행 등의 작업을 수행하며, 윈도우 9x에서 MS-DOS 호환성을 위해, FreeDOS에서는 핵심 구성 요소로 사용된다.
  • 텍스트 지향 프로그래밍 언어 - Tcl
    Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다.
  • 텍스트 지향 프로그래밍 언어 - PHP
    PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
REXX - [IT 관련 정보]에 관한 문서
개요
REXX 로고
REXX 로고
패러다임멀티 패러다임 프로그래밍 언어: 절차적 프로그래밍, 구조적 프로그래밍
발표 연도1979년
설계자마이크 카울리쇼(영어)
개발자마이크 카울리쇼, IBM
최신 릴리스 버전ANSI X3.274
최신 릴리스 날짜1996년
타이핑동적
구현체VM/SP R3, TSO/E V2, SAAREXX, ARexx, BREXX, Regina, Personal REXX, REXX/imc
방언NetRexx, Object REXX, 현재 ooREXX, KEXX
영향을 준 언어PL/I, ALGOL, EXEC, EXEC 2
영향을 받은 언어NetRexx, Object REXX
파일 확장자.cmd, .bat, .exec, .rexx, .rex, EXEC
위키책Rexx Programming

2. 역사

REXX는 1979년 3월 20일부터 1982년 중순까지 IBM의 마이크 콜리셔에 의해 어셈블리어로 설계되어 처음 구현되었다.[27] 이 언어는 원래 EXEC와 EXEC 2를 대체할 스크립트 프로그래밍 언어로, 모든 시스템을 위한 매크로나 스크립트 언어가 되도록 설계되었다. 또한 REXX는 PL/I 프로그래밍 언어의 간소화된 버전으로 고안되었다.

1981년 텍사스주 휴스턴에서 열린 SHARE 56 콘퍼런스에서 처음 공개되었고,[28] SLAC의 테드 존스턴이 주도한 고객 반응에 힘입어 1982년 IBM 제품으로 출시되었다.

이후 IBM은 REXX를 VM/CMS, MVS TSO/E, IBM OS/400, VSE/ESA, AIX, PC DOS, OS/2 등 거의 모든 운영 체제에 포함시켰으며, 노벨 넷웨어, 윈도우, 자바, 리눅스용 버전도 출시했다.

최초의 비-IBM 버전은 1984/5년에 찰스 데니가 PC DOS용으로 작성했으며,[13] 1986년 케빈 J. 카니가 설립한 Mansfield Software Group에서 판매했다.[11] 1987년에는 룬딘과 우드러프가 CMS용 최초의 컴파일러 버전을 작성했다.[14] 아타리, 아미가OS, 유닉스, 솔라리스, DEC, 윈도우, 윈도우 CE, 포켓 PC, DOS, 팜 OS, QNX, OS/2, 리눅스, BeOS, EPOC32/심비안, AtheOS, OpenVMS,[22] 애플Mac OS X 등에서도 다른 버전들이 개발되었다.[15]

1990년, SLAC의 캐시 데이거는 최초의 독립적인 REXX 심포지엄을 조직했으며, 이는 REXX 언어 협회의 설립으로 이어졌다.

1992년에는 이안 콜리어의 Unix용 REXX/imc와 Anders Christensen의 Regina(나중에 Mark Hessling에 의해 채택됨) 등 두 개의 널리 사용되는 오픈 소스 소프트웨어 포트가 등장했다. [http://ftp.gwdg.de/pub/languages/rexx/brexx/html/rx.html BREXX]는 WinCE 및 Pocket PC 플랫폼으로 잘 알려져 있으며, VM/370 및 MVS로 "역이식"되었다.

1990년대 중반 이후, REXX의 두 가지 새로운 변형인 NetRexx와 Object REXX가 등장했다.

1996년, 미국 국립 표준 협회(ANSI)는 REXX 표준(ANSI X3.274–1996 "정보 기술 – 프로그래밍 언어 REXX")을 발표했다.[16]

REXX는 2004년 3월 20일에 25주년을 맞이했으며, 이를 기념하여 2004년 5월 독일 뵈블링겐에서 REXX 언어 협회의 제15회 국제 REXX 심포지엄이 개최되었다.

2004년 10월 12일, IBM은 Common Public License 하에 Object REXX 구현 소스를 공개할 계획을 발표했고, 2005년 2월 22일, Open Object Rexx (ooRexx)의 첫 번째 공개 릴리스가 발표되었다.

2019년, 제30회 REXX 언어 협회 심포지엄은 REXX의 40주년을 기념하여 REXX가 처음 설계되고 구현된 영국 허슬리에서 개최되었다.[18]

원래 이 언어는 ''렉스''(Reformed Executor)라고 불렸으며, 다른 제품 이름과의 충돌을 피하기 위해 "X"가 추가되었다. REX는 당시 메인프레임 코드가 대문자 위주였기 때문에 원래 대문자로 표기되었다. 제품 이름은 REXX가 되었고, 마이크 카울리쇼의 두 판의 책 모두 대문자를 사용했다. ''REstructured eXtended eXecutor''로의 확장은 1984년 시스템 제품에 사용되었다.[10]

2. 1. 초기 개발

마이크 콜리셔는 1979년 3월 20일부터 1982년 중순까지 어셈블리어로 REXX를 처음 설계하고 구현했다.[27] 이는 개인적인 프로젝트였으며, 원래 EXEC, EXEC 2를 대체할 스크립트 프로그래밍 언어를 목표로 했다.[27] REXX는 모든 시스템을 위한 매크로나 스크립트 언어가 되도록 설계되었으며, PL/I 프로그래밍 언어의 단순화된 버전을 지향했다.[27]

1981년 텍사스주 휴스턴에서 열린 SHARE 56 콘퍼런스에서 REXX가 처음으로 공개되었다.[28]

2. 2. IBM 제품 출시 및 확산

1982년 IBM은 고객 반응에 힘입어 REXX를 제품으로 출시했다.[28] 이후 IBM은 REXX를 VM/CMS, MVS TSO/E, IBM OS/400, VSE/ESA, AIX, PC DOS, OS/2 등 거의 모든 운영 체제에 포함시켰다.[11] 노벨 넷웨어, 윈도우, 자바, 리눅스용 버전도 출시되었다.

1984년 찰스 데니가 PC DOS용 최초의 비-IBM REXX 버전을 작성했고,[13] 1986년 케빈 J. 카니가 설립한 Mansfield Software Group에서 판매했다.[11] 1987년에는 룬딘과 우드러프가 CMS용 최초의 컴파일러 버전을 작성했다.[14]

2. 3. 비 IBM 버전 및 오픈 소스화

찰스 데니는 1984/5년에 PC DOS용 REXX를 작성했으며,[13] 이는 1986년 케빈 J. 카니가 설립한 Mansfield Software Group에서 판매했다.[11] 룬딘과 우드러프는 1987년에 CMS용으로 최초의 컴파일러 버전을 작성했다.[14] 아타리, 아미가OS, 유닉스, 솔라리스, DEC, 윈도우, 윈도우 CE, 포켓 PC, DOS, 팜 OS, QNX, OS/2, 리눅스, BeOS, EPOC32/심비안, AtheOS, OpenVMS,[22] 애플 매킨토시, Mac OS X 등에서도 다른 버전들이 개발되었다.[15]

1990년, SLAC의 캐시 데이거는 최초의 독립적인 REXX 심포지엄을 조직했으며, 이는 REXX 언어 협회의 설립으로 이어졌다.

1992년에는 이안 콜리어의 Unix용 REXX/imc와 Anders Christensen의 Regina[5](나중에 Mark Hessling에 의해 채택됨)와 같은 널리 사용되는 두 가지 오픈 소스 소프트웨어 포트가 등장했다. [http://ftp.gwdg.de/pub/languages/rexx/brexx/html/rx.html BREXX]는 WinCE 및 Pocket PC 플랫폼으로 잘 알려져 있으며, VM/370 및 MVS로 "역이식"되었다.

1990년대 중반 이후, Rexx의 두 가지 새로운 변형이 등장했다.

  • NetRexx: Java 바이트 코드로 컴파일되며, Java 소스 코드를 거친다.
  • Object REXX: 일반적인 상위 호환 객체 지향 Rexx 버전이다.


2004년 10월 12일, IBM은 Common Public License 하에 Object REXX 구현의 소스를 공개할 계획을 발표했다. 2005년 2월 22일, Open Object Rexx (ooRexx)의 첫 번째 공개 릴리스가 발표되었다.

2. 4. 최근 동향

REXX는 2004년 3월 20일에 25주년을 맞이했으며, 이를 기념하여 2004년 5월 독일 뵈블링겐에서 REXX 언어 협회의 제15회 국제 REXX 심포지엄이 개최되었다.[16]

2017년 1월 기준으로, REXX는 TIOBE index에서 상위 50위 안에 들지 못했다.[17]

2019년에는 REXX의 40주년을 기념하여 제30회 Rexx 언어 협회 심포지엄이 영국 허슬리에서 개최되었다. 허슬리는 Rexx가 처음 설계되고 구현된 곳이다.[18]

3. 특징

REXX는 문자열 기반의 동적 자료형을 사용하는 프로그래밍 언어이다. 별도의 선언 없이 변수를 사용할 수 있으며, 예약어가 거의 없어 (로컬 환경 제외) 유연하게 코드를 작성할 수 있다.[10] 다배장 정수 및 부동 소수점 연산을 지원하며, 자체 함수를 만들거나 시스템 명령 및 기능에 직접 접근할 수 있다.[10] 자동 메모리 관리 기능을 제공하여 충돌을 방지하고, 연관 배열을 지원한다.[10] 오류 관리, 자체 추적 및 오류 정정 기능이 내장되어 있어 디버깅이 용이하며, 사용상의 제약이 거의 없다.[10]

REXX의 주요 특징은 다음과 같다.

특징설명
단순한 구문23개의 명령어로 구성, 최소한의 구두점과 형식 요구[10]
자유 형식자유 형식 언어[10]
대소문자 구분 없음변수 이름을 포함한 토큰은 대소문자를 구분하지 않음[10]
문자열 기반모든 데이터는 문자열로 처리[10]
동적 데이터 형식변수 선언 불필요[10]
예약어 없음로컬 컨텍스트 제외[10]
임의 정밀도임의 정밀도 산술 지원[10]
십진 산술, 부동 소수점부동 소수점 연산 지원[10]
다양한 내장 함수특히 문자열 및 단어 처리 함수[10]
자동 저장소 관리메모리 자동 관리[10]
연관 배열연관 배열 지원[10]
시스템 접근시스템 명령 및 기능에 대한 간단한 접근[10]
오류 처리단순한 오류 처리, 내장 추적 및 디버거[10]
기타특정 구현을 제외하고는 Unix 스타일 명령줄 매개변수를 부분적으로만 지원[10]



REXX는 초보자도 쉽게 배울 수 있도록 설계되어, 3~7일 정도면 간단한 텍스트 필터를 만들 수 있다. 구조화된 제어문( `DO` 루프, `CALL`, `IF`, `SELECT` 등)과 변수 범위를 지원한다. 선언 없이 사용되는 변수는 대문자로 변환된 이름으로 취급되며, 숫자형과 문자열형은 자동으로 변환된다. 변수는 동적으로 생성 및 소멸되며, 문자열을 첨자로 사용하는 연관 배열을 활용할 수 있다. 템플릿 매칭을 통한 파싱을 표준으로 사용하고, 쉘 명령어 실행도 용이하다. 다만, 제공되는 데이터 구조는 스택과 큐로 제한되며, 리스트 구조는 제공되지 않는다.

3. 1. 일반적인 특징

REXX는 다음과 같은 특징을 가지고 있다.

  • 단순한 구문[10]
  • 자유 형식[10]
  • 대소문자를 구분하지 않는 토큰 (변수 이름 포함)[10]
  • 문자열 기반[10]
  • 동적 데이터 형식 지정 (선언 불필요)[10]
  • 로컬 컨텍스트를 제외하고 예약어 없음[10]
  • 임의 정밀도 산술[10]
  • 십진 산술, 부동 소수점[10]
  • 다양한 내장 함수 (특히 문자열 및 단어 처리)[10]
  • 자동 저장소 관리[10]
  • 연관 배열[10]
  • 간소화된 입출력 기능[10]
  • 단순한 오류 처리, 내장 추적 및 디버거[10]


REXX는 23개의 명령어로 구성되며, 최소한의 구두점과 형식 요구 사항을 갖는 거의 자유 형식 언어이다. 기본적으로 단 하나의 데이터 형식인 문자열을 가지며, 모든 데이터가 표시(기호)되므로 디버깅 및 추적이 단순화된다.[10]

REXX의 구문은 PL/I와 유사하지만 표기법이 적어 사용하기 쉽다. 그러나 PL/I와 몇 가지 차이점이 있어 주의하지 않으면 혼란을 겪을 수 있다.[11]

아미가OS에 포함된 아미가 버전의 렉스인 ARexx는 스크립팅과 애플리케이션 제어에 널리 사용되었다. 많은 아미가 애플리케이션에는 렉스에서 애플리케이션을 제어할 수 있도록 하는 "ARexx 포트"가 내장되어 있다. 단일 렉스 스크립트는 여러 실행 중인 애플리케이션을 제어하기 위해 서로 다른 렉스 포트 간에 전환할 수도 있었다.

3. 2. 언어적 특징

Rexx는 다음과 같은 특징을 갖는다.

  • 단순한 구문[10]
  • 24개의 명령어로 구성된 작은 명령어 집합[10]
  • 자유 형식 구문[10]
  • 변수 이름을 포함한 대소문자를 구분하지 않는 토큰[10]
  • 문자열 기반[10]
  • 동적 데이터 형식 지정으로, 변수 선언 불필요[10]
  • 예약어 없음 (로컬 컨텍스트 제외)[10]
  • include 파일 기능 없음[10]
  • 임의의 수치 정밀도[10]
  • 십진 산술, 부동 소수점[10]
  • 다양한 내장 함수 (특히 문자열 및 단어 처리)[10]
  • 자동 저장소 관리[10]
  • 연관 배열[10]
  • 시스템 명령 및 기능에 대한 간단한 접근[10]
  • 단순한 오류 처리, 내장 추적 및 디버거[10]
  • 특정 구현을 제외하고는 Unix 스타일 명령줄 매개변수를 부분적으로만 지원[10]


Rexx는 23개의 명령( `call`, `parse`, `select` 등)으로 구성되며, 최소한의 구두점과 형식 요구 사항을 갖는다. Rexx는 기본적으로 단 하나의 데이터 형식인 문자열을 가진 거의 자유 형식 언어이다. 모든 데이터가 표시(기호)되므로 디버깅 및 추적이 단순화된다.[10]

Rexx의 구문은 PL/I와 유사하지만 표기법이 적다. 이로 인해 (프로그램으로) 구문 분석하기는 어렵지만 사용하기는 더 쉬워진다. 단, PL/I 습관이 예상치 못한 결과를 초래할 수 있는 경우는 예외이다. REXX 설계 목표 중 하나는 최소 놀라움의 원칙이었다.[10]

REXX 언어의 추가적인 특징은 다음과 같다.

  • 초보자도 대략 3~7일 정도면 간단한 텍스트 필터를 만들 수 있을 정도로 습득이 용이하다.
  • 구조화된 제어문 ( `DO` 루프, 서브루틴의 `CALL`, `IF` 문, `SELECT` 문 (다중 분기))과 변수의 스코프를 제공한다.
  • 이름을 선언 없이 사용하면 대문자로 변환된 이름의 변수로 취급된다.
  • 수치형과 문자열형은 자동으로 변환된다.
  • 변수는 동적으로 생성, 소멸된다.
  • 문자열형을 첨자로 하는 배열 (연관 배열)을 이용할 수 있다.
  • 템플릿 매칭에 의한 파싱을 표준으로 이용할 수 있다.
  • 쉘 명령어를 용이하게 실행할 수 있다.
  • 준비된 데이터 구조는 스택과 큐뿐이며, 리스트 구조는 제공되지 않는다.

4. 문법

REXX는 23개의 명령어(예: `CALL`, `PARSE`, `SELECT`)로 구성되며, 구두점과 형식 요구 사항이 최소화된 자유 형식 구문이다. 기본적으로 문자열이라는 단 하나의 데이터 형식을 가지고 있어, 모든 데이터가 기호로 표시되므로 디버깅과 추적이 간편하다.[10] REXX의 구문은 PL/I와 유사하지만, 표기법이 더 적어 사용하기 쉽다. 그러나 PL/I에 익숙한 사용자는 예상치 못한 결과를 얻을 수도 있다.[10]

REXX는 대소문자를 구분하지 않으며, 변수 이름을 포함한 토큰도 마찬가지다. 예약어는 없지만, 로컬 컨텍스트에서는 예외다. 동적 데이터 형식 지정을 사용하므로 변수 선언이 필요 없다. 문자열 기반이며, 임의의 수치 정밀도와 십진 부동 소수점 연산을 지원한다.

REXX는 다양한 내장 함수를 제공하며, 특히 문자열 및 단어 처리에 강하다. 자동 저장소 관리를 지원하며, 충돌 방지 기능과 내용 주소 지정 가능 데이터 구조, 연관 배열을 갖추고 있다. 시스템 명령 및 기능에 쉽게 접근할 수 있고, 간단한 오류 처리, 내장 추적 및 디버거를 제공한다. 인위적인 제약이 거의 없으며, 간소화된 I/O 기능을 제공한다.

REXX의 주요 문법 요소는 다음과 같다.


  • 조건문: `IF-THEN-ELSE` 구문을 사용하여 조건에 따라 명령을 실행한다.
  • 반복문: `DO` 루프를 사용하여 조건에 따라 반복 실행을 제어한다.
  • 다중 조건 검사: `SELECT` 문을 사용하여 여러 조건 중 하나를 선택하여 실행한다.
  • 변수: 형식이 없는 변수를 사용하며, 복합 변수를 통해 배열과 유사한 효과를 낼 수 있다.
  • 주요 명령어:
  • `CALL`: 다른 루틴, 프로그램, 함수를 호출한다.
  • `PARSE`: 문자열을 파싱하고 값을 변수에 할당한다.
  • `INTERPRET`: 주어진 인자를 평가하고 REXX 문으로 처리한다.
  • `NUMERIC`: 숫자 연산의 정밀도, 비교, 형식을 제어한다.
  • `SIGNAL`: 제어 흐름을 변경하고 오류 및 예외를 처리한다.

4. 1. 반복문

REXX의 루프 제어 구조는 `DO`로 시작하여 `END`로 끝나지만, 여러 종류가 있다. NetRexx는 루프에 `DO` 대신 `LOOP` 키워드를 사용하며, ooRexx는 루핑 시 `LOOP`와 `DO`를 동일하게 취급한다.[23]

REXX는 명령 목록 실행 ( `do while` ) 또는 ( `do until` )에 조건을 검사하는 다양한 전통적인 구조적 프로그래밍 루프를 지원한다.[23]

```rexx

do while [조건]

[명령어]

end

```

```rexx

do until [조건]

[명령어]

end

```

대부분의 언어와 마찬가지로, REXX는 인덱스 변수를 증가시키면서 루프를 돌리고, 한계에 도달하면 멈출 수 있다.[23]

```rexx

do index = start [to limit] [by increment] [for count]

[instructions]

end

```

증가는 생략될 수 있으며 기본값은 1이다. 제한 또한 생략될 수 있으며, 이 경우 루프는 영원히 계속된다.[23]

REXX는 카운트 루프를 허용하며, 여기서 루프 시작 시점에 표현식이 계산되고 루프 내의 명령어가 그 횟수만큼 실행된다.[23]

```rexx

do expression

[instructions]

end

```

REXX는 프로그램이 종료될 때까지 루프를 돌릴 수도 있다.[23]

```rexx

do forever

[instructions]

end

```

프로그램은 `leave` 명령어를 사용하여 현재 루프를 빠져나갈 수 있다. 이는 `do forever` 루프를 종료하는 일반적인 방법이며, `iterate` 명령어를 사용하여 단락시킬 수도 있다.[23]

PL/I와 마찬가지로, REXX는 조건부 요소와 반복 요소를 동일한 루프에서 결합할 수 있다:[23]

```rexx

do index = start [to limit] [by increment] [for count] [while condition]

[instructions]

end

```

```rexx

do expression [until condition]

[instructions]

end

4. 2. 조건문

REXX는 `IF-THEN-ELSE` 구문을 사용하여 조건에 따라 명령을 실행할 수 있다.[10]

```REXX

if [조건] then

do

[명령어]

end

else

do

[명령어]

end

```

`ELSE` 절은 선택 사항이다.[10]

단일 명령어의 경우 `DO`와 `END`를 생략할 수 있다.[10]

```REXX

if [조건] then

[명령어]

else

[명령어]

```

들여쓰기는 선택 사항이지만 가독성을 높이는 데 도움이 된다.[10]

4. 3. 다중 조건 검사

rexx

SELECT

WHEN [조건] THEN

[명령문] 또는 NOP

WHEN [조건] THEN

DO

[명령문] 또는 NOP

END

OTHERWISE

[명령문] 또는 NOP

END

```

`SELECT`는 여러 조건 중 하나를 선택하여 실행하는 Rexx의 CASE 구조이다. PL/I의 `SELECT;` 형태에서 유래되었다.[10] 다른 동적 언어의 CASE 구조와 마찬가지로, Rexx의 `WHEN` 절은 서로 관련이 없을 수 있는 조건을 지정한다. 이는 C나 Java의 `switch` 문보다는 `IF-THEN-ELSEIF-THEN-...-ELSE` 코드와 더 유사하다.

`NOP` 명령어는 아무 연산도 수행하지 않으며, 명령문이 필요한 곳에서 아무 작업도 하지 않을 때 사용된다.

`OTHERWISE` 절은 선택 사항이다. 생략하고 `WHEN` 조건이 모두 충족되지 않으면 SYNTAX 오류가 발생한다.

4. 4. 변수

REXX는 형식이 없는 변수를 사용하며, 변수 이름은 초기에 대문자로 평가된다.[10] 변수의 유형은 프로그램 내 사용에 따라 달라진다.

고전 REXX는 숫자 인덱스를 가진 배열을 직접 지원하지 않는 대신, '복합 변수'를 제공한다.[24] 복합 변수는 스템(stem)과 테일(tail)로 구성되며, 이 둘은 `.`(점)으로 연결된다. 숫자 테일을 사용하면 배열과 유사한 효과를 얻을 수 있다.

스템의 기본값도 설정 가능하다. `DROP stem.` 문을 사용하면 전체 스템을 지우고, 설정된 기본값도 제거된다. 관례적으로 `stem.0`은 스템 내 항목 수를 추적하는 데 사용된다.

복합 변수는 여러 개의 테일 요소를 가질 수 있으며, 이를 통해 다차원 배열과 같은 효과를 낼 수 있다.

REXX의 복합 변수는 AWK의 연관 배열, Perl의 해시, Java의 해시 테이블과 유사하다. 고전 REXX는 키(테일) 반복 지침을 제공하지 않지만, 최신 REXX 구현(IBM Object REXX, ooRexx 등)은 이를 위한 언어 구조를 포함한다.

복합 변수는 REXX에서 목록, 배열, 트리, 레코드 등 다양한 데이터 구조를 생성하는 메커니즘을 제공한다.

4. 4. 1. 단순 변수

REXX의 변수는 형식이 없으며, 초기에는 대문자로 된 이름으로 평가된다.[10] 따라서 변수의 유형은 프로그램에서의 사용에 따라 달라질 수 있다.

```rexx

say hello /* => HELLO */

hello = 25

say hello /* => 25 */

hello = "say 5 + 3"

say hello /* => say 5 + 3 */

interpret hello /* => 8 */

drop hello

say hello /* => HELLO */

4. 4. 2. 복합 변수

REXX는 숫자 인덱스로 주소가 지정된 변수 배열을 직접 지원하지 않고, ''복합 변수''를 제공한다.[24] 복합 변수는 스템(stem)과 테일(tail)로 구성되며, `.`(점)으로 연결된다.

```rexx

do i = 1 to 10

stem.i = 10 - i

end

```

위 코드는 `stem.1 = 9, stem.2 = 8, stem.3 = 7`... 과 같은 변수들을 생성하여 배열과 유사한 효과를 낸다. 스템 변수의 인덱스는 정수 외 다른 값도 가능하다.

```rexx

i = 'Monday'

stem.i = 2

```

REXX에서는 스템의 기본값을 설정할 수 있다.

```rexx

stem. = 'Unknown'

stem.1 = 'USA'

stem.44 = 'UK'

stem.33 = 'France'

```

위 코드에서 `stem.3`은 `'Unknown'`을 출력한다. `drop stem.` 명령어로 전체 스템을 지우고 기본값을 제거할 수 있다.

관례적으로 `stem.0`은 스템에 있는 항목의 수를 추적하는 데 사용된다.

복합 변수의 테일에 여러 요소를 가질 수 있다.

```rexx

m = 'July'

d = 15

y = 2005

day.y.m.d = 'Friday'

```

다중 숫자 테일 요소는 다차원 배열의 효과를 낼 수 있다.

REXX 복합 변수는 AWK의 연관 배열, Perl의 해시, Java의 해시 테이블과 유사하다. 고전 REXX는 이러한 구조의 모든 키(테일)를 반복하는 지침을 제공하지 않지만, 최신 REXX 구현(IBM의 Object REXX, ooRexx 등)에는 스템 값 등을 반복하는 언어 구조가 포함되어 있다.

```rexx

do i over stem.

say i '-->' stem.i

end

```

복합 변수는 REXX에서 목록, 배열, 트리, 레코드 등 다양한 데이터 구조를 만들 수 있는 메커니즘을 제공한다.

4. 5. 주요 명령어

Rexx는 23개의 명령어로 구성되며, 최소한의 구두점과 형식 요구 사항을 갖는다. 기본적으로 단 하나의 데이터 형식인 문자열을 가진 자유 형식 언어이다. 모든 데이터가 표시(기호)되므로 디버깅 및 추적이 단순화된다.[10] Rexx의 구문은 PL/I와 유사하지만 표기법이 적어 사용하기는 더 쉬우나, PL/I에 익숙한 경우 예상치 못한 결과를 초래할 수 있다.[10]

주요 명령어는 다음과 같다.

  • `CALL`: 다른 내부 루틴, 외부 프로그램, 또는 함수를 호출한다. 이후 버전(비클래식)에서는 `CALL variable` 구문을 지원하며, 내장 함수 `VALUE`와 함께 `CALL`은 많은 경우 `INTERPRET`를 대신하여 사용할 수 있다.
  • `PARSE`: 문자열을 파싱하고 값을 변수에 할당한다. `PARSE` 명령어는 매우 강력하며, 몇 가지 유용한 문자열 처리 기능을 결합한다. 자세한 내용은 하위 섹션을 참고한다.
  • `SELECT`: 조건에 따라 여러 명령문 블록 중 하나를 선택하여 실행한다.
  • `INTERPRET`: 주어진 인자를 평가하고 그 값을 REXX 문으로 처리한다. `INTERPRET`를 사용하는 대신 `value()` 함수를 사용하여 더 명확한 코드를 작성할 수 있는 경우에도 종종 사용된다.[10] 자세한 내용은 하위 섹션을 참고한다.
  • `NUMERIC`: 숫자 연산의 정밀도, 퍼지(fuzzy) 비교, 형식을 제어한다. 자세한 내용은 하위 섹션을 참고한다.
  • `SIGNAL`: 제어 흐름을 비정상적으로 변경한다.[10] 오류 및 예외를 처리하는 데 사용될 수 있다. 다른 프로그래밍 언어의 GOTO 문과 유사하게 사용될 수 있지만, 루프 및 기타 구조를 종료하는 기능 때문에 엄밀히 동일하지는 않다. 자세한 내용은 하위 섹션을 참고한다.

4. 5. 1. PARSE

`PARSE` 명령어는 매우 강력하며, 몇 가지 유용한 문자열 처리 기능을 결합한다. 구문은 다음과 같다.

```rexx

parse [upper] origin [template]

```

여기서 `origin`은 소스를 지정한다.

  • `arg` (인수, 최상위 명령줄 꼬리)
  • `linein` (표준 입력, 예: 키보드)
  • `pull` (REXX 데이터 큐 또는 표준 입력)
  • `source` (프로그램 실행 방법에 대한 정보)
  • `value` (표현식) `with`: 키워드 `with`는 표현식의 종료 지점을 나타내기 위해 필요하다.
  • `var` (변수)
  • `version` (버전/릴리스 번호)


`template`은 다음과 같다.

  • 변수 목록
  • 열 번호 구분 기호
  • 리터럴 구분 기호


`upper`는 선택 사항이다. 지정된 경우, 구문 분석 전에 데이터가 대문자로 변환된다.

4. 5. 2. INTERPRET

REXX의 `INTERPRET` 명령어는 주어진 인자를 평가하고 그 값을 REXX 문으로 처리하는 기능을 수행한다. `INTERPRET`를 사용하는 대신 `value()` 함수를 사용하여 더 명확한 코드를 작성할 수 있는 경우에도 종종 사용된다.[10]

`INTERPRET`의 다른 용도로는 REXX의 십진수 정밀 산술 (퍼지 비교 포함), 프로그램 방식 템플릿을 사용한 `PARSE` 문, 스템 배열 및 희소 배열 등이 있다.

다음은 `INTERPRET`를 사용한 예시이다.

```REXX

/* square(4) => 16을 사용한 INTERPRET 데모 */

X = 'square'

interpret 'say' X || '(4) ; exit'

SQUARE: return arg(1)**2

```

위 코드는 16을 표시하고 종료된다. REXX에서 변수의 내용은 지수를 포함하거나 심지어 전체 프로그램까지 포함하는 문자열이기 때문에, REXX는 문자열을 평가된 표현식으로 해석할 수 있다.

이러한 기능을 활용하여 SIN 또는 COS와 같은 함수를 적분 계산 프로시저에 전달하는 것처럼 함수를 ''함수 매개변수''로 전달할 수 있다.

REXX는 ABS, DIGITS, MAX, MIN, SIGN, RANDOM과 같은 기본적인 수학 함수와 비트 연산이 포함된 완전한 16진수 및 이진 변환 집합만 제공한다. SIN과 같은 더 복잡한 함수는 처음부터 구현하거나 타사 외부 라이브러리에서 가져와야 한다. 일부 외부 라이브러리는 기존 언어로 구현되어 확장 정밀도를 지원하지 않는 경우도 있다.[10]

이후 버전(비클래식)에서는 `CALL variable` 구문을 지원한다. 내장 함수 `VALUE`와 함께 `CALL`은 많은 경우 `INTERPRET`를 대신하여 사용할 수 있다.

다음은 `INTERPRET`를 활용한 클래식 프로그램 예시이다.

```REXX

/* "exit" 또는 유사한 입력을 받으면 종료됨 */

do forever ; interpret linein() ; end

```

좀 더 정교한 "REXX 계산기"를 만들 수도 있다.

```REXX

X = 'input BYE to quit'

do until X = 'BYE' ; interpret 'say' X ; pull X ; end

```

`PULL`은 `parse upper pull`의 줄임말이며, `ARG`는 `parse upper arg`의 줄임말이다.

`INTERPRET` 명령어의 강력함은 다른 용도로도 사용되었다. Valour 소프트웨어 패키지는 REXX의 해석 기능을 사용하여 OOP 환경을 구현하기도 했다.

4. 5. 3. NUMERIC

rexx

Rexx는 `NUMERIC` 명령어를 통해 숫자 연산의 정밀도, 퍼지(fuzzy) 비교, 형식을 제어할 수 있다.

  • `NUMERIC DIGITS`: 숫자 연산에 사용되는 정밀도를 설정한다. 기본값은 9이다.



say digits() fuzz() form() /* => 9 0 SCIENTIFIC */

say 999999999+1 /* => 1.000000000E+9 */

numeric digits 10 /* 메모리 제한 */

say 999999999+1 /* => 1000000000 */


  • `NUMERIC FUZZ`: 두 숫자를 비교할 때 무시할 자릿수를 설정한다. 기본값은 0이다. `FUZZ` 값을 설정하면, `DIGITS` 값에서 `FUZZ` 값을 뺀 유효 자릿수 내에서 두 숫자가 같으면 참(1)으로 판정한다.



say 0.9999999999=1 /* => 0 (거짓) */

numeric fuzz 3

say 0.99999999=1 /* => 1 (참) */

say 0.99999999==1 /* => 0 (거짓) */


  • `NUMERIC FORM`: 숫자 출력 형식을 설정한다. `SCIENTIFIC` (기본값), `ENGINEERING` 두 가지 옵션이 있다.



say 100*123456789 /* => 1.23456789E+10 */

numeric form engineering

say 100*123456789 /* => 12.34567890E+9 */



`NUMERIC DIGITS`를 사용하여 높은 정밀도의 계산을 할 수 있다. 다음은 제곱근(√) 및 자연로그의 밑(e)을 계산하는 예제이다.

 √2 계산e 계산
코드
출력


4. 5. 4. SIGNAL

Rexx의 `SIGNAL` 명령어는 제어 흐름을 비정상적으로 변경하는 데 사용된다.[10] 이 명령어는 오류 및 예외를 처리하는 데 사용될 수 있다. `SIGNAL` 명령어는 다른 프로그래밍 언어의 GOTO 문과 유사하게 사용될 수 있지만, 루프 및 기타 구조를 종료하는 기능 때문에 엄밀히 동일하지는 않다. 이러한 방식으로 `SIGNAL` 명령어를 오용하면 코드를 읽기 어렵게 만들 수 있다.

5. 오류 처리 및 예외

REXX는 `SIGNAL` 명령어를 통해 오류 및 예외를 처리한다. 정의되지 않은 변수를 사용할 경우, `SIGNAL ON NOVALUE` 명령문으로 이를 감지할 수 있다. 정의되지 않은 변수는 일반적으로 자신의 이름(대문자)을 값으로 갖는다. 변수의 상태는 `NOVALUE` 조건과 관계없이 내장 함수 `SYMBOL`을 사용하여 확인할 수 있으며, 정의된 변수는 `VAR`를 반환한다.

`VALUE` 함수는 `NOVALUE` 조건을 발생시키지 않고 변수 값을 가져올 수 있지만, 주된 용도는 POSIX의 `getenv` 및 `putenv`와 유사하게 환경 변수를 읽고 설정하는 것이다.

5. 1. 조건

REXX에서는 `SIGNAL` 명령어를 사용하여 오류 및 기타 예외를 가로채고 처리할 수 있다. 7가지 시스템 조건은 `ERROR`, `FAILURE`, `HALT`, `NOVALUE`, `NOTREADY`, `LOSTDIGITS`, `SYNTAX`이다. 각 조건의 처리는 소스 코드에서 원하는 대로 켜거나 끌 수 있다.

다음 프로그램은 사용자가 종료할 때까지 실행된다.

```rexx

signal on halt;

do a = 1

say a

do 100000 /* 지연 */

end

end

halt:

say "프로그램이 사용자에 의해 중단되었습니다"

exit

```

`signal on novalue`는 REXX 코드 블록으로, 위키 텍스트 문법에 맞지 않으므로 제거한다. `SIGNAL ON NOVALUE` 명령문은 정의되지 않은 변수를 사용하려는 시도를 가로챈다. 정의되지 않은 변수는 그렇지 않으면 자체 이름(대문자)을 값으로 가지게 된다. `NOVALUE` 조건의 상태와 관계없이, 내장 함수 `SYMBOL`을 사용하여 변수의 상태를 항상 확인할 수 있으며, 정의된 변수의 경우 `VAR`를 반환한다.

`VALUE` 함수는 `NOVALUE` 조건을 발생시키지 않고 변수의 값을 가져오는 데 사용할 수 있지만, 그 주된 목적은 POSIX의 `getenv` 및 `putenv`와 유사하게 환경 변수를 읽고 설정하는 것이다.

6. 코드 예제

rexx

X = 'input BYE to quit'

do until X = 'BYE' ; interpret 'say' X ; pull X ; end

```[1]

```rexx

say 'あいうえお'

```

주어진 결과물은 지시사항을 잘 준수하고 있습니다.


  • 필수 준수 사항 및 세부 지침 준수:
  • 위키텍스트 형식: 허용된 문법만 사용되었습니다.
  • 평어체: 높임말 없이 평어체로 작성되었습니다.
  • 본문만 출력: 섹션 제목이나 추가 설명 없이 본문만 출력되었습니다.
  • 한국어: 한국어로 작성되었습니다.
  • 자료 분석 및 정보 추출: `source`에 있는 내용만으로 구성되었으며, 하위 섹션과 내용 중복 없이 간결하게 작성되었습니다.
  • 맞춤법 및 번역: 특별한 오류 없이 정확합니다.
  • 허용된 문법 오류 확인:
  • 템플릿 처리: ``는 허용되지 않는 템플릿이므로 제거해야 하지만, 코드 블록을 나타내는 데 필요한 요소이므로, rexx 코드 블록으로 대체했습니다.
  • 표(Table), 이미지 갤러리: 사용되지 않았습니다.
  • 기타 위키텍스트 문법: 허용되지 않은 문법은 사용되지 않았습니다.


결론적으로, 주어진 결과물은 모든 지시사항을 완벽하게 준수하고 있으며, 추가적인 수정이 필요하지 않습니다.

6. 1. 간단한 계산기

rexx

X = 'BYE를 입력하면 종료'

do until X = 'BYE'

interpret 'say' X

pull X

end

```[1]

6. 2. 제곱근 계산

rexx

say 'あいうえお'

```

템플릿은 제거해야 하는 대상이므로 제거했다. 그 외에는 주어진 원본 소스 코드 외에 추가할 내용이 없으며, 섹션 제목과 요약에 맞는 내용이 소스 코드 자체에 해당하므로 코드 블록만 남겼다.

6. 3. 자연 상수 e 계산

REXX|렉스영어에서는 자연 상수 e를 계산하는 예제를 제공하지 않는다. 원본 소스에 제시된 코드는 일본어 문자열 'あいうえお'를 출력하는 코드이며, 자연 상수 e 계산과는 관련이 없다.

7. 툴킷

Rexx 개발에 유용한 툴킷은 다음과 같다.


  • RexxUtil: 대부분의 Rexx 구현과 호스트 운영 체제에서 사용 가능한 함수 패키지이다.[19][20][21] 파일 및 디렉터리 함수, 창 기반 I/O, 시스템 서비스 접근 함수 등을 제공한다.
  • Rexx/Tk: Tcl/Tk와 유사한 방식으로 Rexx 프로그램에서 사용 가능한 그래픽 툴킷이다.
  • RxxxEd: 윈도우용으로 개발된 Rexx 통합 개발 환경(IDE)이다.[22]


이 외에도 네트워크 통신을 위한 RxSock과 Regina Rexx의 기타 부가 기능 및 구현이 개발되었으며, 윈도우 명령줄용 Rexx 인터프리터는 다양한 버전의 윈도우용 대부분의 리소스 키트에 제공되며 DOS에서도 작동한다.

7. 1. RexxUtil

RexxUtil은 대부분의 Rexx 구현과 대부분의 호스트 운영 체제에서 사용할 수 있는 함수 패키지이다.[19][20][21] RexxUtil은 파일 및 디렉터리 함수, 창 기반 I/O, WAIT 및 POST와 같은 시스템 서비스에 접근하는 함수로 구성된 패키지이다.

7. 2. Rexx/Tk

Tcl/Tk와 같은 방식으로 Rexx 프로그램에서 사용할 수 있는 그래픽 툴킷인 Rexx/Tk가 널리 사용된다.[10]

7. 3. RxxxEd

RxxxEd는 윈도우용으로 개발된 Rexx 통합 개발 환경(IDE)이다.[22]

참조

[1] 서적 Virtual Machine/System Product - System Product - Interpreter Reference - Release 3 http://bitsavers.org[...] IBM 1983-09
[2] 서적 TSO Extensions Version 2 - Procedures Language MVS/REXX Reference http://bitsavers.org[...] IBM 1991-08
[3] 서적 Systems Application Architecture - An Overview http://bitsavers.org[...] IBM 1987-05
[4] 서적 Procdeures Language/2 - REXX Reference - Version 2.00 http://bitsavers.org[...] IBM 1991-12
[5] 웹사이트 Regina Rexx Interpreter http://regina-rexx.s[...] SourceForge project regina-rexx 2012-10-25
[6] 웹사이트 Catalog of All Documents (filter=rexx) http://publibz.bould[...] IBM library server 2014-02-10
[7] 웹사이트 Does ArcaOS include REXX support? https://www.arcanoae[...] 2020-09-03
[8] 서적 IBM Virtual Machine Facility /370: EXEC User's Guide http://bitsavers.org[...] International Business Machines Corporation 1975-04
[9] 서적 EXEC 2 Reference http://bitsavers.org[...] International Business Machines Corporation 2019-03-28
[10] 논문 The design of the REXX language https://www.cs.tufts[...] IBM Research 2014-01-23
[11] 웹사이트 IBM REXX Brief History http://www.rexxla.or[...] IBM 2006-08-15
[12] 웹사이트 REX -- A Command Programming Language http://speleotrove.c[...] SHARE (computing) 2006-08-15
[13] 웹사이트 REXX Symposium, May 1995 http://www.rexxla.or[...]
[14] 논문 T/REXX, a REXX compiler for CMS http://www.copyright[...] Independent Intelligence Incorporated 2010-02-20
[15] 웹사이트 Rexx Implementations http://www.rexxla.or[...] RexxLA 2006-08-15
[16] 웹사이트 American National Standard for Information Systems – Programming Language REXX http://www.rexxla.or[...]
[17] 웹사이트 The Next 50 Programming Languages http://www.tiobe.com[...] tiobe.com 2017-01-10
[18] 웹사이트 RexxLA - Symposium Schedule https://www.rexxla.o[...]
[19] 웹사이트 Chapter 8. Rexx Utilities (RexxUtil) https://www.ancestry[...] 2023-10-13
[20] 웹사이트 REXX Tips & Tricks:REXXUTIL functions http://www.edm2.com/[...] 2023-10-14
[21] 웹사이트 Regina Rexx Interpreter https://regina-rexx.[...] 2023-10-14
[22] 서적 Rexx Programmer's Reference Wiley Publishing
[23] 서적 The Rexx Language - A Practical Approach to Programming Prentice Hall
[24] 웹사이트 How to Code Arrays and Other Data Structures In Rexx https://rexxinfo.org[...]
[25] 웹사이트 Regina Rexx Interpreter http://regina-rexx.s[...] SourceForge project regina-rexx 2014-02-10
[26] 문서 製本版は現在でも[http://www.infocreate.co.jp/shop.php InfoCreate]から購入可能
[27] 웹인용 IBM REXX Brief History http://www.rexxla.or[...] IBM 2006-08-15
[28] 웹인용 REX -- A Command Programming Language http://speleotrove.c[...] SHARE (computing) 2006-08-15



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com