크로스 플랫폼 소프트웨어

[thumb|모든 주요 데스크톱 운영체제 플랫폼을 나타내는 [버추얼박스 정보 화면]]
컴퓨팅에서 **크로스 플랫폼 소프트웨어**(cross-platform software, 다중 플랫폼 소프트웨어, 플랫폼 불가지론 소프트웨어 또는 플랫폼 독립 소프트웨어)는 여러 컴퓨팅 플랫폼에서 작동하도록 설계된 컴퓨터 소프트웨어이다. 일부 크로스 플랫폼 소프트웨어는 각 플랫폼에 대해 별도의 빌드를 요구하지만, 일부는 특별한 준비 없이 어떤 플랫폼에서든 직접 실행될 수 있다. 이는 인터프리트 언어로 작성되거나 휴대 가능한 바이트코드로 컴파일되며, 해당 인터프리터 또는 런타임 패키지는 모든 지원 플랫폼의 공통 또는 표준 구성 요소이다.

예를 들어, 크로스 플랫폼 응용 소프트웨어는 리눅스, MacOS 및 마이크로소프트 윈도우에서 실행될 수 있다. 크로스 플랫폼 소프트웨어는 여러 플랫폼에서 실행될 수 있으며, 적게는 두 개에서도 가능하다. 크로스 플랫폼 개발을 위한 일부 프레임워크는 코드네임 원, ArkUI-X, Kivy, Qt, GTK, 플러터, 네이티브스크립트, 자마린, 아파치 코도바, 아이오닉 및 리액트 네이티브가 있다.

## 플랫폼

플랫폼은 운영체제 (OS) 또는 응용 소프트웨어가 실행되는 프로세서 (CPU) 또는 기타 하드웨어의 종류, OS의 종류, 또는 이 둘의 조합을 지칭할 수 있다. 일반적인 플랫폼의 예로는 ARM 아키텍처에서 실행되는 안드로이드가 있다. 다른 잘 알려진 플랫폼은 리눅스/유닉스, MacOS 및 마이크로소프트 윈도우이며, 이들은 모두 크로스 플랫폼이다. 애플리케이션은 특정 플랫폼—하드웨어, OS 또는 실행되는 가상 머신 (VM)—의 기능에 의존하도록 작성될 수 있다. 예를 들어, 자바 플랫폼은 많은 OS 및 하드웨어 유형에서 실행되는 일반적인 VM 플랫폼이다.

### 하드웨어 <span class="anchor" id="Hardware platforms"></span>
하드웨어 플랫폼은 명령어 집합을 지칭할 수 있다. 예를 들어, ARM 또는 x86 아키텍처가 있다. 이러한 기계는 다른 운영체제를 실행할 수 있다.

스마트폰과 태블릿은 일반적으로 ARM 아키텍처를 실행하며, 종종 안드로이드 또는 iOS 및 기타 모바일 운영체제를 실행한다.

### 소프트웨어 <span class="anchor" id="Software platforms"></span>
소프트웨어 플랫폼은 운영체제 (OS) 또는 프로그래밍 환경일 수 있지만, 더 일반적으로는 둘의 조합이다. 예외적으로 자바는 OS 독립적인 가상 머신 (VM)을 사용하여 자바 바이트코드를 실행한다. 일부 소프트웨어 플랫폼은 다음과 같다:
* 안드로이드 (ARM64)
* 크롬OS (ARM32, ARM64, IA-32, x86-64)
* 마이크로소프트의 공통 언어 기반 (CLI) 구현:
** 마이크로소프트 윈도우에서만 작동하는 이전 닷넷 프레임워크.
** 마이크로소프트 윈도우, macOS 및 리눅스에서 작동하는 새로운 닷넷 프레임워크 (단순히 ".NET"이라고 함).
** 모노 (이전에는 노벨과 자마린에 의해 개발됨)와 같은 다른 구현
* 훙멍 (ARM64, RISC-V, x86, x64, 및 LoongArch)
* iOS ((ARMv8-A))
* iPadOS (ARMv8-A)
* 자바
* 리눅스 (&nbsp;Alpha, ARC, ARM, C-Sky, Hexagon, LoongArch, m68k, Microblaze, MIPS, Nios II, OpenRISC, PA-RISC, PowerPC, RISC-V, s390, SuperH, SPARC, x86, Xtensa)
* 마이크로소프트 C to P-Code (1980-1982: 많은 아키텍처 및 시스템)
* MacOS x86, ARM (애플 실리콘)
* 마이크로소프트 윈도우 (IA-32, x86-64, ARM, ARM64)
* 플레이스테이션 4 (x86), 플레이스테이션 3 (PowerPC) 및 플레이스테이션 비타 (ARM)
* 솔라리스 (SPARC, x86)
* SPARC
* 유닉스 (1969년 이후 많은 플랫폼)
* 웹 브라우저 – 대부분 서로 호환되며, 자바스크립트 웹 앱을 실행함
* 엑스박스

