Android가 Java를 사용하는 이유는 무엇입니까? [닫은]


114

좋습니다. Google의 누군가에게이 질문을해야하지만 다른 의견을 원합니다.

Android에서도 네이티브 코드 애플리케이션을 지원하지만 주요 개발 도구는 Java입니다. 그런데 왜? 모바일 장치에서 코드를 해석하는 것이 너무 느리지 않습니까? Froyo를 소개 할 때 Google은 새로운 JIT 컴파일러가 2 ~ 5 배 빠른 애플리케이션을 구현할 수 있다고 말했습니다. 즉, 네이티브 코드를 통해 Java를 사용하면 2 배 더 느립니다.

예, 가상 머신이 프로그램을 더 잘 제어 할 수 있기 때문에 관리 코드 응용 프로그램을 사용하는 것이 시스템 안정성 측면에서 더 안전하다는 것을 알고 있지만 여전히이 성능 저하가 엄청나고이를 사용해야하는 이유를 알 수 없습니다.


12
자바 코드는 적어도 Android에서는 해석되지 않고 가상 머신에서 컴파일되고 실행됩니다.
Radomir Dopieralski

4
Sun이 Java가 네이티브 코드만큼 빠를 수 있다는 것을 증명했다고 생각했습니다 (몇 가지 영역에서하지만 거의 거의). 또한 Google 직원은 스마트 팩입니다. 최근에 소개 한 JIT가 조만간 아주 좋은 코드를 생성 할 것이라고 확신합니다.

1
@ b-gen-jack-o-neill VM은 런타임에 실행되는 코드와 실행 방법을 알 수 있기 때문에 실제로 아니요입니다. 예를 들어, Apple은 런타임에 성능이 중요한 그래픽 기능을 최적화하기 위해 OS X에서 LLVM을 사용합니다. 이것은 네이티브 코드 기술보다 빠르기 때문에 특별히 수행됩니다.
PeterAllenWebb 2010 년

1
@ b-gen-jack-o-neill, Java 바이트 코드는 런타임에 네이티브 코드로 컴파일 될 수 있습니다.
Mike Daniels

1
@ b-gen-jack-o-neill-VM은 일반적인 컴파일러보다 실행 환경에 대한 더 많은 정보에 액세스 할 수 있으므로보다 지능적인 선택을 할 수 있습니다. 이것이 어느 정도까지 상쇄되는 추가 오버 헤드는 앱마다 다를 것입니다.
CurtainDog

답변:


98

몇 가지 사항 :

  1. Java는 알려진 언어이며 개발자는이를 알고 있으므로 배울 필요가 없습니다.

  2. 포인터 산술이 없기 때문에 C / C ++ 코드보다 Java로 자신을 촬영하는 것이 더 어렵습니다.

  3. VM에서 실행되므로 모든 전화기에 대해 다시 컴파일 할 필요가 없으며 보안이 쉽습니다.

  4. 많은 수의 Java 용 개발 도구 (포인트 1 참조)

  5. 여러 휴대폰에서 이미 Java ME를 사용했기 때문에 Java는 업계에서 널리 알려졌습니다.

  6. 속도 차이는 대부분의 애플리케이션에서 문제가되지 않습니다. 저수준 언어로 코딩해야한다면


5
VM에서 실행 (다시 컴파일하지 않음)은 큰 장점입니다. 또한 프로세스를 서로 쉽게 분리하여 악성 응용 프로그램이 휴대폰을 파괴하거나 다른 응용 프로그램을 방해하지 못하도록 방지합니다.
Falmarri

1
불량 응용 프로그램에 대해-이것은 흥미롭게 들립니다. 내가 틀렸다면 정정하십시오.하지만 x86 CPU는 페이징 및 링 모드를 통해 보호 기능이 이중이므로 응용 프로그램이 메모리에서 페이지를 변경할 수 없으므로 OS API를 사용하는 것 이외의 다른 앱을 방해 할 수 없습니다. 하지만이 기능에 ARM CPU가 있습니까? 나는 실제로 전혀 모른다. 그렇지 않다면,이 플랫폼에서 Java를위한 훌륭한 +가 될 것입니다.
B.Gen. Jack.O.Neill 2010 년

