자바의 세 가지 이식성

Java는 이식 가능한 응용 프로그램과 애플릿을 약속하기 때문에 프로그래밍 커뮤니티에서 많은 관심을 불러 일으켰습니다 . 실제로 Java는 소스 코드 이식성, CPU 아키텍처 이식성 및 OS / GUI 이식성이라는 세 가지 유형의 이식성을 제공합니다. 이러한 유형 중 하나만 Microsoft에 위협이되기 때문에 세 가지 유형의 이식성이 있다는 사실이 중요합니다. 마이크로 소프트는 자바를 지원한다고 주장하면서 다른 두 가지를 포용하면서 한 유형의 이식성을 약화시킬 것으로 예상 할 수 있습니다. 세 가지 유형의 이식성과 이들이 함께 작동하는 방식을 이해하는 것은 Microsoft에 대한 위협과 Microsoft의 가능한 대응을 이해하는 데 중요합니다.

하지만이 세 가지 유형의 이식성에 대해 자세히 알아보기 전에 몇 가지 기본 용어를 살펴 보겠습니다.

용어 정의

이 기사에서는 다음 용어가 사용됩니다.

엔디안주의
엔디안은 주어진 CPU에서 멀티 바이트 수량의 바이트 저장 순서를 나타냅니다. 예를 들어 unsigned short 256 (10 진수)에는 2 바이트의 저장소 (0x01 및 0x00)가 필요합니다. 이 두 바이트는 0x01, 0x00또는 순서로 저장할 수 있습니다 0x00, 0x01. Endianism은 두 바이트가 저장되는 순서를 결정합니다. 실용적인 목적을 위해 엔디안은 일반적으로 다른 엔디안의 CPU가 데이터를 공유해야하는 경우에만 중요합니다.
자바
Java는 Java 프로그래밍 언어, JVM (Java Virtual Machine) 및 언어와 관련된 클래스 라이브러리와 같이 함께 패키지 된 여러 기술입니다. 이 기사에서는 이러한 모든 측면에 대해 설명합니다.
JVM (Java Virtual Machine)

JVM은 대부분의 Java 컴파일러가 코드를 생성하는 가상 CPU입니다. 이 가상 CPU에 대한 지원은 Java 프로그램이 다른 CPU에서 재 컴파일되지 않고 실행될 수 있도록합니다. Java 프로그래밍 언어의 어떤 것도 원시 객체 코드 대신 JVM 용 코드로 컴파일 할 Java 소스 코드를 필요로하지 않습니다.

실제로 Asymetrix와 Microsoft는 네이티브 Microsoft Windows 애플리케이션을 내보내는 Java 컴파일러를 발표했습니다. (추가 정보는이 문서의 리소스 섹션을 참조하십시오.)

J 코드
J 코드는 대부분의 Java 컴파일러에서 클래스 파일로 내보내는 출력입니다. J 코드는 Java 가상 머신의 객체 코드로 생각할 수 있습니다.
휴대 성
이식성은 다른 기계에서 프로그램을 실행하는 능력을 의미합니다. 다른 시스템에서 주어진 프로그램을 실행하려면 다른 작업량이 필요할 수 있습니다 (예 : 전혀 작업하지 않거나, 다시 컴파일하거나 소스 코드를 약간 변경). 사람들이 Java 애플리케이션과 애플릿을 이식성이라고 부르는 것은 일반적으로 애플리케이션과 애플릿이 변경없이 다른 유형의 시스템에서 실행된다는 의미입니다 (예 : 소스 코드 재 컴파일 또는 조정).

이제 몇 가지 필수 용어를 다루었으므로 세 가지 유형의 Java 이식성에 대해 각각 설명하겠습니다.

언어로서의 자바 : 소스 코드 이식성