;마이너, 역사적
* AmigaOS (m68k), 아미가OS 4 (PowerPC), AROS (x86, PowerPC, m68k), MorphOS (PowerPC)
* 아타리 TOS, MiNT
* BSD (많은 플랫폼; 예를 들어 NetBSDnet 참조)
* x86 기반 도스 유형 시스템: MS-DOS, IBM PC DOS, DR-DOS, 프리도스
* OS/2, eComStation
* BeOS (PowerPC, x86)

#### 자바 <span class="anchor" id="Java platform"></span>

자바 언어는 일반적으로 자바 플랫폼의 일부인 VM에서 실행되도록 컴파일된다. 자바 가상 머신 (자바 VM, JVM)은 소프트웨어로 구현된 CPU로, 모든 자바 코드를 실행한다. 이를 통해 동일한 코드가 JVM을 구현하는 모든 시스템에서 실행될 수 있다. 자바 소프트웨어는 하드웨어 기반 자바 프로세서에 의해 실행될 수 있다. 이는 주로 임베디드 시스템에서 사용된다.

JVM에서 실행되는 자바 코드는 적절한 권한이 부여된 경우 디스크 입출력 (I/O) 및 네트워크 액세스와 같은 OS 관련 서비스에 액세스할 수 있다. JVM은 자바 애플리케이션을 대신하여 시스템 호출을 수행한다. 이를 통해 사용자는 접근 제어 목록 (ACL)에 따라 적절한 보호 수준을 결정할 수 있다. 예를 들어, 디스크 및 네트워크 액세스는 일반적으로 데스크톱 애플리케이션에는 활성화되지만, 브라우저 기반 애플릿에는 비활성화된다. 자바 네이티브 인터페이스 (JNI)는 이식성을 잃으면서 OS 특정 기능에 액세스하는 데에도 사용될 수 있다.

현재 자바 표준 에디션 소프트웨어는 마이크로소프트 윈도우, macOS, 여러 유닉스 계열 OS 및 임베디드 장치용 여러 실시간 운영체제에서 실행될 수 있다. 모바일 애플리케이션의 경우 윈도우 및 Mac 기반 장치에서는 브라우저 플러그인이 사용되며, 안드로이드에는 자바에 대한 내장 지원이 있다. 리소스 제약이 있는 장치용으로 설계된 자바 카드 또는 자바 플랫폼, 마이크로 에디션과 같은 자바의 하위 집합도 있다.

## 구현 <span class="anchor" id="Implementations"></span>
소프트웨어가 크로스 플랫폼으로 간주되려면 두 개 이상의 컴퓨터 구조 또는 OS에서 작동해야 한다. 이러한 소프트웨어를 개발하는 것은 시간이 많이 걸리는 작업일 수 있는데, 이는 다른 OS가 다른 애플리케이션 프로그래밍 인터페이스 (API)를 가지고 있기 때문이다.

하나의 OS용으로 작성된 소프트웨어가 해당 OS가 지원하는 모든 아키텍처에서 자동으로 작동하는 것은 아니다. 소프트웨어가 C 또는 C++와 같은 인기 있는 프로그래밍 언어로 작성되었다고 해서 해당 언어를 지원하는 모든 OS에서—심지어 동일한 OS의 다른 버전에서도—실행되는 것은 아니다.

### 웹 애플리케이션
웹 애플리케이션은 이상적으로는 모든 웹 브라우저에서 접근 가능하기 때문에 일반적으로 크로스 플랫폼으로 설명된다: 브라우저가 플랫폼이다. 웹 애플리케이션은 일반적으로 클라이언트 서버 모델을 사용하지만, 복잡성과 기능 면에서 크게 다르다. 기능에 대한 열망과 호환성 요구를 조화시키는 것은 어려울 수 있다.

기본 웹 애플리케이션은 스테이트리스 서버에서 모든 또는 대부분의 처리를 수행하고, 그 결과를 클라이언트 웹 브라우저에 전달한다. 애플리케이션과의 모든 사용자 상호작용은 데이터 요청과 서버 응답의 간단한 교환으로 구성된다. 이러한 유형의 애플리케이션은 월드 와이드 웹 애플리케이션 개발의 초기 단계에서 표준이었다. 이러한 애플리케이션은 정적 웹 페이지를 제공하는 것과 동일한 간단한 트랜잭션 처리 모델을 따른다. 오늘날에도 특히 크로스 플랫폼 호환성과 단순성이 고급 기능보다 더 중요하게 여겨지는 곳에서는 여전히 비교적 흔하다.

