728x90
반응형
SMALL

현실에서 프로그래밍은 대규모로 이루어짐

이때 사용되는 전략

  1. 무엇을 해야 할지 파악
  2. 넓은 명세부터 시작해서 작은 부분으로 해야 할 일을 나누기
  3. 각 부분을 작업하며 전체적으로 일관되어 있는지 확인

프로그래밍에서 작업 하나의 크기 == 보통 한 사람이 프로그래밍 언어로 정확한 처리 단계를 작성할 수 있는 정도

다른 프로그래머들의 작업과 함께 잘 작동하는지 확인하는 일은 어려움

ex. 1999년 NASA의 화성 기후 궤도선이 고장난 사건(미터법 단위 vs 야드파운드법 단위)

아무튼 필자의 첫 번째 ‘진짜’ 프로그램도 약 1000줄 정도

작가가 교수로 있는 학생들이 학교를 다니며 작성하는 프로젝트(8 ~ 10주)도 약 2000 ~ 3000줄

컴파일러나 웹 브라우저는 코드가 수십만에서 수백만 행

대규모 시스템은 수백만, 수천만 행로 같이 일하는 사람도 수백에서 수천 명 정도, 시스템의 수명도 수십년

구글은 2015년 행사에서 프로그램의 규모를 밝히기로 전체 코드 규모가 약 20억 행 (필자의 추측으로 지금은 두 배 이상 됐을 가능성이 있다고 함)

이 정도 규모의 소프트웨어를 개발하려면 프로그래머, 테스트 담당자, 문서 작성자로 이루어진 팀이 여럿이 필요하고 회의가 끊임없이 있고 대충 매우 바빴을거라 한다.

라이브러리, 인터페이스, 개발 키트

프로그래밍도 집 짓는 것과 마찬가지로 다른 사람들이 만들어 놓은 여러 가지 구성 요소를 바로 구해서 사용할 수 있음

프로그래밍 언어는 가장 단순한 수준의 함수 메커니즘을 제공

함수 메커니즘 : 어떤 프로그래머가 유용한 작업을 수행하는 코드를 작성하면 다른 프로그래머가 그 내부 작동 방식을 모르더라도 프로그램에 사용할 수 있는 형태로 코드를 패키지화할 수 있게 해줌

연관된 함수들의 모음을 보통 라이브러리라고 함

함수 라이브러리가 제공하는 서비스는 API로 프로그래머에게 제공

API는 포함하는 함수, 함수의 용도가 무엇인지, 어떻게 사용해야 하는지, 어떤 입력 데이터를 요구하는지, 어떤 값을 만들어 내는지 나열

또 API는 시스템 내부에서 주고받는 데이터의 구조를 의미하는 자료 구조와 기타 세부 사항도 기술할 수 있음

결론적으로 API는 함수 + 함수의 정보 + 지원 문서

요즘 대규모 시스템은 프로그래머들이 복잡한 소프트웨어 라이브러리를 잘 다룰 수 있도록 소프트웨어 개발 키트(SDK)도 포함

ex. 애플 ⇒ 아이폰, 아이패드 코드를 위한 Xcode, 구글 ⇒ 안드로이드용 SDK 안드로이드 스튜디오, 마이크로소프트 ⇒ 윈도우 코드를 위한 폭넓은 개발환경

버그

컴퓨터의 시키지 않은 엉뚱한 일, 오답 ⇒ 프로그램의 결함

  • 발생할 수 있는 경우를 깜박하고 처리하지 못함
  • 어떤 조건을 평가하기 위한 논리 테스트나 산술 테스트를 잘못 작성
  • 잘못된 공식을 사용
  • 프로그램이나 프로그램의 특정 부분에 할당된 영역 밖에 있는 메모리에 접근
  • 특정 종류의 데이터에 잘못된 연산
  • 사용자 입력이 적합한지 검사하지 못함

⇒ 다양한 문제들을 모두 버그라고 할 수 있음

