2013-05-19 3 views
5

C++이나 C#으로 작성한 oop 코드는 기계어 코드 나 C#의 경우 바이트 코드로 변환하는 것과 정확히 얼마나 일치합니까? 내 말은, 물체가 어떻게 번역되는거야?객체 지향 코드는 어떻게 기계어 코드로 변환됩니까?

절차 적 프로그래밍에서 실제로 기계 언어로 함수를 실제로 지원하기 때문에 컴파일 후 어떻게 보이는지 분명합니다. 그러나 oop 프로그래밍의 경우 기계 언어로 된 객체가 없습니다.

내 이론은 데이터 (멤버 ​​함수가 없음) 만 포함 된 struct와 같은 일종의 C로 개체 자체를 컴파일한다는 것이고, 멤버 함수가 호출 될 때 개체의 데이터 구조체 인 addional 매개 변수를 받아들이면 그 자체. 내가 맞습니까?

답변

1

그것은 구현에 의존합니다. 그러나 실제로는 공통점은 가상 테이블 ("vtable")을 사용하는 것입니다. 각 클래스마다 가상 테이블이 있는데 여기에는 각 멤버 함수 구현에 대한 포인터 목록이 들어 있습니다. 각 객체는 해당 vtable에 대한 포인터를 가져옵니다.

언어 및 컴파일러 플래그에 따라 vtable의 적절한 포인터를 함수 서명 (이름 및 인수) 또는 색인만으로 조회 할 수 있습니다.

member-function이 vtable 포인터를 통해 호출되면 확실히 객체 데이터에 대한 포인터가 필요합니다. 하지만 스택이나 레지스터에 전달 될 수 있습니다.

2

(사실, MSIL)를 바로 생성 "조립"보고 추측 할 필요가 없습니다 코드 :

How can I view MSIL/CIL generated by C# compiler? Why is it called assembly?

+0

그리고 C++ 케이스는 어떻습니까? 둘 다 결국 같은 구조 또는 메모리 레이아웃을 봐야합니까? 이를 수행하는 방법은 여러 가지가있을 수 있습니다. 예를 들어 함수와 함께이 구조체를 가질 수도 있기 때문에 객체가 같은 함수를 ans 이상으로 복제하면 더 많은 메모리를 소비하기 때문에 가능성이 희박합니다. – UnTraDe

+0

"hallo world"C 프로그램을 작성하십시오. gcc -o hw hw.c로 컴파일하십시오. objdump -d hw를 발행하십시오. 같은 이야기입니다. 변경된 사항은 도구 이름과 특정 지침입니다. IOW 대상 CPU가 다릅니다. NET에서 가상, C++에서 실제. –

0

OOP의 모든 객체 지향성은 개발자가 프로토 타입과 인스턴스를 포함하는 패러다임에 모듈화되고 체계화 된 코드를 작성할 수 있도록하는 상위 수준 프로그래밍 구조입니다. oop 코드는 기계어 코드에 상응하는 코드를 가지고 있지 않습니다.

우리는 인터페이스의 개념을 가지고 있지 않은 javascript로 변환되는 typescript의 인터페이스를 더 가지고 있습니다. (이것은 아주 좋은 예가 아닐 수도 있습니다)

관련 문제