왜 Java가 C ++과 같은 다른 언어보다 이식성이 높은 것으로 간주됩니까?


16

Java 개발자를위한 "각 플랫폼에 대한 특정 JRE 작성"과 C ++ 개발자를위한 "각 플랫폼에 대한 C ++ 컴파일러 작성"의 차이점은 무엇입니까?

답변:


33

Java는 언제 어디서나 실행됩니다. C ++은 언제 어디서나 컴파일됩니다.


3
글쎄, 당신은 분명히 GUI 개발에 대한 많은 경험이 없었습니다. (Qt 기다리는 중 ...)

27
C ++가 "어디서나 한 번 컴파일"이라고 주장하는 사람은 C ++ 프로그램을 포팅 할 필요가 없습니다.
BlueRaja-Danny Pflughoeft

7
BlueRaja에 동의합니다. C ++ 프로그램을 이식한다는 것은 컴파일러를 이식하는 것 이상의 의미가 있습니다. C ++은 int의 크기 나 파일 시스템의 구현과 같은 것들이 큰 차이를 만들 수있는 중요한 환경에서 가장 널리 사용됩니다. 포팅은 단순히 재 컴파일을 의미하지는 않습니다.
rahmu

8
@ Pubby8 아니오, 이식성 문제는 엔디안 (자바에서도 고통받을 수 있음), 정렬 및 기본 유형의 크기에 대한 가정과 같이 이식 할 수없는 가정하는 꽤 표준적인 코드 에서 비롯됩니다.
R. Martinho Fernandes

5
한 번 쓰고 어디서나 디버깅하십시오.
bhagyas

25

"각 플랫폼에 대해 특정 JRE를 작성하는 것은"매번 수행하는 것이 아닙니다. JRE를 새 플랫폼으로 이식하는 것은 한 번만 수행하면됩니다. 이 작업은 일반적으로 프로그램 및 / 또는 플랫폼의 핵심 관리자 / 개발자가 수행합니다. 누가 그리고 어떻게 JRE를 포팅 할 것인지 결정할 때 많은 요인들이 작용할 수 있습니다. 무엇보다도, 그것은 아래에 게시 된 라이센스에 달려 있습니다 (Java가 오픈 소스라고 들으니 누구나 할 수 있다고 생각합니다). 재밌는 일화, Steve Jobs는 약 1 년 전에 Mac 에서 Java를 포팅하는 것을 원하지 않는 것에 대해 큰 일을했습니다.

요점은 JRE를 어떻게 또는 누가 포팅하는 것이 아니라 일단 포팅되면 모든 Java 애플리케이션이 이론적으로 새로운 머신에서 쉽게 실행될 수 있다는 사실입니다. 그런 의미에서 JRE는 추상화 계층을 형성하여 시스템을 완전히 숨기고 쉽게 이식 할 수 있습니다.

그러나 현실이 항상 이와 같은 것은 아닙니다. 나는 이식성을 "신화"라고 부르지 않을 것이다. 그러나 그것이 완벽하지 않다는 것은 사실이다. 예를 들어, Java에는 JNIJRE를 우회하여 기본 호출을 보낼 수 있는 패키지가있어 Java 팬이 "한 번만 쓰기"라고 부르는 완벽한 완벽한 이식성을 방지합니다.

주석에서 언급했듯이 C ++의 이식성 접근 방식은 다릅니다. 한편으로는 컴파일 된 언어이며이 바이너리는 거의 항상 플랫폼마다 다릅니다. 따라서 C ++ 실행 파일은 Java와 달리 이식성이 없습니다. 반면에 컴파일러를 이식하는 것으로 충분할 수 있습니다. 커뮤니티는 컴파일러와 언어의 일부 핵심 라이브러리를 이식함으로써 소스 코드 (이진 아님)를 이식 할 수 있음을 발견했습니다.