프로그래밍 언어로서 Java는 가장 간단하고 친숙한 이식성, 즉 소스 코드 이식성을 제공합니다. 주어진 자바 프로그램 기본 CPU, 운영 체제 또는 Java 컴파일러에 관계없이 동일한 결과를 생성합니다. 이 아이디어는 새로운 것이 아닙니다. C 및 C ++와 같은 언어는 수년 동안 이러한 수준의 이식성을위한 기회를 제공해 왔습니다. 그러나 C와 C ++는 이식 불가능한 코드도 만들 수있는 많은 기회를 제공합니다. C 및 C ++로 작성된 프로그램이 처음부터 이식 가능하도록 설계되지 않은 경우 다른 컴퓨터로 이동할 수있는 능력은 실제보다 이론적입니다. C 및 C ++는 원자 데이터 유형의 크기 및 엔디안, 부동 소수점 수학의 동작, 초기화되지 않은 변수의 값 및 해제 된 메모리에 액세스 할 때 동작과 같은 정의되지 않은 세부 정보를 남깁니다.

요컨대 C와 C ++의 구문은 잘 정의되어 있지만 의미는 그렇지 않습니다. 이러한 의미 론적 느슨 함을 통해 C 또는 C ++ 소스 코드의 단일 블록이 다양한 컴파일러 설정에 따라 다른 CPU, 운영 체제, 컴파일러 및 단일 컴파일러 / CPU / OS 조합에서 실행될 때 다른 결과를 제공하는 프로그램으로 컴파일 할 수 있습니다. ( 시맨틱과 구문의 차이점에 대한 논의 는 사이드 바 구문 대 시맨틱 을 참조하십시오 .)

자바는 다릅니다. Java는 훨씬 더 엄격한 의미를 제공하며 구현 자에게 덜 맡깁니다. C 및 C ++와 달리 Java는 정의 된 부동 소수점 동작뿐만 아니라 원자 유형에 대한 크기와 엔디안을 정의했습니다.

또한 Java는 C 및 C ++보다 더 많은 동작을 정의합니다. Java에서 메모리는 더 이상 액세스 할 수 없을 때까지 해제되지 않으며 언어에는 초기화되지 않은 변수가 없습니다. 이러한 모든 기능은 플랫폼에서 플랫폼으로, 구현에서 구현으로 Java 프로그램의 동작 변화를 좁히는 데 도움이됩니다. JVM이 없어도 Java 언어로 작성된 프로그램은 동등한 C 또는 C ++ 프로그램보다 훨씬 더 나은 다른 CPU 및 운영 체제로 포팅 (재 컴파일 후) 할 수 있습니다.

안타깝게도 Java를 이식성있게 만드는 기능에는 단점이 있습니다. Java는 8 비트 바이트 및 IEEE754 부동 소수점 수학이있는 32 비트 시스템을 가정합니다. 8 비트 마이크로 컨트롤러 및 Cray 슈퍼 컴퓨터를 포함하여이 모델에 맞지 않는 기계는 Java를 효율적으로 실행할 수 없습니다. 따라서 Java 언어보다 더 많은 플랫폼에서 C 및 C ++가 사용될 것으로 예상해야합니다. 또한 Java 프로그램이 두 가지를 모두 지원하는 플랫폼간에 C 또는 C ++보다 쉽게 ​​이식 할 수 있습니다.

가상 머신으로서의 Java : CPU 이식성

대부분의 컴파일러는 한 CPU 제품군 (예 : Intel x86 제품군)에서 실행되는 개체 코드를 생성합니다. 여러 다른 CPU 제품군 (예 : x86, MIPS 및 SPARC)에 대한 개체 코드를 생성하는 컴파일러도 한 번에 하나의 CPU 유형에 대한 개체 코드 만 생성합니다. 세 가지 다른 CPU 제품군에 대한 개체 코드가 필요한 경우 소스 코드를 세 번 컴파일해야합니다.

현재 Java 컴파일러는 다릅니다. Java 프로그램이 실행될 각 다른 CPU 제품군에 대한 출력을 생성하는 대신 현재 Java 컴파일러는 아직 존재하지 않는 CPU에 대한 객체 코드 (J 코드라고 함)를 생성합니다.

(Sun J- 코드를 직접 실행할 CPU를 발표했지만, 자바 칩의 첫 샘플은 올해 하반기까지 나오지 않을 것이라고 밝혔습니다. 이러한 칩의 전체 생산은 내년에 시작될 것입니다. Sun Microelectronics의 picoJavaI 핵심 기술 네트워크 컴퓨터를 대상으로하는 썬의 자체 마이크로 자바 프로세서 라인의 핵심이 될 것입니다. LG 세미콘, 도시바, 로크웰 콜린스와 같은 라이센시들도 picoJavaI 코어를 기반으로 한 자바 칩을 생산할 계획입니다.)

