2016-10-21 1 views
0

저는 올해 자바 프로그래밍을 시작했습니다. 높은 수준의 개념을 이해하고 편안한 프로그래밍을 느낍니다.저수준 추상화 이해

그러나 나는 내게 어떻게이 모든 일이 내부적으로 어떻게 이루어지는 지 계속 묻고있는 것 같습니까? Java는 프로그래머가 개발을 완화하기 위해 저급 요소에서 벗어나도록 만든 고급 언어라고 이해합니다.

본질적으로 고수준 언어가 내부적으로 얼마나 정확하게 기능하는지 (예 : 객체 지향 프로그래밍)에 대해 자세히 알고 싶습니다. 그것은 분명히 내게는 그들이 사용됩니다,하지만 지금은 어떻게 내부적으로 (메모리 할당 등) 작품을 사용합니다. 내부적으로 객체를 표현하는 방법

누군가가 올바른 방향으로 몇 가지 키워드를 표시 할 수 있습니까? 아니면 어떤 재료를 참조하는 것이 바람직합니까? C 또는 C++과 같은 저급 언어를 배우면이 학습 과정에 도움이됩니까?

+0

컴파일 된 언어를 사용하면 훨씬 간단 해집니다. 당신은 C 프로그램을 컴파일 한 다음'strace./my_program'을 실행하여 리눅스에서 모든 시스템 호출을 볼 수 있습니다. libc 함수가 무엇을 호출하는지 알기 쉽고 각 시스템 호출에 대한 매뉴얼 페이지를 읽을 수 있습니다 (예 : ['read (2)'] (http://man7.org/linux/man -pages/man2/read.2.html), 이미 malloc에 ​​대해'mmap (2)'/'brk' /'sbrk'를 사용한다. 코드를 어셈블리 언어로 컴파일하는 방법을 살펴볼 수도 있습니다 (http://gcc.godbolt.org/). –

답변

1

질문의 표현에 따라 낮은 수준은 여전히 ​​매우 높은 수준입니다.

객체 지향은 고지도, 언어의 저해와도 아무 관계가 없습니다. 객체 지향성을 의미합니다. 객체 지향 어셈블리를 가질 수 있습니다. 기본적으로 언어는 객체 지향적 인 방식으로 사용될 수 있습니다.

메모리 할당은 운영 체제 및/또는 메모리를 관리하는 사람에 따라 다릅니다. 정말 높은 수준에서 복잡한 것은 없습니다. 나는 피자를 먹었고 3 명이 3 피스 나 4 피스 또는 8 피자를 잘라낼 수 있습니다. 각 사람이 하나의 슬라이스를 할당 할 수 있으며 남은 부분이 있으면 다시 와서 할당 할 수 있습니다. 이제 소비 후 피자 할당을 해제하는 것은 우리가 시각화하고 싶은 것이 아닙니다. 그러나 아이디어는 동일합니다. 프로그램에서 빌리거나 가져갈 수있는 메모리가 있습니다. 당신은 그것을 나눕니다, 나던 모든 크기가되어야합니다. 당신은 다양한 크기의 1K, 2K, 4K, 8K ... 1Meg 단위 등을 제공 할 수 있습니다. 당신은 누가 무엇을 소비했는지, 그리고 남은 것은 무엇인지에 대한 테이블/차트를 만듭니다. 그때 당신이 그 (것)들을 자유롭게 표하기 후에 준다. 올드 스쿨 리니어 사상은 이것을 어렵게 만들지 만, MMU (메모리 관리 장치)는 이것을 쉽게 만듭니다. 그리고 그것은 낮은 또는 낮은 수준의 사고입니다. 그들은 프로그램이 자신의 것이 아닌 메모리에 접근하는 것을 막기 위해 보호 기능과 함께 주소 변환기입니다.

MMU가하는 일을 쉽게 볼 수있는 방법은 메모리 할당 관점에서 모든 빌려 쓰거나 가져갈 수있는 메모리를 0x1000 바이트 단위로 생각하는 것입니다. 주소 0x10000부터 시작하여 0x10000, 0x11000, 0x12000 등으로 시작한다고 가정 해보십시오. 그것은 실제 주소 인 실제 주소입니다. 그러나 가상 주소 공간도 가질 수 있습니다. 0x3000 바이트를 요구할 수 있으며 포인터 0x20000000을 제공 할 수 있습니다. 0x20000000과 0x20000FFF 사이에서 액세스 할 때 mmu는 해당 가상 주소를 실제 주소 0x00007000에서 0x00007FFF로 변환 할 수 있습니다. 그러나 0x20001000에서 0x20001FFF는 물리적 0x00004000에서 0x00004FFF로 변환 될 수 있습니다. 그리고 자연스럽게 다른 실제 주소 0x20002000. 따라서 누군가가 10 개의 블록을 할당하면 또 다른 블록을 할당하고 3은 해당 할당을 관리하는 소프트웨어가 처음 10 개의 물리적 블록을 첫 번째 프로그램에 제공하고 그 다음 3은 다음 프로그램으로, 첫 번째 프로그램이 해제되면 다른 프로그램은 7 개의 물리적 블록을 할당합니다. 그 새로운 누군가에게 우리에게 처음 7 장의지도를 제공하고, 3 장의 프리, 3 장의 물리적 인 선형보기를 제공 할 수 있습니다.현재 누군가 4를 할당하면 사실상 3 차원 공간과 3 차원 공간을 제공 할 수 있습니다. 가상 공간에지도를 표시하여 선형 적으로 액세스하는 것처럼 느낄 수 있기 때문입니다.

알파벳순으로 나열된 학생 목록이있는 경우 기숙사 방 번호가 선형으로 일치한다는 것을 의미하지 않습니다. 목록의 알파벳 순으로 학생 번호 1은 기숙사 방 번호 1에 있어야합니다. 기숙사 방에 이름이 매핑 된 표가 있습니다. 알파벳순으로 목록에 학생을 추가하면 모든 기숙사 방 번호를 섞어 놓아야한다는 의미는 아니며 테이블이 필요합니다. 그래서 누군가가 프로젝트에서 일하기 위해 알파벳순으로 5 개의 이름을 부여받을 수 있습니다. 5 개의 인접한 기숙사에 있다는 것을 의미하지는 않습니다. 5 명의 학생 각각과 대화 할 때 기숙사에 이름표를 사용할 수 있습니다. 그들을 찾아라. 가상 주소는 알파벳순 목록입니다. 물리적 주소는 사람들이 살고있는 기숙사입니다. 테이블을 관리하면 프로그램이 선형 메모리 공간이라고 생각하는 것에 액세스 할 수 있지만 실제로는 조각이 확산됩니다. 할당되고 해제 될 때 "조각 모음"을하지 않아도됩니다. mmu가 없으면 매우 지저분 해집니다.

고급 언어에서 피할 수있는 저급 항목은 프로세서의 뉘앙스입니다. 나는 운전을 통해 가서 햄버거를 주문하거나, 빵, 고기, 절임, 토마토, 상추, 케첩 등을 사서 버거를 직접 요리하고 조립할 수 있습니다. 고수준 언어의 a = b + c는 하나 이상의 레지스터를 스택에 저장하기 위해 여러 메모리 및/또는 레지스터 액세스가 될 수 있으므로 메모리에 저장된 값을 수집하기 위해 레지스터를 비울 수 있습니다 (아직 상기 레지스터들에 없다면), 연산을 수행 할 필요가있을 때마다 결과를 메모리에 저장한다. 인쇄 또는 파일 액세스 또는 네트워크 또는 비디오 등과 같은 시스템 호출, 전체를 만들기위한 작은 개별 작업을 수행하는 많은 코드. 모든 벽돌과 보드와 손톱과 시멘트와 같은 건물을 만드는 데 걸리는 시간은 햄버거처럼 누군가 (컴파일러)가 만든 집을 살 수 있습니다. 또는 5 백만 개의 도구와 재료를 사서 그 집을 만들 수 있습니다. 올바른 순서로 이들 자료를 빗어 낼 수 있습니다.

고급 언어는 추상화도 제공합니다. 이것은 C이지만 이해할 수있을 것입니다.

unsigned int fun (unsigned int a, unsigned int b) 
{ 
    return(a+b+7); 
} 
나는 모두 함께 넣어의 피클과 칼과 함께 양상추와 빵 재료와 프라이팬로 컴파일 할 수

: 나는 훨씬 더 효율적 맥도날드 대신에의 할 수있다

00000000 <fun>: 
    0: e52db004 push {fp}  ; (str fp, [sp, #-4]!) 
    4: e28db000 add fp, sp, #0 
    8: e24dd00c sub sp, sp, #12 
    c: e50b0008 str r0, [fp, #-8] 
    10: e50b100c str r1, [fp, #-12] 
    14: e51b2008 ldr r2, [fp, #-8] 
    18: e51b300c ldr r3, [fp, #-12] 
    1c: e0823003 add r3, r2, r3 
    20: e2833007 add r3, r3, #7 
    24: e1a00003 mov r0, r3 
    28: e24bd000 sub sp, fp, #0 
    2c: e49db004 pop {fp}  ; (ldr fp, [sp], #4) 
    30: e12fff1e bx lr 

기름기 숟가락 식당 :

00000000 <fun>: 
    0: e2811007 add r1, r1, #7 
    4: e0810000 add r0, r1, r0 
    8: e12fff1e bx lr 

아니면 완전히 다른 컴퓨터에서 동일한 코드를 사용할 수 있습니다

00000000 <_fun>: 
    0: 1166   mov r5, -(sp) 
    2: 1185   mov sp, r5 
    4: 1d40 0006  mov 6(r5), r0 
    8: 65c0 0007  add $7, r0 
    c: 6d40 0004  add 4(r5), r0 
    10: 1585   mov (sp)+, r5 
    12: 0087   rts pc 

그리고 올바른 도구 (gnu는 잘 작동합니다)를 사용하면 쉽게 C/C++을 가져 와서 위를보고 이해하려고 시도 할 수 있습니다. 언어가 당신을 위해 무엇을하고 있는지. printf 나 file access와 같은 시스템 호출에 관해서는 응용 프로그램은 다른 코드가 링크되어있는 라이브러리 함수를 호출하고 결국에는 운영 체제에 그 작업을 요청합니다 (현금 대신 버거를 사기 위해 신용 카드를 사용하십시오) 이제는 계산대가 카드 상자를 스 와이프해야하고 상자가 세계 어느 곳의 은행과도 통화를합니다.이 거래를 저에게 해주세요. 서랍을 열 때와 계산원이 처리합니다.) 몇 가지 숫자를 추가하는 것은 일반적으로 운영 체제를 포함하지 않지만 비디오 나 디스크와 같은 제어되거나 복잡한 또는 공유 된 리소스에 액세스하는 경우 운영 체제에 언어와 컴파일러 및 운영 체제와 관련된 운영 체제를 요청해야합니다.

자바와 파이썬 (초기 파스칼 등)은 실제로 구현되지 않고 하드웨어에서 직접 구현 가능한 컴퓨터 코드로 컴파일함으로써 추상화 한 것입니다.그런 다음 플랫폼을 가지고 특정 가상 머신 (C와 같은 다른 언어로 작성)을 사용하여 해당 자바 바이트 코드를 읽은 다음 해당 작업을 수행합니다. 일부 작업은 b, c, add (a), 일부 작업은 읽기 파일. JAVA가 바이트 코드 레벨에서 생성하는 것을 디스 어셈블하고 볼 수는 있지만 컴파일 된 언어로는 더 쉽게 수행 할 수 있습니다.

javiergarval 님의 답변 Tanenbaum 책이나 처음에는 중간 계층 인 운영체제를 뒤덮을 수 있습니다. 그러나 얼마나 낮게 가고 싶은가에 따라 어셈블리 언어로 내려간 다음 로직과 버스로 더 내려갑니다.

코드 : 컴퓨터 하드웨어 및 소프트웨어의 숨겨진 언어 by Petzold. 다른 방향에서 오는 것.

+0

매우 자세한 답변을 보내 주셔서 감사합니다. 이것이 제가 찾고 있던 것입니다. –

0

내가 추천하는 좋은 책은 Andrew S. Tanenbaum의 Modern Operating Systems입니다.

프로그래밍 할 때에 대해 궁금한 점이 모두 에 해당됩니다.

this thread from SO.