Python이라는 언어를 사용하는 개발자로서 너무 모르고 썼다는 반성이 있다. 이 포스팅 시리즈는 파이썬에 대한 개념과 특징 그리고 다양한 파이썬 매직 메서드를 살펴보면서 파이썬에 대해 자세히 알아보고자 한다.
1. 파이썬의 역사
파이썬은 1991년 귀도 반 로섬이라는 프로그래머에 의해 개발된 언어이다. 파이썬이라는 이름은 귀도가 좋아하는 코미디인 〈Monty Python's Flying Circus〉에서 따온 것이다.
2. 파이썬의 특징
2.1 파이썬의 철학
핵심 철학만 추렸다. 여기에서 나머지를 더 볼 수 있다.
- "아름다운 게 추한 것보다 낫다." (Beautiful is better than ugly)
- "명시적인 것이 암시적인 것 보다 낫다." (Explicit is better than implicit)
- "단순함이 복잡함보다 낫다." (Simple is better than complex)
- "복잡함이 난해한 것보다 낫다." (Complex is better than complicated)
- "가독성은 중요하다." (Readability counts)
파이썬은 언어의 핵심에 모든 기능을 넣는 대신, 사용자가 언제나 필요로 하는 최소한의 기능만을 사용하면서 확장해나갈 수 있도록 디자인되었다.
또, 파이썬에서는 프로그램의 문서화가 매우 중시되고 있어 언어의 기본 기능에 포함되어 있다. 파이썬은 원래 교육용으로 설계되었기 때문에 읽기 쉽고, 그래서 효율적인 코드를 되도록 간단하게 쓸 수 있도록 하려는 철학이 구석구석까지 침투해 있어, 파이썬 커뮤니티에서도 알기 쉬운 코드를 선호하는 경향이 강하다.
2.2 파이썬은 인터프리터 언어이다?
파이썬은 인터프리터 언어인가? 나는 사실 2년을 개발하면서 당연히 '인터프리터 언어이다!' 라고 생각을 했으나.... 이 포스팅을 준비하면서 자료를 찾아봤는데 그게 아니라는 생각이 들었다.(결정적인 글은 이것이었다. 숩님의 파이썬은 인터프리터 언어입니까?)
또한 위키백과에서도 이와 관련된 부분을 읽게 되었다.
파이썬은 기본적으로 해석기(인터프리터) 위에서 실행될 것을 염두에 두고 설계되었다.
...
현대의 파이썬은 여전히 인터프리터 언어처럼 동작하나 사용자가 모르는 사이에 스스로 파이썬 소스 코드를 컴파일하여 바이트 코드(Byte code)를 만들어 냄으로써 다음에 수행할 때에는 빠른 속도를 보여 준다.
출처 - 위키백과
컴파일러는 소스 프로그램을 읽어서 즉시 결과를 출력하는 인터프리터와는 구분된다. 그러나 현대에 들어 많은 인터프리터가 JIT 컴파일 등의 기술로 실시간 컴파일을 수행하므로, 컴파일러와 인터프리터 사이의 기술적 구분은 사라져 가는 추세이다.
출처 - 위키백과
이와 관련해서 숩님의 블로그 글에서 참고자료를 보게 되었다.(https://www.scaler.com/topics/why-python-is-interpreted-language/)
즉 파이썬은 컴파일된 언어인 동시에 인터프리터 된 언어라는 것이다.(컴파일과 인터프리터에 대한 설명은 다음 포스팅에서 하겠다.)
숩님의 블로그 글을 인용하면서 해당 단락은 마무리 짓겠다.
진짜 문제는 컴파일 언어냐 인터프리터 언어냐 하는 것이 언어 자체를 분류하거나 구분 짓는 특성이 아니라는 것이다. 이것은 언어 구현의 문제이다. 초창기 프로그래밍 언어들의 역사에서 인터프리터 방식은 언어를 규정하는 특징이라기보다는 목적과 용도에 따라 실제 작동에 대한 구현의 방식을 정한 것일 뿐이었다.
...
중략
...
어떤 언어 자체를 인터프리터 언어/컴파일 언어로 구분하는 것은 잘못된 접근이다. 이 두 방식은 언어 구현에 있어서의 접근법이며, 기존에 존재하는 언어라도 새 구현체를 만들어서 그 작동 방식을 바꿀 수 있다. 최근 개발되는 언어들과 혹은 아주 오래되었지만 계속해서 발전해나가는 언어들은 표준 구현에서 두 가지 방식에서 장점만을 취하거나, 혹은 필요에 따라서는 두 가지 방식 모두를 포함하는 형태로 개발되고 있다.
그래서 저 질문에 답을 어떻게 해야할까? 일단 표준 파이썬 구현체는 인터프리터 안에 컴파일러를 내장하고 있다. 답은 각자 마음에 드는 걸로 정하시길.
3. 파이썬의 장단점
3.1 파이썬의 장점
3.1.1 빠른 개발 속도
파이썬은 높은 생산성을 자랑한다. 그 이유에는 첫 번째 쉽고 간결한 문법이 있다. 이를 통해 적은 코드로 많은 작업을 수행할 수 있다. 두 번째는 우수한 자료형과 다양한 모듈과 라이브러리들은 효율적인 개발을 제공한다. 예를 들어 numpy와 matplotlib 등을 통하여 데이터의 처리와 시각화 등을 정말 편리하게 할 수 있다.
3.1.2 높은 확장성 및 이식성
파이썬은 대표적인 글루 언어에 해당한다. 다른 언어나 라이브러리에 쉽게 접근해 연동할 수 있기 때문이다. 높은 성능의 애플리케이션 개발이 필요한 경우 C/C++과 같은 언어를 파이썬과 결합해 사용할 수 있다. 이 경우 애플리케이션의 성능을 보장할 수 있으면서 동시에 별도 설치나 구성 과정 없이 스크립트 언어의 장점 또한 함께 누릴 수 있다.
3.1.3 거대한 생태계
파이썬은 수 많은 표준 라이브러리를 제공한다. 덕분에 프로그래머는 모든 코드를 일일이 작성할 필요가 없다. 또한 폭넓은 생태계와 활발한 커뮤니티 활동으로 인해 빠르게 문제를 해결하고, 협업할 수 있다는 강점도 있다.
대표적으로 PyPI와 같은 웹사이트를 통해 프로그래머들이 스스로 작성한 파이썬 패키지를 공유하고, 다른 개발자가 배포한 패키지를 pip 명령어를 통해 간단하게 설치할 수 있다.
3.2 파이썬의 단점
3.2.1 느린 실행 속도
한 논문에 따르면, CLBG에서 제시한 10개의 벤치마킹을 돌려본 결과 파이썬은 C에 비해 71.90배의 시간, 2.80배의 메모리, 75.88배의 에너지를 더 소모한다고 한다.
또한 멀티 쓰레딩을 얘기할 때 GIL(Global Interpreter Lock)을 빼놓을 수 없다. 파이썬은 자원배분을 한 스레드에게 할당한 후, 그 스레드가 끝날 때까지 Lock을 걸어 다른 스레드가 접근하지 못하게 한다. 따라서 실제로는 CPU를 점유할 수 있는 스레드는 한 개이기 때문에 실행 속도가 더 느려진다.
3.2.2 파이썬의 동적 타입
이는 사실 단점이라고 보기에는 애매하다. 다만 동적 타입으로 자료형을 강제하지 않기 때문에 협업 과정에서 내가 예상하는 변수의 자료형이 인자로 들어오지 않아 런타임 에러를 발생시킬 수 있다. 이를 보완하기 위해 docstring 이나 Type Hint를 사용하는 방법이 있다.
다음 포스팅에서는 (1) 컴파일과 인터프리터에 대해서 또한 (2) GIL에 대한 내용을 다뤄볼 예정이다.
이번 포스팅에서 잘못된 내용이 있거나 보충할 내용이 있으면 언제나 댓글로 피드백 해주시길 바란다.
참고
2. 점프 투 파이썬
3. 위키백과
'Python' 카테고리의 다른 글
WSL2 환경에서 Poetry 사용하기 (0) | 2023.01.16 |
---|---|
[Python] GIL이 뭐죠? (0) | 2022.12.21 |
[Celery] - 시작하기 (0) | 2022.12.08 |
컴파일이란 (0) | 2022.12.07 |
[Python] - 정규표현식을 이용한 문자열 처리 (0) | 2022.11.19 |