새로운 제어 구조를 가진 언어?

cypher_의 이미지

전 프로그래머는 아니라 전문적인 지식은 없지만, 방금 이런저런 소스 코드를 보다가 수많은 조건문과 반복문을 보니 문득 의문이 생기더군요.

모든 프로그램은 결국 제어구문을 통한 순차, 비교, 반복 을 통해 '무언가' 를 하는 구조인데, 뭔가 새로운 제어구조를 가진 프로그래밍 언어는 없을까요? 수많은 if 와 for 문....(switch 역시 조건문이고 while, foreach 등 역시 반복문이죠) 조건과 반복을 계속 반복하게 되는 프로그램.... 함수나 클래스는 이러한 작업을 좀더 편하고 구조적으로 할 수 있게 해주는 것에 불과하고....

전문적으로 프로그래밍을 하시는 분들에게야 익숙하겠지만 저같이 취미로 가끔 깨작거리는 사람들에게는 상당히 고역이더군요.

이런 '노가다' 를 줄여줄 수 있을 만한 언어는 없나 생각해봤지만 아쉽게도 제가 알고있는 언어들 중에는 없더군요. '이진연산' 이라는 컴퓨터의 기본적인 연산 방식이 바뀌기 전까지는 새로운 개념의 제어구문을 가진 프로그래밍 언어라는 것은 불가능할까요?

사족으로, 글쓰다 생각난 거지만 자연어를 파싱해서 조건과 순환문으로 만들어주는 그러한 방법도 있겠네요. 하지만 역시 제 의문에 대한 근본적인 해결책은 아닌 듯 하군요.

댓글

익명 사용자의 이미지

정확한 답변을 원하신다면 automata와 A.I(인공지능)의 자연어처리 이론을 공부하시면 되겠지만, 제가 간단하게 답변을 대신 드린다면 현재로선 거의 불가능해 보이는군요.
단순히 if then else를 줄이고 싶으시다면, 함수형언어에서는 pattern을, 객체지향언어에서는 polymorphism을 이용하시면 조금 더 줄일수 있겠지만, 그걸 design하는 일은 if then을 몇번 더쓰는 일과는 비교도 안되는 고역일겁니다.
사담으로 automatic programming이 불가능하다는것은 이미 증명되어있으며, A.I연구하는 사람들 사이엔 이런 얘기가 있습니다. "A.I 1년 공부하면 종교를 가지게된다."
Universal Turing Machine이라고 들어보셨을지 모르겠는데, 지금 우리가 쓰는 interpreter나 compiler라고 생각하시면 됩니다. 근데 이게 다음 문장과 같은 paradox를 가지고 있습니다.
"This statement is false."
문제가 있을것 같은데 아직 발견된 문제가 없으니 그냥 쓰고 있는거죠. 재밌지 않나요? 그리고 얼마나 불안한 일인가요?

익명 사용자의 이미지

토론의 주제와 관련은 없습니다만
c와 php, perl 해왔던 초보 입니다.
그런데 이번에 비주얼베이직을 배우게 됐는데
제어문에서 약간 차이가 나더군요 헷갈려 죽겠습니다.
맨날 if문 다음에는 항상 ()를 치고 블록을 싸는게
버릇이되서인지 모르지만....if ...Then .......end if 하기가 상당히 짜증나는군요....

김용욱_의 이미지

저는 블록킷이 없다는점이 가독성이 떨어지게 보이더라구요.

전 pure block이라고 말하는 스타일로 코딩하고 있습니다. 이러한 스타일을 싫어하시는 분들도 계시겠지만.

void deep(int x, int y)
...{
...// 내용
...}

이렇게 말이죠.

파이썬도 없다고 하던데 솔직히 약간 걱정됩니다. :)
--
L.I.T

L.I.T

익명 사용자의 이미지

마음만 먹는다면 얼마든지 컴파일러가 지원하면 가능합니다만, 표준에 포함되지 않은 기능이라 지원할 필요성을 느끼지 않는 것 같습니다.

그러니까 컴팡일러는 헤더 파일을 통해서 함수의 프로토타입에 대해 이미 정보를 가지고 있기 때문에 비어있는 위치에 데이터를 디폴트값을 넣어준 후 컴파일해버리면 됩니다.

인수처리는 가상함수처럼 실시간으로 대응하는 기능이 아닌 컴파일러가 컴파일전에 변환을 해 준 후, 컴파일 하는 기능으로 알 고 있습니다. 따라서 이 기능은 시스템에 어떤 과부하도 주지 않는 매우 바람직한 기능이므로 C에서도 지원해 줬으면 하고 생각하고 있습니다.

