]]> ]]>

gc (6g, 8g)

Реализация языка программирования Go

Реализация Go, написанная на C. В настоящий момент поддерживает только платформы FreeBSD, Linux, Native Client и Mac OS X.

gc 6 предназначен для архитектуры amd64. Наиболее зрелая реализация, компилятор снабжен оптимизатором и выдает хороший код. gc 8 предназначен для 386 и по качеству сравним с gc 6. gc 5 — незавершенный компилятор для архитектуры arm, находящийся в разработке.

Примеры:

Hello, World!:

Пример для версий gc-2010-07-14
package main
import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

Факториал:

Пример для версий gc-2010-07-14

В примере показаны рекурсивный и итеративный способы вычисления факториала, а также создание обобщенной функции, которая выводит их результаты универсальным способом.

package main
import "fmt"

//Recursive Factorial
func factr(n uint64) uint64 {
    if (n < 2) { return 1 }
    return n * factr(n-1)
}

//Iterative Factorial
func facti(n uint64) uint64 {
    var ret uint64 = 1
    for ; n > 0; n-- {
        ret *= n
    }
    return ret
}

func printFact(fact func(uint64) uint64) {
    for i := 0; i < 17; i++ {
        fmt.Printf("%d! = %d\n", i, fact(uint64(i)))
    }
}

func main() {
    printFact(factr)
    fmt.Println("--")
    printFact(facti)
}

Числа Фибоначчи:

Пример для версий gc-2010-07-14

В этом примере показаны все три способа вычисления чисел Фибоначчи.

package main
import ("fmt"
        "math")

//Fibonacci Recursive
func fibr(n int) int {
    if n < 2 { return 1 }
    return fibr(n-2) + fibr(n-1)
}

//Fibonacci Iterative
func fibi(n int) int {
    var a, b int = 1, 1
    for i := 0; i < n; i++ {
        a, b = b, a+b
    }
    return a
}

//Fibonacci Binet
func fibb(n int) int {
    g := (1 + math.Sqrt(5)) / 2
    ret := (math.Pow(g, float64(n)) - math.Pow(1-g, float64(n))) / math.Sqrt(5)
    return int(ret)
}

type fibfunc func(int) int

//Implements a general printing method for fibonacci functions
func printFib(fib fibfunc, a, b int) {
    for i := a; i < b; i++ {
        fmt.Printf("%d, ", fib(i))
    }
    fmt.Println("...")
}

func main() {
    printFib(fibr, 0, 16)
    printFib(fibi, 0, 16)
    printFib(fibb, 1, 17)
}

Квадратное уравнение:

Пример для версий gc-2010-07-14

При импорте нескольких пакетов перед именем одного из них можно поставить точку, и использовать его функции без префикса имени пакета, как fmt в этом примере.

Чтобы прочитать число, введенное пользователем, следует прочитать строку из консоли, убрать последний символ переноса строки и преобразовать ее в нужный формат числа. В данном случае входные переменные будут целочисленными, но в дальнейшем будут использоваться для вычислений с плавающей точкой. Go не поддерживает неявные преобразования типов, поэтому лучше сразу трактовать входные данные как float64 (тип данных, который передается в качестве аргумента в math.Sqrt).

= — простое присваивание, := — присваивание с объявлением переменной, находящейся слева от знака присваивания. Следует отметить, что объявленные, но неиспользованные переменные считаются ошибками компиляции.

package main
import (
 "os"
 . "fmt"
 "math"
 "bufio"
 "strconv")
 
func main() {
    in := bufio.NewReader(os.Stdin)
    line, err := in.ReadString('\n')
    line = line[0 : len(line)-1]
    A, err := strconv.Atof64(line)
    if (A == 0) {  
        Print("Not a quadratic equation.")
        return
    }
    line, err = in.ReadString('\n')
    line = line[0 : len(line)-1]
    B, err := strconv.Atof64(line)
    line, err = in.ReadString('\n')
    line = line[0 : len(line)-1]
    C, err := strconv.Atof64(line)
    if err != nil { 
        Print(err) 
    }
    D := B*B-4*A*C
    if (D == 0) {
        Printf("x = %f", -B/2/A)
        return
    }
    if (D>0) {
        Printf("x1 = %f\nx2 = %f", -B/2/A + math.Sqrt(D)/2/A, -B/2/A - math.Sqrt(D)/2/A)
    } else {
        Printf("x1 = (%f, %f)\nx2 = (%f, %f)", -B/2/A, math.Sqrt(-D)/2/A, -B/2/A, -math.Sqrt(-D)/2/A)
    }
}

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам