에몽이

gcc, 안드로이드 아키텍쳐 본문

카테고리 없음

gcc, 안드로이드 아키텍쳐

ian_hodge 2017. 3. 25. 17:57

새로운 기술같은거 언어같은 가끔씩 취미로 공부하기

특히 야근같은거 하면서 프리하게 하면 좋음

더나아가서 그룹만들어서 가끔씩 노는것도좋을듯

소스코드 제공하라고하는곳 문제있음..


--------------------------------------------------------------------------------------------------------------------------------------------------------

아키텍쳐 강의


개요

왜 c를 해야하는가?

왜 안드로이드는 c에 의존적인가


gcc란?


c를 왜해야하는가? 

자바의 한계가 있음. 자바는 미리 개발자가 사용할만한것이 많이 포함되어 있는 언어임

그래서 어느 개발을 해도 기본적으로 편하게 사용 할 수 있음

자바는 c++의 영향을 많이 받음. 그래서 c++의 단점을 많이 보안한거임

이 단점은 모든 사용자들이 c수준에서 모든걸 처음부터 만들 수 없다는거임

여기서 처음이라하면 메모리사용이나 cpu사용 관리 부분임

그래서 자바의경우 jvm이 메모리를 관리해줌


c는 기본적으로 메모리가 강한데 그 이유는 메모리를 내 마음대로 짤 수 있기때문임

반면에 자바는 표준컴퓨터같은거임.즉 메모리의 관리 주체가 jvm에 있기떄문에

이 관리를 사용자가 직접 만들 수가 없음(튜닝같은거는 할 수 있긴함,근데 거의 default로 씀)


즉 c는 메모리사용의 강점이 있지만 잘못쓰면 망함.

윈도우 98의경우 mfc라는 c++기반의 윈도우 프로그램 툴임. 그전에 win32인데 그게 c기반임

win32->mfc->.net의 순서임

.net은 자바와 비슷하고, 자바 가상머신같이 메모리를 관리해주는 채제가 있고 이는 c#임

visual basic의경우 asp라고함(asp는 지칭하는게 많음)

요즘에는 C#베이스로 많이 사용됨


.net이나 자바나 비슷한데 왜 부품을 튜닝할수있던 상황에서 튜닝을 못하는 불편함으로 트랜드가 바뀌었을까?

objectC에서도 c와 c++이동작함즉 동일한 메모리구조를 사용하는데 이게 swift로바뀜 근데 swift도 자바처럼 메모리 간접접근방식임.

즉 메모리자율권한이 크다보니, 사용자들이 이를 반납하지 않을경우 메모리 사용관리가 어려움.

그래서 c의경우 메모리를 쓰기전에 생각을 많이 해서해야됨. 


php가대단한이유는

웹 백앤드만 지원하는 단일 플렛폼인데 그럼에도 점유율이 높음.자바의경우 엄처나게 많은 플렛폼을 지원하지만 php는 오직 백앤드임

phthon의 경우 인공지능과 함께 백앤드로 많이 사용됨.ruby같은것도 있긴함.

자바스크립트의 경우 front-end의 경쟁 언어자체가 없음


메모리를 직접 다루지 않는게 추세가되었음

그 이유는? 요즘 시자으이 요구가 달라졌는데, 

자바나 php같은 새로운 언어가 나온지는 오래됐는데 최근 2천년대쯤와서 그 언어들이 유명해진 이유는

시장에서 하나하나 메모리를 다루고 커스텀하던 시장에서 빨리빨리 개발이되는 환경으로 바뀌게됨

그이유는 과거에는 하드웨어 부품의 비용이 높아서 메모리에 민감했음

근데 최근에는 메모리가 늘어나고 가격이 싸지면서 거기에 맞게 메모리에 민감하기보다는 빠르게 개발하는 방식으로 바뀜


그렇다면 그럼에도 불구하고 c를 계속쓰는 이유는?

c의 장점은 빠른 성능임 그이유는 까다롭게 커스텀해서그럼.

근데 문제는 제대로 못쓰면 성능이 저하되는 경우도 있음.

그럼에도불구하고 잘하는 개발자들이 c베이스로 최적화를 잘한 라이브러리가 많음

opengl이나 openssl과같은것들이 이런 c베이스의 오픈소스프로젝트임

그리고 iot나 아두이노,라즈베리파이같은 소형하드웨어들이 존재함

또 아직도 성능이 중요한 프로그램이 많음

예를 들면 암호화프로그램같은경우, 작은차이가 엄청나게 큰걸만듬.

그래서 암/복호화에서 c를 사용함.동영상 인코딩같은경우도 그럼


근데 그러다보니 에러확률이 굉장히 많음. 그리고 메모리에 직접접근하기때문에 위험하기도함


안드로이드의 경우 ffmpeg나 opengl도 사용됨. 

그래서 안드로이드 환경에서 맞게 빌드될 수 있는 c 환경이 필요함

이게바로 ndk임

ndk는 네가지정도 모드의 빌드를해야됨. c를 java로 사용할 수 있도록 포팅하는 과정임

1.c가 기본적으로 동작하는 단점이 있음

그건 바로 운영체제와 환경에 종속적인가 아닌가의 문제임

php는 어디서든 다 사용가능함. 근데 c는 그 환경에 맞게 빌드해줘야함

물론 이렇게하기떄문에 언어 자체가 가볍고, 준비기능이 없음

즉 자바로 만든 프로그램은 해당 컴퓨터에 자바가 깔려있어야되지만

c의경우 exe파일만 있으면 따로 설치해야되는게 없이 바로 실행이됨


gcc의 경우 컴파일러모음임

아키텍쳐의 종류가 여러개있음. 여기서 지원가능한게 여러개있는데

그중유명한게 arm이나 IA-32/64(인텔), mips등이 있음

32비트와 64비트 차이는 연산차이인데 비트가 늘어난다는건 자리수가 늘어나서 연산의 폭(한번에 처리할 수 있는)이 늘어남

각 아키텍쳐들은 2진수를 어떻게 처리할것인가에 대한 차이들임

arm은 모바일에서 1위이고, 인텔은 pc에서 다름

arm의 경우, 속도는 인텔이 빠르지만, 저전력과 오래가는 대비는 arm이 더빠름.  intel은 전력소모가 굉장히 큼

즉 arm의경우 저전력에 가능함. 스냅드래곤이 arm임.

arm은 설계를 가지고 있는 곳이자 설계를 파는 회사임 그래서 스냅드래곤같은곳이 arm설계를 사용하는거고 엑시노스등이 있음

mips의 경우 엄청나게 저가임.

그래서 샤오미나 화웨이의경우 키린이라는 mips형태를 사용함.

이렇게까지 공식적으로 지원하는건 4개임


gcc는 컴파일러모음인데, 1987년도에 언어들이 엄청나게 많은데 각각 컴파일러가 따로있으면 엄청불편함

그래서 이를 한곳에 모아두자는 의도가 생겼음. 이떄는 인터넷이 너무느리거나 없어서 컴파일러를 다 따로따로 가지고다니거나

얻기가 힘들었음

안드로이드의 경우 다양한 언어들에 대한 지원욕구가 있을것이라는 예상을 하였고 그래서 gcc를 탑재해둠

아이폰도 마찬가지임. 아이폰은 gcc가 모든 빌드의 자체이고 안드로이드는 jvm도 같이사용함. 

그래서 c를 사용하려면 jni를 작성해서 이를 자바와 연결해줘야함



Comments