sungyup's.

understanding_the_digital_world / 소프트웨어 / 2.5 프로그래밍

2.5프로그래밍

프로그래밍에 관하여

24. 알고리즘은 이상, 프로그래밍은 현실

  • 알고리즘 : 추상적이고 이상적인 절차 (정확하고 명료한 레시피)
  • 프로그램 : 실제 컴퓨터가 과제를 완료하기 위해 수행해야하는 모든 구체적인 단계

25. 다른 프로그램을 처리하기 위한 프로그램

  • 어셈블러 assembler : 특정한 처리를 수행하는 프로그램
    • 특정한 처리 : add 처럼 더하는 연산이라던가, 특정 메모리 위치를 나타내는 이름이라던가
      • 프로그래머가 명령어를 추가하거나 삭제할 때 변경 기록을 직접 관리하는 대신, 어셈블러가 각 명령어와 데이터 값이 메모리상 어느 위치에 있을지 파악해줌 ⇒ 프로그램 수정을 훨씬 쉽게 해줌
    • 다른 프로그래머가 사전에 작성했던 프로그램에서 필요한 부분을 모으는 역할
    • 이 프로그램 작성에 사용되는 언어가 assembly language
      • 대개 특정 프로세서 아키텍처에 특화되어 프로세서의 명령어와 일대일로 연결되고, 명령어가 이진수로 인코딩되는 특정한 방식과 메모리에 정보가 배치되는 방식 등을 알고 있음 ⇒ 프로세서마다 어셈블리 언어가 다름

26. 고수준 언어에서 프로그램 실행까지

1950s말, 1960s 초, 특정 프로세서 아키텍처에 독립적인 **고수준 프로그래밍 언어(high-level programming language)**가 개발

⇒ **번역기 프로그램(컴파일러, compiler)**을 통해 대상 프로세서의 어셈블리 언어로 된 명령어로 변환된 다음, 어셈블러에 의해 비트로 변환되어 메모리에 로드되고 실행

  • 컴파일러는 보통 하나의 frontend와 몇 개의 backend로 나뉨
    • frontend는 고수준 프로그래밍 언어로 작성된 프로그램을 처리해서 어떤 중간 형태로 만듦
    • 각 backend는 공통된 중간 표현을 특정 아키텍처에 맞는 어셈블리 언어로 변환
  • 컴파일 단계는 에러를 미리 점검하게 해줌
    • 어셈블리 언어에서는 구문 오류 외의 에러를 검출하기 어려움
  • 초기 고수준 언어들은 특정 응용 분야에 집중된 형태
    • FORTRAN : 수식 변환(Formula Translation)에서 이름 유래, 과학/공학 분야에서 계산 표현
    • COBOL : Common Business Oriented Language. 사무 데이터 처리 목적.
    • BASIC: Beginner's All-purpose Symbolic Instruction Code. 프로그래밍 교육 목적

27. 작문과 비슷한 프로그래밍

포트란, 코볼, 베이직이 성공했던 이유 중 하나는 특정 응용 분야에 집중했기 때문(모든 프로그래밍 과제를 처리하려고 하지 않음)

  • 1970s, ‘시스템 프로그래밍' 용도(어셈블러, 컴파일러 뿐 아니라 운영체제까지 작성할 목적)로 사용할 언어들 개발
    • C : Dennis Ritchie, 1973년 벨 연구소
    • C++ : 1980s, 규모가 매우 큰 프로그램의 복잡성 관리를 도울 의도로 설계
    • 오늘날 컴퓨터에서 사용되는 주요 프로그램 대부분은 C나 C++로 작성
      • cf). 맥 소프트웨어의 대부분은 C, C++과 Objective-C로 작성
    • 1990s, 인터넷과 웹의 성장에 대응해 더 많은 언어 개발
      • 컴퓨터에는 더 빠른 프로세서와 용량이 큰 메모리가 장착되었고, 프로그래밍을 더 빠르고 편하게 하는 것이 컴퓨터가 효율적으로 돌아가도록 하는것보다 더 중요해짐
      • Java : Sun Microsystems에서 일하던 James Gosling이 개발, 속도는 중요하지 않지만 유연성이 중요한 가전 제품과 전자 기기 같은 작은 임베디드 시스템에 실행할 용도로 개발 ⇒ 후에 웹 서버에 널리 사용
      • JavaScript : Netscape에서 근무하던 Brendan Eich가 개발, 웹페이지의 동적인 효과를 구현하기 위해 브라우저 내부에서 사용할 목적으로 설계
      • Python : Guido van Rossum이 1991년 발표. 가독성에 초점을 두고 설계

