728x90
24.08.12 CS, C#
CS
컴파일/트랜스파일/인터프리터
컴파일(Compile)
- 한 언어로 작성된 소스 코드를 다른 언어로 변환하는 것이 컴파일이다.
- C언어를 기계어로 옮기는 것, Java를 Bytecode로 옮기는 것 모두 이 정의에 따르면 Compile에 해당한다. 심지어 TypeScript를 JavaScript로 옮기는 것 역시 이 범주안에 속한다고 할 수 있기도 하다. (엄밀히 말하면 트랜스파일링이다.)
- 고수준의 언어를 바이트 단위의 기계어로 변환해야 컴파일이라고 말하는 것이 아니다. 컴파일은 한 언어로 작성된 코드를 다른 언어로 옮기는 일 자체를 통칭한다고 보면 된다.
트랜스파일(Transpile)
- 한 언어로 작성된 소스 코드를 비슷한 수준의 추상화를 가진 다른 언어로 변환하는 것이 트랜스파일이다.
- Transpile은 Compile의 Subset인데, 추상화 정도가 유사한 언어를 다른 언어로 Compile하는 것을 특별히 Transpile이라고 부른다고 보면 된다.
- 예를 들어 높은 버전의 자바스크립트 코드를, IE 호환성을 위해 낮은 버전의 자바스크립트로 변환하는 Babel도 이 범주에 속한다.
- 타입스크립트를 자바스크립트로 컴파일 하는 것 역시 엄밀히 따지자면 트랜스파일링이다.
- 예시
- C++ → C
- ES6 → ES5( Babel )
- typescript / coffeescript → Javascript
- sass / scss → css
인터프리터(Interpreter)
- 사람이 알아보기 쉬운 프로그래밍 언어로 작성한 코드를 한 줄 씩 기계어로 번역하는 번역기다. 인터프리터는 즉각적인 번역에 특화된 번역기로 번역 속도가 빠르다. 하지만 한 줄 작성하고 엔터칠 때마다 새롭게 번역을 하니, 프로그램을 매번 실행하기에는 느리게 된다.
컴파일러 vs 인터프리터
- 인간이 읽기 편한 고수준의 프로그래밍 언어를 컴퓨터가 읽을 수 있게 저수준의 기계어로 변환하기 위해 대표적인 2가지 이다.
- 컴파일러
- 프로그램 전체를 스캔하여 이를 모두 기계어로 번역한다.
- 전체를 스캔하기 때문에 대개 컴파일러는 초기 스캔 시간이 오래 걸린다. 하지만 전체 실행 시간만 따지고 보면 인터프리터 보다 빠르다.
- 기계어 번역 과정에서 많은 메모리를 사용한다.
- 그리고 컴파일러는 전체 코드를 검사한 후에 오류 메시지를 생성하기 때문에 프로그램을 실행 전에 오류를 발견할 수 있다.
- 대표적으로 C, C++, JAVA 등이 있다.
- 인터프리터
- 프로그램 실행시 한 번에 한 문장씩 번역한다.
- 한 번에 전체를 스캔하고 실행파일을 만들어서 실행하는 컴파일러보다 실행시간이 더 걸린다. 하지만 컴파일러보다 메모리 효율이 좋다.
- 또한 인터프리터는 오류 메시지 생성과정이 컴파일러와 다르다. 인터프리터는 한번에 한문장씩 번역하기 때문에 프로그램을 실행시키고 한 문장씩 번역될 때 오류를 만나게 되면 바로 프로그램을 중지하게 된다. 그래서 프로그램을 실행해봐야지만 오류 발견이 가능해서 사용성에 문제가 될 수 있다.
- 대표적으로 Python, Ruby, Javascript 등이 있다.
참조
https://inpa.tistory.com/entry/CS-🖥️-컴파일-트랜스파일-인터프리터-비교-쉽게-설명
C#
Exception has been thrown by the target of an invocation
- .NET 응용 프로그램에서 리플렉션(Reflection)을 사용하여 메서드나 속성을 호출할 때 발생하는 예외이다.
- 이 예외는 호출된 메서드나 속성에서 내부적으로 예외가 발생했을 때, 리플렉션이 이 예외를 포착하고, 이와 같은 일반적인 예외 메시지를 반환할 때 나타난다.
예외의 원인
- 이 오류는 특정한 예외에 대한 직접적인 정보가 없기 때문에, 예외의 원인이 무엇인지 알기 위해서는 내부 예외(Inner Exception)를 확인해야 한다. 내부 예외에는 실제로 발생한 문제에 대한 구체적인 정보가 포함되어 있다.
일반적인 발생 시나리오
- 리플렉션을 통한 메서드 호출
- 리플렉션을 사용하여 메서드를 호출할 때, 그 메서드 내부에서 발생한 예외가 리플렉션 API에 의해 캡처되어 “Exception has been thrown by the target of an invocation”이라는 메시지와 함께 반환된다.
try { MethodInfo method = typeof(SomeClass).GetMethod("SomeMethod"); method.Invoke(someInstance, null); } catch (TargetInvocationException ex) { Console.WriteLine(ex.InnerException?.Message); // 실제 예외 메시지 }
- 잘못된 메서드 호출
- 대상 메서드에 잘못된 매개변수를 전달하거나, 메서드가 존재하지 않거나, 접근 권한이 없을 때 발생할 수 있다.
- 타입 또는 메서드 미스매치
- 리플렉션으로 호출하려는 메서드와 실제 인스턴스의 타입이 일치하지 않을 경우 발생할 수 있다.
문제 해결 방법
- 내부 예외 확인
- 예외의 실제 원인을 알아내기 위해 ‘TargetInvocationException.InnerException’ 속성을 확인한다. 이 속성에는 원래 발생한 예외에 대한 구체적인 정보가 포함되어 있다.
catch (TargetInvocationException ex) { Console.WriteLine("Inner Exception: " + ex.InnerException?.Message); }
- 리플렉션 코드 검토
- 리플렉션을 통해 호출하는 메서드의 매개변수 타입, 접근 가능성 등을 다시 확인하여, 올바르게 호출되고 있는지 점검한다.
- 디버깅
- 디버거를 사용하여 코드의 예외 발생 지점을 확인하고, 예외의 원인을 추적한다. 메서드 호출 이전과 이후의 상태를 면밀히 검토한다.
- 권한 문제 확인
- 호출 대상 메서드에 접근 권한이 충분한지 확인한다. 접근 제한자(private, protected 등)가 문제가 될 수 있다.
CompareTo
- C#에서 객체 간의 비교를 위해 사용되는 메서드이다.
- 이 메서드는 특정 타입의 두 객체를 비교하여, 그 객체가 다른 객체보다 작거나, 같거나, 큰지를 나타내는 정수 값을 반환한다.
- CompareTo 메서드는 주로 정렬 알고리즘에서 객체들을 정렬하는 데 사용된다.
CompareTo 메서드의 반환값
- 음수 값(’-1’)
- 호출하는 객체가 비교하는 객체보다 작음을 의미한다.
- 0
- 호출하는 객체와 비교하는 객체가 같음을 의미한다.
- 양수 값(’1’)
- 호출하는 객체가 비교하는 객체보다 큼을 의미한다.
사용 예제
- CompareTo 메서드는 주로 IComparable<T> 인터페이스와 함께 사용되며, 기본 데이터 타입과 사용자 정의 클래스에서 사용할 수 있다.
- 기본 데이터 타입
int a = 5; int b = 10; int result = a.CompareTo(b); if (result < 0) { Console.WriteLine("a는 b보다 작습니다."); } else if (result == 0) { Console.WriteLine("a와 b는 같습니다."); } else { Console.WriteLine("a는 b보다 큽니다."); }
- 사용자 정의 클래스
public class Person : IComparable<Person> { public string Name { get; set; } public int Age { get; set; } public int CompareTo(Person other) { if (other == null) return 1; return this.Age.CompareTo(other.Age); } } class Program { static void Main() { Person person1 = new Person { Name = "Alice", Age = 30 }; Person person2 = new Person { Name = "Bob", Age = 25 }; int comparison = person1.CompareTo(person2); if (comparison > 0) { Console.WriteLine($"{person1.Name} is older than {person2.Name}"); } else if (comparison < 0) { Console.WriteLine($"{person1.Name} is younger than {person2.Name}"); } else { Console.WriteLine($"{person1.Name} and {person2.Name} are of the same age"); } } }
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.08.14 CS, Dev (0) | 2024.08.14 |
---|---|
24.08.13 CS, C# (0) | 2024.08.13 |
24.08.09 C#,DEV (0) | 2024.08.09 |
24.08.08 Dev, C# (0) | 2024.08.08 |
24.08.07 C# (0) | 2024.08.07 |