2012년 5월 8일 화요일
SWIG
wxWidgets 를 쓰려면, SWIG 를 써야할지도 모른다.
어쩌면, GO 보다 C++ 를 더 열심히 해야할지도 모른다.
http://www.swig.org/
SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages.
Support for the Go language was added in swig-2.0.1.
GUI
눈에 보이는것이 전부다.
손에 만질수 있는것이 전부다.
GO 언어로 쓸수 있다면 더 좋을 것이다.
wxWidgets 에 포함된 wxAUI 를 통해 docking window 를 쓸수 있다고한다.
wxAUI is incorporated into the wxWidgets library
2012년 5월 6일 일요일
go languange
{ goroutine, channel, select } 의 조합은 무엇을 의미하는가.
이것은 { 데이터통신과 동기화 } 를 하나로 합쳐놓은것을 의미한다.
이것은 강력한 조합이다.
이 조합의 파급효과는 개발기간단축으로 나타날것이다.
struct, method, interface 조합은 무엇을 의미하는가.
개발이 장기간 진행되어 프로젝트의 파일수/라인수가 늘어나면
개발자가 필연적으로 마주치게되는,
class hierachy 의 복잡도가 증가하는 현상을
제거한다는것을 의미한다.
소스코드의 전체적인 의존성, 복잡도를 낮춘다는것을 의미한다.
C++ 에서 함수의 인자로 base class pointer 를 넘겨줄때나,
virtual function 을 써야할때,
GO 에서는 interface 를 함수의 인자로 넘기고,
interface 를 통해 함수를 호출하면,
마치 virtual function 과 같이 해당 type 의 method 가 호출된다.
디자인을 변경할때, 수정해야하는 코드의 양이 줄어든다.
디자인을 변경할때, 개발자가 머리속으로 처리해야하는 정보의 양이 줄어든다.
따라서 코드는 버그에대한 면역력이 높아지며, 개발기간은 단축된다.
쓰는 사람에게는 Script 언어가 주는 즐거움을 주는 이 언어는
놀랍게도 machine code 를 생성해낸다.
즉, 실행속도가 JAVA 나 .NET C# 보다 빠를것으로 예상된다.
다만, 아직은 성숙되지 않았다.
디버거와 통합된 쓸만한 IDE 가 몇년안에 제공되어야 한다.
UI 라이브러리를 포함한 여러가지 라이브러리가 오픈소스진영에서 쏟아져나와야 한다.
현재 Google App Engine 은 GO 언어를 지원한다고 한다.
Android 개발에도 GO 언어가 지원된다면.
2012년 5월 1일 화요일
channel
출처: http://tour.golang.org/#62
channel 한번 더보자.
channel 하나를 다수의 goroutine 에서 재사용이 가능하다는 얘기인가.
하나의 channel 은 사용이 완료될때까지 완전히 block 된다.
두개의 goroutine 에서 동시에 하나의 channel 을 쓸수는 없을것이다.
package main
import (
"fmt"
)
func sum(a []int, c chan int) {
sum := 0
for _, v := range a {
sum += v
}
c <- sum
}
func main() {
a := []int {7, 2, 8, -9, 4, 0}
c:= make(chan int)
go sum( a[:len(a)/2], c)
go sum( a[len(a)/2:], c)
x, y := <-c, <-c
fmt.Println(x, y, x + y)
}
D:\DEV\PP\work_4\src>go run hello70.go
17 -5 12
channel 한번 더보자.
channel 하나를 다수의 goroutine 에서 재사용이 가능하다는 얘기인가.
하나의 channel 은 사용이 완료될때까지 완전히 block 된다.
두개의 goroutine 에서 동시에 하나의 channel 을 쓸수는 없을것이다.
package main
import (
"fmt"
)
func sum(a []int, c chan int) {
sum := 0
for _, v := range a {
sum += v
}
c <- sum
}
func main() {
a := []int {7, 2, 8, -9, 4, 0}
c:= make(chan int)
go sum( a[:len(a)/2], c)
go sum( a[len(a)/2:], c)
x, y := <-c, <-c
fmt.Println(x, y, x + y)
}
D:\DEV\PP\work_4\src>go run hello70.go
17 -5 12
error
출처: http://tour.golang.org/#54
error 를 한번 더 보자.
error 는 error string 이다.
error 는 interface 이다.
type error interface {
Error() string
}
즉, Error() string 이란 메서드만 구현되어 있으면,
모두 error 기능을 수행할 수 있다고 본다.
즉, 아래 run() 함수가 리턴하는 error 타입은
위에서 정의된 Error() string 메서드를 구현한 객체를 리턴한다는 얘기가 된다.
package main
import (
"fmt"
"time"
)
type MyError struct {
When time.Time
What string
}
func (e *MyError) Error() string {
return fmt.Sprintf("at %v, %s", e.When, e.What)
}
func run() error {
return &MyError{ time.Now(), "작동실패."}
}
func main() {
if err := run(); err != nil {
fmt.Println(err)
}
}
D:\DEV\PP\work_4\src>go run hello69.go
at 2012-05-01 11:09:15.2010718 +0000 UTC, 작동실패.
error 를 한번 더 보자.
error 는 error string 이다.
error 는 interface 이다.
type error interface {
Error() string
}
즉, Error() string 이란 메서드만 구현되어 있으면,
모두 error 기능을 수행할 수 있다고 본다.
즉, 아래 run() 함수가 리턴하는 error 타입은
위에서 정의된 Error() string 메서드를 구현한 객체를 리턴한다는 얘기가 된다.
package main
import (
"fmt"
"time"
)
type MyError struct {
When time.Time
What string
}
func (e *MyError) Error() string {
return fmt.Sprintf("at %v, %s", e.When, e.What)
}
func run() error {
return &MyError{ time.Now(), "작동실패."}
}
func main() {
if err := run(); err != nil {
fmt.Println(err)
}
}
D:\DEV\PP\work_4\src>go run hello69.go
at 2012-05-01 11:09:15.2010718 +0000 UTC, 작동실패.
interface
출처: http://tour.golang.org/#52
interface 는 method 의 집합으로 표현한다.
interface type 변수에는 해당 method 를 가지고 있는 value 만 저장할 수 있다.
interface type 변수에 해당 함수객체나 함수포인터를 저장하는것이 아니다.
그 함수객체가 구현되어있는 변수값을 저장한다.
하나의 type 은 여러개의 interface 를 구현할 수 있다.
interface 때문에 C++ 의 상속, 객체 포인터 등을 쓸 필요가 없다.
함수를 정의할때, 파라메터로 객체의 타입을 지정하지 않고,
interface 타입을 지정하는 것을 눈여겨 보아야 한다.
GO 는 C++ 과는 다르다.
struct, method, interface.
이 세가지로 OOP 기능을 충분히 구현할 수 있다는 사실을 알 수 있다.
상속은 필요없다는 얘기다!
class heirachy 를 만들 필요가 없다.
GO 에서는 type, method 가 interface 로 느슨하게 연결되어 있다.
이것은 컴파일러가 암시적으로 표현된 코드로부터,
type, method 간의 의존관계를 자동적으로 처리해주기 때문에 가능한 일이다.
"연결관계를 상속을 통해서 엄격하게 표현하지 않고,
interface 를 통해서 느슨하게 표현함으로써,
코드 변경작업(디자인변경작업)의 고통을 줄일수 있다"
는 사실을 그들은 알았던것이다.
하나의 type 이 여러개의 interface 를 구현할 수 있다는 말은,
C++ 의 다중상속 기능과 같은 기능을 발휘할 수 있다는 의미로 해석하기로 한다.
package main
import (
"fmt"
"math"
)
type Abser interface {
Abs() float64
}
func main() {
var a Abser
f := MyFloat( -math.Sqrt2)
v := Vertex{3, 4}
a = f
fmt.Println(a.Abs())
a = &v
// a = v
fmt.Println(a.Abs())
}
type MyFloat float64
func ( f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
D:\DEV\PP\work_4\src>go run hello68.go
1.4142135623730951
5
interface 는 method 의 집합으로 표현한다.
interface type 변수에는 해당 method 를 가지고 있는 value 만 저장할 수 있다.
interface type 변수에 해당 함수객체나 함수포인터를 저장하는것이 아니다.
그 함수객체가 구현되어있는 변수값을 저장한다.
하나의 type 은 여러개의 interface 를 구현할 수 있다.
interface 때문에 C++ 의 상속, 객체 포인터 등을 쓸 필요가 없다.
함수를 정의할때, 파라메터로 객체의 타입을 지정하지 않고,
interface 타입을 지정하는 것을 눈여겨 보아야 한다.
GO 는 C++ 과는 다르다.
struct, method, interface.
이 세가지로 OOP 기능을 충분히 구현할 수 있다는 사실을 알 수 있다.
상속은 필요없다는 얘기다!
class heirachy 를 만들 필요가 없다.
GO 에서는 type, method 가 interface 로 느슨하게 연결되어 있다.
이것은 컴파일러가 암시적으로 표현된 코드로부터,
type, method 간의 의존관계를 자동적으로 처리해주기 때문에 가능한 일이다.
"연결관계를 상속을 통해서 엄격하게 표현하지 않고,
interface 를 통해서 느슨하게 표현함으로써,
코드 변경작업(디자인변경작업)의 고통을 줄일수 있다"
는 사실을 그들은 알았던것이다.
하나의 type 이 여러개의 interface 를 구현할 수 있다는 말은,
C++ 의 다중상속 기능과 같은 기능을 발휘할 수 있다는 의미로 해석하기로 한다.
package main
import (
"fmt"
"math"
)
type Abser interface {
Abs() float64
}
func main() {
var a Abser
f := MyFloat( -math.Sqrt2)
v := Vertex{3, 4}
a = f
fmt.Println(a.Abs())
a = &v
// a = v
fmt.Println(a.Abs())
}
type MyFloat float64
func ( f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
D:\DEV\PP\work_4\src>go run hello68.go
1.4142135623730951
5
struct 와 method
출처: http://tour.golang.org/#49
class 는 어디가고, struct 와 method 만 남았다.
method receiver 라는 용어가 등장했다. (v *Vertex)
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := &Vertex{3, 4}
fmt.Println(v.Abs())
}
D:\DEV\PP\work_4\src>go run hello67.go
5
피드 구독하기:
글 (Atom)