IDE(통합 개발 환경)란? 개념, 기능, 필요성

마지막 업데이트: 2022년 2월 5일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
그림 1 – 네이티브 실행 파일은 거의 즉시 시작되며 Go 또는 Java HotSpot에 비해 메모리를 거의 사용하지 않습니다.

Användare:RonnyMontgomery

단편적인 소개와 경고에 그치는 경우가 대부분이었다. 확인할 수 있을 것이다. 기사를 본 국세청에서 연락 왔다.youtube.com 불법 인터넷 도박관련 기사를 읽고 연락 드린다.youtube.com 범죄도 범죄지만 (이들이)정상적인 세금을 납부하고 살 리 없다. 어떻게든 과세할 방법을 찾아 세금을 내게 해야겠다. 상대방은 국세청 OO팀 소속, 최근 벙커 1에서 조인했다. 묻지도 따지지도 않았는데 처음부터 신분증 제시하는 모습, 우리 스타일 되겠다. 하여 간단한 브리핑과 함께 관련자료 넘겼다. 자료의 일부분, 다음과 같다. 알다시피 이 기사는 실시간이다. 인터넷 도박 조직의 내부에 침투해 자료를 빼내면서 쓰여진다. 다만 우리가 짱구를 굴리면 저쪽도 굴린다. 여기에 선수가 있으면 저기에도 선수가 있다. 언제든지 이쪽에서 저쪽을 바라보는 통로를 닫을지 모른다. 눈치를 채면 우리가 알고 있는 현지 장소에서 쥐도 새도 모르게 이동한다.

하여, 자료의 일부분을 이렇게 밖에 공개할 수 없는 점, 답답한 면이 있어도 이해 바란다. 저번에 준 자료 검토했다. 즉, 통장 입금금액 전부가 부가가치세 과세대상금액으로 잡힌다. 해외 거래이기 때문에 몇 가지 요건을 검토해야 한다. 몇 가지 확인을 더 해보고 싶은 게 있다. 이런 식으로 전개 중이다. 국세청은 본지가 넘긴 주요 관련인물의 생년을 추적, 아내의 성씨를 바탕으로 일단 한 명의 정보와 루트를 정확히 캐취했다고 전했다. 다음 미팅은 3월 17일 이후다. 다만 나는 잡지 못할 것이라 했다. 현지의 집주소와 조직원 신상정보까지 꿰고 있으며 대포통장 계좌까지 손에 들고 있는데 왜? 해외에는 공권력이 미치지 않는다. 에서 볼 수 있듯 인터폴이라는 곳이 우리의 상상과는 다르다. 인터폴이 해외에서 활개를 칠 수 있는 단체도 아니고 현지 경찰에 우호적이지도 않다. 지네들 범죄 해결하기도 바쁜데 남일까지 신경 쓸 틈, 없다. 정보는 새기 마련이다. 우리도 OO서 쪽 경찰한테서 단속 정보를 얻었다.

국가에서 X월에 한바탕 할 거라고 정보가 떴다. 다만 국세청 OO팀 소속, 잡지 못할 것이라는 본인의 말에 대해 다음과 같이 응했다. 5년 전, 인터넷 불법 도박 시장규모 추정치만 32조에 달하니(2008년 사행산업감독위원회가 아주대학교 산학협력단에 의뢰해 만든 '불법도박의 실태조사 및 대책')지금은 얼마나 될 지 알 수 없다. 이쪽만 제대로 디벼줄 수 있다면 복지재원 문제가 한큐에 해결되긴 할 게다. 청와대 힘내시고, 본지는 본지대로 갈 길, 간다. 죽'이 죽지않는돌고래 본인, '도'가 내부고발자다. 죽: 아이디와 비번을 산다구요? 도: 네. 기자님 블로그도 있을 걸요.(웃음) 여기 메신저에 이름 보이시죠. 얘가 이거 파는 업자예요. 실버로 시작하는 아이디. 핫메일이다. 죽: 포탈 아이디와 비번을 알면 개인 신상정보가 그대로 털릴 텐데 그걸 이렇게 쉽게 산다구요? 도: 네, 입금하면 보내줘요. 다 가격 차이가 있을 텐데 저희는 200개에 3만원 주고 샀어요. 100% 확실하구요. 일정 기한이 있긴 한데 불량 있으면 교체도 해줍니다.

도: 비번이 다르면 교체해 준단 얘기죠. 이 업자는 사장이 소개해 준 분이긴 한데 사실 이건 진짜 아무 것도 아니에요. 기자님도 조금만 알아 보시면 업자들 많이 나올 겁니다. 그냥 메신저에 업자 아이디 추가하고 상담한 뒤에 돈 입금하면 쏴줘요. 대량으로 사면 깎아 주구요. 1편 기사가 나간 후 자신의 블로그도 해킹되었다는 메일이 많이 왔다. 네이버, 다음 등 본인의 블로그가 해킹되어 인터넷 광고판으로 쓰이는 경우는 대개 이런 식이다. 이 기사를 본 당신이 나쁜 마음을 가지고 이들과 접촉하여 그들이 불러주는 한국계좌로 돈을 입금하면 지금 당장 수백, 수천 개의 아이디와 비밀번호를 확보할 수 있다. 상담을 통해 아이디와 비밀번호 뿐 아니라, 주민등록번호, 이메일, 전화번호, 집주소까지 적혀 있는 디비까지 본인의 용도대로 돈만 있으면 손쉽게 구할 수 있다는 뜻이다. 제보자가 본 기자의 블로그 아이디와 비밀번호도 구할 수 있을 것이라 확신하는 이유는 대개의 사용자들이 비슷한 아이디만 쓰고 있으며 대부분 같은 비밀번호를 사용하기 때문이다.

현재까지 해킹으로 개인정보가 유출된 주요 사이트를 짚어보면 KT(873만명-2012년 7월), 넥슨(1320만명-2011년11월), 네이트-싸이월드(3500만명-2011년 7월), 현대캐피탈(175만명-2011년4월), GS칼텍스(1125만명-2009년9월), 옥션(1860만명-2008년1월), 엔씨소프트(120만명-2004년 5월) 등이다. 이때 해킹된 개인정보들은 모두 업자들의 손에서 손으로 떠도는 상태이며 대부분이 엑셀로 완벽하게 정리되어 있다. 여러분이 위 사이트에 단 한곳이라도 가입해 있고 그때 비밀번호를 바꾸지 않았거나 또는 그때의 아이디와 비밀번호로 여타 사이트에 가입하고 있다면, 이미 회원 탈퇴를 했다고 해도 아이디 도용은 식은죽 먹기다. 조금만 응용하면 특정 인물의 이름이나 메일 주소만 알고 있는 상태에서 그 사람의 신상정보를 빼낼 수 있는 방법을 쉬이 상상할 수 있다. 굳이 구글링이나 검색을 통해 오랜 시간을 들이지 않아도 트위터, 페이스북 비밀번호는 물론 누구나 특정인물의 개인정보를 사고 팔 수 있다는 말이다.

OO파 소속으로 한때 인터넷 도박 경마 분야에서 1위를 달렸던 모씨와의 인터뷰에 의하면 아예 처음부터 실력 있는 해커를 고용하여 팀을 꾸렸다고 한다. 죽: 자, 그럼 요 정보를 받아서 광고를 시작하겠네요? 죽: 거기 있던 O명이 다 그 짓을 하는 거예요? 도: 네. O명이 다 그 짓을 해요. 교대로 돌아가면서. 같이 할 때도 있고. 그런데 지금은 아직 우리 사이트가 없는 상태잖아요. 제가 셋팅을 아직 다 못 끝냈으니까. 도: 그래서 처음엔 딴 곳에서 지점을 받았어요. XX카지노에서 지점을 받아 와가지고 수익금액의 40%를 가지고 갈 수 있는 구조로. 우리 쪽 서버는 없으니까 옆에 세 들어서 그쪽 업체랑 한 거죠. 죽: 지점을 받았다는 게 그 말이죠? 인터넷 카지노가 화상으로 딜러 모습을 실시간으로 찍어 날려주는 데가 있고,거기서 이제 가지치기가 되서 쭉 아래로 내려가잖아요? 도: 네. 그러니까 웹사이트가 있는 데가 있고, 기본적으로 웹 사이트가 없는 지점이 있어요.

