LINUX.ORG.RU

Человеческая замена C для своих задач

 ,


0

6

Хочется найти простой кроссплатформенный компилируемый язык для программирования всякой мелочи для себя. Отправной точкой можно назвать C, но хочется поменьше рутины, возможностей на ровном месте выстрелить в ногу и наличия удобных базовых структур, вроде строк, динамических массивов и прочих списков. В кандидатурах сейчас пока C++ (не хочется лезть в дебри именно плюсов, с другой стороны писать в духе C с классами кажется как-то не комильфо), Pascal (начинал с Delphi когда-то, но уже почти не помню), Vala (тыкал немного, напрягает, что надо тянуть Glib и с поддержкой + кроссплатформой не очень), Go, D (на первый взгляд тоже ситуация с поддержкой и библиотеками не радует), Rust (какой-то инопланетный, но идея с управлением памятью интересна).


Ответ на: комментарий от seiken

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

Go известен как очень быстрый компилятор. И очень легко используется в режиме скрипта:

//usr/bin/env go run $0 "$@"; exit
package main

import (
        "fmt"
        "os"
)

func main() {
        fmt.Println("Hello world!")
        cwd, _ := os.Getwd()
        fmt.Println("cwd:", cwd)
        fmt.Println("args:", os.Args[1:])
}

На компиляцию, запуск и отработку на мобильном sandy bridge уходит около 300 мс.

gag ★★★★★
()
Ответ на: комментарий от gag

На компиляцию, запуск и отработку на мобильном sandy bridge уходит около 300 мс.

И, если не ошибаюсь, уже скомпилированный исполняемый файл не будет компилироваться повторно, если исходник не изменён. Т.е. второй запуск просто вылетит в проверку last_mod двух файлов, один из которых в /tmp/ или $TMPDIR/.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

И, если не ошибаюсь, уже скомпилированный исполняемый файл не будет компилироваться повторно, если исходник не изменён.

Если собирать go build script.go - да. Там же запуск:

//usr/bin/env go run $0 "$@"; exit

Повторный go build у меня занимает около 110 мс, запуск и исполнение практически ничего (около 5 мс).

gag ★★★★★
()
Ответ на: комментарий от gag

Я понятия не имею о Go, но этот пример слишком короткий и примитивный, чтобы на его основе сделать адекватные выводы. И даже этот пример, скорее всего на Питоне можно сделать короче, без потери читаемости, что-то вроде 6-7 строк. А на шелле так вообще в 3.

На компиляцию, запуск и отработку на мобильном sandy bridge уходит около 300 мс.

Пример слишком маленький, чтобы судить о скорости, даже зная а приори, что у Go быстрый компилятор. Далее, для грамотного измерения как минимум нужно запускать несколько раз и указывать среднее и стандартное отклонение. Вот, у меня С'шный аналог первый раз компилируется и запускается ок. 200мс, а последующие компиляции и запуски уже в пределах 50мс. А Go на последующих запусках не опускается ниже 170мс. Означает ли это, что С в супарной производительности компиляция+выполнение в >3 раза быстрее Go. Нет, не означает (даже если это так) т.к. пример игрушечный.

seiken ★★★★★
()
Ответ на: комментарий от seiken

Далее, для грамотного измерения как минимум нужно запускать несколько раз и указывать среднее и стандартное отклонение.

Я указал среднее время на глаз после нескольких проходов (за исключением первого). Это, конечно, на так точно, но для оценки вполне сойдёт.

gag ★★★★★
()
Ответ на: комментарий от gag

Go известен как очень быстрый компилятор. И очень легко используется в режиме скрипта:

//usr/bin/env go run $0 «$@»; exit package main

import ( «fmt» «os» )

func main() { fmt.Println(«Hello world!») cwd, _ := os.Getwd() fmt.Println(«cwd:», cwd) fmt.Println(«args:», os.Args[1:]) }

На компиляцию, запуск и отработку на мобильном sandy bridge уходит около 300 мс.

Вот по-настоящему быстрый компилятор (luajit):

local lfs = require"lfs"                                                                                                                                    
print("Hello world!")                                                           
print("cwd:", lfs.currentdir())                                                 
print("args:", ...)                                                             
$ time luajit /tmp/test.lua 1 34 56
Hello world!
cwd:    /tmp
args:   1       34      56

real    0m0,002s
user    0m0,000s
sys     0m0,000s
$

На самом деле, конечно, это jit-компилятор.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.