관리 메뉴

HAMA 블로그

언어에서 강력함 과 대중성 그리고 스칼라 본문

소프트웨어 사색

언어에서 강력함 과 대중성 그리고 스칼라

[하마] 이승현 (wowlsh93@gmail.com) 2015. 4. 27. 10:54
1편 언어에서 강력함 과 대중성  그리고 스칼라 

이글은 스칼라에 대한 전문적인글이 아니며 ,  스칼라의 모든부분을 말하는글은 아닙니다.
스칼라의 함수자(Functor) , 컬렉션 및 유틸리티 에 대해서 한정되있으며,  
먼저 스칼라말고 다른 여러가지 언어들에 대해서 말하고도 있습니다. 제목에 일반적이라고 붙힌이유는 , 스칼라의 다른 기능들 , 소위 Active Object &  Actor Pattern 기반의 동시성 구현라이브러리로 알려진 아카라든지,콤비네이터를 이용한 인터프리터 개발같은것들을 대중적이라고 보기엔 무리라고 판단하였기에 그런것들을 제외한 극소수의 내용들로 이루어져있기때문입니다. 그리고 아래 글에서 예시로 보여지는 (슈도)코드는 문법적으로 정확치 않은 예 이며, 글에 쓰여진 모든 지식은 저의 것이아니라 다른 사람으로부터 나온것입니다. (저도 틈틈히 공부중이며,  이번 사태를 계기로 수준높은 글들이 앞으로 많이 나올것을 기대합니다.)

강력함 과 대중적이라는것은 전혀 별개의 말입니다. 
강력하다고 해서 대중적으로 선택받지 못함은 역사를 통해 다들 잘 알고있을터입니다. 


본글에서는 단지 간단한 예제들을 나열함으로서  글을 읽는 여러분들이 알아서 생각하게끔 구성하였습니다.  
자 아래에는 어떤 목록에서 원하는 값을 찾는 과정에 대한  코드입니다.

예제1 in C++ ) 


string guy = null;

for(  Groups::iterator i = Groups.iterator();  i != Groups.end() ; ++i){
	
	player p = *i;
	
	if(p.id == 1){
		guy =  p.name;
	}
}

return guy;

위의 코드는 그룹에서 ID 1 번 선수의 이름을 찾아서 리턴해주는 로직입니다. 보는바와 같이 길게 늘어써져 있습니다.   코드를 읽어야지만 멀하자는건지 알수있습니다.

아래의 코드를 보면 지원되는 함수 util 을 이용하여 조금 짧게 이루어져있습니다. 

예제2 in JAVA )


player = Groups.findbyId(1);
if( player ){
	return player.name;
}
elsle{
	return null;
}

findbyId 함수를 이용하여  보다 간략하게 코딩하였음을 알수있습니다. 멀하자는건지 금방 알수있습니다.
 저 코드를 짜려면 findbyId 라는 함수를 알고있어야겠지요. 

에제3  in Haskell )   * 헤스켈 ( 순수 함수형 언어)  


fmap (getName)  (findId 1) 

( findId 1  <-- 이 부분을 functor 라고 합니다.)  findId 1 에서  값을 찾으면  getName 이 호출되어 , 원하는 선수 이름을 얻을수있으며 값을 못찾으면 Nothing 이 되면서, 아무것도 하질 않습니다. 
1줄로 줄어들었으며, Null 참조 및  잘못된 배열참조에 대한 불안감으로부터 해방되었습니다.
가독성 좋아졌는지는 잘모르겠고 , 코드가 강건해졌다고 볼수있습니다. 

스칼라를 사용하면, 추상정도를 높히는 코드를 C++,자바보다 더 자유롭게 표현할수 있게됩니다. 
추상정도를 높히면 강력합니다! 더 정확히 말하면 강력하게 변신하기 쉬워집니다. 

자 다들 저렇게 쓰도록 바꾸자!!! 고요 ?  저는 잘모르겠습니다. 독자분들마다 생각이 다를 것입니다.
대중들은 단순히 람다표현식 혹은 함수자 유틸의 사용으로 라인수 줄어든것만으로 굳이 공부하거나 바꿀 필요성을 느끼지 못할거 같습니다. 대중이 판단할때  현재 '진짜'  강력해야 선택받습니다.


제가 그렇게 생각하는  이유를 전에 쓴 글에서 가져오고 제 경험을 말씀드리면 
 c++ 은 10년전부터 다른언어의 특성들을  차용하며 소위 Modern C++ 이라는 이름으로 나름 발전을 이루어왔습니다. 주로 c++ 언어특성으로 발전을 하여온것은 아니고 STL 이름의 라이브러리등을  통하여 발전하였습니다. 언어 창조자의 철학이, 먼가가 필요하면 굳이 언어를 변경하는것보다는 라이브러리 차원으로 제공하는게 낫다라는 입장입니다. 아마도 자바 또한 그러한 보수적인 관점에서 신기능의 추가 (제너릭,병렬, 함수형등) 에 조심성을 가지고 발전한거겠지요. 

