카테고리 없음

초등학생 텍스트코딩 배우기 일대일로 배워서 빠르게 흡수합니다

서라쌤 교육 2023. 11. 20. 16:28

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

자바는 탄생 후 수십 년이 지난 지금까지 여전히 기업 소프트웨어 개발의 주축이며, 전반적인 개발의 대표 주자이기도 하다. 아파치 소프트웨어 재단 프로젝트의 대다수를 포함해서 가장 중요한 기업 소프트웨어 프로젝트의 상당수가 자바로 작성됐으며, 엔터프라이즈급 요구 사항이 있는 새로운 프로젝트를 개발할 때 여전히 유력한 언어다.

자바 구문은 C와 C++에서 상당 부분을 차용했다. 그러나 C와 달리 자바는 기본적으로 네이티브 코드로 컴파일되지 않는다. 대신 자바 런타임 환경, JVM, JIT(Just-In-Time)가 대상 환경에서 실행되도록 자바 코드를 컴파일한다. 적절한 조건 하에서 JIT로 컴파일된 자바 코드는 C의 성능에 근접하거나 넘어서기도 한다.

또한 “한 번 작성해서 모든 곳에서 실행한다”는 자바의 기본 원칙 덕분에 자바 프로그램은 비교적 적은 조정을 거쳐 다양한 대상 아키텍처에서 실행할 수 있다. C는 상당히 많은 아키텍처로 이식되긴 했지만 C 프로그램을 예를 들어 리눅스에서 윈도우로 가져와서 적절히 실행하려면 이런저런 맞춤 작업이 필요한 경우가 많다.
러스트는 시스템 수준의 빠른 소프트웨어를 제작하기 위한 언어이다. 이 2분짜리 영상을 보면 러스트가 어떻게 메모리나 매니지먼트와 같은 까다로운 프로그래밍 이슈를 우회하는지 잘 설명돼 있다.

러스트는 빠르고, 안전하며, 무엇보다 합리적인 수준의 프로그래밍 난이도를 보장한다. 러스트는 또한 널리 사용되도록 설계되어 있으며 승자 독식의 프로그래밍 언어 경쟁에서 '참가에 의의를 두는' 낙오된 언어가 되지 않도록 신경 썼다. 

안전을 속도, 개발 역량 등과 동등한 위치에 두어야 하는 이유는 많다. 실제로 우리 주변에는 안전을 최우선으로 여기지 않는 언어를 사용하여 제작된 소프트웨어들이 무척 많으며 심지어 그 중 일부는 중요 인프라스트럭처를 구성하고 있기도 하다.

러스트가 갖는 프로그래밍 상의 이점
러스트는 파이어폭스 브라우저의 주요 구성요소를 부분적으로 재확보하기 위한 모질라 연구 프로젝트로 시작됐다. 이러한 결정을 내리기 까지는 몇 가지 주된 이유가 있었다. 첫째로 파이어폭스가 현대식 멀티코어 프로세서를 더 잘 사용할 수 있도록 해야 했으며, 둘째로 웹 브라우저의 보편성은 그만큼 브라우저가 안전해야 함을 의미하기 때문이었다.
이러한 장점들은 브라우저뿐만 아니라 초등학생코딩수업 모든 소프트웨어에 필요하기 때문에 브라우저 프로젝트로 시작한 러스트는 프로그래밍 언어 프로젝트로 진화했다. 텍스트코딩 러스트는 다음과 같은 특성을 통해 안전, 속도 및 사용 편의성을 달성했다.
러스트는 빠르다 초등학생코딩입문 러스트 코드는 여러 플랫폼에 걸쳐 기본 시스템 코드로 컴파일된다. 바이너리는 자체 포함되며 런타임이 없고, 생성된 초등학생코딩기초 코드는 C 또는 C++로 작성된 코드와 함께 기능한다.
러스트는 안전하다
러스트는 안전하지 않은 메모리 사용을 시도하는 초등학생코딩시작 프로그램을 컴파일링 하지 않는다. 대부분의 메모리 오류는 프로그램이 실행 중일 때 발견된다. 러스트의 구문과 언어 초등학생기초코딩 은유는 다른 언어에서 흔히 나타나는 메모리 관련 문제(null 또는 댕글링 포인터, 데이터 레이스 등)가 절대 생산까지 영향을 초등학생재밌는코딩  미치지 않도록 않도록 보장한다. 컴파일러는 이러한 이슈에 플래그를 지정하고 프로그램이 실행되기 전에 수정하도록 초등학생화상코딩 강제한다.
초등학생일대일코딩 러스트는 간접 비용이 적게 발생시킨다
러스트는 엄격한 규칙을 통해 메모리 관리를 통제한다. 러스트의 메모리 관리 시스템은 '소유'라고 불리는 메타포를 통해 언어 구문으로 표현된다. 러스트 언어에서 주어진 가치는 한 번에 하나의 변수에 의해서만 ‘소유’되거나 유지, 조작될 수 있다.
객체 간에 소유권이 이전되는 방법은 컴파일러에 의해 엄격히 관리되므로, 런타임에 메모리 할당 오류와 같은 돌발 상황이 발생하지 않는다. 이런 식의 접근은 또한 Go나 C#와 같은 언어에서처럼 부산물 수집(garbage-collected) 메모리 관리가 없다는 것을 의미한다. (이 역시 러스트의 퍼포먼스를 강화하는 요소가 된다.) 러스트 프로그램의 모든 메모리는 소유권 메타포를 통해 추적되고 자동으로 방출된다.
러스트는 융통성이 있다
러스트는 필요하다면 어느 정도의 위험도 감수할 수 있도록 되어 있다. 러스트의 안전 장치는 C/C++의 ‘raw pointer’와 같이 메모리를 직접적으로 조작해야 하는 경우 부분적으로 비활성화 시키는 것이 가능하다. 