고급 웹 애플리케이션의 대표적인 예로는 Gmail 및 구글 지도의 웹 인터페이스가 있다. 이러한 애플리케이션은 Ajax, 자바스크립트, DHTML, SVG 및 리치 웹 애플리케이션의 다른 구성 요소와 같이 인기 있는 웹 브라우저의 최신 버전에서만 발견되는 추가 기능에 의존한다.

#### 디자인 <span class="anchor" id="Design strategies"></span>
호환성과 기능이라는 상충되는 관심사 때문에 수많은 디자인 전략이 등장했다.

많은 소프트웨어 시스템은 플랫폼 의존적인 코드가 가장 상위 및 최하위 계층에 국한되는 계층형 아키텍처를 사용한다.

##### 점진적 성능 저하
점진적 성능 저하는 모든 사용자 및 플랫폼에 동일하거나 유사한 기능을 제공하려고 시도하는 동시에, 더 제한적인 클라이언트 브라우저의 경우 기능을 최소 공통 분모로 줄인다. 예를 들어, 제한된 기능의 브라우저를 사용하여 Gmail에 액세스하려는 사용자는 Gmail이 기본 모드로 전환되어 기능이 줄어들지만 여전히 유용하다는 것을 알 수 있다.

##### 다중 코드베이스
일부 소프트웨어는 동등한 기능을 가진 다른 (하드웨어 및 OS) 플랫폼에 대해 별도의 코드베이스로 유지 관리된다. 이는 코드를 유지 관리하는 데 더 많은 노력이 필요하지만, 플랫폼별 코드의 양이 많은 경우에는 가치가 있을 수 있다.

##### 단일 코드베이스
이 전략은 여러 플랫폼별 형식으로 컴파일될 수 있는 하나의 코드베이스를 가지는 것에 의존한다. 한 가지 기술은 조건부 컴파일이다. 이 기술을 사용하면 모든 플랫폼에 공통적인 코드가 반복되지 않는다. 특정 플랫폼에만 관련된 코드 블록은 조건부로 만들어 필요한 경우에만 해석되거나 컴파일된다. 또 다른 기술은 기능 분리로, 브라우저 또는 OS에서 지원되지 않는 기능을 비활성화하면서도 사용자에게 완전한 애플리케이션을 제공한다. (참조: 관심사 분리.) 이 기술은 해석된 코드(스크립팅 언어에서처럼)가 실행되는 플랫폼을 쿼리하여 다른 블록을 조건부로 실행할 수 있는 웹 개발에서 사용된다.

##### 타사 라이브러리
타사 라이브러리는 벤더 종속을 희생하면서 단일 통합 API 뒤에 클라이언트 차이의 복잡성을 숨김으로써 크로스 플랫폼 기능을 단순화하려고 시도한다.

##### 반응형 웹 디자인
반응형 웹 디자인 (RWD)은 모바일 폰에서 데스크톱 컴퓨터 모니터에 이르는 광범위한 장치에서 크기 조정, 패닝 및 스크롤링을 최소화하여 최적의 시청 경험—쉬운 읽기 및 탐색—을 제공하도록 사이트의 시각적 레이아웃을 만드는 것을 목표로 하는 웹 디자인 접근 방식이다. 이 기술에는 플랫폼별 코드가 거의 또는 전혀 사용되지 않는다.

#### 테스트 <span class="anchor" id="Testing strategies"></span>
크로스 플랫폼 애플리케이션은 훨씬 더 많은 통합 시험이 필요하다. 일부 웹 브라우저는 동일한 기기에 다른 버전을 설치하는 것을 금지한다. 여러 플랫폼을 대상으로 하는 여러 접근 방식이 있지만, 이들 모두는 테스트 및 유지 보수에 상당한 수동 노력이 필요한 소프트웨어를 초래한다. 완전 가상화와 같은 기술은 때때로 이 문제에 대한 해결책으로 사용된다.

페이지 객체 모델과 같은 도구를 사용하면 크로스 플랫폼 테스트를 스크립팅하여 하나의 테스트 케이스가 앱의 여러 버전을 커버할 수 있다. 다른 버전이 유사한 사용자 인터페이스를 가지고 있다면, 모두 하나의 테스트 케이스로 테스트할 수 있다.

### 기존 애플리케이션
웹 애플리케이션이 점점 인기를 얻고 있지만, 많은 컴퓨터 사용자는 여전히 클라이언트/웹 서버 아키텍처에 의존하지 않는 기존 응용 소프트웨어를 사용한다. 기존 애플리케이션과 웹 애플리케이션의 구별은 항상 명확하지 않다. 웹 및 기존 애플리케이션의 기능, 설치 방법 및 아키텍처는 중첩되어 구별을 흐리게 한다. 그럼에도 불구하고, 이 단순화된 구별은 일반적이고 유용한 일반화이다.

