CS/기타4 컴파일러와 인터프리터 (+ JIT 컴파일러) 컴파일러- 소스 코드를 기계어로 번역해주는 프로그램- 모든 소스 코드의 번역이 완료된 후 실행- 런타임 이전에 번역이 완료되므로 성능 최적화가 용이- C, C++ 등이 컴파일 언어에 속함인터프리터- 소스 코드를 미리 번역하지 않고, 런타임에 순차적으로 실행시키는 프로그램- 소스 코드를 직접 실행할 수도 있고, 중간 언어를 거칠 수도 있음- 컴파일러에 비해 성능이 불리하여, JIT 컴파일러와 혼용하는 경우가 있음- JS, Python이 인터프리터 언어에 속함 * JIT 컴파일러란?런타임에 컴파일을 진행하되, 번역된 기계어를 캐싱하여 재사용하는 디자인.JVM의 경우 인터프리터와 JIT 컴파일러를 동시에 사용한다. 호출 횟수가 임계치를 초과하는 메서드에 대해서만 컴파일을 진행하는 식이다. 모든 메서드에 대하여.. 2024. 12. 5. 정지 문제(Halting problem)의 간단한 증명 증명을 위해 정지 문제를 판별할 수 있는 함수 H가 존재한다고 하자. (귀류법) 함수 H는 판별할 함수 I를 인자로 받는다. 이 때 함수 J를 아래와 같이 정의하면 모순이 발생한다. J의 인자로 J를 제공하면, - H(J)가 참이라면 J는 언젠가 끝난다는 뜻이지만 J는 무한루프에 의해 끝나지 않는다. - H(J)가 거짓이라면 J는 끝나지 않는다는 뜻이지만 J는 return문에 의해 끝나게 된다. 따라서 이는 모순이다. 2023. 4. 28. 빅 엔디안과 리틀 엔디안을 직접 확인해보자 메모리는 바이트 단위로 주소를 할당하고 저장한다. 다만 CPU 아키텍쳐마다 바이트를 저장하는 순서가 다르고 이를 빅 엔디언과 리틀 엔디언이라는 명칭으로 구분하고 있다. 빅 엔디언은 큰 자릿수부터 저장하는 것으로, 우리가 평소 16진수를 읽는 순서와 동일하다. 그리고 리틀 엔디언은 그 반대로 이해할 수 있다. 왜 방식이 나뉘었는지를 논하자면 여러 이유가 있겠으나, 나는 간단히 빅 엔디언은 사람이 다루기 쉽고 리틀 엔디언은 머신이 다루기 쉽기 때문으로 이해하고 있다. 위 사진처럼 0x12345678을 저장하는 경우, 빅 엔디안은 읽는 순서 그대로 저장되므로 사람이 다루기가 쉽다. 그러나 리틀 엔디안은 오른쪽부터 읽어야하므로 조금 불편하게 느껴진다. 그래도 머신 입장에서는 리틀 엔디안과 같은 형태가 가산 등의.. 2023. 2. 4. 부동소수점의 정밀도 문제에 대하여 부동소수점이란, 임의의 실수를 가수부와 지수부로 나누어 표현하는 방법이다. 소수점이 떠다니듯 움직여서 부동(浮動, float)이라고 하는데, 예를 들어 1.23 * 10^2과 12.3 * 10^1이 동일한 값을 나타내듯 소수점의 위치를 임의로 조정할 수 있기 때문에 붙여진 이름으로 추측된다. 부동소수점은 컴퓨터가 실수를 근사하여 표현하는 데에 사용된다. float 자료형의 경우, 국제 표준인 IEEE 754에 의거하여 부호 1비트, 지수 8비트, 가수 23비트로 총 32비트를 사용하는데, 여기서 지수는 bias = 127을 더함으로써 0~255의 범위가 아닌 -127~128의 범위를 가진다. 이에 float의 크기는 대략 2^-127 ~ 2^128, 즉 10^-38 ~ 10^38으로 굉장히 넓은 범위를 .. 2022. 10. 28. 이전 1 다음