LINUX.ORG.RU

языки без сборки мусора

 


2

7

Всем привет!

А какие есть годные языки без сборки мусора? Ну, т.е. кроме С, С++ и Rust.

Так, чтобы не просто опциональное ручное управление, а чтобы весь язык и стандартная либа были ориентированы на работу без gc

Не обязательно что-то из мейнстрима (таких, вроде как, и нет кроме той троицы). Можно и с гитхаба, но живое и активное развивающееся


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

Вообщем, я посмотрел. Нужно выпилить мусорный вектор + собрать шлангом. Попробуй собрать шлангом.

Я тут пытался написать версию для constexpr, но собрать там нереал - я много чего пробовал.

Вообщем, вот тебе упрощённая версия от constexpr с выпиленным говном:

#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/stat.h>

struct tape {
  constexpr tape(int * mem): mem(mem) {};
  
  constexpr decltype(auto) get() { return mem[pos]; }
  constexpr void inc(int x) { get() += x; }
  constexpr void move(int x) { pos += x; }
  
private:
  size_t pos = 0;
  int * mem;
};


const uint8_t * _run(const uint8_t * it, const uint8_t * end, tape & tape) {
  
  while(it != end) {
    switch(*it++) {
      case '+': tape.inc(1); break;
      case '-': tape.inc(-1); break;
      case '>': tape.move(1); break;
      case '<': tape.move(-1); break;
      case '.': {
        fprintf(stderr, "%c", tape.get());
      } break;
      case '[': {
        const uint8_t * newit = nullptr;
        while(tape.get()) newit = _run(it, end, tape);
        it = newit;
      } break;
      case ']': return it;
    }
  }
  return nullptr;
}


auto run(const uint8_t * it, const uint8_t * end) {
  tape tape{(int *)mmap(nullptr, 1024ul * 1024 * 1024 * 1, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)};
  _run(it, end, tape);
}

size_t file_size(int fd) {
  struct stat64 stat;
  fstat64(fd, &stat);
  return stat.st_size;
}

int main() {
  auto size = file_size(STDIN_FILENO);
  auto data = (const uint8_t *)mmap(nullptr, size, PROT_READ, MAP_PRIVATE|MAP_POPULATE, STDIN_FILENO, 0);
  run(data, data + size);
}

Тут нужно выпиливать мусорную рекурсию, а это нужно со стеком заморачиваться - мне лень. Мб я займусь этим. Эта версия(а она скорее всего медленнее двухпроходной версии написано нормально) - быстрее скала-говна. Обычная версия с гцц сливает где-то на 10-15%. Там нужно разбираться и смотреть почему гцц сливает, но мне лень.

Вообщем, собери эту версию шлангом - она должна ссать котлину на рожу. Вроде как она выдаёт правильный результат.

Запускать prog < bench.b

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

На

#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/stat.h>

struct tape {
  constexpr tape(int * mem): mem(mem) {};
  
  constexpr decltype(auto) get() { return mem[pos]; }
  constexpr void inc(int x) { get() += x; }
  constexpr void move(int x) { pos += x; }
  
private:
  size_t pos = 0;
  int * mem;
};

void _run(const uint8_t * begin, const uint8_t * end, tape & tape) {
  decltype(begin) stack_data[1024];
  auto stack = stack_data;
  
  *stack = begin;
  
loop:
  auto it = *stack;
  
  while(it != end) {
    switch(*it++) {
      case '+': tape.inc(1); break;
      case '-': tape.inc(-1); break;
      case '>': tape.move(1); break;
      case '<': tape.move(-1); break;
      case '.': {
        fprintf(stderr, "%c", tape.get());
      } break;
      case '[': {
        *(++stack) = it;
        goto loop;
      } break;
      case ']': {
        if(tape.get()) goto loop; else --stack;
      } break;
    }
  }
}


auto run(const uint8_t * it, const uint8_t * end) {
  tape tape{(int *)mmap(nullptr, 1024ul * 1024 * 1024 * 1, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)};
  _run(it, end, tape);
}

size_t file_size(int fd) {
  struct stat64 stat;
  fstat64(fd, &stat);
  return stat.st_size;
}

int main() {
  auto size = file_size(STDIN_FILENO);
  auto data = (const uint8_t *)mmap(nullptr, size, PROT_READ, MAP_PRIVATE|MAP_POPULATE, STDIN_FILENO, 0);
  
  run(data, data + size);
}

На, я извалял в дерьме шланг, говнотлин, то цпп-говно, плебеев и прочую дристню. Десятый шланг может почти догнать гцц. 9.2гцц - 3.9, говнотлин 5.1, десятый шланг 4.3, 9 - аналогичен говнотлину.

