노무현 대통령 배너


2006. 3. 31. 15:22

리눅스에서 즐길 수 있는 프로그래밍 언어

이 글은 KELP의 조형기님 글을 가져와서 수정한 것입니다.

리눅스에서 즐길 수 있는 프로그래밍 언어는 얼마나 될까? 나도 잘 모르기 때문에 여러문서를 찾아 보았다.
다음과 같은 언어들을 즐길 수 있다. 물론 더 많은 언어들을 사용할 수 있을 것이다.


 1) Asembly
 2) C & C++
 3) JAVA
 4) shell
 5) Tcl/Tk
 6) Perl
 7) Python
 8) Fortran
 9) Pascal
 10) LISP
 11) Prolog
 12) Ada
 13) ARL, Rexx, Forth, ML, Eiffel, Simula-C


많은 언어들이 지원된다. 프로그래머 각자 강한 언어가 있을것이고 약한 아니면 아예 모르는 언어 들이 있을 것이다. 본론에서는 이러한 언어들을 어떻게 리눅스 플랫폼에서 즐길 수 있는지 알아보자. 간단한 언어의 개괄을 설명하고 특성들을 논해 보자.

프로그래밍 언어에 대한 단상!
수준 높은 프로그래머들 (guru or 대가)은 다양한 프로그래밍 언어들의 본질은 다 똑같다고 말한다. 즉, 그들은 프로그램 언어를 초월한 것이다. 각 언어들의 특성들이 있고, 차이점들이 있지만 모두 하나의 큰 패러다임 속에서 통일된다는 것이다.

컴파일러의 핵심은 3가지로 구성된다. 바로 lexer(또는 scanner), parser, code generator이다.
코드 최적화기가 있지만... 핵심적인 구성요소는 위와 같은 것들이다. 각 요소의 역할은,

lexer : 입력 소스 파일 스트림을 읽어 들이며 문법적 최소 단위인 토큰(token)단위로 분류한다.
parser : 입력으로 들어온 토큰들을 정의된 언어의 문법에 맞는지 구문 분석을 하고 파싱 트리를 넘겨준다.
code generator : 파싱 트리로부터 각 머신에 해당하는 어셈블리 니모닉을 생성해 준다.

                     파스
source.c   source.i    토큰    트리    source.s     source.o
-------> CPP --------> lexer ----> parser -----> code --------> assember -------> linker ----> source
            |            generator |                  (실행파일)
            |                |
            |------------ compiler 내부 -------|