그러나 C ++는 컴파일러, 커널, 실시간 시스템, 임베디드 시스템 등과 같은 중요한 시스템에서 널리 사용됩니다. 이식성에 대해 이야기 할 때 간과 할 수없는 C ++의 "낮은 수준"측면이 있습니다.


4
이식성은 신화가 아니다. 완벽한 휴대 성입니다.
Malcolm

"자바는 Java가 C ++과 매우 다른 곳인데, 여기서 각 응용 프로그램은"컴퓨터에 따라 다르며 "코드를 수정하지 않고 이식 할 수 없습니다." 그것은 사실이 아니며, 의존성에 달려 있습니다. 표준 라이브러리 및 대상에 이식 가능한 소스가있는 라이브러리 만 사용하는 경우 한 번 코딩하고 각 대상에서 컴파일합니다. C ++에서 코드를 수정하지 않고 이식 할 수있는 코드를 작성하는 경우 빌드 스크립트 만 수정하면됩니다. 모든 경우에 해당되는 것은 아닙니다.
클라 임

C ++가 고급 언어와 저급 언어로 사용될 수 있다는 것을 잊지 마십시오. 32 비트 int가 64 비트 int와 매우 다른 프로그램에서 많은 C ++ 코드가 사용됩니다. 물론 높은 수준은 항상 휴대 가능합니다. 그러나 지금까지 C ++ 일반화에서의
rahmu

나는 당신이 내가 말하는 것을 오해했을 것입니다 : 저수준의 물건을 귀찮게하지 않고 int 또는 모든 표준 유형으로 올바른 C ++을 작성할 수 있습니다. 부스트 라이브러리를 살펴보십시오. 대부분은 고급 코드 일뿐이며 많은 C ++ 오픈 소스 프로젝트에 해당됩니다. 당신은 "낮은 수준"으로 갈 수 있으며, 그렇게하면 플랫폼 특정 API를 사용해야 할 때까지 특정 코드를 피할 수도 있습니다. 그러나 필요하지 않으면 어디에서나 작동하는 C ++을 작성할 수 있습니다. 플랫폼에 대한 종속성을 피할 수 있으며 종종 라이브러리 코드에 있습니다.
Klaim

확실하게하기 위해 : 모든 C ++ 코드가 이식 가능하다고 말하지는 않습니다. "여기서 Java는 C ++과 매우 다르며, 각 응용 프로그램은"기계에 따라 다릅니다 ". 코드를 수정하지 않고 이식 할 수 없거나 코드가 실제로 이식 가능하고 빌드 인 경우 이식 할 수 없습니다. 스크립트는 최소한 하나의 컴파일없이 새 대상을 관리합니다. "
Klaim

14

언어 일뿐 아니라 도서관입니다.

Java와 C ++ 모두 크로스 플랫폼 라이브러리를 제공합니다. Java는보다 풍부한 세트를 제공합니다.


2
Java는 기본적으로 더 풍부한 세트를 제공합니다. C ++에 대해 동일한 라이브러리를 찾을 수 있습니다. 이들은 표준 라이브러리의 일부가 아니므로 사용할 라이브러리를 결정해야합니다 (특히 설치되지 않은 경우 특히 중요하지 않음).
Martin York

Java의 표준 라이브러리를 C ++의 라이브러리 세계와 비교하는 것은 실제로 유효한 비교가 아닙니다. Java는 각각의 표준 라이브러리를 비교하거나 각 라이브러리의 유니버스를 비교할 때 더 풍부한 세트를 제공합니다.
Andy Thomas

