본문 바로가기

blah/Amazing Facts on Week

240729 - 240804 금주의 놀라운 사실들

240729

1) Oracle DB는 AS(alias)를 쓰면 'ORA-00933: SQL command not properly ended' 에러를 띄운다… 이 얼마나 끔찍하고 무시무시한 일이니… 그냥 띄어쓰기만 써야 한다는 듯.

 

240730

1) C언어에서 전위연산자(prefix operator)와 후위연산자(postfix operator)의 차이. 보다 정확히는 전위/후위 증감 연산자라고 해야겠지.

전위연산자(ex. ++i)는 변수의 값을 먼저 증가/감소시킨 뒤 해당 값을 표현식(expression)에서 사용한다. 반대로 후위 연산자(ex. i++)는 변수의 값을 표현식에서 사용한 후 해당 값을 증가/감소시킨다.

전위연산자의 경우는 바로 메모리 상에서 변수의 값을 증가/감소시키는 데 반해, 후위연산자의 경우 변수의 원래 값을 임시로 저장하므로 추가적인 메모리를 사용했다고 하는데, 최신 컴파일러에서는 또 다른 모양이다.

l-value와 r-value에 대해서도 알아야 할 거 같다. l-과 r-은 각각 left와 right를 의미했고, 당시 기준으로 대입 연산자 =을 기준으로 왼쪽에 올 수 있는 것을 l-value, 오른쪽에 올 수 있는 것을 r-value라고 불렀다는 듯하다. 시간이 흐르며 l-value는 persistent한 대상을 참조하는 단어로, r-value는 temporary한 대상을 나타내는 단어로 변화하였다. 후위연산자는 r-value에 속한다. 정확히 말하자면 'i++'는 연산을 처리하기 전의 i값을 담고 있는 임시 변수다.

 

// i++의 내부 동작에 대한 비유
{
    tmp = i;
    i = i + 1;
    return tmp;
}

 

정확히 위와 같이 동작하는 건 아니지만, 개념적으로는 위와 비슷하다는 느낌이다.

C언어를 공부하면서 정말 자주 놀라게 된다. 언제쯤 그만 놀라게 될지 궁금해진다.

동시에 Python으로 "딸깍"해서 알고리즘 문제를 풀어왔던 나와 C++로 메모리나 세부 동작에 대해 고민하며 풀어왔던 사람 사이에는 꽤나 커다란 간극이 있지 싶다. 그 간극을 차근차근 메워야겠다.

 

240731

1) 말로만 듣던 스택 오버플로를 겪었다. 코드가 뜬금없이 segmentation fault를 반환했다. 아무리 살펴봐도 내 코드가 로직은 옳지 않을지언정 어딜 잘못 참조하거나 하진 않은 것 같은데 segfault가 나왔다. 도저히 이해가 안 돼서 코드를 계속 주석 처리해보면서 원인을 찾았는데, 크기가 커다란 배열 2개를 반복문으로 초기화하는 부분이 문제였다. 더욱 희한한 것은 두 배열 중 하나만 초기화하면 segfault가 안 난다는 거였다.

결국 디버거로 찍어봤는데, 재밌게도 배열 2개를 반복문으로 초기화하도록 하면 main 함수 진입 시점에서 segfault가 났다. 고라니가 곡할 노릇이었다.

위대한 LLM 챗봇이 없었다면 나는 몇 시간을 더 낭비했겠지만, 다행히 그 은총으로 이게 스택 오버플로라는 말을 들었다. 동적 할당으로 해결했다.

흥미로운 부분은 2개다. 하나는 배열 1개만 초기화하면 스택 오버플로가 안 일어난다는 점이었다. 즉, 고정 크기 배열을 main 함수 밖에서 전역적으로 선언하더라도 실제로 할당은 main 함수 내에서 일어난다는 것. 다른 하나는 main 함수 진입 시에 segfault가 났다는 거다. 이건 컴파일 과정에서 고정 크기 배열에 대한 메모리 할당을 반복문 시점에서 진행하는 게 아니라 main 함수에 진입할 때 미리 고정 크기 배열을 스택 메모리에 할당하도록 짜뒀기 때문이라고 생각한다. line-by-line으로 진행하던 Python에 익숙한 내겐 아주 기묘한 성질이었다.

 

240801

이 날은 달리 놀라운 사실이 없었다.

 

240802

1) '데이터 가상화'란 말을 들었다.

듣자마자 '무슨 소리지' 싶었다. 데이터를 어떻게 가상화한다는 걸까? 좀 찾아보니까 내게는 '데이터베이스 가상화'라는 말이 더 적합하게 느껴졌다.

그 뒤로 가상화에 대해 조금 더 찾아보고 생각했는데, 나는 모든 종류의 가상화가 크게 둘 중 하나라고 생각한다. 하나는 밑단 - 즉 전제 조건을 추상화하는 시뮬레이션이고, 하나는 윗단이 추상적인 형태로, 물리적인 대상을 조작 가능한 논리적 구조로 wrapping하는 인터페이스의 제공이다. 전자는 가상머신이나 컨테이너 같은 거고, 후자는 데이터베이스 가상화나 서버 가상화 같은 것이다.

물론 이 이해가 옳다는 보장은 없다. 적어도 내게 겉핥기로는 그럴싸한 분류인 거고, 자세한 건 가상화 기술에 대해 깊이 맛보면서 알아가야겠지.

 

240803

이 날은 Ubuntu에서 한글 키보드 설정에 대해 괴로운 사실들이 있었지만 놀랍지는 않았다.

 

240804

오늘도 놀라운 사실은 발견하지 못했다. 이 카테고리의 포스팅을 지속해나가려면 어떻게든 놀라운 사실과 만날 만한 기회를 만들어야 할 텐데, 아무래도 뉴스와 독서 정도가 답인 거 같다. 실제로 놀라운 사실이 몇 가지 더 있지만 대외비라 공개하기 힘든 게 많아서. 며칠 전부터 <(AI, 빅데이터에 숨어 있는)수학의 아름다움>과 <프로그래밍의 규칙>이라는 책을 깔짝대고 있는데, 전자는 꽤 흥미롭고 후자는 내가 못 알아듣는 부분이 많았다. <프로그래밍의 규칙>은 좀 더 경험이 쌓여야 할 것 같다.