프로그래머는 고급 언어의 저수준 소프트웨어 개발을 어떻게 처리합니까?


20

나는 프로그래밍에 다소 익숙하지 않으며이 질문을 할 수있는 가장 좋은 방법은 예입니다.

Java 및 C #에서 기본 작업을 수행하는 방법을 알고 있습니다. 작은 창과 같은 것은 응용 프로그램을 형성하거나 일반 클래스를 만듭니다. 나는 기본적으로 배우고 있었고 아직 큰 일을 시도하지 않았습니다. 어쨌든, 나는 항상 당신이 말할 수있는 것 "일부에서"어떻게 수행되는지 궁금했습니다.

나는 모두 1과 0으로 끓여서 어셈블리 언어는 기본적으로 1과 0의 패턴에 명령을 내린다는 것을 알고 있지만 거기에서 다음과 같이 점프 할 것 같습니다 : 라이브러리를 사용하십시오. 라이브러리가 없어도 모든 C #이 할 수있는 것처럼 산술 및 이진 논리입니다. 입력 또는 출력을 얻으려면 라이브러리 등을 사용하십시오.

나는이 질문이 아마도 어떤 사람들에게는 명백해 보인다는 것을 알고 있으며, 배울 것이 많지만, 이런 질문으로 어디서 시작할지조차 모른다는 것을 알고 있습니다. 고맙습니다.

그래서 내 질문은 이것입니다 :

누군가 가상 머신이나 플레이 스테이션 에뮬레이터, 운영 체제 또는 드라이버를 만들거나 미디어 플레이어에 mp3 지원을 추가하거나 자신 만의 파일 형식 등을 만들려는 경우 어떻게해야합니까? C # 또는 Java로 수행되는 방식을 볼 수 없습니다.

즉, WROX의 Professional C # 또는 OReilly의 Programming C #과 같은 책을 읽는 경우 어떻게해야하는지 알 수 있습니까? 아니면 어셈블리 언어 나 C ++과 같은 저수준을 배워야합니까?


7
"후드"에서 일어나는 일을 이해하는 한 가지 비법은 단락을 집중시키고 사용하여 쉽게 읽고 이해하도록하는 것입니다. 제발 편집 쉽게 읽을 수 있도록이 질문을.
S.Lott

1
관심이 있으시면 Charles Petzold의 코드 : 컴퓨터 하드웨어 및 소프트웨어의 숨겨진 언어 사본을 선택하십시오. 잘 읽었습니다. amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight

@ S.Lott 구조 :-)
Martin Wickman

@Martin Wickman : 매우 훌륭하지만 @ fender1901이 편집 또는 초점을 맞추는 데 도움이 되었습니까?
S.Lott

1
@Martin Wickman : 변경 사항을 취소하는 것이 중요하지 않습니다. 다른 사람들이 행함으로써 배우도록 격려하는 것이 나의 요점입니다. 당신은 분명히 이미 알고 있습니다. @ fender1901을 수행하여 학습해야합니다. 제 질문은 이것입니다 : "@ fender1901이 편집하거나 집중하는 데 도움이 되었습니까?" 어떻게 생각해?
S.Lott

답변:


9

재미있는 질문! Java 및 C #과 같은 언어는 실제로 상당히 낮은 수준의 프로그래밍을 지원한다는 것을 알 수 있습니다. 예를 들어 OpenJDK for Java의 일부 I / O 소스 코드를 살펴보십시오. 보다 높은 수준의 메서드는 낮은 수준의 소켓 기술, 바이트 배열 및 비트 트위들 링으로 구현됩니다.

C # 및 Java와 관련하여 이러한 언어는 바이트 코드로 컴파일되어 가상 머신에서 실행됩니다. 실제로 바이트 코드를보고 즐겁게 배울 수 있습니다 (예 : Java가 문자열 객체 연결을 처리하는 방법보기).

개발중인 환경에서 이러한 높은 수준의 VM 중 하나를 호스팅하지 않는 경우 (공간 및 성능 요구 사항으로 인해) '낮은 수준의'언어를 사용해야합니다.

메모리 관리 및 데이터 구조를 n 번째 수준으로 조정할 수 있으므로 C / C ++은 여전히 ​​저수준 드라이버 작성 영역에서 휴식처를 지배한다고 믿습니다.