이런 문제를 위해 테스트는 프로그래밍에서 큰 부분을 차지

소프트웨어를 개발하는 기업에는 구현 코드의 양 < 테스트 코드의 양, 프로그래머 < 테스터

요새는 테스터가 테스트 코드를 작성하진 않고 공고만 봐도 테스트 코드를 습관화하고 이해하고 있는 개발자를 많이 뽑는 것 같음

버그는 시스템을 공격에 취약하게 만들기도 하고 종종 공격자가 메모리 악성코드를 심어 놓기도 쉬워지기도 함

업데이트가 잦다는 것은 취약점이 널리 퍼져있다는 것 ⇒ 웹 브라우저처럼 해커의 타겟이 자주 되는 중요한 프로그램이 그러함

소프트웨어가 패치될 때마다 취약점이 수정되기 때문에 사용자들은 소프트웨어를 최신 상태로 유지하는 것이 중요

소프트웨어 개발이 복잡해지는 것은 버그 뿐만 아니라 급변하는 환경에도 있다.

새로운 법이나 기타 요구사항이 등장하면 프로그램의 사양이 바뀜

ex. 터보택스는 서로 다른 관할권에서 세법이 바뀔 때마다 대응해야 함

뿐만 아니라 컴퓨터 기종, 각종 툴, 프로그래밍 언어, 물리적 장치, 데이터 형식 등이 구식이 되면 교체되어야 함

끊임없는 변화에 뒤처지지 않고 따라가는 것이 소프트웨어 유지보수에 매우 중요, 반드시 수행해야 하는 일

그렇지 않으면 프로그램은 ‘비트 부식’을 겪게 되어

재컴파일을 할 수 없게 되거나 몇몇 라이브러리가 너무 많이 바뀌어 작동하지 않거나, 업데이트 할 수 없는 상태가 됨

728x90
반응형
LIST
728x90
반응형
SMALL
  1. 계획이 필요하다: 글을 쓸 때, 보통 계획을 세우고 시작한다. 주제를 정하고, 어떤 내용을 담을지, 어떤 순서로 진행할지 등을 결정한다. 마찬가지로 프로그래밍도 비슷하다. 문제를 정의하고, 어떤 기능이 필요한지, 어떤 로직으로 그 기능을 구현할지 등을 생각해낸다.
  2. 절차적 사고가 필요하다: 글을 쓸 때, 단순히 무작정 글을 쓰는 것이 아니라 명확한 흐름과 순서가 필요하다. 먼저 주제를 소개하고, 본론으로 이어가는 등의 과정이 필요하다. 이는 프로그래밍의 절차적 사고와 매우 비슷하다. 어떤 함수나 명령이 먼저 실행되고, 그 다음에 어떤 것이 실행되어야 하는지 등을 정확히 이해하고 구현해야 한다.
  3. 반복과 수정: 작문도 프로그래밍도 완성된 후에는 수정과 보완이 필요하다. 글을 쓴 후에는 교정을 하고, 문맥이 자연스러운지, 오타는 없는지 등을 확인한다. 프로그래밍에서도 비슷하게 코드를 작성한 후에는 검토하고, 오류는 없는지, 로직이 올바른지 등을 확인한다. 이 과정을 통해 최종적으로 완성된 결과물을 얻는다.
  4. 창의성: 작문과 프로그래밍 모두 창의성이 중요하다. 작문에서는 독특한 표현이나 창의적인 플롯을 통해 독자의 마음을 사로잡을 수 있다. 프로그래밍에서는 독특한 알고리즘을 사용하거나, 사용자 경험을 향상시키는 창의적인 방법을 통해 좋은 프로그램을 만들 수 있다.

포트란(Fortran), 코볼(COBOL), 베이직(BASIC)은 컴퓨터 프로그래밍 언어이다. 각각의 언어는 다양한 시기와 목적에 맞춰 개발되었다.

포트란(Fortran)