#### 바이너리 소프트웨어
전통적인 응용 소프트웨어는 바이너리 파일, 특히 실행 파일로 배포되었다. 실행 파일은 빌드된 플랫폼만 지원한다. 즉, 단일 크로스 플랫폼 실행 파일은 특정 플랫폼에서 절대 실행되지 않는 코드로 매우 부풀려질 수 있다. 대신 일반적으로 각 플랫폼용으로 빌드된 여러 실행 파일이 있다.

C 또는 C++로 작성된 것과 같이 바이너리 실행 파일로 배포되는 소프트웨어의 경우, 단일 코드베이스를 여러 바이너리 실행 파일로 변환(트랜스컴파일)하는 도구셋을 사용하여 각 플랫폼에 대한 소프트웨어 빌드가 있어야 한다. 예를 들어, 오픈 소스 웹 브라우저인 모질라 파이어폭스는 윈도우, macOS (파워PC 및 x86 모두 애플이 유니버설 바이너리라고 부르는 것을 통해), 리눅스 및 여러 컴퓨터 아키텍처의 BSD에서 사용할 수 있다. 네 가지 플랫폼(이 경우 윈도우, macOS, 리눅스 및 BSD)은 대부분 동일한 소스 코드에서 나오지만 별도의 실행 파일 배포이다. 드문 경우에, 여러 플랫폼용으로 빌드된 실행 코드가 팻 바이너리라고 불리는 단일 실행 파일로 결합된다.

다른 도구셋을 사용하는 것만으로는 다른 플랫폼용으로 작동하는 실행 파일을 빌드하기에 충분하지 않을 수 있다. 이 경우 프로그래머는 소스 코드를 새 플랫폼으로 이식해야 한다. 예를 들어, x86 제품군의 윈도우에서 이미 실행되는 모질라 파이어폭스와 같은 애플리케이션은 x86 (및 잠재적으로 다른 아키텍처)의 리눅스에서도 실행되도록 수정하고 다시 빌드할 수 있다. 코드의 여러 버전은 별도의 코드베이스로 저장되거나 하나의 코드베이스로 병합될 수 있다.

이식에 대한 대안은 크로스 플랫폼 가상화로, 한 플랫폼용으로 컴파일된 애플리케이션이 소스 코드나 바이너리 수정 없이 다른 플랫폼에서 실행될 수 있다. 예를 들어, 인텔 기반 매킨토시 컴퓨터에 내장된 애플의 로제타는 파워PC CPU를 사용했던 이전 세대 Mac용으로 컴파일된 애플리케이션을 실행한다. 또 다른 예는 IBM PowerVM Lx86으로, Linux/x86 애플리케이션이 Linux/Power OS에서 수정 없이 실행될 수 있도록 한다.

크로스 플랫폼 바이너리 소프트웨어의 예:
* 리브레오피스 오피스 스위트는 마이크로소프트 윈도우, macOS, 리눅스, FreeBSD, NetBSD, OpenBSD, 안드로이드, iOS, iPadOS, 크롬OS, 웹 기반 콜라보라 온라인 및 기타 여러 플랫폼용으로 빌드된다. 이들 중 다수는 IA-32, x86-64, ARM 아키텍처 (ARMel, ARMhf, ARM64), MIPS 아키텍처, MIPSel, 파워PC, ppc64le 및 S390x[9]를 포함한 프로세서 아키텍처를 가진 여러 하드웨어 플랫폼에서 지원된다.

#### 스크립트 및 인터프리트 언어
스크립트는 해당 인터프리터가 여러 플랫폼에서 사용 가능하고 스크립트가 언어에 내장된 기능만 사용하는 경우 크로스 플랫폼으로 간주될 수 있다. 예를 들어, 유닉스 계열 시스템용으로 파이썬으로 작성된 스크립트는 윈도우에서도 파이썬이 실행되므로 윈도우에서 거의 또는 전혀 수정 없이 실행될 가능성이 높다. 실제로 닷넷 프레임워크용 IronPython과 같은 많은 구현이 있다. 이는 많은 자유-오픈 소스 소프트웨어 스크립팅 언어에도 동일하게 적용된다.

바이너리 실행 파일과 달리, 동일한 스크립트는 스크립트를 해석할 소프트웨어가 설치된 모든 컴퓨터에서 사용될 수 있다. 이는 스크립트가 일반적으로 텍스트 파일에 플레인 텍스트로 저장되기 때문이다. 새줄 문자의 표현과 같은 몇 가지 사소한 문제가 있을 수 있다.