어셈블리는 요즘 꽤 전문화되어 있습니다. 최소한 그 수준에서 일어나는 일을 이해하기 위해 최소한의 빠른 과정을 수강하는 것이 좋습니다. 비우는 동안 레지스터를 백필하기 위해 일부 어셈블리를 작성할 때 각 프로그래밍 언어 계층이 가야하는 길이에 대해 이해하기 시작합니다.

HTH


실제로 중급 언어로 프로그래밍 할 수 있습니까? 아니면 그냥 검토해야합니까?
fender1901

'바이트 코드'소스 코드를 작성할 수 있는지 묻고 있습니까?
Martijn Verburg

내 생각에 java 또는 c #처럼 바이트 코드 또는 il을 사용하여 코딩을 시작할 수 있는지 궁금합니다.
fender1901

자바 나 C #에서는 바이트 코드를 조작하는 사람이 거의 없지만, 더 많은 사람들이 특정 상위 레벨 코드가 어떤 바이트 코드로되는지 살펴 보았습니다.
Martijn Verburg

4

대부분의 "저수준"프로그래밍은 기본적으로 운영 체제와 직접 인터페이스합니다. "명백한"방법이있는 것처럼 보이지 않는 이유는 일반적으로 Java와 같은 고급 언어는 사용하기 쉽고 이식성을 위해 노력하기 때문입니다. 운영 체제와 직접 인터페이스하는 코드는 일반적으로 추상화로 싸여 있지 않으면 상위 코드 보다 이식성이 떨어 집니다.

C 및 C ++와 같은 저급 언어에서는 운영 체제 API에 직접 액세스 할 수 있습니다 (대부분의 운영 체제가 C로 작성 되었기 때문에 C 언어를 통해 API를 노출 함). 예를 들어, UNIX 시스템의 C ioctl에서는 장치와 직접 인터페이스하기 위해 함수를 호출 할 수 있습니다 .

물론 Java 및 C #과 같은 고급 언어도 운영 체제와 대화해야합니다. 파일을 열거 나 네트워크 소켓에서 읽을 때마다 OS와 인터페이스합니다. Java와 C #이 저수준 OS 시스템 호출을 Socket객체 와 같은 상위 수준 추상화로 감싸는 것 입니다. 이 높은 수준의 접근 방식은 동일한 Java 코드가 다른 플랫폼에서 작동한다는 이점이 있습니다. 반면, UNIX에서 C로 소켓을 여는 방법은 Windows에서하는 방법과는 상당히 다릅니다.

일반적으로 언어 수준이 높을수록 프로그램이 운영 체제와 인터페이스하는 방법을 덜 제어 할 수 있습니다. 즉 당신이 언급 많은 것들을 말했다 있는 높은 수준의 언어로 할 수 있습니다. 예를 들어 Java 또는 C #으로 가상 머신을 작성할 수없는 이유는 없습니다.


2

좋은 소식은 Java 또는 C #으로 수행 할 있다는 것입니다. 알아야 할 유일한 문제는 방법 입니다. 기본적으로 하드웨어 아키텍처 (필요한 PC는 아니지만 에뮬레이션하려는 경우 Playstation)에 대한이 멋진 것들을 알아야합니다. 그리고 어셈블러 및 기계 언어와 같이 깊이 들어가야 할 것을 두려워합니다.
모든 ALU, 레지스터, MMU 및 자료를 추상화하고 고급 언어로 에뮬레이션 할 수 있습니다. 저수준 기능을 호출하여 하드웨어 지원을받을 수도 있습니다 (예 : PInvoke 및 JNA에 대해 알아보십시오).

그러나 초보자이기 때문에 그런 거대한 작업을 시작하지 않는 것이 좋습니다. 리눅스 (또는 다른 유닉스와 같은 OS, 즉 FreeBSD), 컴퓨터 아키텍처, 어셈블러에 대해 조금 C / C ++를 배우는 것이 좋습니다. 몇 년이 걸릴 수 있습니다. 그래서 ...
정말로 필요한 것은 동기와 인내.


2

고급 언어 (Java)를 배운 것은 저수준 언어 및 하드웨어에 대한 관심이 높아졌습니다. 가장 원시적 인 상태에서 컴퓨터는 전자 제품입니다. 1과 0은 전기 요금 (켜기 / 끄기) 수치입니다. 프로세서의 논리와 산술 논리 장치 내부의 내용을 이해하기 시작하면 실제로 문제가 발생했습니다.
공부를 시작해야한다고 생각합니다부울 논리 (AND, OR, XOR 등)를 사용하여 작은 ALU를 디자인하고 메모리와 레지스터가 어떻게 작동하는지 살펴보십시오. 그런 다음 어셈블리 언어를 배우고 컴파일 작동 방식을 알게됩니다. 곧 고급 언어가 지루해 보일 것입니다! 농담이야. 그래도 모든 것이 제자리에 들어가는 것은 아름답고 배우는 것이 즐겁습니다. 호기심의 길을 따라 가면 즉시 물건을 집을 수 있습니다.


