반응형
닐포드 Neal Ford
http://www.nealford.com
http://productiveprogrammer.tistory.com
텍스트 파일을 읽고, 각 줄 앞에 번호를 달아 출력하는 간단한 프로그램의 작성
public class LineNumbers{
public LinNumbers(String path){
File file= new File(path);
LineNumberReader reader = null;
try{
reader = new LineNumberReader(new FileReader(file));
while(reader.ready()){
out.println(reader.getLineNumber()+reader.readLine());
} catch(FileNoFoundException e){
e.print}catch(IOExceptin e){ e. printStackTrace();}
finally{
try{ reader.close();
} catch(IOException ignored)}
}
}
public static void main(Stringp[ args){
new LineNumbers(args[0]);}
}
------------------------groovy----------------------
def number = 0
new File (args[0])eachLine {line->number++
println "$number: $line"
}
그루비는 선언, 생성, 예외 블록, 그 외 자바에 으레 필요한 여러가지를 삽입함으로써 자바 바이트 코드에 오버헤드를 더한다. 자바 버전보다 느리다.
그루비는 자바의 성가신 점을 현대화시켜줄 명백한 후보이다. 다종 언어 프로그래밍 착상은 그루비를 바이트 코드와의 사이에 두는 것 이상이다. 이를 점점 더 이용해서 지금은 실행에 옮길 수 없는 애플리케이션 개발도 가능해질 것이다.
2. 쟈스켈 사용
요즘 대다수의 새 컴퓨터는 다중 처리기multiple processors 를 달고 나온다. 내가 사용중인 랩톱도 듀얼 코어 칩이니까 소프트웨어 개발 관점으로는 역시 다중 처리 컴퓨터이다. 여기서 애플리케이션을 효율적으로 돌리려면 스레드로부터 안전한 좋은 코드를 짜야 한다. 하지만 이런 코드 작성은 별나게 어렵다. 안다고 생각했던 이들 조차 브라이언 게츠의 '자바 병렬 프로그래밍 에이콘 출판- 을 읽으며 굴욕을 느껴야 했다. 자바로 스레드로부터 안전하고 견고한 코드를 작성한다는 게 실로 얼마나 어려운지 보여줬기 때문이다.
함수 언어는 메모리 중심 언어 imperative languages 의 많은 결점에서 자유롭다. 수학적 원칙을 보다 엄격히 준수한다. 예로, 함수 언어의 함수는 수학의 그것과 똑같이 동작한다. 출력 결과가 전적으로 입력에 달렸다. 다시 말해, 외부 상태를 함수 수행으로 변경할 수는 없다는 뜻이다. 순수 함수 언어에는 변수나 상태 저장 개념이 아예 없다. 물론 그리 실용적이지 않다. 하지만 심각한 사용성 제약 없이 바람직한 특성을 간직한 일부 혼성 함수 언어도 있다. hybrid,
example : Haskell, OCaml, erlang, SML
함수 언어는 상태 저장이 없어 다중 스레드 처리 시 메모리 중심 언어에 비해 특히 더 좋다. 그 결과, 스레드로부터 안전하고 견고한 코드 작성이 상대적으로 용이하다.
자스켈은 자바 플랫폼에서 돌아가는 하스켈 언어이다. 하스켈 코드로 자바 바이트 코드를 생산한다는 뜻이다.
http://jaskell.codehaus.org
class SafeArray{
private final Object[] _arr;
private final int _begin;
private final int _len;
public SafeArray(Object[] arr, int len){
_arr = arr;
_begin = begin;
_len = len;
}
public Object at(int i){
if(i<0 || i>= _len){
throw new ArrayIndexOutOfBoundsException(i);
}
return _ar[_begin+i];
}
public int getLength(){
return _len;
}
자스켈은 본래 연관 배열 associative array인 튜플tuple 로 같은 기능을 구현할 수 있다.
newSafeArray arr begin len ={
length = len;
ar i = if i<begin || i>= len then
throw $ ArrayIndexOutOfBoundsException.new[i]
else
arr[begin + i];
}
newsafeArray.at(3) 호출 시 연관 배열로 동작, 튜플의 해당 부분 코드를 평가한다. 객체 지향 언어는 아니지만 상속이나 다형성을 튜플로 흉내낼 수 있다. 믹스인 같은 바람직한 동작도 순수 자바로는 안되지만 자스켈의 튜플로는 가능하다. mixins 믹스인은 상속 없이도 서명 뿐이 아닌 코드 자체를 클래스에 삼입해 인터페이스와 상속의 결합을 대신한다( 클래스 계층을 변화시키지 않고 코드만 재활용하는 장점이 있다) 현재 Aspect 나AspectJ로 가능하다
하스켈, 자스켈은 지연 계산법 lazy evaluation의 '필요 시 호출' 전략을 쓴다. 다음 코드는 자바로는 절대 못돌리지만 , 하스켈로는 문제 없다.
makeList = 1: makeList
의미는 이렇다. '하나의 원소로 목록 생성 후, 추가 수요가 발생하면 그 때 계산한다'
결국 끝없는 1의 목록을 만든가.
물론 하스켈(자스켈) 문법 구조의 득을 보자면, 팀원 누군가는 하스켈 언어를 이해하고 있어야 한다. 데이터베이스와 마찬가지로 특수 성격의 코드를 위한 전문가도 점점 더 필요해질 것이다. 복잡한 스케줄링 알고리즘을 구현하는 하스켈로는 1000줄 짜리 자바 코드를 50줄 짜리 하스켈 코드로 대체할 수도 있다. 자바 플랫폼의 이점을 살려 작업 성격에 부합하는 언어를 쓰는 게 어떨까?
이런 개발 양식은 혜택만큼 골칫거리도 안겨준다. 단일 언어를 썼을 때와 비교해 디버깅하기가 그만큼 까다롭다. 자바 스크립트와 자바 사이의 상호 작용을 디버깅해본 개발자는 안다. 가장 쉬운 해결 방벙느 앞으로도 마찬가지 이겠지만, 디버거를 돌릴 일이 없게끔 엄격히 단위 테스트를 하는 것이다.
3. 올라의 피라미드
다종 언어 개발 양식은 도메인 특정 언어 DSLs로 계속 길을 인도한다. 머지않아, 언어 세계 풍경은 매우 달라지리라 본다. 이젠 풀고자 하는 문제 도메인에 매우 근접한 특정 DSL생성에 여러 특수 목적 언어를 사용할 것이다. 범용 언어 단독 사용의 시대는 종말을 고하고 있다. 전문화의 새 시대를 맞이하는 것이다. 학생 시절 보던 하스켈 교재의 먼지를 털어내야 할 때인지 모른다.
DSL/비공식/안정
내 동료 올라 비니는 새 애플리케이션 스택을 정의해 다종 언어 프로그래밍 사상에 차이를 줬다. 그가 보는 현대 개발 세계는 그림과 가깝다. 안정성을 고려하면 정적 형식 언어, 일상 코딩 시에는 보다 능률적인 언어(그루비, 제이루비, 제이썬 같은 동적인), 비지니스 분석가와 최종 사용자의 요구에 더 가깝게 조정할 땐 도메인 특정 언어를 사용하기를 제안한다. 전혀 상관없어 보이는 이들 개념이 서로 잘 어울린다는 걸 제대로 보여준다.
모든 의사는 한 때 일반의였지만, 분야가 발달하면서 전문의 취득은 필수가 됐다. 작성할 애플리케이션 종류와 기반 플랫폼에 따른 소프트웨어 복잡성은 우리ㅡㄹ 점점 더 전문의로 내모는 중이다. 새 세계를 맞아, 플랫폼에 더특화된 다종 언어 프로그래밍과 점점 더 어려워지는 문제 도메인을 처리할 도메인 특정 언어도 포용해야 한다. 앞으로 5년 후의 소프트웨어 개발은 지금과는 많이 다를 것이다.
반응형
'etc' 카테고리의 다른 글
신을 옹호하다 (0) | 2011.01.24 |
---|---|
이전 전의 textcube blog (0) | 2011.01.24 |
book: 프로그래머의 길, 멘토에게 묻다. (0) | 2011.01.19 |
getBytes (0) | 2011.01.17 |
ATOM처럼 강하게! (0) | 2011.01.16 |