Java 프로그램이 실행될 각 실제 CPU에 대해 Java 인터프리터 또는 가상 머신이 J 코드를 "실행"합니다. 이 존재하지 않는 CPU를 사용하면 Java 인터프리터가있는 모든 CPU에서 동일한 개체 코드를 실행할 수 있습니다.

가상 CPU에 대한 출력을 생성하는 것은 Java에서 새로운 것이 아닙니다. UCSD (샌디에이고 캘리포니아 대학교) Pascal 컴파일러는 몇 년 전에 P 코드를 생성했습니다. Lucent Technologies에서 개발중인 새로운 프로그래밍 언어 인 Limbo는 가상 CPU를위한 개체 코드를 생성합니다. Perl은 중간 프로그램 표현을 생성하고 네이티브 실행 코드를 생성하는 대신이 중간 표현을 실행합니다. 인터넷에 정통한 JVM은 안전하고 바이러스가없는 코드를 생성 할 수 있도록 의도적으로 설계되어 다른 가상 CPU 구현과 차별화됩니다. 인터넷 이전에는 프로그램이 안전하고 바이러스가 없음을 증명하기 위해 가상 머신이 필요하지 않았습니다. 이 안전 기능은 가상 CPU에 대한 프로그램을 빠르게 실행하는 방법에 대한 훨씬 더 나은 이해와 결합되어JVM의 광범위한 수용. 오늘날 OS / 2, MacOS, Windows 95 / NT 및 Novell Netware를 포함한 대부분의 주요 운영 체제에는 J 코드 프로그램에 대한 지원이 내장되어 있거나 내장되어있을 것으로 예상됩니다.

본질적으로 가상 CPU 인 JVM은 소스 코드 언어와 무관합니다. Java 언어는 J 코드를 생성 할 수 있습니다. 그러나 Ada95도 마찬가지입니다. 실제로 J 코드 호스팅 인터프리터는 BASIC, Forth, Lisp 및 Scheme을 포함한 여러 언어로 작성되었으며 향후 다른 언어의 구현이 J 코드를 방출 할 것이 거의 확실합니다. 소스 코드가 J 코드로 변환되면 Java 인터프리터는 실행중인 J 코드를 생성 한 프로그래밍 언어를 알 수 없습니다. 결과 : 서로 다른 CPU 간의 이식성.

프로그램 (모든 언어)을 J 코드로 컴파일 할 때의 이점은 동일한 코드가 다른 CPU 제품군에서 실행된다는 것입니다. 단점은 J 코드가 ​​네이티브 코드만큼 빠르게 실행되지 않는다는 것입니다. 대부분의 응용 프로그램에서 이것은 중요하지 않지만 CPU의 마지막 퍼센트를 필요로하는 최고급 프로그램의 경우 J 코드의 성능 비용은 허용되지 않습니다.

가상 OS 및 GUI로서의 Java : OS 이식성

C 또는 C ++로 작성된 대부분의 Microsoft Windows 프로그램은 다시 컴파일 한 후에도 Macintosh 또는 Unix 환경으로 쉽게 이식되지 않습니다. 프로그래머가 C 또는 C ++의 의미 적 약점을 처리하기 위해 특별히주의를 기울이더라도 이식이 어렵습니다. 이 문제는 비 Windows 운영 체제에 대한 포트가 CPU를 변경하지 않고 발생하는 경우에도 발생합니다. 왜 어려움이 있습니까?

C와 C ++의 의미 문제와 CPU 포팅 문제를 제거한 후에도 프로그래머는 여전히 다른 운영 체제와 다른 GUI API 호출을 처리해야합니다.

Windows 프로그램은 Macintosh 및 Unix 프로그램과는 매우 다른 운영 체제 호출을 수행합니다. 이러한 호출은 사소하지 않은 프로그램을 작성하는 데 중요하므로이 이식성 문제가 해결 될 때까지 이식은 여전히 ​​어렵습니다.

