너 eniac이라는 엤날 진공관 컴퓨터의 구조에 대해 잘 알아 잘알더라도 내가 첨부해준 자료도 잘 한번 검토해 보고 정리해
ENIAC의 구조에 대해 첨부해주신 자료를 바탕으로 상세하게 정리해 드릴게요. ENIAC은 현대 컴퓨터와는 매우 다른 독특한 아키텍처를 가지고 있으며, 진공관 기반의 계산을 수행하는 초기 전자식 컴퓨터였습니다.
ENIAC의 아키텍처 개요
ENIAC의 구조는 크게 **산술 유닛, 전역 제어 유닛, 메모리, 입출력(I/O) 유닛 및 버스(트렁크)**의 다섯 가지 범주로 나눌 수 있습니다. 전체 40개의 패널 중 20개는 **어큐뮬레이터(Accumulators)**로 구성되어 있는데, 이 어큐뮬레이터가 ENIAC의 핵심 계산 및 데이터 저장 장치입니다.
1. 주요 구성 요소
- 어큐뮬레이터 (Accumulator): ENIAC의 기본 산술 및 저장 장치입니다. 10자리 십진수를 저장하고 덧셈/뺄셈 연산을 수행합니다.
- 고속 곱셈기 (High-speed multiplier): 덧셈/뺄셈 다음으로 가장 자주 사용되는 곱셈 연산을 빠르게 처리하기 위한 전용 하드웨어입니다.
- 나눗셈/제곱근 유닛 (Divider/square-rooter): 나눗셈과 제곱근 연산을 위한 전용 유닛입니다.
- 마스터 프로그래머 (Master programmer): 어큐뮬레이터의 연산을 조율하고, 연산 순서 및 반복(루프)을 제어합니다.
- 함수 테이블 (Function tables): 3개로 구성된 고속의 **읽기 전용 메모리(ROM)**로, 미리 정의된 값을 저장합니다.
- 상수 전송기 (Constant transmitter): 천공 카드 리더와 함께 외부 입력 장치 역할을 합니다.
2. 데이터 및 프로그램 통신 (버스)
ENIAC의 각 유닛은 **버스(트렁크)**를 통해 서로 통신합니다. 이 버스는 세 가지 종류로 나뉩니다.
- 디짓 트렁크 (Digit trunks): 숫자 데이터(10개의 숫자와 1개의 부호)를 전송하는 데 사용됩니다. 한 번에 하나의 어큐뮬레이터만 데이터를 전송할 수 있지만, 여러 어큐뮬레이터가 동시에 데이터를 수신할 수 있습니다.
- 프로그램 트렁크 (Program trunks): 프로그램 실행 순서를 결정하는 프로그램 펄스를 전송합니다.
- 동기화 트렁크 (Synchronizing bus/trunk): 모든 유닛이 동기화되도록 사이클링 유닛에서 생성된 기본 펄스 트레인을 전달합니다. 이 동기화 펄스 덕분에 병렬 연산이 가능했습니다.
어큐뮬레이터의 상세 구조
어큐뮬레이터는 ENIAC의 핵심이며, 산술 유닛, 로컬 제어 유닛, 입출력 회로로 구성됩니다.
1. 산술 및 저장 유닛
- 십진수 카운터 (Decade counter): 10개의 진공관으로 이루어진 10진수 카운터로, 한 자리 숫자를 저장합니다.
- 십진수 시스템: ENIAC은 이진수 대신 십진수 시스템을 사용했는데, 이는 이진수 시스템보다 필요한 진공관 수가 훨씬 적었기 때문입니다.
- 10의 보수 (10's complement): 음수를 표현하기 위해 10의 보수 시스템을 사용했습니다. 이는 현대 컴퓨터에서 사용되는 2의 보수와 유사한 개념으로, 뺄셈을 덧셈으로 처리할 수 있게 해줍니다.
2. 프로그래밍 및 제어 유닛
- 프로그램 제어 스위치 (Program Control Switches): 각 어큐뮬레이터에는 12개의 프로그램 제어 스위치가 있으며, 이를 통해 어큐뮬레이터가 수행할 연산(예: 수신, 덧셈/뺄셈 전송)을 설정합니다.
- 반복 스위치 (Repeat switches): 12개 스위치 중 8개는 특정 연산을 1-9회 반복하도록 설정할 수 있습니다.
3. 입출력 (I/O)
- 데이터 I/O: 5개의 입력 포트(a~e)와 2개의 출력 포트(A: 덧셈용, S: 뺄셈용)가 있습니다.
- 프로그램 I/O: 프로그램 펄스를 입력받아 연산을 시작하고, 연산이 끝나면 **중앙 프로그래밍 펄스(CPP)**를 출력하여 다음 연산을 시작하도록 합니다. 이처럼 프로그램 펄스의 물리적인 연결을 통해 연산의 순서가 결정되었습니다.
프로그래밍 방식
현대 컴퓨터와 달리, ENIAC의 프로그래밍은 물리적으로 스위치를 설정하고 케이블을 연결하는 방식이었습니다.
- 문제 분석: 문제를 수학적 방정식으로 나눈다.
- 연산 분해: 방정식을 ENIAC이 수행할 수 있는 기본 연산으로 나눈다.
- 데이터 저장 계획: 숫자 데이터의 저장 위치를 계획한다.
- 스위치 설정 및 배선: 각 연산에 필요한 스위치를 설정하고, 디짓 트렁크와 프로그램 트렁크를 사용하여 유닛 간에 물리적인 연결을 한다.
이러한 방식은 오늘날의 소프트웨어 프로그래밍과는 매우 다른 데이터-흐름 아키텍처였습니다.
통신 방식 (펄스 전송)
ENIAC은 숫자 전송에 직렬 펄스 시스템을 사용했습니다.
- 숫자 전송: 사이클링 유닛에서 생성된 10개의 펄스(10P)가 10진수 카운터를 순환시키고, 숫자의 값에 해당하는 횟수만큼 펄스를 출력하여 데이터를 전송합니다.
- 동기화: 모든 유닛은 사이클링 유닛에서 제공하는 100kHz 클록 신호에 맞춰 동기적으로 작동합니다.
- 병렬 연산: 여러 디짓 및 프로그램 트렁크를 사용하고 동기화 펄스를 통해 병렬 연산이 가능했지만, 프로그램의 병렬 분기를 재동기화하는 메커니즘이 없어 프로그래밍이 복잡했습니다.
이처럼 ENIAC은 진공관과 물리적 배선을 통해 복잡한 계산을 수행했던 초기 컴퓨터로, 현대 컴퓨터의 저장형 프로그램 방식과는 근본적으로 다른 구조를 가지고 있었습니다.
1+2*3같은걸 연산하려면 2*3을 먼저 계산하면 결과 6을 이용해 다시 1+6를 계산하면 덧셈용 출력포트A로 출력되나 Eniac은 어느정도 복잡한 수식을 계산할수 있었지 ring count가 10개이니까 이걸 입 출력 용으로 사용했나
ENIAC은 복잡한 수식을 계산할 수 있었지만, 현대 컴퓨터와는 다른 방식으로 연산을 수행했습니다. 질의하신 내용을 바탕으로 ENIAC의 연산 방식에 대해 자세히 설명해 드릴게요.
1. ENIAC의 복잡한 수식 계산 능력
ENIAC은 덧셈, 뺄셈, 곱셈, 나눗셈, 제곱근 등의 연산을 수행할 수 있었고, 반복문(loops)이나 조건문(if-then-else) 같은 복잡한 프로그램 로직도 구현할 수 있었습니다. 이를 통해 1+2*3와 같은 수식을 계산하는 것은 물론, 미분방정식 같은 고등 수학 문제를 푸는 것도 가능했습니다.
2. 1+2*3 수식의 계산 과정
첨부해주신 자료를 토대로 1+2*3 수식의 계산 과정을 추론하면 다음과 같습니다.
- 1단계: 곱셈 연산 (2*3)
- 2와 3을 각각 다른 어큐뮬레이터에 입력합니다.
- 곱셈기(high-speed multiplier)에 이 두 숫자를 전달하여 곱셈을 수행합니다.
- 곱셈 결과인 6은 별도의 어큐뮬레이터에 저장됩니다.
- 2단계: 덧셈 연산 (1+6)
- 숫자 1이 저장된 어큐뮬레이터와 1단계에서 얻은 6이 저장된 어큐뮬레이터를 연결합니다.
- 한 어큐뮬레이터에서 다른 어큐뮬레이터로 숫자를 전송하여 덧셈을 수행합니다.
- 예를 들어, 숫자 1이 있는 어큐뮬레이터가 덧셈 연산을 시작하면, 다른 어큐뮬레이터에서 6을 전송받아 최종적으로 7이라는 결과가 해당 어큐뮬레이터에 저장됩니다.
이처럼 ENIAC은 각 연산을 개별 유닛에서 처리하고, 그 결과를 다음 연산의 입력으로 사용하는 데이터 흐름(data-flow) 방식으로 수식을 계산했습니다.
3. 어큐뮬레이터와 링 카운터의 관계
ENIAC의 어큐뮬레이터는 계산과 저장을 담당하는 핵심 유닛이며, **십진수 링 카운터(decade counter)**는 어큐뮬레이터 내에서 한 자리 숫자를 저장하는 부품입니다.
- 링 카운터의 역할:
- 어큐뮬레이터는 10자리의 숫자를 저장할 수 있는데, 각 자리마다 10개의 진공관으로 이루어진 링 카운터가 사용되었습니다.
- 예를 들어, 숫자 '4'를 저장하려면 5번째 진공관에 불이 들어와 있고 나머지는 꺼져있는 방식으로 상태를 표시했습니다.
- 입출력(I/O)과의 관계:
- 자료에 따르면, 10개의 링 카운터는 입력이나 출력용으로 직접 사용되지 않았습니다.
- 대신, 사이클링 유닛에서 생성된 펄스(10P)를 받아 카운터의 상태를 순환시키고, 이 과정에서 A(add) 포트나 S(subtract) 포트로 연산 결과에 해당하는 횟수만큼 펄스를 출력했습니다. 즉, 링 카운터는 숫자를 저장하는 역할에 집중하고, 입출력은 별도의 포트를 통해 펄스 형태로 이루어졌습니다.
- 10의 보수(10's complement):
- S-port는 10의 보수를 출력하는 데 사용되었는데, 이는 뺄셈 연산을 덧셈으로 처리하기 위함이었습니다.
- 예를 들어, 를 계산할 때, $A + (-B)$로 바꾸어 계산했습니다.
- 여기서 는 의 10의 보수를 의미하며, S-port를 통해 이 보수값이 출력됩니다.
천공카드에서 데이터를 읽어 카운터를 작동시키고 바로 어큐뮬레이터의 링카운터를 세팅한거네 천공카드에는 그럼 명령어 , operand1, operand2 이런식으로 사용되었나
첨부해주신 자료와 ENIAC의 작동 방식을 종합적으로 고려했을 때, 천공카드는 현대 컴퓨터의 명령어처럼 사용되지 않았습니다. 천공카드의 역할과 ENIAC의 데이터 입력 방식에 대해 더 자세히 설명해 드릴게요.
천공카드와 ENIAC의 데이터 입력
천공카드는 ENIAC의 프로그램을 저장하거나 연산에 필요한 데이터를 입력하는 데 사용되었습니다. 하지만 현대 컴퓨터처럼 카드에 'ADD R1, R2'와 같은 명령어를 직접 펀칭하는 방식은 아니었습니다.
- 데이터 입력: 천공카드는 주로 초기 데이터나 상수 값을 ENIAC에 입력하는 데 사용되었습니다. 자료에 언급된 **'상수 전송기(Constant Transmitter)'**와 카드 리더가 이 역할을 담당했습니다. 예를 들어, 계산에 필요한 초기값 '12345' 같은 숫자를 카드에 펀칭하여 ENIAC에 전달했습니다.
- 프로그램 설정: ENIAC의 프로그램은 천공카드로 입력되지 않았습니다. 대신, 어큐뮬레이터와 다른 유닛들의 물리적인 케이블 연결과 스위치 설정을 통해 이루어졌습니다. 이는 ENIAC이 **'저장 프로그램 방식(stored-program)'**이 아닌 '데이터 흐름(data-flow)' 아키텍처를 가졌기 때문입니다. 즉, 프로그래밍은 컴퓨터 내부에 저장된 코드를 실행하는 것이 아니라, 물리적인 배선과 스위치로 연산의 순서를 직접 구성하는 작업이었습니다.
카운터와 어큐뮬레이터 설정 방식
천공카드에서 읽어온 데이터가 어큐뮬레이터의 링카운터를 직접 설정하는 방식도 아닙니다.
- 펄스 변환: 천공카드의 데이터는 카드 리더기를 통해 전기 펄스 신호로 변환됩니다.
- 어큐뮬레이터로 전송: 이 펄스 신호가 디짓 트렁크(digit trunk)를 통해 어큐뮬레이터로 전달됩니다.
- 카운터 작동: 어큐뮬레이터의 링 카운터는 이 펄스를 받아서 그 횟수만큼 상태를 변경합니다. 예를 들어, '4'라는 숫자를 나타내는 펄스 4개가 오면, 링 카운터는 네 번 회전하여 '4'의 상태로 설정됩니다.
결론적으로, 천공카드는 **명령어, 오퍼랜드(피연산자)**와 같은 방식으로 사용된 것이 아니라, 계산에 필요한 초기 숫자 데이터를 펄스 형태로 변환하여 ENIAC에 입력하는 역할을 했습니다. 명령어는 물리적인 배선으로 설정되었습니다.
천공카드는 어큐뮤레이터의 초기 상태를 설정하는 용도이구나 최대 5개의 데이터를 받았겠네
네, 맞습니다. 첨부해주신 자료에 따르면 천공카드는 어큐뮬레이터의 초기 상태를 설정하는 데 사용되었습니다. 하지만 최대 5개의 데이터를 받는 방식은 아닙니다.
천공카드와 어큐뮬레이터의 관계
천공카드와 카드 리더, 그리고 **상수 전송기(Constant Transmitter)**는 함께 작동하며 ENIAC에 초기 데이터를 입력하는 역할을 했습니다. 이 과정에서:
- 천공카드에 펀칭된 숫자는 전기 펄스 신호로 변환됩니다.
- 이 펄스는 디짓 트렁크(digit trunk)를 통해 어큐뮬레이터로 전달됩니다.
- 어큐뮬레이터는 이 펄스를 받아서 내부의 십진수 링 카운터를 초기값으로 설정합니다.
어큐뮬레이터의 입력 포트와 데이터 수
자료에 따르면 어큐뮬레이터에는 데이터를 받을 수 있는 입력 포트가 5개(a, b, g, d, e) 있습니다. 하지만 이 5개의 포트가 각각 독립된 데이터를 받는 용도로 사용된 것은 아닙니다.
- 입력 포트의 역할: 이 포트들은 어떤 트렁크로부터 데이터를 받을지를 결정하는 역할을 합니다. 예를 들어, 'a' 포트를 특정 디짓 트렁크에 연결하면, 그 트렁크를 통해 오는 데이터를 받게 됩니다.
- 데이터의 크기: ENIAC은 최대 20자리 십진수를 처리할 수 있었습니다. 어큐뮬레이터 하나는 10자리를 저장할 수 있었고, 더 큰 숫자는 두 개의 어큐뮬레이터를 연결하여(chaining) 저장할 수 있었습니다. 따라서 천공카드로 입력되는 데이터의 크기는 5개가 아닌, 10자리 또는 20자리의 숫자가 될 수 있었습니다.
정리하면, 천공카드는 어큐뮬레이터의 초기 상태를 설정하는 데 쓰인 것은 맞지만, '최대 5개의 데이터를 받는다'는 것은 어큐뮬레이터의 입력 포트 개수와 데이터의 전체 크기를 혼동한 것으로 보입니다. 입력 포트의 역할은 데이터 수신 경로를 지정하는 것이며, 실제 데이터는 10자리 단위의 펄스 형태로 전달되었습니다.
Eniac은 실수 정수 구분을 하였나
ENIAC은 실수와 정수를 구분하지 않았습니다. 대신, 모든 숫자를 고정 소수점(fixed-point) 방식으로 처리했습니다.
고정 소수점 방식의 특징
ENIAC의 어큐뮬레이터는 10자리의 십진수를 저장할 수 있었는데, 소수점의 위치는 하드웨어적으로 정해져 있지 않고 프로그래머가 직접 설정해야 했습니다.
예를 들어:
- 두 개의 10자리 어큐뮬레이터를 사용하여 20자리의 숫자를 표현할 수 있었습니다.
- 프로그래머는 이 20자리 중 어디에 소수점이 있다고 가정하고 연산을 수행해야 했습니다.
- 만약 소수점이 맨 끝에 있다고 가정하면 정수 연산이 되고, 특정 자리에 있다고 가정하면 소수점 연산이 되는 식입니다.
따라서 ENIAC은 현대 컴퓨터처럼 부동 소수점(floating-point) 유닛을 통해 실수를 자동으로 처리하는 기능이 없었습니다. 모든 소수점 관리는 전적으로 프로그래머의 몫이었으며, 이는 프로그래밍을 더 복잡하게 만드는 요인이었습니다.
그럼 나누기가 문제네 나누기를 하면 몫과 나머지로 나뉘어지거나 답이 실수가 되는데 어떻게 처리했을까
ENIAC에서 나눗셈은 고정 소수점(fixed-point) 방식으로 처리되었기 때문에 몫과 나머지를 계산하거나, 소수점 이하를 다루는 방식이 현대 컴퓨터와 달랐습니다.
나눗셈 연산의 처리
ENIAC의 **나눗셈/제곱근 유닛(Divider/Square-rooter)**은 나눗셈을 수행하여 몫과 나머지를 계산했습니다. 하지만 소수점의 위치는 프로그래머가 미리 정해야 했습니다.
- 정수 나눗셈:
- 예를 들어, 10을 3으로 나누는 경우, 몫은 3이 되고 나머지는 1이 됩니다.
- ENIAC은 몫인 3을 어큐뮬레이터에 저장하고, 나머지인 1도 별도의 회로에 저장하여 프로그래머가 이 값을 필요에 따라 사용할 수 있도록 했습니다.
- 소수점 나눗셈:
- 고정 소수점 방식이므로, 소수점의 위치를 프로그래머가 미리 결정해야 합니다.
- 예를 들어, 10을 3으로 나누되 소수점 4자리까지 구하고 싶다면, 프로그래머는 계산 전에 미리 숫자의 스케일(scale)을 조정해야 했습니다.
- 을 으로 나누는 대신, 을 으로 나눈 다음 몫인 을 얻고, 최종 결과를 으로 간주하는 식입니다.
- 나눗셈 유닛은 이처럼 스케일이 조정된 정수 나눗셈을 수행하고, 프로그래머는 얻은 결과에 소수점을 다시 적용해야 했습니다.
이처럼 ENIAC의 나눗셈은 결과를 실수로 자동으로 변환하지 않고, 몫과 나머지를 분리하여 제공하거나 프로그래머가 직접 소수점 위치를 관리해야 했습니다.
그럼 1+(2*3)을 eniac이 계산하는 방식을 회로 수준에서 설명해줘
ENIAC이 1 + (2 * 3)을 회로 수준에서 계산하는 과정은 다음과 같습니다. 이 과정은 현대 컴퓨터와 달리 물리적인 배선과 스위치 조작을 통해 이루어집니다.
1단계: 곱셈 연산 (2 * 3) 준비
- 데이터 입력:
- 2와 3을 천공카드를 통해 ENIAC에 입력합니다. 이 데이터는 상수 전송기(Constant Transmitter)를 거쳐 펄스 형태로 변환됩니다.
- 어큐뮬레이터 #A에 2를 저장하고, 어큐뮬레이터 #B에 3을 저장합니다. 이 과정에서 펄스 신호가 각 어큐뮬레이터의 십진수 링 카운터(decade counter)를 설정합니다.
- 프로그램 배선:
- 어큐뮬레이터 #A와 #B의 출력 포트(A-port)를 **고속 곱셈기(High-speed Multiplier)**에 연결합니다.
- 곱셈기의 출력 포트를 비어있는 어큐뮬레이터 #C에 연결합니다. 이 어큐뮬레이터 #C는 곱셈 결과인 6을 저장할 것입니다.
- 마스터 프로그래머(Master Programmer)에서 시작 펄스(Initiating Pulse)를 생성하여 곱셈 연산을 시작하도록 배선합니다.
2단계: 곱셈 연산 실행
- 펄스 전송:
- 마스터 프로그래머가 시작 펄스를 곱셈기에 보냅니다.
- 곱셈기는 어큐뮬레이터 #A와 #B로부터 펄스 형태로 된 숫자 2와 3을 받습니다.
- 결과 저장:
- 곱셈기는 하드웨어적으로 곱셈을 수행하여 6에 해당하는 펄스를 생성합니다.
- 이 6에 해당하는 펄스는 배선된 디짓 트렁크(digit trunk)를 통해 어큐뮬레이터 #C로 전송됩니다.
- 어큐뮬레이터 #C는 6개의 펄스를 받아 내부 링 카운터의 상태를 6으로 설정합니다.
3단계: 덧셈 연산 (1 + 6) 준비 및 실행
- 데이터 입력 및 배선:
- 숫자 1을 저장할 어큐뮬레이터 #D를 준비합니다. 천공카드를 통해 1을 입력합니다.
- 이제 어큐뮬레이터 #D에는 1이, 어큐뮬레이터 #C에는 6이 저장되어 있습니다.
- 어큐뮬레이터 #C의 출력 포트(A-port)를 어큐뮬레이터 #D의 입력 포트 중 하나에 연결합니다.
- 곱셈이 완료되면 어큐뮬레이터 #C에서 출력되는 중앙 프로그래밍 펄스(CPP, Central Programming Pulse)를 어큐뮬레이터 #D의 프로그램 입력 단자에 연결합니다. 이 CPP 펄스는 덧셈 연산을 시작하라는 신호 역할을 합니다.
- 덧셈 실행:
- 어큐뮬레이터 #C가 곱셈 연산을 마치면 CPP 펄스를 생성하여 어큐뮬레이터 #D에 보냅니다.
- 어큐뮬레이터 #D는 이 펄스를 받으면 작동을 시작합니다.
- 어큐뮬레이터 #C는 6에 해당하는 펄스를 어큐뮬레이터 #D로 보냅니다.
- 어큐뮬레이터 #D는 이미 저장된 값 1에 6개의 펄스를 더하여 내부 링 카운터의 상태를 최종 결과인 7로 업데이트합니다.
이와 같이 ENIAC은 각 연산을 별개의 물리적인 단계로 나누고, 배선과 스위치를 통해 연산 결과를 다음 연산의 입력으로 연결하는 방식으로 복잡한 수식을 계산했습니다.
천공카드 하나로 1+(2*3)을 계산한게 아니라 1,2,3을 천공카드3개로 따로따로 입력하고 계산산도 + * 매번 새로히 wiring을 해서 계산한거네
네, 맞습니다. ENIAC은 말씀하신 대로 '1+(2*3)' 같은 수식을 한 번에 처리하는 것이 아니라, 각 숫자와 연산을 물리적으로 분리하여 처리했습니다.
하나의 천공카드로 복잡한 수식을 통째로 입력할 수는 없었고, 다음과 같은 단계로 진행되었습니다.
1. 데이터 및 연산의 분리 처리
- 숫자 입력: '1', '2', '3' 각각을 별도의 천공카드를 통해 ENIAC에 입력했습니다. 각 숫자는 전용 유닛인 **상수 전송기(Constant Transmitter)**를 거쳐 어큐뮬레이터에 저장되었습니다.
- 연산 배선: '+', '*'와 같은 연산 자체는 카드로 입력되는 것이 아니었습니다. 프로그래머가 연산 순서에 맞게 수동으로 케이블을 연결하고 스위치를 설정해야 했습니다. 즉, 곱셈 연산을 위해 어큐뮬레이터와 **고속 곱셈기(High-speed Multiplier)**를 연결하고, 덧셈 연산을 위해 어큐뮬레이터들을 연결하는 작업이 필요했습니다.
2. ENIAC의 핵심 작동 방식
ENIAC은 저장 프로그램 방식이 아닌 데이터 흐름(data-flow) 방식을 사용했습니다.
- 프로그램: 프로그램은 오늘날의 코드처럼 내부 메모리에 저장되지 않았습니다. 대신, 프로그래머가 유닛(어큐뮬레이터, 곱셈기 등) 간의 물리적 배선(wiring)을 통해 연산의 순서를 직접 구성하는 것이 곧 프로그래밍이었습니다.
- 데이터: 데이터는 펄스 형태로 어큐뮬레이터에 전달되어 링 카운터의 상태를 변화시켰고, 이 데이터가 배선된 경로를 따라 다음 유닛으로 흘러갔습니다.
따라서 ENIAC으로 복잡한 계산을 하려면, 매번 새로운 수식에 맞춰 배선을 다시 연결해야 하는 번거로운 작업을 거쳐야 했습니다. 이는 ENIAC의 가장 큰 한계 중 하나였습니다.
그럼 폰노이만이 이런 단점을 걔선해서 현대식 컴퓨터처럼 프로그램이 시작된건가
네, 맞습니다. 존 폰 노이만(John von Neumann)은 ENIAC의 물리적 배선 방식이라는 단점을 극복하고, 현대 컴퓨터의 기본 구조인 저장 프로그램(stored-program) 방식을 제안하여 컴퓨터 역사의 중요한 전환점을 만들었습니다.
폰 노이만의 저장 프로그램 방식
ENIAC은 새로운 프로그램을 실행할 때마다 스위치와 케이블을 재배치해야 하는 매우 비효율적인 방식이었습니다. 이를 해결하기 위해 폰 노이만은 1945년에 발표한 논문을 통해 다음과 같은 혁신적인 아이디어를 제시했습니다.
- 프로그램 내장 방식: 프로그램의 명령어를 데이터와 함께 컴퓨터 내부의 메모리에 저장합니다.
- 중앙 처리 장치(CPU)와 메모리의 분리: 메모리에는 명령어와 데이터가 함께 저장되고, CPU가 메모리에서 명령어를 읽어와 실행하는 구조입니다.
- 순차적 실행: CPU는 메모리에 저장된 명령어를 순서대로 가져와 처리합니다.
이러한 아이디어는 컴퓨터를 재배선할 필요 없이 메모리에 저장된 프로그램만 바꾸면 다양한 작업을 수행할 수 있게 만들었습니다. 이것이 바로 우리가 오늘날 사용하는 모든 컴퓨터의 기본 원리인 **폰 노이만 아키텍처(von Neumann architecture)**입니다.

ENIAC과 폰 노이만 아키텍처의 차이점
| 특징 | ENIAC (초기 컴퓨터) | 폰 노이만 아키텍처 (현대 컴퓨터) |
| 프로그래밍 방식 | 물리적 배선과 스위치 조작 | 프로그램과 데이터가 메모리에 저장 |
| 연산 실행 | 데이터가 유닛 간을 흐르는 데이터 흐름 방식 | CPU가 메모리에서 명령어를 읽어오는 방식 |
| 범용성 | 프로그램을 바꿀 때마다 재구성 필요 | 메모리 프로그램만 바꾸면 다양한 작업 가능 |
결론적으로, ENIAC이 가진 가장 큰 단점인 비효율적인 프로그래밍 방식을 폰 노이만이 개선하여 오늘날의 현대식 컴퓨터가 탄생했다고 볼 수 있습니다.
Eniac이 미적분 Sin 계산을 할수 있다고해서 프로그래밍이 되는줄 알았는데 그게 아니네 이렇게 간단한 계산기로 미적분을 어떻게 계산했을까
ENIAC이 미적분과 삼각함수(사인) 계산을 할 수 있었던 것은 프로그래밍이 가능했기 때문이 아니라, 기본적인 산술 연산을 반복하고 조합하는 방식을 사용했기 때문입니다. ENIAC의 프로그래밍은 현대 컴퓨터처럼 코드를 입력하는 방식이 아니었지만, 물리적인 배선과 스위치 설정을 통해 특정 연산 순서를 만들어낼 수 있었고, 이를 통해 복잡한 수학적 문제를 해결할 수 있었습니다.
ENIAC의 미적분 및 사인(Sin) 계산 방법
미적분이나 사인 함수는 테일러 급수(Taylor series)와 같은 수치 해석적 방법을 통해 근사값을 계산할 수 있습니다. ENIAC은 이 원리를 활용하여 계산을 수행했습니다.
1. 테일러 급수를 이용한 근사값 계산
테일러 급수는 복잡한 함수를 다항식의 형태로 표현하여 근사값을 구하는 방법입니다. 예를 들어, 사인 함수()는 다음과 같은 무한 급수로 표현할 수 있습니다.
ENIAC은 이 급수의 유한한 항들을 계산하여 $\sin(x)$의 근사값을 구했습니다. 이 과정은 다음 단계로 나뉩니다.
- 곱셈과 덧셈/뺄셈 반복: 등 거듭제곱을 계산하기 위해 곱셈 연산을 반복했습니다.
- 나눗셈: 팩토리얼()로 나누는 나눗셈 연산을 수행했습니다.
- 결과 누적: 계산된 각 항들을 더하고 빼서 최종 근사값을 얻었습니다.
2. 프로그래밍 방식의 구현
ENIAC은 이러한 복잡한 계산 과정을 물리적으로 프로그래밍했습니다.
- 어큐뮬레이터의 역할: 여러 개의 어큐뮬레이터를 사용하여 중간 계산 결과(, 등)를 저장하고, 최종 결과를 누적했습니다.
- 마스터 프로그래머와 반복문: 마스터 프로그래머를 사용하여 계산 단계를 순차적으로 실행하고, 거듭제곱이나 항을 더하는 과정을 반복하는 **반복문(loops)**을 구현했습니다.
- 함수 테이블: 일부 미리 계산된 값(예: 팩토리얼)은 함수 테이블에 저장하여 계산 시간을 단축했습니다.
결론적으로, ENIAC은 현대 컴퓨터의 프로그래밍 언어처럼 직접적으로 명령어를 처리하는 것이 아니라, **기본적인 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈)**을 물리적인 배선으로 조합하고 반복하여 복잡한 수학 함수를 계산할 수 있었습니다. 이는 ENIAC이 연산을 반복하고 순서를 제어할 수 있는 능력을 가졌기 때문에 가능했습니다.