CPU에서 코드 라인을 어떻게 실행합니까?


11

고수준 언어가 기계 코드로 변환 된 다음 CPU에 의해 실행되는 방식을 실제로 이해하려고합니다.

코드가 머신 코드로 컴파일되어 CPU가 사용할 수있는 하위 수준 코드 인 것으로 알고 있습니다. 과제 명세서가 있으면 다음과 같이 말합니다.

x = x + 5;
y = x - 3;

CPU는 한 번에 한 줄씩 실행합니까? 따라서 먼저 x = x + 5를 실행합니다. 명령어와 CPU가 다음에 실행할 명령어는 y = x-3입니다. 실제로 실행 프로세스와 CPU에서 실제로 작성한 코드가 어떻게 실행되는지 이해하려고합니다.


오픈 소스 CPU 중 하나의 디자인을 이해하려고 할 수 있습니다. excamera.com/sphinx/fpga-j1.html 과 같은 간단한 스택 기반 구현 이 있습니다. 3- 주소 아키텍처보다 훨씬 간단합니다. 당신의 예 에서처럼.
SK-logic

3
내가이 사업에 들어갔을 때, 이것은 간단하고 명확한 대답이 있었을 것입니다. 오늘날 CPU는 매우 복잡하며 처리 능력을 높이기 위해 모든 종류의 작업을 수행합니다.
David Thornley

답변:


12

코드 줄은 CPU가 코드를 실행하는 방법과 관련이 없습니다. 하드웨어가 실제로 어떻게 작동하는지에 대해 많은 것을 가르쳐 줄 것이기 때문에 어셈블러를 읽는 것이 좋습니다. 많은 컴파일러에서 어셈블러 출력을 얻을 수도 있습니다.

이 코드는 (구성된 어셈블리 언어에서) 다음과 같이 컴파일 될 수 있습니다.

load R1, [x] ; meaning load the data stored at memory location x into register 1
add R1, 5
store [x], R1 ; store the modified value into the memory location x
sub R1, 3
store R1, [y]

그러나 컴파일러에서 변수를 다시 사용하지 않는 것을 알고 있으면 저장 작업이 수행되지 않을 수 있습니다.

디버거가 어떤 머신 코드가 프로그램 소스 라인에 해당하는지 알기 위해, 컴파일러는 주석을 추가하여 머신 코드의 어느 라인에 어떤 라인이 대응 하는지를 보여줍니다.


왜 안돼? 3- 주소 아키텍처에는 ADD Rx, Rx, $5and와 같은 명령어가 있습니다 SUB Ry, Rx, $3(x와 y 변수가 레지스터에 매핑되었다고 가정). 로드 / 스토어 RISC 접근 방식을 설명하고 있습니다.
SK-logic

1
@ SK-logic : 데이터 유형과 연산이 포함 된 매우 간단한 프로그래밍 언어에서 매우 간단한 코드 줄에서 발생할 있지만 CPU가 충분히 지원할 수는 있지만 일반적인 경우는 없습니다. 전문가에게는 편리하지만 먼저 기계어 명령어는 일반적으로 고급 언어의 코드 줄과 거의 유사하지 않다는 것을 인식하는 것이 중요합니다.

@ SK-Logic :이 특정 예제에서만 작동합니다. 그러나 일반적으로 maxpolun이 옳습니다. 개념적으로 간단한 작업을 수행하려면 더 많은 "빨간 테이프"가 필요한 고급 언어 설명을 하위 언어로 번역해야합니다. OP 가이 변환의 예를 요구하고 있다고 생각합니다.
Andres F.

1
@ SK-Logic : OP는 "정말 고급 언어 [...]를 정확히 이해하려고 노력하고 있습니다."라고 질문을 시작했습니다.
Andres F.

1
@ SK-logic 컨텍스트는 "할당 문장이있는 경우 : [코드 조각] CPU가 한 번에 한 줄씩 실행합니까?"입니다. -비 어셈블러 언어의 소스 코드 인 것처럼 보입니다. 더 일반적으로, 나는 저수준 기계 코드가 어떻게 이해 되는지 에 대한 지표를 보지 못하고 (구문과 같은) 문구는 약간의 오해를 나타냅니다. 그것은 당신이 암시하는 것처럼 불가능하지는 않습니다. 모두가 간단한 마이크로 컨트롤러 (나와 다른 것 같은)에서 먼저 머리를 던지는 즐거움을 얻지 못했습니다. 아마도 Frankie는 분명히해야합니다.

2

때에 따라 다르지.

정말 간단한 기계의 초기에는 코드가 한 번에 한 줄씩 실행되었습니다. 머신이 더 크고 빠르며 복잡 해짐에 따라 여러 명령을 동시에 실행할 수있는 기능과 레지스터에서 작업하는 것보다 메모리 읽기 및 쓰기가 훨씬 오래 걸리기 시작했습니다.