과학 및 공학 분야에서 널리 사용되는 프로그래밍 언어 "Formula Translation"의 줄임말로, 초기에는 수치 계산과 과학적인 계산을 위해 개발되었다. 현재까지도 과학 및 엔지니어링 분야에서 널리 사용되고 있다. 포트란은 고성능과 수치 계산에 특화되어 있다.

수학적인 식과 알고리즘을 효과적으로 표현할 수 있는 기능을 제공한다. 과학적인 연구, 기상학, 우주 과학, 물리학, 엔지니어링 등 다양한 분야에서 포트란을 사용하여 복잡한 계산과 모델링을 수행할 수 있다.

포트란은 강력한 수치 연산 기능을 제공하며, 배열(array)과 행렬(matrix)을 다루는 기능도 내장되어 있다. 이를 통해 대량의 데이터를 처리하고 계산할 수 있습니다. 또한, 포트란은 고성능 컴퓨터 시스템과의 연동이 용이하며, 병렬 처리 및 벡터 연산을 지원하는 기능도 갖추고 있다.

포트란 언어의 문법은 비교적 단순하고 명확하며, 코드의 가독성을 높이는 데 중점을 두었다. 또한, 다양한 라이브러리와 툴킷이 존재하여 포트란을 활용한 프로젝트 개발이 용이하다.

최신의 포트란 언어인 포트란 90, 95, 2003, 2008, 2018 등은 이전 버전과 비교하여 다양한 기능과 향상된 문법을 포함하고 있다. 이는 프로그래밍의 편의성과 성능을 향상시키는 데 도움을 준다.

요약하면, 포트란은 과학과 엔지니어링 분야에서 사용되는 고성능의 수치 계산과 과학적인 모델링을 위한 프로그래밍 언어이다. 강력한 수치 연산 기능과 컴퓨터 시스템과의 연동성을 제공하며, 코드의 가독성과 효율성을 추구한다.


코볼(COBOL)

"COmmon Business-Oriented Language"의 약자로, 주로 비즈니스 및 금융 분야에서 사용되는 프로그래밍 언어 1959년에 개발되었으며 초기에는 대형 컴퓨터 시스템을 위해 설계되었다.

코볼은 업무 처리와 데이터 처리를 위한 목적으로 사용된다. 주요한 특징 중 하나는 읽기 쉽고 이해하기 쉬운 문법을 갖추고 있다는 것이다. 이는 프로그래밍을 처음 접하는 사람들이 쉽게 학습하고 응용할 수 있도록 도와주는 장점이다. 또한, 영어에 가까운 문법을 사용하여 비전문가들도 코드를 이해하고 유지보수할 수 있다.

코볼은 대규모 기업 시스템에서 여전히 널리 사용되고 있다. 많은 기업은 수십 년 동안 코볼로 개발된 레거시 시스템을 운영하고 있으며, 이러한 시스템을 계속 유지보수하고 확장하기 위해 코볼 개발자의 수요가 여전히 존재한다.

또한, 코볼은 데이터 처리에 강점을 가지고 있다. 대용량 데이터베이스와의 통합이 용이하며, 배치 처리와 파일 처리에 특화되어 있다. 이는 금융 거래, 인사 관리, 재고 관리 등과 같은 업무 처리를 효율적으로 수행할 수 있게 도와준다.

코볼은 절차적인 프로그래밍 스타일을 따르며, 구조적 프로그래밍 원칙을 적용할 수 있다. 이는 코드의 가독성과 유지보수성을 높이는 데 도움이 된다. 또한, 모듈화와 재사용성을 강조하여 큰 규모의 프로젝트를 효과적으로 관리할 수 있도록 지원한다.

최근에는 코볼을 현대적인 환경에 맞게 업데이트하고 개선하는 노력도 이루어지고 있다. 예를 들어, 객체 지향 프로그래밍과의 통합, 웹 서비스와의 통신 등을 위한 확장된 기능이 도입되었다.

