프로그래밍 언어의 차이

random-olive·2022년 10월 15일
0

Ch2. 프로그래밍 언어의 차이


01/   컴퓨터가 처리할 수 있는 형태로 변환한다

  • 인간이 컴퓨터에게 일을 시키는 과정
    자연어 → 프로그래밍 언어로 소스코드 작성 (programming)
    → 컴파일러/인터프리터 사용~ 소스코드 프로그램을 기계어 프로그램으로 변환
    → 실행 → 기계어 → 💻 work

  • Compiler : 사전에 소스 코드를 프로그램으로 일괄 변환해 두었다가 실행시 프로그램을 처리하는 방법
    (A 언어에서 B 언어로 번역, 보통 고급언어 → 기계어 번역)

    • 컴파일 : 번역 작업     /     링크 : 소스파일 결과물을 합치고 실행할 수 있게끔 만드는 작업
  • Interpreter : 실행하면서 소스코드를 변환하는 방법 (통역)
    고급 프로그래밍 언어 중 거의 대부분이 인터프리터 언어. JS, SQL, Python, Ruby 등..
    컴파일러 언어보다 설계가 쉽다. 인터프리터는 자체적으로 실행기능이 없기 때문에, 목적 프로그램(.exe)을 만드는 곳만 컴파일러 언어를 사용하고 대부분 코드를 인터프리터 언어로 짜는 식으로 결합하는 경우가 많다.

  • 비교
    컴파일러는 프로그램에 수정 사항이 발생하면 소스코드를 다시 컴파일해서, 수정시 컴파일이 시간 단위가 될 수 있음
    인터프리터는 수정시 소스코드를 수정해서 실행시키면 됨 → 수정이 빈번히 발생되는 용도의 프로그래밍에 많이 사용

02/   사람과 컴퓨터가 이해하기 쉬운 표현

  • 다른 하드웨어에 이식(한번 작성한 소스코드를 다른 하드웨어용으로 변환)할 경우,
    고수준 언어 쪽이 변환 작업이 덜 번거롭다.
    예) 32비트 → 64비트, Windows → Linux, PC → Tablet

저수준 언어

  • 기계어 : 컴퓨터가 직접 처리할 수 있는 언어 (2진수~ 16진수)
  • assembly 언어 : 기계어와 1:1 대응에 영어처럼 표현, 대규모 프로그램 작성시 코드의 양이 많고,
    기계어를 기술하는 방법이 하드웨어(CPU)에 따라 달라서 제조사마다 동작시키려면 소스코드 전면수정 필요
    (assemble : assembly 언어 → 기계어로 변환, assembler: 변환하는 프로그램/언어)

고수준 언어 : 저수준 언어의 단점을 보완하기 위해 소스코드를 기계어로 변환하는 메커니즘을 탄생시킴

  • C언어 : 이식하는 경우에는 컴파일만으로 대부분 문제없이 동작함
  • Python, ... : 이식하는 경우에도 큰 수정작업 필요 x

  • cross-platform / multi-platform : 소프트웨어나 하드웨어 등이 다른 환경의 OS에서 공통으로 사용될 수 있음

03/   프로그래밍 언어의 분류

  • 프로그래밍 패러다임 : 언어가 설계된 사고방식에 따라 분류

  • procedure : 실행할 일련의 처리 (routine, method, function)

  • object : 데이터와 조작을 하나로 묶은 것

  • 명령형 imperative programming : input, state에 따라 output이 다름 (How)

    • 절차적 procedural : procedure 호출의 개념을 바탕으로 함
      ex) ALGOL, Fortran, Ada, BASIC, COBOL, C

    • 객체지향 : object의 개념을 바탕으로 함 → 연산은 object에게 내부 procedure 중에 하나를 수행하라고 요청
      ex) Simula67, C++, C#, Java, JavaScript, Pascal, Python, Ruby, Objective-C,...

      • 특징
        컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 객체들의 모임으로 파악
        유지보수 쉬움, 직관적 코드 분석

      • 기본 구성요소
        - Class : 같은 종류의 집단에 속하는 attribute와 behavior를 정의하는 OOP의 기본적인
        user defined data type
        - Object : Class의 Instance (실제로 메모리상에 할당된 것).
        고유의 attribute를 가지며, Class에서 정의한 behavior를 공유 가능 (메모리 경제성)
        - Method, Message : Object의 attribute를 조작하는 데 사용되며,
        Object간의 통신은 Message를 통해 이루어진다.

      • 특징
        - 자료추상화, inheritance, 다형성 (오버라이딩, 오버로딩)


    둘 다 코드 재사용, 모듈화 가능

  • 선언형 프로그래밍 : state가 output에 개입하지 않음 (What)

    • 함수형 : 함수의 조합으로 기술해나가는 스타일
      ex) Clojure, Elixir, Haskell, LISP, OCaml, Scheme, ...
    • 논리형 : 논리식을 사용하여 관계를 정의
      ex) Prolog, ...

