일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 클린코드
- 컴퓨터시스템
- DispatcherServlet
- 프록시
- gradle
- 빌드툴
- Immutable
- lambda
- ApplicationContext
- 메이븐
- hibernate
- Spring
- springboot
- beanfactory
- FunctionalInterfaces
- Kotlin for Java Developers
- java
- ORM
- String
- AutoConfiguration
- 토비의스프링
- springwebmvc
- 링커
- DesignPattern
- 링킹
- JPA
- 토비의스프링3.1
- exception
- IOC
- 자바
- Today
- Total
목록프로그래밍/전공서적 (4)
엔지니어로 가는 길
우리는 편의상 메모리를 단순히 바이트들의 선형 배열로 여기고, CPU가 각 메모리 위치에 상수 시간 안에 접근할 수 있다고 생각한다. 하지만 실제 메모리는 조금 복잡하다. 메모리 계층구조 메모리는 다음과 같이 계층구조를 갖는다. 메모리는 왜 계층구조일까? 우리는 속도가 빠르면서 용량이 큰 메모리를 원한다. 속도와 용량은 trade-off 관계에 있다. 속도를 빠르게 하면 용량이 떨어지기 마련이고, 용량을 키우면 속도가 떨어지기 마련이다. 그러나 계층구조를 이용하면 속도도 빠르고 용량도 큰 마법같은 메모리를 사용하는 것 같은 착각을 얻을 수 있다. 이게 어떻게 가능한걸까? 먼저 캐시와 지역성을 이해해야 한다. 캐시 '캐싱한다'는 말이 있다. 이 말은 무언가를 저장한다는 말이고, 그 무언가는 당연히 앞으로 ..
컴퓨터가 C언어를 이해할 수 있을까? 요즘은 프로그램을 소스 코드로 작성한다. 소스 코드는 인간이 이해할 수 있는 언어로 작성한 코드이다. 시스템은 소스 코드를 이해할 수 없다. 시스템은 기계어만 이해할 수 있다. 따라서 누군가 소스 코드를 기계어로 번역해주어야 한다. (C언어의 경우) 컴파일러와 어셈블러가 번역 과정을 맡는다. 먼저 컴파일러가 소스 코드를 어셈블리어로 번역해놓고 나면, 어셈블러가 어셈블리어를 기계어로 번역한다. 소스 코드를 한 번에 기계어로 번역해주지 않고 왜 굳이 두 단계로 나누었을까라는 의문이 들었다. 하지만 만들어진 순서를 생각해보면 당연한 결과인 것 같다. 프로그래밍 언어의 시작부터 사람이 이해할 수 있는 언어가 있었던 것이 아니라, 처음엔 기계어에서부터 시작했다. 기계어는 0과..
이번 시간에는 정적 링킹과 동적 링킹의 차이에 대해 이해해보자. 아래의 그림에서 왼쪽은 정적 링킹 방식이고 오른쪽은 동적 링킹 방식이다. 먼저 글을 찬찬히 읽은 뒤 다시 그림을 살펴보는 것이 좋겠다. Static Linking (정적 링킹) 정적 링킹이란 실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하는 방식을 말하며 링커에 의해 이루어진다. 즉, 자신이 작성한 프로그램에서 A라는 외부 함수를 사용했다면, A라는 외부 함수에 대한 정보를 자신이 작성한 프로그램의 실행파일을 만들 때 복사해온다. 5개의 프로그램에서 A라는 외부 함수를 이용하는데 이때 정적 링킹 방식을 사용하면 5개의 프로그램의 실행 가능한 목적파일 각각에 A의 정보가 담긴다. 즉, 중복이 발생한다. 따..
이번에는 링킹이 무엇인지, 링커란 무엇인지에 대해 간략히 알아보도록 한다. Linking(링킹)은 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드될 수 있고 실행될 수 있는 한 개의 파일로 만드는 작업이다. 이 파일이 메모리에 로딩되어 실행된다. 링크는 컴파일시에 수행되는 경우도 있고, 로딩시에 수행되는 경우도 있고, 실행시에 수행되는 경우도 있다. Linker(링커)란 링킹을 담당하는 프로그램이다. 링커는 소프트웨어 개발에서 독립적인 컴파일을 가능하게 하는 아주 중요한 역할을 담당한다. 링커 덕분에 큰 규모의 응용프로그램을 한 개의 소스 파일로 구성하는 대신 별도로 수정할 수 있고, 컴파일할 수 있는 보다 관리할 만한 규모의 더 작은 모듈들로 나눌 수 있다. 즉, 아주 거대한 프로그램을 하나의..