c++ 에 다양한 함수자유틸들, 템플릿특화,  일반화함수자, 타입추론 , 템플릿메타프로그래밍등 많은 개념들이 10년도 훨씬 전에 생겨났지만, 대중은 그닥 관심이 없습니다. (물론 몇몇 게임등 쓰이는곳도 있습니다)
알필요도 없지요. 안쓰고 개발해도 충분했으니깐요.  라이브러리 제작자한테나 필수일까...

실제 사례로, 제가 이전프로젝트에서의 c++ 코드라인이 300백만줄이 넘고, 10년동안  8백만라인이상의 코드를 접해왔는데  저런것을 쓴 사례가 거의 없습니다.
너와 니네팀이 무식해서 그렇다고요? 네 반은 맞습니다. 대부분은 비판하는 분과 다르게 저 수준입니다.
(반은 C++ 의 함수형스타일이 그닥 어렵게 공부해서 적용할 필요성이 없었습니다.)
 
정말 간단한  C++ 예를 이전 글에서 가져와서 보여 들어드리자면 

bool is_cool (const Thing& x) { ... }
find_if(begin, end, not1(ptr_fun(is_cool)));

위의 예제는  어떤 컬렉션을 순회하며 , 쿨하지 않은것을 찾아서 리턴해주는 표준함수,부정자 및 바인더라고불리는 것들입니다.  굉장히 단순해 보여서 많이 쓰일거 같지요?  저는 적극적으로 사용했습니다만, 대부분 저런식의 코딩을 하지 않습니다. 그냥 대부분 for 문으로 순회하면서 내용에 비지니스 로직 적습니다. not1 이 부담스러워요, ptr_fun 이 부담스럽습니다. 대중화에 실패했습니다.  
먼가 부족했습니다.
덜 강력했습니다. 먼가 조금 아쉽습니다..
저거에 openMP나 PPL  같은 병렬을 쉽게 해주는 수준까지 지원됬다면 , 더 나아가 GPGPU 까지 흠흠...

스칼라 혹은 함수형패러다임언어가  대중화에 성공 할수있을까요?  
단순히 케이스클래스, 람다, 함수형들을 써서 간단,간편,쉽게하자라는 이유라면  No 라고 생각합니다.
대신 높은 추상화를 가진 표현을 통해, 응용개발자들이 신경쓰지 않아도 라이브러리혹은 언어내부에서의 업그레이드로 손쉽게 강력함을 얻을수있다는 보장이 되는것에 공감대를 얻게된다면  Yes 일거라고 봅니다. (자바,C++ 도 저런측면에서 강력함을 어필하기 위해 노력하고있습니다.  치열한 싸움이 예상됩니다. )


자 이제 다음 예제로 넘어가 볼까요? 

예제1 in SQL )

select * from player  where id = 1  

우와 엄청 간단합니다. 강력합니다. 실수할 여지가 별로 없습니다. 추상의 끝판왕입니다. 
SQL 은 대중적으로 성공했습니다. ^^

저것을 풀어쓰면 

예제 in JAVA)


public Table select (Selector where){

	Table resultTable = new ConcreteTable(null, columnNames.clone()};
	Results currentRow = (Results) rows();
	Cursor[] envelop = new Cursor[] { currentRow };

	while(currentRow.advance(){
		if(where.approve(envelope))
			resultTable.insert( currentRow.cloneRow());
	}
	
	return new UnmodifiableTable(resultTable);
}

더 풀어쓰면

예제 in C )

struct table {
	....
}

table t [][];
              ....


for(int i = 0 ; i <  rows ; i++){
	for( int j = 0 ; j < cols; j++){
		...
	}
}

한 몇백라인되겠지요. 
SQL 은 성공했습니다. !!!


자 이제 JQuery  를 보겠습니다.

$("div")     모든 div 태그를 가져오는것을 한방에 합니다.
document.getElementByTag("div")      조금 길어졌네요.

$("div.reply")   모든  div 중에서 reply 클래스들만 가져옵니다.
JQuery 안쓰면 ?  헬입니다.

$("div.reply:hidden").show()    우와 함수까지 한방에 해결입니다.

다른 값을 감싸고 한방에 해결해줍니다. (모나드라는 특성의 일부분을  가지고 있습니다)
JQuery 성공했습니다.!!!


자 이제 마지막으로 스칼라 (위에 썼듯이 스칼라의 일부분) 를 보겠습니다. 다양한 스칼라 예제를 살펴보고
과연 이것도 성공할수있을지 실제 코딩에서 사용할지...여러분이 알아서 생각하세요.
여러분이 선택하는게 정답입니다.  대중이 선택한것이 대부분 정답이니깐요. ( 물론 이부분은 상황에 따라서 시각이 다를수있겠습니다) 


Comments