Charm(프로그래밍 언어)

Charm (programming language)
매력
패러다임구조화된 프로그래밍
설계자P. 노보사드
처음 등장한1996
OSRISC OS
웹 사이트charm.qu-bit.co.uk
영향을 받다
RTL/2, C, Pascal

Charm은 1990년대 초에 고안된 컴퓨터 프로그래밍 언어이며, RTL/2, 파스칼C 언어와 유사한 점이 있을 뿐만 아니라 고유한 특징을 포함하고 있습니다.Charm 언어는 컴파일러 [1][2]설계에 관한 중요한 서적에서 설명한 바와 같이 재귀 하강 파서에 의해 처리될 수 있는 문맥 없는 문법에 의해 정의됩니다.

컴파일러, 어셈블러, 링커를 포함한 Charm 툴 세트는 Acon의 RISC OS [3]플랫폼에서 사용할 수 있게 되었습니다.RISC OS 플랫폼용으로 재작업한 매력에 대해서는, 그 후 Archive [4]매거진에서 리뷰되고 있습니다.

매력은 라즈베리 [5]파이의 전자책 "매력 속의 프로그래밍"에 자세히 설명되어 있습니다.

문법.

백커스-나우르 형식의 참 문법의 정의는 참어 구문의 설명적인 예와 함께 참어 페이지[6]정의되어 있습니다.

언어는 블록 구조로 되어 있으며, 각 블록은 블록 내에서 수행되는 작업을 설명하는 언어 키워드에 의해 도입됩니다.(반복하는 동안), (반복하는 경우), (반복하는 경우), (반복하는 경우)각 블록은 다음과 같이 둘러싸여 있습니다.{그리고.}구분 기호로 지정합니다.또한 블록 내의 언어 행은 일반적으로 명확성을 위해 들여쓰기되지만, 공백은 무시되므로 반드시 입력할 필요는 없습니다.

각 문법적으로 적합한 텍스트는 Charm 툴세트가 제공하는 운영체제 하에서 실행 가능한 코드와 관련 데이터의 집합을 나타내며, Charm 툴세트가 제공하는 서비스를 이용하여 데이터 처리 또는 그래픽 사용자 int를 통한 사용자와의 상호작용 등의 유용한 작업을 수행할 때 컴포넌트로 사용할 수 있습니다.erface (GUI)

데이터형

Charm은 강력한 유형의 언어이지만 숫자 및 부동 소수점 유형 간에 암묵적인 변환을 허용합니다.다음 기본 변수 유형이 지원됩니다.

  • int : 정수
  • char – 문자
  • boolean : 부울값(true 또는 false)
  • 실제 – 부동 소수점 수

같은 유형의 데이터 집약을 array 키워드를 사용하여 선언하고 정적으로 초기화할 수 있으며, 다차원일 수 있습니다.record 키워드를 사용하여 다른 유형의 집약을 선언할 수 있으며, 이러한 선언은 스토리지 할당에 관해 서로 오버레이되는 레코드 필드의 조합을 정의할 수 있다.모듈은 정적 데이터 멤버와 동적 데이터 멤버의 혼합을 집약할 수도 있습니다.레코드와 모듈의 인스턴스(동적 콘텐츠만)는 스택 또는 새로운 연산자를 통해 힙에서 인스턴스화할 수 있습니다.모듈은 또한 동적 데이터를 초기화하기 위한 컨스트럭터 ~새로운 프로시저를 정의하고 C++ 언어와 유사한 방법으로 리소스를 해방하기 위해 대응하는 ~삭제 디컨스트럭터 프로시저를 정의할 수 있습니다.

참조하다

모듈 범위 내의 데이터 또는 절차는 export 키워드를 사용하여 최종 어플리케이션에 대해 글로벌화할 수 있습니다.모듈이 다른 Charm 모듈의 절차 또는 데이터를 참조할 경우 import 키워드를 사용하여 참조합니다.모듈에는 인스턴스 기반 멤버 변수가 포함될 수 있습니다.인스턴스 기반 멤버 변수는 이 포인터의 암묵적인 첫 번째 파라미터를 통해 dynamic 키워드로 선언된 절차를 통해 접근할 수 있습니다.

데이터 구성 및 절차에 대한 참조는 ref 키워드를 사용하여 수행할 수 있습니다.이것들은 val 키워드를 사용하여 참조할 수 있습니다.기준 변수를 사용할 때 비교 연산자를 사용하여 두 기준 변수가 동일한 데이터 항목을 참조하는지 확인할 수 있습니다. :=: 또는 같은 데이터를 가리키고 있는지 여부( = ).

Charm으로 작성된 Hello world의 오리지널 클래식 프로그램은 다음과 같습니다.

    ext proc write_string (ref 배열 문자), module hello; ent proc start(); write_string("Hello world"); end_proc; end_module;

진화적 통사적 언어 변경에 따른 최신 버전은 다음과 같습니다.

    import lib.출력; 모듈 Hello {export proc ~start() {Out.vdu.str("Hello world"). nl(); }}

공구 세트

툴 세트 구현은 Charm 소스 코드와 어셈블러 소스 코드에서 오브젝트 파일을 생성하는 컴파일러와 어셈블러를 제공할 것으로 기대되며, 이 파일은 라이브러리와 함께 링크되어 실행 가능한 프로그램을 생성하기 위해 런타임 지원 파일과 함께 링크될 수 있습니다.