익명 사용자의 이미지

제가 버튼을 잘못 눌렀습니다. 송구 --;
위의 내용은 다음 질문에 대한 답변입니다.

>vbasic 에서
>가장 부러웟든 것을 말하라면
>함수 홀출할때
>Func(par, ,par3, ,par5)
>이런식으로 디폴트 파라미터를 이용
>함수를 호출할수 있다는 것이었는디요

>C 에서 이기능을 지원하기는
>어려운 일인가요?

>vbasic 말고도 저런 함수 호출을
>사용할수 있는 언어가 있으면
>참 좋을것 같군요.

익명 사용자의 이미지

우선 제 글에 관심을 가져 주셔서 감사드리고요. 언어 설계와 이해에 조금 도움이 될까해서 <또> 몇자 추가합니다.

if문의 가장 큰 결함에 대해 생각해 보신적이 있으신가요?

제가 아는 if문의 가장 큰 문제점은 <분기한다>는 정보만을 가지고 있을 뿐 <분기 확률>에 관한 정보를 가지고 있지 않다는 것 일 겁니다.

예를 들면 다음과 같은 것입니다. 다음의 코드를 보아 주십시오.
if ( a > b || c > d )
{ fa();
}
else
{ fb();
}
이 코드에서 fa()가 실행될 확률은 fb()보다 클까요? 답을 내리기가 곤란할 것입니다. 만약 if안에 또 if가 3개쯤 있다고 가정하죠. 이것은 아주 흔한 경우입니다. 코드를 잘 보면 알 수 있다고 말할 수 있겠지만 변수가 함수 외부에서 날아온 값이고, 더구나 이 프로그램을 실행하는 기기가 디버깅이 어려운 임베드드 기기라면 문제는 더욱 심각해 집니다.

하지만 대책은 분명히 있습니다. 이 코드를 작성한 사람, 그러니까 <최초 코드 작성자>는 확률에 대한 정보를 알고 있습니다. 확실하죠. 그러면 <최초 코드 작성자>에게 가서 물어볼까요? 아마도 그럴 필요는 없을 겁니다. 다음과 같이 작성한다면 어저면 어설프게 10줄을 설명문을 붙이는 것보다 나을 것입니다.

IF a > b || c > d HIGH
fa();
ELSE ERR
fb();
ENDIF
// 빈도 명령어 HIGH , MID , LOW , RARE , ERR , NORMAL

이 정도면 if문 내부의 조건을 일일이 검사하지 않고도 분기 정보를 확실하게 알 수 있습니다. 상당히 직관적인 IF문이라고 생각합니다. (아닐수도 있죠 -_-;) 이런 식으로 if문을 기술한다면 if가 다단으로 겹쳐도 코드를 직관적으로 이해하는데 도움이 될 것이라고 생각합니다.

PS. 문제가 있거나 마음에 안드시거나 개선사항이 있으면 리플 달아주세요.

익명 사용자의 이미지

말씀하신 것은 굳이 따로 명령을 만들어넣지 않아도 그냥 주석처리하면 되지 않겠습니까?
if (a > b || c > d) // HIGH
{
fa();
}
else // ERR
{
fb();
}

분기확률을 표시한다고 해서 그것이 프로그램의 속도를 올려주는 것도 아닌데 말이죠... 단지 표시의 기능 뿐이라면 주석으로도 충분히 처리할 수 있는 문제입니다.

익명 사용자의 이미지

경험적으로 볼때
필수가 아닌 기능은 개발자들이 받아들이지 않기 때문에
명령어로서 HIGH와 설명문 HIGH는 사용되기 어렵습니다.
개발자들에게 열심히 전체 메일 돌린다고 해도 몇주만 지나면
다 앚어버립니다. 그렇다고 매주마다 메일을 보낼 수도 없고...

예를들어 100명의 프로그래머가 있고 그중 25명은 평균적으로
6개월마다 바뀐다고 할 때 매번 설명문 붙여라라고 별도의
정신교육을 할 수는 없가 때문에 최소한 필요하다고 판단되는
기능은 명령어로써 처리를 하는 것이 낫다고 생각합니다.

뭐... 요듬을 선불로 받는 가게와 후불로 받는 가게를 가정하자면
명령어 타입이 선불이고, 설명문 타입이 후불이 되겠죠.
후불타입의 문제점은 돈 내지 않고 가는 손님이 꼭 생기겠지요.

