블로그 이미지
레인레테
연락처 : rainlethe@rainlethe.com 영혼을 잃어버리다.

calendar

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
2007/10/05 12:05 RL.C omputer

무척 모자란 실력으로, 제가 써놓고도 알아보지 못할 만큼 무성의한 번역입니다. 원문은 여기이며 수정, 태클 얼마든지 환영합니다.
====================================================================================================================

Factor는  Slava Pestov의 주도에 의해 디자인과 구현이 된 동적 타입의 연쇄 프로그래밍  언어이다. Factor 는 Joy, Forth, Lisp그리고 Self에 영향을 받았다.

다른 연쇄적 언어들처럼, Factor는 후위연산 문법을 가지는데, 이는 함수의 인자가 함수 앞에 쓰여진다는 것을 의미하는 것이다. 예를 들어서, Hello, world를 Factor에서 쓰려면

 "Hello world" print

라고 한다.

==> (역주) 이것은 스택을 이용하기 때문이고, 위 코드는 먼저 "Hello World"라는 문자열을 힙에 저장하고, 그 주소값을 스택에다가 올린 다음, 스택에 있는 주소의 값을 출력하라는 뜻이다.  이것은RPN 을 사용하는 forth식 언어의 특징이다.


Factor는 동적 타입이고, 독특한 개체 시스템을 가지고 있다. Factor에서는, 작은 그룹의 기본 타입이 있고, 사용자들과 표준 라이브러리는 튜플이나 혹은 다른 메카니즘을 이용해서 그들 자신의 클래스를 만들 수 있다. 이는 상속이 아니라 Self에서처럼 위임이다. 덧붙여서, 타입이나 튜플을 이용하지 않아도 클래스를 다른 방법으로 만들수도 있다 ; Factor는 Predicate 클래스(역주 - predicate class는 다른 클래스의 부차적인 클래스를 말함)나 공용 클래스도 지원한다.

==> (역주) 여기서 독특한 개체 시스템이란 'unique object' 의 번역인데, 번역상으로는 그러한 뜻이지만 실은 정수형 등의 기본 타입을 기초로 해서 그들을 엮어서 프로그래밍 하는 것을 말한다. thread Code를 참고하라.

==> (역주) OOP적 언어에서 대부분
클래스 기반 언어상속을 기반으로 하는 데 반해 프로토타입 기반 언어는 위임을 기반으로 한다. 이 둘의 차이는 상속이 상위 클래스의 기능을 이어받아서 자신의 것처럼 사용하는 것인데 반해, 위임은 각자의 개체는 각자의 할 일을 하고, 다른 개체의 기능이 필요할 경우 상속받지 않고 그 기능을 다른 개체에 맞기는 것을 말한다. 여기서 개체라는 것은 보통 클래스 기반 언어에서 인스턴스를 뜻하지만 프로토타입 기반 언어에서는 클래스와 인스턴스의 구분이 없기 때문에 그냥 '개체'라고 표현했다.

==> (역주) 타입이나 튜플을 이용하지 않는다는 것은, 위에 설명한 위임이나 엮임코드(Thread Code)를 이용해서 다른 개체에게 일을 시킬 수 있다는 것이다. 물론 원한다면 클래스 역할을 하는 개체도 만들 수 있다. 공용 클래스라는 것은 소위 '상속받기 위해서 존재하는 클래스. - 자바로 말하자면
abstractinterface- 를 뜻한다.



Factor는 고정되거나 가변적인 길이의 벡터와 해시테이블을 포함한 복합 데이터타입을 내장하고 있다. 이 언어는 또한 실수, 임의의 정확도를 가진 정수 또한 지원한다. 연결리스트, 복잡한 숫자와 분수 또한 표준 라이브러리에서 정의한다.

==> (역주) 이는 보통 신생 언어에서 발견되는 라이브러리의 부족 등이 그리 심하지 않음을 뜻한다. 또한 원형 forth의 사상은 '가능한 한 시스템을 작게 유지하자'이므로 '필요한 것은 만들어 쓸 것. 라이브러리의 도움을 받지 말 것 (원래 forth는 다른 언어의 라이브러리등을 이용할 수 있는 기능을 언어 자체에서 제공하지 않는다. 물론 만들어 쓸 수는 있다.) ' 이라는 방법을 채택한다. 이는 몇kb 안에 프로그램을 짜 넣어야 하는임베디드 분야에서 시작된 언어로서는 적합하지만, PC등의 범용적 환경에서는 그리 좋은 환경은 아닌것으로 보인다. 위 글은 forth의 그러한 단점을 극복하고 언어 자체에서 다른 언어와의 bridge가 가능하게 설계되었다는 뜻이다.


Factor는 원래는 인터프리트 언어이나, 지금은 컴파일 할 수도 있다. 최적화된 기계어 컴파일러가 Factor로 완전히 쓰여졌다. 이것은 표준 실행 파일을 만들지는 않지만 기계 코드가 이미지로 저장이 된다.

==> (역주) 이는 컴파일러가 굳이 실행시에 결정할 필요가 없는 것들(예컨데 상수값과 상수값을 더하는 것은 언제나 같은 결과가 나오기 때문에 미리 컴파일시켜두거나, 양변이 같아서 서로 제거해도 결과에 차이가 없는 것들)을 미리 최적화시켜준다는 것을 뜻한다. forth식 언어에서는 컴파일러를 실행시간(Run-time)에 변경시킬 수 있는 특징 때문에 항상 인터프리트해야 할 여지가 조금은 남아있다. 다만 인터프리트식으로 개발을 한다고 해도 파싱 과정이 복잡하지 않고 언제나 인수가 스택에 준비되어 있기 때문에 c언어처럼 인터프리트 방식과 컴파일 방식이 실행시간에 큰 영향을 미치는 것은 아니다.