28. 구글 같은 서비스는 어떻게 개발할까?

어떤 중요한 프로그램도 완전히 처음부터 새로 만들어지지는 않는다.

  • 가장 단순한 수준에서 프로그래밍 언어는 함수function 메커니즘을 제공한다.
    • C의 예를 들면, scanfprintf
  • 연관된 함수들의 모음은 library
    • 위의 함수들은 디스크나 다른 위치에서 데이터를 읽고 쓰는 함수로 구성된 표준 라이브러리에 포함
    • 함수 라이브러리가 제공하는 서비스는 API(Application Programming Interface)로 프로그래머에게 제공.
      • API는 포함하는 함수, 함수의 용도가 무엇인지, 함수를 어떻게 사용해야 하는지, 어떤 입력 데이터를 요구하는지, 어떤 값을 만들어내는지 나열
      • 즉, 프로그래머가 서비스를 요청하기 위해 무엇을 해야 하고 결과적으로 무엇이 계산될지 정의
      • 요즘 대규모 시스템은 프로그래머들이 복잡한 소프트웨어 라이브러리를 잘 다룰 수 있도록 SDK(Software Development Kit)를 포함
        • 예를 들어, 애플은 아이폰과 아이패드 코드를 작성하는 개발자를 위해 개발 환경과 지원 도구 제공

버그

1947년, 그레이스 호퍼가 하버드 마크 II에서 나온 죽은 나방을 발견

29. 구글과 오라클의 저작권 소송

소프트웨어는 지적 재산권(intellectual property)이라 법적 문제와 복잡하게 얽혀 있음.

  • 영업 비밀(trade secret) : 지적 재산권은 소유자만 그 비밀을 보유하고, 기밀 유지 협약서 같은 법적 구속력이 있는 계약에 의해서만 다른 이에게 공개
  • 상표(trademark)
  • 저작권(copyright) : 디지털 자료의 저작권을 보호하는 일은 어려움. DRM(Digital Right Management)를 암호화나 다른 형태로 하려고 했으나, 한결같이 그 시도들이 실패.
    • 암호화를 풀지 못하더라도 콘텐츠가 재생되는 동안 재기록될 수 있음(analog hole이라고 함)
    • clean room development : 복제하려는 코드에 접근할 방법이나 정보가 전혀 없지만, 프로그램 작동 방식을 철저히 이해한 다음 완전히 새롭게 구현 ⇒ 유효한 창ㅇ작
  • 특허(patent) : 발명에 대한 법적 보호. 소프트웨어에서는 애초에 ‘수학'이라 여겨져 특허법의 범위에 들지 않았으나, Amazon의 1-click 특허 등이 있었음
    • 특허 괴물(patent troll) : 허가 없이 특허를 침해 중인 다른 기업에 소송을 제기하기 위해 특허권 취득.
  • 라이선스(license) : 제품을 사용할 권한을 승인하는 법적 합의
    • EULA(End User License Agreement): 대화상자가 나타나서 작은 활자로 된 방대한 덩어리 위에 작은 창을 보여주며, 이 법적 문서의 조건에 동의해야만 다음 단계로 진행할 수 있다고 함 ⇒ 대부분 소프트웨어 때문에 손해를 입더라도 피해에 대해 소송 제기 할 수 없다고 나옴