- 본론 -
 [1] Assembly - 사용할 수 있는 어셈블러도 여러 가지가 있다. 대표적인 것은 as(gnu as)과 nasm(netwide as), as86이다.
  1) GAS 는 GCC 가 사용하는 GNU 어셈블러이다. AT&T 문법을 따른다. 리눅스에서 가장 많이 쓴다.
  2) Netwide Assembler project 는 매우 괜찮은 i386 어셈블러를 제공한다.
   이 어셈블러는 C 로 쓰여졌으며, 충분히 모듈화 되어 있다.
   그리고, 지금은 거의 모든 알려진 문법과, 목적 파일의 형식을 지원하게 되었다. Intel 문법을 따른다.
  3) AS86 은 16비트와 32비트 모두를 지원하는 80x86 용의 어셈블러이다.
   이 프로그램은 Bruce Evans 의 C 컴파일러(BCC) 패키지의 일부이다.
   거의 대부분 인텔의 문법을 따르지만, 주소 지정방식 등에서 약간의 차이를 보인다.
 사용 예제와 관련자료는 다음 사이트를 참고하라. ----> http://linuxassembly.org/

 [2] C & C++ - gcc 에서 가장 좋은 컴파일러. gcc를 처음 만든 것은 바로 리차드 스톨만이다.
  그러나 오늘 날 우리가 gcc를 세계에서 가장 좋은 컴파일러라고 부르는 이유는 마이클 티만의 시그너스 솔루션 덕분이다.
  시그너스 솔루션사는 최초로 오픈소스의 상업화에 성공한 회사라 할 수 있다.
  gcc의 lexer는 c언어로 하드코딩된 것이며, parser는 GNU yacc인 bison으로 제작되었다.
  c 언어를 컴파일 할때는 glibc 라이브러리를 사용하며 인클루드 파일은 /usr/include/에 존재한다.
  c++ 언어를 컴파일 할때는 g++ 스크립트를 구동해 주어야 하며, c++ 표준 라이브러리에 링크하게 하는 스위치등 수많은 추가
  인수를 가지고 gcc를 실행시켜주는 스크립트이다.
  c++ 표준 라이브러리는 usr/lib/ 에 공유라이브러리로 존재하고, 인크루드 파일은 /usr/include/ 디렉토리에 존재한다.

 [3] JAVA - 현재 큰 대세의 흐름을 타고 있는 언어이다.
  플랫폼 독립성이라는 장점으로 여러 분야에서 확실한 지위를 확보했다.
  자바 프로그램은 다음과 같은 종류로 나누어 볼 수 있겠다.
  * 자바 애플리케이션(Application)
   JDK와 함께 제공되는 자바 가상머신에 의해 독립적으로 실행될 수 있도록 작성된 자바 프로그램이다.
   컴퓨터에서 윈도우의 도스창 또는 유닉스 쉘 등과 같은 쉘에서 자바 가상머신을 이용하여 실행시키는 자바 프로그램이다
  * 자바 애플릿(Applet)
   〈APPLET〉~〈/APPLET〉태그를 이용하여 HTML 페이지에 포함되며, 웹 브라우저에 의해서 실행되도록 작성된
   자바 프로그램이다.
  * 자바 서블릿(Servlet)
   기존의 CGI 프로그램과 같이 웹 서버 프로그램의 기능을 확장하기 위한 자바 프로그램으로서, 웹 서버 내에 있는
   자바 런타임 환경과 함께 제공되는 자바 가상머신에 의해 실행되도록 작성된 자바 프로그램이다.
   자바 서블릿은 웹 서버 내에서 자바 런타임 환경과 함께 제공되는 자바 가상머신에 의해 실행되고, 자바 애플릿은 웹
   서버에서 웹 클라이언트로 다운로드 되어 웹 클라이언트에서 자바 호환 웹 브라우저에 내장된 자바 가상머신에 의해
   실행된다는 차이점이 있다다. 이렇게 웹 서버 내에서 실행될 수 있도록 작성된 자바 서블릿은 기존의 웹 서버 내에서
   실행되는 프로그램인 CGI 프로그램을 대체할 수 있도록 고안되었다.
  * 자바 빈(Bean)
   델파이 또는 비주얼 베이직을 이용하여 프로그램을 작성할 때, 버튼이나 창과 같은 컨트롤들을 마우스로 끌어다 프로그램
   내에 삽입할 수 있도록 되어 있는데, 이와 마찬가지로 자바 빈은 하나의 완벽한 기능을 갖고 재사용될 수 있도록 만들어진
   소프트웨어 컴포넌트이다. 마이크로소프트에서 제공되는 ActiveX 컴포넌트와 같이 자바에서 컴포넌트 프로그램을
   가능하도록 해 준다.
  * 자바 패키지(package)
   다른 자바 프로그램에 의해 삽입(import)되어 사용될 수 있도록 작성된 자바 프로그램이다.
   이러한 자바 패키지는 기존의 프로그래밍 언어에서 사용하던 라이브러리 또는 운영체제에서 제공해 주는 API 등과 같다고
   볼 수 있다. 자바 패키지 역시 해당 규약이 있다. 자바에서는 기본적으로 압축 파일의 형태로 'casses.zip"이라는 자바
   패키지가 제공되고 있고, 압축 파일 내에는 디렉토리 단위로 패키지가 포함되어 있다.
  그렇다면, 리눅스용 자바를 어디서 구하며 어떻게 실행시키는지 알아 보자. 처음에는 SUN 사에서 솔라리스와 윈도우용으로
  자바의 기본 참조 구현 모델로 제공하고 있는 JDK(Java Developers Kit)의 리눅스 버전을 제공하지 않았다.
  리눅스용 자바 소프트웨어는 http://www.blackdown.org에서 구할 수 있다.
  또한 SUN사의 http://java.sun.com/ 에서 공식 리눅스용 버전을 구할 수 있다.
  공식 자바 구현체인 jdk에는 컴파일러, 인터프리터, 그리고 몇가지 관련 도구가 들어 있다.

 [4] Shell - 리눅스, 유닉스 환경에서 시스템 관리자, 프로그래머가 되기 위해서 필수적으로 익혀야 한다.
  이해가 되지 않는다면, /etc/rc.d/init.d/를 가보라. 이것들이 다 쉘 스크립트이다.
  쉘 프로그래밍을 모르고서는 언제나 마음 한 구석이 찜찜할 것이다. 나도 여전히 찜찜하다.
  Bourne shell 계열과 C shell 계열 두가지를 다 익혀 두는 것이 좋을 것이다.
  http://www.kldp.org 의 쉘 관련 문서를 참고하라.
  관련 서적'Learning the bash Shell, 2nd Ed.' , 'Using csh and tcsh' (둘다 오라일리 출판사임)을 보면서 익히도록 하자.

 [5] Tcl/Tk - Tcl은 스크립트 언어, 즉 인터프리터를 가지고 있는 언어이며, Tk는 X 윈도우 시스템의 Tcl 확장이다.
  즉, 윈도우 툴킷이다. Tcl/Tk는 유명한 학자 존 오스터하우트(John Oousterhout)가 만든 것이다.
  그가 쓴 'Tcl and the Tk Toolkit'(Addison Wesley)이라는 책을 읽어보면 쉽게 익힐 수 있을 것이다.
  Tcl/Tk는 또한 c, perl, python과 같은 다른 언어에서 사용할 수 있는 것이 큰 장점이다.

 [6] Perl - 텍스트 파일을 처리하는 언어로써 처음에는 대량의 텍스트를 처리하고 그로부터 깔끔한 형식의 보고서를
  만들어 내려는 목적으로 만들어졌다. 하지만, 펄이 계속해서 발전하고 성숙되어지면서 프로세스 관리, TCP/IP 네트워크 등의
  모든 것을 처리할 수 있는 다목적 스크립트 언어가 되었다. 펄은 유닉스 Guru인 Larry Wall 이 개발한 공개 소프트웨어이다.
  펄의 가장 큰 힘은, C, sed, awk 그리고 각종 셀에서 제공하고 있는 모든 기능을 하나의 스크립트 언어로 통합했다는 점이다.
  요즘은 파이썬의 등장으로 좀 경쟁되고 있는 분위기이다. 펄로 구현되는 모든 것을 파이썬으로 구현될 수 있기 때문이다.
  펄은 하나의 코드를 획기적으로 축약하거나, 같은 일을 여러 방법으로 할 수 있게 해 준다.
  그러나, 이것이 오히려 펄을 배우기 어렵게 만드는 이유가 될 수도 있다.
  나는 개인적으로 펄보다는 파이썬을 더 좋아한다.

 [7] Python - 1990년 Amsterdam의 Guido van Rossum에 의해 개발된 인터프리터 언어이다.
  Python은 범용 프로그래밍 언어이다. Python은 많은 분리된 소프트웨어 콤포넌트들을 아주 쉽고 유연한 방법으로 연결하는
  접착제 언어라고도 할 수 있다. 또는, 고수준의 Python 제어 모듈들이 다른 언어에 영향을 준 서브루틴 라이브러리에 의해
  구현된 저수준의 연산들을 인도해가는 길잡이 언어라고도 이야기 할 수 있다.
  Python은 대화적이고(interactive), 인터프리팅(interpreted)되는 객체 지향(object-oriented) 프로그래밍 언어이다.
  때때로, Tcl, Perl, Schema 또는 Java와 비교된다.
  Python은 매운 간단한 문법을 가지면서도 강력하다. Python은 모듈, 클래스, 예외 그리고 매우 고수준의 동적인 데이터 형과
  동적 형변환을 지원하다. 다양한 윈도우 시스템들(X11, Motif, Tk, Mac, MFC:MS-Windows)을 비롯한 많은 시스템콜과
  라이브러리를 위한 인터페이스가 있다. C나 C++를 이용하여 쉽게 새로운 모듈을 작성할 수 있다.
  Python은 프로그램 가능한 인터페이스를 사용하는 응용을 위한 확장 언어로서도 사용가능하다.
  Python은 많은 플렛폼에서 동작한다. UNIX, Windows, DOS, OS/2, Mac, Amiga... C 컴파일러만 있으면 동작될 것이다.
  Python은 배우기 쉽고 사용하기 쉽다. (정말 그렇다. 나중에 혼란스럽고 배우기 까다로운 부분을 드러내지 않는다.)
  그래서 발전된 어플리케이션의 사용자들에게 인터페이스를 제공할 수 있고, 첫 프로그래밍 언어로서 기여할 수도 있다.
  프로그래머가 Python을 사랑하는 이유는 많은 경우, 그 증가되는 생산성에 있다.
  컴파일하지 않으므로 편집-테스트-디버깅 사이클이 믿을 수 없을 만큼 빠르다.
  한번 작성한 모듈은 다음 코드의 작성을 위해 생산적으로 사용된다.
  Python은 (정규식 매칭을 포함한) 완벽한 문자열 연산 집합을 가지고 있고, 끔찍한 메모리 관리로부터 사용자를 해방시킨다.
  이러 저러한 특징들이 Python을 프로토타입 개발과 다른 특별한 프로그래밍 과제에 이상적인 언어로 만든다.
  Python은 또한 컴파일시의 오류검사 기능이 없어도 큰 프로그램을 쓸 수 있도록 해준다.
  프로그램은 다수의 모듈로 만들어 질 수 있고, 각 모듈은 독립된 변수 영역 (name space)를 가지며, 캡슐화를 지원하도록
  클래스를 사용할 수 있다. 예외처리는 에러 체킹으로 코드를 간단하게 만들어서 필요한 부분의 에러를 감지하도록 한다.
  많은 수의 확장 모듈이 Python을 위해 개발되었다. 어떤 Python 프로그램에서도 사용가능하도록 표준 라이브러리 툴로서
  개발된 것도 있으며 (수학 라이브러리, 정규식 표현등), 특별한 플랫폼이나 환경 (예:UNIX, IP 네트워킹, X11등)에 사용하도록
  혹은 응용에 맞도록 (예:이미지, 사운드 처리) 개발된 모듈도 있다.
  Python은 또한 자기 자신의 코드를 볼 수 있다. 따라서, 디버거나 프로화일러(profiler)를 Python 자신으로 기술된다.
  또한, 목적 코드를 바이트로 변환하거나 그 반대의 변환을 하여, 다양한 분산 목적 모델 뿐 아니라 목적 코드 일관성을
  유지하는데 사용된다.

 [8] Fortran - 솔라리스의 스팍과 인텔 x86 (솔라리스)에서 구동된다.
  1) f77 - Fortran 77, Fortran 66, VMS Fortran 의 모든 구조와 호환된다.
  2) f90 - Solaris x86 시스템에는 설치되지 않으며, Fortran 90 구조와 호환된다.
  두개의 컴파일러 모두 컴파일시 -g 옵션을 주고 컴파일해야 xdb 로 디버깅할 수 있다.
  GCC Fortran 컴파일러(Fortran 77 호환) 역시 리눅스상에서 사용할 수 있다. /usr/bin/g77, usr/bin/f77 에 설치 되어 있다.
  실제 컴파일러 자체는 c컴파일러 본체가 있는 곳에(/usr/lib/gcc-lib/ 하부) 에 f771 이라는 이름으로 존재한다.

 [9] - Pascal - 파스칼은 원패스 컴파일러를 갖춘 강력한 형태의 3세대 언어이다.
  Nicholas Wirth에 의해 1967~68년경 교육목적으로 설계된 파스칼은, 모든 루틴과 변수들을 완전하게 정의할 것을 요구한다.
  파스칼은 프로그램을 구조적이고 정리된 상태로 작성하는 방법에 대해 처음 배우는 많은 프로그래머들을 위한 언어이다.
  파스칼의 상용 버전이 만들어지기는 했지만, 비즈니스 세계에서는 별로 성공을 거두지 못하였다.
  파스칼은 특수목적을 강조한 컴파일러 제작자들에 의하여 확장되어왔지만, 많은 프로그래머들은 파스칼이 프로그래밍
  규칙에 있어 너무 많은 제한을 두고 있으며, 프로그래머들이 새로운 규칙을 컴파일러에 만들어 넣거나 선언하는 것을
  허용하지 않는다고 느끼고 있다.
  교육용 언어로서 아직도 사용되고 있지만, 오늘날 대부분의 중요한 업무 프로그램에는 C, C++ 및 자바 등이 사용되고 있다.

 [10] LISP - LISP은 인공지능부터 통계에 이르기까지 많은 영역에서 사용하고 있는 인터프리터 방식의 언어이다.
  알고리즘에 대하여 명확하고 논리적인 인터페이스를 제공하고 있기 때문에 주로 컴퓨터 과학분야에서 사용한다.
  기능적인 프로그래밍 언어이며 매우 일반화되어 있다. 많은 동작들이 루프보다는 회귀 호출 방식으로 정의되어 있다.
  표현식이 구조적이며, 자료는 리스트로 표현한다.

 [11] Prolog - 암스테르담 대학의 잔 웨이레마크(Jan Wielemaker) 가 구현한 완전한 프롤로그 구현체인 SWI-Prolog도 있다.
  Prog는 논리 기반의 언어로써 논리적인 확인, 확인 과정에 대한 자기 스스로의 발견, 그에 기준한 판단 등을 가능하게 한다.
  인공지능(AI) 분야에서 유용한 언어이다.

 [12] Ada - 2개의 Ada 구현체가 있다. Ada 인터프리터인 AdaEd와 GNU Ada 번역기인 GNAT이 있다.
  GNAT는 다양한 기능을 갖춘 최적화된 Ada 컴파일러이다. GNAT과 Ada의 관계는 gcc와 c,c++의 관계에 해당한다.

 [13] ARL, Rexx, Forth, ML, Eiffel, Simula-C - 그 밖에 리눅스에서 사용할 수 있는 다른 언어들이다.

'프로그래밍 > GNU' 카테고리의 다른 글

GCC Online Documents  (0) 2008.12.15
디버깅 팁  (0) 2006.08.10
[본문스크랩] 디버깅 다시 보기  (0) 2006.07.20
[링크] X 윈도우 프로그래밍 기초  (0) 2006.03.30
[본문스크랩] objdump...  (0) 2006.03.28