요약하면, 코볼은 비즈니스 및 금융 분야에서 주로 사용되는 프로그래밍 언어로, 업무 처리와 데이터 처리를 위해 설계되었다. 읽기 쉬운 문법과 대용량 데이터 처리의 강점을 가지고 있으며, 대규모 기업 시스템에서 여전히 활발하게 사용되고 있다.


베이직(BASIC)

"Beginner's All-purpose Symbolic Instruction Code"의 약자로, 초기에는 교육용으로 개발된 프로그래밍 언어 1964년에 다트머스 대학교에서 개발되었으며, 컴퓨터 프로그래밍을 처음 배우는 사람들을 위해 설계되었다.

베이직은 프로그래밍 언어를 배우는 초보자들이 쉽게 이해하고 사용할 수 있도록 설계되었다. 문법이 간단하고 직관적이며, 코드 작성에 필요한 명령어와 구문이 상대적으로 적은 편이다. 이를 통해 초보자들이 쉽게 프로그래밍을 시작하고 학습할 수 있다.

또한, 베이직은 대화식 프로그래밍(interactive programming)에 적합하게 설계되었다. 사용자가 프로그램을 작성하고 실행하면서 결과를 즉시 확인할 수 있다. 이는 프로그래밍 과정을 보다 직관적이고 상호작용적으로 만들어준다.

베이직은 다양한 플랫폼에서 사용되었으며, 초기에는 개인용 컴퓨터(PC)에서 많이 사용되었다. 특히 1980년대와 1990년대에는 MS-DOS와 함께 제공되는 QBasic, Visual Basic과 같은 베이직 변형이 유명해졌다. 이러한 변형들은 Windows 환경에서 GUI(Graphical User Interface) 프로그래밍을 지원하며, 비주얼 베이직(Visual Basic)은 마이크로소프트에서 개발되어 Windows 응용 프로그램 개발에 널리 사용되었다.

현재에도 베이직은 교육용이나 간단한 프로그래밍 작업에 활용되는 경우가 있다. 또한, 초보자를 위한 프로그래밍 교육 언어로 여전히 사용되며, 프로그래밍 개념과 기초를 익히는 데 유용한 도구로 활용될 수 있다.

요약하면, 베이직은 초보자를 위해 설계된 간단하고 직관적인 프로그래밍 언어이다. 초기에는 교육용으로 개발되었으며, 초보자들이 프로그래밍을 쉽게 배우고 응용할 수 있도록 도와준다. PC 환경에서 많이 사용되었으며, 현재에도 교육 및 간단한 프로그래밍 작업에 활용될 수 있다.


1970년대에 ‘시스템 프로그래밍’ 용도로, 즉 어셈블러, 컴파일러, 텍스트 편집기 같은 프로그래머 도구와 심지어 운영체제까지 작성할 목적으로 사용할 언어들이 만들어졌다. 그 중 단연코 가장 성공적이었던 것은 C언어이다.

오늘날 컴퓨터에서 사용되는 주요 프로그램 대부분은 C나 C++ 작성됐다. 대부분의 맥 소프트웨어는 C, C++, 오브젝티브-C(C의 변종)로 작성된다.

728x90
반응형
LIST
728x90
반응형
SMALL

고수준 프로그래밍 언어(high-level programming language)

  • 사람이 이해하기 쉬운 언어와 비슷한 형태의 프로그래밍 언어를 의미한다. 고수준 언어는 컴퓨터 하드웨어와 상대적으로 멀리 떨어져 있으며, 대부분의 사람들에게 친숙하고 이해하기 쉬운 개념들로 구성되어 있다.