자바는 (예를 들면 자바 제공하는 라이브러리에 포함 된 라이브러리 함수의 집합을 제공함으로써이 문제를 해결 awt, utillang) 가상 OS 및 가상 GUI 해당 이야기. JVM이 가상 CPU를 제공하는 것처럼 Java 라이브러리는 가상 OS / GUI를 제공합니다. 모든 Java 구현은이 가상 OS / GUI를 구현하는 라이브러리를 제공합니다. 이러한 라이브러리를 사용하여 필요한 OS 및 GUI 기능 포트를 상당히 쉽게 제공하는 Java 프로그램.

네이티브 OS / GUI 호출 대신 이식성 라이브러리를 사용하는 것은 새로운 아이디어가 아닙니다. Visix Software의 Galaxy 및 Protools Software의 Zinc와 같은 제품은 C 및 C ++에 대해이 기능을 제공합니다. Java가 뒤 따르지 않는 또 다른 접근 방식은 단일 OS / GUI를 마스터로 선택하고 이식하려는 모든 머신에서이 마스터 OS / GUI를 지원하는 래퍼 라이브러리를 제공하는 것입니다. 마스터 OS / GUI 접근 방식의 문제점은 이식 된 응용 프로그램이 다른 컴퓨터에서는 종종 이질적으로 보인다는 것입니다. 예를 들어, 매킨토시 사용자들은 매킨토시 용 마이크로 소프트 워드가 매킨토시 프로그램이 아닌 윈도우즈 프로그램처럼 보이고 동작하기 때문에 최신 버전의 매킨토시 용 워드에 대해 불평했습니다. 불행히도 Java가 취한 접근 방식에도 문제가 있습니다.

Java는 OS / GUI 라이브러리에서 최소 공통 분모 기능을 제공했습니다. 탭 대화 상자와 같이 하나의 OS / GUI에서만 사용할 수있는 기능은 생략되었습니다. 이 접근 방식의 장점은 일반적인 기능을 기본 OS / GUI에 매핑하는 것이 매우 쉽고주의해서 대부분의 OS / GUI에서 예상대로 작동하는 응용 프로그램을 제공 할 수 있다는 것입니다. 단점은 Java 애플리케이션에서 사용할 수없는 기본 모드 애플리케이션에서 사용할 수있는 기능이 있다는 것입니다. 때때로 개발자는 AWT를 확장하여이 문제를 해결할 수 있습니다. 다른 경우에는 그렇지 않습니다. 해결 방법으로 원하는 기능을 얻을 수없는 경우 개발자는 이식 불가능한 코드를 작성하기로 선택할 것입니다.

휴대성에 관심이있는 사람은 누구입니까?

개발자, 최종 사용자 및 MIS 부서의 세 가지 주요 구성원이 이식성을 중요하게 생각합니다.

개발자 : 큰 기회와 위협

개발자는 휴대용 소프트웨어를 만드는 데 관심이 있습니다. 한편, 휴대용 소프트웨어를 사용하면 더 많은 플랫폼을 지원할 수 있으므로 잠재 고객 기반이 더 커집니다. 그러나 개발자가 새로운 시장을 공략 할 수있는 동일한 이식성 덕분에 경쟁 업체도 자신의 시장을 공략 할 수 있습니다.

간단히 말해서, Java 이식성은 애플리케이션 소프트웨어 시장을 다양한 OS 및 GUI를 기반으로하는 분리 된 시장에서 하나의 큰 시장으로 밀어 붙입니다. 예를 들어 현재 소프트웨어 시장에서 마이크로 소프트는 윈도우와 매킨토시 애플리케이션 소프트웨어 시장에서 괄목할만한 세력이지만 OS / 2와 유닉스 시장에서는 거의 존재하지 않습니다. 이러한 분할을 통해 OS / 2 및 Unix 시장의 회사는 Microsoft를 경쟁자로 무시할 수 있습니다. Java를 사용하면 이러한 회사가 Windows 시장에서 더 쉽게 경쟁 할 수있을뿐만 아니라 Microsoft가 OS / 2 및 Unix 시장에 쉽게 진입 할 수 있습니다.

사용자 : 이식성의 간접적 수혜자

사용자는 그 자체로 이식성에 관심이 없습니다. 휴대 성이 그들의 삶을 더 쉽고 즐겁게 만들어 준다면, 그들 모두를위한 것입니다. 그렇지 않다면 그렇지 않습니다. 이식성은 사용자에게 긍정적 인 효과가 있지만 다소 간접적입니다. 긍정적 인 효과 :