2

C # 또는 Java (또는 대부분의 다른 언어)로 저수준 작업을 수행 할 수 있지만 대부분의 사람들은 그렇지 않습니다. 따라서 합리적으로 인기있는 책 중 하나를 선택하면 하위 수준의 자료가 남게됩니다. 필요한 언어 기능을 다루지 만 궁금한 방식으로 적용하지는 않습니다. 마찬가지로 저수준의 책은 아마도 C 언어 일 것이고 아마도 어셈블리 언어가 약간있을 것입니다.

C 자체를 배우는 것은 포인터 조작을 제외하고 C # 프로그래머에게는 어렵지 않지만 일을하는 법을 배우는 데 시간이 오래 걸릴 것입니다. C는 C #보다 표현력이 낮은 언어이므로 C #에서 효율적으로 수행하는 방법을 알고있는 것은 C와는 훨씬 다른 방식으로 수행해야합니다.

다음에 찾아야 할 것은 배우고 자하는 하위 레벨의 책입니다. 예를 들어 Linux 커널에 관한 책이 있지만 커널 수준 프로그래밍은 배경 지식 없이는 이해하기 어려울 것이므로 운영 체제 기본 사항을 먼저 연구해야 할 수 있습니다.


지금 가장 큰 문제는 배경 지식이 없기 때문에 이러한 주제 중 많은 부분을 파악하기가 어렵다는 것입니다. 그런 지역으로가는 다리가 필요합니다.
fender1901

@ fender1901 : 문제가 될 수 있습니다. 리눅스 커널은 운영체제가 무엇인지 이해하지 못하는 사람에게는 정말 이상하게 보일 수있는 일을합니다. 언급 한 것 중 에뮬레이터가 가장 이해하기 쉬울 것입니다. 초기 마이크로 컴퓨터에 대한 간단한 에뮬레이터가 있습니다.
David Thornley

1

사용 된 플랫폼 / 언어로 저수준 기능을 수행 할 수 있는지 여부를 알아야합니다.

  • 바이트를 변수에 저장
  • 바이트 단위로 파일 읽기 / 쓰기
  • 바이트 배열 설정, 요소 액세스,
  • 진정한 절차 적 기능인 OOP를 사용합니다.
  • 화면, 키보드, 소켓에 액세스

흠, 언어를 선택하는 것은 임의적이어야한다고 들었습니다.


-2

이 질문에는 몇 가지 대답이 있습니다. 1. Java 및 C #은 메모리를 관리하는 기존 운영 체제에서 응용 프로그램 개발을 위해 개발 된 고급 언어입니다 (이는 다른 시스템에서 실행할 수있는 하이브리드 프로그램을 만들 수도 있음). 2. 저수준 프로그래밍이 필요한 영역은 OS 개발, 드라이버 개발, AAA 게임 개발 등입니다. 일반적으로 저수준 프로그래밍은 Java 또는 C #에서는 수행되지 않으며 C / C ++ 및 어셈블리 언어를 사용하여 수행됩니다.

이 두 가지 포인트만으로도 저수준 프로그래밍이 별도로 수행되며 고수준 프로그래밍에서 저수준 프로그래밍이 필요하지 않다고 말할 수 있습니다. I / O와 같이 낮은 프로그래밍이 필요한 부분은 저수준 언어로 작성된 인터프리터 (예 : java의 JVM은 C로 작성 됨)에 의해 수행됩니다.

귀하의 질문에 대한 주요 대답은 Java 및 C #을 사용하여 개발되지 않은 것입니다.이 작업은 C 및 Assembly에서 수행되므로 Java 및 C #에서 수행하는 방법을 찾는 것이 아니라 C 및 Assembly를 배우는 데 큰 어려움을 겪고 있습니다. 프로그래밍과 예, 큰 장점은 낮은 수준으로 작성된 프로그램이 작고 빠르다는 것입니다.


이것은 몇 년 전에 게시 된 이전 6 개의 답변에서 언급되고 설명 된 포인트 이상의 실질적인 내용을 제공하지 않는 것 같습니다
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.