고수준 프로그래밍 언어의 몇 가지 주요 특징은 다음과 같다:

  1. 추상화: 고수준 언어는 낮은 수준의 세부 사항을 숨기고, 개발자가 주로 문제 해결에 집중할 수 있도록 한다. 이러한 추상화는 개발자가 프로그램의 전반적인 로직에 더 많은 시간을 할애할 수 있게 해주며, 코드를 작성하고 디버그하는 과정을 간소화한다.
  2. 이식성: 고수준 언어로 작성된 프로그램은 일반적으로 여러 플랫폼에서 실행될 수 있다. 이는 고수준 언어의 프로그램이 특정 하드웨어나 운영 체제에 의존하지 않도록 설계되었기 때문이다.
  3. 생산성 향상: 고수준 언어는 개발자가 더 빨리 코드를 작성하고 수정할 수 있도록 설계되었다. 이는 언어의 추상화 수준이 높아져, 더 복잡한 작업을 명령문 한 줄로 수행할 수 있게 되기 때문이다.
  4. 유지 관리: 고수준 언어로 작성된 코드는 일반적으로 더 이해하기 쉽고, 수정하거나 디버그하기 편리하다. 이는 코드가 사람이 이해하기 쉬운 형식으로 작성되었기 때문이다.

고수준 프로그래밍 언어의 예로는 Python, Java, C++, JavaScript 등이 있다. 이러한 언어들은 다양한 영역에서 활용되며, 웹 개발, 데이터 분석, 인공 지능, 게임 개발 등 다양한 분야에서 사용된다.


컴파일러

  • 고수준 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 저수준 언어(일반적으로 기계어 또는 바이트 코드)로 변환하는 소프트웨어 도구이다. 이 변환 과정을 "컴파일"이라고 한다.

컴파일러는 일반적으로 다음과 같은 두 단계로 작동한다:

  1. 전처리 및 구문 분석 단계: 이 단계에서 컴파일러는 소스 코드를 읽고, 구문을 분석하여 추상 구문 트리(Abstract Syntax Tree, AST)라는 내부 표현을 생성한다. AST는 소스 코드의 구조와 의미를 반영하며, 이 단계에서 문법 오류가 발견되면 컴파일러는 오류 메시지를 출력한다.
  2. 코드 생성 및 최적화 단계: 컴파일러는 AST를 기계어나 바이트 코드와 같은 저수준 코드로 변환한다. 이 과정에서 컴파일러는 다양한 최적화를 수행하여 생성된 코드가 가능한 효율적으로 실행될 수 있도록 한다.

컴파일러의 주요 장점 중 하나는 소스 코드를 한 번 컴파일하면, 결과로 생성된 실행 파일은 별도의 컴파일 과정 없이 바로 실행할 수 있다는 것이다. 이는 인터프리터와 대조적인 점으로, 인터프리터는 소스 코드를 라인별로 해석하고 실행하기 때문에 실행 시마다 해석 과정이 필요하다.

또한, 컴파일러는 코드 최적화를 통해 프로그램의 실행 속도를 높이는 데 중요한 역할을 한다. 하지만 반대편으로는 컴파일 과정이 인터프리터에 비해 시간이 더 걸릴 수 있다.

컴파일러의 예로는 C의 GCC, Java의 javac, Python의 PyPy 등이 있다.


고수준 언어와 어셈블리 언어의 차이점