04/   가볍게 쓸 수 있는 프로그래밍 언어

  • 스크립트 언어 : 작은 크기의 프로그램을 손쉽게 작성하기 위해 사용되는 프로그래밍 언어
    ex) JavaScript, VBScript, PHP, Perl, Ruby, Phyton, ...

  • 매크로 : 수작업을 자동화할 목적으로 사용되는 프로그램
    ex) VBA (Visual Basic for Application: Word, Excel 조작)
    WSH (에디터, 브라우저 조작),

  • 마크업 언어 : 제목, 강조 등 문장 구조를 컴퓨터에 알려주는 언어

05/   프로그래밍 언어 비교

  • C 언어 : 하드웨어에 가까운 부분을 다루기 위해 필수적인 언어
  • C++ : C 언어 + 객체 지향 기능, 임베디드 계열 기기의 SW 개발, 게임 개발 등에 쓰임
  • C# : C++, Java와 가까운 문법, GUI를 갖춘 앱 개발, Unity 개발, 앱 개발에 쓰이는 Xamarin 등에 이용
  • Java : JVM이라는 가상머신 상에서 실행, 웹앱 뿐만 아니라 Android 앱 개발에도 사용

  • Ruby : 동적 객체지향 스크립트 프로그래밍 언어
  • Python : 데이터 분석 및 통계 등의 라이브러리가 풍부, 최근에는 머신러닝 등 인공지능 개발에도 많이 쓰임
    Raspberry PI 등 소형 컴퓨터에도 표준으로 탑재되거나 웹앱 개발에 사용되는 경우가 많음
  • PHP : HTML에 삽입하여 사용 가능, 웹앱 프레임워크가 풍부하게 제공, 손쉽게 동적 웹페이지 만들기 가능

  • JS : 웹페이지를 전환하지 않고 동적으로 페이지의 내용을 고쳐쓰거나 웹 서버와 비동기적으로 통신하기 위해 사용
  • TypeScript : JS로 변환해서 사용하는 언어
  • JS의 데이터 정의를 기반으로 다른 앱과 데이터를 주고받기 위해서 JSON (JS Object Notation) 사용

06/   어디서든 동작시킬 수 있게 하는 기술

  • 스크립트 언어는 손쉽게 실행할 수 있다는 특징을 살리기 위해 interpreter 형식으로 처리할 수 있지만, 웹앱처럼 자주 실행되는 것을 생각하면 컴파일 해두는 것이 속도 면에서 유리하다.

  • JIT(Just In Time) 컴파일 방식
    - 겉보기엔 순서대로 변환하면서 실행하는 것처럼 보이는 언어라도 실제로는 내부에서 컴파일처리를 하는 경우
    - 처음 실행할 땐 처리에 시간이 걸리지만, 두 번째 이후로는 실행 속도가 빨라진다.
    - 최근의 JVM, .NET, V8(node.js)에서는 JIT컴파일을 지원한다.
    예시) 자바 프로그램 코드 → (자바 컴파일러) → 바이트코드로 변환
    실제 바이트코드를 실행하는 시점에서 (JIT) 바이트코드를 → (JVM, JIT컴파일러) → 기계어로 변환

  • 바이트코드 byte codes : 기계어에 가까운 중간코드, 이식성이 뛰어남

  • 일반적인 인터프리터 언어는 바이트코드나 소스코드를 최적화 과정 없이 번역해서 성능이 낮다.
    반면 정적으로 컴파일하는 언어는 실행전에 무조건 다양한 플랫폼에 맞게 컴파일을 해야해서 시간이 오래 걸린다.
    JIT는 바이트코드 컴파일러가 시간이 많이 소요되는 최적화를 미리 해주기 때문에 바이트코드에서 기계어 번역을 훨씬 빠르게 진행한다.

07/   입력과 출력

  • STDIN, STDOUT, STDERR : 표준입력, 출력, 오류

08/   프로그래밍을 작성하는 환경

  • 에디터 : 소스코드를 작성하는 SW - Visual Studio Code, Vim, ...
  • IDE (통합개발환경, integrated development environment) : 에디터보다 개발 지원 기능이 풍부함
    - XCode, Visual Studio
  • RAD (Rapid Application Development) : GUI로 부품 배치
profile
Doubts kills more dreams than failure ever will

0개의 댓글