(포스팅 2022.4.12)
저는 본의아니게 C언어를 30년째 사용하고 있습니다. 중학교 1학년때 BASIC과 비슷한 인터페이스의 런C (지금은 찾아볼 수 없습니다)를 잠깐 배우고 바로 Turbo-C 2.0 을 시작하여 10년을 그것만 사용하였습니다.
10년이나 Turbo-C 를 사용하게 된 이유는,
현재는 직업상 안드로이드 Kernel 및 각종 Micom 의 프로그래밍을 하고 있고, 이쪽 분야에 사용되는 언어는 대부분 C 입니다. 이렇다 보니 C언어를 시작한 중학교 시절부터 지금까지 30년동안 C언어를 주력 언어로 사용하였습니다.
오랫동안 C언어를 사용하였다는 말을 하는 이유는, 아래에 설명할 제 의견에 무게를 실어주기 위한 것이고 다른 의미는 없습니다.
제가 보는 C 언어는, 다음과 같은 특징을 가집니다.
어셈블러는 기계어에 add, sub 같은 이름을 붙인 것으로, 특별한 기능없이 외우기 쉽도록 만든 언어입니다. 개발중 반복되는 코드들이 정리되어 매크로로 만들어지긴 합니다만, 근본적으로 CPU 내부에서 발생하는 모든 코드를 프로그래머가 만들어야 한다는 점은 변하지 않습니다.
C언어는 사람이 쓰기 편하게 포장한 어셈블러에 가깝습니다. int / long / char 등 형식이 있고 'null 문자로 문자열의 끝을 표시한다'는 규칙이 있습니다만, C언어 개발자라면 자기가 만든 각각의 코드가 어떻게 어셈블러로 변환되는지 어느 정도 알고 있습니다.
기계에 친화적인 순서로 나열해 보면 다음과 같습니다.
기계어 < 어셈블러 < C < 그외 언어
C 언어에서 하나의 integer 변수를 사용한다고 가정해 봅니다. CPU 입장에선 이것이 RAM 의 특정 위치의 값을 의미합니다. 개발자는 이것을 integer 그대로 사용할 수도, 포인터 주소로 사용할수도, 2byte char로 사용할 수도, 또는 Function Call 주소로도 사용할 수 있습니다. 이것은 '다양하게 사용할 수 있다'라기 보다는 '애초에 integer 는 껍데기일 뿐이다'에 가깝습니다.
C 언어는 애초에 '폰 노이만 구조'에 대해 이해를 하고 있다는 가정하에 사람이 이해하기 쉬운 껍데기를 씌웠을 뿐, 사용시에는 언제든지 어셈블러에 가까은 활용을 할 수 있도록 하고 있습니다. C 언어를 제대로 활용하려면 '폰 노이만 구조'의 동작에 대해 먼저 이해하는 것이 좋습니다. 가능하다면 C언어를 배우기 전에 어셈블러를 조금 접해보는 것이 좋습니다.
C 언어의 기본 라이브러리는 양이 적고 코드도 심플하여, 개발자가 이해하거나 직접 만들어 사용할 수 있게 되어 있습니다. 객체의 생성자나 소멸자를 자동으로 호출하거나 Gabage Collection 을 통해 메모리 관리를 자동으로 수행하는 언어에서는, 이러한 특별한 기능이 어떻게 동작하는지 모르는 상태에서 코딩을 하게 됩니다. 예를 객체의 소멸자가 호출될때 객체가 소멸되었음에도 호출되는 원리가 어떤 것인지 이해하고서 작업하는 개발자는 많지 않을 것입니다. C언어는 프로그램의 시작부터 끝까지 모든 코드를 프로그래머가 작성해야 하고, 원한다면 라이브러리의 코드까지 확인하여 코드가 어떻게 동작하는지를 모두 이해할 수 있습니다.
이러한 점이 오히려 부작용으로 작용하여, Gabage Collection 이나 Smart Pointer 등 상위 개념을 활용할 수 없는 불편함을 감수해야 합니다만, 자신이 만든 코드를 자신이 전부 이해할 수 있다는 것은 개발에 있어 엄청난 강점입니다. 정밀한 시스템에서 자신이 모르는 코드에서 치명적인 에러가 발생했을시 얼마나 당황스러운지는, 따로 설명드리지 않아도 될 것입니다.
C 언어가 우수한 언어이냐?
C 언어를 다른 언어보다 좋아하느냐?
이런 질문에 대한 저의 답변은 '필요할때 필요한 언어를 사용하면 된다' 입니다.
제가 C 언어를 사용하는 30년 동안 PC의 성능은 비교가 불가능할 만큼 발전하였고, 수많은 프로그래밍 언어가 태어나고 사라졌습니다. 시스템이 발전하면 발전할 수록, 부트로더나 커널에나 필요할 C 언어의 입지는 더더욱 좁아질 것입니다. 다만 이 첨단 세상에서도 누군가는 밭을 갈아야 하고 아무리 훌륭한 자동차도 출발하려면 반드시 시동을 거는 절차가 필요한 것처럼, C 언어는 마지막까지 사라지지 않는 언어가 될 것이라고 조심스럽게 생각해 봅니다.
감사합니다.
(C언어) ARRAY_SIZE()로 배열크기 측정 시 유의점 (0) | 2022.10.07 |
---|---|
NULL을 사용하는 이유 (2) | 2022.10.05 |
C# 여러 커맨드를 한번에 실행 (0) | 2022.04.08 |
c# 문자열을 라인별로 분리하는 방법 (0) | 2022.04.08 |
c# 빌드시점 확인 및 사용기간 제한 (만료일자) 넣기 (0) | 2022.04.08 |
댓글 영역