모두 프로그래밍 언어이지만, 그들의 추상화 수준, 사용 용이성, 이식성 등 여러 측면에서 중요한 차이점이 있다.

  1. 추상화 수준: 고수준 언어는 많은 수준의 추상화를 제공한. 이는 개발자가 프로그래밍 할 때 더 복잡한 작업을 단순한 명령문으로 수행할 수 있게 해준다. 반면에 어셈블리 언어는 저수준 언어로, 하드웨어에 가까운 명령을 사용한다. 이는 더 세밀한 제어를 가능하게 하지만, 동시에 코드를 작성하고 이해하는 것을 더 복잡하게 만든다.
  2. 사용 용이성: 고수준 언어는 일반적으로 코드를 작성하고 이해하는 것이 더 쉽다. 이는 고수준 언어가 일반적으로 사람이 이해하기 쉬운 형식과 문법을 사용하기 때문이다. 반면에 어셈블리 언어는 특정 CPU 아키텍처에 대한 깊은 이해를 요구하며, 문법이 사람이 이해하기 어렵다.
  3. 이식성: 고수준 언어로 작성된 프로그램은 일반적으로 여러 플랫폼에서 실행될 수 있다. 이는 고수준 언어가 특정 하드웨어나 운영 체제에 의존하지 않도록 설계되었기 때문이다. 반면에 어셈블리 언어로 작성된 프로그램은 특정 CPU 아키텍처에 맞게 작성되므로, 다른 아키텍처에서는 실행되지 않을 수 있다.
  4. 효율성: 어셈블리 언어는 저수준에서 동작하기 때문에, 필요한 경우 최적화를 위해 사용될 수 있다. 하지만, 이는 프로그래머가 하드웨어에 대한 매우 깊은 이해를 가져야 한다는 것을 의미한다. 반면에 고수준 언어는 자동화된 메모리 관리, 오류 검사 등의 기능을 제공함으로써 프로그래머의 작업을 단순화하지만, 이러한 편의성은 때때로 성능에 부정적인 영향을 미칠 수 있다.

요약하면, 고수준 언어는 개발자의 편의성과 코드의 이식성에 중점을 두고 있으며, 어셈블리 언어는 효율성과 세밀한 제어에 중점을 두고 있다. 그러나 최신 고수준 언어의 컴파일러는 상당히 효율적인 기계 코드를 생성할 수 있으므로, 대부분의 경우에는 어셈블리 언어를 직접 사용할 필요는 없다.


고수준 프로그래밍 언어는 어셈블리 언어에 비해 여러 가지 중요한 이점을 가지고 있다:

  1. 사용 편의성: 고수준 언어의 문법은 일반적으로 사람이 이해하기 쉽다. 이는 코드를 작성하고 이해하는 것을 더욱 쉽게 해주며, 프로그래밍 초보자가 학습하기에도 더 적합하다.
  2. 시간 효율성: 고수준 언어는 코드를 빠르게 작성하고 수정하는 데 유용하다. 복잡한 작업을 몇 줄의 코드로 수행할 수 있기 때문에 개발 시간이 크게 단축된다.
  3. 이식성: 고수준 언어로 작성된 프로그램은 여러 플랫폼에서 실행될 수 있다. 즉, 한 번 작성하면 다양한 컴퓨터 아키텍처에서 실행할 수 있다. 반면에, 어셈블리 언어로 작성된 코드는 특정 하드웨어에 대해 작성되므로 이식성이 낮다.
  4. 오류 발견 및 디버깅 용이성: 고수준 언어는 문제 발생 시 오류 메시지를 제공하거나 디버깅 도구를 사용하여 문제를 쉽게 찾고 수정할 수 있다. 어셈블리 언어에서는 이러한 프로세스가 훨씬 더 복잡하고 어려울 수 있다.
  5. 추상화: 고수준 언어는 메모리 관리, 가비지 컬렉션, 보안 기능 등과 같은 중요한 작업을 자동으로 처리한다. 이는 개발자가 복잡한 세부 사항에 신경 쓸 필요 없이 문제 해결에 집중할 수 있게 해준다.
  6. 풍부한 라이브러리 및 프레임워크: 고수준 언어는 웹 개발, 데이터베이스 접근, 그래픽 처리, 기계 학습 등과 같은 많은 작업을 위한 라이브러리와 프레임워크를 제공한다. 이는 개발자가 코드를 빠르게 작성하고, 기존의 테스트된 코드를 재사용할 수 있게 해준다.

이런 이점들 때문에, 대부분의 현대 소프트웨어 개발은 고수준 언어를 사용하여 진행된다. 그러나 어셈블리 언어는 특정 작업에서 최고의 성능을 필요로 할 때, 혹은 하드웨어에 매우 가까운 수준에서 작동해야 할 때 여전히 중요할 수 있다.