CPU는 악성 응용 프로그램이 사악한 일을과 아무 상관이 없다
Falmarri

4
메모리 보호는 일부 CPU 아키텍처의 일부입니다. 악성 애플리케이션이 다른 애플리케이션에 할당 된 메모리에 액세스하는 것을 방지합니다. en.wikipedia.org/wiki/Memory_protection
josefx

1
@Falmarri : 네, 그렇습니다. 기본적으로 매우 간단합니다. 앱이 자체 주소 공간을 할당했습니다. 액세스하려는 모든 주소는 MMU에 의해 번역됩니다. 주소 0x0000에 액세스하려고하면 MMU가이를 0x0E21로 변환합니다. 그리고 기본 주소를 변경하는 것을 방지하기 위해 OS에서 시작할 때 권한이 부여 된 명령 및 프로그램이 최저 권한 수준을 할당했습니다. 그렇지 않은 경우 단일 CLI (인터럽트 비활성화) 명령이 시스템을 중단
시킵니다

39

바이트 코드 수준에서 Android는 Java를 사용하지 않습니다. 소스는 Java이지만 JVM을 사용하지 않습니다.


7
예. Java는 소스이지만 Java 가상 머신 호환 바이트 코드로 컴파일되지 않았습니다. 이것이 그들이 아마도 썬 / 오라클과의 특허 분쟁의 대부분 / 전부일 것입니다. 그들은 언어의 구문만을 사용하고 있습니다.
John Gardner

1
여전히 대부분의 Java VM 기능을 지원해야합니다. 그래서 그들은 그것들을 최적화 할 수 없습니다.
josefx 2010 년

1
그렇다면 Android에서 개발할 때 JDK를 설치해야하는 이유는 무엇입니까? 에뮬레이터 전용입니까?
jiggunjer

@jiggunjer Android Studio는 사실 Java로 개발되었습니다. 에뮬레이터도 마찬가지입니다.
Rudra B. Saraswat

20

시스템 안정성 향상은 휴대폰과 같은 장치에서 매우 중요 합니다.

보안 은 더욱 중요합니다. Android 환경을 통해 사용자는 탁월한 보안없이 진정으로 불쾌한 방식으로 휴대폰을 악용 할 수있는 반 신뢰성 앱을 실행할 수 있습니다. 가상 머신에서 모든 앱을 실행하면 VM 구현에 결함이없는 한 앱이 OS 커널을 악용 할 수 없음을 보장합니다. 결과적으로 VM 구현은 크기가 작고 잘 정의 된 보안 표면을 가지고 있습니다.

아마도 가장 중요한 것은 프로그램을 가상 머신 용 코드로 컴파일 할 때 새 하드웨어 용으로 다시 컴파일 할 필요가 없다는 것입니다. 전화 칩 시장은 다양하고 빠르게 변화하고 있으므로 큰 문제입니다.

또한 Java를 사용하면 사람들이 작성한 앱이 스스로 악용 될 가능성이 줄어 듭니다. 버퍼 오버런, 포인터 실수 등이 없습니다.


David의 또 다른 대답은 안드로이드가 jvm을 사용하지 않는다고 말합니다
Ssenyonjo

13

원시 코드가 반드시 Java 코드보다 빠르지는 않습니다. 네이티브 코드가 더 빨리 실행될 수 있음을 보여주는 프로필 데이터는 어디에 있습니까?

왜 자바인가?

  • Android는 다양한 하드웨어 플랫폼에서 실행됩니다. 실제 이점을 확인하려면 이러한 다양한 플랫폼 각각에 대해 네이티브 코드를 컴파일하고 최적화해야합니다.

  • 이미 Java에 능숙한 개발자가 많이 있습니다.

  • Java는 개발자의 삶을 편하게 해주는 많은 라이브러리와 도구를 통해 엄청난 오픈 소스 지원을 제공합니다.

  • Java는 메모리 누수, 잘못된 포인터 사용 등과 같은 네이티브 코드에 내재 된 많은 문제로부터 사용자를 보호합니다.

  • Java를 사용하면 샌드 박스 애플리케이션을 만들 수 있고 하나의 나쁜 앱이 전체 OS를 무너 뜨리지 않도록 더 나은 보안 모델을 만들 수 있습니다.


7