anonymous
()
Ответ на: комментарий от Deleted

А mmap на мелких файлах будет быстрее open, read?

mmap там больше не для быстроты, а для того, чтобы 1) не жрать говно, 2) получить zerocopy.

mmap на файл на ro память монтирует пейджкеш в юзерспейс. Если ты будешь это читать - файл итак будет в кеше + ты будешь тратить лишнюю память на его чтение. MAP_POPULATE - делает это сразу(делает «префолт»).

anonymous
()
Ответ на: комментарий от anonymous
dmitry@msi:~$ time java -jar main.jar bench.b // openjdk 11.0.4
real	0m17,896s
user	0m17,947s
sys	0m0,044s

dmitry@msi:~$ time ./main-1 < bench.b // clang O2, ofast
real	0m24,229s
user	0m24,211s
sys	0m0,000s

dmitry@msi:~$ time ./main-2 < bench.b // clang O2, ofast
real	0m18,813s
user	0m18,802s
sys	0m0,000s

dmitry@msi:~$ time ./main-1-gcc < bench.b // march, whole, ofast 
real	0m30,050s
user	0m30,024s
sys	0m0,008s

dmitry@msi:~$ time ./main-2-gcc < bench.b // march, whole, ofast
real	0m22,820s
user	0m22,806s
sys	0m0,000s

dmitry@msi:~$ time ./main-1-s < bench.b // -Os
real	0m22,426s
user	0m22,409s
sys	0m0,004s


dmitry@msi:~$ time ./main-2-s < bench.b // -Os
real	0m19,171s
user	0m19,155s
sys	0m0,000s
Deleted
()
Ответ на: комментарий от Deleted

Это какое? Результаты похожи на первую портянку, где на рекурсии. Проверь вторую и поставь нормальную версию гцц.

anonymous
()
Ответ на: комментарий от Deleted

dmitry@msi:~$ time ./main-2-gcc < bench.b // march, whole, ofast dmitry@msi:~$ time ./main-2-s < bench.b // -Os

Это вторая версия? Это дристня какая-то. Не может такого быть.

dmitry@msi:~$ time java -jar main.jar bench.b // openjdk 11.0.4
real	0m17,896s
user	0m17,947s
sys	0m0,044s

dmitry@msi:~$ time ./main-2 < bench.b // clang O2, ofast
real	0m18,813s
user	0m18,802s
sys	0m0,000s

Вот это адекватный результат - у меня так же. Шланг как говнотлин, но чуть сливает. То, что ты намерил с гцц - неверно. Ставь нормальную версию.

anonymous
()
Ответ на: комментарий от Deleted

Хотя нет, я наврал. Шланг чуть сливает гцц, а не говнотлину. Говнотлину обоссывает и тот и тот. Так что, что-то там у тебя не так, даже со шлангом. Какой камень? Может там нехалем какой?

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

А gcc где нить бинарником есть?

cat /proc/cpuinfo

processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 37
model name	: Intel(R) Core(TM) i5 CPU         650  @ 3.20GHz
stepping	: 5
microcode	: 0x7
cpu MHz		: 1340.725
cache size	: 4096 KB
physical id	: 0
siblings	: 4
core id		: 0
cpu cores	: 2
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 11
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt aes lahf_lm pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid dtherm ida arat flush_l1d
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips	: 6383.96
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 37
model name	: Intel(R) Core(TM) i5 CPU         650  @ 3.20GHz
stepping	: 5
microcode	: 0x7
cpu MHz		: 1422.365
cache size	: 4096 KB
physical id	: 0
siblings	: 4
core id		: 2
cpu cores	: 2
apicid		: 4
initial apicid	: 4
fpu		: yes
fpu_exception	: yes
cpuid level	: 11
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt aes lahf_lm pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid dtherm ida arat flush_l1d
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips	: 6383.96
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 2
vendor_id	: GenuineIntel
cpu family	: 6
model		: 37
model name	: Intel(R) Core(TM) i5 CPU         650  @ 3.20GHz
stepping	: 5
microcode	: 0x7
cpu MHz		: 1389.448
cache size	: 4096 KB
physical id	: 0
siblings	: 4
core id		: 0
cpu cores	: 2
apicid		: 1
initial apicid	: 1
fpu		: yes
fpu_exception	: yes
cpuid level	: 11
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt aes lahf_lm pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid dtherm ida arat flush_l1d
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips	: 6383.96
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 3
vendor_id	: GenuineIntel
cpu family	: 6
model		: 37
model name	: Intel(R) Core(TM) i5 CPU         650  @ 3.20GHz
stepping	: 5
microcode	: 0x7
cpu MHz		: 1416.331
cache size	: 4096 KB
physical id	: 0
siblings	: 4
core id		: 2
cpu cores	: 2
apicid		: 5
initial apicid	: 5
fpu		: yes
fpu_exception	: yes
cpuid level	: 11
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt aes lahf_lm pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid dtherm ida arat flush_l1d
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips	: 6383.96
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

