비주얼 노벨에 대한 내용은 링커(비주얼 노벨) 문서 참고하십시오.
[[컴퓨터공학|컴퓨터 과학 & 공학
Computer Science & Engineering
]]- [ 펼치기 · 접기 ]
- ||<tablebgcolor=#fff,#1c1d1f><tablecolor=#373a3c,#ddd><colbgcolor=#0066DC><colcolor=white> 기반 학문 ||수학(해석학 · 이산수학 · 수리논리학 · 선형대수학 · 미적분학 · 미분방정식 · 대수학(환론 · 범주론) · 정수론) · 이론 컴퓨터 과학 · 암호학 · 전자공학 · 언어학(형태론 · 통사론 · 의미론 · 화용론 · 음운론) · 인지과학 ||
하드웨어 구성 SoC · CPU · GPU(그래픽 카드 · GPGPU) · ROM · RAM · SSD · HDD · 참조: 틀:컴퓨터 부품 기술 기계어 · 어셈블리어 · C/C++ · C# · Java · Python · BIOS · 절차적 프로그래밍 · 객체 지향 프로그래밍 · 해킹 · ROT13 · 일회용 비밀번호 · 사물인터넷 · 와이파이 · GPS · 임베디드 · 인공신경망 · OpenGL · EXIF · 마이크로아키텍처 · ACPI · UEFI · NERF · gRPC · 리버스 엔지니어링 · HCI · UI · UX · 대역폭 · DBMS · NoSQL · 해시(SHA · 브루트 포스 · 레인보우 테이블 · salt · 암호화폐) · RSA 암호화 · 하드웨어 가속 연구
및
기타논리 회로(보수기 · 가산기 · 논리 연산 · 불 대수 · 플립플롭) · 정보이론 · 임베디드 시스템 · 운영 체제 · 데이터베이스 · 프로그래밍 언어{컴파일러(어셈블러 · JIT) · 인터프리터 · 유형 이론 · 파싱 · 링커 · 난해한 프로그래밍 언어} · 메타데이터 · 기계학습 · 빅데이터 · 폰노이만 구조 · 양자컴퓨터 · 행위자 모델 · 인코딩(유니코드 · MBCS) · 네트워크 · 컴퓨터 보안 · OCR · 슈퍼컴퓨터 · 튜링 머신 · FPGA · 딥러닝 · 컴퓨터 구조론 · 컴퓨터 비전 · 컴퓨터 그래픽스 · 인공지능 · 시간 복잡도(최적화) · 소프트웨어 개발 방법론 · 디자인 패턴 · 정보처리이론 · 재귀 이론 · 자연어 처리(기계 번역 · 음성인식) · 버전 (버전 관리 시스템 · Git · GitHub)
'''이론 컴퓨터 과학 {{{#!wiki style="display: inline-block; font-family:Times New Roman, serif;font-style:italic"''' | |||||
{{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px)" {{{#!folding [ 펼치기 · 접기 ] {{{#!wiki style="margin: -5px -1px -11px" | <colbgcolor=#a36> 이론 | ||||
기본 대상 | 수학기초론{수리논리학(논리 연산) · 계산 가능성 이론 · 범주론 · 집합론} · 이산수학(그래프 이론) · 수치해석학 · 확률론 및 통계학 · 선형대수학 | ||||
다루는 대상과 주요 토픽 | |||||
계산 가능성 이론 | 재귀함수 · 튜링 머신 · 람다대수 · 처치-튜링 명제 · 바쁜 비버 | ||||
오토마타 이론 | FSM · 푸시다운 · 튜링 머신(폰노이만 구조) · 정규 표현식 · 콘웨이의 생명 게임 · 형식언어 | ||||
계산 복잡도 이론 | 점근 표기법 · 튜링 기계^고전, 양자, 비결정론적, 병렬 임의접근 기계^ · 알고리즘 · 자료구조 · 알고리즘 패러다임(그리디 알고리즘, 동적 계획법) | ||||
정보이론 | 데이터 압축(무손실 압축 포맷 · 손실 압축 포맷) · 채널 코딩(채널 용량) · 알고리즘 정보 이론(AIT) · 양자정보과학 | ||||
프로그래밍 언어이론 | 프로그래밍 언어(함수형 언어 · 객체 지향 프로그래밍 · 증명보조기) · 메타 프로그래밍 · 유형 이론 · 프로그래밍 언어 의미론 · 파싱 · 컴파일러 이론 | ||||
주요 알고리즘 및 자료구조 | |||||
기초 | 정렬 알고리즘 · 순서도 · 탐색 알고리즘 | ||||
추상적 자료형 및 구현 | 배열^벡터^ · 리스트^연결 리스트^ · 셋(set)^레드-블랙 트리, B-트리^ · 우선순위 큐^힙, 피보나치 힙^ | ||||
수학적 최적화 | 조합 최적화 | 외판원 순회 문제 · 담금질 기법 · 유전 알고리즘 · 기계학습 | |||
볼록 최적화 | 내부점 방법 · 경사하강법 | ||||
선형계획법 | 심플렉스법 | ||||
계산 수론 및 암호학 | 밀러-라빈 소수판별법 · Pollard-rho 알고리즘 · 쇼어 알고리즘 · LLL 알고리즘 · 해시(MD5 · 암호화폐 · 사전 공격(레인보우 테이블) · SHA) · 양자 암호 | ||||
대칭키 암호화 방식 | 블록 암호 알고리즘(AES · ARIA · LEA · Camellia) · 스트림 암호 알고리즘(RC4) | ||||
공개키 암호화 방식 | 공개키 암호 알고리즘(타원 곡선 암호 · RSA) · 신원 기반 암호 알고리즘(SM9) | ||||
계산기하학 | 볼록 껍질 · 들로네 삼각분할 및 보로노이 도형^Fortune의 line-sweeping 알고리즘^ · 범위 탐색^vp-tree, R-tree^ · k-NN | ||||
그래프 이론 | 탐색^BFS, DFS, 다익스트라 알고리즘, A* 알고리즘^ · 에드몬드-카프 · 크루스칼 알고리즘 · 위상 정렬 · 네트워크 이론 | ||||
정리 | |||||
정지 문제대각선 논법 · 암달의 법칙 · P-NP 문제미해결 · 콜라츠 추측미해결 | |||||
틀:이산수학 · 틀:수학기초론 · 틀:컴퓨터공학 | }}}}}}}}} |
1. 개요
Linker컴파일러가 생성한 기계어(목적 코드)들을 서로 연결시켜주는 프로그램. 컴파일러가 프로그래밍 언어를 해석해서 기계어로 번역하는 작업(컴파일)을 수행한다면 링커는 이렇게 나온 결과물들을 하나로 연결시켜 실행 파일을 만드는 작업(링킹, Linking)을 수행한다.
2. 상세
컴파일이란 프로그래밍 언어를 해석하여 기계어를 생성하는 작업을 말하며 이것을 자동으로 수행해주는 프로그램을 컴파일러라 한다. 그러나 컴파일러는 기계어(목적 코드)만 생성시켜주기만 할 뿐, 이걸로는 우리가 만든 프로그램을 실행할 수 없다. 컴파일러가 만든 결과물들을 하나로 합쳐 실행이 가능한 파일을 만드는 작업을 거쳐야 하는데 이를 링킹라고 하며, 이것을 자동으로 수행해주는 프로그램이 바로 링커이다.일반적으로 프로그램을 만드는 과정은 다음과 같다.
- 소스 코드를 작성한다.
- 컴파일을 한다. 그러면 컴파일러가 소스 코드를 해석하여 기계어를 생성하고 오브젝트(obj) 파일을 만들어서 저장한다.
- 이후 링커가 컴파일러가 만들어낸 결과물(오브젝트 파일)들을 하나로 합친다.
- 이로써 실행할 수 있는 프로그램이 만들어진다.
과거에는 컴파일 후 링킹을 별도로 수행해야 했으나 요즘은 링킹 과정 자체가 빌드 프로세스의 일부로 들어가 있어 직접 링커를 실행할 일은 드물다. 하지만 그렇다고 링킹 과정이 겉으로 드러나지 않을 뿐 아예 없는 것은 아니며, 사용자가 직접 수동으로 링킹을 수행하고자 한다면 얼마든지 할 수 있다. 특히 크로스 컴파일링을 진행할 때 플랫폼별로 링커가 달라 일일히 설정하게 될 수도 있다.
3. ODR (One Definition Rule)
프로그래밍 언어에서 주의해야 하는 점은 2개 이상의 같은 이름의 심볼이 존재해서는 안된다는 것이다. 이를 ODR (One Definition Rule)라고 부른다.예를 들어 한 소스 코드에 NamuWiki라는 심볼을 정의하고 또 다른 소스 코드에서 NamuWiki라는 심볼을 정의하면 컴파일에서는 문제가 없지만 링킹 단계에서 에러가 발생하게 된다. 이는 링커가 여러 소스 코드의 결과물을 하나로 합치는 과정에서 각 소스 코드에 있는 똑같은 이름의 심볼이 중복되었기 때문이다.
C/C++ 초보자가 흔히 자주 애를 먹게 되는 문제. 한 헤더 파일을 만들고 2개 이상의 소스코드에서 사용할 경우 발생하기 쉽다. 그래서 헤더 파일을 만들 때 아래와 같이 Include Guard를 작성하면 좋다.
#!syntax cpp
#ifndef HEADER_FILE_NAME_H
#define HEADER_FILE_NAME_H
// 헤더 파일 내용 작성...
#endif
이것 외에는 #pragma once도 있는데 위와 다르게 한줄만 쓰면 되므로 편리해진다. 다만 비표준 문법이라 일부 컴파일러에서 지원하지 않는 경우가 있으므로 주의해야 한다.
#!syntax cpp
#pragma once
// 헤더 파일 내용 작성...
참고로 비주얼 스튜디오에서 헤더 파일을 만들면 자동으로 맨 윗줄에 붙여있다.
또한 헤더 파일 안에 심볼을 정의만 해줘야 한다. 즉 int NamuWiki; 처럼 정의만 하고 int NamuWiki = 0; 처럼 정의와 동시에 초기화하면 안된다는 말이다. 이렇게 되면 링커 단계에서 에러가 발생한다. 따라서 헤더 파일에 정의만 하고 한 개의 소스 코드에서 값을 초기화시켜 주거나 static Storage class를 지정해 심볼이 노출되지 않도록 해 줘야 한다.
다만 인라인 함수는 ODR 문제에서 자유롭다. 인라인 함수을 헤더 파일에서 작성하고 여러 소스 코드에서 사용하더라도 컴파일러 단계에서 내부적으로 치환이 완료되고 심볼은 노출되지 않기 때문에 문제 없이 링킹을 해준다. 물론 같은 이름의 인라인 함수를 한 소스 코드에서 중복해서 작성하거나 이름만 같을 뿐 내용을 다르게 작성할 경우 링킹 단계 이전의 컴파일러 단계에서 에러가 난다.
4. 링커 소프트웨어 목록
- ld
- gold
- bfd
- lld
- mold