경험적으로 그렇다는 거지요. ^^; 작은 개선이 실무 현장에서는
상당한 개선을 가져 오기도 합니다. 하루종일 if문만 쫒아다니다
소득도 없이 밤늦게 퇴근할때 쓰린 마음이란... 그럼 이만.

익명 사용자의 이미지

우선 제 글에 관심을 가져 주셔서 감사드리고요. 언어 설계와 이해에 조금 도움이 될까해서 몇자 추가합니다.

C프로그래머인 제가 얼마간 자바를 배우면서 가슴에 필이 팍 꽂힌 문장이 있는데 <개인적으로 문법을 만드리 말라>입니다. 공동작업에서 튀는 사람이 실력껏 코딩해 놓으면 정말 여러사람 괴로운 경우가 발생합니다.

잘 아시겠지만 간단히 예를들어보면, C++에서는 C에서는 #define의 자기 복제성 때문에 const를 대안으로 제시했습니다. 이것도 <개인적으로 문법을 만드리 말라>에 해당되는 걸로 알고 있습니다.
그런데 문제는 이런 것을 잘 아는 C++이 오히려 연산자 오버로드라는 기능을 이용하여 연산자를 재정의할 수 있는 길을 터 놓았다는 점일 것입니다. 해당 클래스를 설계하지 않은 사람의 입장에서는 = 하나도 클래스의 소스를 봐야 한다는 문제가 생깁니다.
따라서 자바는 스트링 연산외에는 연산자 오보로드가 막혀 있습니다. 이 부분은 누구나가 공감할 수 있다면 편의를 제공하고, 누구나가 쉽게 공감하지 못한다면 막아버리는 방법을 선택하게 된 것일 겁니다.

따라서 제가 최종적으로 - 현재기준 - 내린 기준은 누가봐도 쉽게 알 수 있게 하자는 의도에서 for와 if를 가진 짧고 간결한 문장을 만들려고 하고 있습니다.
다시말해 <문장이 자신이 스스로의 필요에 의해 for/if정도는 가질 수 있다>로 결론을 내릴수 있겠지요.
문장을 크게 실행문/제어문/반복문으로 나눌경우에 실행문이 좀 제한적이지만 강력한 표현력(제어/반복)을 가지는 것 만으로 코드 읽기가 매우 쉬워집니다.
만약 여러분이 어느날 길을가다 약 10단짜리 if를 만난다면 저의 고민을 이해하시게 될 겁니다.

마지막으로
저도 for/if를 없앨 수 없다고 하는 분들이 의견에도 상당부분 동의합니다. 왜냐하면 for/if의 흔적을 아예 없애버리면 SQL같은 문장이 나와버리기 때문에 C/C++을 이렇게는 사용하는 것은 바람직해 보이지 않기 때문입니다. 그래서 타협점을 어느선에서 잡아야 하는가가 현재 가장 큰 고민입니다.

익명 사용자의 이미지

연산자 오버로딩은 사실 필요가 없습니다. 맴버함수를 이용해서 똑같은 일을 할 수가 있기 때문입니다. 그렇지만 프로그래밍의 발전방향은 극단적으로 말하자면 타이핑량을 줄이는 쪽으로 갑니다. 연산자 오버로딩은 프로그래머의 노가다를 획기적으로 줄여줍니다.
TypeA a;
TypeB b;
a.sub(b); <--> a = b;
a.plus(b); <--> a = a + b;
그리고 한가지 더, C++는 다중패러다임 언어입니다. 여러가지 패러다임의 프로그래밍 방법을 하나의 언어로 구현할 수 있도록 만들어졌습니다. C++이 완전한 객체지향적 언어가 아닌 상당히 엉성한 모습으로 만들어진 것은 이때문입니다. 이렇게 만들어진 이유는 전적으로 실용성 때문이죠.

woonggikim의 이미지

물론 우리가 생각하지 못한 구조는 분명히 있을 겁니다.
하지만 사실 현실적으로 보았을 때 그런 구조를 고안한다는 것 자체도 기존의 것에서 업그레이드를 하는 것으로 보아야 할 것입니다.
이제까지 나온 모든 언어를 보아도 다른 언어와 유사한 경우도 있고, 아니더라도 개념은 거의 비슷하더라구요... *^^*

Freedom

익명 사용자의 이미지

운영자 님에게 드리는 제안;
논의 내용과는 상관없는 내용입니다만.

포럼의 기능이 상당히 좋습니다
그리고
이런 기능이 있으면 더좋을것 같아서
몇자 적어 봅니다.

