답변:
Java는 언제 어디서나 실행됩니다. C ++은 언제 어디서나 컴파일됩니다.
"각 플랫폼에 대해 특정 JRE를 작성하는 것은"매번 수행하는 것이 아닙니다. JRE를 새 플랫폼으로 이식하는 것은 한 번만 수행하면됩니다. 이 작업은 일반적으로 프로그램 및 / 또는 플랫폼의 핵심 관리자 / 개발자가 수행합니다. 누가 그리고 어떻게 JRE를 포팅 할 것인지 결정할 때 많은 요인들이 작용할 수 있습니다. 무엇보다도, 그것은 아래에 게시 된 라이센스에 달려 있습니다 (Java가 오픈 소스라고 들으니 누구나 할 수 있다고 생각합니다). 재밌는 일화, Steve Jobs는 약 1 년 전에 Mac 에서 Java를 포팅하는 것을 원하지 않는 것에 대해 큰 일을했습니다.
요점은 JRE를 어떻게 또는 누가 포팅하는 것이 아니라 일단 포팅되면 모든 Java 애플리케이션이 이론적으로 새로운 머신에서 쉽게 실행될 수 있다는 사실입니다. 그런 의미에서 JRE는 추상화 계층을 형성하여 시스템을 완전히 숨기고 쉽게 이식 할 수 있습니다.
그러나 현실이 항상 이와 같은 것은 아닙니다. 나는 이식성을 "신화"라고 부르지 않을 것이다. 그러나 그것이 완벽하지 않다는 것은 사실이다. 예를 들어, Java에는 JNI
JRE를 우회하여 기본 호출을 보낼 수 있는 패키지가있어 Java 팬이 "한 번만 쓰기"라고 부르는 완벽한 완벽한 이식성을 방지합니다.
주석에서 언급했듯이 C ++의 이식성 접근 방식은 다릅니다. 한편으로는 컴파일 된 언어이며이 바이너리는 거의 항상 플랫폼마다 다릅니다. 따라서 C ++ 실행 파일은 Java와 달리 이식성이 없습니다. 반면에 컴파일러를 이식하는 것으로 충분할 수 있습니다. 커뮤니티는 컴파일러와 언어의 일부 핵심 라이브러리를 이식함으로써 소스 코드 (이진 아님)를 이식 할 수 있음을 발견했습니다.
그러나 C ++는 컴파일러, 커널, 실시간 시스템, 임베디드 시스템 등과 같은 중요한 시스템에서 널리 사용됩니다. 이식성에 대해 이야기 할 때 간과 할 수없는 C ++의 "낮은 수준"측면이 있습니다.
언어 일뿐 아니라 도서관입니다.
Java와 C ++ 모두 크로스 플랫폼 라이브러리를 제공합니다. Java는보다 풍부한 세트를 제공합니다.
"차이는 ..."로 시작하는 모든 대답, 또는 매우 유사한 것은 기본적으로 잘못되었습니다 (죄송하지만 인생은 그런 것입니다). 둘 사이에는 실제로 두 가지 차이점이 있습니다.
하나는 (많은 언급 되었음) 컴파일 된 Java 프로그램은 모든 적합한 Java 구현에서 실행될 수 있거나 최소한 컴파일해야하므로 컴파일 후에도 다시 컴파일하지 않고도 한 플랫폼에서 다른 플랫폼으로 Java 프로그램을 옮길 수 있습니다 . C ++ (적어도 보통)은 각 대상 플랫폼에 대해 다시 컴파일해야합니다.
다른 하나는 Java (적어도 시도)는 올바르게 작성된 모든 Java를 이식 가능하게하는 것입니다. 적어도 이론 상으로는 이식성이없는 코드를 작성할 수 없어야합니다.
C ++을 사용하면 이식성이없는 몇 가지 작업을 수행 할 수 있습니다. C ++ 표준에는 이식성이없는 많은 것들에 대한 "경고"가 포함되어 있습니다 (예 : 구현 정의 동작 또는 정의되지 않은 동작을 얻을 수 있다고 말함). . 예를 들어, PCI 버스를 사용하는 하드웨어 용 운영 체제를 작성하려면 PCI 구성 메모리를 읽거나 써야합니다. 이것은 분명히 PCI 버스가없는 시스템에는 이식성이 없지만 PCI 버스가있는 하드웨어 용 운영 체제를 작성하는 경우에는 거의 필요합니다. C ++은 이식성이 없어도 가능합니다.
당신은 구내를 오해했습니다. JVM은 표준 동작을 동일하게 보장하므로 Java 프로그램 은 이식성이 뛰어납니다. C ++ 프로그램은 실제 하드웨어에 비해 환경이 덜 표준화되어 있으므로 int 크기, 단어 정렬 등과 같은 다양한 플랫폼 별 세부 사항을 처리 할 수 있어야합니다.
JVM 자체는 이식성이 떨어집니다. 고성능 JVM을 다른 플랫폼 또는 CPU 아키텍처로 이식하는 것은 어려운 작업입니다.
차이점은 Java (약어가 아님) 프로그램은 JVM이 설치된 모든 컴퓨터에서 실행할 수있는 형태로 배포 될 수 있지만 C ++은 일반적으로 매우 사용자 친화적이지 않은 소스 코드 또는 번들로 배포됩니다 다른 플랫폼에 대한 다른 바이너리의.
Java가 이식 가능한 것으로 간주되는 이유 중 하나는 산술 표현식을 평가하는 방법에 대한 특정 규칙을 가지고 있으며 구현이 다른 방식으로 평가하는 것을 금지합니다. 필수 방식으로 평가할 때 더 정확한 코드를 평가하는 것보다 느린 코드가 필요할 경우에도 패션.
예를 들어, 주어진
long thing1(int x) {
return (x+1)-1L;
}
double thing2(int x, float y) {
return x/y;
}
의 값 thing1(2147483647)
과는 thing2(1123456700,11234567.0f)
-2147483649L 및 99.9999923706054688,이 요구되는 각각 산술적으로 올바른 값은 2147483647L 100.0, 그리고 것에도 불구하고 심지어 일부 플랫폼 코드에 비록 수치-잘못된 결과가 느린 코드가 올바른을 생성하는 것보다 것 생성하는 결과 (일부 64 비트 플랫폼의 경우 (x + 1) 이후 래핑 동작을 강제 실행하려면 추가 명령이 필요하고 8x87 플랫폼에서는 1123456700의 값을 반올림하여 강제 float
로로드하는 것과 비교하여 추가 명령이 필요합니다. 확장 정밀 레지스터에 직접 연결됩니다).
(int)
경우 첫 번째 예제의 첫 번째 (x+1)
하위 표현 float
, 두 번째 예제의 x
매개 변수 에 대한 캐스트를 좁히지 않고 Java 예제를 반환하지 않았지만 분명히 언어를 디자인하지 않았습니다. .
지원 도구의 작업량은 실제로 비슷하지만 그 차이는 다른 곳에 있습니다. C ++ 프로그램이 플랫폼 용으로 컴파일되면 다른 플랫폼에서 사용하려면 다시 컴파일해야합니다. 그러나 Java 프로그램이 컴파일되면 다시 컴파일하지 않고도 런타임 환경이있는 다른 플랫폼으로 이동할 수 있습니다.
"휴대 성, Java 또는 C ++ 중 어느 것이 더 낫다"라는 제목 대신 "이동성은 신화인가?"라는 제목에 대답하면서, 부분적인 휴대 성은 가능하지만 완전한 휴대 성은 신화를 이루는 것이라고 말할 것이다.
필자가 주장해야 할 것은이 질문에 적용되는 것은 개발자가 더 이상 프로그래밍 언어로 작업하는 것이 아니라 전체 프로그래밍 프레임 워크로 작업한다는 것입니다.
이러한 프레임 워크에는 라이브러리, 데이터베이스, 그래픽 인터페이스가 포함됩니다.
어느 프로그래밍 언어 또는 어느 프로그래밍 프레임 워크가 더 이식성이 좋습니까?
글쎄, 그것은 당신의 앱에 달려 있습니다. 달성하려고합니다.
많은 사람들이 "100 % 이식성"이라고 말하거나 이와 같은 문구를 말할 때 Java의 현실을 잊거나 고려하지 않습니다.
거의 모든 주요 회사 / 소프트웨어 회사는 최근에 JRE와 관련하여 최소한 1 개의 집에서 만든 Java 구현을 보유했으며 일부는 여전히이를 유지하고 있습니다. 예를 들어 Microsoft, IBM 및 Apple은 모두 자체 Java 버전을 반영했습니다. 산업과 언어가 어디로 가야하는지에 대한 자신의 아이디어와 생각.
"휴대용"은 어떻습니까? 어디서나 JRE를 사용하십시오.
그리고 이것은 Sun / Oracle이하고있는 일을 고려하지 않고 있습니다.
이식성과 관련하여 Java 코드가 실제로 C 및 C ++에서 멀지 않은 이유에 대한 예는 GUI 및 그래픽 서버이며, Apple은 자체 JRE에 대한 GUI 프레임 워크의 비표준 구현을 가지고있었습니다. Apple 기계 용 Java를 사용하여 GUI를 작성 / 이동하고자하는 사람에게는 두통과 이중 작업이 필요하며 기본적으로 Quartz를 처리해야했습니다 ( "leverage"및 고급 언어의 관점에서 어떻습니까?).
때로는 가장 일반적으로 사용되는 단어조차도 사람들이 일반적으로 제공하는 의미를 실제로 반영하지 않는 경우가 있습니다. Java 세계에서 "이동성"이라는 용어는 상식적으로 "전망"과 비슷합니다. 상업적이고 재정적 인 측면 에서, 당신이 이미 많은 일을했기 때문에 다른 언어보다는 (적어도 자바가 태어 났을 때) 자바를 채택한다면 더 나은 전망 이 있습니다. 즉, "컴퓨터"로 간주 될 수 있으며 코드베이스는 이식성이 좋을 것입니다. 프로그램을 이식하는 데 필요한 리소스가 더 적습니다. 즉, 리소스가 돈이든, 시간이든 인력이든 상관없이 더 낮습니다. 다른 기술과 비교하여 임계 값이며 Java가 그 임계 값을 낮추고 있습니다.
물론 가비지 콜렉션이있는 가상 머신을 의미하는 Java의 구내를 허용하는 경우에 해당됩니다. 즉, CPU 또는 서버 팜에서 최대한으로 압축하려는 경우 자국어와 비교할 때 더 많은 자원을 소비합니다. 리소스가 부족하거나 회사 규모가 작은 경우가 아니라면 Java를 채택 할 수 있다고 생각하지 마십시오.
나는 여전히 각 코드 또는 기능에 대해 단 하나의 버전 (플랫폼 특정 항목이 없음)을 포함하는 사소한 단일 Java 응용 프로그램을 찾아야하며 모든 주요 JRE 중 100 % 이식성이 있습니다.