Objective-C는 동적 언어인가요? 왜
'동적 언어'란 무엇인가요? 이 개념은 실제로 명확한 정의가 없습니다. 기본적으로 이는 정도의 척도입니다. 이 수준은 언어의 런타임이 사용하는 장부 데이터의 양입니다.
"C의 설계와 진화"를 읽어본 사람은 C의 왜곡된 제로 장부 원칙을 알아야 합니다. C 언어의 모든 고급 개념은 실제로 컴파일 단계에서 제거되었습니다. 최종 개체 코드에서 이것이 고급 언어인지 구별하기는 어렵습니다. 물론 트레이드오프는 프로그래머가 특정 기능을 C에서 구현할 수 없는 이유를 이해해야 한다는 것입니다. 그리고 기계의 관점에서 이해해야 합니다.
동적 언어는 실제로 부기를 지속적으로 추가하는 과정입니다.
예를 들어 C에서 다형성을 달성하려면 가상 테이블이라는 중간 메커니즘이 여전히 있어야 합니다. 하지만 가상테이블이 장부구조라고 보기는 어렵다. 너무 단순하기 때문이죠. Objective-C에서는 멤버 함수 호출에 대한 기록 메커니즘이 크게 향상되었습니다. 이 때문에 Objective-C의 액션 메시지 구현은 훨씬 간단합니다. 멤버 함수가 존재하는지 확인할 수 있기 때문입니다. 또한 객체 유형을 몰라도 메소드를 콜백 함수로 지정할 수도 있습니다.
C 메모리 관리의 또 다른 문제점은 객체 참조가 원시 포인터 메커니즘을 사용한다는 것입니다. Objective-C는 이를 개선하지 않습니다. 그러나 개선이 없는 것은 아닙니다. Objective-C에서 포인터는 거의 항상 NSObject를 가리키며 이는 참조 기반을 갖습니다. 물론, 과출시나 출시 후 사용 문제가 완전히 해결되지는 않습니다. Java, Python, Lua와 같은 언어에서는 원시 포인터가 완전히 사라졌습니다.
C의 메모리 관리는 힙 외에 CPU 스택이 관리하는 스택이 하나뿐입니다. 동적 언어에서는 어휘 범위의 성능을 고려해야 하며 이는 더 많은 장부를 필요로 합니다. Objective-C도 이를 구현하지 않습니다.
C의 문법 처리는 런타임 전에 모두 완료됩니다. Python, Lisp, Lua와 같은 언어에는 eval과 같은 메커니즘이 존재합니다.
그래서 Objective-C는 C나 C보다 더 동적인 기능을 갖춘 언어이지만, Lua에 비해 Lisp에는 몇 가지 동적 기능이 부족합니다. 질문에 비하면 Python은 동적 기능이 부족한 언어라고밖에 할 수 없습니다. Python에는 어휘 범위와 연속 지원이 부족합니다. 스택은 CPU 스택에 의존합니다(물론 스택 없는 Python이 있지만 비공식적입니다). 이와 대조적으로 Lua는 전체 연속성을 지원하기 위해 코루틴과 Lisp를 지원하기 위해 자체 VM 스택을 유지합니다. Python의 장부 관리 기능도 Lua 및 Lisp에 비해 부족합니다.