여기서 중요한 것은 '부분적으로' 라는 것인데, 러스트의 메모리 안전 오퍼레이션은 절대로 완전히 비활성화 될 수는 없기 때문이다. 그리고 안전 오퍼레이션을 부분적으로 비활성화 한다고 해도 일반적인 사용 사례에서는 '안전벨트'를 풀을 필요가 거의 없으므로, 결과적으로는 안전의 기본 값이 훨씬 높은 소프트웨어가 탄생하게 된다.

러스트는 사용하기 쉽다
이처럼 러스트는 장점이 많은 언어이지만, 쉽게 사용할 수 없다면 그런 장점들은 무용지물이 되고 만다. 때문에 러스트 개발자들과 커뮤니티는 러스트를 초보자들에게도 최대한 쉽고 유용하게 만들기 위해 노력해 왔다. 

러스트 바이너리를 생산하는 데 필요한 모든 것은 같은 패키지에 담겨 있다. GCC와 같은 외부 컴파일러는 러스트 생태계(소스로부터 컴파일하는 C 라이브러리 등) 밖에서 다른 구성요소를 컴파일하는 경우에만 필요하다. 마이크로소프트 윈도우 사용자들 역시 이등 시민 취급을 받지 않아도 된다. 러스트 툴 체인은 윈도우에서도 리눅스 및 맥OS에서와 같은 기능을 한다.
이식성과 강력한 성능의 조합, 그리고 방대한 소프트웨어 라이브러리 및 프레임워크 생태계 덕분에 자바는 기업 애플리케이션 빌드에서 가장 선호되는 언어이자 런타임이다.
자바가 C에 비해 떨어지는 부분은 기계와 근접한 위치에서 실행되거나 하드웨어를 직접 다루는 경우인데, 이는 애초에 의도된 자바의 주력 분야가 아니다. C 코드는 기계 코드로 컴파일되어 프로세스에 의해 직접 실행된다. 자바는 중간 코드인 바이트코드로 컴파일되며 JVM 인터프리터가 이 바이트코드를 기계 코드로 변환한다. 또한 자바의 자동 메모리 관리는 대부분의 환경에서 유용하지만 제한된 메모리 리소스를 최적으로 사용해야 하는 프로그램에는 C가 더 낫다.
그래도 자바가 속도 측면에서 C에 근접하는 영역이 몇 가지 있다. JVM의 JIT 엔진은 프로그램 동작을 기반으로 런타임에 루틴을 최적화해서 사전 컴파일되는 C에서는 불가능한 다양한 종류의 최적화를 실현한다. 또한 자바 런타임은 메모리 관리를 자동화하는데, 일부 새로운 애플리케이션은 이를 우회하여 작동한다. 예를 들어 아파치 스파크는 JVM을 피해가는 맞춤형 메모리 관리 코드를 사용해서 메모리 내 프로세싱을 최적화한다.
 vs. C#과 닷넷

C#과 닷넷 프레임워크는 출시되고 20년 가까이 기업 소프트웨어 분야에서 주요한 언어로 사용되고 있다. 보통 C#과 닷넷을 두고 자바에 대한 마이크로소프트의 대응이라고 말한다(관리형 코드 컴파일러 시스템과 범용 런타임). 또한 C와 자바의 비교만큼 C와 C#/닷넷과의 비교도 많다.

자바(및 파이썬 일부분)와 마찬가지로 닷넷은 다양한 플랫폼 간 이식성과 방대한 통합 소프트웨어 생태계를 제공한다. 닷넷 분야에서 기업용 개발이 얼마나 많이 이뤄지는지를 감안하면 결코 작은 이점이 아니다. C# 또는 다른 닷넷 언어로 프로그램을 개발하는 경우 닷넷 런타임용으로 작성된 무수한 툴과 라이브러리를 활용할 수 있다.

자바와 비슷한 또 다른 닷넷의 장점은 JIT 최적화다. C#과 닷넷 프로그램은 C와 마찬가지로 사전 컴파일이 가능하지만, 주로 닷넷 런타임에 의해 JIT로 컴파일되며 런타임 정보를 사용해 최적화된다. JIT 컴파일은 닷넷 프로그램 실행을 위한, C에서는 수행할 수 없는 다양한 종류의 즉각적인 최적화를 가능하게 해준다.

C#과 닷넷은 C와 마찬가지로 메모리 직접 액세스를 위한 다양한 메커니즘을 제공한다. 힙, 스택, 비관리형 시스템 메모리, 모두 닷넷 API와 객체를 통해 액세스할 수 있다. 또한 개발자는 닷넷의 unsafe 모드를 사용해서 성능을 더 높일 수도 있다.

장점만 있는 것은 아니다. 관리형 객체와 unsafe 객체를 임의로 교환할 수 없고, 둘 사이의 마샬링은 성능에 영향을 미친다. 따라서 닷넷 애플리케이션의 성능을 극대화한다는 것은 관리형 객체와 비관리형 객체 간의 이동을 최소화한다는 의미다.

관리형과 비관리형 메모리 간의 불이익을 용인할 수 없는 경우, 또는 닷넷 런타임이 대상 환경에 적합하지 않거나(예를 들어 커널 공간) 아예 제공되지 않는 경우에는 C가 필요하다. C# 및 닷넷과 달리 C에서는 기본적으로 직접 메모리 액세스가 해제되어 있다.