3
분명히 동의하지 않습니다. Java 라이브러리의 모든 것을 사용할 수 있으면 일부 라이브러리의 C ++에서 이미 사용할 수 있습니다. Java가 한곳에서 모든 것을 가지고 있지만 더 풍부하다고 말하는 것은 사실이 아닙니다. 아마 당신이 찾고있는 형용사는`더 통합적 '입니다
Martin York

1
+1은 다시 공감합니다. 라이브러리가 이식성에서 가장 큰 요소라고 생각합니다. C / C ++에서 작업하고 순수한 계산 이외의 작업을 수행하는 경우 Windows와 Unix간에 근본적으로 다르고 Unix의 다른 풍미에서 미묘하게 다른 라이브러리 (특히 시스템 라이브러리의 일부)가 있습니다. 그것은 포팅을 어렵게 만듭니다. Java에는 기본적으로 그 문제가 없습니다.
Tom Anderson

1
@ 앤디 토머스 크 래머 : 나는 아무것도 비교하지 않고 있습니다 (당신은 것 같습니다). 나는 당신의 진술이 정확하지 않다고 말하고 있습니다. Java가 가진 장점 중 하나 (그리고 우리 모두가 그것을 좋아하는 것)는 한 곳에서 모든 표준 라이브러리입니다. 그들이 더 부유하다고 말하는 것은 정확하지 않습니다.
Martin York

7

차이점은 Java는 재 컴파일 하지 않고 모든 플랫폼에서 실행된다는 것 입니다. 각 플랫폼마다 C ++ 컴파일러가있는 것은 전혀 다릅니다.


6

"차이는 ..."로 시작하는 모든 대답, 또는 매우 유사한 것은 기본적으로 잘못되었습니다 (죄송하지만 인생은 그런 것입니다). 둘 사이에는 실제로 두 가지 차이점이 있습니다.

하나는 (많은 언급 되었음) 컴파일 된 Java 프로그램은 모든 적합한 Java 구현에서 실행될 수 있거나 최소한 컴파일해야하므로 컴파일 후에도 다시 컴파일하지 않고도 한 플랫폼에서 다른 플랫폼으로 Java 프로그램을 옮길 수 있습니다 . C ++ (적어도 보통)은 각 대상 플랫폼에 대해 다시 컴파일해야합니다.

다른 하나는 Java (적어도 시도)는 올바르게 작성된 모든 Java를 이식 가능하게하는 것입니다. 적어도 이론 상으로는 이식성이없는 코드를 작성할 수 없어야합니다.

C ++을 사용하면 이식성이없는 몇 가지 작업을 수행 할 수 있습니다. C ++ 표준에는 이식성이없는 많은 것들에 대한 "경고"가 포함되어 있습니다 (예 : 구현 정의 동작 또는 정의되지 않은 동작을 얻을 수 있다고 말함). . 예를 들어, PCI 버스를 사용하는 하드웨어 용 운영 체제를 작성하려면 PCI 구성 메모리를 읽거나 써야합니다. 이것은 분명히 PCI 버스가없는 시스템에는 이식성이 없지만 PCI 버스가있는 하드웨어 용 운영 체제를 작성하는 경우에는 거의 필요합니다. C ++은 이식성이 없어도 가능합니다.


C ++은 PCI 버스 나 하드웨어에 대해서는 전혀 모른다.
Nikko

물론 플랫폼 특정 라이브러리에 포함되어야하는 플랫폼 고유의 것은 아닙니다. Java가 필요한 경우 플랫폼 별 라이브러리를 가질 수있는 것처럼.
jwenting

1
@Nikko : 그것은 그것에 대해 아무것도 아무것도 알고 있지만, 그것은 당신이 무엇을 사용할 수 있습니다 당신이 그것에 대해 알고있다.
Jerry Coffin

@jwenting : 차이점은 C ++에서 플랫폼 별 라이브러리를 작성할 있지만 일반적으로 Java로 작성할 수 없다는 것입니다.
Jerry Coffin

6

당신은 구내를 오해했습니다. JVM은 표준 동작을 동일하게 보장하므로 Java 프로그램 은 이식성이 뛰어납니다. C ++ 프로그램은 실제 하드웨어에 비해 환경이 덜 표준화되어 있으므로 int 크기, 단어 정렬 등과 ​​같은 다양한 플랫폼 별 세부 사항을 처리 할 수 ​​있어야합니다.

JVM 자체는 이식성이 떨어집니다. 고성능 JVM을 다른 플랫폼 또는 CPU 아키텍처로 이식하는 것은 어려운 작업입니다.


마지막 문장 +1!
rahmu

2

차이점은 Java (약어가 아님) 프로그램은 JVM이 설치된 모든 컴퓨터에서 실행할 수있는 형태로 배포 될 수 있지만 C ++은 일반적으로 매우 사용자 친화적이지 않은 소스 코드 또는 번들로 배포됩니다 다른 플랫폼에 대한 다른 바이너리의.


응? JVM을 대상으로하는 C ++ 컴파일러와 기본 코드를 대상으로하는 Java 컴파일러가 있습니다. C ++ 프로그램 소스 코드 또는 플랫폼 별 바이너리로 배포 되어야 한다고 말하는 C ++ 언어 사양의 특정 섹션을 인용 할 수 있습니까 ?
Jörg W Mittag

거기에서, 덜 결정적인 언어를 사용하도록 답변을 편집했습니다
Colin

2

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로로드하는 것과 비교하여 추가 명령이 필요합니다. 확장 정밀 레지스터에 직접 연결됩니다).


1
실제로 가치있는 것을 추가하는 오래된 질문에 대한 새로운 답변 : Java에는 매우 정확한 산술 요구 사항이 있으며 물론 기본 데이터 유형에는 C ++에 비해 특정 크기와 의미가 있습니다. 이 날짜 현재까지 다른 대답은 없습니다.

@ Snowman : 선택한 특정 예를 어떻게 좋아합니까? 개인적으로 언어를 디자인하는 (int)경우 첫 번째 예제의 첫 번째 (x+1)하위 표현 float, 두 번째 예제의 x매개 변수 에 대한 캐스트를 좁히지 않고 Java 예제를 반환하지 않았지만 분명히 언어를 디자인하지 않았습니다. .
supercat

나는 그들이 말이된다고 생각합니다. 모든 언어에서 중요한 것은 잘 정의 된 의미를 갖는 것입니다. 주어진 언어 디자인 결정에 동의하는지 여부에 관계없이 중요한 것은 코드를보고 작동 방식을 수 있다는 것입니다 . Java는 일반적으로 정의되지 않은 동작이 거의없는 경우가 있습니다.

1

지원 도구의 작업량은 실제로 비슷하지만 그 차이는 다른 곳에 있습니다. C ++ 프로그램이 플랫폼 용으로 컴파일되면 다른 플랫폼에서 사용하려면 다시 컴파일해야합니다. 그러나 Java 프로그램이 컴파일되면 다시 컴파일하지 않고도 런타임 환경이있는 다른 플랫폼으로 이동할 수 있습니다.


1

"휴대 성, Java 또는 C ++ 중 어느 것이 더 낫다"라는 제목 대신 "이동성은 신화인가?"라는 제목에 대답하면서, 부분적인 휴대 성은 가능하지만 완전한 휴대 성은 신화를 이루는 것이라고 말할 것이다.

필자가 주장해야 할 것은이 질문에 적용되는 것은 개발자가 더 이상 프로그래밍 언어로 작업하는 것이 아니라 전체 프로그래밍 프레임 워크로 작업한다는 것입니다.

이러한 프레임 워크에는 라이브러리, 데이터베이스, 그래픽 인터페이스가 포함됩니다.

어느 프로그래밍 언어 또는 어느 프로그래밍 프레임 워크가 더 이식성이 좋습니까?

글쎄, 그것은 당신의 앱에 달려 있습니다. 달성하려고합니다.


1

문제는 "당신"입니다. JRE를 작성 하지 마십시오. 모든 JRE에서 실행되는 Java 코드를 작성하십시오 . "당신"은 C ++ 코드를 작성 할 수 있습니다 에 의한 변경 요구 또 다른 플랫폼에서 컴파일하기 전에합니다.


0

많은 사람들이 "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 % 이식성이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.