맨위로가기

J (프로그래밍 언어)

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

1. 개요

J는 1989년 케네스 아이버슨이 APL의 후계로 제안한 프로그래밍 언어이다. APL의 배열 처리 능력과 함수 수준 프로그래밍의 영향을 받아, ASCII 코드만으로 APL과 유사한 계산을 할 수 있도록 개발되었다. J는 연산자 합성 기능을 강화했지만, 변수와 연산자 구별의 어려움으로 가독성이 떨어지는 문제가 있다. J는 동사와 수식어를 사용하여 데이터를 처리하며, 간결하고 강력한 연산자 조합을 제공한다. 숫자형, 리터럴(문자), 박스형의 데이터 형식을 지원하며, 정수, 부동 소수점, 복소수, 유리수 등 다양한 숫자 형식을 제공한다. J는 무인점 스타일과 함수 합성을 통해 간결한 프로그램 작성을 지원하며, "Hello, World!" 프로그램과 퀵 정렬, 피보나치 수 계산, 원주율 계산 등의 예제를 통해 그 특징을 보여준다.

더 읽어볼만한 페이지

  • APL 프로그래밍 언어 계열 - A+ (프로그래밍 언어)
    A+는 아서 휘트니가 APL을 대체하기 위해 1985년에 개발하고 모건 스탠리 개발자들이 그래픽 사용자 인터페이스와 추가 기능을 더한, 금융 애플리케이션에 특화된 수치 연산에 강점을 가지는 자유-오픈 소스 프로그래밍 언어이다.
  • APL 프로그래밍 언어 계열 - APL (프로그래밍 언어)
    APL은 케네스 아이버슨이 개발한 배열 지향 프로그래밍 언어로, 간결한 표기법과 특수 문자 집합을 사용하며, 아이버슨의 수학적 표기법에 기반하여 객체 지향 프로그래밍과 .NET 지원 등의 확장 기능을 제공한다.
  • 배열 프로그래밍 언어 - GNU 옥타브
    GNU 옥타브는 MATLAB과 높은 호환성을 가지며 수치 해석 계산을 위해 사용되는 자유-오픈 소스 소프트웨어이다.
  • 배열 프로그래밍 언어 - NumPy
    NumPy는 파이썬에서 다차원 배열을 효과적으로 다루기 위한 라이브러리로, C API를 제공하여 외부 라이브러리와 연동을 지원하며, 다양한 연산 기능과 멀티스레딩을 통한 성능 향상을 제공한다.
  • 수치 프로그래밍 언어 - GNU 옥타브
    GNU 옥타브는 MATLAB과 높은 호환성을 가지며 수치 해석 계산을 위해 사용되는 자유-오픈 소스 소프트웨어이다.
  • 수치 프로그래밍 언어 - SciPy
    SciPy는 NumPy 배열 구조를 기반으로 수치 적분, 선형 대수, 최적화, 통계 등 과학 및 공학 계산에 사용되는 다양한 기능을 제공하는 파이썬 과학 컴퓨팅 라이브러리이다.