프로그래밍 언어는 기본적으로 컴퓨터에게 명령을 내리기 위한 도구이며, 언어마다 공통적인 요소와 독특한 특징이 있다.

프로그래밍 언어 간의 일반적인 유사점은 다음과 같다:

  1. 기본적인 구성 요소: 대부분의 프로그래밍 언어는 변수, 연산자, 조건문, 반복문, 함수 등과 같은 기본적인 구성 요소를 갖고 있다. 이러한 요소들은 데이터를 조작하고, 로직을 제어하며, 코드를 재사용 가능한 단위로 구조화하는 데 사용된다.
  2. 명령적 프로그래밍: 대부분의 언어는 명령형 프로그래밍 패러다임을 따른다. 즉, 프로그램은 일련의 명령으로 구성되며, 이 명령은 순서대로 실행된다.
  3. 타입 시스템: 대부분의 프로그래밍 언어는 타입 시스템을 가지고 있다. 이는 프로그래머가 데이터의 종류를 지정하고, 프로그램이 예상대로 동작하도록 돕는다.

프로그래밍 언어 간의 주요 차이점은 다음과 같다:

  1. 문법: 프로그래밍 언어마다 자체의 고유한 문법을 가지고 있다. 이는 언어를 배우고 사용하는 데 중요한 역할을 하며, 개발자의 선호도와 작업의 특성에 따라 선택하는 언어가 달라질 수 있다.
  2. 프로그래밍 패러다임: 언어는 명령형, 객체 지향, 함수형, 논리형 등 다양한 프로그래밍 패러다임을 지원할 수 있다. 이러한 패러다임은 언어가 문제를 해결하는 방식을 크게 영향을 미친다.
  3. 성능과 용도: 언어마다 성능과 용도에 있어 차이가 있다. 예를 들어, C++와 같은 언어는 시스템 프로그래밍이나 게임 개발에서 선호되며, Python은 데이터 과학과 웹 개발에서 널리 사용된다.
  4. 타입 체크: 일부 언어는 컴파일 시간에 타입을 검사하는 반면(예: Java, C++), 다른 언어는 런타임에 타입을 검사한다(예: Python, JavaScript).
  5. 메모리 관리: 일부 언어(예: C, C++)는 개발자가 메모리를 직접 관리해야 하는 반면, 다른 언어(예: Java, Python)는 가비지 컬렉션 등의 자동 메모리 관리 기능을 제공한다.

이와 같은 유사점과 차이점을 이해하면, 어떤 언어가 특정 작업에 가장 적합한지 결정하는 데 도움이 될 수 있다.


특정 프로세서 아키텍처에 독립적인 고수준 프로그래밍 언어의 개발이다. 고수준 언어를 쓰면 사람이 표현하는 방식에 가까운 용어로 계산 과정을 작성할 수 있다.

고수준 언어로 작성된 코드는 번역기 프로그램을 통해 대상 프로세서의 어셈블리 언어로 된 명령어로 변환한 다음, 어셈블러에 의해 비트로 변환되어 메모리에 로드되고 실행된다.

번역기 프로그램은 보통 컴파일러라고 불리는데, 그다지 통찰력이나 직관이 느껴지지 않는 역사적 용어이다.

일반적인 고수준 언어에서는 두 수 X와 Y를 더하고 결과를 Z에 저장하는 계산이 다음과 같이 표현한다.

Z=X+Y

X와 Y라는 메모리 위치에서 값ㅇ르 가져와서, 두 값을 더하고, Z라는 메모리 위치에 결과를 저장한다.

연산자 ‘=’는 같다가 아니라 대체한다 or 저장한다라는 뜻이다.

모형 컴퓨터용 컴파일러는 이 코드를 세 개의 명령어로 변환하겠지만, 또 다른 컴퓨터용 컴파일러는 두 개의 명령어로 변환할 수도 있을 것이다.