몇 가지 인기 있는 크로스 플랫폼 스크립팅 언어는 다음과 같다:
* 배시 – 리눅스 및 기타 최신 유닉스 계열 시스템에서 일반적으로 실행되는 유닉스 셸이며, 시그윈 POSIX 호환성 계층, 윈도우용 깃 (소프트웨어), 또는 리눅스용 윈도우 하위 시스템을 통해 윈도우에서도 실행된다.
* 펄 – 1987년에 처음 출시되었다. CGI 프로그래밍, 소규모 시스템 관리 작업 등에 사용된다.
* PHP – 주로 웹 애플리케이션에 사용된다.
* 파이썬 – 런타임 효율성보다는 고속 응용 프로그램 개발 및 작성 용이성에 중점을 둔 언어이다.
* 루비 – 읽기 쉬움을 목표로 하는 객체 지향 언어이다. 루비 온 레일즈를 통해 웹에서도 사용될 수 있다.
* Tcl – 웹 및 데스크톱 애플리케이션, 네트워킹, 관리, 테스트 등 다양한 용도에 적합한 동적 프로그래밍 언어이다.

### 비디오 게임
크로스 플랫폼 또는 다중 플랫폼은 다양한 비디오 게임 콘솔에서 출시된 비디오 게임에도 적용될 수 있는 용어이다. 크로스 플랫폼 게임의 예로는 마이너 2049어, 툼 레이더: 레전드, FIFA 시리즈, NHL 시리즈 및 마인크래프트가 있다.

각 게임은 Wii, 플레이스테이션 3, 엑스박스 360, 개인용 컴퓨터 및 모바일 기기와 같은 다양한 게임 플랫폼에서 출시되었다.

일부 플랫폼은 다른 플랫폼보다 개발하기가 더 어려워서 동일한 수준으로 비디오 게임을 개발하는 데 더 많은 시간이 필요하다. 이를 상쇄하기 위해 비디오 게임은 처음에는 몇몇 플랫폼에서 출시된 후 나중에 다른 플랫폼에서 출시될 수 있다. 일반적으로 이는 새로운 게임 시스템이 출시될 때 발생하는데, 비디오 게임 개발자가 해당 하드웨어 및 소프트웨어에 익숙해져야 하기 때문이다.

일부 게임은 개발자와 비디오 게임 콘솔 제조업체 간의 라이선스 계약으로 인해 특정 콘솔 하나로 개발이 제한될 수 있으므로 크로스 플랫폼이 아닐 수 있다. 예를 들어, 디즈니가 최신 닌텐도 및 소니 게임 콘솔에 출시할 목적으로 게임을 만들 수 있다. 디즈니가 소니와 먼저 게임 라이선스를 체결하면, 짧은 기간 동안 또는 무기한으로 소니의 콘솔에서만 게임을 출시해야 할 수 있다.

#### 크로스 플랫폼 플레이

여러 개발자들이 다른 플랫폼을 사용하여 온라인 게임을 플레이하는 방법을 구현했다. 사이오닉스, 에픽게임즈, 마이크로소프트 및 밸브 코퍼레이션은 모두 엑스박스 360 및 플레이스테이션 3 게이머가 PC 게이머와 플레이할 수 있도록 하는 기술을 보유하고 있어, 어떤 플랫폼을 사용할지에 대한 결정은 소비자에게 맡겨진다. PC와 콘솔 게임 (특수 제작된 키보드 및 마우스를 가진 드림캐스트) 간에 이러한 수준의 상호작용을 허용한 첫 번째 게임은 퀘이크 3였다.

크로스 플랫폼 온라인 플레이를 지원하는 게임으로는 로켓 리그, 파이널 판타지 XIV, 스트리트 파이터 V, 킬러 인스팅트, 파라곤 및 페이블 포춘, 그리고 윈도우 10, VR 에디션, 마인크래프트 포켓 에디션 및 엑스박스 원의 Better Together 업데이트가 포함된 마인크래프트가 있다.

## 프로그래밍 <span class="anchor" id="Cross-platform programming"></span>
크로스 플랫폼 프로그래밍은 의도적으로 두 개 이상의 플랫폼에서 작동하도록 소프트웨어를 작성하는 행위이다.

### 접근 방식 <span class="anchor" id="Approaches to cross-platform programming"></span>
크로스 플랫폼 애플리케이션을 작성하는 여러 가지 방법이 있다. 한 가지 접근 방식은 다른 소스 트리에서 동일한 소프트웨어의 여러 버전을 만드는 것이다. 즉, 마이크로소프트 윈도우 버전의 애플리케이션은 하나의 소스 코드 파일 세트를 가질 수 있고, 매킨토시 버전은 다른 세트를 가질 수 있으며, 자유-오픈 소스 소프트웨어 *nix 시스템은 세 번째 세트를 가질 수 있다. 이것은 간단하지만, 하나의 플랫폼만 개발하는 것보다 더 큰 팀을 고용하거나 제품을 더 느리게 출시하는 데 훨씬 더 많은 비용이 들 수 있다. 또한 더 많은 버그를 추적하고 수정해야 할 수도 있다.