==> (역주) 기계코드가 이미지로 저장이 된다는 것은 smalltalk나 java의 virtual machine을 연상하면 된다. 하나의 가상기계가 이미지로서 존재함으로서 현재 기계의 상태 - 변수의 변화 등 - 를 그대로 기록할 수 있는 장점이 있다. 이는 개발중이나 문제가 생겼을 경우 이미지만 복원하면 된다. 게다가 소스 하나를 고치고 통채로 소스와 링크 파일을 재컴파일 할 필요가 없다는 것도 있다.  그래도 잘 이해할 수 없다면 게임 도중 'save' 기능으로 하던 게임을 멈추고 나중에 다시 실행시키는 것을 떠올리면 쉽다.
  이에 반해 단점이 있다면 직접적으로 기계어로 접근하는 것에 비해 약간은 실행시간의 감소를 가져온다는 것이다.


스택 시스템을 이용하는데 만족하지 않는다면, 동적 범위를 지원하는 것을 택할수도 있다. Factor는 계속 성장하는 라이브러리를 지원하며, 웹프레임워크를 수반한 HTTP 서버, OpenGL바인딩, GUI 라이브러리, XML 파서, 그 외에 다른 유틸리티들을 지원한다.


==> (역주) 위에 설명한 라이브러리 부분과 동일하다. 다만 여기서 설명하는 것은 다른 언어에도 보통 흔히들 채택되는 표준 라이브러리 이외에도 여러가지 라이브러리를 지원한다는 것이다.


Factor의 중심목표 중 하나는 상호작용적이고 테스트 위주의 개발을 유용하게 할 수 있는 것이다. 왜 Factor냐면 그것의 코어는 Forth의 안전한 버전이기 때문이다. Factor는 동적 타입이지만, 컴파일러는 단어(함수)의 스택 깊이를 평가하고 할당한다.

==> (역주)forth의 특징 중 하나는 인터프리트방식으로 개발하지만 실행은 서로의 코드를 엮음으로서 하기 때문에 각각의 단어가 어느 부분이 틀렸으며 제대로 실행되는지에 대한 테스트를 즉시 해볼 수 있다는 것이다. 원형 forth는 단어를 조금만 잘못 사용하면 스택 언더플로우가 난다. 이유는 모든것에 대한 책임은 프로그래머가 진다 라는 사상을 가지고 있기 때문이다. 즉 개발 편리, 안정성 부분에 있어서는 컴파일러가 아무것도 도와주지 않는다. 

==> (역주) 컴파일러가 단어의 스택 깊이를 평가하고 할당한다는 것은 먼저 단어(함수)가 스택을 얼마나 사용하는 가를 확인한 다음 타입을 확인하고 이 두가지 조건을 만족하면 실행시킴으로서 스택 언더플로우가 생기지 않는다는 뜻이다. 아마도 이러한 경우에는 런타임 에러가 날 것이다.



이제까지, 자바와 C 두가지 구현이 완성되었다. 자바 구현은 지양되었으며, 더이상 유지되지 않는다. C버전의 네이티브 런타임은 Factor 스스로 구현된 비율이 높아짐에 따라 계속 작아진다. 그렇지만 Factor의 일부분은 앞으로도 항상 C로 쓰여질 것이다.


==> (역주) 정확히는 모르겠지만 추측컨데 C가 포팅되지 않은 환경은 거의 없기 때문에 타플래폼으로의 이식을 위해서 이러한 선택을 하는 것으로 보인다. 게다가 C언어의 정적 특성상 항상 동적으로 실행시간을 감시해야 하는 factor보다는 속도가 더 빠를 것으로 추측된다. (정확치 않음 ;;)

Factor c같은 방법으로 확장 표준 라이브러리가 단단히 접착되어 있지는 않다, 이 언어는 많은 문서가 있다.


==> (역주) c언어의 stdio.h등은 표준 라이브러리라기 보다는 사실상 언어의 일부분처럼 사용된다. c++에도 stl이라고 해서 정식으로 인준이 된 라이브러리 셋이 존재한다. Factor는 아직 거기까지 가지는 못한 것으로 보인다. 다만 참고 자료가 신생언어치고는 많다는 뜻이다.


2007년 5월을 기해, 현재 Factor의 버전은 .89.A이며 2년내에 1.0을 릴리즈할 계획을 가지고 있다.

==> (역주) factor가 아니더라도 forth의 변형은 많다. 윈도우 환경에서 가장 많이 사용되는 forth는 win32forth이며, 도스 기반에서는 pygmy forth등을 사용하기도 했다. object oriented forth에서는 class도 지원하며, win32forth에서도 클래스를 선언하고 사용할 수 있는 방법을 제공한다.

==> (역주) 참고로 현재 factor 환경에서는 한글이 깨진다.

============================================================================
이 언어에 대해 관심이 있으시다면
아겔님의 블로그 를 방문해 보세요. 제가 알기로는 국내에 유일하게 한글로 된 factor관련 자료가 있는 곳입니다. ^^

여담으로, 한국어로는 정말 자료가 없네요. 저도 한국인이다 보니 한국어로 문서를 보는게 편한데, 한국 위키 등에는 너무 자료가 없어서 어쩔 수 없이 영어 자료로 대체한 것이 많습니다. 시간 나는 대로 영어 위키 중 필요한 부분은 한국어로 번역해 두겠습니다.

posted by 레인레테