추상 위키백과/업데이트/2022-04-28
◀ | 추상 위키백과 업데이트 | ▶ |
위키함수가 출시되면 현재 파이썬과 자바스크립트의 두 가지 프로그래밍 언어로 기능 구현을 지원할 계획입니다. 그러나 불행히도 파이썬이나 자바스크립트로 작성된 모든 코드가 위키함수에서 복사 및 사용되는 데 쉽게 사용할 수 있다는 의미는 아닙니다. 코드는 특정 요구 사항을 충족해야 합니다. 오늘 뉴스레터에서는 이러한 요구 사항과 위키함수를 통해 사용할 수 있도록 하려는 코드를 준비하기 위해 무엇을 할 수 있는지 논의할 것입니다.
첫째, 코드를 가져오는 것이 합법이어야 합니다. 커뮤니티 토론의 결과에 따라 코드는 아파치-2 라이선스로 공개됩니다. 코드를 직접 작성했거나 그에 대한 권리를 소유한 경우 위키함수에 자유롭게 게시할 수 있습니다. 기존 오픈 소스 프로젝트에서 코드를 가져오는 경우 호환 가능한 라이선스가 있는지 확인해야 합니다.
둘째, 코드는 "기능적"이어야 합니다. 즉, 특정 입력이 주어지면 코드는 항상 동일한 출력을 반환해야 합니다. 특히, 다음과 같은 여러 클래스의 함수를 사용할 수 없습니다.
- 결과는 입력에 의해 결정되어야 하며 임의의 구성 요소가 없어야 합니다. 이것은 주사위 던지기를 시뮬레이트하거나 새로 발행된 GUID 또는 유사한 임의 결과를 반환하는 함수를 가질 수 없음을 의미합니다. 임의의 요소는 우리의 캐싱 전략, 특히 함수 호출을 메모화하고 가능한 경우 결과로 대체하는 함수를 깨뜨릴 수 있습니다.
- 함수의 결과는 하루 중 시간, 현재 날짜 또는 사용자 위치에 암시적으로 의존할 수 없습니다. 이것은 우리가 요일을 반환하는 함수를 가질 수 없다는 것을 의미합니다. 이러한 컨텍스트에 의존하려면 함수에 대한 인수로 명시적으로 만들어야 합니다. "지금 여기 태양은 얼마나 높습니까?"와 같은 기능입니다. "주어진 위치와 시간에서 태양은 얼마나 높은가?"로 바꾸어 말해야 합니다. 위치와 시간을 인수로 사용합니다.
- 함수 호출은 의도적인 부작용을 가질 수 없습니다. 세계에서 특정 변경을 일으킬 것으로 예상되는 함수 호출이 없어야 합니다. 로봇에게 특정 루틴을 시작하도록 지시하거나 조명을 켜는 함수 호출. 예, 함수 호출은 항상 세계에 어느 정도 영향을 미치지만(캐시가 변경될 수 있고 컴퓨팅 리소스를 사용하며 일부 전기를 열로 전환함) 이는 부수적이며 미래에 변경될 수 있습니다. 누군가는 위키함수의 결과를 사용하여 로봇이나 장치를 제어하는 시스템을 작성할 수 있지만 실제 제어는 위키함수가 아닌 해당 시스템에서 구현됩니다.
- 함수는 함수 호출로 변경할 수 있는 숨겨진 상태를 가질 수 없습니다. 이것은 이전 요점의 결과입니다. 이것은 예를 들어, 얼마나 자주 호출되었는지 카운트를 유지하고 그 카운트를 반환하는 함수를 가질 수 없음을 의미합니다.
- 이것은 또한 위키백과 문서를 편집하거나 위키데이터 항목을 편집하는 함수 호출이 있을 수 없음을 의미합니다. 함수 또는 함수 구현을 편집하면 결국 위키백과의 문서 내용이 변경될 수 있지만(즉, 위키백과의 문서에서 위키함수 상의 함수가 호출되도록 허용하면) 위키함수에서 함수를 호출해도 기사 내용이 변경되지는 않습니다.
- 함수는 웹이나 더 넓은 인터넷을 호출하지 않을 수 있습니다. 시작 시 HTTP 요청 또는 유사한 메커니즘이 허용되지 않습니다. 함수가 사용하려는 모든 리소스 또는 데이터는 인수로 제공되어야 합니다.
- 처음에는 함수가 위키미디어 프로젝트의 데이터에 접근할 수 없습니다. 우리는 위키데이터의 항목 및 어휘에 대한 접근을 허용하고 나중에 공용의 미디어 파일에 대한 메타데이터에 접근할 수 있도록 초기 출시 후 이정표에서 위키함수를 확장할 계획입니다.
- 함수는 영구 파일 시스템에 파일을 저장 또는 로드할 수 없으며 영구 데이터베이스에서 읽거나 쓸 수 없습니다. 다른 네트워크나 장치에 접근할 수 없습니다.
이러한 사용 사례 중 일부는 출시 후에 처리될 수 있지만(예: 임의의 결과를 허용하거나 "현재 시간은 무엇입니까?"와 같은 함수에 대한 암시적 인수를 사용하기 위해) 신중한 계획, 토론 및 궁극적으로 시스템 변경이 필요합니다.
다음은 위키함수가 처음에 가질 추가 제한 사항입니다:
- 파이썬과 자바스크립트 모두 광범위한 제3자 라이브러리 에코시스템을 사용할 수 있습니다. 처음에는 각각 파이썬 표준 라이브러리와 자바스크립트 표준 내장 객체에만 접근할 수 있습니다. 나중에 프로세스가 라이브러리를 추가하고 구현에서 접근할 수 있도록 허용할 계획입니다.
- 처음에는 코드 구현에서 다른 위키함수 함수를 호출할 수 없습니다(컴포지션에서만). 처음에는 호출된 함수가 동일한 프로그래밍 언어로 구현되어 있는 경우로 제한될 수 있지만 이를 허용할 계획입니다.
- 처음에는 특정 유형에만 직렬화/역직렬화 논리가 내장되어 있습니다(즉, 각 프로그래밍 언어에 대한 Z객체 표현과 메모리 제 객체 사이를 매핑하는 코드). 이러한 유형은 불리언, 문자열, 리스트, 맵(파이썬에서는 dict 또는 JS에서는 맵이 됨) 및 Nothing(파이썬에서는 None, JS에서는 null)입니다. 다른 모든 유형의 경우 기본 코드는 처음에 해당 기본 JSON 개체와 직접 작동합니다. 우리는 커뮤니티에서 더 많은 유형에 대해 직렬화 및 역직렬화를 추가할 수 있도록 디자인 작업을 하고 있습니다.
- 이것은 또한 객체 지향 언어의 의미에서 '객체'에 대한 실질적인 지원이 없다는 것을 의미합니다. 위키함수와의 인터페이스는 내부 상태에 의존할 수 있는 개체의 메서드에 대한 호출이 아니라 함수 호출이 될 것입니다. 또한 객체에는 정보가 숨겨져 있지 않습니다. 위키함수의 모든 값은 완전히 직렬화 및 역직렬화 가능해야 합니다. 값은 변경할 수 없으며, 이는 많은 객체 지향 컨텍스트에서 실제로 객체가 일반적으로 설계되고 사용되는 방식과도 상충됩니다.
- 처음에는 디스패치 또는 유형 계층을 지원하는 기본 제공 메커니즘이 없습니다.
우리는 이미 더 많은 프로그래밍 언어를 추가할 계획이지만 유사한 제한 사항이 있을 것입니다. 자바스크립트와 파이썬은 물론 다른 많은 언어에서도 최상위 함수를 정의할 수 있습니다. 자바 또는 스몰톡와 같은 다른 언어의 경우 위키함수가 제공하는 기능적 인터페이스와 상호 작용하기 위해 약간 다른 패턴을 정의해야 합니다. 언어를 추가할 때마다 프로세스에는 적절한 매핑을 논의하는 설계 단계가 포함됩니다. 우리는 또한 노력을 예측할 수 있도록 더 많은 프로그래밍 언어를 추가할 수 있는 방법을 문서화할 계획입니다.
이 게시물에는 예제와 방법이 없지만 구현 요구 사항에 대해 설명합니다. 다음 주에 우리는 위키함수 내에서 라이브러리의 코드를 재사용할 수 있는 방법에 대한 몇 가지 패턴과 예를 조사하는 하나 이상의 게시물로 후속 조치를 취할 것입니다.
이 뉴스레터의 이전 초안에 대해 의견을 제공해주신 Mahir256에게 감사드립니다.