처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.04.25 32
#AI

8087 없이도 계산하기, 8086 시절 FPU 소프트웨어 에뮬레이션의 지혜

Hacker News 원문 보기
8087 없이도 계산하기, 8086 시절 FPU 소프트웨어 에뮬레이션의 지혜

레트로 컴퓨팅에 관심 있는 분이라면 한번쯤 들어봤을 법한 이야기인데요. OS/2 Museum 블로그에서 1980년대 PC 역사의 한 조각을 자세히 풀어놓은 글이 올라왔어요. 주제는 "8087 코프로세서 없이 8086에서 부동소수점 연산을 어떻게 처리했는가"인데, 이게 지금 우리가 당연하게 쓰는 FPU(부동소수점 연산 장치) 내장 CPU의 조상님 이야기라서 꽤 흥미로워요.

배경: 8087이 뭐죠

1978년에 인텔이 내놓은 8086은 최초의 16비트 x86 CPU였는데, 정수 연산만 할 수 있었어요. 부동소수점 연산(소수점이 있는 숫자 계산)이 필요하면 8087이라는 별도의 칩을 메인보드에 꽂아야 했죠. 이게 뭐냐면, 지금은 CPU 안에 계산기 회로가 다 들어가 있지만, 당시엔 정수용 계산기와 소수점용 계산기가 따로 있어서 필요하면 두 개를 같이 써야 했다는 뜻이에요.

문제는 8087이 비쌌다는 거예요. 일반 사용자가 쉽게 살 수 있는 물건이 아니었고, 그래서 대부분의 PC에는 8087 소켓이 비어 있었어요. 그런데 과학 계산이나 CAD 프로그램은 부동소수점 연산을 써야 하잖아요. 어떻게 해결했을까요?

트랩 기반 에뮬레이션의 구조

정답은 소프트웨어 에뮬레이션이었어요. 방법이 꽤 영리한데요, 8087의 명령어들은 모두 ESC라는 옵코드로 시작했어요. 만약 8087이 장착돼 있으면 이 명령어를 8087이 가로채서 처리했고, 8087이 없으면 CPU 입장에선 그냥 무시해도 되는 코드처럼 넘어갔죠.

여기서 컴파일러 제작자들은 꾀를 냈어요. ESC 명령어를 그냥 쓰지 않고 그 앞에 INT(소프트웨어 인터럽트) 명령을 끼워넣는 방식으로 코드를 생성한 거예요. 이러면 인터럽트 핸들러가 실행되면서 "아, 이게 8087 명령어였구나" 하고 판단한 뒤, CPU가 소프트웨어로 계산을 대신 해줬죠. 이렇게 하면 8087이 있는 PC에서는 진짜 하드웨어가 빠르게 계산하고, 8087이 없는 PC에서는 느리지만 어쨌든 같은 바이너리가 돌아가는 거예요.

80286이 등장하면서 상황이 조금 바뀌었어요. 80286에는 "8087이 감지되지 않으면 자동으로 예외를 걸어주는" 기능이 있어서, INT를 일부러 끼워넣을 필요 없이 ESC 명령어를 그대로 쓰면 CPU가 알아서 트랩을 발생시켰거든요. 덕분에 코드 크기도 줄고 실행 속도도 빨라졌죠. Borland나 Microsoft의 C 컴파일러들이 이런 에뮬레이션 라이브러리를 기본 탑재해서 배포한 덕분에, 개발자는 8087 유무를 크게 신경 쓰지 않고도 부동소수점 코드를 짤 수 있었어요.

왜 이 이야기가 지금도 재밌나

지금 우리가 쓰는 CPU는 FPU를 당연히 내장하고 있어요. 인텔 80486부터는 FPU가 CPU 안에 통합됐고, 이후로는 "부동소수점 연산이 하드웨어냐 소프트웨어냐"를 신경 쓸 일이 거의 없어졌죠. 하지만 그 당시엔 이런 추상화가 없었기 때문에 컴파일러, OS, 하드웨어가 협력해서 우회로를 만들어야 했어요.

이 이야기가 주는 교훈이 있어요. 오늘날 우리가 당연하게 여기는 GPU, NPU, AI 가속기 같은 것들도 지금은 하드웨어가 있냐 없냐에 따라 코드 경로가 갈리잖아요. CUDA 코드가 CPU에서도 돌아가도록 fallback을 만들거나, Apple Silicon의 Neural Engine이 없을 때 CPU로 돌리는 코드 같은 거요. 본질적으로 80년대 8087 에뮬레이션이 했던 일과 똑같은 문제를 지금도 풀고 있는 거예요.

한국 개발자에게

당장 8087 에뮬레이터를 짤 일은 없겠지만, 이런 저수준 역사 이야기를 읽어두면 시스템 프로그래밍 감각이 생겨요. 특히 인터럽트와 트랩, 그리고 "명령어가 없을 때 소프트웨어로 대체하는 패턴"은 현대의 가상화, 에뮬레이션, JIT 컴파일러에도 그대로 녹아 있는 개념이거든요. QEMU가 어떻게 x86 코드를 ARM에서 돌리는지, Rosetta 2가 어떻게 Intel 바이너리를 Apple Silicon에서 실행하는지 이해하는 데도 이런 기초가 도움이 돼요.

한줄 정리하면, 지금 우리가 쓰는 모든 추상화는 옛날 개발자들의 고생 위에 세워져 있다는 사실이에요. 여러분이 가장 인상 깊게 봤던 "옛날 코드의 트릭"은 뭐였나요?


🔗 출처: Hacker News

이 뉴스가 유용했나요?

이 기술을 직접 배워보세요

AI 도구, 직접 활용해보세요

AI 시대, 코딩으로 수익을 만드는 방법을 배울 수 있습니다.

AI 활용 강의 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.