Forum 에서 글을읽다가 보면
이글이 누구에게 하는 리플라이
인지 쉽게 알수 없는때가 있습니다
각 계시물의 상단에
누구에게 하는 리플라이 라는것을
보여주면 훨신더 읽기가 좋을듯 합니다.
검토해주시면 감사하겟습니다.

권순선의 이미지

본 포럼의 기반 소프트웨어는 http://weblog.kldp.org에서 개발되고 있는 korweblog입니다. 기능상의 제안사항이나 버그/문제점 등은 그곳에 올려 주시면 개발자가 아마 좋아할 것입니다. 감사합니다....

장수원의 이미지

컴퓨터가 할 수 있는 것은 반복과 비교 뿐입니다. :)

그 이상을 할 수 있는 컴퓨터는 제가 아는 지식 내에서는 없습니다.

리커젼, 다이나믹 프로그래밍도 결국 반복과 비교를 이용하는 것입니다.

따라서 if-then, while, for 문 이상으로 제어구분을 표현할 수 있는 것은 없다고 생각합니다. 이러한 if-then, for 문의 나열이 코드 재사용과 유지를 힘들기 하기 때문에, 함수라는 개념이 생기고, OOP가 등장하게 되었습니다.

결국 프로그래밍이라는 것 자체가 어떤 문제를 순서대로 해결해 나가는 과정이라는 측면에서 반복과 비교를 벗어날 수 없다고 생각합니다.

반복과 비교를 하지 않는 프로그래밍을 생각하기 보다는 어떻게 하면 그 반복과 비교를 잘 표현할 수 있을까를 생각하는게 생산적이라고 저는 생각하고 있습니다...

익명 사용자의 이미지

문제는 이거가 아닐까요...
컴퓨터는 깡통이라 반복이나 비교 밖에는 못한다,
그러나 사람이 굳이 컴퓨터처럼, 깡통처럼 사고할
필요가 있을까?
모든 프로그램은 제어 구문을 포함하고 있지만,
그걸 꼭이 컴퓨터의 사고의 흐름을 따라가도록
고정해야 하는 걸까?
아무리 추상적인 사고라도 결국은 0과 1로 환원되고
말지만, 사고를 좀 더 추상적인 레이어에서 조작할 수
있는 방법은 없을까?

아래 여러 가지 시도들이 소개되고 있는 것으로 압니다.

익명 사용자의 이미지

good job!!!
절대 동감합니다.

익명 사용자의 이미지

지금으로서는 새로운 제어구로라는것은 나오기 힘들것 같습니다 사용자가 쉽게 사용할수있는 언어라는것은 언어 자체보다는 비쥬얼한 툴이 더 많이 작용한다고 생각됩니다.
만드는 사람의 생각을 쉽게 표현해줄수있는 툴이 있으면
좀더 쉬운 프로그래밍 환경을 만들수 있습니다.

eric의 이미지

노가다를.. 줄일만한 언어라..

아래 분들이 언급한것 같이.

Lisp나 Haskell같은 함수형 언어가 많이 줄일 수 있을듯 하군요.

머. 그게 최상의 방법이란건 아니지만 말입니다.

함수형 언어는 간단한 것을 이용해서 다양한 표현이 가능하죠 .. (저도 지금 Haskell을 배우는 중이라 자세히 설명을 못드리는점 죄송.. )

함수형 언어 한번 봐보세여 :-).. 그럼 .. 조금이나마 숨이 트이는걸 느낄 수 있을겁니다.

김용욱_의 이미지

lisp는 그나마 lisp.or.kr이 있던데 헤스켈은 어디에서 자료를 얻을수 있나요?
--
L.I.T

L.I.T

eric의 이미지

Haskell은 http://Haskell.org입니다.

shjeun의 이미지

새로운건 아니지만.

forth는 stack 언어로서 모든 연산을 stack을 중심으로 동작하도록하게 하는 언어죠.

그리고 최근에 나온걸로는 함수언어(Functional Language)라고 해서 Haskell 같은 언어가 있죠~

물론 if, while 같은 조건문이 전혀없는 것은 아닙니다.
Lisp이 비교적 Haskell과 비슷한 형식을 가집니다.

그러나 일반적인 언어에 익숙해진 저로서는 Haskell을 쓰기가 더 어렵더라고요.
흐름이 바로 눈에 들어오는 형태의 언어는 아니거든요.

:-)

익명 사용자의 이미지

C로 먹고사는 허접이 몇마디 도움이 될까해서 글을 올립니다.

