aheui

Aheui compiler & assembler toolkit.


Keywords
aheui, jit, python, rpython
License
BSD-2-Clause
Install
pip install aheui==1.2.0

Documentation

μ•ŒνŒŒν¬ - μ•ŒνŒŒν¬μ¬(rpython)으둜 λ§Œλ“  μ—”ν„°ν”„λΌμ΄μ¦ˆκΈ‰ κ³ μ„±λŠ₯ 아희

Build Status

μ•ŒνŒŒν¬μ¬(RPython)은 PyPyλ₯Ό κ°œλ°œν•˜κΈ° μœ„ν•΄ 개발/μ‚¬μš©λœ python의 λ°©μ–ΈμœΌλ‘œμ„œ 정적 μ–Έμ–΄λ‘œ 컴파일되고 tracing-JITλ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•œ 라이브러리λ₯Ό λ‚΄μž₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ•ŒνŒŒν¬μ¬μœΌλ‘œ κ°œλ°œν•œ μ–Έμ–΄λŠ” μ†μ‰½κ²Œ 파이썬으둜 μ‹€ν–‰ν•˜κ±°λ‚˜ λ°”μ΄λ„ˆλ¦¬λ‘œ λΉŒλ“œν•  수 있고, JITλ₯Ό μ μš©ν•˜κΈ°λ„ μ‰½μŠ΅λ‹ˆλ‹€.

이 ν”„λ‘œμ νŠΈλŠ” RPython으둜 JIT 인터프리터λ₯Ό κ°œλ°œν•˜λŠ” 예제둜 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μœ„μ˜ λ§ν¬μ—μ„œ LOG.mdλ₯Ό 확인해 더 μ•Œμ•„λ³΄μ„Έμš”.

  • νŒŒμ΄μ¬μ΄λž€?

아직 νŒŒμ΄μ¬μ„ λͺ¨λ₯΄μ„Έμš”? μ•ŒνŒŒν¬ κ°œλ°œμžκ°€ λ²ˆμ—­ν•œ μ±…μœΌλ‘œ νŒŒμ΄μ¬μ„ 곡뢀해 λ΄…μ‹œλ‹€.

git clone https://github.com/aheui/rpaheui
make # RPYTHON ν™˜κ²½λ³€μˆ˜ μ„€μ • ν•„μš”. rpython은 pypy μ†ŒμŠ€μ½”λ“œλ₯Ό λ‚΄λ €λ°›μœΌλ©΄ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 버전은 github actions 섀정을 μ°Έκ³ ν•΄ μ£Όμ„Έμš”.
./bin/aheui-c <아희 μ½”λ“œ 파일>
./bin/aheui-bigint-c <큰 μ •μˆ˜κ°€ ν•„μš”ν•œ 아희 μ½”λ“œ 파일>

JIT둜 속도 올리기