API는 사실상 서비스 사용자와 서비스 제공자 간의 계약.

  • API는 인터페이스의 양쪽에서 무슨 일이 일어나는지 정의
    • 즉, 서비스가 어떻게 구현되었는지에 대한 세부 사항이 아니라, 각 함수가 프로그램에서 사용될 때 무슨 일을 하는지를 정의
    • 2010년 1월, 오라클(Oracle)이 Sun Microsystems를 인수(Java 개발)
    • 2010년 8월, 오라클은 구글이 안드로이드폰에서 Java API를 불법적으로 사용하고 있다고 주장하며 소송 제기
      • 법원은 구글의 API 사용이 공정 사용이고 저작권법 침해가 아니라고 결정

30. 기술 표준의 중요성

표준(standard)은 어떤 기술적 산물이 어떻게 만들어지고 어떻게 작동하도록 되어 있는지 명확하고 상세하게 기술한 것.

  • TV를 사면 콘센트에 바로 전원 플러그 연결 가능(플러그의 크기와 모양, 제공하는 전압에 대한 표준)
  • TV가 신호를 수신해서 방송 화면을 보여줄 수 있는 이유는 방송과 케이블 TV에 관한 표준이 있기 때문

표준은 상호운용성을 보장하고 공개경쟁이 이루어지도록 하는 데 결정적인 요소

⇒ 단점도 있음 : 어떤 표준의 수준이 낮거나 시대에 뒤처졌는데 모든 사람에게 그 기술을 쓰도록 강요한다면 발전이 저해

31. 자유로운 소프트웨어, 오픈소스

프로그래머가 작성하는 코드는 모두 소스 코드(source code) : 어셈블리 언어도 마찬가지

소스 코드를 프로세서에서 실행하기에 적합한 언어로 컴파일한 결과는 오브젝트 코드(object code)

⇒ 너무 많은 변환 과정을 거쳐 소스 코드와 비슷하게 복원한다거나 변종을 만들거나 작동 방식을 이해하기 위해 이용하는 것이 불가능

⇒ 대부분의 상용 소프트웨어는 오브젝트 코드 형태로만 배포

**오픈 소스(open source)**는 연구와 개선 활동을 위해 다른 사람들도 소스 코드를 자유롭게 사용할 수 있도록 하는 대안을 일컫는 용어

리처드 스톨만(Richard Stallman)은 1983년에 GNU(GNU's Not Unix) 프로젝트를 시작

  • 운영체제와 프로그래밍 언어용 컴파일러 같은 중요한 소프트웨어 시스템의 무료 공개 버전을 만듦
  • 오픈 소스를 지원하기 위해 자유 소프트웨어 재단이라는 비영리 단체 만듦
  • GPL(General Public License)라는 라이선스에 따라 구현을 배포 : 만약 소프트웨어가 다른 누군가에게 배포되면 그 배포판도 똑같이 어떤 용도로도 자유로운 라이선스를 적용해서 소스 코드를 사용할 수 있게 해야함
    • GNU의 GPL 말고도 다른 오픈소스 프로그램과 문서에도 비슷한 라이선스가 있음 : Creative Commons(위키피디아 이미지)
      • 파이어폭스와 크롬 브라우저
      • 웹 서버 Apache와 Nginx
      • 안드로이드 운영체제
  • 가장 유명한 오픈소스 프로젝트는 리눅스 운영체제.
    • 리눅스 운영체제 소스 코드는 커널 사이트(kernel.org)에서 무료로 다운로드 가능하고, 자신만의 용도로 사용하거나 원하는 방식으로 수정 가능.
    • 하지만 어떤 형태로든 배포하려고 한다면 GPL에 따라 소스 코드를 공개해야 함.
  • 오픈 소스가 돈을 버는 방식 : 소스 코드를 무료로 배포하는 것과 별개로, 기술 지원, 교육, 품질 보증, 시스템 통합과 기타 서비스 이용에 요금을 청구

32. 요약

  • 어떤 언어도 단독으로 모든 프로그래밍 과제에 이상적이지 않음
  • 프로그래밍 언어는 꾸준히 증가하는 하드웨어 자원을 활용하도록 진화 : 언어 자체에서 메모리 사용을 자동으로 관리하는 메커니즘을 제공.