님께서 전문적인 지식이 없다고 겸손하게 말씀하셨지만 그 정도만으로도 문제의 본질은 정확히 짚으신겁니다. 이런건 <소프트웨어 생산성의 위기>라 하죠. C언어의 경우 코드가 커지면 거의 죽음의 코드가 만들어지죠.

생각하기에 따라서는 if 문의 대부분을 없애고 코딩이 가능합니다. 물론 아주 없애는 것은 아니고 순서만 조금 바꾸면 생각외로 읽기 쉬운 코드가 나옵니다. 제가 꽤 오랫동안 고민했고 그래서 요즘 C문법 해석기 만드는 중입니다.
(일본은 이번주 목요일 휴일, 금요일 샌드위치 휴일, 토요일 당근 놀고, 일요일 마저 놀고...내일부터 4일간 열심히 해석기 만들어야죠)

아래의 예를 보아주세요.

다음과 같은 코드가 있을 때
a();
b();
c();
d();
e();
...
에러에 대응하고 나면 다음과 같은 코드가 나오죠.
if (!a())
{ if(!b())
{ if (!c())
{ if(!d())
{ e()
}
else
{ d_error();
}
else
{ c_error();
}
else
{ b_error();
}
else
{ a_error();
}
상당히 읽기 부담스런 코드가 되죠. 하지만 ... 거두 절미하고
명령어 몇개 추가하면 다음과 같은 코드를 만들수 있습니다.
a()@ ERR a_error(); END
b()@ ERR b_error(); END
c()@ ERR c_error(); END
d()@ ERR d_error(); END
e()@ ERR e_error(); END
아주 심플하죠.

좀 더 생각을 넓히면 for문도 없앨 수 있답니다.
다음을 보죠. 이차원 배열 b[][]를 a[][]로 복사하는 코드입니다. 최소한 세줄이 필요하죠.
for(i=0; i<10; i++)
for(j=0; j<10; j++)
a[i][j] = b[i][j]
이것을 다음과 같이 나타내 봅시다. ii와 jj라는 변수가 기존에 있다고 가정하고 들어갑니다. 참고로 여기에서 사용하는 $마크는 이 문장이 루프에 쌓여 있음을 의미합니다.

a[ii$$0..9$][jj$$0..9$] = b[ii$][jj$];

간단하죠.

이게 어디서 갑자기 날아온것 아니고... 여러 언어를 참고해서 C언어에 적용할 수 있도록 일부 변형해 본 겁니다. 참고하세요.
다음에 결과물이 좀 나오면 kldp에 정리해서 올리겠습니다.

익명 사용자의 이미지

vbasic 에서
가장 부러웟든 것을 말하라면
함수 홀출할때
Func(par, ,par3, ,par5)
이런식으로 디폴트 파라미터를 이용
함수를 호출할수 있다는 것이었는디요

C 에서 이기능을 지원하기는
어려운 일인가요?

vbasic 말고도 저런 함수 호출을
사용할수 있는 언어가 있으면
참 좋을것 같군요.

익명 사용자의 이미지

매개변수가 모두 다 포인터라면 흉내내는 것이 가능합니다.
void func(int *a, int *b, int *c)
{
if (a == NULL) { a = 3; }
if (b == NULL) { b = 4; }
if (c == NULL) { c = 5; }
...
}

int main(void)
{
int n;
func(0, &n, 0);

return 0;
}

그러나... 삽질이죠-_-;

익명 사용자의 이미지

{ a = 3; } -> { a = malloc(int); &a = 3; }

익명 사용자의 이미지

malloc(int)->malloc(sizeof(int))

익명 사용자의 이미지

&a=3; --> *a=3;

익명 사용자의 이미지

do {
if (a()) { a_error(); break; }
if (b()) { b_error(); break; }
if (c()) { c_error(); break; }
if (d()) { d_error(); break; }
if (e()) { e_error(); break; }
} while (0);

--------------------

template
class array { ... };

int main(void)
{
int i, j;
array > a, b;

/* 배열 a의 크기 초기화 */
a.setsize(10);
for (i = 0; i < a.getsize(); i++) {
a[i].setsize(10);
}

/* 배열 1에 적당한 값 대입
for (i = 0; i < 10; i++)
for (j = 0; j < 10; j++)
a[i][j] = i * 10 + j;

/* 배열 b에 배열 a 대입 */
b = a;

return 0;
}

익명 사용자의 이미지

매우 많은 도움이 되었습니다..:)

익명 사용자의 이미지

<위에 글쓴 사람입니다>

템플릿으로 이렇게까지 처리를 할 수 있다니 놀랍군요.
제가 템플릿은 max만드는 수준 밖에 안돼서 이런 수준으로까지
활용이 가능한지는 몰랐습니다. 조언에 감사드립니다.

제가 이런 생각을 하게 된 것은 전에 모 회사에서 굉장히 잘
꼬여진(?) 소스를 보고 충격을 받은것이 원인이 되었는데\
앞에 써 놓은 코드는 C에서 시스템에 과부하를 주지않으면서
사용자 쪽에서는 읽기 쉬운 코드를 만들고자 하는 의도에서
만들어진 코드입니다.
참고로 저는 주로 임베디드 분야에서 일을 하고 있습니다.

익명 사용자의 이미지

저는 C++의 가장 강력한 기능중의 하나가 template이라고 생각하고 있습니다.

위에 분께서 template class array를 사용한 코드의 예를 잘 들어주셨지만
아예 이차원 배열에 해당하는 matrix template class를 만들어서 다음과 같이 짤 수도 있습니다.

template
class matrix { ... };

int main()
{
matrix a, b; // 10*10 행렬 2개 선언
...
a = b; // matrix to matrix copy
matrix c;
c = a + b; // matrix의 합
a[0][2] = 2; // 심지어 operator overloading을 하면 2차원 배열과 동일하게 사용가능합니다.
};

그리고 첫번째 경우는 exception을 사용하면 다음과 같이 처리 가능하구요

try
{
if (a()) throw a_exception();
if (b()) throw b_exception();
if (c()) throw c_exception();
if (d()) throw d_exception();
if (e()) throw e_exception();
}
catch (a_exception)
{
a_error();
}
catch (b_exception)
{
b_error();
}
catch (c_exception)
{
c_error();
}
catch (d_exception)
{
d_error();
}
catch (e_exception)
{
e_error();
}

김용욱_의 이미지

꼬리 잡기는 아니구요.
{가 8개구
}가 5개가 나왔습니다.
아마도 오타이신것 같아요.

어쨌든 결과물이 빨리 나오길 기대합니다. :)
--
L.I.T

L.I.T

익명 사용자의 이미지

리스프 언어가 님이 생각하시는 언어에 가깝다고
생각되는군요.
리스프에도 물론 if, for에 해당하는 구문이 있고,
어떻게 보면 C 언어의 제어 구조에 비해 더 복잡
한 형식을 사용한다고도 할 수 있습니다.
(여러가지 형식의 제어 구문을 제공합니다)
그러나 리스프의 진정한 장점이자 진정한 리스프
다움은 재귀 표현에 있습니다.
반복 구문의 대부분은 재귀적으로 표현될 수
있습니다. 그래서 약간의 재귀적 사고, 개념에
익숙해지면 프로그래밍이 훨씬 자연스러워 집니다.
물론 이쯤에서 재귀식의 비효율성을 지적하시는
분들이 많으리라 생각합니다. 그러나 리스프
컴파일러는 재귀 표현을 내부적으로 루프문으로
변환시켜 줍니다.
즉, 개발자는 추상적으로 사고하고, 컴파일러는
기계에 적합하도록 그 사고를 기계적으로 해석
합니다.
실제로 스택 플로우에 대한 염려 없이 삼사만 크기
정수의 팩토리얼을 구하는 것은 아주 쉬운 일입니다.
(제가 테스트해 본것이 40000 정도였을 겁니다)
리스프에는 그밖에도 람다 표현과 매크로 표현등이
있기 때문에 if, for 등의 노가다 코드로 범벅이
되지 않은 우아한 코드를 만들어 낼 수 있답니다.
리스프 언어의 속도 문제를 거론하는 분이 아래
계시던데 결코 늦지 않다가 정답이 되겠습니다.
리스프 언어는 개발시에는 인터프리터로 하지만
결국에는 당연히도 컴파일러로 컴파일을 하게
됩니다. 코만 리스프같은 common lisp(리스프의
디 팩토 표준)은 아예 인터프리팅을 하지 않고
개발 단계에서도 컴파일을 해버립니다.
제대로 작성된 컴파일된 리스프 코드는 C만한
속도 성능을 보이는 것으로 알려져 있습니다.
(물론 '제대로 작성된'이라는 조건에 의혹의
눈길을 보내실 분이 있겠지만 보통은 어렵지 않은
약간의 테크닉입니다. 타입 선언이나 테일
리커시브 정도의 기계적인 테크닉...)

물론 리스프에도 많은 약점이 있습니다만...
여튼 위의 님께서 제기하신 문제에 대한 답으로는
그러한 언어가 존재하며, 제가 아는 한은 그건
리스프라고 말씀드릴 수 있겠습니다.
(리스프의 약점은 언어 자체라기 보다는
얼마나 많은 지원이 리스프 언어에 대해 이루어
지고 있느냐 하는 것이죠. 얼마나 많은 개발자,
관련 소스들, 책자들, mpeg등 새로운 기술들에
대한 지원들...닷넷에 대한 지원도 얘기할 수
있겠군요....)

익명 사용자의 이미지

(물론 '제대로 작성된'이라는 조건에 의혹의
눈길을 보내실 분이 있겠지만 보통은 어렵지 않은
약간의 테크닉입니다. 타입 선언이나 테일
리커시브 정도의 기계적인 테크닉...)

이말은 테일리커젼으로 작성하지 않으면 자동으로 루프로 바뀌지 않는다는말인가요?

익명 사용자의 이미지

예, 제가 테스트해 본 리스프에서는
그렇더군요.

(그러나 아시겠지만 테일 리커젼 만드는 거
아주 쉬운 일입니다. 기계적인 작업일 뿐이죠...)

itsup2u의 이미지

전문 프로그래머가 아니시니 뭐.. 권해드리긴 뭣하지만..
컴파일러..관련 책을 보시면..어떨까.. 싶네요..

그리고 기계어쪽에 가까워질수록 조건문과 분기 그리고 레지스터나 플래그 조작등의 이해할수 없는 단순작업의 반복으로 컴퓨터가 동작된다는것을 아시게 되면 최초의 컴퓨터라 일컽는 에니악이 왜 진공관과 백열전구등으로 치장되었는지..
그리고 컴퓨터의 근본 동작원리가 전기의 on/off만으로 동작한다는것을 이해하시리라 생각됩니다.
그리하면 현재의 프로그래밍 구조를 바꾼다는것은 컴퓨터의 근본 구조를 바꿔야 할거라고 어렴풋이 생각 드실겁니다.

수학의 미적분이 사용되는 용도와 비슷하게 컴퓨터에서 아날로그를 정밀하게 사용하게 되는날.. 뭐.. 바이오컴퓨터니 뭐니하는.. 이진법의 논리를 떨어버릴수 있는날.. 지금과는 전혀 다른개념의 컴퓨터가 나오지 않을까요?

그런데.. 그게.. 아마도..

철학이니 종교니 하는 전혀 상관 없어보이는 형이상학적인 영역의 변화가 먼저 있어야 하지 않나..도.. 생각이 듭니다.

뚱딴지 같은 헛소리였습니다..

킁..

예~~

dullfrog_의 이미지

글쎄요.
그저 컴파일러의 문제 아닐까요?

언어를 해석하는데 있어서 그런 식의 언어를 잘 해석하면 되지 않느냐는 거죠.

하지만......

그런 식의 언어라는 자체가 문제일 것 같습니다.

일상의 논리 언어도 기존의 흐름제어에 거의 합치되는 것같고...

그런 논리 언어에서 수학의 언어도 비슷한 것이구요.

우리가 일상에서 쓰는 언어들이 그런 것들이라서 이런 구조의 언어가 나온 것이라 보는데요.

...

우리의 언어자체가 다른 무언가의 흐름으로 서술 될 수 있다면 ... 저런 프로그램 언어가 가능하겠지만...

가능은 할 지 몰라도 .. 별로 쓸모는 없을것 같은데요?

오히려 혼란만 가중시키고 ... 배우기도 힘들고 ......

뭐 ... 그런 생각이 드네요.

익명 사용자의 이미지

인간이 생각하는 방식 자체가 if-then인데 어떻게 제어구조를 바꿀 수가 있을까요-_-;

익명 사용자의 이미지

동감. 인간의 생각하는 구조를 제어구조로 옮긴 게 if-then, for, while 등인데 어떻게 더 바꾸잔 얘긴지 잘 모르겠음-_-

cypher_의 이미지

좀더 효율적인 뭔가가 없을까 생각해보는거죠 :)