우선 구글에 따르면 안드로이드는 자바를 사용하지 않는다. 이것이 오라클이 구글을 고소하는 이유입니다. 오라클은 Android가 일부 Java 기술을 침해한다고 주장하지만 Google은 Dalvik이라고 말합니다.

둘째, 1995 년 이후로 Java 바이트 코드 인터프리터를 본 적이 없습니다.

실제 벤치 마크를 통해 성능 추측을 뒷받침 할 수 있습니까? 귀하가 제공하는 부정확 한 배경 정보를 감안할 때 귀하의 추정 범위가 정당화되지 않은 것 같습니다.


4

자바는 안드로이드에서 구글을 사용하는 것에 대해 꽤 설득력있는 주장을 가지고있다. 그것은 개발자의 거대한 기반을 가지고있다. 이 모든 개발자는 모바일 플랫폼 용으로 개발할 준비가되어 있습니다.

기술적으로 말하면 Android는 순수 Java를 사용하지 않습니다 .


2
모바일 개발에 관심이있는 모든 사람들은 자바보다 "더 멋진"언어에도 관심이 있다고 생각합니다.
Earlz

4

다른 곳에서 언급했듯이 주요 문제는 Android가 다양한 하드웨어에서 실행되도록 휴대용 OS로 설계되었다는 것입니다. 또한 기존의 많은 모바일 개발자에게 익숙한 프레임 워크와 언어를 기반으로합니다.

마지막으로, 나는 그것이 미래에 대한 내기라고 말하고 싶습니다. 어떤 성능 문제가 존재하든 하드웨어가 향상됨에 따라 무의미해질 것입니다. 개발자는 POSIX / Unix API로 코딩했습니다.

대부분의 애플리케이션에서 네이티브보다 VM 기반 언어를 사용하는 오버 헤드는 크지 않습니다 (Twitter와 같은 웹 서비스를 사용하는 앱의 병목은 대부분 네트워킹입니다). Palm WebOS는 또한 이것을 보여줍니다. 자바 대신 자바 스크립트를 메인 언어로 사용합니다.

거의 모든 VM JIT가 네이티브 코드로 컴파일된다는 점을 감안할 때 원시 코드 속도는 종종 네이티브 속도와 비슷합니다. 높은 수준의 언어로 인한 많은 지연은 다른 요소 (복잡한 개체 런타임, 경계 검사를 수행하여 메모리 액세스를 '안전성'검사하는 등)보다 VM 오버 헤드와 관련이 적습니다.

또한 응용 프로그램을 작성하는 데 사용되는 언어에 관계없이 많은 실제 작업이 하위 수준 API에서 수행된다는 점을 기억하십시오. 최상위 언어는 종종 API 호출을 함께 연결하는 것입니다.

물론이 규칙에는 전화 하드웨어의 한계를 뛰어 넘는 게임, 오디오 및 그래픽 앱과 같은 많은 예외가 있습니다. iOS에서도 개발자는 이러한 영역에서 속도를 높이기 위해 종종 C / C ++를 사용합니다.


1

새로운 JIT는 이전 dalvikVM (둘 다 JAVA)보다 2 ~ 5 배 빠르게 애플리케이션을 실행합니다. 따라서 비교는 JAVA를 통한 C가 아니라 dalvikVM을 통한 JIT입니다.


1

우선 Windows 모바일 또는 iPhone과 거의 동일합니다. .net 프레임 워크에는 자체 VM과 코코아가 필요합니다.

그리고 성능이 최고가 아니더라도 바이트 코드의 해석이기 때문에 안드로이드는 전체 자바 커뮤니티를 잠재적 인 개발자로 제공합니다. 더 많은 응용 프로그램, 더 많은 클라이언트 등

끝내기 위해 성능이 그렇게 나쁘지는 않습니다. 그래서 자바는 더 작은 장치에서도 사용됩니다 (JavaMe 참조).


Cocoa는 VM 기반이 아닙니다. 모두 컴파일 된 네이티브 코드입니다.하지만 순수 C / C ++와 달리 자체 성능 문제와 최적화가있는 동적 런타임 (Smalltalk / Ruby / Python과 유사)이 있습니다. 대부분의 iPhone 게임은 Obj-C가 아닌 C ++입니다.
JulesLt 2010 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.