>백엔드 개발 >C++ >지금까지 본 것 중 가장 작은 트랜스파일러

지금까지 본 것 중 가장 작은 트랜스파일러

DDD
DDD원래의
2024-12-17 21:28:15527검색

The tiniest transpiler you

오늘 아침에 C 트랜스파일러에 대한 Brainf**k를 썼습니다. 총 1시간 정도 걸렸습니다.

전체 내용은 C50줄 이내입니다. 여기서 보실 수 있습니다.

BrainF**k이 무엇인가요?

난해한 코딩 언어입니다. 1993년 스위스 학생이 발명한 이 기술은 튜링 완전체로 간주되는 데 필요한 최소한의 수준입니다.

현존하는 에소랑 중 가장 유명한 것이기도 합니다.

구문은 매우 간단합니다. 8자만 포함하고 나머지는 무시됩니다.

>++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]<
++.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++
>-]<+.

무엇을 하는지 추측해 보세요. 추측해 보세요.

Hello, World입니다! 프로그램입니다.

기본적으로 Brainf**k에는 30000바이트 배열과 커서가 제공됩니다. >를 사용하여 커서를 이동할 수 있습니다. 그리고 <. 셀의 값을 늘리거나 줄이는 및 -를 사용하여 메모리를 수정할 수 있습니다. [ 및 ]를 사용하여 루프를 만들 수 있습니다. 마지막으로 를 사용하여 단일 바이트를 입력으로 읽고 ..
을 사용하여 현재 셀의 값을 인쇄할 수 있습니다.

> ; Increments cursor position
< ; Decrements cursor position
+ ; Increments cell value
- ; Decrements cell value
. ; Prints the current cell value as an ASCII character
, ; Reads a singly byte and stores it in the current cell
[ ; Opens a loop that continues until the cell value is 0
] ; Closes a loop

brainf**k에 대한 거의 모든 것입니다.
이전에는 Assembly에서 더 많은 기능적인 프로그램을 작성한 적이 있습니다.

왜? 왜요?

이 컴파일러는 전적으로 심심해서 작성했고 수많은 통역사를 찾았기 때문에 세상에는 두뇌 빌어먹을 컴파일러가 필요하다고 생각했습니다.

물론, 정말로 훌륭한 두뇌 컴파일러를 원한다면 확인해 보세요
이거요.

왜 C인가?

많은 이유:

  • 연습을 더 하고 싶어요
  • 빠릅니다
  • 대부분 휴대 가능
  • 널리 퍼져있습니다
  • 어쨌든 코드는 별로 필요하지 않았습니다.

그리고 마지막 이유는 정수 오버플로입니다. 일반적으로 이것은 사람들이 싫어하는 나쁜 것입니다. 아마도 이것이 단위 테스트(으)가 발명된 이유일 것입니다. 하지만 Brainf**k는 다릅니다. 메모리 테이프에 있는 숫자의 상한은 255이며, 이를 통과하면 0으로 재설정될 것으로 예상됩니다. 또한 값이 0 미만으로 떨어지면 255로 재설정되어야 합니다. C는 이를 자체적으로 수행합니다. ; 코드를 작성할 필요가 없었습니다.

어떻게?

더 높은 수준의 개요:

  • 파일 또는 표준 입력에서 메모리로 코드 읽기
  • 각 문자를 C 코드로 변환
  • 완성된 C 코드를 인쇄하세요.

파일에서 두뇌 빌어먹을 코드를 코드[]로 읽어옵니다.

그런 다음 기본 C 프로그램을 설정합니다.

#include <stdio.h>
int main() {char t[30000]={0};int p=0;

닫는 괄호가 누락된 것을 눈치채셨을 것입니다. 그 이유는 해당 char[]에 더 많은 코드가 추가되기 때문입니다.

궁금하시다면 char t[30000] 은 여러분에게 주어진 메모리입니다. t를 테이프의 약어로 사용했는데, 이 프로그램은 사람이 읽을 수 없도록 제작되었기 때문에 줄였습니다.

다음으로 단일 문자의 배열인 코드 배열을 반복합니다. 각 문자에 대해 C 코드로 변환합니다.

character becomes
> p
< p--
- t[p]--
t[p]
. putchar(t[p])
, t[p]=getchar()
[ while(t[p] != 0)
] }

위를 보면 이러한 기호의 역할을 이해할 수 있습니다.

이러한 값은 유효한 C 코드를 포함하는 프로그램 출력에 추가됩니다.

마지막으로 다음 코드가 최종 출력에 추가됩니다.

>++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]<
++.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++
>-]<+.




출력된 프로그램의 끝입니다. 그런 다음 트랜스파일러는 사용자가 원하는 대로 조작할 수 있도록 이 코드를 stdout에 인쇄합니다.

최종 생각

이 글을 쓰면서 느낀 개선 아이디어가 몇 가지 있습니다. 더 빠르게 만들기 위해 제가 할 수 있는 일이 별로 없다고 생각하지만, 더 안전하고 더 좋게 만들기 위해 제가 할 수 있는 일은 있습니다.

여기에서 최종 코드를 볼 수 있습니다.

원하시면 어떤 형태로든 기여하실 수도 있습니다.

읽어주셔서 감사합니다!

위 내용은 지금까지 본 것 중 가장 작은 트랜스파일러의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:함수 템플릿과 함께 Lambda 함수를 사용할 때 C 11이 유형을 추론하지 못하는 이유는 무엇입니까?다음 기사:함수 템플릿과 함께 Lambda 함수를 사용할 때 C 11이 유형을 추론하지 못하는 이유는 무엇입니까?

관련 기사

더보기