산들바람_의 이미지

과연 가능할까요. 그런 새로운 개념의 제어구조가.
제어라는 단어자체가 이미 if-goto 를 내포하고 있고,
저는 일반적인 언어외에는 접해본게 없어서 모르겠지만 현재의 사고방식자체를 완전히 새롭게 바꾸지 않는한은 힘들것 같아요. 만약 그러한 사고방식의 전환이 필요하다면 프로그래밍이라는 개념도 완전히 바뀌게 되겠지요.
예를 들어서 주문이나 그런것으로 ^^;

sharefeel의 이미지

UML이 바로 코드화 되면 되지 않을까요?

그렇게 되면 UML이 훨씬 복잡해지고..

native API 지원을 위해서 유닉스용 UML, 윈도용 UML 하면서 잔뜩 있어야겠구나 하는 생각도 드네요..

여튼 프로그래밍을 UML로 한다면 디게 편할 거 같기도 합니다.

그렇게 되면 '코딩' 이라는 말도 사라지겠죠..

===============
Vas Rel Por

익명 사용자의 이미지

현재 자동화의 과정은 UML을 그려서 '틀'을 만드는것 까지 지원하고 있고
Refactoring 에 자동화가 많이 이루어 졌지요.

이국현의 이미지

Prolog도 노가다 성이 짙던데요. 프로그래밍은 어짜피
다 노가다가 아닌가요.
자동으로 머리속에서 상상하는걸 프로그래밍화
해주는 기계가 등장하지 않는 이상 말이죠.