PyPy κΈ°μˆ μ€ PyPyλ₯Ό CPython보닀 λΉ λ₯΄κ²Œ λ™μž‘ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€. (http://speed.pypy.org/ μ°Έκ³ )

μ•ŒνŒŒν¬λ„ 이 κΈ°μˆ μ„ μ΄μš©ν•΄ JIT둜 빨라지고 μžˆμŠ΅λ‹ˆλ‹€. λ²€μΉ˜λ§ˆν¬μ— 널리 μ“°μ΄λŠ” 둜고 싀행이 caheui보닀 30λ°° 이상 더 λΉ λ¦…λ‹ˆλ‹€!

$ time ./rpaheui-c snippets/logo/logo.aheui > /dev/null

real    0m0.915s
user    0m0.640s
sys 0m0.269s
$ time ../caheui/aheui snippets/logo/logo.aheui > /dev/null

real    0m26.026s
user    0m25.970s
sys 0m0.035s

μ‹€ν–‰ μ˜΅μ…˜

  • μ˜΅μ…˜μ„ μ œμ™Έν•œ 첫 μΈμžλŠ” 파일 μ΄λ¦„μž…λ‹ˆλ‹€. νŒŒμΌμ΄λ¦„μ΄ -λ©΄ ν‘œμ€€ μž…λ ₯μž…λ‹ˆλ‹€.
  • --help,-h: 도움말
  • --version,-v: 버전
  • --opt,-O: μ΅œμ ν™” μˆ˜μ€€. 기본값은 1μž…λ‹ˆλ‹€. 0κ³Ό 2 μ‚¬μ΄μ˜ μ •μˆ˜λ₯Ό μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 0: μ΅œμ ν™” μ—†μŒ.
    • 1: κ°„λ‹¨ν•œ μŠ€νƒν¬κΈ° μΆ”μ •μœΌλ‘œ λΉ λ₯΄κ²Œ 쓰이지 μ•ŠλŠ” μ½”λ“œλ₯Ό μ œκ±°ν•˜κ³  μƒμˆ˜ 연산을 λ³‘ν•©ν•©λ‹ˆλ‹€.
    • 2: μŠ€νƒν¬κΈ° μΆ”μ •μœΌλ‘œ μ™„λ²½ν•˜κ²Œ 쓰이지 μ•ŠλŠ” μ½”λ“œλ₯Ό μ œκ±°ν•˜κ³ , μ½”λ“œ 쑰각을 직렬화해 μž¬λ°°μΉ˜ν•˜κ³ , μƒμˆ˜ 연산을 λ³‘ν•©ν•©λ‹ˆλ‹€.
    • usage: --opt=0, -O1 or -O 2
  • --source,-S: μ†ŒμŠ€ μœ ν˜•. κΈ°λ³Έ 값은 autoμž…λ‹ˆλ‹€. auto, bytecode, asm, text κ°€μš΄λ° ν•˜λ‚˜λ₯Ό μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • auto: μ†ŒμŠ€ μœ ν˜•μ„ μΆ”μΈ‘ν•©λ‹ˆλ‹€. νŒŒμΌμ΄λ¦„μ΄ .aheuicμ΄κ±°λ‚˜ λ°”μ΄νŠΈμ½”λ“œ μ’…λ£Œ νŒ¨ν„΄μ΄ 담겨 있으면 bytecode둜 μΆ”μΈ‘ν•©λ‹ˆλ‹€. νŒŒμΌμ΄λ¦„μ΄ .aheuis이면 asm으둜 μΆ”μΈ‘ν•©λ‹ˆλ‹€. νŒŒμΌμ΄λ¦„μ΄ .aheui이면 text둜 μΆ”μ •ν•©λ‹ˆλ‹€. μΆ”μ •ν•  수 μ—†μœΌλ©΄ text둜 μΆ”μ •ν•©λ‹ˆλ‹€.
    • bytecode: 아희 λ°”μ΄νŠΈμ½”λ“œ. (μ•Ÿμ…ˆλΈ”λ¦¬μ˜ λ°”μ΄νŠΈμ½”λ“œ ν‘œν˜„ν˜•)
    • asm: μ•Ÿμ…ˆλΈ”λ¦¬ μ°Έκ³ 
    • usage: --source=asm, -Sbytecode or -S text
  • --target,-T: κ²°κ³Όλ¬Ό μœ ν˜•. 기본값은 runμž…λ‹ˆλ‹€. run, bytecode, asm κ°€μš΄λ° ν•˜λ‚˜λ₯Ό μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • run: 주어진 μ½”λ“œλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
    • bytecode: 아희 λ°”μ΄νŠΈμ½”λ“œ. (μ•Ÿμ…ˆλΈ”λ¦¬μ˜ λ°”μ΄νŠΈμ½”λ“œ ν‘œν˜„ν˜•)
    • asm: μ•Ÿμ…ˆλΈ”λ¦¬ μ°Έκ³ 
    • usage: --target=asm, -Tbytecode or -T run
  • --output,-o: κ²°κ³Όλ¬Ό 파일. 기본값은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€. 각 κ²°κ³Όλ¬Ό μœ ν˜•μ— 따라 μžμ„Έν•œ λ‚΄μš©μ„ ν™•μΈν•˜μ„Έμš”. -이면 ν‘œμ€€ 좜λ ₯μž…λ‹ˆλ‹€.
    • --target=run: 이 μ˜΅μ…˜μ€ λ¬΄μ‹œλ©λ‹ˆλ‹€.
    • --target=bytecode: κΈ°λ³Έ 값은 .aheuic νŒŒμΌμž…λ‹ˆλ‹€.
    • --target=asm: κΈ°λ³Έ 값은 .aheuis νŒŒμΌμž…λ‹ˆλ‹€.
    • --target=asm+comment: asm에 주석이 μΆ”κ°€λ©λ‹ˆλ‹€.
  • --cmd,-c: μ½”λ“œλ₯Ό 파일 λŒ€μ‹  λ¬Έμžμ—΄λ‘œ λ°›μ•„ λ„˜κ²¨μ€λ‹ˆλ‹€.
  • --no-c: .aheuic νŒŒμΌμ„ μžλ™μœΌλ‘œ μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ•Ÿμ…ˆλΈ”λ¦¬μ™€ ahsembler

  • μ•Œλ¦Ό: ahsemblerλŠ” ./aheui-c --source=asm --output=-와 같은 λͺ…λ Ήμž…λ‹ˆλ‹€.

μ•Ÿμ…ˆλΈ”λŸ¬λ‘œ 아희 μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•΄ 직렬화 된 μ•Ÿμ…ˆλΈ”λ¦¬λ‘œ λ§Œλ“œμ„Έμš”! 아희 μ½”λ“œλ₯Ό μ„ ν˜•μœΌλ‘œ 디버그할 수 μžˆμŠ΅λ‹ˆλ‹€!

μ›μ‹œ λͺ…λ Ή

  • halt: γ…Ž
  • add: γ„·
  • mul: γ„Έ
  • sub: γ…Œ
  • div: γ„΄
  • mod: γ„Ή
  • pop: ㅁ without γ…‡/γ…Ž
  • popnum: ㅁ with γ…‡
  • popchar: ㅁ with γ…Ž
  • push $v: γ…‚ without γ…‡/γ…Ž. Push THE VALUE $v. $v is not an index of consonants.
  • pushnum: γ…‚ with γ…‡
  • pushchar: γ…‚ with γ…Ž
  • dup: γ…ƒ
  • swap: ㅍ
  • sel $v: γ……. $v is always an integer order of final consonants.
  • mov $v: γ…†. $v is always an integer order of final consonants.
  • cmp: γ…ˆ
  • brz $v: γ…Š. If a popped value is zero, program counter is set to $v; otherwise +1.

ν™•μž₯ λͺ…λ Ή (μ„ ν˜• μ½”λ“œλŠ” μœ„μΉ˜ 정보λ₯Ό μžƒκ³  일뢀 λͺ…령이 μŠ€νƒ 크기 점검을 ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μΆ”κ°€ λͺ…령이 ν•„μš”ν•©λ‹ˆλ‹€)

  • brpop2 $v: If current stack doesn't have 2 values to pop, program counter is set to $v; otherwise +1.
  • brpop1 $v: If current stack doesn't have 1 values to pop, program counter is set to $v; otherwise +1.
  • jmp $v: Program counter is set to $v.

μ‚¬μš©λ²•

git clone https://github.com/aheui/rpaheui
python ahsembler.py <your-aheui-code>