Deleted
()
Ответ на: комментарий от Deleted
dmitry@msi:~$ clang++-10 -flto -static -O3 -march=native  main-2.cpp -o main-2-final
dmitry@msi:~$ time ./main-2-final < bench.b 
real	0m16,788s
user	0m16,772s
sys	0m0,000s
Deleted
()
Ответ на: комментарий от Deleted

Кстати, да. Шланг -O3 действительно быстрее. Становится как гцц.

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

anonymous
()
Ответ на: комментарий от anonymous
dmitry@msi:~$ g++-9 -Os -static -flto main-2.cpp -o main-2-gcc9
dmitry@msi:~$ time ./main-2-gcc9 < bench.b 
real	0m19,499s
user	0m19,450s
sys	0m0,024s
dmitry@msi:~$ g++-9 --version
g++-9 (Debian 9.2.1-8) 9.2.1 20190909
Deleted
()
Ответ на: комментарий от anonymous
 Benchmark brainf*ck program
>++[<+++++++++++++>-]<[[>+>+<<-]>[<+>-]++++++++
[>++++++++<-]>.[-]<<>++++++++++[>++++++++++[>++
++++++++[>++++++++++[>++++++++++[>++++++++++[>+
+++++++++[-]<-]<-]<-]<-]<-]<-]<-]++++++++++.
   Benchmark brainf*ck program
>++[<+++++++++++++>-]<[[>+>+<<-]>[<+>-]++++++++
[>++++++++<-]>.[-]<<>++++++++++[>++++++++++[>++
++++++++[>++++++++++[>++++++++++[>++++++++++[>+
+++++++++[-]<-]<-]<-]<-]<-]<-]<-]++++++++++.
   Benchmark brainf*ck program
>++[<+++++++++++++>-]<[[>+>+<<-]>[<+>-]++++++++
[>++++++++<-]>.[-]<<>++++++++++[>++++++++++[>++
++++++++[>++++++++++[>++++++++++[>++++++++++[>+
+++++++++[-]<-]<-]<-]<-]<-]<-]<-]++++++++++.
   Benchmark brainf*ck program
>++[<+++++++++++++>-]<[[>+>+<<-]>[<+>-]++++++++
[>++++++++<-]>.[-]<<>++++++++++[>++++++++++[>++
++++++++[>++++++++++[>++++++++++[>++++++++++[>+
+++++++++[-]<-]<-]<-]<-]<-]<-]<-]++++++++++.
   Benchmark brainf*ck program
>++[<+++++++++++++>-]<[[>+>+<<-]>[<+>-]++++++++
[>++++++++<-]>.[-]<<>++++++++++[>++++++++++[>++
++++++++[>++++++++++[>++++++++++[>++++++++++[>+
+++++++++[-]<-]<-]<-]<-]<-]<-]<-]++++++++++.
   Benchmark brainf*ck program
>++[<+++++++++++++>-]<[[>+>+<<-]>[<+>-]++++++++
[>++++++++<-]>.[-]<<>++++++++++[>++++++++++[>++
++++++++[>++++++++++[>++++++++++[>++++++++++[>+
+++++++++[-]<-]<-]<-]<-]<-]<-]<-]++++++++++.
Deleted
()
Ответ на: комментарий от Deleted

10.5sec говнотлин, 8.(2-3)sec g++(Ofast)/clang(O3). Ну скорее то нехалем-проблемы он(и возможно ещё следующий) последняя такая явная кукуруза от интела.

Попробуй всё же поставить 9.2гцц.

anonymous
()
Ответ на: комментарий от Deleted

Ну значит это нехалем-проблемы. Это, вообщем, основная проблема многих говнобенчмарков. Вон там клоуны бенчат на коре2 и прочей дристне. Компиляторы все затачиваются и код затачивается на адекватное, актуальное железо.

Может кто из пацанов придёт и побенчит на чем-то ином.

anonymous
()
Ответ на: комментарий от Deleted

Можно ещё жсон попарсить. Там ещё есть havlak, но там нету описания и много дристни - долго разбираться.

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