익명 사용자의 이미지

아마 현재의 폰 노이만 구조의 아키텍쳐가 바뀌기 전까지는 저 제어문들이 계속 따라다니지 않을까요?
LISP 이나 Prolog 같은 함수형 언어가 훌륭하다고는 하지만, 아직 일반적이지도 않고 속도도 느린걸로 알고 있습니다.

그리고 새로운 제어구조를 익혀야 하는 것도 귀찮구요 -.-;;

한정훈의 이미지

cypher님의 생각대로 새로운 언어가 생긴다면 그 언어를 새로 배우려는 사람들이 다시 고역스러워하겠지요.

----
아.. 세벌식 익히기 정말 어렵다.

'98th student of KW-Univ., Dept of CE.

익명 사용자의 이미지

어떤 일을 하던 사람들은 자기의 생각대로 인것을 가장
편하게 생각하지요. 그러나 어떤 것이 든지 생각대로 는
움직이지 않지요.

아직까지는 사람이 컴퓨터에 맞추는 것이 현실적이고
효율적입니다. 그리고 당분간은 어려울 듯 합니다.

dawnsea의 이미지

터보 프롤로그.

아직도 기억하시는 분 있나요?

익명 사용자의 이미지

음.. 쌍팔년도에.. 대학들어가서.. XT기종(2FDD)을 첨 구입하여 이것 저것 해보던때에..
터보씨와 터보파스칼.. 그리고 터보프롤로그를 했더랬습니다.
다른건 책이 있었는데.. 터보프롤로그는 국내에 책이 없어서..
Z-80 기계어 레퍼런스 말고는 제돈주고 산 최초의 프로그래밍 관련 원서였습니다.
원서...
흑..
프로그램 몇줄 따라 해보고는 금방 그만 뒀다는...
언어를 이해하기에 앞서 책을 독해하기가 더 어려웠지요..
하여간 기억에 남는 언어입니다. ^^

