turing-machine/Implementation/ReadMe.md

116 lines
5.0 KiB
Markdown

# 튜링 머신 시뮬레이터
학생이 튜링 머신을 직접 사용해보면서 동작 원리를 이해할 수 있는 교육용 웹 애플리케이션입니다.
## 프로젝트 구조
```
Implementation/
├── TuringMachine.sln # 솔루션 파일
├── Core/ # 핵심 시뮬레이션 엔진 (클래스 라이브러리)
│ ├── Machine.cs # 튜링 머신 본체 (상태, 헤드, 실행)
│ ├── Tape.cs # 무한 테이프 (Dictionary 기반 희소 구조)
│ ├── Transition.cs # 상태 전이 규칙 정의
│ └── ExampleConfig.cs # 예제 설정 모델
├── Client/ # Blazor WebAssembly 프론트엔드
│ ├── Pages/
│ │ └── Home.razor # 메인 페이지 (시각화 + 편집)
│ ├── Components/
│ │ ├── Controls.razor # Step/Run/Reset 버튼, 속도 조절
│ │ ├── TapeVisualizer.razor # 테이프 셀 시각화, 헤드 위치 표시
│ │ ├── TransitionTableVisualizer.razor # Action Table 출력 (No./Comment 포함)
│ │ ├── ThemeToggle.razor # 다크/라이트 모드 전환
│ │ └── LanguageToggle.razor # 다국어 전환 (en-US, ko-KR)
│ ├── Services/
│ │ └── LocalizationService.cs # 다국어 서비스 (JSON 번역 파일 로드)
│ ├── Shared/
│ │ └── MainLayout.razor # 레이아웃
│ └── wwwroot/ # 정적 파일 (index.html, CSS)
│ └── i18n/ # 번역 파일
│ ├── en-US.json # 영어 번역
│ └── ko-KR.json # 한국어 번역
└── Server/ # ASP.NET Core 백엔드
├── Program.cs # 서버 설정, 미들웨어
├── Controllers/
│ └── ExamplesController.cs # GET /api/examples 엔드포인트
└── Examples/
└── Examples.json # 예제 설정 파일
```
## 기술 스택
- **.NET 8.0** / **C# 12**
- **Blazor WebAssembly** — 브라우저에서 C#을 직접 실행하는 SPA 프레임워크
- **ASP.NET Core** — 정적 파일 서빙 및 예제 API 제공
- **Bootstrap 5** — 기본 UI 스타일링
- **다국어 지원 (i18n)** — 영어(en-US), 한국어(ko-KR) 지원, JSON 기반 번역 파일
## 주요 기능
### 시각화 (상단 영역)
- **상태 패널**: 현재 상태, 실행 스텝 수, 정지 여부 표시
- **테이프 시각화**: 15칸 뷰포트로 테이프를 표시하며, 헤드 위치를 하이라이트
- **컨트롤**: Step(한 단계 실행), Run/Pause(자동 실행), Reset(초기화), 속도 조절(50~1000ms)
- **Action Table**: 전이 규칙을 번호와 함께 테이블로 표시, 현재 실행 중인 규칙 하이라이트, Comment 컬럼으로 각 규칙에 대한 설명 표시
### 편집 (하단 영역)
- **테이프 설정**: 초기 테이프 내용과 헤드 시작 위치 지정
- **Action Table 입력**: CSV 형식으로 전이 규칙 작성
```
현재상태, 읽기기호, 새상태, 쓰기기호, 이동방향(L/R/S), 주석(선택)
```
- **예제 버튼**: 서버의 `Examples.json`에서 로드된 예제를 버튼으로 빠르게 적용
### 예제 관리
예제는 `Server/Examples/Examples.json` 파일에서 관리됩니다. 서버 재시작 없이 JSON 파일을 수정하고 페이지를 새로고침하면 바로 반영됩니다.
```json
{
"Name": [
{ "Language": "en-US", "Value": "Example Name" },
{ "Language": "ko-KR", "Value": "예제 이름" }
],
"TapeInput": "초기 테이프",
"HeadPosition": 0,
"Actions": [
{
"Value": "상태, 읽기, 새상태, 쓰기, 이동",
"Comment": [
{ "Language": "en-US", "Value": "English comment" },
{ "Language": "ko-KR", "Value": "한국어 주석" }
]
}
]
}
```
### 내장 예제
1. **Binary Increment / 이진수 증가** — 이진수 1 증가
2. **String Reverse / 문자열 뒤집기** — 문자열 역순 복사
3. **Palindrome Check / 회문 검사** — 회문 검사
4. **Pattern Match / 패턴 탐색** — "ab" 패턴 탐색
5. **Count 0s vs 1s / 0과 1 개수 비교** — 0과 1의 개수 비교
## 빌드 및 실행
```bash
# 빌드
dotnet build
# 실행 (Server 프로젝트 기준)
dotnet run --project Server
```
브라우저에서 `http://localhost:11100` 으로 접속합니다.
## 핵심 설계
### Core 라이브러리
- **Tape**: `Dictionary<int, char>` 기반의 희소 자료구조로 무한 테이프를 효율적으로 표현
- **TransitionTable**: (현재상태, 읽기기호) 쌍을 키로 하여 전이 규칙을 O(1)로 검색
- **Machine**: `Step()` 메서드로 한 단계씩 실행하며, 매칭되는 규칙이 없으면 자동 정지(halt)
### 클라이언트-서버 통신
- 클라이언트는 `OnInitializedAsync`에서 `GET /api/examples`를 호출하여 예제 목록을 로드
- 튜링 머신 시뮬레이션 자체는 클라이언트(WebAssembly)에서 실행되므로 서버 통신 없이 동작