APL (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
APL은 1957년 케네스 아이버슨이 개발한 배열 조작을 위한 수학적 표기법에서 시작된 프로그래밍 언어이다. IBM에서 컴퓨터 프로그래밍 언어로 발전했으며, 1960년대 후반부터 1980년대 초반까지 메인프레임 시분할 시스템에서 널리 사용되었다. APL은 독특한 문자 집합과 배열에 작용하는 함수와 연산자를 결합한 설계를 특징으로 하며, 금융, 보험, 인공지능 등 다양한 분야에서 활용된다. APL2, Dyalog APL, GNU APL 등 다양한 구현체가 존재하며, 여러 프로그래밍 언어에 영향을 미쳤다.
APL은 1957년 케네스 아이버슨이 하버드 대학교에서 개발한 배열 조작을 위한 수학적 표기법에서 기원한다.[2] 1960년, 아이버슨은 IBM에서 애딘 팔코프와 함께 이 표기법을 발전시켰고, 1962년 《A Programming Language》라는 책으로 출판했다.[2] 이 표기법은 IBM 내부에서 컴퓨터 시스템 연구 및 프레드 브룩스와의 공동 저서 집필 등에 사용되었다.[5][6]
2. 역사
1960년대 초, 아이버슨 표기법은 IBM System/360 명령어 집합 표준화 및 IBM 1620 컴퓨터를 위한 개인화된 배열 번역기(PAT) 구현 등에 활용되었다.[8] 1965년에는 FORTRAN IV로 구현된 IVSYS(Iverson 시스템)가 개발되었다.[10]
APL을 효과적으로 사용하기 위해 특수 IBM Selectric 타자기 교체형 타이핑 요소가 개발되어 IBM 1050 및 IBM 2741 터미널 등에서 사용되었다.[12]
1966년, 래리 브리드는 IBM 1050 터미널을 사용하여 최초의 APL 대화형 로그인 및 작업 공간을 만들었다.[93] 1968년에는 최초의 공개 버전 APL인 APL\1130이 출시되었다.[99] 1973년, IBM은 공유 변수 기능을 갖춘 APL.SV를 출시했다.[35]
IP 샤프 어소시에이츠(IPSA)와 STSC 등 여러 시분할 회사들이 APL 서비스를 판매했다.[101] 이들은 APL\360 개발팀의 여러 구성원을 고용하여 APL*Plus와 Sharp APL을 공동 개발했다.[101]
1975년, IBM 5100 마이크로컴퓨터는 APL\360[97]을 내장 인터프리터 언어 중 하나로 제공했다.[98] 1980년대 중반부터는 개인용 컴퓨터 환경으로 애플리케이션 이전이 시작되었다.
APL2는 IBM이 1971년부터 개발하여 1984년에 처음 출시한 APL의 중요한 재구현으로, 중첩 배열 지원 등 여러 가지 기능을 추가했다.[35] 2021년, IBM은 APL2를 Log-On Software에 매각했다.[103]
APL은 A+, FP, J, K, MATLAB, Wolfram Language 등 다양한 프로그래밍 언어에 영향을 주었다.언어 설명 A+ APL의 대안 언어로, 그래픽 확장을 포함한다. FP 함수형 프로그래밍 언어이다. 아이비(Ivy) 롭 파이크가 개발한 APL 유사 언어의 인터프리터로, ASCII를 입력으로 사용한다.[42] J 아이버슨이 설계했으며, 특수 기호 대신 디그래프가 있는 ASCII를 사용한다.[43] K 아서 휘트니가 개발한 APL의 독점 변형이다.[44] MATLAB 수치 계산 도구이다.[45] Nial 함수형 프로그래밍 표기법을 갖춘 고급 배열 프로그래밍 언어이다. Polymorphic Programming Language 유사한 기본 언어를 가진 대화형 확장 가능한 언어이다. S 통계 프로그래밍 언어 (현재는 R로 알려진 오픈 소스 버전에서 일반적으로 사용됨)이다. Snap! 스크래치의 확장된 재구현으로 탄생한 로우코드 블록 기반 프로그래밍 언어이다. 스피크이지(Speakeasy) 수치 계산 대화형 환경이다. Wolfram Language Mathematica의 프로그래밍 언어이다.[46]
2. 1. 수학적 표기법
케네스 아이버슨은 1957년 하버드 대학교에서 배열 조작을 위한 수학적 표기법을 개발했다.[2] 1960년, 그는 IBM에서 애딘 팔코프와 함께 이 표기법을 발전시키기 시작했고, 1962년에 《A Programming Language》라는 책으로 출판했다.[2] 이 책의 서문에서는 이 표기법을 '프로그램의 설명을 위한 효과적인 표기법'이며 '프로그래밍 언어'라고 설명했다.
이 표기법은 IBM 내부에서 Burroughs B5000과 같은 컴퓨터 시스템에 대한 연구 보고서와, 향후 컴퓨터를 위한 스택 머신 대 레지스터 머신 평가에 사용되었다. 또한 아이버슨은 프레드 브룩스와 함께 저술한 《자동 데이터 처리》(Automatic Data Processing) 책의 한 장에도 이 표기법을 사용했다.[5][6]
1979년, 아이버슨은 APL에 대한 업적으로 튜링상을 수상했다.[7]
2. 2. 컴퓨터 프로그래밍 언어로의 발전
1962년, 팔코프는 IBM System/360 명령어 집합 표준화 작업을 위해 아이버슨 표기법을 사용했으며, 이는 완전한 컴퓨터 시스템을 설명하는 첫 시도였다.[8] 1963년, 허버트 헬러먼은 IBM 1620 컴퓨터에 이 표기법의 일부를 구현하여 개인화된 배열 번역기(PAT)라고 불렀다.[8] 같은 해, 팔코프, 아이버슨, 에드워드 H. 서생구스 주니어는 IBM System/360 시리즈 기계 아키텍처 및 기능을 공식적으로 설명하는 데 이 표기법을 사용했다.[9] 1965년, 로렌스 M. 브리드와 필립 S. 에이브럼스는 FORTRAN IV로 이 표기법의 일부를 구현하여 IVSYS(Iverson 시스템)라고 명명했다.[10]
2. 3. 하드웨어
APL을 효과적으로 사용하기 위해 특수 IBM Selectric 타자기 교체형 타이핑 요소가 개발되었다. 이는 IBM 1050 및 IBM 2741 터미널과 같이 Selectric 타자기 및 타이핑 요소 메커니즘을 사용하는 종이 인쇄 터미널 워크스테이션에서 사용되었다.[12] 키캡은 일반 키 위에 배치되어 어떤 APL 문자가 입력되는지 표시했다.
Selectric 타이핑 요소에 APL 문자가 있어도, APL 문자 집합이 타이핑 요소에 허용된 88자보다 훨씬 커서 많은 APL 기호는 여전히 기존 요소 문자 2개를 겹쳐 입력해야 했다.[13] 예를 들어 'grade up' 문자는 '델타'(shift-H)와 'Sheffer stroke'(shift-M)를 겹쳐 입력해야 했다.
2. 4. 상업적 이용
1966년, 래리 브리드는 IBM 1050 터미널을 사용하여 최초의 APL 대화형 로그인 및 작업 공간을 만들었다.[93] 1968년에는 IBM 1130용으로 최초의 공개 버전 APL인 APL\1130이 출시되었으며,[99] 이는 IBM이 출시한 가장 인기 있는 IBM Type-III Library 소프트웨어가 되었다.[100]
1960년대 후반부터 1980년대 초까지 메인프레임 시분할 시스템에서 APL이 사용되었다. IBM System/370 메인프레임 시스템의 성능 향상에 APL 어시스트 마이크로코드가 포함되었다. 1973년, IBM은 공유 변수 기능을 갖춘 APL.SV를 출시했다.[35]
IP 샤프 어소시에이츠(IPSA)와 STSC 등 여러 시분할 회사들이 APL 서비스를 판매했다.[101] IPSA는 1964년 이안 샤프(Ian Sharp), 로저 무어 등이 설립한 APL\360 서비스 회사였고, STSC는 1969년 로렌스 브리드 등이 설립한 시분할 및 컨설팅 서비스 회사였다. 이들은 APL\360 개발팀의 여러 구성원을 고용하여 APL*Plus와 Sharp APL을 공동 개발했다.[101] APL*Plus와 Sharp APL은 데이터 형식 지정 및 APL 배열을 외부 파일에 저장하는 기능과 같은 비즈니스 지향적 확장이 추가된 APL\360의 버전이었다.[101]
이후 IPSA와 STSC는 협력했지만 APL*Plus와 Sharp APL로 APL을 별도로 개발했다. STSC는 APL*Plus를 VAX 11,[102] PC 및 UNIX용 버전을 포함하여 여러 플랫폼으로 이식한 반면, IPSA는 개인용 컴퓨터의 등장에 대해 다른 접근 방식을 취하여 추가적인 PC-XT/360 하드웨어를 사용하여 이 플랫폼에서 Sharp APL을 사용할 수 있게 했다. 1993년에는 Sharp APL을 지원하기 위해 솔리톤 인코퍼레이티드가 설립되었고, Sharp APL을 SAX(유닉스용 Sharp APL)로 개발했다. 현재 APL*Plus는 APL2000 APL+Win으로 계속 개발되고 있다.
1985년 이안 샤프와 STSC의 댄 다이어(Dan Dyer)는 공동으로 케네스 E. 아이버슨 APL 공헌상을 수상했다.[112]
1975년, IBM 5100 마이크로컴퓨터는 APL\360[97]을 컴퓨터를 위한 두 개의 내장 ROM 기반 인터프리터 언어 중 하나로 제공했으며, 언어에서 사용되는 모든 특수 기호를 지원하는 키보드와 디스플레이가 완비되었다.[98] 1980년대 중반, 개인용 컴퓨터 환경으로 애플리케이션 이전이 시작되었다.
2. 5. 마이크로컴퓨터
1970년대에는 여러 벤더들이 유닉스 기반 마이크로컴퓨터용 APL 인터프리터를 개발했다. APL2는 이러한 새로운 APL 인터프리터 개발의 표준으로 선택되었으며, 오늘날에도 대부분의 APL 벤더나 사용자들이 APL2 호환성을 해당 제품의 판매 포인트로 꼽는다.[38][39]
2. 6. APL2
APL2는 IBM이 1971년부터 개발하여 1984년에 처음 출시한 APL의 중요한 재구현이었다. APL2는 중첩(비직사각형) 배열 지원 등 여러 가지 기능을 추가했다.[35] 2007년, APL2 제품 및 서비스 팀 전체가 아이버슨 상을 수상했다.[112] 2021년, IBM은 APL2를 Log-On Software에 매각했으며, Log-On Software는 이 제품을 ''Log-On APL2''로 개발 및 판매하고 있다.[103]
2. 7. 현대적 구현
APL은 다음 언어들에 영향을 주거나 그 기반이 되었다.2. 8. 파생 언어
APL은 다음 언어들의 기반을 형성하거나 영향을 미쳤다:
| 언어 | 설명 |
|---|---|
| A+ | APL의 대안 언어로, 그래픽 확장을 포함한다. |
| FP | 함수형 프로그래밍 언어이다. |
| 아이비(Ivy) | 롭 파이크가 개발한 APL 유사 언어의 인터프리터로, ASCII를 입력으로 사용한다.[42] |
| J | 아이버슨이 설계했으며, 특수 기호 대신 디그래프가 있는 ASCII를 사용한다.[43] |
| K | 아서 휘트니가 개발한 APL의 독점 변형이다.[44] |
| MATLAB | 수치 계산 도구이다.[45] |
| Nial | 함수형 프로그래밍 표기법을 갖춘 고급 배열 프로그래밍 언어이다. |
| Polymorphic Programming Language | 유사한 기본 언어를 가진 대화형 확장 가능한 언어이다. |
| S | 통계 프로그래밍 언어 (현재는 R로 알려진 오픈 소스 버전에서 일반적으로 사용됨)이다. |
| Snap! | 스크래치의 확장된 재구현으로 탄생한 로우코드 블록 기반 프로그래밍 언어이다. |
| 스피크이지(Speakeasy) | 수치 계산 대화형 환경이다. |
| Wolfram Language | Mathematica의 프로그래밍 언어이다.[46] |
APL은 다른 프로그래밍 언어와 구별되는 몇 가지 특징적인 연산 기능을 가지고 있다. 특히, 스칼라 값뿐만 아니라 배열도 식 내에서 직접 연산할 수 있다는 점에서 원시적인 제네릭 프로그래밍 기능을 제공한다. 또한, Fold와 유사한 고차 함수에 해당하는 기능도 갖추고 있다.
3. 언어 특징
APL의 두드러진 특징 중 하나는 배열 간 연산, 즉 배열 연산이 가능하다는 것이다. 예를 들어 `1 2 3 + 4 5 6`과 같은 식을 계산하면 각 요소를 더하여 `5 7 9`라는 배열을 결과로 얻는다. 이때, 두 배열의 길이가 다르면 오류가 발생한다. 전위 표기법을 사용한 경우에도 마찬가지로 각 요소별 연산 결과를 반환한다. 예를 들어 `! 2 3 4`는 각 요소의 팩토리얼을 계산하여 `2 6 24`라는 배열을 반환한다.
APL에서는 "함수"와 "작용자"라는 용어를 사용한다. 전치 연산자나 중위 연산자처럼 사용하는 기호열은 "함수"라고 부르며, 함수를 조작하는 고차 함수는 "작용자"라고 한다. 이는 해석학의 작용소 개념에서 유래했다.
APL은 동일한 기호(함수)를 전치 연산자(단항 연산자)와 중치 연산자(이항 연산자)로 사용하며, 각각 다른 의미를 부여한다. 이는 일종의 다중 정의이며, APL에서는 "일항"과 "이항"으로 구분한다.
APL은 연산자 우선순위가 없고 항상 오른쪽 결합을 따르므로, 문법의 모호성 문제가 발생하지 않는다. 일반적인 산술식에서 `3+2-1`은 왼쪽에서 오른쪽으로 `((3+2)-1)` (좌측 결합)을 의미하지만, APL에서는 오른쪽에서 왼쪽으로 `(3+(2-1))` (우측 결합)을 의미한다.
3. 1. 문자 집합
APL은 독특하고 비표준적인 문자 집합을 사용한다는 점에서 비판과 칭찬을 동시에 받았다. 1960년대와 1970년대에는 이러한 APL 문자 집합을 표현할 수 있는 터미널 장치나 디스플레이가 거의 없었다. 가장 많이 사용된 장치는 특수 APL 타입 요소가 장착된 IBM 셀렉트릭 인쇄 메커니즘이었다. 초기 APL 라인 터미널 중 하나는 전체 APL 문자 집합을 갖춘 텍사스 인스트루먼트 TI 모델 745였으며, 전이중 통신 모드를 통해 APL 시분할 서비스나 원격 메인프레임과 상호 작용하여 원격 컴퓨터 작업, 원격 작업 입력(RJE)을 실행할 수 있었다.[47]
시간이 지나면서 고품질 그래픽 디스플레이, 인쇄 장치, 유니코드 지원이 보편화되면서 APL 문자 글꼴 문제는 대부분 해결되었다. 그러나 APL 문자를 입력하려면 입력기(IME), 키보드 매핑, 가상/화면 APL 기호 세트[48][49] 또는 다른 프로그래밍 언어에 익숙한 초보자를 혼란스럽게 할 수 있는 쉬운 참조 인쇄 키보드 카드를 사용해야 한다.[50][51][52] 다른 프로그래밍 언어를 이전에 경험한 적이 없는 초보자의 경우, 고등학생을 대상으로 한 연구에서 APL 문자를 입력하고 사용하는 것이 학생들의 학습에 큰 영향을 주지 않는 것으로 나타났다.[53]
APL 옹호론자들은 APL이 입력해야 할 문자가 더 적고 키보드 매핑이 시간이 지남에 따라 암기된다고 주장한다. 특수 APL 키보드도 현재 제작되어 사용되고 있으며, 마이크로소프트 윈도우와 같은 운영 체제를 위한 무료 다운로드 글꼴도 제공된다.[48] 보고된 생산성 향상은 기호를 암기하고, 의미를 이해하며, 키보드 매핑 및 일반적인 작업에 대한 많은 관용구를 익히는 데 충분한 시간을 언어 사용에 할애한다는 것을 전제로 한다.
APL은 다른 많은 프로그래밍 언어와 달리 "APL 기호"라고 불리는 특수한 기호를 사용하며, 이를 통해 계산식을 매우 간결하게(지나치게) 표현할 수 있다.
특수한 기호 처리와 관련하여 키보드 입력의 경우, 이를 지원하기 위해 키 캡에 붙이는 스티커, 교체용 키 캡, 심지어 전용 키보드도 있다. 정보 교환용 또는 계산기 내부 표현으로는 기존에는 1바이트 문자 코드를 전환하는 등의 방법이 사용되었지만, 유니코드에서는 "기타 기술 기호"(Miscellaneous Technical)에 수록되었다(U+2336~U+237A). 출력은 초기에는 IBM Selectric 타자기의 골프볼 모양의 타입볼을 전용으로 교체하여 인쇄했다. DOS/V의 그래픽을 이용한 문자 표시 환경을 이용한 처리계가 만들어지기도 했다. 현재는 (새롭게 구현된 것에서는) 앞서 언급한 유니코드 글꼴이 사용된다.
APL에서는 프로그램을 매우 간결하게 작성할 수 있지만, 그 반면으로 가독성이 부족하여 "쓰기 전용 프로그램" 또는 "다른 사람이 쓴 것을 수정하는 것보다 새로 작성하는 것이 더 빠르다"는 말이 나오기도 한다.
| ' | ( | ) | + | , | - | . | / | : | ; | < | = | > | ? | [ | ] |
| \ | _ | ¨ | ¯ | × | ÷ | ← | ↑ | → | ↓ | ∆ | ∇ | ∘ | ∣ | ∧ | ∨ |
| ∩ | ∪ | ∼ | ≠ | ≤ | ≥ | ≬ | ⊂ | ⊃ | ⌈ | ⌊ | ⊤ | ⊥ | ⋆ | ⌶ | ⌷ |
| ⌸ | ⌹ | ⌺ | ⌻ | ⌼ | ⌽ | ⌾ | ⌿ | ⍀ | ⍁ | ⍂ | ⍃ | ⍄ | ⍅ | ⍆ | ⍇ |
| ⍈ | ⍉ | ⍊ | ⍋ | ⍌ | ⍍ | ⍎ | ⍏ | ⍐ | ⍑ | ⍒ | ⍓ | ⍔ | ⍕ | ⍖ | ⍗ |
| ⍘ | ⍙ | ⍚ | ⍛ | ⍜ | ⍝ | ⍞ | ⍟ | ⍠ | ⍡ | ⍢ | ⍣ | ⍤ | ⍥ | ⍦ | ⍧ |
| ⍨ | ⍩ | ⍪ | ⍫ | ⍬ | ⍭ | ⍮ | ⍯ | ⍰ | ⍱ | ⍲ | ⍳ | ⍴ | ⍵ | ⍶ | ⍷ |
| ⍸ | ⍹ | ⍺ | ⎕ | ○ |

3. 2. 설계
APL 코드는 일반적으로 단항 또는 이항 함수와 연산자[54]의 체인으로 구성되며, 배열에 작용한다.[55] APL은 단일 기호 또는 몇 개의 기호 조합으로 표시되는 여러 가지 비표준 ''기본 요소''(함수 및 연산자)를 가지고 있다. 모든 기본 요소는 동일한 우선 순위를 가지며 항상 오른쪽으로 결합한다. 따라서 APL은 ''오른쪽에서 왼쪽으로'' 읽거나 이해하는 것이 가장 좋다.초기 APL 구현(1970년경)에는 `do` 또는 `while` 루프와 같은 프로그래밍 루프 제어 흐름 구조와 `if-then-else` 구문이 없었다. 대신 배열 연산을 사용했으며, 연산이 한 문장에서 전체 배열에 대해 수행될 수 있었으므로 구조적 프로그래밍 구조의 사용이 종종 필요하지 않았다. 예를 들어, `iota` 함수(
ι)는 for-loop 반복을 대체할 수 있다. 스칼라 양의 정수에 적용될 때 ιN은 1차원 배열(벡터) 1 2 3 ... N을 생성한다. 이후 APL 구현에는 일반적으로 포괄적인 제어 구조가 포함되어 데이터 구조와 프로그램 제어 흐름을 명확하고 깔끔하게 분리할 수 있게 되었다.APL 환경을 ''작업 공간''이라고 한다. 작업 공간에서 사용자는 프로그램과 데이터를 정의할 수 있다. 즉, 데이터 값은 프로그램 외부에 존재하며 사용자는 프로그램을 정의하지 않고도 데이터를 조작할 수 있다.[56] 사용자는 모든 값, 프로그램 및 실행 상태와 함께 작업 공간을 저장할 수 있다.
APL은 전통적인 산술 및 대수 표기법의 확장인 일련의 비-ASCII 기호를 사용한다. 단일 지침, 다중 데이터(SIMD) 벡터 함수에 단일 문자를 사용하는 것은 APL이 Conway's Game of Life를 한 줄의 코드로 계산하는 것과 같은 데이터 변환을 위한 알고리즘의 간결한 공식을 가능하게 하는 한 가지 방법이다.[57] APL의 거의 모든 버전에서 이론적으로 모든 계산 가능한 함수를 한 표현식, 즉 한 줄의 코드로 표현하는 것이 가능하다.
APL은 다른 프로그래밍 언어에 비해 특징적인 연산 기능을 가진다. 특히 스칼라 값뿐만 아니라 배열도 식 내의 연산의 직접적인 대상이 될 수 있다는 원시적인 제네릭 프로그래밍 기능과, w:Fold (higher-order function) 등에 유사한 고차 함수에 상당하는 기능이 있다는 점이 특징이다.
APL에서는 전치 연산자 또는 중위 연산자처럼 사용하는 기호열을 "함수", 함수를 대상으로 조작하는 고차 함수의 의미를 가진 기호열을 "작용자"라고 한다.
일반적인 산술식에서 3+2-1은 왼쪽에서 오른쪽 순서로 ((3+2)-1)의 의미(좌측 결합)이지만, APL에서는 오른쪽에서 왼쪽으로 (3+(2-1))의 의미(우측 결합)이다. APL에는 이 "오른쪽에서 왼쪽" 규칙밖에 존재하지 않는다. 일반적인 산술에서는 덧셈과 뺄셈보다 곱셈과 나눗셈이 먼저라는 규칙이 있지만, APL에서는 곱셈도 덧셈도 마찬가지로 "오른쪽에서 왼쪽" 규칙에 따른다.
APL에서는 같은 기호열(함수)을 전치 연산자(단항 연산자) 형태와 중치 연산자(2항 연산자) 형태로 사용하며, 각각에서 의미가 다르다는 일종의 다중 정의가 다용된다. APL 용어로는 "일항", "이항"이라고 한다.
APL의 특징 중 하나는 배열 연산, 즉 배열 간의 연산이 가능하다는 점이다. 예를 들어 1 2 3 + 4 5 6 이라는 식을 평가하면 각 요소별로 덧셈을 수행하여 5 7 9 라는 배열을 반환한다.
"내적"과 "외적"이라고 불리는 작용소는 곱(및 합)을 연산자로 취하고, 그것에 의해 정의되는 내적과 외적 (outer product)을 계산하는 연산자를 반환하는 작용소로 해석할 수 있다.
내적의 작용소 기호는 "."이며, (함수1).(함수2) 로 두 함수를 합성한다. 예를 들어, 9 8 7 +.× 6 5 4 라고 했을 경우, 먼저 뒤의 함수(이 경우에는
×)를 각 요소마다 적용하여 9×6 8×5 7×4 가 된다. 이 결과의 요소 사이에, 앞의 함수(여기에서는 +)를 넣은 계산인 9×6 + 8×5 + 7×4 가 전체의 의미이며, 평가하면 122를 얻는다.외적의 작용소 기호열은 "∘."이며, ∘.(함수) 라고 하면, 배열에 대해 함수를 적용한다. 예를 들어, 1 2 3 ∘.× 4 5 6 7 라고 했을 경우, 다음과 같은 계산이 행해진다.
| × | 4 | 5 | 6 | 7 |
|---|---|---|---|---|
| 1 | 1 × 4 | 1 × 5 | 1 × 6 | 1 × 7 |
| 2 | 2 × 4 | 2 × 5 | 2 × 6 | 2 × 7 |
| 3 | 3 × 4 | 3 × 5 | 3 × 6 | 3 × 7 |
3. 3. 용어
APL은 ''함수''와 ''연산자''를 명확하게 구분한다.[54][65] 함수는 배열(변수, 상수 또는 표현식)을 인수로 받아 배열을 결과로 반환한다. 연산자( 고차 함수와 유사)는 함수 또는 배열을 인수로 받아 관련 함수를 파생한다. 예를 들어, ''합계'' 함수는 ''축약'' 연산자를 ''덧셈'' 함수에 적용하여 파생된다. 동일한 축약 연산자를 ''최대'' 함수(두 숫자 중 더 큰 숫자를 반환)에 적용하면 숫자 그룹(벡터) 중 가장 큰 숫자를 반환하는 함수가 파생된다. J 언어에서 아이버슨은 ''함수''라는 용어를 ''동사''로, ''연산자''를 ''부사'' 또는 ''접속사''로 대체했다.APL은 또한 언어에 내장되어 있고 기호 또는 고정된 기호 조합으로 표시되는 기능을 ''기본 요소''로 식별한다. 대부분의 기본 요소는 함수 또는 연산자이다. APL 코딩은 주로 비 기본 함수와 (일부 APL 버전에서) 연산자를 작성하는 과정이다. 그러나 몇 가지 기본 요소는 함수도 연산자도 아닌 것으로 간주되며, 가장 두드러진 것은 할당이다.
APL 문헌에서 사용되는 일부 단어는 수학 및 일반적인 컴퓨터 과학의 단어와 다른 의미를 갖는다.
| 용어 | 설명 |
|---|---|
| 함수 | 0개, 1개(오른쪽) 또는 2개(왼쪽 및 오른쪽)의 인수를 받는 연산 또는 매핑으로, 스칼라, 배열 또는 더 복잡한 구조일 수 있으며, 유사하게 복잡한 결과를 반환할 수 있다. 함수는 다음과 같다. |
| 배열 | 각 항목이 기본 스칼라 데이터 또는 다른 배열인 직교 차원이 0개 이상인 행 우선 순서의 데이터 값 개체[67] |
| 닐래딕 | 인수가 없거나 필요하지 않음, 널러리[68] |
| 모나딕 | 하나의 인수만 필요; 함수의 경우 오른쪽에, 연산자의 경우 왼쪽에, 단항[68] |
| 다이아딕 | 왼쪽 및 오른쪽 인수를 모두 필요, 이항[68] |
| 앰비밸런트 또는 모나딕 | 모나딕 또는 다이아딕 컨텍스트에서 사용할 수 있으며, 왼쪽 인수를 생략할 수 있음[66] |
| 연산자 | 하나(왼쪽) 또는 두 개(왼쪽 및 오른쪽)의 함수 또는 배열 값 인수를 취하고 함수를 파생하는 연산 또는 매핑. 연산자는 다음과 같다. |
APL은 다른 프로그래밍 언어에 비해 특징적인 연산 기능을 가진다. 특히 스칼라 값뿐만 아니라 배열도 식 내에서 직접 연산할 수 있는 원시적인 제네릭 프로그래밍 기능과, Fold와 유사한 고차 함수에 해당하는 기능이 있다는 점이 특징이다.
APL에서 함수와 연산자는 각각 영어로 function과 operator이며, 일본 APL 협회가 배포하는 미에다 교스케 역 「APL2 소개」에서는 이를 '함수'와 '작용자'로 번역했다. APL에서는 전치 연산자 또는 중위 연산자처럼 사용하는 기호열을 "함수", 함수를 조작하는 고차 함수를 "작용자"라고 한다. 이는 해석학에서의 작용소에서 유래했다.
APL에서는 같은 기호열(함수)을 전치 연산자(단항 연산자)와 중치 연산자(2항 연산자) 형태로 사용하며, 각각 다른 의미를 가진다. (기본적으로 서로 연관되는 의미를 가지지만) 이는 일종의 다중 정의이다. APL에서는 이를 "일항"과 "이항"이라고 한다. 다른 언어에서도, 예를 들어 C 언어에서 `*`(별표)는 곱셈의 중치 연산자이자, 전치 연산자로는 포인터의 역참조이다. 그러나 APL에서는 대부분의 함수가 일항과 이항 각각의 의미를 가진다.
예를 들어 `!`은 전치 연산자로 팩토리얼을 나타내며, `! 5`는 120을 반환한다. 그러나 중치 연산자로 사용하면 조합의 수를 나타내며, `2 ! 5`는 10 (=5C2)을 반환한다.
APL은 우선순위가 없고 항상 오른쪽 결합이므로, 문법의 모호성(다의성) 문제는 없다.
APL의 특징 중 하나는 배열 연산, 즉 배열 간의 연산이 가능하다는 점이다. 예를 들어 `1 2 3 + 4 5 6`이라는 식을 평가하면 (값은 공백으로 구분된 배열 리터럴이다) 각 요소별로 덧셈을 수행하여 `5 7 9`라는 배열을 반환한다. 두 배열의 길이가 같지 않으면 오류가 발생한다. 전위 표기법을 사용한 경우에도 마찬가지로 각 요소별 연산 결과를 반환한다. 예를 들어, `! 2 3 4`는 각 요소의 팩토리얼을 요소로 하는 배열 `2 6 24`를 반환한다.
"내적"과 "외적"은 곱(및 합)을 연산자로 취하고, 이를 통해 내적과 외적 (outer product)을 계산하는 연산자를 반환하는 作用素(작용소)로 해석할 수 있다.
내적의 作用素(작용소) 기호는 "."이며, `(함수1).(함수2)` 형태로 두 함수를 합성한다. 예를 들어, `9 8 7 +.× 6 5 4`는 먼저 뒤의 함수(`×`)를 각 요소마다 적용하여 `9×6 8×5 7×4`가 된다. 이 결과의 요소 사이에 앞의 함수(`+`)를 넣어 `9×6 + 8×5 + 7×4`와 같이 계산하며, 평가 결과는 122이다. (오른쪽에서 왼쪽 규칙에 따라 `(9×6) + ((8×5) + (7×4))`로 작용한다.)
이처럼 2개의 1차원 배열에 대해 `.+`를 `+.×`와 같이 사용하면 벡터의 내적을 계산하며, 2차원 배열에 대해 사용하면 행렬곱이 된다. 하지만, 다른 함수와도 조합하여 사용할 수 있다.
외적의 作用素(작용소) 기호열은 "∘."이며 ("∘"는 내적과 조합되지 않는다), `∘.(함수)` 형태로 배열에 함수를 적용한다. 예를 들어, `1 2 3 ∘.× 4 5 6 7`는 다음과 같이 계산된다.
| × | 4 | 5 | 6 | 7 |
|---|---|---|---|---|
| 1 | 1 × 4 | 1 × 5 | 1 × 6 | 1 × 7 |
| 2 | 2 × 4 | 2 × 5 | 2 × 6 | 2 × 7 |
| 3 | 3 × 4 | 3 × 5 | 3 × 6 | 3 × 7 |
결과는 다음과 같은 2차원 배열이 된다.
| 4 | 5 | 6 | 7 |
| 8 | 10 | 12 | 14 |
| 12 | 15 | 18 | 21 |
3. 4. 구문
APL은 함수, 연산자 및 구문에 대한 명시적 표현을 가지며, 이는 언어의 확장된 기능과 이를 실험할 수 있는 도구를 명확하고 명시적으로 표현할 수 있는 기반을 제공한다.[69] APL은 대부분의 다른 프로그래밍 언어에서 구문 오류를 발생시키는 경우에 기본 동작을 정의하는 특징이 있다.예를 들어, 지수 연산은 `2*3`으로 표기되는데, 이는 2를 3제곱하는 것을 나타낸다. 다른 언어에서는 `2^3` 또는 `2**3`으로 표기되거나, `pow(2, 3);`과 같은 함수 호출로 대체된다. 그러나 APL은 곱셈에 `2×3`을 사용한다. 밑이 지정되지 않은 경우(`*3`과 같이), 대부분의 프로그래밍 언어에서는 이를 구문 오류로 간주하지만, APL은 누락된 밑을 자연 로그 상수 e로 간주하고, `*3`을 `2.71828*3`으로 해석한다.
`X`가 숫자 배열일 때, `(+/X)÷⍴X`는 평균을 계산한다. 오른쪽에서 왼쪽으로 읽으면, `⍴X`는 X의 요소 개수를 나타내고, `÷`는 이항 연산자이므로 왼쪽에 항이 필요하다. 그렇지 않으면 X가 사용되어 `X÷⍴X` (X의 각 요소를 X의 요소 개수로 나눈 값의 합)가 되며, 괄호로 묶여 있다. `+/X`는 X의 요소 합을 제공한다. 이를 바탕으로, 표준 편차는 다음 식으로 계산된다: `((+/((X - (+/X)÷⍴X)*2))÷⍴X)*0.5`
반복적으로 사용하기 위해 위 식을 함수로 정의할 수 있다. 할당은 연산자이므로 식 내에서 나타날 수 있으며, 다음은 적절한 값을 T, AV, SD에 배치한다: `SD←((+/((X - AV←(T←+/X)÷⍴X)*2))÷⍴X)*0.5`
다음은 일반적인 'Pick 6' 복권 번호를 생성하는 즉시 모드 표현식이다. 1부터 40까지의 여섯 개의 의사 난수 정수이며, "중복되지 않음"을 보장하며 오름차순으로 정렬하여 표시한다.
```apl
x[⍋x←6?40]
```
위 표현식은 APL ''함수''(또는 ''프리미티브''[70] 및 ''글리프''[71]라고도 함)를 결합하여 간결하게 표현한다.
- 가장 먼저 실행되는 함수(APL은 오른쪽에서 왼쪽으로 실행됨)는 이항 함수 `?` (이항일 때 `deal`이라고 함)로, 선택된 개수(왼쪽 인수: 이 경우 6)의 난수 정수로 구성된 벡터를 반환하며, 범위는 1부터 지정된 최댓값(오른쪽 인수: 이 경우 40)까지이다. 이 최댓값이 벡터 길이보다 크거나 같으면 중복되지 않음이 보장된다. 따라서 1부터 40까지의 6개의 난수를 생성한다.[72]
- 이 벡터는 변수 `x`에 할당(`←`)된다.
- 이 벡터는 단항 `⍋` 함수에 의해 오름차순으로 정렬된다. `⍋`의 결과는 인수를 오름차순으로 정렬하는 데 사용되는 인덱스이다.
- `⍋`의 출력을 이전에 저장한 변수 `x`를 인덱싱하는 데 사용하므로 오름차순으로 해당 항목을 선택한다.
가장 왼쪽에 있는 x의 왼쪽에 결과에 대해 APL에 무엇을 할지 알려주는 함수가 없으므로, 명시적인 지시 없이 단순히 (공백으로 구분된) 한 줄로 디스플레이에 출력한다.
`?`는 또한 단항 연산인 `roll`도 가지고 있는데, 이는 1과 오른쪽 피연산자 사이의 하나의 난수를 반환한다. 따라서 롤플레잉 게임 프로그램은 20면 주사위를 굴리기 위해 `?20` 표현식을 사용할 수 있다.
다음은 1부터 R까지의 모든 소수를 찾는 식으로, 시간과 공간 복잡도는 이다(빅 오 표기법).
```apl
(~R∊R∘.×R)/R←1↓⍳R
```
오른쪽에서 왼쪽으로 실행하면 다음과 같다.
- ''아이오타'' `⍳`는 `1`부터 `R`까지의 정수를 포함하는 벡터를 생성한다 (프로그램 시작 시 `R= 6`이면 `⍳R`은 `1 2 3 4 5 6`).
- 이 벡터의 첫 번째 요소(`↓` 함수)인 `1`을 제거한다. 즉, `1↓⍳R`은 `2 3 4 5 6`이다.
- `R`을 새 벡터로 설정(`←`, ''할당'' 기본 요소)한다. 즉, `2 3 4 5 6`
- `/` ''반복'' 연산자는 이항(이진) 연산자이며 인터프리터는 먼저 왼쪽 인수를 평가한다(괄호 안에서 전체적으로).
- `R`과 `R`을 곱한 ''외적''을 생성한다. 즉, R과 R의 ''곱셈표''인 행렬(`°.×` 연산자)이다.
| 4 | 6 | 8 | 10 | 12 |
| 6 | 9 | 12 | 15 | 18 |
| 8 | 12 | 16 | 20 | 24 |
| 10 | 15 | 20 | 25 | 30 |
| 12 | 18 | 24 | 30 | 36 |
- `R`과 길이가 같은 벡터를 만들고 외적 행렬에 `R`의 해당 숫자가 있는 각 위치에 `1`을 넣는다(`∈`, ''집합 포함'' 또는 ''요소'' 또는 ''엡실론'' 연산자). 즉, `0 0 1 0 1`
- 벡터의 값을 논리적으로 부정(''not'') (0을 1로, 1을 0으로 변경)한다(`∼`, 논리 ''not'' 또는 ''틸드'' 연산자). 즉, `1 1 0 1 0`
- 해당 요소가 `1`인 `R`의 항목을 선택한다(`/` ''반복'' 연산자). 즉, `2 3 5`
(이는 APL 원점이 1이라고 가정한다. 즉, 인덱스는 1부터 시작한다. APL은 0을 원점으로 사용하도록 설정할 수 있으므로 `ι6`은 `0 1 2 3 4 5`이며, 이는 일부 계산에 편리하다.)
다음은 행렬 X에 저장된 단어 목록을 단어 길이에 따라 정렬하는 표현식이다.
```apl
X[⍋X+.≠' ';]
```
다음은 Dyalog APL로 작성된 "life" 함수인데, 이는 부울 행렬을 입력받아 콘웨이의 생명 게임에 따라 새로운 세대를 계산한다.[73][74]
```apl
life ← {⊃1 ⍵ ∨.∧ 3 4 = +/ +⌿ ¯1 0 1 ∘.⊖ ¯1 0 1 ⌽¨ ⊂⍵}
```
다음은 Dyalog APL을 사용한 예시로, 첫 번째 줄은 HTML 코드를 변수 `txt`에 할당한 다음 APL 표현식을 사용하여 모든 HTML 태그를 제거한다.
```apl
txt←'
This is emphasized text.
'{⍵ /⍨ ~{⍵∨≠\⍵}⍵∊'<>'} txt
3. 5. 예시
apl'Hello, world'
```
APL의 디자인은 대부분의 다른 프로그래밍 언어에서 구문 오류를 발생시키는 경우에 기본 동작을 정의하는 것이다.
위의 'Hello, world' 문자열 상수가 표시되는 이유는 표시가 명시적으로 동작(예: 할당, 함수 매개변수)이 지정되지 않은 모든 표현식에 대한 기본 동작이기 때문이다.[69]
APL에서 지수 연산은 `2*3`으로 표기된다. 이는 2를 3제곱하는 것을 나타낸다. 다른 언어에서는 `2^3` 또는 `2**3`으로 표기되거나, `pow(2, 3)`과 같은 함수 호출로 대체된다. 많은 언어에서 곱셈을 나타내기 위해 `*`를 사용하지만, APL은 `2×3`을 사용한다. 하지만 밑이 지정되지 않은 경우(APL의 `*3` 문과 같이), 대부분의 프로그래밍 언어에서는 이를 구문 오류로 간주한다. APL은 누락된 밑을 자연 로그 상수 e로 간주하고, `*3`을 `2.71828*3`으로 해석한다.
`X`가 숫자 배열이라고 가정하면, `(+/X)÷⍴X`는 평균을 구한다. ''오른쪽에서 왼쪽으로'' 읽으면, `⍴X`는 X의 요소 개수를 나타내고, `÷`는 이항 연산자이므로, 왼쪽에 항이 필요하다. 그렇지 않으면 X가 사용되므로 (`X÷⍴X`의 합, 즉 X의 각 요소를 X의 요소 개수로 나눈 값의 합) 괄호로 묶여 있으며, `+/X`는 X의 요소 합을 제공한다. 이를 바탕으로, 다음 식은 표준 편차를 계산한다:
```apl
((+/((X-(+/X)÷⍴X)*2))÷⍴X)*0.5
```
반복적으로 사용하기 위해 함수로 정의하면 다음과 같다.
```apl
SD←((+/((X-AV←(T←+/X)÷⍴X)*2))÷⍴X)*0.5
```
다음은 일반적인 ''Pick 6'' 복권 번호를 생성하는 표현식이다. 1부터 40까지의 여섯 개의 의사 난수 정수이며, "중복되지 않음"을 보장하며 오름차순으로 정렬하여 표시한다.
```apl
x[⍋x←6?40]
```
위 표현식은 다음 APL ''함수''를 결합한다.
- 가장 먼저 실행되는 함수는 이항 함수 `?` (이항일 때 `deal`이라고 함)로, 선택된 개수(왼쪽 인수: 이 경우 6)의 난수 정수로 구성된 벡터를 반환하며, 범위는 1부터 지정된 최댓값(오른쪽 인수: 이 경우 40)까지이다. 이 최댓값이 벡터 길이보다 크거나 같으면 중복되지 않음이 보장된다. 따라서 1부터 40까지의 6개의 난수를 생성한다.[72]
- 이 벡터는 변수 `x`에 ''할당''된다(`←`).
- 이 벡터는 단항 `⍋` 함수에 의해 오름차순으로 ''정렬''된다. `⍋`의 결과는 인수를 오름차순으로 정렬하는 데 사용되는 인덱스이다.
- `⍋`의 출력을 이전에 저장한 변수 `x`를 인덱싱하는 데 사용하므로 ''오름차순''으로 해당 항목을 선택한다.
가장 왼쪽에 있는 x의 왼쪽에 결과에 대해 APL에 무엇을 할지 알려주는 함수가 없으므로, 명시적인 지시 없이 단순히 (공백으로 구분된) 한 줄로 디스플레이에 출력한다.
`?`는 또한 단항 연산인 `roll`도 가지고 있는데, 이는 1과 단독 피연산자 [그 오른쪽에] 사이의 하나의 난수를 반환한다. 롤플레잉 게임 프로그램은 20면 주사위를 굴리기 위해 표현식 `?20`을 사용할 수 있다.
다음 식은 1부터 R까지의 모든 소수를 찾는다. 시간과 공간 복잡도 모두 이다(빅 오 표기법).
```apl
(~R∊R∘.×R)/R←1↓⍳R
```
오른쪽에서 왼쪽으로 실행하면 다음과 같다.
- ''아이오타'' `⍳`는 `1`부터 `R`까지의 정수를 포함하는 벡터를 생성한다 ( `R= 6`이면 `⍳R`은 `1 2 3 4 5 6`).
- 이 벡터의 첫 번째 요소(`↓` 함수)인 `1`을 ''제거''한다. 즉, `1↓⍳R`은 `2 3 4 5 6`이다.
- `R`을 새 벡터로 ''설정''한다(`←`, ''할당'' 기본 요소). 즉, `2 3 4 5 6`
- `/` ''반복'' 연산자는 이항(이진) 연산자이며 인터프리터는 먼저 왼쪽 인수를 평가한다(괄호 안에서 전체적으로).
- `R`과 `R`을 곱한 ''외적''을 생성한다. 즉, R과 R의 ''곱셈표''인 행렬(`°.×` 연산자)이다.
| 4 | 6 | 8 | 10 | 12 |
| 6 | 9 | 12 | 15 | 18 |
| 8 | 12 | 16 | 20 | 24 |
| 10 | 15 | 20 | 25 | 30 |
| 12 | 18 | 24 | 30 | 36 |
- `R`과 길이가 같은 벡터를 만들고 외적 행렬에 `R`의 해당 숫자가 있는 각 위치에 `1`을 넣는다(`∈`, ''집합 포함'' 또는 ''요소'' 또는 ''엡실론'' 연산자). 즉, `0 0 1 0 1`
- 벡터의 값을 논리적으로 부정합니다(''not'') (0을 1로, 1을 0으로 변경)(`∼`, 논리 ''not'' 또는 ''틸드'' 연산자). 즉, `1 1 0 1 0`
- 해당 요소가 `1`인 `R`의 항목을 선택합니다(`/` ''반복'' 연산자). 즉, `2 3 5`
다음 표현식은 행렬 X에 저장된 단어 목록을 단어 길이에 따라 정렬한다.
```apl
X[⍋X+.≠' ';]
```
다음은 Dyalog APL로 작성된 "life" 함수인데, 이는 부울 행렬을 입력받아 콘웨이의 생명 게임에 따라 새로운 세대를 계산한다.[73][74]
```apl
life ← {⊃1 ⍵ ∨.∧ 3 4 = +/ +⌿ ¯1 0 1 ∘.⊖ ¯1 0 1 ⌽¨ ⊂⍵}
```
다음은 HTML 태그를 제거하는 예시이다.
```apl
txt←'
This is emphasized text.
'{⍵ /⍨ ~{⍵∨≠\⍵}⍵∊'<>'} txt
This is emphasized text.
4. 명칭
케네스 아이버슨의 저서 "A Programming Language"의 머리글자에서 따왔다.[2] 아딘 팔코프가 1966년 IBM에서 APL\360을 구현하는 동안 이 이름을 지었다.
5. 로고
APL은 다른 많은 프로그래밍 언어와 달리 "APL 기호"라고 불리는 특수한 기호를 사용하여 계산식을 매우 간결하게(지나치게) 기술할 수 있다.
특수 기호 처리를 위해 키보드 입력 시에는 키 캡에 붙이는 스티커, 교체용 키 캡, 전용 키보드 등을 사용했다. 정보 교환이나 계산기 내부 표현에는 1바이트 문자 코드를 전환하는 방법을 사용했지만, 유니코드에서는 "기타 기술 기호"(Miscellaneous Technical)에 수록되었다(U+2336~U+237A). 출력은 초기에는 IBM Selectric 타자기의 골프볼 모양 타입볼을 전용으로 교체하여 인쇄했다. DOS/V의 그래픽을 이용한 문자 표시 환경을 이용한 처리계가 만들어지기도 했다. 현재는 (새롭게 구현된 것에서는) 앞서 언급한 유니코드 글꼴이 사용된다.
| ' | ( | ) | + | , | - | . | / | : | ; | < | = | > | ? | [ | ] |
| \ | _ | ¨ | ¯ | × | ÷ | ← | ↑ | → | ↓ | ∆ | ∇ | ∘ | ∣ | ∧ | ∨ |
| ∩ | ∪ | ∼ | ≠ | ≤ | ≥ | ≬ | ⊂ | ⊃ | ⌈ | ⌊ | ⊤ | ⊥ | ⋆ | ⌶ | ⌷ |
| ⌸ | ⌹ | ⌺ | ⌻ | ⌼ | ⌽ | ⌾ | ⌿ | ⍀ | ⍁ | ⍂ | ⍃ | ⍄ | ⍅ | ⍆ | ⍇ |
| ⍈ | ⍉ | ⍊ | ⍋ | ⍌ | ⍍ | ⍎ | ⍏ | ⍐ | ⍑ | ⍒ | ⍓ | ⍔ | ⍕ | ⍖ | ⍗ |
| ⍘ | ⍙ | ⍚ | ⍛ | ⍜ | ⍝ | ⍞ | ⍟ | ⍠ | ⍡ | ⍢ | ⍣ | ⍤ | ⍥ | ⍦ | ⍧ |
| ⍨ | ⍩ | ⍪ | ⍫ | ⍬ | ⍭ | ⍮ | ⍯ | ⍰ | ⍱ | ⍲ | ⍳ | ⍴ | ⍵ | ⍶ | ⍷ |
| ⍸ | ⍹ | ⍺ | ⎕ | ○ |
6. 사용 분야
APL은 금융 및 보험 애플리케이션,[88] 인공지능,[80][81] 인공 신경망[82] 및 로봇 공학을 포함한 다양한 목적으로 사용된다.[83] APL은 계산 도구이지 프로그래밍 언어가 아니라는 주장도 있다.[84] APL의 기호적 특성과 배열 기능은 도메인 전문가와 데이터 과학자들이 컴퓨터 프로그래머의 기술을 갖추지 않거나 필요로 하지 않음에도 불구하고 APL을 선호하게 만들었다.
APL은 행렬 곱셈으로 그래픽 변환을 인코딩할 수 있어 이미지 조작 및 컴퓨터 애니메이션에 적합하다. 최초의 상업용 컴퓨터 그래픽 회사 중 하나인 디지털 이펙츠는 "Visions"라는 APL 그래픽 제품을 제작했으며, 이 제품은 1982년 영화 ''트론''의 텔레비전 광고 및 애니메이션 제작에 사용되었다.[86] 최근에는 [https://stormwind.fi/en/ Stormwind]의 보트 시뮬레이터가 APL을 사용하여 핵심 로직, 렌더링 파이프라인 미들웨어와의 인터페이싱 및 물리 엔진의 주요 부분을 구현한다.[87]
오늘날 APL은 투자 관리,[88] 자산 관리,[89] 헬스케어,[90] 및 DNA 프로파일링과 같은 광범위한 상업 및 과학 응용 분야에서 계속 사용되고 있다.[91][92]
7. 주요 구현
APL의 초기 구현(1970년경)은 `do` 또는 `while` 루프와 같은 프로그래밍 제어 흐름 구조와 `if-then-else` 구문이 없었다. 대신 배열 연산을 사용했으며, 한 문장에서 전체 배열에 대해 연산을 수행할 수 있었기 때문에 구조적 프로그래밍 구조를 사용할 필요가 없는 경우가 많았다. 예를 들어, `iota` 함수(`ι`)는 for-loop 반복을 대체할 수 있었다. 스칼라 양의 정수에 적용될 때 ιN은 1차원 배열(벡터) 1, 2, 3, ..., N을 생성한다. 이후 APL 구현에는 일반적으로 포괄적인 제어 구조가 포함되어 데이터 구조와 프로그램 제어 흐름을 명확하고 깔끔하게 분리할 수 있게 되었다.[11]
APL 환경은 ''작업 공간''이라고 불린다. 작업 공간에서 사용자는 프로그램과 데이터를 정의할 수 있다. 즉, 데이터 값은 프로그램 외부에 존재하며, 사용자는 프로그램을 정의하지 않고도 데이터를 조작할 수 있다.[56] 사용자는 모든 값, 프로그램, 실행 상태와 함께 작업 공간을 저장할 수 있다.
APL은 전통적인 산술 및 대수 표기법을 확장한 일련의 비-ASCII 기호를 사용한다. 단일 지침, 다중 데이터(SIMD) 벡터 함수에 단일 문자를 사용하는 것은 APL이 Conway's Game of Life를 한 줄의 코드로 계산하는 것과 같이 데이터 변환을 위한 알고리즘의 간결한 공식을 가능하게 하는 한 가지 방법이다.[57] APL의 거의 모든 버전에서 이론적으로 모든 계산 가능한 함수를 한 표현식, 즉 한 줄의 코드로 표현하는 것이 가능하다.
특이한 문자 집합 때문에 많은 프로그래머가 APL 코드를 작성하기 위해 APL 키캡이 있는 특수 컴퓨터 키보드를 사용했다.[58] ASCII 문자만 사용하여 APL 코드를 작성하는 다양한 방법이 있지만,[59] 실제로 거의 사용되지 않는다. 대부분의 최신 구현에서는 비 ASCII 문자에 접근하기 위해 특수 매핑 또는 입력 방식 편집기를 사용하여 표준 키보드 레이아웃을 사용한다. 역사적으로 APL 글꼴은 대문자 이탤릭 알파벳 문자와 정체 숫자 및 기호로 독특했다. 대부분의 공급업체는 사용자 정의 글꼴로 APL 문자 집합을 계속 표시한다.
APL 지지자들은 소위 ''쓰기 전용 코드''(잘못 작성되어 거의 이해할 수 없는 코드)는 거의 예외 없이 모든 언어에서 발생할 수 있는 잘못된 프로그래밍 관행이나 초보자 실수의 예라고 주장한다. 이들은 APL을 사용하면 더 전통적인 컴퓨터 언어보다 훨씬 더 생산적이며, 다른 기술을 사용하는 것보다 훨씬 적은 시간과 적은 프로그래머로 작동하는 소프트웨어를 구현할 수 있다고 주장한다.
또한 APL은 간결하기 때문에 코드 줄 수를 크게 줄일 수 있어 대규모 소프트웨어 개발 및 복잡성에 적합하다고 주장할 수 있다. 많은 APL 지지자와 실무자는 COBOL 및 자바와 같은 표준 프로그래밍 언어를 비교적 지루한 것으로 간주한다. APL은 거래 시스템과 같이 시장 출시 시간이 중요한 경우에 자주 사용된다.[61][62][63][64]
APL은 함수, 연산자, 구문에 대한 명시적인 표현을 가지고 있어 언어의 확장된 기능과 이를 실험할 수 있는 도구를 명확하고 명시적으로 표현할 수 있는 기반을 제공한다.[69]
7. 1. APL\360
APL\360은 1966년 11월 IBM System/360에서 실행된 최초의 APL 구현이다.[93] IBM 내부에서만 사용되다가,[35] 1973년 구현 개발자인 래리 브리드, 딕 래스웰, 로저 무어가 ACM(Association for Computing Machinery)에서 그레이스 머레이 호퍼상을 수상했다.[94][95][96] "APL\360의 설계 및 구현을 통해 대화형 시스템의 단순성, 효율성, 신뢰성, 응답 시간에 대한 새로운 기준을 제시"했다는 공로였다.[94]1975년 IBM 5100 마이크로컴퓨터는 APL\360[97]을 내장 ROM 기반 인터프리터 언어 중 하나로 제공했다. 이 컴퓨터는 언어에 사용되는 특수 기호를 모두 지원하는 키보드와 디스플레이를 갖추고 있었다.[98]
APL\360의 주요 개발로는 CMS(Conversational Monitor System)의 가상 메모리 기능을 활용한 CMS/APL, 공유 변수, 시스템 변수 및 시스템 함수를 도입한 APLSV가 있다. APL\360은 이후 IBM System/370 및 VSPC(Virtual Storage Personal Computing) 플랫폼으로 이식되어 1983년 마지막 릴리스까지 사용되었고, 이후 APL2로 대체되었다.[35]
7. 2. APL\1130
1968년, IBM은 IBM 1130용으로 최초의 공개 APL 시스템인 APL\1130을 제작했다.[99] 이는 IBM이 출시한 가장 인기 있는 IBM Type-III Library 소프트웨어가 되었다.[100]7. 3. APL*Plus 및 Sharp APL
APL*Plus와 Sharp APL은 APL\360의 버전으로, 데이터 형식 지정 및 APL 배열을 외부 파일에 저장하는 기능 등 비즈니스 지향적인 확장이 추가되었다.[101] 이들은 I. P. 샤프 어소시에이츠(IPSA)와 STSC가 공동으로 개발했는데, 두 회사 모두 원래의 IBM APL\360 개발 팀의 여러 구성원을 고용했다.[101]IPSA는 1964년 이안 샤프(Ian Sharp), 로저 무어(Roger Moore) 등에 의해 설립된 APL\360 서비스 회사였고,[101] STSC는 1969년 로렌스 브리드(Lawrence Breed) 등에 의해 설립된 시분할 및 컨설팅 서비스 회사였다.[101] 두 회사는 APL*Plus를 공동 개발한 후, APL*Plus와 Sharp APL로 각각 APL을 별도로 개발했다. STSC는 APL*Plus를 VAX 11,[102] PC 및 UNIX용 버전을 포함한 다양한 플랫폼으로 이식했다. 반면 IPSA는 개인용 컴퓨터의 등장에 다른 접근 방식을 취하여, 추가적인 PC-XT/360 하드웨어를 통해 Sharp APL을 사용할 수 있게 했다. 1993년, Sharp APL을 지원하기 위해 솔리톤 인코퍼레이티드가 설립되었고, Sharp APL은 SAX(유닉스용 Sharp APL)로 개발되었다. 현재 APL*Plus는 APL2000 APL+Win으로 계속 개발되고 있다.
1985년, 이안 샤프와 STSC의 댄 다이어(Dan Dyer)는 APL에 대한 공헌을 인정받아 케네스 E. 아이버슨 상을 공동 수상했다.[112]
7. 4. APL2
APL2는 1984년 IBM에서 처음 출시한 APL의 중요한 재구현이었다. APL2는 중첩(비직사각형) 배열 지원 등 여러 가지 기능을 추가했다.[35] 2007년에는 APL2 제품 및 서비스 팀 전체가 아이버슨 상을 수상했다.[112]2021년, IBM은 APL2를 Log-On Software에 매각했으며, Log-On Software는 이 제품을 ''Log-On APL2''로 개발 및 판매하고 있다.[103]
7. 5. APLGOL
1972년, 구조적 프로그래밍 언어 구문을 추가한 실험적 버전인 APLGOL이 출시되었다.[9]7. 6. Dyalog APL
Dyalog APL은 1983년에 출시된 상용 APL 구현이다.[9] 객체 지향 프로그래밍, 함수형 프로그래밍, 묵시적 프로그래밍을 지원한다.1995년, 존 스콜스(John Scholes)와 피터 도넬리(Peter Donnelly)는 Dyalog APL 개발에 기여한 공로로 케네스 아이버슨 상을 수상했다.[9] 2016년에는 기테 크리스텐센(Gitte Christensen)과 모르텐 크롬베르그(Morten Kromberg)가 이 상을 수상했다.[9]
7. 7. APLX
APLX영어는 2002년에 출시된 APL2를 기반으로 한 APL의 한 종류로, 여러 가지 기능 확장이 포함되었다.7. 8. York APL
1968년경 요크 대학교에서 APL이 개발되었으며, IBM 360 메인프레임에서 실행되었다.7. 9. GNU APL
GNU APL은 확장 APL의 무료 구현체이다. 리처드 스톨만은 GNU APL의 초기 사용자였다.[2]8. APL의 해석 및 컴파일
APL 구현에는 APLX, Dyalog 등에서 제공하는 객체 지향 프로그래밍 확장, .NET 지원, XML-배열 변환 기본 요소, 그래프 작성, 운영 체제 인터페이스, 람다 대수 표현식 등이 있다. 프리웨어 버전으로는 리눅스용 GNU APL과 윈도우용 NARS2000이 있으며, NARS2000은 Wine을 사용하여 리눅스에서도 실행된다. 이 두 버전 모두 다양한 언어 확장을 포함한 비교적 완전한 APL2 버전이다.[35] APL2는 IBM에서 1971년부터 개발되어 1984년에 처음 출시된 APL의 중요한 재구현이었다. 이 언어는 중첩(비직사각형) 배열 지원 등 여러 가지 기능을 추가했다.[35] APL2 제품 및 서비스 팀 전체는 2007년에 아이버슨 상을 수상했다.[112] 2021년, IBM은 APL2를 Log-On Software에 매각했으며, Log-On Software는 이 제품을 ''Log-On APL2''로 개발하고 판매하고 있다.[103]
9. 표준
APL은 ISO와 IEC에 의해 표준화되었다. 핵심 APL 언어는 ISO 8485:1989에, 확장 APL 언어는 ISO/IEC 13751:2001에 지정되어 있다.
10. 기본 연산
APL은 다른 프로그래밍 언어와 구별되는 특징적인 연산 기능을 가지고 있다. 특히, 스칼라 값뿐만 아니라 배열도 연산의 직접적인 대상이 될 수 있다는 점과, 고차 함수에 해당하는 기능이 있다는 점이 특징이다.
APL에서는 다음과 같은 기본 연산을 제공한다.
- '''A Plus B''': 더하기
- '''A Minus B''': 빼기
- '''A Times B''': 곱하기
- '''A Divided-by B''': 나누기
APL은 같은 기호를 단항 연산자와 이항 연산자 두 가지 형태로 사용하며, 각각 다른 의미를 가진다. 예를 들어 `!` 기호는 단항 연산자로 사용될 때는 팩토리얼을, 이항 연산자로 사용될 때는 조합의 수를 나타낸다.
- `! 5`는 120 (팩토리얼)을 반환한다.
- `2 ! 5`는 10 (5C2 조합)을 반환한다.
APL은 배열 간의 연산도 가능하다. 예를 들어 `1 2 3 + 4 5 6`은 각 요소를 더한 결과인 `5 7 9`를 반환한다.
11. 구현 알고리즘
NARS2000에는 다음과 같은 다양한 알고리즘이 구현되어 있다.[114]
| 구현된 알고리즘 |
|---|
12. 정의된 연산
APL은 다른 프로그래밍 언어에 비해 특징적인 연산 기능을 가지고 있다. 특히 스칼라 값뿐만 아니라 배열도 식 내의 연산의 직접적인 대상이 될 수 있다는 원시적인 제네릭 프로그래밍 기능과, Fold 등에 유사한 고차 함수에 상당하는 기능이 있다는 점이 특징이다.
APL에서는 같은 기호열(함수)을 전치 연산자(단항 연산자) 형태와 중치 연산자(2항 연산자) 형태로 사용하며, 각각에서 의미가 다르다는 다중 정의가 다용된다. APL 용어로는 "일항", "이항"이라고 한다. 예를 들어 `!`은 전치로 팩토리얼을 나타내며, `! 5`는 120을 반환한다. 그러나 중치로 사용하면 조합의 수를 나타내며, `2 ! 5`는 10 (=5C2)을 반환한다.
APL은 배열 연산, 즉 배열 간의 연산이 가능하다. 예를 들어 `1 2 3 + 4 5 6`이라는 식을 평가하면 각 요소별로 덧셈을 수행하여 `5 7 9`라는 배열을 반환한다. `! 2 3 4`는 각 요소의 팩토리얼을 요소로 하는 배열 `2 6 24`를 반환한다.
정의된 연산의 예는 다음과 같다.
- A와 B는 일치: A와 B가 같은 수이면 1, 그렇지 않으면 0을 반환한다.
- A의 신호: A가 양수이면 1, 0이면 0, 음수이면 -1을 반환한다.
- A는 B보다 크다: A가 양수이고 B가 음수이거나, A - B가 양수이면 1, 그렇지 않으면 0을 반환한다.
- A는 B보다 작다: B가 A보다 크면 반환하는 연산이다.
- 부정(negation) A: 0 - A를 반환한다.
- A의 절댓값: A가 음수가 아니면 A를, 그렇지 않으면 -A를 반환한다.
- A의 정확한 하한: B가 A와 같거나 B가 A보다 작다면, 가장 높은 정수 B를 반환한다.
- A의 정확한 상한: B가 A와 같거나 B가 A보다 크다면, 가장 작은 정수 B를 반환한다.
참조
[1]
웹사이트
std::iota
https://en.cpprefere[...]
[2]
웹사이트
Q105954505
https://www.software[...]
2023-08-06
[3]
논문
Language as an Intellectual Tool: From Hieroglyphics to APL
http://domino.resear[...]
2015-01-09
[4]
웹사이트
ACM Award Citation – John Backus
http://awards.acm.or[...]
Awards.acm.org
2010-02-03
[5]
서적
Automatic Data Processing: Chapter 6: A programming language
http://www.softwarep[...]
1960-01-01
[6]
서적
Automatic Data Processing
John Wiley & Sons Inc.
1963-01-01
[7]
웹사이트
Turing Award Citation 1979
http://awards.acm.or[...]
Awards.acm.org
2010-02-03
[8]
논문
Experimental Personalized Array Translator System
1964-07-01
[9]
논문
The Evolution of APL
http://www.jsoftware[...]
1978-08-01
[10]
보고서
An interpreter for "Iverson notation"
http://infolab.stanf[...]
Department of Computer Science, Stanford University
1966-08-01
[11]
논문
Biographies: Kenneth E. Iverson
[12]
간행물
The First APL Terminal Session
Association for Computing Machinery
1991-09-01
[13]
웹사이트
Adin Falkoff
http://www.computerh[...]
Computer History Museum
[14]
논문
How We Got to APL\1130
http://www.vector.or[...]
2007-04-02
[15]
서적
APL\1130 Manual
http://bitsavers.org[...]
1969-05-01
[16]
웹사이트
Remembering APL
http://www.quadibloc[...]
Quadibloc.com
2013-06-17
[17]
서적
APL\360 Users Guide
http://bitsavers.org[...]
IBM Research, Thomas J. Watson Research Center, Yorktown Heights, NY
1968-08-01
[18]
서적
APL\360 Terminal System
http://bitsavers.org[...]
IBM Research, Thomas J. Watson Research Center
1967-03-01
[19]
서적
APL\360 Reference Manual
Science Research Associates, Inc.
[20]
논문
The Design of APL
http://www.research.[...]
1973-07-01
[21]
보고서
Beginning of Computing and Computer Sciences at the University of Maryland
http://www.cs.umd.ed[...]
University of Maryland
2011-05-23
[22]
웹사이트
How it all began
http://lathwellprodu[...]
2011-05-22
[23]
웹사이트
Xerox APL Language and Operations Reference Manual
http://www.softwarep[...]
[24]
웹사이트
SIGAPL
http://www.sigapl.or[...]
Sigapl.org
2013-06-17
[25]
잡지
Fifty Years of BASIC, the Programming Language That Made Computers Personal
https://time.com/693[...]
2018-04-29
[26]
웹사이트
MCM Computers M70/M700
http://www.old-compu[...]
2018-04-08
[27]
서적
Inventing the PC: The MCM/70 Story
https://books.google[...]
McGill Queens's University Press
2011
[28]
잡지
PCs That Paved the Way for the Altair
http://uk.pcmag.com/[...]
Ziff Davis
2018-04-29
[29]
잡지
VideoBrain Family Computer
https://books.google[...]
1978-11-01
[30]
잡지
A Look at SuperPet
https://archive.org/[...]
Small System Services Inc
2018-04-29
[31]
잡지
An Open Letter to Hobbyists
http://www.digibarn.[...]
2018-04-29
[32]
웹사이트
Remembering Ken Iverson
http://keiapl.org/rh[...]
KEIAPL
2015-01-10
[33]
웹사이트
Kenneth E. Iverson
http://amturing.acm.[...]
ACM
2015-01-10
[34]
웹사이트
APL2: The Early Years: Can you and should you compromise on technical issues?
http://www.sigapl.or[...]
ACM
2015-01-10
[35]
논문
The IBM family of APL systems
[36]
웹사이트
IBM APL2
http://www.edm2.com/[...]
2019-10-09
[37]
웹사이트
APL2: What's New
http://www-01.ibm.co[...]
IBM
2018-04-22
[38]
웹사이트
Overview of the APL System
https://microapl.com[...]
Micro APL
2015-01-10
[39]
웹사이트
A Personal View of APL2010
http://archive.vecto[...]
Vector – Journal of the British APL Association
2015-01-10
[40]
간행물
An Expert System in Chemical Synthesis written in APL2/PC
1989
[41]
웹사이트
APL2: A Programming Language for Problem Solving, Visualization and Database Access
http://www-03.ibm.co[...]
IBM
2015-01-10
[42]
웹사이트
Ivy
https://godoc.org/ro[...]
2018-03-25
[43]
웹사이트
A Bibliography of APL and J
http://www.jsoftware[...]
2010-03-02
[44]
웹사이트
An Interview with Arthur Whitney
http://kx.com/Compan[...]
Kx Systems
2004-01-04
[45]
웹사이트
The Growth of MATLAB
http://www.mathworks[...]
2010-02-03
[46]
웹사이트
Wolfram Language FAQ
https://www.wolfram.[...]
Wolfram
2020-02-20
[47]
간행물
TI 745 full page ad: Introducing a New Set of Characters
https://books.google[...]
1977
[48]
웹사이트
APL Fonts and Keyboards
https://www.dyalog.c[...]
2004–2024
[49]
웹사이트
NARS2000 Keyboard
http://www.sudleypla[...]
Bob Smith; NARS2000
2015-01-19
[50]
웹사이트
Introduction to APL – APL Symbols
http://www.microapl.[...]
MicroAPL Ltd
2015-01-08
[51]
간행물
Extending the APL character set
1993
[52]
웹사이트
Unicode Support for APL
http://archive.vecto[...]
Vector, Journal of the British APL Association
2015-01-08
[53]
웹사이트
Computer Science Outreach and Education with APL
http://video.dyalog.[...]
Dyalog, Ltd.
2016-07-15
[54]
웹사이트
Operators
http://www.microapl.[...]
MicroAPL
2015-01-12
[55]
웹사이트
Primitive Functions
http://www.microapl.[...]
2015-01-01
[56]
웹사이트
The Workspace
http://www.microapl.[...]
2015-01-01
[57]
웹사이트
example
http://catpad.net/mi[...]
Catpad.net
2013-06-17
[58]
웹사이트
Entering APL Symbols
http://www.microapl.[...]
2015-01-01
[59]
웹사이트
A list of APL Transliteration Schemes
http://www.math.uwat[...]
1993
[60]
간행물
Notation as a Tool of Thought
http://www.jsoftware[...]
1980-08
[61]
웹사이트
APL Efficiency
http://www.ekevanbat[...]
2015-01-01
[62]
웹사이트
APL Great Programming
http://www.vaxman.de[...]
2015-01-01
[63]
간행물
Investigation into the efficiency of using APL for the programming of an inference machine
1987-05
[64]
웹사이트
Why APL?
http://www.aplboreal[...]
2015-01-01
[65]
웹사이트
A Dictionary of APL
http://www.jsoftware[...]
2015-01-20
[66]
웹사이트
APL concepts
http://www.microapl.[...]
Microapl.co.uk
2010-02-03
[67]
웹사이트
Nested array theory
http://www.nial.com/[...]
Nial.com
2010-02-03
[68]
서적
Programmera i APL
Studentlitteratur
[69]
웹사이트
APL Syntax and Semantics
http://www.jsoftware[...]
I. P. Sharp Associates
2015-01-11
[70]
웹사이트
APL Primitives
http://www.microapl.[...]
MicroAPL
2015-01-11
[71]
웹사이트
APL Font – Extra APL Glyphs
http://wiki.nars2000[...]
NARS2000
2015-01-11
[72]
웹사이트
Systematically Random Numbers
http://www.sigapl.or[...]
SIGAPL
2015-01-11
[73]
AV media
Conway's Game of Life in APL
http://www.youtube.c[...]
YouTube
2021-11-20
[74]
웹사이트
Conway's Game of Life
https://aplwiki.com/[...]
2021-11-20
[75]
서적
introduction to A Source Book in APL
https://code.jsoftwa[...]
APL Press
1981
[76]
간행물
APL Programming Language
https://courses.cs.v[...]
2021-11-03
[77]
웹사이트
APL Conference
https://aplwiki.com/[...]
2021-10-13
[78]
웹사이트
New Blood
http://degeneratecon[...]
2021-10-13
[79]
웹사이트
APL logo
https://aplwiki.com/[...]
2022-05-20
[80]
학술지
Using APL in an Artificial Intelligence environment
https://www.research[...]
2018-04-03
[81]
학술지
Artificial Intelligence Development Aids
1985
[82]
학술지
Neural networks in APL
https://www.research[...]
2018-04-03
[83]
웹사이트
Robot Programming in APL
http://begriffs.com/[...]
2015-01-06
[84]
학술지
Is APL a Programming Language?
1978-05
[85]
웹사이트
Design Patterns vs. Anti-pattern in APL
https://confengine.c[...]
2018-04-07
[86]
서적
Computer Animation Theory and Practice
https://books.google[...]
Springer-Verlag
1985
[87]
웹사이트
Stormwind Simulator at Dyalog '16
https://www.optima-s[...]
Optima Systems
2017-10-17
[88]
웹사이트
2017 Annual Report
https://www.simcorp.[...]
SimCorp
2018-02-01
[89]
웹사이트
Smooth cooperation between OP Financial Group|OP-Pohjola and Tieto enabled app modification
https://www.tieto.co[...]
Tieto
2018-04-03
[90]
웹사이트
We today
http://profdoccare.s[...]
2018-04-03
[91]
웹사이트
DNA Identification Technology and APL
http://dna-view.com/[...]
Presentation at the 2005 APL User Conference
2015-01-09
[92]
웹사이트
There's DNA Everywhere – an Opportunity for APL
https://www.youtube.[...]
YouTube
2015-01-09
[93]
웹사이트
APL Quotations and Anecdotes
http://www.jsoftware[...]
2018-04-14
[94]
웹사이트
Awards – 1973 – Lawrence Breed
http://awards.acm.or[...]
Association for Computing Machinery
[95]
웹사이트
Awards – 1973 – Richard Lathwell
http://awards.acm.or[...]
Association for Computing Machinery
[96]
웹사이트
Awards – 1973 – Roger Moore
http://awards.acm.or[...]
Association for Computing Machinery
[97]
웹사이트
IBM 5100
http://www.old-compu[...]
2018-04-08
[98]
잡지
Welcome, IBM, to personal computing
https://archive.org/[...]
2018-04-29
[99]
웹사이트
Chronology of APL and its Influences on Computer Language Development
http://www.sigapl.or[...]
ACM
2018-04-29
[100]
학술지
How We Got To APL\1130
http://www.vector.or[...]
2018-04-29
[101]
웹사이트
History of I. P. Sharp Associates Timesharing and Network
http://rogerdmoore.c[...]
Roger Moore
2018-03-07
[102]
잡지
VAX-11s Acquire APL Processor
https://books.google[...]
2018-04-22
[103]
웹사이트
Log-On Software announces Log-On APL2
https://log-on.com/2[...]
2021-11-17
[104]
학술지
APLGOL, an Experimental Structured Programming Language
https://ieeexplore.i[...]
[105]
웹사이트
APLGOL: Structured Programming Facilities for APL
https://archive.org/[...]
Hewlett-Packard Journal
1977-07
[106]
웹사이트
Dyalog Ltd website
https://www.dyalog.c[...]
2018-06-06
[107]
간행물
Dyalog at 25
http://www.vector.or[...]
British APL Association
2008-09
[108]
서적
Proceedings of the 2007 symposium on Dynamic languages
2007-10-22
[109]
웹사이트
D: A functional subset of Dyalog APL
http://archive.vecto[...]
British APL Association
[110]
웹사이트
Translation of D-functions into tacit form
https://dfns.dyalog.[...]
Dyalog Ltd.
[111]
웹사이트
Dyalog – Prices and Licences
https://www.dyalog.c[...]
[112]
웹사이트
Kenneth E. Iverson Award for Outstanding Contribution to APL
http://www.sigapl.or[...]
SIGPLAN
[113]
웹사이트
2016 Iverson Award Recognises Dyalog's CEO and CXO
http://www.dyalog.co[...]
2018-06-06
[114]
웹사이트
Nested Arrays Research System – NARS2000: An Experimental APL Interpreter
http://www.nars2000.[...]
Sudley Place Software
2015-07-10
[115]
웹사이트
APLX has been withdrawn from commercial sale but can be downloaded free of charge
http://microapl.com/[...]
Microapl.com
2018-04-14
[116]
웹사이트
York APL
https://www.software[...]
[117]
웹사이트
GNU APL
http://directory.fsf[...]
Free Software Directory
2013-09-28
[118]
웹사이트
RMS Berättar
http://www.lysator.l[...]
2018-04-22
[119]
서적
An APL Compiler
https://books.google[...]
Springer-Verlag
[120]
웹사이트
What is APL?
http://www.sigapl.or[...]
SIGAPL
2015-01-20
[121]
간행물
Exploitation of APL data parallelism on a shared-memory MIMD machine
1991
[122]
웹사이트
Revisiting APL in the Modern Era
http://www.cs.prince[...]
2015-01-20
[123]
간행물
Execution of automatically parallelized APL programs on RP3
http://domino.resear[...]
2015-01-20
[124]
간행물
Compiling Collection-Oriented Languages onto Massively Parallel Computers
[125]
웹사이트
Implementing APL-like data parallel functions on a GCA machine
https://www.fernuni-[...]
2015-01-22
[126]
서적
Proceedings of the international conference on APL - APL '84
1984
[127]
서적
Conference Proceeding IEEE Pacific Rim Conference on Communications, Computers and Signal Processing
[128]
간행물
Two Implementations of APL
https://books.google[...]
2015-01-20
[129]
웹사이트
The APL Computer Language
http://marthallama.o[...]
2015-01-20
[130]
서적
Automatic Algorithm Recognition and Replacement: A New Approach to Program Optimization
https://books.google[...]
The MIT press
2018-05-06
[131]
간행물
Recognition and Selection of Idioms for Code Optimization
1982
[132]
논문
Idiom matching: an optimization technique for an APL compiler
https://lib.dr.iasta[...]
Iowa State University
2018-05-06
[133]
웹사이트
Idiom Recognition
http://help.dyalog.c[...]
dyalog.com
2018-05-06
[134]
간행물
Does APL really need run-time parsing?
1977-03
[135]
웹사이트
Compiler User Guide
http://docs.dyalog.c[...]
Dyalog Ltd.
2018-05-07
[136]
간행물
Compiling APL: The Yorktown APL Translator
1986-11
[137]
웹사이트
Chronology of APL
http://www.sigapl.or[...]
ACM
2018-05-07
[138]
간행물
Program Analysis and Code Generation in an APL/370 Compiler
1986-11
[139]
웹사이트
The APEX Project
http://www.snakeisla[...]
[140]
웹사이트
APL Compiler (message from Jim Weigang to the comp.lang.apl Newsgroup)
http://www.chilton.c[...]
1994-04-05
[141]
간행물
An Open Letter to Hobbyists
http://www.digibarn.[...]
1976-01-31
[142]
웹인용
APL Quotations and Anecdotes
http://www.jsoftware[...]
jsoftware
2018-04-14
[143]
서적
A Programming Language
http://www.softwarep[...]
Wiley
2016-09-14
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com