아직도 디스켓과 그 책이 있을겁니다.. 어딘가에 책장속 깊숙한 곳에...

dawnsea의 이미지

크라운 출판사에서 나온 퍼런 책이 하나 있었던 걸로 기억합니다. ㅡ.ㅡ;

인공지능을 표방해서 아마 금속성의 사람 얼굴 형상 그림이 있었던 것 같은 기억이..

하도 오래되서 기억이 틀릴 수도 있습니다.

김영희의 이미지

wsprolog는 알고있는데... 버보 프롤로그는...????

dawnsea의 이미지

뭐 터보 C 2.0 이 대 흥행(?)을 하기 바로 이전 시기에 나왔던 언어인데요.

전 그 시절에 터보베이직을 했고, 사촌형이 터보프롤로그를 했죠.

비약해서 인공지능형이라는 수식어까지 사용할 만한 구조의 언어로 알고 있는데.

전 안 해봤고, 혹시 해 본 분이 있나 싶어서 여쭙니다.

일반적인 프로그래밍 제어 구조랑 다른 것으로 들었습니다.

김영희의 이미지

그냥 프로로그인데... 버전이 다른거겟죠~
제가말한 wsprolog는 윈도우 같은데서 사용하는.... 머 그런거였구요
컴퓨터 언어처리라구 지구인들 사용하는 언어 분석할때 사용했습니다.

dawnsea의 이미지

헉.. 혹시 외계인이세요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.