Compile : 프로그래밍 언어를 Runtime 이전에 기계어로 해석하는 작업 (원시 코드 → object code)
Interprete : Runtime 이후에 Row단위로 해석하며 프로그램을 구동시키는 방식. 프로그래밍 언어를 기계어로 바로 바꾸지 않고 중간 단계를 거친 뒤에 런타임에 직접 코드를 구동시킴.
python 명령자를 전달함으로써 python interpreter가 trigger되고, source code가 전달된다.
ex. python abc.py
Python interpreter의 작동 stages는
1) Lexing
전달된 code를 가지고 line을 쪼개 코드를 Token으로 generate한다.
2) Parsing
Generated token이 parser에게 전달되어 파싱됨. token을 가지고 Abstract Syntax Tree라는 token(code들)사이의 관계를 나타내는 트리 구조를 만듦.
3) Compiling
Parsed code(Abstract Syntax tree)가 compiler에게 전달되고, compiler가 이 Abstract Syntax Tree를 가지고 Byte code 라는 .pyc
형태의 intermediate language code를 생성됨
4) Virtual Machine으로 .pyc가 전달되어 Interpreting 작업 수행
실제로 interpreting하는 stage. operating system을 simulate함.
실제 interpreting 작업 (Row 단위로 해석하며 프로그램을 구동하는 방식)을 담당하며, byte code를 machine code로 변환함
python interpreter 작동방식까지 공부하게 된 이유...Exception이 raised된 다음에 내 화면에.작업 console에. 프린트문으로. 찍히기까지 일어나는 일들이 너무 궁금해서...
Exception이 raised되면 일어나는 일
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/spaceone_inventory-1.8.5-py3.8.egg/spaceone/inventory/api/v1/server.py", line 46, in list
server_vos, total_count = server_service.list(params)
File "/usr/local/lib/python3.8/site-packages/spaceone/core/service/service.py", line 62, in wrapped_func
return _pipeline(func, self, params, append_meta)
File "/usr/local/lib/python3.8/site-packages/spaceone/core/service/service.py", line 121, in _pipeline
raise e
File "/usr/local/lib/python3.8/site-packages/spaceone/core/service/service.py", line 98, in _pipeline
handler.verify(params)
File "/usr/local/lib/python3.8/site-packages/spaceone/core/handler/authorization_handler.py", line 37, in verify
self._verify_auth(params, scope)
File "/usr/local/lib/python3.8/site-packages/spaceone/core/handler/authorization_handler.py", line 75, in _verify_auth
raise ERROR_PERMISSION_DENIED()
spaceone.core.error.ERROR_PERMISSION_DENIED:
error_code = ERROR_PERMISSION_DENIED
status_code = PERMISSION_DENIED
message = Permission denied.
traceback 이라는 python의 모듈이 있음. 파이썬 프로그램의 StackTrace를 추출, format, print하는 표준 인터페이스를 정의함!
traceback module은 traceback이라는 Object를 사용하는데, sys.last_traceback이라는 변수에 저장되고 sys.exc_info()라는 함수의 인자로 사용된다고 한다..
https://docs.python.org/ko/3.7/library/traceback.html#module-traceback
파이썬의 sys module은 파이썬 런타임에 interpreter의 구성을 확인하고, 변경할 수 있는 서비스를 제공하는 모듈임. 프로그램 외부의 작업환경과 상호작용할 수 있는 서비스를 제공한다.
ex. build time 버전 정보를 설정한다거나, 인터프리터를 빌드하는데 사용되는 운영체제 플랫폼을 정의한다던가..
정리하자면 Traceback 로그가 출력되는 과정은,
런타임환경 외부의 작업환경인 콘솔의 print와 상호작용하기 위해 sys.exc_info() 라는 함수의 인자에다가 traceback object로 생성된 객체를 전달해 내눈까지 로그가 전달되는 기나긴 여정.. 이었다고 한다..! 궁금증 해결