또 다른 접근 방식은 플랫폼 간의 차이를 숨기는 소프트웨어를 사용하는 것이다. 이 추상화 계층은 플랫폼으로부터 애플리케이션을 격리시킨다. 이러한 애플리케이션은 플랫폼 불가지론적이다. JVM에서 실행되는 애플리케이션은 이러한 방식으로 빌드된다.

일부 애플리케이션은 최종 애플리케이션을 만들기 위해 다양한 크로스 플랫폼 프로그래밍 방법을 혼합한다. 예를 들어, 모질라 파이어폭스 웹 브라우저는 추상화를 사용하여 일부 하위 수준 구성 요소를 구축하고, 플랫폼별 기능(예: GUI)을 구현하기 위한 별도의 소스 서브트리를 사용하며, 소프트웨어 이식성을 용이하게 하기 위해 두 개 이상의 스크립팅 언어를 구현한다. 모질라 파이어폭스는 고전적인 넷스케이프 스타일 브라우저 플러그인 외에도 XUL, CSS 및 자바스크립트를 구현하여 브라우저를 확장한다. 브라우저 자체의 상당 부분은 XUL, CSS 및 자바스크립트로 작성되었다.

### 도구 키트 및 환경<span class="anchor" id="Cross-platform programming toolkits and environments"></span>
크로스 플랫폼 프로그래밍 과정을 돕는 많은 도구가 있다:
* 8th: GUI 계층으로 Juce를 활용하는 개발 언어이다. 현재 안드로이드, iOS, 윈도우, macOS, 리눅스 및 라즈베리 파이를 지원한다.
* 아난트 컴퓨팅: 키보드를 포함한 모든 인도 언어로 작동하며, 앱월렛 및 모든 OS에서 네이티브 성능을 지원하는 모바일 애플리케이션 플랫폼이다.
* AppearIQ: 기업 환경에서 앱 개발 및 배포 워크플로우를 지원하는 프레임워크이다. 기본적으로 개발된 컨테이너는 API를 통해 HTML5 코드에 모바일 장치 또는 태블릿의 하드웨어 기능을 제공하여 다양한 플랫폼에서 실행되는 모바일 앱 개발을 용이하게 한다.
* Boden: C++로 작성된 UI 프레임워크이다.
* 카이로: 벡터 그래픽스 기반의 장치 독립적인 API를 제공하는 데 사용되는 자유 소프트웨어 라이브러리이다. 여러 백엔드에 걸쳐 2차원 그리기를 위한 프리미티브를 제공하도록 설계되었다. 카이로는 C로 작성되었으며 많은 프로그래밍 언어에 대한 바인딩이 있다.
* Cocos2d: 2D 및 간단한 3D 크로스 플랫폼 게임 및 애플리케이션 개발을 위한 오픈 소스 툴킷 및 게임 엔진이다.
* 코드네임 원: 자바 및 코틀린 개발자를 위한 오픈 소스 Write Once Run Anywhere (WORA) 프레임워크이다.
* 델파이: 파스칼 기반 언어를 사용하여 개발하는 IDE이다. 안드로이드, iOS, 윈도우, macOS, 리눅스를 지원한다.
* Ecere SDK: eC로 작성되었으며 C 및 파이썬과 같은 추가 언어를 지원하는 GUI 및 2D/3D 그래픽 툴킷 및 IDE이다. Emscripten 또는  (웹어셈블리)를 통해 리눅스, FreeBSD, 윈도우, 안드로이드, macOS 및 웹을 지원한다.
* 이클립스: 오픈 소스 개발 환경이다. 자바로 구현되었으며 소프트웨어 개발을 위한 많은 도구를 지원하는 구성 가능한 아키텍처를 가지고 있다. 자바 및 C++를 포함한 여러 언어에 대한 추가 기능이 있다.
* FLTK: 오픈 소스 툴킷이지만 GUI에 국한되므로 더 경량이다.
* 플러터: 구글에서 개발한 IOS, 안드로이드, Mac, 윈도우용 크로스 플랫폼 UI 프레임워크이다.
* fpGUI: 객체 파스칼로 완전히 구현된 오픈 소스 위젯 툴킷이다. 현재 리눅스, 윈도우 및 일부 윈도우 CE를 지원한다.
* GeneXus: 지식 표현을 기반으로 크로스 플랫폼 애플리케이션 생성 및 배포를 위한 윈도우 고속 소프트웨어 개발 솔루션으로, C 샤프, 코볼, 안드로이드 및 블랙베리 스마트 장치를 포함한 자바, 애플 모바일 장치용 오브젝티브-C, RPG, 루비, 비주얼 베이직 및 비주얼 폭스프로를 지원한다.
* GLBasic: C++ 코드를 생성하는 BASIC 방언 및 컴파일러이다. 많은 플랫폼용 크로스 컴파일러를 포함하며 수많은 플랫폼 (윈도우, Mac, 리눅스, 안드로이드, iOS 및 일부 이국적인 핸드헬드)을 지원한다.
* 고도: 고도 엔진을 사용하는 SDK이다.
* GTK+: X11을 사용하는 유닉스 계열 시스템 및 마이크로소프트 윈도우용 오픈 소스 위젯 툴킷이다.
* Haxe: 오픈 소스 언어이다.
* Juce: C++로 작성된 애플리케이션 프레임워크로, 코드 변경 없이 수많은 시스템 (마이크로소프트 윈도우, POSIX, macOS)에서 네이티브 소프트웨어를 작성하는 데 사용된다.
* Kivy: 파이썬으로 작성된 오픈 소스 크로스 플랫폼 UI 프레임워크이다. 안드로이드, iOS, 리눅스, OS X, 윈도우 및 라즈베리 파이를 지원한다.
* LEADTOOLS: 인식, 문서, 의료, 이미징 및 멀티미디어 기술을 윈도우, iOS, macOS, 안드로이드, 리눅스 및 웹 애플리케이션에 통합하기 위한 크로스 플랫폼 SDK 라이브러리이다.
* 라이브코드: HyperTalk에서 영감을 받은 상업용 크로스 플랫폼 고속 응용 프로그램 개발 언어이다.
* 라자루스: FreePascal 컴파일러를 위한 프로그래밍 환경이다. 독립형 그래픽 및 콘솔 애플리케이션 생성을 지원하며 리눅스, MacOSX, iOS, 안드로이드, WinCE, 윈도우 및 웹에서 실행된다.
* 맥스/MSP: 플랫폼 독립적인 코드를 macOS 및 윈도우용 애플리케이션으로 플랫폼 특정 런타임 환경과 함께 캡슐화하는 시각적 프로그래밍 언어이다. 크로스 플랫폼 안드로이드 런타임. 수정되지 않은 안드로이드 앱이 iOS 및 macOS에서 기본적으로 실행될 수 있도록 한다.
* 멘딕스: 클라우드 기반의 로우 코드 애플리케이션 개발 플랫폼이다.
* 모노크로스: 모델과 컨트롤러는 크로스 플랫폼이지만 뷰는 플랫폼 특정적인 오픈 소스 모델-뷰-컨트롤러 디자인 패턴이다.
* 모노: 마이크로소프트 닷넷 (애플리케이션 및 프로그래밍 언어용 프레임워크)의 오픈 소스 크로스 플랫폼 버전이다.
* MoSync: C++ 계열의 모바일 플랫폼 앱 개발을 위한 오픈 소스 SDK이다.
* 모질라 애플리케이션 프레임워크: macOS, 윈도우 및 리눅스 애플리케이션 구축을 위한 오픈 소스 플랫폼이다.
* OpenGL: 3D 그래픽 라이브러리이다.
* 픽셀 게임 메이커 MV: 윈도우용으로 윈도우 및 닌텐도 스위치 게임을 개발하기 위한 독점 2D 게임 개발 소프트웨어이다.
* 퓨어베이직: macOS, 윈도우 및 리눅스 애플리케이션을 구축하기 위한 독점 언어 및 IDE이다.
* ReNative: React Native로 다중 플랫폼 프로젝트를 구축하는 범용 개발 SDK이다. 최신 iOS, tvOS, 안드로이드, 안드로이드 TV, 웹, 타이젠 TV, 타이젠 워치, LG webOS, macOS/OSX, 윈도우, KaiOS, Firefox OS 및 Firefox TV 플랫폼을 포함한다.
* Qt: 유닉스 계열 시스템(X11), 마이크로소프트 윈도우, macOS 및 기타 시스템용 애플리케이션 프레임워크 및 위젯 툴킷으로, 독점 및 오픈 소스 사용권 모두에서 사용 가능하다.
* SFML: 그래픽, 입력, 오디오 등에 대한 저수준 및 고수준 액세스를 제공하는 멀티미디어 C++ API이다.
* 심플 다이렉트미디어 레이어: C로 작성된 오픈 소스 멀티미디어 라이브러리로, 다양한 플랫폼의 그래픽, 사운드 및 입력 API에 대한 추상화를 생성한다. 리눅스, 윈도우 및 macOS를 포함한 OS에서 실행되며 게임 및 멀티미디어 애플리케이션을 목표로 한다.
* Smartface: 위지위그 디자인 편집기와 자바스크립트 코드 편집기를 사용하여 안드로이드 및 iOS용 모바일 애플리케이션을 생성하는 네이티브 앱 개발 도구이다.
* Tcl/Tk
* 티타늄 모바일: 안드로이드 및 iOS 개발을 위한 오픈 소스 크로스 플랫폼 프레임워크이다.
* U++: 성능을 위한 C++ GUI 프레임워크이다. 라이브러리 세트 (GUI, SQL 등) 및 IDE를 포함한다. 윈도우, macOS 및 리눅스를 지원한다.
* 유니티: 유니티 엔진을 사용하는 또 다른 크로스 플랫폼 SDK이다.
* 우노 플랫폼: C#을 사용하여 윈도우, macOS, iOS, 안드로이드, 웹어셈블리 및 리눅스를 지원한다.
* 언리얼 엔진: 언리얼 엔진을 사용하는 크로스 플랫폼 SDK이다.
* V-Play Engine: V-Play는 인기 있는 Qt 프레임워크를 기반으로 한 크로스 플랫폼 개발 SDK이다. V-Play 앱 및 게임은 Qt Creator 내에서 생성된다.
* WaveMaker: 반응형 웹 및 하이브리드 모바일 (안드로이드 & iOS) 애플리케이션을 생성하는 로우 코드 개발 도구이다.
* WinDev: 윈도우, 리눅스, .Net 및 자바, 웹 브라우저용 통합 개발 환경이다. 비즈니스 및 산업 애플리케이션에 최적화되어 있다.
* WxWidgets: 애플리케이션 프레임워크이기도 한 오픈 소스 위젯 툴킷이다. 유닉스 계열 시스템(X11), 마이크로소프트 윈도우 및 macOS에서 실행된다.
* 소조: 객체 지향 프로그래밍 언어를 사용하여 데스크톱, 웹 및 iOS 앱을 컴파일하는 RAD IDE이다. 소조는 윈도우, macOS, iOS 및 리눅스로의 네이티브 컴파일을 지원하며, 독립 실행형 서버 또는 CGI를 통해 실행할 수 있는 컴파일된 웹 앱도 생성할 수 있다.

