어떻게 어셈블리어로 C언어 작성이 가능했을까요?

kdyapple98의 이미지

C언어로 작성된 프로그램은 이식성이 좋은데
정작 C언어는 컴퓨터 구조에 따라 달라지는 어셈블리어로 작성되었다니....
뭔가 모순이 느껴지는데요

Q1.C언어가 작성될 당시부터 지금까지 컴퓨터 구조가 같다...라는 얘기일까요?

vagabond20의 이미지

컴퓨터를 뜯어보면 하드웨어의 근간은 결국은 마이크로 프로세서 (CPU 중앙처리장치) 와 메모리 이고 이를 제어하는것은 기계어입니다. 그리고 기계어는 어셈블리어로 거의 1:1 관계로 번역이 됩니다. 어셈블리어가 컴퓨터마다 많이 다를것같지만 실제로는 마이크로 프로세서를 만드는 회사 수 만큼 있다고 보면 거의 맞고, 대표적인 회사는 그 수가 (인텔, AMD, IBM 등) 몇 안되는데, 그나마 IBM 쪽을 표준으로 받아들여 많이 따라 가면서 발전해 왔습니다. (어셈블리어가 거의 비슷비슷하다는 얘기임.)
Microprocessor Chronology

크게 보면, 네 - 지금까지의 컴퓨터 구조는 대동소이 합니다. 단, 더 복잡해지고 고성능화 한것이지 가장 근저로 내려가서 기계어 입장에서 보면 거의 같은일을 반복적으로 하는게 전부 입니다.

고급 프로그래밍 언어 개발은 결국은 사용자/개발자들이 기계의 특성에 맞게 가장 효율적으로 명령어들을 조합할 수 있게 해 주는데 주안점을 둡니다. 컴퓨터 속으로 들어가서 '마이크로 프로세서와 메모리' 입장에서 보면 연속해서 읽혀 들어오는 어셈블리어 명령(실제로는 기계어 명령)어를 한나씩 실행시켜서 단순한 작업(메모리와 레지스터간의 로드, 치환, 좌우쉬프트, 저장, 복사 등) 을 반복하는것이지요.

즉, C 언어의 명령어 구문 하나하나를 중앙처리장치와 메모리 속에서 어떠한 어셈블리어 구문으로 풀어써야 할지 고민해서 만들어진것이라고 보면 되고, 컴파일러는 그 절차를 정반대로 수행해서 처음 의도한 (또는 사용된) 어셈블리어로 풀고 그것을 기계에게 제공한다고 보면 됩니다. C 언어로 컴파일/바인드 하면서 그 과정을 디버깅해서 나타내면 (컴파일러나 시스템에 따라서) 어셈블리어를 보여주는 기능도 있습니다.

*
자바가 "이식성" 이 더 좋다는 얘기는 또 하나의 질문을 유도하겠으나, 관심이 있으시다면 두 언어 (C 와 Java) 를 비교하는 아티클이나 위키는 직접 찾아보셔서 알아보는 "연습" 도 하시길 권합니다.

여의도자바

DarkSide의 이미지

C언어로 작성된 프로그램은 이식성이 좋지 않습니다.
같은 기종, 같은 OS에서만 돌아가고, 어셈블리보다 조금 나은 정도입니다.

C언어가 아니라 C언어 컴파일러가 초기에 어셈블리로 작성된 것이고, 이후에는 C언어 컴파일러 자체를 C언어로 만들게 되었습니다. C언어 자체는 규격이므로 하드웨어와 무관합니다.

 의 이미지

모순이랄 것 있나요, 당연한 것입니다.

C언어(를 위시한 고급 언어) 구현이 컴퓨터 구조간의 차이를 흡수하고 있기에, C언어 프로그램은 이식성을 가질 수 있는 것이죠.

이는 질문자님께서 통역사를 고용하면 외국어를 안 배워도 되지만, 결국 통역사는 외국어를 배운 사람이라는 것과 마찬가집니다.

결국 그런 이유로 구현 환경(=컴파일러 등)은 컴퓨터 구조별로 하나씩 따로 있어야 합니다. 각 언어마다 해당 언어의 통역사를 따로 고용해야 하는 것처럼요. (n개 국어를 하는 통역사 등은 무시합시다. 비유라는 게 모든 면에서 적절할 수는 없는 거죠)

덧붙여, C언어의 이식성에 대해서 부연 설명을 더 드려야겠군요.
앞서 답변하신 두 분께서 C언어의 이식성 보장이 자바보다 좋지 않다고 말씀하셨는데, 아주 틀린 말씀까지는 아니지만 부연 설명이 좀 더 있어야 오해를 막을 수 있겠네요.

자바와 C언어의 이식성 보장 철학은 상당히 다릅니다. 자바는 언어 표준 차원에서 프로그래머에게 균일한 환경을 제공하는 데 목적을 두고 있습니다. 예컨대 int는 반드시 -2^31 ~ 2^31-1을 표현 가능해야 한다, 뭐 이런 식으로 못박아 두는 거죠. 다양한 종류의 컴퓨터 구조에서 이런 균일한 환경을 제공하기 위해 부득이 자바 구현환경이 복잡해질 수밖에 없습니다.

반면에 C언어 표준의 경우, 다양한 컴퓨터 구조를 지원하기 위해 "최소한의 보장"만을 제공하는 경향이 있습니다. 예컨대 A는 16비트 워드를 지원하고 B는 32비트 워드를 지원하니까, "C언어의 int는 16비트 이상이다" 라고 정의한다던가. (예를 들었을 뿐 정확한 것은 아닙니다.) 이 경우 int를 실제로 16비트로 할지 32비트로 할지는 각 컴퓨터 구조를 위한 컴파일러 개발자들이 결정하는 것입니다. 이런 식으로 C언어 표준에는 "상세 사항은 구현 환경에 맡기는" 요소들이 제법 있습니다.

이 두 철학은 일장일단이 있습니다. 하지만 상세 사항은 넘어가더라도 자바의 이식성 보장이 프로그래머에게 더 마음 편한 방식이라는 데엔 의문의 여지가 없지요. 자바 프로그램이라고 항상 플랫폼 독립적이지는 않더라는 반론도 없지는 않은 모양입니다만.

C언어 프로그램도 표준을 철저히 준수한 프로그램이라면 이식성이 있습니다. 문제는 그렇게 하는 게 수갑 차고 프로그래밍하는 것과 비견될 정도로 답답하다는 거죠. 언어 표준에서 보장해 주는 내용이 워낙 적으니까요. 하지만 Java에 비해 값싸게 이식성을 보장해주고 있다는 측면을 무시할 수는 없습니다. 뭐, 지금 Linux 커널도 일부 "기계 의존적인 코드"를 제외하고는 C언어로 쓰여 있지요.

지나가던..의 이미지

C의 이식성과 자바의 이식성에 대해서 한 가지를 덧붙이자면
C의 이식성은 컴파일러의 이식성이고 자바가 강조하는 이식성은 자바로 작성된 프로그램의 이식성입니다.
하드웨어 의존적이지 않고 표준에 맞는 C코드는 여러 하드웨어 / OS 에서 각각 컴파일되어 사용될 수 있습니다. 자바 프로그램은 다시 컴파일할 필요가 없고 하드웨어에 대한 추상화도 범위가 더 넓지요.
하지만 실제로 지원되는 하드웨어/OS의 수를 비교하면 gcc 덕분에 C가 자바에 비해 압도적으로 많습니다.

shint의 이미지

1 패스 컴파일 - 터보C
2 패스 컴파일 - 어셈블리
3 패스 컴파일 - MSVC

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.