다음으로, 각 어셈블러는 각자의 어셈블리 언어 명령어를 실제 명령어의 비트 패턴으로 변환하는 일 뿐만 아니라 변수 X, Y, Z를 저장할 메모리 이치를 확보하는 일을 담당한다. 비트패턴은 각각의 컴퓨터의 대해 거의 완전히 다르게 변환된다.

실제로 컴파일러가 내부적으로 하나의 ‘프런트 엔드’와 몇 개의 ‘백엔드’로 나뉠 가능성이 있다.

프런트 엔드는 고수준 프로그래밍 언어로 작성된 프로그램을 처리해서 어떤 중간 형태로 만들고, 각 백엔드 엔드는 공통된 중간 표현을 특정 아키텍처에 맞는 어셈블리 언어로 변환한다. 이 구조는 완전히 독립적인 여러 개의 컴파일러를 이용하는 것보다 단순하다.

고수준 언어는 어셈블리 언어에 비해 큰 이점을 갖는다.

  • 사람들이 생각하는 방식에 더 가까워 배우고 사용하기 더 쉽다.
  • 고수준 언어에서는 프로그램을 효율적으로 짜기 위해 특정 프로세서의 명령어 레퍼토리를 알아야 할 필요가 없다. 따라서 더 많은 이들이 더 빨리 프로그래밍을 할 수 있게 해준다.

또한 고수준 언어로 작성된 프로그램은 특정 아키텍처에 종속되지 않는다. 그래서 같은 프로그램이 여러 아키텍처상에서 실행될 수 있다. 보통은 코드를 변경할 필요도 없으며, 위 그림처럼 다른 컴파일러로 컴파일하기만 하면된다.

컴파일 단계는 몇 가지 명백한 에러를 미리 점검하게 해준다. 철자 오류, 괄호 불일치 같은 구문 오류, 정의되지 않은 변수에 대한 연산 같은 것들이 포함됨

어셈블리 언어 프로그램에서 구문 오류 이외의 에러는 검출하기 어렵다. 어셈블러는 명령어의 실행 순서까지는 상관하지 않아서 논리적인 흐름이나 전후 관계를 파악하지 못하기 때문이다. (고수준 언어에서도 구문상 올바르다고 판단되는 프로그램이 여전히 컴파일러가 검출할 수 없는 에러로 가득할 수도 있다.)

프로그래밍 언어 간의 유사점과 차이점을 살펴볼 수 있도록 가장 중요한 고수준 프로그래밍 언어 여섯 가지로 작성된 동일 기능을 볼 수 있다.


컴파일러

  • 고수준 언어를 어셈블리 언어로 변환하는 번역기 프로그램(책 설명)

컴파일러 VS 인터프리터

  컴파일러 인터프리터
정의 고수준 언어로 작성된 프로그램 전체를 목적 프로그램으로 번역한 후, 링킹작업을 통해 컴퓨터에서 실행 가능한 실행 프로그램을 생성 고수준 언어로 작성된 프로그램을 한 줄 단위로 받아들여 번역하고, 번역과 동시에 프로그램을 한 줄 단위로 즉시 실행
장점 반복 처리가 많을 경우, 번역과 실행 과정을 거쳐야 하기 때문에 번역 시간이 오래 걸리지만, 한 번 번역한 후에는 다시 번역하지 않으므로 실행 속도가 빠르다 번역 시, 그때그때 필요한 실행 코드를 생성하므로 사용하는 메모리가 적어 별도의 기억 공간이 적게 필요. 줄 단위로 번역 실행되므로 시분할 시스템에 유용,
단점 컴파일 시 전체 프로그램 코드가 생성되므로 사용하는 메모리가 많아짐 → 별도의 많은 기억 공간 필요 반복 처리가 많은 경우, 번역 속도는 빠르지만 프로그램 실행 시 매번 번역해야 하므로 실행 속도는 느림
언어 C, C++, Java, COBOL, FORTRAN R, Rython, Ruby
실행 속도 빠름 느림
번역 속도 느림 빠름

 

728x90
반응형
LIST

+ Recent posts