왜냐하면 런타임에 타입을 알아내야 하거든. 이렇게 생각하면 된다. 플렉서빌러티와 안정성과 생산성을 택하려면 동적타입, 모든걸 희생해서라도 오직 속도만이 중요하면 정적타입
야이미친(121.44)2015-04-11 20:05
동적 타입을 가지면 실행 시간(runtime)에 어떤 타입인지 알아내서 그에 맞는 기계어 명령어를 호출해야 하므로 단순히 생각해 봐도 타입 정보를 알아내기 위한 메모리 접근 연산, 알아낸 타입 정보에 따라서 코드를 분기하기 위한 비교문과 분기문, 모든 경우의 수에 대한 코드를 모두 넣기 때문에 프로그램 크기도 커지고 속도도 느려진다. 간단한 예로 비주얼 베이직에 있는 Variant 형을 예로 들면 이 타입은 Byte, Integer, Long, Single, Double, String, Object 등 구조체를 제외한 기본 제공 자료형을 모두 집어넣을 수 있는데(심지어 배열까지도) 내부적으로 2바이트짜리 변수형 타입과 union(공용체)로 구현된 데이터 필드로 정의된 구조체로 정의되어 있다.
ㅅㅅㅅ(125.128)2015-04-11 20:12
그래서 Variant 형을 쓰면 msvbvm60.dll의 Variant 관련 함수가 불리는데 이 함수를 리버싱해 보면 변수 종류에 따라서 다른 명령어로 분기함으로써 모든 데이터형을 커버하고 있다. 근데 타입이 고정되어 있으면 이런 귀찮은 짓을 실행 시간에 안하고 딱 한 가지 타입을 위한 기계어 명령어만 넣어서 바로 실행되기 때문에 속도가 훨씬 빠르겠지.
ㅅㅅㅅ(125.128)2015-04-11 20:13
와우 감사합니당
제발제발요(pitsdi)2015-04-11 20:16
동적타입은 변수에 타입이 없지. 타입이 변수에 대입될 대상에만 존재한다. 그 대상은 메모리에 존재하고, 보통 그 메모리에는 그 대상의 타입 정보까지 들어있지. 이렇기 때문에 가비지 콜렉션이 쉬워진다. 변수에 어떤 타입의 대상을 대입하고 연산을 하면 다이나믹 디스패치가 일어난다. 정적 언어는 스태틱 디스패치라 컴파일 타임에 이게 다 결정 됨. 동적언어는 다이나믹 디스패치가 가능하기 때문에 니가 런타임에 새로운 타입을 만들어서 새로운 디스패치가 되게 한다거나 하는 정적언어에서는 불가능한 일들을 할수있지. 난 동적타입 팬일세
야이미친(121.44)2015-04-11 20:19
사실 가비지 컬렉터가 지원되는 정도라면 인터프리터 언어지. 자바나 C# 같이. 이미 속도 문제는 어느 정도 희생하는 부분이 있음. 가비지 컬렉터가 지원되려면 모든 변수를 동적 타입처럼 타입 정보, 레퍼런스 카운트 등을 가지고 있어야 하니까. 그런 의미에서 C#, VB .NET 같은 언어가 설계는 잘했다고 보는 게 모든 타입을 다 담을 수 있는 Object 형 같은 걸 제공해 주니 코드 짜는 게 좀 수월한 부분이 있음.
ㅅㅅㅅ(125.128)2015-04-11 20:24
근데 C, C++, Visual Basic 6 같은 컴파일 언어에서는 가비지 컬렉터를 지원하고 싶어도 지원할 수가 없고 타입 문제도 동적 타입은 변수 정보를 다 가지고 있는 인터프리터에서나 구현하기 편하기 때문에 정적 타입 체제를 취할 수 밖에 없음. 그런 관점에서 Visual Basic 6의 Variant 형은 가히 변태적이라 할 수 있는데 이게 Visual Basic 6이 COM을 완전하게 지원하려고 COM의 데이터 타입 중 하나인 VARIANT까지 언어에 우겨넣은 결과임.
ㅅㅅㅅ(125.128)2015-04-11 20:27
ㄴ 얌마, 동적 언어랑 인터프리터랑은 별개야. 인터프리터가 뭔지나 아냐?
야이미친(121.44)2015-04-11 20:39
ㅇㅇ 알음. 동적 언어랑 인터프리터랑 별개인 것도 알아. 적어도 너보단 잘 알음. 컴파일 언어에서 동적 타입을 잘 지원하지 않는 이유가 퍼포먼스 이슈 때문이야. 적은 기계어 코드로 돌아가는 프로그램을 만드는 게 원칙이니깐. 동적 타입을 언어에서 제공하는 순간 기계어 코드는 인터프리터 급으로 비효율적이게 되고 그냥 이 쯤 되면 소스 코드랑 인터프리터를 잘 포장해서 EXE 파일로 만드는(파이썬 코드를 exe 만들듯이) 거처럼 비효율적인 게 되어 버림. 그래서 동적 타입은 주로 스크립트 언어 같은 인터프리터 언어(JavaScript, Python, C#, ...)에서만 제공한다. 물론 컴파일 언어에서도 제공하는 경우가 있기는 하지만 거의 안 그런다는 거임.
ㅅㅅㅅ(125.128)2015-04-11 20:45
C#은 EXE 파일을 만들기는 하지만 기계어가 아니라 IL 코드라는 가상의 기계어를 내뱉고 이걸 닷넷 프레임워크가 해석하는 엄연한 인터프리터 언어임. 인터프리터 언어인데 단지 코드를 plaintext가 아니라 IL 코드라는 프로그램이 좀 더 읽기 쉬운 바이너리 덩어리를 생성해서 해석하게끔 해서 최적화시킨 것일 뿐. 프로그래밍 언어론에서는 자바나 C# 같은 걸 컴파일 언어와 인터프리터 언어의 중간이라고 해서 무슨 이상한 표현을 만들어서 부르기도 하지만 그런 용어를 만들어서 붙여서 부르는 건 무의미함. 세상의 모든 언어는 기계어를 만드는 컴파일 언어냐, 그렇지 않은 언어인 인터프리터 언어냐로 나뉠 뿐임.
ㅅㅅㅅ(125.128)2015-04-11 20:48
ㄴ 햐... 큰 병슨 나셨네... 인터프리터란 기계어로 미리 컴파일해서 한번에 실행시키지 않고 한줄한줄 실행시키는 걸 말한다. 얼서 제대로 된 컴파일되는 동적언어는 한개도 대지 못하는 병슨이 깝치길 깝쳐 ㅋㅋㅋ
야이미친(121.44)2015-04-11 20:52
그리고 가상머신 기계어는 호환을 위해 그렇게 한거지, 사실상 기계어지 인터프리터가 아니다. 그렇게 따지면 병슨아 기계어도 cpu에 대해서는 인터프리터여. 뭐좀 알고 깝쳐라
야이미친(121.44)2015-04-11 20:56
캬악 퉤 왠 조팝들이 이렇게 꼬이냐 ㅋㅋ
야이미친(121.44)2015-04-11 20:57
아이고 철학자 납셨네. 컴파일 언어와 인터프리터 언어를 구분하는 가장 큰 이유는 명령어가 하드웨어 논리회로로 해석되면 성능이 넘사벽으로 빠르니까 입니다만? 무슨 지금 상황이랑 전혀 맞지도 않은, 기계어도 CPU에 대해서는 인터프리터라는 드립을 치고 있어. 그리고 컴파일되는 동적 타입 언어는 내가 아니라 니가 대야지. 난 컴파일 언어는 동적 타입을 지원하는 경우가 드물다고 언급했으니까. 난독증까지 있나 보구나. 컴파일 언어 중에 동적 타입을 지원하는 언어가 있음을 입증하는 책임은 내가 아니라 너한테 있다고.
ㅅㅅㅅ(125.128)2015-04-11 20:59
넌 그럼 그냥 JavaScript도 컴파일 언어라고 해 ㅋㅋ 인간과 호환을 위해 인간 언어를 쓴 거니까.
ㅅㅅㅅ(125.128)2015-04-11 21:03
ㄴ 으잌 ㅋㅋㅋ 아주 혼자 지랄을 떨었구나 ㅋㅋㅋ 자바스크립트? 야이 씨방새야 컴파일 버젼 구글 v8 있다. 이건 구현의 문제지 병슨아. 언어가 인터프리터냐 컴파일러냐는 맞는 말이 아니지 ㅋㅋㅋ 형은 병슨이랑은 고만 놀아주께 혼자 지랄 계속하던지 말던지
왜냐하면 런타임에 타입을 알아내야 하거든. 이렇게 생각하면 된다. 플렉서빌러티와 안정성과 생산성을 택하려면 동적타입, 모든걸 희생해서라도 오직 속도만이 중요하면 정적타입
동적 타입을 가지면 실행 시간(runtime)에 어떤 타입인지 알아내서 그에 맞는 기계어 명령어를 호출해야 하므로 단순히 생각해 봐도 타입 정보를 알아내기 위한 메모리 접근 연산, 알아낸 타입 정보에 따라서 코드를 분기하기 위한 비교문과 분기문, 모든 경우의 수에 대한 코드를 모두 넣기 때문에 프로그램 크기도 커지고 속도도 느려진다. 간단한 예로 비주얼 베이직에 있는 Variant 형을 예로 들면 이 타입은 Byte, Integer, Long, Single, Double, String, Object 등 구조체를 제외한 기본 제공 자료형을 모두 집어넣을 수 있는데(심지어 배열까지도) 내부적으로 2바이트짜리 변수형 타입과 union(공용체)로 구현된 데이터 필드로 정의된 구조체로 정의되어 있다.
그래서 Variant 형을 쓰면 msvbvm60.dll의 Variant 관련 함수가 불리는데 이 함수를 리버싱해 보면 변수 종류에 따라서 다른 명령어로 분기함으로써 모든 데이터형을 커버하고 있다. 근데 타입이 고정되어 있으면 이런 귀찮은 짓을 실행 시간에 안하고 딱 한 가지 타입을 위한 기계어 명령어만 넣어서 바로 실행되기 때문에 속도가 훨씬 빠르겠지.
와우 감사합니당
동적타입은 변수에 타입이 없지. 타입이 변수에 대입될 대상에만 존재한다. 그 대상은 메모리에 존재하고, 보통 그 메모리에는 그 대상의 타입 정보까지 들어있지. 이렇기 때문에 가비지 콜렉션이 쉬워진다. 변수에 어떤 타입의 대상을 대입하고 연산을 하면 다이나믹 디스패치가 일어난다. 정적 언어는 스태틱 디스패치라 컴파일 타임에 이게 다 결정 됨. 동적언어는 다이나믹 디스패치가 가능하기 때문에 니가 런타임에 새로운 타입을 만들어서 새로운 디스패치가 되게 한다거나 하는 정적언어에서는 불가능한 일들을 할수있지. 난 동적타입 팬일세
사실 가비지 컬렉터가 지원되는 정도라면 인터프리터 언어지. 자바나 C# 같이. 이미 속도 문제는 어느 정도 희생하는 부분이 있음. 가비지 컬렉터가 지원되려면 모든 변수를 동적 타입처럼 타입 정보, 레퍼런스 카운트 등을 가지고 있어야 하니까. 그런 의미에서 C#, VB .NET 같은 언어가 설계는 잘했다고 보는 게 모든 타입을 다 담을 수 있는 Object 형 같은 걸 제공해 주니 코드 짜는 게 좀 수월한 부분이 있음.
근데 C, C++, Visual Basic 6 같은 컴파일 언어에서는 가비지 컬렉터를 지원하고 싶어도 지원할 수가 없고 타입 문제도 동적 타입은 변수 정보를 다 가지고 있는 인터프리터에서나 구현하기 편하기 때문에 정적 타입 체제를 취할 수 밖에 없음. 그런 관점에서 Visual Basic 6의 Variant 형은 가히 변태적이라 할 수 있는데 이게 Visual Basic 6이 COM을 완전하게 지원하려고 COM의 데이터 타입 중 하나인 VARIANT까지 언어에 우겨넣은 결과임.
ㄴ 얌마, 동적 언어랑 인터프리터랑은 별개야. 인터프리터가 뭔지나 아냐?
ㅇㅇ 알음. 동적 언어랑 인터프리터랑 별개인 것도 알아. 적어도 너보단 잘 알음. 컴파일 언어에서 동적 타입을 잘 지원하지 않는 이유가 퍼포먼스 이슈 때문이야. 적은 기계어 코드로 돌아가는 프로그램을 만드는 게 원칙이니깐. 동적 타입을 언어에서 제공하는 순간 기계어 코드는 인터프리터 급으로 비효율적이게 되고 그냥 이 쯤 되면 소스 코드랑 인터프리터를 잘 포장해서 EXE 파일로 만드는(파이썬 코드를 exe 만들듯이) 거처럼 비효율적인 게 되어 버림. 그래서 동적 타입은 주로 스크립트 언어 같은 인터프리터 언어(JavaScript, Python, C#, ...)에서만 제공한다. 물론 컴파일 언어에서도 제공하는 경우가 있기는 하지만 거의 안 그런다는 거임.
C#은 EXE 파일을 만들기는 하지만 기계어가 아니라 IL 코드라는 가상의 기계어를 내뱉고 이걸 닷넷 프레임워크가 해석하는 엄연한 인터프리터 언어임. 인터프리터 언어인데 단지 코드를 plaintext가 아니라 IL 코드라는 프로그램이 좀 더 읽기 쉬운 바이너리 덩어리를 생성해서 해석하게끔 해서 최적화시킨 것일 뿐. 프로그래밍 언어론에서는 자바나 C# 같은 걸 컴파일 언어와 인터프리터 언어의 중간이라고 해서 무슨 이상한 표현을 만들어서 부르기도 하지만 그런 용어를 만들어서 붙여서 부르는 건 무의미함. 세상의 모든 언어는 기계어를 만드는 컴파일 언어냐, 그렇지 않은 언어인 인터프리터 언어냐로 나뉠 뿐임.
ㄴ 햐... 큰 병슨 나셨네... 인터프리터란 기계어로 미리 컴파일해서 한번에 실행시키지 않고 한줄한줄 실행시키는 걸 말한다. 얼서 제대로 된 컴파일되는 동적언어는 한개도 대지 못하는 병슨이 깝치길 깝쳐 ㅋㅋㅋ
그리고 가상머신 기계어는 호환을 위해 그렇게 한거지, 사실상 기계어지 인터프리터가 아니다. 그렇게 따지면 병슨아 기계어도 cpu에 대해서는 인터프리터여. 뭐좀 알고 깝쳐라
캬악 퉤 왠 조팝들이 이렇게 꼬이냐 ㅋㅋ
아이고 철학자 납셨네. 컴파일 언어와 인터프리터 언어를 구분하는 가장 큰 이유는 명령어가 하드웨어 논리회로로 해석되면 성능이 넘사벽으로 빠르니까 입니다만? 무슨 지금 상황이랑 전혀 맞지도 않은, 기계어도 CPU에 대해서는 인터프리터라는 드립을 치고 있어. 그리고 컴파일되는 동적 타입 언어는 내가 아니라 니가 대야지. 난 컴파일 언어는 동적 타입을 지원하는 경우가 드물다고 언급했으니까. 난독증까지 있나 보구나. 컴파일 언어 중에 동적 타입을 지원하는 언어가 있음을 입증하는 책임은 내가 아니라 너한테 있다고.
넌 그럼 그냥 JavaScript도 컴파일 언어라고 해 ㅋㅋ 인간과 호환을 위해 인간 언어를 쓴 거니까.
ㄴ 으잌 ㅋㅋㅋ 아주 혼자 지랄을 떨었구나 ㅋㅋㅋ 자바스크립트? 야이 씨방새야 컴파일 버젼 구글 v8 있다. 이건 구현의 문제지 병슨아. 언어가 인터프리터냐 컴파일러냐는 맞는 말이 아니지 ㅋㅋㅋ 형은 병슨이랑은 고만 놀아주께 혼자 지랄 계속하던지 말던지