J (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
개요
J 프로그래밍 언어 아이콘
J 프로그래밍 언어 아이콘
설계자케네스 E. 아이버슨, 로저 후이
개발자JSoftware
발표일1990년
최신 안정화 버전J9.5
최신 안정화 버전 날짜2023년 12월 20일
타이핑동적 타이핑
구현체J
영향을 받은 언어APL (프로그래밍 언어)
영향을 준 언어NumPy, SuperCollider
운영체제크로스 플랫폼: 마이크로소프트 윈도우, 리눅스, macOS, 안드로이드 (운영체제), iOS, 라즈베리 파이
라이선스GPLv3
웹사이트JSoftware 웹사이트
프로그래밍 패러다임

2. 역사

J는 1989년 APL의 제안자이기도 한 케네스 아이버슨에 의해 APL의 후계로 제안되었다. APL은 수식 표기, 특히 배열 처리에 뛰어나 많은 계산식을 극히 단순하게 표기할 수 있는 장점을 가지고 있었지만, 그리스 문자나 기타 특수 기호를 사용하기 때문에, 이용에는 글꼴 설정 등 특수한 환경 준비가 필요하고, 가독성이 낮아 널리 보급되지 못했다.

J는 APL의 반성을 바탕으로, APL과 같은 계산을 일반적인 ASCII 코드만으로 사용할 수 있도록 했다. 이때, 존 배커스에 의한 FP 언어 · FL 언어/FL (programming language)영어라는 함수 수준 프로그래밍 언어/Function-level programming영어의 영향을 받았다 (배커스에 의한 두 언어는 APL의 영향을 받았다). 게다가 APL에 있던 "작용자"에 의한 연산자 합성 등의 기능이, 보다 확장 강화되었다. 이러한 기능으로 APL과 같은 표기 문제는 해소되었지만, 변수와 연산자의 구별이 어려워져 가독성이 떨어지는 문제가 발생했다.

2. 1. APL과의 관계

J는 1989년 APL의 제안자이기도 한 케네스 아이버슨에 의해 APL의 후계로 제안되었다. APL은 수식 표기, 특히 배열 처리에 뛰어나 많은 계산식을 극히 단순하게 표기할 수 있는 장점을 가지고 있었지만, 그리스 문자나 기타 특수 기호를 사용하기 때문에, 이용에는 글꼴 설정 등 특수한 환경 준비가 필요하고, 가독성이 낮아 널리 보급되지 못했다.

J는 APL의 반성을 바탕으로, APL과 같은 계산을 일반적인 ASCII 코드만으로 사용할 수 있도록 했다. 이때, 존 배커스에 의한 FP 언어 · FL 언어/FL (programming language)영어라는 함수 수준 프로그래밍 언어/Function-level programming영어의 영향을 받았다 (배커스에 의한 두 언어는 APL의 영향을 받았다). 게다가 APL에 있던 "작용자"에 의한 연산자 합성 등의 기능이, 보다 확장 강화되었다. 이러한 기능으로 APL과 같은 표기 문제는 해소되었지만, 변수와 연산자의 구별이 어려워져 가독성이 떨어지는 문제가 발생했다.

3. 특징

J는 1989년 APL의 제안자이기도 한 케네스 아이버슨에 의해 APL의 후계로 제안되었다. APL은 수식 표기, 특히 배열 처리에 뛰어나 많은 계산식을 극히 단순하게 표기할 수 있는 장점을 가지고 있었지만, 그리스 문자나 기타 특수 기호를 사용하기 때문에, 이용에는 글꼴 설정 등 특수한 환경 준비가 필요하고, 가독성이 낮아 널리 보급되지 못했다.

J는 APL의 반성을 바탕으로, APL과 같은 계산을 일반적인 ASCII 코드만으로 사용할 수 있도록 했다. 이때, 존 배커스에 의한 FP 언어 · FL 언어/FL (programming language)영어라는 함수 수준 프로그래밍 언어/Function-level programming영어의 영향을 받았다 (배커스에 의한 두 언어는 APL의 영향을 받았다). 게다가 APL에 있던 "작용자"에 의한 연산자 합성 등의 기능이, 보다 확장 강화되었다. 이러한 기능으로 APL과 같은 표기 문제는 해소되었으나, 변수와 연산자의 구별이 어려워져 가독성이 떨어지는 문제가 발생했다.

3. 1. 간결성

3. 2. 연산자와 수식어

J는 동사(verb)와 수식어(modifier)를 사용하여 데이터를 처리하고 연산을 수행한다. 동사는 데이터를 입력으로 받아 출력으로 생성하는 프로그램 또는 루틴이다. J는 풍부한 사전 정의된 동사 집합을 가지고 있으며, 모두 여러 데이터 유형에서 자동으로 작동한다. 예를 들어, 동사 `i.`는 어떤 크기의 배열에서든 일치하는 항목을 검색한다. 사용자 프로그램은 기본 연산자가 허용되는 모든 곳에서 이름을 지정하고 사용할 수 있다.

J의 강력함은 주로 수식어에서 비롯된다. 수식어는 명사 및 동사를 피연산자로 받아 지정된 방식으로 피연산자를 적용하는 기호이다. 예를 들어, 수식어 `/`는 왼쪽의 동사를 피연산자로 받아 해당 동사를 인수의 각 항목 사이에 적용하는 동사를 생성한다. 즉, `+/`는 '인수의 항목 사이에 `+`를 적용'으로 정의된 동사이다. J는 대략 20개 정도의 수식어를 가지고 있다. 이들은 모두 사용자 정의 동사를 포함하여 모든 동사에 적용될 수 있으며, 사용자는 자신만의 수식어를 작성할 수 있다. 수식어는 개별적으로 강력하며, 반복 실행 (do-while), 조건부 실행 (if), 인수의 정규 또는 비정규 하위 집합 실행을 허용한다. 일부 수식어는 구성 요소가 실행되는 순서를 제어하여, 수식어를 어떤 순서로든 결합하여 실용적인 프로그래밍에 필요한 무한한 다양성의 연산을 생성할 수 있다.

J는 아스키 코드를 조합한 연산자를 사용하며, 연산자 뒤에 콜론이나 마침표를 더하면 다른 연산자로 취급된다. 또한 전위 표기법과 중위 표기법에 따라 연산자의 의미가 달라진다.

J의 연산은 통상 산술 연산자로 취급되지만, 피연산자가 1 또는 0인 경우에는 논리 연산으로 취급된다. 다음은 연산자 예시이다.

연산자전위 표기법으로 사용하는 경우중위 표기법으로 사용하는 경우
`+`켤레 복소수를 반환한다.덧셈
`+:`2배로 한다.(논리 연산) NOR를 반환한다.
`+.`복소수의 실수부와 허수부를 분리하여 리스트 형식으로 반환한다.최대공약수 (논리 연산의 경우 OR)를 반환한다.
`*`부호 (양수면 1, 음수면 `_1`, 0이면 0)를 반환한다.곱셈
`*:`제곱한다.(논리 연산) NAND를 반환한다.
`*.`복소수를 극좌표로 변경하여 리스트 형식으로 반환한다.최소공배수 (논리 연산의 경우 AND)를 반환한다.



J에서의 계산 순서는 오른쪽 연산자가 우선된다. 예를 들어 `8 - 5 - 9`는 8-(5-9)이며, 12가 반환된다. J에서는 연산자를 나열하여 여러 연산자를 합성할 수 있다. 두 개의 연산자 합성 규칙을 "훅(hook)", 세 개의 연산자 합성 규칙을 "포크(fork)", 네 개 이상의 연산자 합성 규칙을 "트레인(train)"이라고 부른다.

3. 3. 데이터 유형 및 구조

J는 세 가지 단순한 형식을 지원한다.

  • 숫자형
  • 리터럴 (문자)
  • 박스형


이 중 숫자형이 가장 다양한 변형을 가지고 있다.

J의 숫자형 중 하나는 ''비트''이다. 비트 값은 ''0''과 ''1'' 두 가지가 있다. 또한 비트는 리스트를 형성할 수 있다. 예를 들어, `1 0 1 0 1 1 0 0`은 8비트의 리스트이다. 구문적으로 J 파서는 이를 하나의 단어로 처리한다. 임의의 길이의 리스트가 지원된다.

또한 J는 이러한 리스트에 대해 ''and'', ''or'', ''exclusive or'', ''rotate'', ''shift'', ''not'' 등과 같은 모든 일반적인 이진 연산을 지원한다. 예를 들어,

```

1 0 0 1 0 0 1 0 +. 0 1 0 1 1 0 1 0

1 1 0 1 1 0 1 0

```

```

3 |. 1 0 1 1 0 0 1 1 1 1 1

1 0 0 1 1 1 1 1 1 0 1

```

J는 또한 비트의 고차원 배열을 지원한다. 2차원, 3차원 등의 배열을 형성할 수 있다. 위의 연산은 이러한 배열에서도 똑같이 잘 수행된다.

다른 숫자형에는 정수(예: 3, 42), 부동 소수점(3.14, 8.8e22), 복소수(0j1, 2.5j3e88), 확장 정밀도 정수(12345678901234567890x), (확장 정밀도) 유리수(1r2, 3r4)가 있다. 비트와 마찬가지로, 이것들은 리스트 또는 임의 차원의 배열을 형성할 수 있다. 비트와 마찬가지로, 연산은 배열의 모든 숫자에 대해 수행된다.

비트의 리스트는 `#.` 동사를 사용하여 정수로 변환할 수 있다. 정수는 `#:` 동사를 사용하여 비트 리스트로 변환할 수 있다. (J를 구문 분석할 때 `.` (마침표)와 `:` (콜론)은 단어를 형성하는 문자이다. 이들은 공백 문자가 앞에 오지 않는 한 단독으로 토큰이 될 수 없다.)

J는 또한 리터럴(문자) 형식을 지원한다. 리터럴은 따옴표로 묶는다. 예를 들어, `'a'` 또는 `'b'`와 같다. 여러 문자를 따옴표 안에 넣는 일반적인 규칙을 사용하여 리터럴의 리스트도 지원된다. `'abcdefg'`와 같다. 일반적으로 개별 리터럴은 8비트 너비(ASCII)이지만 J는 다른 리터럴(유니코드)도 지원한다. 숫자 및 부울 연산은 리터럴에서는 지원되지 않지만, 컬렉션 지향 연산(예: 회전)은 지원된다.

마지막으로 박스형 데이터 형식이 있다. 일반적으로 데이터는 `<` 연산(왼쪽 인수가 없음)을 사용하여 상자에 넣는다. 이것은 C의 `&` 연산(왼쪽 인수가 없음)과 유사하다. 그러나 C의 `&`의 결과는 참조 의미론을 갖는 반면, J의 `<`의 결과는 값 의미론을 갖는다. 즉, `<`는 함수이고 결과를 생성한다. 결과는 포함된 데이터의 구조에 관계없이 0차원을 갖는다. J 프로그래머의 관점에서 볼 때, `<`는 ''데이터를 상자에 넣고'' 상자 배열로 작업할 수 있게 해준다(다른 상자와 결합하거나 상자의 복사본을 더 만들 수 있다).

```

<1 0 0 1 0

+---------+

|1 0 0 1 0|

+---------+

```

J가 제공하는 유일한 컬렉션 형식은 임의 차원 배열이다. 대부분의 알고리즘은 이러한 배열에 대한 연산을 사용하여 매우 간결하게 표현할 수 있다.

J의 배열은 동질적인 형식을 가집니다. 예를 들어 `1 2 3` 리스트는 `1`이 비트임에도 불구하고 정수의 리스트이다. 대부분의 경우, 이러한 유형의 문제는 프로그래머에게 투명하다. 특정 특수 연산만 유형의 차이점을 드러낸다. 예를 들어, `1.0 0.0 1.0 0.0` 리스트는 대부분의 연산에서 `1 0 1 0` 리스트와 정확히 동일하게 처리됩니다.

J는 또한 0이 아닌 값과 해당 인덱스를 저장하는 희소 숫자형 배열을 지원한다. 이것은 비교적 적은 수의 값이 0이 아닌 경우 효율적인 메커니즘이다.

J는 또한 객체와 클래스를 지원하지만,[14] 이는 사물이 명명되는 방식의 산물이며 데이터 유형은 아니다. 대신 박스형 리터럴이 객체(및 클래스)를 참조하는 데 사용된다. J 데이터는 값 의미론을 갖지만 객체와 클래스는 참조 의미론이 필요하다.

J의 데이터 타입은 다른 언어와 같은 정수, 부동 소수점, 문자열 외에도 유리수복소수 등도 있다.

정수의 표기는 기본적으로 다른 언어와 같지만, J에서는 음수를 가 아닌 를 사용한다. 또한 를 단독으로 사용하면 "무한대"로 처리된다.

수식평가 후의 값
5 - 6_1(−1)
_1 * _(−1 × ∞)__(∞)



부동 소수점수의 표기도 기본적으로는 다른 언어와 같다. 다만 J에서는 "."(마침표)가 연산자에 큰 영향을 주기 때문에 ".5"와 같은 표기(다른 언어에서는 0.5로 처리)는 허용되지 않는다. 숫자 사이에 "e"를 넣는 지수 표기는 다른 언어와 마찬가지로 J에서도 구현되어 있다(예: 1.2e3 → 1200).

유리수는 〈분자〉r〈분모〉로 표기한다. (예 2r3 → 2/3는 2/3을 의미한다)

복소수는 〈실수부〉j〈허수부〉로 표기한다. 이 외에도 〈절대값〉ad〈각도 편각〉〉〈절대값〉ar〈라디안 편각〉으로 표기하면 이에 대응하는 복소수를 반환한다.

표기의미
5j45 + 4i
2ad31.99726j0.104672
5ar0.9272953j4



임의의 밑(기수) n에 의한 n진법에서의 숫자는 `〈기수〉b〈수〉`로 표기한다.[14] 기저는 소수점을 포함해도 된다.

표기의미
2b1015
3b21223
16bff255
0.1b122.1


3. 3. 1. 데이터 유형 (일본어 문서 내용 추가)

J는 세 가지 단순한 형식을 지원한다.

  • 숫자형
  • 리터럴 (문자)
  • 박스형


이 중 숫자형이 가장 다양한 변형을 가지고 있다.

J의 숫자형 중 하나는 ''비트''이다. 비트 값은 ''0''과 ''1'' 두 가지가 있다. 또한 비트는 리스트를 형성할 수 있다. 예를 들어, 1 0 1 0 1 1 0 0은 8비트의 리스트이다. 구문적으로 J 파서는 이를 하나의 단어로 처리한다. 임의의 길이의 리스트가 지원된다.

또한 J는 이러한 리스트에 대해 ''and'', ''or'', ''exclusive or'', ''rotate'', ''shift'', ''not'' 등과 같은 모든 일반적인 이진 연산을 지원한다. 예를 들어,

1 0 0 1 0 0 1 0 +. 0 1 0 1 1 0 1 0 NB. or

1 1 0 1 1 0 1 0

3 |. 1 0 1 1 0 0 1 1 1 1 1 NB. rotate

1 0 0 1 1 1 1 1 1 0 1

J는 또한 비트의 고차원 배열을 지원한다. 2차원, 3차원 등의 배열을 형성할 수 있다. 위의 연산은 이러한 배열에서도 똑같이 잘 수행된다.

다른 숫자형에는 정수(예: 3, 42), 부동 소수점(3.14, 8.8e22), 복소수(0j1, 2.5j3e88), 확장 정밀도 정수(12345678901234567890x), (확장 정밀도) 유리수(1r2, 3r4)가 있다. 비트와 마찬가지로, 이것들은 리스트 또는 임의 차원의 배열을 형성할 수 있다. 비트와 마찬가지로, 연산은 배열의 모든 숫자에 대해 수행된다.

비트의 리스트는 #. 동사를 사용하여 정수로 변환할 수 있다. 정수는 #: 동사를 사용하여 비트 리스트로 변환할 수 있다.

J는 또한 리터럴(문자) 형식을 지원한다. 리터럴은 따옴표로 묶는다. 예를 들어, 'a' 또는 'b'와 같다. 여러 문자를 따옴표 안에 넣는 일반적인 규칙을 사용하여 리터럴의 리스트도 지원된다. 'abcdefg'와 같다. 일반적으로 개별 리터럴은 8비트 너비(ASCII)이지만 J는 다른 리터럴(유니코드)도 지원한다. 숫자 및 부울 연산은 리터럴에서는 지원되지 않지만, 컬렉션 지향 연산(예: 회전)은 지원된다.

마지막으로 박스형 데이터 형식이 있다. 일반적으로 데이터는 < 연산(왼쪽 인수가 없음)을 사용하여 상자에 넣는다. 이것은 C& 연산(왼쪽 인수가 없음)과 유사하다. 그러나 C의 &의 결과는 참조 의미론을 갖는 반면, J의 <의 결과는 값 의미론을 갖는다. 즉, <는 함수이고 결과를 생성한다. 결과는 포함된 데이터의 구조에 관계없이 0차원을 갖는다. J 프로그래머의 관점에서 볼 때, <는 ''데이터를 상자에 넣고'' 상자 배열로 작업할 수 있게 해준다(다른 상자와 결합하거나 상자의 복사본을 더 만들 수 있다).

<1 0 0 1 0

+---------+

|1 0 0 1 0|

+---------+


J가 제공하는 유일한 컬렉션 형식은 임의 차원 배열이다. 대부분의 알고리즘은 이러한 배열에 대한 연산을 사용하여 매우 간결하게 표현할 수 있다.

J의 배열은 동질적인 형식을 가집니다. 예를 들어 1 2 3 리스트는 1이 비트임에도 불구하고 정수의 리스트이다. 대부분의 경우, 이러한 유형의 문제는 프로그래머에게 투명하다. 특정 특수 연산만 유형의 차이점을 드러낸다. 예를 들어, 1.0 0.0 1.0 0.0 리스트는 대부분의 연산에서 1 0 1 0 리스트와 정확히 동일하게 처리됩니다.

J는 또한 0이 아닌 값과 해당 인덱스를 저장하는 희소 숫자형 배열을 지원한다. 이것은 비교적 적은 수의 값이 0이 아닌 경우 효율적인 메커니즘이다.

J는 또한 객체와 클래스를 지원하지만,[14] 이는 사물이 명명되는 방식의 산물이며 데이터 유형은 아니다. 대신 박스형 리터럴이 객체(및 클래스)를 참조하는 데 사용된다. J 데이터는 값 의미론을 갖지만 객체와 클래스는 참조 의미론이 필요하다.

J의 데이터 타입은 다른 언어와 같은 정수, 부동 소수점, 문자열 외에도 유리수복소수 등도 있다.

정수의 표기는 기본적으로 다른 언어와 같지만, J에서는 음수를 하이픈 마이너스( - )가 아닌 언더스코어(_)를 사용한다. 또한 하이픈 마이너스를 단독으로 사용하면 "무한대"로 처리된다.

수식평가 후의 값
5 - 6_1(−1)
_1 * _(−1 × ∞)__(∞)



부동 소수점수의 표기도 기본적으로는 다른 언어와 같다. 다만 J에서는 "."(마침표)가 연산자에 큰 영향을 주기 때문에 ".5"와 같은 표기(다른 언어에서는 0.5로 처리)는 허용되지 않는다. 숫자 사이에 "e"를 넣는 지수 표기는 다른 언어와 마찬가지로 J에서도 구현되어 있다(예: 1.2e3 → 1200).

유리수는 〈분자〉r〈분모〉로 표기한다. (예 2r3 → 2/3는 2/3을 의미한다)

복소수는 〈실수부〉j〈허수부〉로 표기한다. 이 외에도 〈절대값〉ad〈각도 편각〉〉〈절대값〉ar〈라디안 편각〉으로 표기하면 이에 대응하는 복소수를 반환한다.

표기의미
5j45 + 4i
2ad31.99726j0.104672
5ar0.9272953j4


3. 3. 2. n진법 표기 (일본어 문서 내용 추가)

임의의 밑(기수) n에 의한 n진법에서의 숫자는 `〈기수〉b〈수〉`로 표기한다.[14] 기저는 소수점을 포함해도 된다.

표기의미
2b1015
3b21223
16bff255
0.1b122.1


3. 4. 디버깅

J는 오류가 발생하거나 동사 내 특정 위치에서 중단하는 일반적인 기능을 갖추고 있다. 또한, J 문장의 실행을 2차원 대화형으로 표시해주는 ''Dissect''라는 시각적 디버거가 있다. J의 단일 문장은 저수준 언어의 전체 서브루틴만큼 많은 계산을 수행하므로 시각적 디스플레이가 매우 유용하다.

6부터 시작하는 콜라츠 수열 분석

4. 문법

4. 1. 연산자의 종류 (일본어 문서 내용 추가)

J는 APL의 특수 문자를 모두 아스키 코드를 조합한 연산자로 취급하기 때문에, 방대한 수의 연산자를 가지고 있다. 구체적으로는 연산자 뒤에 콜론이나 마침표를 더하면 다른 연산자로 취급된다. 또한 APL과 마찬가지로, 연산자를 전위 표기법으로 사용하는 경우와 중위 표기법으로 사용하는 경우에 상당히 뚜렷한 의미의 차이를 부여하고 있다.

J의 연산은 통상 산술 연산자로 취급되지만, 피연산자가 1 또는 0인 경우에는 논리 연산으로 취급된다.

예시를 다음 표로 나타낸다.

연산자전위 표기법으로 사용하는 경우중위 표기법으로 사용하는 경우
+켤레 복소수를 반환한다.덧셈
+:2배로 한다.(논리 연산) NOR를 반환한다.
+.복소수의 실수부와 허수부를 분리하여 리스트 형식으로 반환한다.최대공약수 (논리 연산의 경우 OR)를 반환한다.
*부호 (양수면 1, 음수면 -1, 0이면 0)를 반환한다.곱셈
*:제곱한다.(논리 연산) NAND를 반환한다.
*.복소수를 극좌표로 변경하여 리스트 형식으로 반환한다.최소공배수 (논리 연산의 경우 AND)를 반환한다.



J에서의 계산 순서는 APL과 마찬가지로 오른쪽 연산자가 우선된다. 예를 들어 8 - 5 - 9는 8-(5-9)이며, 12가 반환된다.

4. 2. 연산자의 합성 (일본어 문서 내용 추가)

J는 연산자를 나열하여 여러 연산자를 합성할 수 있다. 두 개의 연산자 합성 규칙은 "훅(hook)"이라고 부른다. 세 개의 연산자 합성 규칙은 "포크(fork)"라고 부른다. 네 개 이상의 연산자 합성 규칙은 "트레인(train)"이라고 부른다.

4. 3. 제어 구조

J는 다른 절차적 언어와 유사한 제어 구조를 제공한다. 주요 제어 단어는 다음과 같다.

  • `assert.`
  • `break.`
  • `continue.`
  • `for.`
  • `goto_label.`
  • `if. else. elseif.`
  • `return.`
  • `select. case.`
  • `throw.`
  • `try. catch.`
  • `while. whilst.`

5. 예제

J는 무인점 스타일과 함수 합성을 허용한다. 따라서, J 프로그램은 매우 간결할 수 있으며, 일부 프로그래머에게는 읽기 어렵다고 여겨진다.

J에서의 "Hello, World!" 프로그램은 다음과 같다:

```j

'Hello, World!'

```

이 헬로 월드 구현은 J의 전통적인 사용법을 반영한다 – 프로그램은 J 인터프리터 세션에 입력되고, 표현식의 결과가 표시된다. J 스크립트가 독립 실행형 프로그램으로 실행되도록 구성하는 것도 가능하다. 다음은 유닉스 시스템에서 이것이 어떻게 보일 수 있는지 보여준다:

```j

#!/bin/jc

echo 'Hello, world!'

exit ''

```

역사적으로, APL은 `/`를 사용하여 접기를 나타냈으며, 따라서 `+/1 2 3`은 `1+2+3`과 동일했다. 한편, 나눗셈은 수학적 나눗셈 기호(÷)로 표현되었다.

ASCII는 나눗셈 기호를 포함하고 있지 않기 때문에, J는 시각적 근사 또는 기억 보조로 %를 사용하여 나눗셈을 나타낸다.

숫자 목록의 평균을 계산하는 `avg`라는 J 함수를 정의하면 다음과 같다:

```j

avg=: +/ % #

```


  • `+/`는 배열의 항목을 합산한다.
  • `#`는 배열의 항목 수를 계산한다.
  • `%`는 합계를 항목 수로 나눈다.


다음은 이 함수의 테스트 실행이다:

```j

avg 1 2 3 4

```

2.5

위에서, ''avg''는 세 개의 동사(`+/`, `%`, `#`)를 사용하여 정의되는데, 이를 ''포크''라고 부른다. 구체적으로, `(V0 V1 V2) Ny`는 `(V0(Ny)) V1 (V2(Ny))`와 동일하며, 이는 J의 강력함을 보여준다. (여기서 V0, V1, V2는 동사를 나타내고 Ny는 명사를 나타낸다.)

`avg`를 사용하는 몇 가지 예시:

```j

v=: ?. 20 $100

```

NB. 임의의 벡터

```j

v

```

46 55 79 52 54 39 60 57 60 94 46 78 13 18 51 92 78 60 90 62

```j

avg v

```

59.2

```j

4 avg\ v

```

NB. 크기 4의 기간에 대한 이동 평균

58 60 56 51.25 52.5 54 67.75 64.25 69.5 57.75 38.75 40 43.5 59.75 70.25 80 72.5

```j

m=: ?. 4 5 $50

```

NB. 임의의 행렬

```j

m

```

46 5 29 2 4

39 10 7 10 44

46 28 13 18 1

42 28 10 40 12

```j

avg"1 m

```

NB. m의 각 랭크 1 서브배열 (각 행)에 avg 적용

17.2 22 21.2 26.4

랭크는 J에서 중요한 개념이다. J에서의 중요성은 SQL에서의 `select`와 C에서의 `while`의 중요성과 유사하다.

J Dictionary에서 퀵 정렬을 구현하면 다음과 같다:

```j

sel=: adverb def 'u # ['

quicksort=: verb define

if. 1 >: #y do. y

else.

(quicksort y sel e=.y{~?#y

end.

)

```

다음은 무인점 프로그래밍을 시연하는 퀵 정렬 구현이다. 후자는 함수들을 함께 구성하고 변수를 명시적으로 참조하지 않는 것을 포함한다. J의 ''포크''와 ''훅'' 지원은 이 함수에 적용되는 인수가 구성 요소 함수에 적용되는 방법에 대한 규칙을 정한다.

```j

quicksort=: (($:@(<#[), (=#[), $:@(>#[)) ({~ ?@#)) ^: (1<#)

```

J에서 정렬은 일반적으로 내장(원시) 동사 `/:` (오름차순 정렬) 및 `\:` (내림차순 정렬)을 사용하여 수행된다. 위에 있는 quicksort와 같은 사용자 정의 정렬은 일반적으로 예시를 위해서만 사용된다.

다음 예시는 재귀적으로 피보나치 수를 계산하기 위해 자기 참조 동사 `$: `의 사용법을 보여준다:

```j

1:`($:@-&2+$:@<:)@.(>&2)

```

이 재귀는 동사를 이름으로 참조하여도 수행할 수 있지만, 물론 동사의 이름이 지정된 경우에만 가능하다:

```j

fibonacci=:1:`(fibonacci@-&2+fibonacci@<:)@.(>&2)

```

다음 표현식은 n자리의 원주율을 보여주고 J의 확장 정밀도 기능을 시연한다:

```j

n=: 50

```

NB. 필요한 자릿수를 n으로 설정

```j

<.@o. 10x^n

```

NB. 확장 정밀도로 10의 n승 * pi

314159265358979323846264338327950288419716939937510

5. 1. Hello, World!

J는 무인점 스타일과 함수 합성을 허용하여 매우 간결한 프로그램을 작성할 수 있지만, 일부 프로그래머에게는 읽기 어렵다고 여겨진다.

J에서의 "Hello, World!" 프로그램은 다음과 같다:

```j

'Hello, World!'

```

이는 J의 전통적인 사용법을 반영한다. 즉, J 인터프리터 세션에 프로그램을 입력하고, 표현식의 결과를 표시한다. J 스크립트를 독립 실행형 프로그램으로 실행되도록 구성하는 것도 가능하다. 유닉스 시스템에서는 다음과 같이 나타낼 수 있다:

```j

#!/bin/jc

echo 'Hello, world!'

exit ''

5. 2. 퀵 정렬

J는 무인점 스타일과 함수 합성을 허용하여 간결한 프로그래밍이 가능하지만, 일부 프로그래머는 코드를 읽기 어렵다고 느낀다. J를 이용한 퀵 정렬 구현 예시는 다음과 같다:

```j

sel=: adverb def 'u # ['

quicksort=: verb define

if. 1 >: #y do. y

else.

(quicksort y sel e=.y{~?#y

end.

)

```

위 코드는 J Dictionary에 소개된 방식이다.

또한, 무인점 프로그래밍을 이용한 퀵 정렬 구현 예시는 다음과 같다.

```j

quicksort=: (($:@(<#[), (=#[), $:@(>#[)) ({~ ?@#)) ^: (1<#)

```

이는 함수들을 함께 구성하고 변수를 명시적으로 참조하지 않는 방식이다. J의 ''포크''와 ''훅'' 지원은 이 함수에 적용되는 인수가 구성 요소 함수에 어떻게 적용되는지에 대한 규칙을 제공한다.

하지만 J에서 정렬은 보통 내장 동사인 `/:` (오름차순 정렬) 및 `\:` (내림차순 정렬)을 사용하여 수행된다. 사용자 정의 정렬(예: quicksort)은 주로 예시 목적으로 사용된다.

5. 3. 피보나치 수

J는 무인점 스타일과 함수 합성을 허용하여 간결한 프로그램을 작성할 수 있지만, 일부 프로그래머에게는 읽기 어렵다고 여겨진다. 재귀를 이용한 피보나치 수 계산 예시는 다음과 같다.

```j

1:`($:@-&2+$:@<:)@.(>&2)

```

위 코드는 자기 참조 동사 `$: `를 사용하여 재귀적으로 피보나치 수를 계산한다. 동사에 이름을 지정하여 재귀를 수행할 수도 있다.

```j

fibonacci=:1:`(fibonacci@-&2+fibonacci@<:)@.(>&2)

5. 4. 원주율 계산

J는 확장 정밀도를 지원하여, `n=: 50`과 같이 필요한 자릿수를 설정한 후 `<.@o. 10x^n` 표현식을 통해 n자리의 원주율을 계산할 수 있다. 이 식은 확장 정밀도로 10의 n승에 원주율을 곱한 값을 계산한다.

참조

[1] 웹사이트 Release Notes J9.5 https://code.jsoftwa[...]
[2] 웹사이트 Wes McKinney at 2012 meeting Python for Data Analysis http://traims.tumblr[...]
[3] 문서 SuperCollider documentation, Adverbs for Binary Operators http://doc.sccode.or[...]
[4] 웹사이트 Jsoftware https://www.jsoftwar[...]
[5] 웹사이트 A Personal View of APL https://web.archive.[...] 1991
[6] 웹사이트 Overview of J history http://jsoftware.com[...] 2002-03-19
[7] 웹사이트 J NuVoc Words http://code.jsoftwar[...]
[8] 간행물 Springer Science+Business Media
[9] 서적 Network Performance Analysis: Using the J Programming Language Springer Science+Business Media
[10] 웹사이트 Jsoftware's source download page https://www.jsoftwar[...]
[11] 웹사이트 J Source GPL http://thread.gmane.[...] 2011-03-01
[12] Github openj
[13] 웹사이트 Jsoftware's sourcing policy https://www.jsoftwar[...]
[14] 웹사이트 Chapter 25: Object-Oriented Programming http://www.jsoftware[...]
[15] 웹사이트 Wes McKinney at 2012 meeting Python for Data Analysis http://traims.tumblr[...]
[16] 문서 SuperCollider documentation, Adverbs for Binary Operators http://doc.sccode.or[...]
[17] 웹인용 J807 release 8 October 2018 https://code.jsoftwa[...]
[18] 웹사이트 Wes McKinney at 2012 meeting Python for Data Analysis http://traims.tumblr[...]
[19] 문서 SuperCollider documentation, Adverbs for Binary Operators http://doc.sccode.or[...]
[20] 웹사이트 A Personal View of APL https://web.archive.[...] 1991
[21] 웹사이트 Overview of J history http://jsoftware.com[...] 2002-03-19



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

문의하기 : help@durumis.com