없는 곳, 그걸 지점이라고 하죠. 인터넷 도박의 종류는 무궁무진하다. 인터넷 카지노의 바카라(두 장의 카드를 받아 합이 9에 가까운 쪽이 이기는 게임. 처음 당신이 사이트에 접속하게 되면 예쁘장한 외국인 딜러가 실시간으로 카드를 나눠주는 모습이 동영상으로 보일 것이다. 실시간으로 화상을 쏴주는 곳을 보통 총판, 이와 연계해 사이트에 중계해 주는 곳이 본사, 또 본사로 연결해주는 도메인으로 장사를 하는 곳을 지점이라 불렀다고 한다. 도: 내가 '죽지않는돌고래'라는 도메인을 따잖아요. 그럼 '죽지않는돌고래'라는 도메인을 타고 접속을 한 유저들은 구분이 돼요. 이 쪽 타고 온 손님이구나. 그래서 그쪽을 타고 온 손님이 입금을 하면 '죽지않는돌고래'라는 도메인으로 장사를 하는 지점, 즉 나한테 40%가 떨어지는 거예요. 저야 처음엔 광고 쪽은 손 안 댔고 서버구축이랑 네트워크 구축 하느라 계속 바빴죠.

실제 이 기사를 쓰면서 미리 셋팅해 놓은 루트를 통해 불법 인터넷 도박 조직의 지점을 일일이 확인해 보았다. 국내 뿐 아니라, 해외 여러 곳에서 지점을 받아간 이들이 눈에 띄었다. 입금 유저 옆에는 그들이 타고 온 도메인명이 명시되어 있다. 죽: 아까 40% 떨어진다고 했잖아요? 도메인 연결만 해 주는 걸로. 그런데 그 40%라는 게, 만약에 이 사람이 도박을 하려고 1억을 넣었다면 그거에 40%는 아닐 거 아니에요? 도: 1억을 넣었는데 1억을 다 꼴았어. 도: 그러면 4천 만원이 나가는 거예요. 죽: 와, 4천 만원이나? 아까 보니까 한 명이 1억 넘게 때린 사람도 있던데. 죽: 그러면 저쪽에서 6천 만원 먹고. 죽: 좋네요(웃음). 그럼 그 위쪽은? 그니까 직접 화상을 쏴주는 총판과는 어떻게 정산을 합니까?

도: 걔네들은 게임머니로 줘요. 게임머니 천만원을 백만원으로 가져올 수가 있어요. 그렇게 가져오는 건 합법이라10%만 남겨먹어도 엄청나죠. 1000% 장사다. 당신이 인터넷 도박을 위해 입금한 1000만원을 조직은 100만원에 사온다. 죽: 자. 그럼 15일 동안 인터넷 도박 서버 쫙 구축했고. 죽: 홈페이지도 직접 만드신 거예요? 도: 홈페이지는 업체에다 맡겨가지고 160만원에 한 거예요. 죽: 그거는 국내 의뢰? 죽: 그럼 굳이 현지에서 한국으로 들어오지 않아도 되네요. 의뢰해서 만들어 주는 거니까. 도: 네. 메신저로 연락하고 무통장으로 입금하면 끝이죠. 죽: 그게 무슨 말이에요? 도: 개인을 섭외한 게 아니라 아예 한국 회사한테 맡기더라구요. 도메인을 통해 들어가보니 그냥 멀쩡한 디자인 회사다. 수많은 업체 홈페이지가 나열되어 있는 회사 포트폴리오에 인터넷 도박 사이트는 나오지 않는다. 죽: 정말 그냥 멀쩡한 합벅적 회사네요. 도: 네. (웃음) 그래가지고 저도, 아니, 이런 멀쩡한 회사에서 해 줄까? 그게 되게 아리송 했어요. 죽: 그러게요. 웹 디자인 보면 불법 도박사이트인 게 뻔한데? 하는 생각도 있을 텐데.

제가 생각했을 때 한 500은 줘야 움직일 것 같았는데, 그냥 하더라고요. 회사가 힘들어서 그런지.(웃음) 여튼 그건 되게 싸게 한 편이었어요. 아예 현지로 건너가 불법 인터넷 도박 업체의 홈페이지를 만들어준 OO씨에 따르면 추후관리 비용을 별도로 받긴 한다고 한다. 직원들이랑 얘기도 하고 잡담도 하고 그랬을 텐데. 안에서는 도대체 어떤 사람들이 일을 하고 있는지 파 봅시다. 도: 서서히 알아 갔죠. 모르겠어요, 이런 얘기 해도 되는가? 도: 주로 광고팀은 고등학교 중퇴 막 이런 애들이었어요. 죽: 일단 지금 현 상황은 사장 빼고, 실장 빼고 본인 포함 총 O 명인데. 그럼 총 O명이 거기 상주했던 거네요? 도: 그런데 사장은 거의 없었어요. 죽: 그럼 사장은 언제 처음 만난 거예요?

도: OOO에서 첫날 만났는데 왔다 갔다 자주 한 걸 보니까, 뭐 따로 집이 있는 것 같아요. 그래서 같이 산 거는 O명이서 살았죠. 죽: 아, 실장까지 포함해서? 도: 아, 저까지 O명이구나. 죽: 사장 한 명, 실장 한 명, 선생님 포함해서 O명인 거네요? 광고팀 애들이 궁금한데요. 허구헌날 블로그 해킹해서 도박광고 올리고 뉴스 댓글에 광고 올리고 이런 애들 뭐해 먹고 살던 애들인지 궁금한데. 도대체 어떻게 섭외해서 해외까지 데리고 나가는지. 첫 번째 기사가 나간 2월 21일, 채 24시간이 지나기도 전에 이런 부류의 친구들로 추정되는 이들이 본지 딴지라디오 참여게시판에 13페이지 가량의 인터넷 도박광고를 실어 주었다. 회원 활동 보류 먹이고 게시물 모두 삭제했다. 광고를 낼 거면 본지의 박팀장을 찾아 정중히 전화를 걸어 광고비에 대해 의논한 후 광고를 했으면 한다. 본지, 공정사회를 추구하므로 돈 안내면 광고 안 실어준다. 다만 게시물이 모두 삭제된 지 5분 만에 나타나 다시 무차별로 광고를 살포하기 시작한 아이디의 경우는 진정성이 돋보였다.

스스로의 정치적 입장을 전하기 위해 시대적 상황과 결부시켜 자신의 논리를 펼친 점, 본인의 기사를 정면으로 비판하는 동시에 자신의 심정을 솔직담백하게 담아낸 진정성, 높이 평가한다. 다만 역시나 본지에 돈을 내지 않고 광고를 했기에 모두 삭제했다. 너무 서운하게 생각하지 말 것을 바라며 광고에 상응하는 정당한 입금을 촉구한다. 전화번호까지 알아내서 직접 전화 걸면 납치단 급으로 인정, 집주소까지 알아내서 대문 앞에 생수 한 통 놔둘 수 있으면 국정원 급으로 인정, 아이폰 아이메시지나 바이버 앱 통화내역 뚫어서 증명하면 본지 취재팀보다 한 수위로 인정하고 정중하게 인터뷰 들어간다. 본지 취재팀에 다양한 노하우를 전수해주는 모든 정보원에겐 본인이 직접 직원전용식당에서 김치삼겹살볶음을 사주는 것도 모자라 급기야 본지 편집장이 눈을 똑바로 쳐다보고 잘했다고 칭찬을 해주니 많은 도전 바란다. 구체적으로 한 명 한 명 궁금한데.

지금 본사를 만들러 간 거잖아요. 사람들이 이 본사가 어떻게 이루어졌는지 궁금할 거란 말이에요. 시다하는 애들은 어디서 데려오는지? 얘네들은 얘기를 해보면, 대부분이 이쪽 업계 종사자들이에요. 옛날 바다이야기 이런 때부터 계속 이쪽에서 성장해온 애들. 일반 오프라인 카지노도 그런 게 있대요.youtube.com 삐끼가 손님을 섭외해 오면 커미션이 몇 프로 이렇게. 이 삐끼는 카지노 에이전시를 말한다. 본지 취재팀. 역시나 정확한 사실 확인을 위해 과거 필리핀에서 제대로 잔뼈가 굵은 카지노 에이전시를 만났다. 손님이 베팅한 액수에 따라 1.2%, 3.5%, 9%까지 엮어 먹을 수 있는 시스템이 존재하는데 오프라인 카지노 세계 역시 흥미진진하다. 인간을 어디까지 물건 취급할 수 있는지 보여주는 51장 분량의 이 녹취록은 시간이 될 때 또 한번 제대로 디벼보자. 도: 그런 거를 하면서 지들끼리 모여가지고 바다이야기까지 한 번 차렸다가 망한 애들이에요. 그래서 한 달에 엄청나게 돈을 땡기던 낭만 속에서 못 깨어나고 있더라고요. 역시 하던 놈들이 계속 한다. 다양한 취재원과 만난 결과, 대부분 바다이야기 시절로 거슬러 올라갔다. 죽: 지금 말씀하시는 거는 사장 실장? 죽: 아, 직원들 O명?

도: 사장 실장은 좀 더 위대해. 그러면 달라 붙는 사람들이 많겠네. 이쪽 바닥에서 계속 있었다는 이야기네요? 도: 네. 그러다가, 한 명은 한국 사람이기는 했는데 OOO에서 많이 살았나봐요. 그 아버지가 이쪽 업계에서 꽤 유명한 분이셨는데.. 도: 아버님이 갑자기 돌아가셨나봐요. 그래서 살아오다가 힘들어서 자기도 아버님의 직업을 계승받는. 그런데 아버지가 하는 일까진 그릇이 안되서 본사로 내려왔구나. 그럼 O 명 다 얘기해본 게 학력이 고등학교 중퇴? 도: 고졸 두 명이고 중퇴 한 명. 너무 얘기가 안 돼가지고 스트레스를 많이 받았었죠. 죽: 말이 안 통하는? 도: 너무 개념 없는 거를 막 질문하고 하니까. 죽: 예를 들어서 개념 없는 질문이란 게? 제 입장에서는 개념 없는 거거든요. 자기가 도메인 잘못 쳐놓고 사이트 안 들어가진다 그러고. 죽: 아, 개념 없는 거 맞네. 죽: 컴퓨터 안 된다고.

도: 봐달라고 하는데, ‘아니, 형님은 원래 이런 거 해 주는 거잖아요? ’ 이런 거 있잖아요. 니들이 한 번 해보고 나서 다시 얘기를 하라고 설득을 해도 ‘아니, 저희 할 거 있구요, 형님 하실 거 있구요’ 이런 식으로. 아무튼 스트레스는 또 있더라고요. 죽: 그럼 그 세 명은 서버 구축하는 동안에 계속 네이버 아이디만 사서 광고만? 도: 아이디는 회사에서 사 주고, 네이버로 로그인을 해서, 그때는 OO쪽 카지노 광고를 해준 거죠. 죽: 네이버 아이디가 2만원에 얼마라고 했었죠? 도: 우리는 200개에 3만원 정도 주고 샀어요. 죽: 그걸 계속 사서 광고를 하는구나. O 명은 그런 일 하고, 선생님은 실제 서버 구축하고, 그럼 실장은 뭐해요? 기술을 이전해준다고 해야 하나? 도: 어차피 올린다고 해서 끝난 게 아니라, 카지노사이트를 검색했을 때 우선순위 세 개가 떠야 되잖아요? 네 번째 뜨면 아무 의미가 없다고 보거든요. 통합검색을 했을 때 1, 2, 3위로 떠야 무조건 되거든요. 예로 대박카지노라는 키워드로 검색해 본 결과다.

5개의 문서가 첫 화면에 뜬다. 여기서 상위 3번째 안에는 들어가야 한다는 이야기다. 도: 블로그에서 글을 올리면 네이버 검색엔진이 블로그 글을 여러가지로 비교판단해서 우선순위를 매길 거 아니에요? 그런데 1, 2, 3위를 잘 올라갈 수 있게끔 글을 만든단 말이예요. 그런 기술을 애들한테 전파해주고 그런 거죠. 죽: 한 번씩 제가 찾고 싶은 자료를 찾아서 검색해 들어갔는데 밑에 카지노 광고 뜨고 막. 도: 네. 광고 하는 애들이 잘 하는 거죠. 광고도 마구잡이로 올리는 것 같지만 메뉴얼이 있다. 메뉴얼을 전수해 주는 인간도 있고. 남의 돈 먹기 쉬운 게 아니다. 도: 이쪽 업계에서도 키워드 가지고 필사적으로 싸워요. 도: 특정 검색어를 조합하고 계산해서 1, 2, 3위 먹는 애들이 있거든요. 똑같은 일을 해도, 한 시간 동안 일을 해도,그런 애들이. 죽: 거기도 프로가 있네요. 도: (그렇게 해서 커미션)먹는 애들이 있고 못 먹는 애들이 있고. 거기서도 유명한 분이 있어요. 그 분은 이쪽 광고 업계에서도 좀 많이 존중을 해주죠. 다른 업체 사람인데 광고 키워드의 전설이죠. 그 양반이 광고를 올리면 무조건 일등 먹어요. 그래서 그 분 거 보고 와, 어떻게 올렸지, 어떻게 올렸는데 1위로 검색되지, 서로 연구하고 그러죠. 광고 커미션 제대로 먹으면 대박 돈 벌텐데.

426 답글 : 마지막 Angelica Marie, Aug 10 2017 09:09 AM. 9 답글 : Last by netas369, Aug 06 2017 03:01 PM. 17 답글 : Last ryry, Jun 29 2017 12:21 PM. 58 답글 : Last by ryry, Jun 29 2017 04:55 AM. 22 답글 : 마지막으로 BOedge, Jun 26 2017 07:34 AM. 11 답글 : Last by freestyle20, Jun 16 2017 05:53 AM. 29 답글 : 마지막으로 Kaarsh, May 30 2017 09:51 AM. 46 답글 : 마지막 by prthefaria, May 29 2017 08:21 PM. 26 답글 : 마지막 by merka, May 27 2017 07:18 PM. 27 답글 : 마지막 pauloh, Apr 29 2017 12:27 PM.

33 답글 : marcotraders 작별, Apr 19 2017 04:43 AM. 7 개의 대답 : 마지막으로 shaileshm, Apr 16 2017 11:14 AM. 9 답글 : Last by raydioturner, Apr 02 2017 07:46 AM. 바이너리 옵션 방법 15 분. 15 분 이진 옵션 방법은 온라인 거래의 유명한 방법이되었습니다. 그것의 인기 때문에, 거의 모든 플랫폼이이 방법을 제공합니다. 무슨 15 분 이진 옵션 방법은 무엇입니까? 15 분 바이너리 옵션 방법은 일반적인 바이너리 옵션 거래와 비슷하지만 만료 시간은 15 분으로 제한됩니다. 이것은 상인이 단기간에 높은 이익을 내고, 수많은 다른 거래를 계속할 수있게 해줍니다. 그러나 이익이 높기 때문에 손실 확률도 높아집니다. 그래서 상인은이 방법을 사용할 때 많은 위험을 감수합니다. 다른 기능이있을 수 있지만 선택한 거래 플랫폼에 따라 다릅니다. 모든 사람이 사용하지만 복잡한 방법이므로 모든 사람에게 적합하지 않습니다.

다음 두 가지 요구 사항이 충족되는 경우에만 15 분 바이너리 옵션 방법을 사용해야합니다. 거래 경험 - 이것은 무역에서 손실을 초래할 수있는 가장 큰 요구 사항입니다. 이러한 작은 시간 틀에서 시장은 매우 휘발성이 있습니다. 또한 상인은 수익을 내기 위해 기본 추세와 반대되는 입장을 선택해야 할 수도 있습니다. 이를 위해 상인은 시장에서 작은 변화와 징후를 확인할 수 있어야합니다. 준비 - 두 번째 요구 사항은 상인이 완전히 무역을 할 준비가되어 있다는 것입니다. 그는 가격 움직임을 정확하게 예측하기 위해 필요한 모든 지식과 데이터를 가지고 있습니다. 가격 변동을 선택할 때 다음 요소를 고려해야합니다. 이진 옵션 브로커 - 실시간 시장을 따르는이 방법을 사용할 때는 신뢰할 수있는 브로커를 선택해야합니다. 짧은 시간에 시장은 단 몇 초 만에 변화 할 수 있습니다. 이익을 손실로 전환. 이와 같은 상황에서 플랫폼은 이러한 변경 사항을 추적 할 수있을만큼 빠르고 효율적이어야합니다. 기술 분석 - 이것은 특정 기간에 발생할 수있는 일을 인식 할 수 있도록하는 데 중요합니다. 건전한 결정을 내리기 위해서는 모든면을 포괄해야합니다.

MACD 표시기 - 가격이 얼마나 오랫동안 유지 될지 알려주는 유용한 도구입니다. 이 목적을위한 다른 도구가 있습니다. 3 가지 기본 분석 도구의 결과를 평가해야합니다. 경제 일정 - 가격 추이의 변화를 초래하는 주요 사건에 대한 통찰력을 제공 할 수 있습니다. 방법 M - Milos 15 분이진 이진 옵션 방법. 홈 메이드 전략 : 방법 "M"- 밀로스 15 분 방법. 경제 데이터는 금융 시장의 잘 알려진 이동 자입니다. 사실, 데이터는 시장의 큰 이동 자이자 데이터가 공개 될 때까지 대부분의 거래자가 거래하지 않는 엄청난 시장 변동성 원이 될 수 있습니다. Milos 방법 또는 방법 "M"은 거시 데이터를 거래하는 데 걸리며이 유형의 방법에 관심이있는 사람들을위한 좋은 기반을 제공합니다.

BinaryOptionsThatSuck. com 작가 Milos가 만든 "M"이라는 방법은 무엇입니까? 전략은 종종 다른 시장과 다른 시나리오에 적용됩니다. 다양한 전략에 익숙하다면 올바른 시장에 적합한 방법을 사용하고 평균 상인보다 훨씬 더 많은 이점을 얻을 수 있습니다.youtube.com 또한 시장 및 시장 동향을 분석하는 새롭고 흥미 진진한 방법을 배울 수있는 기회를 갖게됩니다. 내 거래 화면 앞에 많은 시간을 보낸 후에 이것이 효과적이라는 것을 알게되었습니다. 이 방법은 만료 15 분 동안 설계되었습니다. 나는이 방법을 테스트하여 15 분의 만료로 가격 움직임의 거동을 관찰하고 거시 경제적 자료 / 보도 자료에 초점을 맞추기를 원했다. 필자는 호주의 조용한 세션에서부터 아시아, 유럽 및 미국의 변동이 심한 시장에 이르기까지 모든 시장 및 모든 시장 조건에서이 방법을 테스트했습니다.

이 방법을 사용하는 방법? 방법 "M"은 매우 짧은 시간에 초점을 맞추는 방법입니다. 거래를 결정하기 위해 나는 일일 가격의 차트로 시작하여 시간별로 이동하면서 추세선을 사용합니다. 신호의 경우 15, 10 및 5 분의 촛대를 사용하십시오. 트렌드 라인은 기본 도구 중 하나이며 바이너리 옵션 거래자에게 가장 중요하고 효과적인 도구 중 하나입니다. 추세선을 결정하면 바이너리 옵션 거래자가 시장 심리를 파악하는 데 도움이됩니다. 나는 가장 낮은 곳에서 가장 높은 곳으로 트렌드 라인을 그렸다. 그런 다음 지지선과 저항선을 그립니다. 이 라인은 뉴스가 공개되면 거래를 결정하는 데 도움이됩니다. 트렌드, 지원 및 저항 라인이 생기면 MACD, Stochastic Oscillator 및 RSI (Relative Strength Index)와 같은 바이너리 옵션 표시기를 사용할 때입니다. 매크로 및 미시 경제 데이터를 게시하기 직전에 신호가 전달됩니다. 이 방법은 모든 통화 쌍에서 사용할 수 있으므로 매우 조심스럽게 거래하려면 어떤 쌍과 발표를 선택할 필요가 있습니다. 발표 전에 차트를 IDE(통합 개발 환경)란? 개념, 기능, 필요성 준비하고 매일 및 시간별 차트를 기반으로 초기 분석을 수행해야합니다.

과매도 인 시장 overbought인가? 지원 또는 저항에 가까운가요? 위쪽 / 아래쪽 / 옆쪽으로 움직입니다. 15 분 차트로 이동하면 기본 장기에 기반한 시장의 명확한 전망을 얻을 수 있습니다. 트렌드 데이터가 공개되기 바로 전에 신호에 대한 15 분 차트를 사용하여 기본 추세의 방향으로 거래를하십시오. 신호에는 지원, 저항, 추세 등의 확인, 탈주 또는 돌파구가 포함됩니다. 신호는 지표에 의해 확인되어야합니다. 신호가 발생하면 15 분의 만료 시간과 함께 브레이크 방향으로 위치를 입력하십시오. 데이터가 공개되면 시장 감정은 인더 머 트 (in-the-money) 거래를 통해 이루어질 것으로 예상됩니다. 왜이 방법은 빨 지 않습니다? 이 방법은 15 분의 유효 기간 만료로 뛰어난 수익성을 제공 할 수 있기 때문에 애매하지 않습니다.

왜 바이너리 옵션인가

통합 개발 환경(Integrated Development Environment, IDE)이란 공통된 개발자 툴을 하나의 그래픽 사용자 인터페이스(Graphical User Interface, GUI)로 결합하는 애플리케이션을 구축하기 위한 소프트웨어입니다. 일반적으로 IDE는 다음과 같은 요소로 구성되어 있습니다.

  • 소스 코드 편집기: 시각적 신호를 활용한 구문(Syntax) 강조와 같은 기능을 포함하여 소프트웨어 코드를 작성하도록 돕는 텍스트 편집기로서, 언어별 자동 완성 기능과 코드 작성 중 버그 검사를 제공합니다.
  • 로컬 빌드 자동화: 컴퓨터 소스 코드를 바이너리 코드로 컴파일링하고, 바이너리 코드를 패키징하고 자동화 테스트를 실행하는 등 간편하고 반복 가능한 태스크를 개발자가 사용하는 소프트웨어의 로컬 빌드를 생성할 때 자동화해주는 유틸리티입니다.
  • 디버거: 원본 코드에 있는 버그 위치를 그래픽으로 표시할 수 있는 다른 프로그램을 테스트하는 프로그램입니다.

개발자들이 IDE를 사용하는 이유

IDE를 사용하면 설정 프로세스의 일환으로 여러 유틸리티를 수동으로 설정하고 통합할 필요가 없으므로 개발자들이 새로운 애플리케이션 프로그래밍을 신속하게 시작할 수 있습니다. 개발자들은 각각의 유틸리티가 동일한 워크벤치에 나타날 때 서로 다른 툴을 사용하는 방법을 개별적으로 학습하느라 시간을 허비하지 않아도 됩니다. 특히 새로운 개발자가 온보딩할 때 IDE를 사용하여 팀의 표준 툴 및 워크플로우를 익힐 수 있어 유용합니다. 사실상 IDE의 기능 대부분은 전체 문자열을 입력하지 않아도 되는 지능형 코드 완성 및 자동화된 코드 생성과 같이 시간 절감을 위한 기능입니다.

다른 일반적인 IDE 기능들은 개발자들이 워크플로우를 체계화하고 문제를 해결하도록 돕기 위한 기능입니다. IDE는 코드가 작성된 대로 구문 분석하여 인적 오류로 인한 버그를 실시간으로 식별할 수 있습니다. 유틸리티가 단일 GUI로 표현되기 때문에 개발자들은 애플리케이션 간에 전환할 필요 없이 동작을 실행할 수 있습니다. 구문 강조 또한 대부분의 IDE에서 공통된 기능으로, 시각적 신호를 사용하여 텍스트 편집기에서 문법을 구별합니다. 일부 IDE는 추가적으로 클래스 및 개체 브라우저는 물론 특정 언어에 대한 클래스 계층 다이어그램을 포함합니다.

IDE를 포함하지 않고 애플리케이션을 개발하거나, 각 개발자들이 Vim 또는 Emacs같은 경량 텍스트 편집기를 사용하여 다양한 유틸리티를 수동으로 통합함으로써 필수적으로 각자의 IDE를 구축할 수도 있습니다. 일부 개발자들의 경우 이러한 접근 방식을 통해 고도의 커스터마이제이션 및 제어 능력의 이점을 실현합니다. 그러나 엔터프라이즈 환경에서는 현대적인 IDE의 시간 절감, 환경 표준화 및 자동화 기능이 다른 고려 사항보다 우선시 됩니다.

오늘날 대부분의 엔터프라이즈 개발 팀은 특정 활용 사례에 최적화되도록 사전 설정된 IDE를 선택하므로, IDE 도입 여부가 아니라 어떤 IDE를 채택할 것인지가 중요합니다.

주요 IDE 유형

IDE의 다양한 기술 및 비즈니스 활용 IDE(통합 개발 환경)란? 개념, 기능, 필요성 사례가 있으며, 이는 마찬가지로 독점 및 오픈소스 IDE 옵션도 많다는 의미입니다. 일반적으로 IDE 간의 가장 중요한 차별화 특징은 다음과 같습니다.

  • 지원되는 언어의 수: 일부 IDE는 하나의 언어만 지원하여 특정 프로그래밍 패러다임에 더욱 적합합니다. 그 예인 IntelliJ는 주로 Java IDE로 알려져 있습니다. 다른 IDE는 Java, XML, Python 등을 지원하는 Eclipse IDE와 같이 한 번에 광범위한 언어를 지원합니다.
  • 지원되는 운영 체제(OS): 개발자의 운영 체제에 따라 실행 가능한 IDE가 제한되며(클라우드 기반 IDE인 경우 제외), 개발 중인 애플리케이션이 특정 운영 체제(Android 또는 iOS)를 사용하는 최종 사용자를 위한 애플리케이션인 경우 추가적인 제약을 받습니다.
  • 자동화 기능: 대부분의 IDE가 텍스트 편집기, 빌드 자동화 및 디버거라는 3가지 주요 기능을 포함하지만, 많은 IDE는 리팩토링, 코드 검색 및 지속적인 통합 및 지속적인 배포(CI/CD) 툴과 같은 추가 기능도 지원합니다.
  • 시스템 성능에 미치는 영향: 개발자들이 메모리 사용량이 많은 다른 애플리케이션을 동시에 실행하고자 하는 경우 IDE의 메모리 공간이 중요할 수 있습니다.
  • 플러그인 및 확장 기능: 일부 IDE는 개발자들의 요구 사항 및 선호 사항에 맞춰 워크플로우를 커스터마이징하는 기능을 포함합니다.

모바일 개발 IDE

거의 모든 업계는 스마트폰 및 태블릿용으로 설계된 애플리케이션의 치솟는 인기에 영향을 받았고, 많은 기업들은 전통적인 웹 애플리케이션과 더불어 모바일 애플리케이션을 개발하게 되었습니다. 모바일 애플리케이션 개발의 주요 요소 중 하나는 플랫폼 선택입니다. 예를 들어, 새로운 애플리케이션이 iOS, Android 및 웹 페이지용으로 개발되는 경우에는 여러 운영 체제에 대한 교차 플랫폼 지원을 제공하는 IDE를 활용하여 시작하는 것이 가장 적합할 수 있습니다.

클라우드 IDE

클라우드 기반 서비스로서의 소프트웨어(Software-as-a-Service, SaaS)로 제공되는 IDE는 로컬 개발 환경과 달리 여러 특별한 이점을 제공합니다. 그중 하나는 모든 SaaS 서비스와 마찬가지로 소프트웨어를 다운로드하고 로컬 환경 및 종속 요소를 설정할 필요가 없으므로 개발자들이 프로젝트를 신속하게 시작할 수 있다는 점입니다. 이는 또한 팀원들의 환경 전반에 표준화 수준을 제공하므로 일부 시스템에서만 작동하는 문제를 완화할 수 있습니다. 또한 개발자 환경은 중앙 집중식으로 관리되기 때문에 어떤 코드도 개별 개발자들의 컴퓨터에 상주하지 않으므로 지적 재산 및 보안 문제를 IDE(통합 개발 환경)란? 개념, 기능, 필요성 해결해 줍니다.

프로세스가 로컬 시스템에 미치는 영향 또한 다양합니다. 빌드 실행 및 제품군 테스팅 같은 프로세스는 일반적으로 컴퓨팅 집약적인 워크로드이므로 프로세스를 실행하는 동안에는 워크스테이션 사용이 중단될 수 있습니다. SaaS IDE는 로컬 시스템의 컴퓨팅 리소스를 독점하지 않고도 장기간 실행되는 작업을 디스패치할 수 있습니다. 또한 클라우드 IDE는 일반적으로 플랫폼에 국한되지 않아 다양한 클라우드 벤더에 대한 연결을 지원합니다.

GraalVM Enterprise란?

GraalVM Enterprise는 대체 JIT(Just-In-Time) 컴파일러를 사용하여 Java 및 JVM 기반 애플리케이션의 성능을 가속화할 수 있는 고성능 JDK입니다. 이 솔루션은 애플리케이션 대기 시간을 줄이고 가비지 수집 시간을 단축하여 최대 처리량을 개선하며 연중무휴 Oracle 지원을 제공합니다.

또한 Java 바이트코드 AOT(Ahead Of Time)를 컴파일하고 거의 즉시 시작되며 메모리 리소스를 거의 사용하지 않는 일부 애플리케이션에 대해 기본 실행 파일을 생성하는 네이티브 이미지 유틸리티가 있습니다.

GraalVM(Graal 컴파일러, Truffle 및 Oracle Java Development Kit[JDK])

GraalVM은 2011년에 여러 프로그래밍 언어를 고성능으로 실행할 수 있는 런타임 플랫폼을 만들기 위한 Oracle Labs의 연구 프로젝트로 시작되었습니다. GraalVM 프로젝트의 핵심은 고급 최적화 GraalVM 컴파일러로, JVM(Java Virtual Machine)을 위한 JIT(Just-In-Time) 컴파일러로 사용되거나 GraalVM 네이티브 이미지 기능으로 Java 바이트코드 Ahead Of Time을 네이티브 기계어 코드에 컴파일하는 데 사용됩니다. GraalVM의 Truffle 언어 구현 프레임워크는 GraalVM 컴파일러와 함께 작동하여 JVM에서 JavaScript, Python, Ruby 및 기타 지원 언어를 뛰어난 성능으로 실행합니다.

JIT 모드에서 GraalVM을 사용할 때 JVM은 GraalVM Enterprise JI 컴파일러를 사용하여 애플리케이션이 실행 중인 동안 Java 바이트코드에서 플랫폼별 기계어 코드를 만듭니다. 컴파일은 자주 실행되는 코드에 추가 최적화를 적용하여 프로그램 실행 중에 점진적으로 수행됩니다. 이러한 접근 방식은 적극적인 인라인 처리, 부분 이스케이프 분석 및 기타 고급 최적화 덕분에 핫스폿 코드를 매우 빠르게 실행되도록 보장합니다. 일부 최적화는 가비지 수집의 로드를 낮춰주는 개체 할당을 줄입니다. 그러면 장기 실행 애플리케이션의 최대 성능이 향상됩니다.

또한 GraalVM 네이티브 이미지 유틸리티는 Java 바이트코드를 컴파일하여 네이티브 기계어 실행 파일 Ahead Of Time(즉, 구축 시)을 생성할 수 있습니다. 이러한 실행 파일은 거의 즉시 시작되며 JVM에서 실행되는 동일한 Java 애플리케이션에서 사용하는 메모리의 일부만 사용합니다. 네이티브 실행 파일은 애플리케이션에 필요한 클래스, 메서드 및 종속 라이브러리만 포함하므로 컴팩트합니다.

또한 GraalVM은 Truffle 언어 구현 프레임워크를 통해 다중 언어 상호 운용성을 지원합니다. Truffle을 사용하면 지원 언어로 작성된 프로그램에서 다중 언어 라이브러리를 사용할 수 있습니다. 예를 들어 JavaScript 프로그램은 Ruby 메서드를 호출하고 복사본을 만들지 않은 채 값을 공유할 수 있습니다. JVM에서 실행되는 Truffle은 GraalVM 컴파일러와 협력하여 Java와 마찬가지로 최적의 성능을 위해 지원 언어를 네이티브 기계어 코드로 컴파일합니다.

GraalVM Enterprise

GraalVM Enterprise Edition의 컴파일러에는 성능 및 리소스 사용을 크게 개선하는 추가 최적화 알고리즘이 많이 포함되어 있습니다. GraalVM Enterprise Edition의 네이티브 이미지 기능은 G1 가비지 수집기, 압축 포인터 및 컴파일러가 보다 효율적인 코드를 생성하는 데 도움이 되는 프로필 기반 최적화를 비롯한 다양한 고급 기능을 지원합니다.

GraalVM Enterprise는 추가 비용 없이 Java SE Subscription에 포함되어 있습니다. 보다 예측 가능한 성능과 안정성을 위해 보안 수정과 중요 경로 업데이트에 대한 액세스를 비롯하여 Oracle의 연중무휴 지원이 포함됩니다. Java를 클라우드로 마이그레이션할 수 있도록 IDE(통합 개발 환경)란? 개념, 기능, 필요성 GraalVM Enterprise는 OCI(Oracle Cloud Infrastructure)에서 무료로 사용할 수 있습니다.

GraalVM을 사용하는 이유

GraalVM Enterprise를 사용하면 개발자가 클라우드 또는 하이브리드 환경에 대해 향상된 격리 및 민첩성을 통해 보다 효율적인 코드를 빌드할 수 있습니다. 오늘날 점점 더 많은 기업이 GraalVM을 사용하는 몇 가지 이유는 다음과 같습니다.

  • 변화하는 시장에 빠르게 적응합니다. 오늘날 비즈니스 애플리케이션은 증가하는 데이터 볼륨을 처리하고 고객 요청에 신속하게 대응해야 합니다. Java 애플리케이션은 속도에 발맞춰 발전을 거듭할 수 있으므로 개발자는 애플리케이션 성능 효율성을 높이는 동시에 IT 비용을 절감할 수 있습니다.
  • 클라우드 네이티브에 마이크로서비스와 컨테이너를 사용하는 최신Java 애플리케이션을 구축할 수 있습니다. 마이크로서비스는 단일 기능을 수행하는 소규모 독립 미니 애플리케이션입니다. 비즈니스 애플리케이션은 일반적으로 수백 개의 서비스를 활용하며 각 서비스를 신속하게 시작해야 대기 시간을 최소화하고 클라우드 사용비용을 절감할 수 있습니다. 즉, 사용하는 부분에 대해서만 비용을 지불합니다.
  • 서로 다른 프로그래밍 언어가 단일 JVM에서 함께 작동할 수 있는 에코시스템을 조성하여 개발자 생산성을 높입니다.

GraalVM Enterprise 사용 사례

GraalVM 혁신은 Java 애플리케이션이 보다 빠른 성능을 통해 오늘날의 컴퓨팅 요구를 충족하고 고객의 요구 사항에 신속하게 대응할 수 있도록 지원합니다. 고급 최적화 프로그램은 최대 처리량을 향상시킵니다. 또한 개체 할당을 최소화하여 메모리 사용을 최적화함으로써 가비지 수집을 수행하는 데 소요되는 시간을 단축합니다. JIT 모드에서 실행되는 GraalVM Enterprise는 성능을 최대 50%까지 향상시킬 수 있습니다. 그러면 메모리가 더 빨리 비워지므로 동일한 인프라에서 다른 워크로드를 실행하고 IT 비용을 절감할 수 있습니다.

클라우드 네이티브 애플리케이션 구축

GraalVM Enterprise의 네이티브 이미지 유틸리티는 Java 애플리케이션 Ahead Of Time을 기계 바이너리에 컴파일합니다. 네이티브 실행 파일은 JVM에서 실행되는 것보다 거의 100배 더 빠르게 시작되며 최대 5배나 적은 메모리를 사용합니다.

Graalvm 엔터프라이즈 네이티브

그림 1 – 네이티브 실행 파일은 거의 즉시 시작되며 Go 또는 Java HotSpot에 비해 메모리를 거의 사용하지 않습니다.

조직이 워크로드를 클라우드로 전환하고 시스템 리소스 사용 비용을 시간당으로 지불함에 따라 GraalVM은 운영 비용 절감 효과를 실현할 수 있도록 지원합니다. 이러한 결과로 인해 GraalVM에서 생성한 네이티브 실행 파일은 Helidon, Micronaut, Quarkus, Spring Boot와 같은 주요 마이크로서비스 프레임워크에서 지원되는 영역인 마이크로서비스 배포에 적합합니다.

다중 언어 프로그램 개발 및 생산성 향상

성능이 뛰어난 JVM에서 Java와 JavaScript와 같은 기타 언어를 실행할 수 있습니다. Oracle NetSuite의 SuiteScript는 최종 사용자가 NetSuite에서 실행되는 애플리케이션을 사용자 지정할 수 있는 확장 언어입니다. GraalVM Enterprise를 사용하면 NetSuite를 통해 JVM에서 실행되는 SuiteScript보다 4배 더 빠르게 실행되는 기계어 코드에 JavaScript를 컴파일 할 수 있는 Truffle 기반 JavaScript 런타임을 포함할 수 있습니다.

애플리케이션 성능 및 효율성을 개선하는 방법

GraalVM Enterprise에는 Java 애플리케이션 성능을 가속화하기 위해 프로그램에서 JIT를 실행하는 동안 기계어 코드를 생성하는 고급 최적화 컴파일러가 포함되어 있습니다. Ahead Of Time을 컴파일하면 네이티브 이미지는 빠르게 시작되고 메모리를 적게 사용하므로 클라우드 네이티브 배포에 적합합니다. 다중 언어 프로그램을 지원하여 개발자가 작성된 언어에 관계없이 비즈니스 문제를 해결하는 데 필요한 최적의 라이브러리를 사용할 수 있도록 하여 생산성을 높입니다.

왜 하스켈인가?

이 글은 하스켈에 대해 잘 모르는 프로그래머를 대상으로 되도록 쉽게 썼습니다. 복잡한 개념을 거칠게 단순화할 수도 있고, 이론적으로 엄밀하지 않을 수도 있습니다.

하스켈을 배우면 뭐가 좋을까요? 하스켈이라는 도구의 장점으로 꼽히는 것들을 훑어보겠습니다. 이런 것들이 있습니다.

  • 성능
  • 동시성, 병렬 처리
  • 정확성
  • 조합성
  • 디버깅, 테스팅, 프로파일링
  • 커뮤니티와 생태계

하스켈은 일반적으로 동적 언어들과 비슷한 양의 코드로 같은 일을 할 수 있으면서도 결과물의 성능이 훨씬 뛰어납니다. 이것은 하스켈이 네이티브 코드 컴파일을 하기 때문이기도 하고, 하스켈 대표 컴파일러인 GHC에 오랜 세월 동안 각종 최적화 기법이 누적 적용되어 있기 때문이기도 하고, 언어에 깔려 있는 근본적인 가정을 활용할 수 있는 덕분이기도 합니다.

예를 들어 동적 언어인 파이선에서

로 치환하는 것이 가능할까요?

세부적인 차이는 있지만 대체로 불가능합니다. object.a = 1 은 object 라는 객체의 a 라는 애트리뷰트가 1이라는 뜻인 것 같지만, 실제로는 object 의 setattr 함수에 "a" 와 1 이라는 인자를 넘기는 것이고, setattr 은 오버라이드 되어 있을 수 있기 때문에 무슨 일이 일어날지는 정확히 알 수 없습니다. print(object.a) 또한 object 의 getattr 함수에 "a" 라는 인자를 넘기는 것입니다. 물론 대부분의 경우에는 메모리의 지정된 장소에 1을 읽고 쓰는 것뿐이기 때문에 JIT 컴파일러를 이용해 오버헤드를 크게 줄일 수 있지만, 항상 가능한 일은 아닙니다.

로 컴파일러가 치환하는 것이 매우 쉽습니다. 언어 설계상으로 그런 보장이 있기 때문입니다.

하스켈은 일반적인 컴파일러 최적화 기법인 상수 접기(constant folding)를 매우 광범위하게 적용할 수 있습니다. 또 자료의 타입이 언제나 확실하고, 자료가 기본적으로 불변이며 자료의 기본적인 구조가 컴파일 시간에 고정되기 때문에 컴파일러가 적극적으로 언박스(unbox)를 할 수 있습니다. 언박스는 컴파일 시점에 코드를 분석하여 포인터 연산이 필요 없는 값을 발견하면 포인터로 가리키던 (간접) 부분을 실제 값으로 치환하여 (직접) 컴파일하는 것으로서, 데이터가 버스를 오가느라 생기는 오버헤드와 캐시 미스를 대폭 줄입니다.

하스켈의 기본 자료형인 느긋한 리스트(lazy list)는 다른 언어에 나중에 확산된 이터레이터와 비슷한 개념으로, 같은 자료형이 반복되는 구조를 효과적으로 처리할 수 있습니다. 또 오늘날의 하스켈 컴파일러는 바이트열과 같이 일정한 규격의 데이터가 지속적으로 입력되고 출력되는 스트림(stream) 계열의 자료형에 대해서, 스트림을 가공하는 여러 종류의 함수를 이어붙일 경우 이것을 하나의 함수로 컴파일하여 불필요한 메모리 복사 등의 오버헤드를 줄이고 성능을 향상시키는 스트림 퓨전(stream IDE(통합 개발 환경)란? 개념, 기능, 필요성 fusion) 최적화를 내장하고 있습니다.

동시성, 병렬 처리

하스켈의 동시성은 어처구니가 없습니다.

동시성이 시대의 대세가 되었다는 데에는 이견이 없을 것입니다. 프로세서의 클럭 스피드는 한계에 달했고, 컴퓨터는 코어를 늘리는 방향으로 발달하기 시작했고, GPU를 GPGPU로 활용하고, 머신을 늘려 클러스터를 만듭니다.

하스켈은 병렬 입출력 관리자를 기반으로 언어적 특성을 십분 활용하여 놀라운 동시성과 병렬성을 보여줍니다. 하스켈의 동시성은 세 가지 층위로 나누어서 볼 수 있습니다.

스파크는 처리할 수 있는 작업의 최소 단위로 간주할 수 있습니다. 다음과 같은 하스켈 코드에서

f x 와 g y 를 봅시다. f 와 g 는 순함수입니다. 이것은 하스켈의 타입 시스템에 의해 보장됩니다. f x 와 g y 가 + 의 인자로 쓰이고 있기 때문입니다.

순함수는 인자만 같으면 반환값도 언제나 같은 함수입니다. 다시 말해서 f x 와 g y 중 어느 것을 먼저 계산하든 f x + g y 의 값은 똑같을 것입니다. 그러면 계산 순서도 상관 없고 아무 때나 계산해도 되는데 어쨌든 계산을 하기는 해야 하는 두 개의 작업이 있는 것입니다. 이것들이 바로 스파크가 될 수 있는 작업들입니다.

이 프로그램은 단순 무식하게 하나의 코어에서 f x 를 먼저 계산하고 그 후에 g x 를 계산하고 그 후에 두 값을 더하는 방식으로 동작하지 않아도 될 것입니다. 이론상으로는 f x 와 g y 를 각각 다른 프로세서 코어에 할당해서 계산을 시키고 결과를 더하는 방식으로 동작하면 병렬 처리로 훨씬 더 빠르게 작업이 끝나겠죠. 하지만 이런 최적화는

  1. 일반적으로 계산을 하기 위한 별도의 스레드를 명시적으로 생성하고, 그 스레드의 종결을 기다려서 값을 얻기 위한 여러 줄의 코드와 절차를 요합니다.
  2. 게다가 이미 여러 스레드를 운용하고 있는 소프트웨어라면 계산을 위한 스레드를 따로 생성하는 것이 오히려 코드를 더 느리게 만들 수도 있습니다.
  3. 소프트웨어가 실행될 환경의 코어 수가 고정되어 있지 않다면 최적 코드도 결정할 수 없습니다.
  4. 이런 난국을 회피하기 위해 애플리케이션 수준에서 스레드 풀(thread pool)을 만들어 쓰기도 하지만, 프로젝트에 그런 게 없었다면 새로 도입하는 것도 상당한 비용이고, 처리량을 극대화할 수 있는 올바른 스레드 풀 운용도 쉽지 않은 과제입니다.
  5. 코드 실행 시점의 실제 상황에 따라, 별도의 스레드를 생성하는 오버헤드가 병렬화로 얻는 성능 이득보다 더 커서 안 하느니만 못할 수도 있습니다.

등의 문제를 안고 있기 때문에 현실적으로 잘 활용되지 못합니다. 반면 하스켈은 순함수와 액션이 타입 시스템으로 확고하게 분리되어 있는 언어이기 때문에, 간단한 코드 수정만으로도 순함수 계산을 효율적으로 병렬화할 수 있습니다.

par 함수는 좌측의 계산을 병렬화해도 된다는 “힌트”를 컴파일러에게 줍니다. pseq 함수는 좌측의 계산이 우측의 계산보다 먼저 일어나야 한다는 조건을 명시합니다. 컴파일된 코드는 f x 가 실행될 시점에서 실제로 어떻게 실행할 것인지를

  • 현재 사용할 수 있는 코어의 수
  • 실행중인 스레드의 수
  • 이 코드가 과연 병렬화하는 오버헤드를 감수할 만큼 계산량이 많을까?

등을 종합적으로 고려해 판단합니다. 또 몇 개의 코어를 활용할 것인지를 프로그램 실행 시점에 결정할 수 있습니다.

하스켈 코드를 컴파일할 때 -threaded 옵션을 주면, 컴파일된 바이너리의 RTS(runtime system) 옵션으로 -N 을 줄 수 있게 됩니다. 이제 프로그램에 +RTS -N4 라는 옵션을 주면 이 프로그램은 4코어를 활용하는 프로그램으로 병렬화됩니다. f x 를 별도의 스레드에서 계산할 것인지 등은 이러한 맥락을 바탕으로 최적 성능을 달성하는 방향으로 결정됩니다.

스파크보다 상위의 개념은 하스켈 스레드입니다. 하스켈 스레드는 일반적인 액션을 forkIO 함수에 넣어서 실행하면 생겨납니다.

하스켈은 요즘 다른 언어에서도 각광 받고 있는 “그린 스레드” 개념을 이미 오래 전부터 구현해 언어에 내장해 놓았습니다. 스레드 생성과 소멸의 오버헤드가 매우 적고, 모든 스레드 안에서 블러킹 시스템 콜을 쓸 수 있고, 이렇게 만든 블러킹 스레드들은 자동으로 epoll 이나 kqueue 등으로 번역되어 고성능으로 동작합니다. node.js가 초기에 넌블러킹 동시성을 내세우며 급부상했는데, 하스켈 스레드는 똑같은 개념을 콜백 지옥 없이 일반적인 코드를 그대로 유지하며 쓰게 해줍니다. RTS에 여러 개의 코어가 주어지면 각 스레드가 코어를 적절히 점유하거나 밀려나는 과정도 당연히 자동으로 됩니다.

(한편 forkIO 대신 forkOS 를 쓰면 하스켈 스레드가 아니라 OS 스레드가 생겨나고, 하스켈 스레드와 똑같이 사용할 수 있지만, 하스켈 스레드만 써도 멀티코어 활용을 알아서 해 주기 때문에 대체로 굳이 쓸 이유가 없습니다.)

여러 스레드 간의 통신도 쉽고 간편합니다. MVar 는 “값이 들어 있거나 혹은 비어 있는 상자”와 비슷한 개념으로, 락(lock)과 값을 합쳐 놓은 것으로 볼 수 있습니다. Chan 을 사용하면 프로세스와 프로세스가 파이프를 통해 표준입출력을 주고 받는 것보다도 더 쉽게 스레드에서 스레드로 자료를 넘길 수 있습니다. 그리고 그 끝판왕은…

소프트웨어 트랜잭셔널 메모리

데이터베이스는 트랜잭션(쪼갤 수 없고 재시도 가능한 작업 단위)의 개념을 가지고 있기 때문에 여러 클라이언트가 접속해서 읽고 쓰고 난리를 쳐도 됩니다. 메모리에는 트랜잭션의 개념이 없기 때문에 여러 스레드가 동시에 메모리의 같은 영역에 접근하여 읽고 쓰기를 하게 내버려 두면 데이터가 반드시 패망하게 되고, 패망을 막기 위해 뮤텍스니 세마포어니 쓰다가 실수하면 프로그램은 수렁에 빠지고 프로그래머의 뇌가 패망하게 됩니다.

그러므로 메모리에도 트랜잭션의 개념을 갖자는 것이 하스켈의 소프트웨어 트랜잭셔널 메모리입니다.

하스켈은 타입 시스템 덕분에 트랜잭션과 원자성을 정확하게 기술할 수 있습니다. STM의 atomically 함수는 STM 액션을 받아서 그것을 IO 액션으로 바꿔주는 함수입니다. 그러면 하나 이상의 STM 액션이 하나의 트랜잭션이 되어 원자적으로(atomically, 즉 쪼갤 수 없게) 실행됩니다. STM 타입이 따로 있으므로 트랜잭션 안에 IO 액션을 집어넣을 수 없으며, 반대로 실행 순서와 횟수에 영향을 받지 않는 순함수들은 자유롭게 트랜잭션에 포함할 수 있게 됩니다. 또 트랜잭션이기 때문에 실패했을 경우의 조치 역시 데이터베이스 트랜잭션과 마찬가지로 정확하게 기술할 수 있습니다.

STM은 데이터베이스만큼 안전하고, 데이터베이스만큼 편하고, 데이터베이스보다 훨씬 빠르고, 프로그래밍 가능한 기억 공간을 프로그램 내부에 가지게 해줍니다. 동시성 프로그래밍에서 데드락과 레이스 컨디션 등의 골칫거리를 해결하는 데에 가장 효과적이고 고도화된 방법이라고 할 수 있습니다. 트랜잭셔널 메모리가 어찌나 좋은지 최근 인텔 칩에는 하드웨어 트랜잭셔널 메모리(HTM) 기능이 추가되었으며 동시성 데이터 핸들링의 미래로 각광을 받고 있습니다.

소프트웨어의 정확성(correctness)을 기할 수 있게 해 주는 하스켈의 특징으로 세 가지를 꼽을 수 있습니다.

  • 타입 시스템
  • 기본적 불변성과 통제된 가변성
  • 알고리즘과 입출력의 분리

타입 시스템

하스켈의 타입 시스템은 버그를 피하며 프로그래머의 의도대로 정확하게 동작하는 소프트웨어를 작성할 수 있도록 상당히 높은 수준의 보장을 제공합니다. 예를 들어, 다음과 같은 파이선 코드가 있으면,

f 라는 함수가 있고 이 함수는 인자 세 개를 받는데, 인자 이름이 각각 a , b , c 입니다. a 가 b 로 시작하면, 즉 a 의 앞부분이 b 와 일치하면, c 에다가 a 를 추가합니다. a 는 아마도 문자열일 겁니다. 왜냐면 a.startswith 를 호출하고 있으니까. b 도 문자열일 겁니다. a 가 b 로 시작하는지를 묻고 있으므로. c 는 리스트일 것 같습니다. append 메소드를 보니. 그리고 이 리스트에 문자열을 추가한다는 점으로 보아 아마도 문자열의 리스트일 겁니다. 보통 사람을 리스트에 추가한다고 하면 그 리스트는 사람의 리스트죠.

비슷한 하스켈 코드를 보겠습니다.

마찬가지로 f 는 인자 세 개를 받는 함수입니다. b 가 a 의 접두사이면, 즉 a 의 앞부분이 b 와 일치하면 c 에다가 a 를 추가해서 반환하고 그렇지 않으면 그냥 c 를 반환합니다. 여기서 우리가 알 수 있는 것은

  • a 는 바이트열( ByteString )입니다. 반드시.
  • b 도 바이트열입니다. 무조건 그렇습니다.
  • c 는 바이트열의 리스트입니다.

예를 들어 여러분이 저 f 라는 함수의 작성자라고 해봅시다. 그러면 누군가 파이선에서 f(1, 2, 3) 같은 코드를 써놓았다면 여러분은 즉시 그것이 잘못된 코드라는 것을 알 수 있을 것입니다. 문자열과 문자열과 문자열의 리스트를 받아야 될 함수가 숫자를 인자로 받고 있다니? 하지만 파이선 인터프리터는 그 f(1, 2, 3) 이라는 코드가 실제로 실행되기 전까지는 뭐가 잘못되었는지 알지 못합니다. 정확히 말하면 a.startswith(b) 부분이 실행되기 전까지는 오류도 발생하지 않고 아무것도 알 수 없습니다. 그러면 “사람은 이 코드가 잘못되었다는 것을 보자마자 알 수 있는데, 기계는 그것을 알 수 없는” 상황이 됩니다. 이것은 영 바람직하지 못합니다. 사람이 미처 잡지 못하는 IDE(통합 개발 환경)란? 개념, 기능, 필요성 오류라도 컴파일러/인터프리터가 잡아줄 수 있어야 합니다. 그런데 거꾸로죠.

(실은 a 가 문자열이 아니어도 이 파이선 코드는 오류를 일으키지 않을 수도 있습니다. 파이선은 덕 타이핑(duck typing)을 쓰기 때문에, a 가 객체고 startswith 라는 애트리뷰트를 가지고 있으며 그 애트리뷰트가 __call__ 을 구현하고 있다면 a 가 문자열이 아닌데도 오류 없이 지나갈 수도 있을 것입니다. 그리고 바로 이것 때문에 구현은 a.startswith(b) 만 가지고는 a 와 b 의 정체에 대해서 확신을 가질 수 없는 것이죠.)

반면 하스켈에서는 f 1 2 3 같은 코드를 보자마자 이것이 잘못된 코드임을 감지할 수 있습니다. 왜냐하면 a 는 하늘이 두쪽나도 반드시 무조건 기필코 바이트열이기 때문입니다. a `isPrefixOf` b 라는 코드가 있으니까요. isPrefixOf 는 바이트열 두 개를 받는 함수이기 때문에, 그것의 인자로 사용되었다면 반드시 바이트열인 것입니다. 마찬가지로 c 의 타입도 정확하게 알 수 있는데, a : c 를 보면 리스트 연산자( : )가 사용되었죠. 이 연산자는 원소와 리스트를 인자로 받아서 원소를 리스트 앞에 추가한 리스트를 반환하는 연산자입니다. 따라서 c 는 리스트이고, 이 리스트의 새 원소가 될 a 가 바이트열이니 바이트열의 리스트겠죠. f 1 2 3 은 컴파일 오류입니다.

컴파일 시간에 오류를 잡아낸다는 것은 실무적으로 매우 중요한 이점인데, 버그가 발견되지 않은 채로 코드가 프로덕션까지 나가버린 뒤에 버그가 터져서 서비스가 중단되거나 오작동하는 대재앙을 줄여주기 때문입니다.

다른 함수형 프로그래밍 언어 가운데에도 엄격한 타입 시스템을 적용하는 경우는 많지만 이로 인해 현실적 불편을 겪습니다. 예를 들면 서로 다른 정수형·실수형의 사칙연산에도 타입 구분을 위해 모두 별도의 연산자를 할당해야 하거나 직렬화(serialization)를 하기 위해 모든 타입에 대해 별도의 함수를 만들 수밖에 없습니다. 이런 현실적 불편이 코드를 쪼개고 재사용하는 과정을 방해하며, 다른 언어를 쓰다 온 프로그래머들은 답답함을 이기지 못하고 동적 타이핑의 세계로 돌아가고 싶다고 울부짖게 됩니다. 하스켈은 타입클래스를 이용해 정확성과 유연성 양쪽을 해결했으며 공통점이 있는 여러 타입에 대한 공통의 인터페이스를 가질 수 있게 했습니다. 타입클래스 개념은 하스켈의 대표적인 성공으로 꼽힙니다.

기본적 불변성과 통제된 가변성

일반적인 프로그래밍 언어에서는 변수를 씁니다. 변수는 이름 그대로 변하는 값이므로 시시각각 변합니다. 모든 변수가 변하고 변수의 변화는 프로그램의 실행 결과에 큰 영향을 줍니다. 프로그램이 문제를 일으키거나 예상치 못한 동작을 하면 그 상황을 재현하고 원인을 파악하는 데에 가장 핵심적인 관건은 변수입니다. 하스켈의 자료는 기본적으로 불변입니다. (immutability by default) 이것만으로도 이미 많은 문제가 사라집니다.

값이 변화해야 하는 경우는 어떻게 기술할까요? 가변 자료를 아예 만들 수 없다면 심각한 문제가 있을 것입니다. 어떤 자료 구조는 애초에 구현이 불가능해질 것이고, 어떤 자료 구조는 구현하더라도 성능 손실을 피할 수 없겠죠. 하스켈에서 가변 자료를 쓰는 대표적인 방법은 ST 액션 타입을 사용하는 것입니다. 모든 ST 액션은 STRef 나 STUArray 등의 가변 자료형을 복사 없이 (in-place) 변화시킬 수 있습니다. ST 액션은 다른 종류의 액션과 함부로 섞어 쓸 수 없으며 아무 함수에서나 실행할 수도 없으므로 다른 자료의 불변성을 해치지 않습니다. IORef , STRef , MVar , TVar 등의 모든 가변 자료형은 모두 특정한 액션 타입 안에서 정확한 타입을 사용해서만 읽고 쓸 수 있게 되어 있어서 안전성이 보장됩니다.

알고리즘과 입출력의 분리

일반적으로 프로그래밍에서는 눈에 핏발을 세우고 코드를 한 줄씩 추적해야 하는 일이 꽤 자주 생깁니다. 다음 코드에서

print 한 결과는 매번 다를 수도 있습니다. 따라서 프로그램이 문제를 일으키거나 예상치 못한 동작을 해도 그 상황을 재현하고 원인을 파악하기가 어렵습니다. 많은 프로그래머들이 문제가 되는 것처럼 보이는 모든 줄에 print 를 삽입하거나, 디버거로 한 줄씩 실행하면서 로컬 변수를 하나씩 뜯어보며 버그와 씨름하는 고통의 시간을 보냅니다.

함수의 인자가 같으면 반환값도 같다

라는 성질이 있어서 이런 고뇌를 하지 않아도 됩니다. 이것이 참조 투명성입니다. 인자가 같으면 반환값도 같다는 성질이 보장되는 함수를 참조 투명한 함수 또는 순함수(pure function)라고 부르며, 그래서 하스켈을 순함수형(purely functional) 언어라고 부르기도 합니다.

참조 투명성이 언어 차원에서 강제된다는 것은 소프트웨어 개발이 복잡해질수록 엄청나게 큰 이득이 됩니다. 예를 들어,

위 코드는 2차원 좌표 두 개를 받아서 좌표 사이의 거리를 반환하는 평범한 함수입니다. 이 코드는 인자가 같으면 반환값도 같을 것이며 프로그램의 그 어디에서 사용하든 문제가 없습니다. 앞서 말한 참조 투명한 함수 또는 순함수입니다. 문제는 순함수에

이렇게 코드를 추가해도 아무런 오류가 발생하지 않는다는 것입니다. 분명히 두 값을 받아서 값 하나를 반환하는 것 외에는 아무것도 하지 않는 순함수였는데, 누군가 거기에 코드를 추가하거나 변경해서 참조 투명성이 깨지는 일이 일어나도 다른 사람들은 알 수가 없고 심지어 그 변경을 가한 프로그래머 본인도 모르고 넘어갈 수도 있습니다. 순함수가 불순함수로 바뀌는 일이 암시적(implicit)으로 일어나는 것입니다. 이제 누군가 아무 생각 없이 두 좌표 사이의 거리를 구하기 위해 distance 함수를 호출했다가 핵미사일이 발사되고 문명이 초토화되겠죠.

반면 하스켈에서는 순함수와 불순함수의 구분이 명시적(explicit)이기 때문에 이런 걱정이 없습니다. 문자를 출력하거나, 파일을 읽거나, 데이터베이스에서 행을 가져오거나, 인터넷에 접속하는 등 외부 세계와 소통하는 코드는 실행할 때마다 결과가 같을 수 없습니다. 그런 코드를 부작용(side-effect)이 있는 코드라고 부릅니다. 다른 프로그래밍 언어에서는 부작용을 일으키는 코드도 함수라고 부르고 또 함수 안에서 호출해서 처리하지만, 하스켈은 부작용을 안전하게 다루기 위해 별도의 ‘액션’ 타입을 만듭니다. IO 타입이 대표적인 액션 타입이고, 그밖에도 가변 자료에 변경을 일으키는 액션을 다루는 ST 타입이나 소프트웨어 트랜잭셔널 메모리를 다루는 STM 타입 등이 있습니다.

중요한 것은, 예를 들어 하스켈에서 두 좌표 간의 거리를 구하기 위해서는

와 같은 코드를 작성하게 되겠죠. 이때 distance 함수의 타입은 distance :: (Double, Double) -> (Double, Double) -> Double 와 같이 될 것입니다. 그런데 코드를 “두 좌표를 받아서 좌표 간의 거리를 구하는 함수”가 아니라 “두 좌표를 받아서 일단 문명을 초토화시킨 뒤 좌표 간의 거리를 구하는 함수”로 바꾸고 싶다면

처럼 쓰게 되는데, 이때 distance 의 타입은 distance :: (Double, Double) -> (Double, Double) -> IO Double 이 됩니다. 원래 반환값의 타입이 Double 이었는데 지금은 IO Double 이죠. 액션이 된 것입니다.

이렇듯 하스켈에서는 순함수와 액션이 타입으로 구분되기 때문에 아무렇게나 섞어서 쓸 수가 없고 섞으면 컴파일러가 타입 오류를 냅니다. 이것은 알고리즘과 입출력의 분리가 제대로 되어 있는지를 컴파일 시간에 확인할 수 있게 해줍니다.

간혹 이것 때문에 “하고 싶은 대로 마음대로 할 수가 없다”라며 하스켈에 불만을 표하는 분들이 계신데 흑마법에 너무 오래 몸을 담고 계셔서 그렇게 되고 만 것입니다. 정작 그렇게 말씀하시는 분들 역시 “잘 짠 코드”에서는 알고리즘과 입출력의 분리를 실천하고 계십니다. 왜냐하면 이것이 언어를 막론하고 권장되는 프로그래밍 스타일이며 유지·보수 가능한 코드를 짜기 위해서는 필연적으로 취하게 되는 전략이기 때문입니다. 대표적으로 그 유명한 MVC(Model-View-Controller)가 여기에 해당됩니다. 모델과 뷰는 부작용 없는 방식, 입력 값에 의해서만 출력 값이 결정되는 구조로 작성할 것이 권장되며 실제 입출력은 컨트롤러가 관장하죠.

프로그램을 예측 가능하게 만들려면 알고리즘과 입출력이 섞여 있는 코드보다는 알고리즘 코드와 입출력 코드의 분리가 압도적으로 유리합니다. 그런데 현실에서는 실수로 혹은 귀찮아서 부작용 있는 코드와 없는 코드를 섞어 만든 날림 코드로 시작한 뒤 점점 날림 코드의 규모가 커져서 기술 부채가 되어 발목을 잡혀 고통받는 프로젝트가 많이 있습니다. 이들이 무능한 프로그래머라서 그런 것일까요? 아닙니다. 동적 언어에서는 금지된 것이 없어서 프로그래머 본인이 강철같은 불굴의 뚝심으로 정신을 바짝 차리고 숭고하고 순결한 코드 설계와 비타협적 코딩 원칙을 관철하고 심지어 여기에 충성하지 않는 모든 반동적인 동료들을 숙청해야만 알고리즘과 입출력을 완벽하게 분리할 수 있습니다. 반면 하스켈에서는 의지력 소모도 인간관계의 파탄도 없이 그냥 컴파일러의 말을 듣다가 문득 정신이 들고 보니 참조 투명성과 알고리즘/입출력 분리가 달성되어 있는 것입니다.

하스켈은 여러 코드를 조합해서 쓰기 좋게 되어 있습니다. 다른 프로그래밍 언어에서는 각 코드의 세부 구현을 모른 채 마구 조합하면 망하는 경우(예를 들어 사용자 입력을 받아오는 함수의 출력부를 SQL 쿼리 보내는 함수의 입력부와 조합하는 경우)를 피하기 위해 코드를 알아야 합니다. 즉 조합 단위들을 블랙박스로 취급할 수 없습니다. 반면 하스켈은 타입 시스템을 통해 이런 사고의 상당수를 방지할 수 있습니다. 라이브러리 제작자의 입장에서는 “라이브러리 사용자가 타입을 맞추다 보니 올바른 코드가 되도록” 라이브러리를 설계하는 것이 가능해집니다.

조합 단위 중 하나의 구현이 바뀌어서 다른 코드에도 변경이 불가피해진 경우 컴파일러가 타입 오류를 통해 어디를 고쳐야 하는지를 정확하게 알려줍니다. 따라서 라이브러리 작성자와 애플리케이션 작성자가 다른 협업 프로젝트에서도 유리합니다. 또 타입클래스라는 인터페이스가 있기 때문에 조합 가능한 범위를 정확하게 지정하고 통제할 수 있습니다. 스탠다드 차타드는 하스켈의 이러한 강점을 이용해 대형 시스템을 만들고 유지하는 데에 크게 득을 보고 있다고 합니다.

하스켈의 놀라운 조합성을 잘 보여주는 동시에 결정적인 장점으로 꼽히는 것이 파서 컴비네이터(IDE(통합 개발 환경)란? 개념, 기능, 필요성 parser combinator)입니다. 파서 컴비네이터는 간단한 문자열을 받아 간단한 해석 결과를 내놓은 작은 파서들을 조합하여 더 복잡하고 큰 파서를 만들어낼 수 있는 파서 라이브러리로서 정규식의 간편함과 BNF의 기능성을 동시에 갖추었습니다. 파서 컴비네이터로 만들어지는 파서는 작성 속도와 실행 속도가 모두 빠르며, “일주일만에 만들어진 펄 6 구현”으로 유명한 퍽스(Pugs)에 사용되기도 했습니다.

디버깅, 테스팅, 프로파일링

하스켈은 실행 파일의 성능을 위해서 컴파일할 수도 있는 반면, runhaskell 과 같은 명령으로 인터프리트 실행할 수도 있고, 대화형 인터프리터(GHCi)에서 코드를 불러와서 조사하거나 부분적으로 실행할 수도 있습니다. 부작용이 격리수용되므로 부작용 없는 함수들에 대해서 인터프리터에서 코드를 테스트해보기가 쉽습니다.

소스 코드 에디터와 GHCi를 동시에 띄워 두고 코드를 고친 뒤 GHCi에서 :reload 혹은 :r 명령으로 리로드하는 패턴으로 매우 편리하고 빠르게 개발할 수 있습니다. 코드에서 Debug.Trace 모듈을 반입해 선택적으로 값을 조회할 수도 있고, GHCi가 디버거를 내장하고 있기 때문에 코드에 브레이크포인트를 걸고 스택을 들여다보는 일반적인 디버깅 방식도 활용할 수 있습니다.

하스켈은 소프트웨어 테스팅의 새로운 영역을 개척한 언어로 유명합니다. 퀵첵은 하스켈의 타입 시스템을 활용하여 코드가 만족해야 할 조건을 논리적으로 지정해 주면 자동으로 입력 데이터를 생성해서 코드가 실제로 그 조건을 만족하는지를 확인해 주는 테스팅 라이브러리입니다. 이러한 자동화 테스트 또는 ‘속성 테스트’는 단위 테스트에 비해 간편하면서 강력하고 하스켈의 이점을 십분 살리는 방식으로서 칭송을 받고 있습니다. 퀵첵은 파서 컴비네이터와 마찬가지로 테스트를 조합해서 더 큰 테스트를 만들어낼 수 있습니다.

자동화 테스트 이외에도 HSpec 등 다른 언어에서 많이 쓰이는 인터페이스와 비슷하게 만들어진 테스트 라이브러리와, 이들을 모두 통합하여 운용할 수 있는 Tasty와 같은 테스팅 프레임워크가 있습니다.

하스켈은 고도의 프로파일링 기술을 제공합니다. GHC에 내장된 프로파일러를 이용해서 코드를 실행해 보고 코드의 어느 부분에서 프로세서 시간과 메모리 공간이 얼마나 쓰이는지 분석하는 것은 물론, 런타임 통계를 산출할 수 있고 컴파일러가 최적화한 중간 언어를 직접 분석할 수 있으며 GC를 시각화해서 튜닝할 수 있습니다. ThreadScope와 ghc-events-analyze와 같은 추가적인 도구를 이용해 하스켈 코드의 병렬 실행을 분석할 수 있고, criterion을 이용해 함수 단위로 실행 소요 시간을 벤치마크 비교하여 최적 코드를 찾을 수 있습니다.

커뮤니티와 생태계

해키지는 하스켈 패키지 저장소인 동시에, 수많은 하스켈 프로젝트의 문서화 자료를 한 자리에서 둘러볼 수 있는 문서고의 역할도 합니다. 고수준 언어 중에는 모듈 반입에도 부작용이 있을 수 있고 네임스페이스 구성에도 부작용이 있을 수 있으며 아무 객체나 무엇이든 될 수 있어서 코드로부터 API 문서를 자동으로 생성하는 것이 어려운 경우가 있습니다. 하스켈은 좋은 타입 시스템과 합리적인 모듈 시스템을 가지고 있기 때문에 모듈과 값과 함수를 정적으로 검사하고 많은 유의미한 정보를 자동으로 추출할 수 있습니다. 따라서 API 문서화가 훨씬 쉽고 사람의 노력이 덜 들고 단일한 진실의 원천 원칙을 지키면서 문서화를 만들어냅니다.

해키지에 등록된 하스켈 라이브러리의 수는 2010년에 4천 개를 돌파했고, 지금은 8천 개가 넘습니다. 웹, 데이터베이스, 그래픽스, 사운드, 네트워크, OS, 유저 인터페이스, 수학 등 범용 프로그래밍 언어를 사용할 만한 모든 분야에 다양한 라이브러리가 있습니다. 실용적으로 하스켈을 쓰는 데에 필요한 기능을 제공하는 라이브러리가 없어서 난감한 경우는 거의 없습니다. 또 하스켈을 프론트엔드 언어로도 사용할 수 있습니다. 하스켈을 자바스크립트로 컴파일하기 위해 GHCJS, Haste, Fay, PureScript 등 다양한 방법이 있습니다.


0 개 댓글

답장을 남겨주세요