컴파일러 최적화는이 점을 고려해야했으며, 프로세서의 한 부분은 y의 계산을 수행하는 반면, 다른 부분은 이전에 계산 된 새로운 값을 저장 한 상태에서 병렬로 "더 많거나 적은"실행할 수 있습니다. x (그리고 y의 계산은 레지스터에서 새로운 값을 사용하고있었습니다).

Control Data 6600은 이런 종류의 작업을 수행 한 최초의 머신이었습니다. 정수 추가는 300 nsec, 메모리 참조 (읽기 또는 쓰기)는 1000 nsec, 곱하기 및 나누기에는 많은 시간이 걸렸습니다. 필요한 기능 단위에 따라 최대 약 10 개의 명령을 모두 병렬로 실행할 수 있습니다. CDC 6600 FORTRAN 컴파일러는이 모든 것을 예약하는 데 매우 능숙했습니다.


이 경우 다음 명령의 입력은 첫 번째 명령 결과에 따라 달라 지므로 순차적으로 실행 해야합니다 .
SK-logic

@ SK-logic :별로. 두 번째 줄의 입력은 첫 번째 줄의 오른쪽 결과에 따라 달라 지지만 원래 예제 코드에서 볼 수있는 내용에 따라 결과에 대한 저장소 메모리에 의존하지 않을 수도 있습니다. 첫 번째 줄. x가 휘발성으로 선언 된 경우 (C / C ++에서) "휘발성"은 무언가를 의미하기 때문에 컴파일러는 결과를 먼저 저장 한 다음 새로운 y 값 계산을 시작하기 전에 메모리에서 다시로드해야합니다. (인터럽트 핸들러), 두 줄 사이에 들어오고 zap x 할 수 있습니다.
John R. Strohm

나는 x와 y가 레지스터라고 가정했다 (그리고 코드는 C와 같은 것이 아닌 3- 주소 의사 어셈블리 언어로되어있다). 이 경우 두 명령 모두 불가피하게 순차적입니다. 그렇지 않으면 OP는이 질문 대신 두 가지 이상의 다른 질문을해야했습니다.
SK-logic

프로세서가 그 가치를 "추측"하려고하는지 궁금합니다 x. 이 방법으로 이미 코드를 실행했으며 캐시에 저장했습니다.
Kolob Canyon

이들이 레지스터 인 경우에도 기계에 따라 명령이 완전히 순차적으로 실행된다고 가정 할 수 없습니다. 6600에는 프로그래머가 명백한 것을 원한다는 가정에 따라 순차적 의미론을 강제하는 스케줄링 논리 ( "스코어 보드")가있었습니다. 나중에 기계는 그 하드웨어를 생략하고 대신 컴파일러를 사용하여 명령을 신중하게 예약합니다. 그 짐승들에 대해 어셈블리 언어 프로그래밍을하는 인간 프로그래머들은 그들 자신에있었습니다.
John R. Strohm

1

아니요, 상위 및 하위 언어의 코드 라인 / 명령간에 일대일 매핑이 없습니다. 실제로 위의 두 줄은 다음 과 같은 여러 머신 코드 명령어 로 변환됩니다.

  1. 특정 메모리 주소의 값을 레지스터로로드
  2. 값을 수정하다
  3. 그것을 메모리에 다시 쓴다

이 지침의 실제 세부 사항은 플랫폼마다 다릅니다.

이것은 사물의 기본 견해입니다. 그러나 문제를 더욱 복잡하게하기 위해 최신 CPU는 실행 파이프 라인 , 비 순차적 실행다중 코어 와 같은 기술을 적용 합니다. 이로 인해 CPU는 한 번에 여러 작업을 수행합니다. 예를 들어 파이프 라인은 동일한 처리 장치 내에서 후속 명령의 여러 단계를 병렬로 처리하는 반면 여러 코어는 독립적 인 명령을 병렬로 처리 할 수 ​​있습니다.


0

작동 방식, 컴파일러 클래스에 대한 자세한 내용을 보려면 책에서 자세한 내용을 살펴 봐야합니다.

기본적으로 귀하의 질문은 두 가지 측면에 중점을 둡니다.

1) 코드는 기계 코드로 어떻게 번역됩니까?

2) 코드는 언제 / 어떻게 병렬화를 사용하여 계산됩니까?

1)에 대한 대답은 사용하는 언어에 따라 다릅니다 (예를 들어 사소한 것이지만 출력은 동일 함). 컴파일러가 기계 코드로 변환하는 방식은 언어의 힘 중 하나입니다. 또한 예제에서 고려해야 할 몇 가지 문제가 있습니다. 코드는 데이터를 메모리에로드하고 저장해야합니다.

마지막으로 병렬화는 프로그래밍 관점에서 강제 할 수있는 기능이지만 간단히 말하면 일부 프로세서는 독립적 인 코드의 일부를 동시에 실행할 수 있다고 생각할 수 있습니다. 귀하의 경우, 문장을 순차적으로 실행해야하기 때문에 분명히 그렇지 않습니다. 그렇지 않으면 동시에 실행되지 않습니다.

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