## 과제<span class="anchor" id="Challenges to cross-platform development"></span>
크로스 플랫폼 소프트웨어를 개발할 때 많은 어려움이 있다:
* 다른 플랫폼은 약간 다른 동작이나 미묘한 버그를 나타낼 수 있으므로 크로스 플랫폼 애플리케이션 테스트는 상당히 복잡할 수 있다. 이 문제는 일부 개발자들이 크로스 플랫폼 개발을 썬 마이크로시스템즈의 "write once, run anywhere" 마케팅 슬로건을 비틀어 "한 번 작성하고 모든 곳에서 디버그"라고 조롱하게 만들었다.
* 개발자들은 종종 모든 플랫폼에서 사용할 수 있는 기능의 최소 공통 분모 하위 집합을 사용하도록 제한된다. 이는 애플리케이션의 성능을 저해하거나 개발자들이 각 플랫폼의 가장 고급 기능을 사용하는 것을 금지할 수 있다.
* 다른 플랫폼은 종종 다른 사용자 인터페이스 규칙을 가지며, 크로스 플랫폼 애플리케이션은 항상 이를 수용하지 못한다. 예를 들어, macOS 및 그놈용으로 개발된 애플리케이션은 창이나 대화 상자의 오른쪽에 가장 중요한 버튼을 배치해야 하는 반면, 마이크로소프트 윈도우 및 KDE는 반대 규칙을 가진다. 이러한 차이 중 상당수는 미묘하지만, 이러한 규칙을 따르지 않는 크로스 플랫폼 애플리케이션은 사용자에게 어색하거나 이질적으로 느껴질 수 있다. 빠르게 작업할 때, 이러한 상반되는 규칙은 변경 사항을 저장할지 또는 버릴지 확인하는 데이터 손실과 같은 결과를 초래할 수도 있다.
* 스크립팅 언어 및 VM 바이트코드는 사용될 때마다 네이티브 실행 코드로 번역되어야 하므로 성능 저하가 발생한다. 이 저하는 JIT 컴파일과 같은 기술을 사용하여 완화될 수 있지만, 일부 계산 오버헤드는 피할 수 없을 수도 있다.
* 다른 플랫폼은 RPM 패키지 매니저 및 윈도우 인스톨러와 같은 네이티브 패키지 형식을 사용해야 한다. InstallAnywhere와 같은 다중 플랫폼 설치 프로그램이 이러한 요구를 해결한다.
* 크로스 플랫폼 실행 환경은 크로스 플랫폼 보안 결함을 겪을 수 있으며, 크로스 플랫폼 악성 소프트웨어에 대한 비옥한 환경을 조성한다.

## 같이 보기
* 운영 컨텍스트
* 위젯 툴킷 목록
* 하드웨어 가상화
* 언어 바인딩
* 소스 대 소스 컴파일러
* 바이너리 코드 호환성
* 메시징 플랫폼의 사용자 기능 비교

## 각주


분류:컴퓨팅 플랫폼
분류:상호운용성