작성 시 Charm 툴 세트 설치는 1개(무료)만 가능합니다.툴 자체는 Charm 언어로 작성되며 소스 코드는 GNU General Public License의 조건에 따라 제공됩니다.RISC OS PC 및 ARM CPU 탑재 플랫폼(Lasberry Pi 등) 및 Windows 또는 Linux 플랫폼(RPCEMU 등)에서 호스트되는 RISC OS용 에뮬레이터에서 실행됩니다.VFP 버전2 코프로세서 아키텍처를 지원하는 ARM 칩 기반의 플랫폼에서 하드웨어 지원 배정도 부동소수점 연산을 위한 코드 생성이 지원됩니다.

컴파일러

Charm 컴파일러는 Charm 소스 코드를 구문 분석하여 산술, 논리 및 제어 연산을 지원하는 중간 언어로 형식 결과: = lhs op rhs의 4배를 생성하는 재귀 하강 단일 패스 컴파일러입니다.데이터는 컴파일러 백엔드의 레지스터 및 메모리 위치에 할당된 임시로 저장됩니다.현재 두 개의 백엔드가 존재하며 하나는 Motorola 68000 어셈블리 언어를 생성하고 다른 하나는 ARM [7]아키텍처를 생성합니다.

hello world 예시의 4배의 출력을 다음에 나타냅니다.

param l1$ call write_string [void (ref 배열 문자)]

어셈블러의 출력은 다음과 같습니다.

 스트링 "안녕하세요"  xdef _스타트  정렬하다 _스타트  xref _write_string  stmfd sp!,{rp}  표류하다 r0,_l1$  흐릿하다 _write_string  ldmfd sp!,{PC}  주소.  정렬하다 _l1$  스트링 '헬로 월드'  직접적인  끝. 

Charm의 최신 릴리스에서는 절차가 자체 모듈 InOut으로 분할되어 있습니다.기타 표준 라이브러리 절차는 절차 참조를 필드로 하는 일련의 레코드로 구성됩니다.이 개편의 일환으로서write_string이제 런타임 라이브러리 모듈을 통해 메서드가 호출됩니다.Out정적 멤버 참조를 통해.vdu절차상str즉, 위의 hello 월드 예에서write_string ("Hello world")된다Out.vdu.str ("Hello world").

어셈블러

어셈블러는 명령어 니모닉, 데이터 선언 및 명령을 받아 타깃 프로세서의 CPU가 쉽게 이해할 수 있는 정보, 특히 바이너리로 코드화된 코드 명령을 포함하는 객체 파일을 구축합니다.

@.arm.hello 어셈블리 목록
0000:6D795F6D    0000:E92D40000004:000C: EBFFFE0010: E8BD8000   0000:48656C6C
 스트링 "안녕하세요"  xdef _스타트  정렬하다 _스타트  xref _write_string  stmfd sp!,{rp}  표류하다 r0,_l1$  흐릿하다 _write_string  ldmfd sp!,{PC}  주소.  정렬하다 _l1$  스트링 '헬로 월드'  직접적인  끝. 

링커

실행 가능한 프로그램을 형성하기 위해 링크된 Charm 모듈 중 하나에만 다음 중 하나의 시그니처와 일치하는 프로시저가 포함되어 있어야 합니다.

내보내기 proc ~start() 내보내기 proc ~start(int argc, ref array ref array charar argv)

이는 C 및 Java 언어의 주요 기능과 유사합니다.여기서argc에 명령줄에 전달된 파라미터의 수를 나타냅니다.argv배열에 대한 참조를 포함한다.argc + 1strings(순서대로 위치 파라미터마다 1개의 스트링과 끝)nil).

또한 모듈에는 시그니처에 일치하는 프로그램 부팅 및 셧다운 시 호출되는 스태틱스타트업 및 셧다운 절차가 옵션으로 포함되어 있을 수 있습니다.

proc ~export() 내보내기 proc ~export proc ~export proc()

링커는 프로그램을 실행하기 위해 운영 체제에서 필요한 헤더 정보를 추가하고 런타임 환경(데이터 및 스택 포인터)을 설정하고 제어권을 애플리케이션의 시작 프로시저에 전달하는 런타임 라이브러리 어셈블러 지원 코드가 실행되도록 합니다.

디버거 및 프로파일러가 사용할 수 있는 글로벌 데이터 및 코드 참조와 함께 프로그램을 형성하기 위해 링크된 모든 모듈의 이름을 나타내는 맵 파일을 선택적으로 생성한다.

레퍼런스

  1. ^ ISBN D-201-10073-8 Aho, Ulman 컴파일러 설계 원리
  2. ^ ISBN D-201-10194-7 Aho, Sethi, Ulman 컴파일러의 원리, 기술 및 도구
  3. ^ Wade, Stephen (June 1996). "Charm or trinket?". Acorn User. pp. 50–51. Retrieved 28 August 2021.
  4. ^ Wraith, Gavin (January 2012). "The Charm language: a review". Archive. Vol. 23, no. 4. p. 13. Retrieved 2021-08-28.
  5. ^ 2013년 6월 Rasberry Pi에서의 Kindle 전자책 Charm 프로그래밍
  6. ^ Charm RISC OS, 언어 페이지
  7. ^ ISBN 0-9512579-0-0 Peter Cockerell ARM 어셈블리 언어 프로그래밍

외부 링크