LINUX.ORG.RU

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

 


2

7

Всем привет!

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

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

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


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

GCC 8.3 был. От Debian Buster. Пробовал я эти флаги. Под виндой сейчас вот пробую.

PS D:\Sources\BrainfuckBenchmark> kotlinc .\bf2.kt -include-runtime -d bf2.jar
PS D:\Sources\BrainfuckBenchmark> cl /O2 /GL bf2.cpp

PS D:\Sources\BrainfuckBenchmark> Measure-Command { .\bf2.exe .\bench.b }
Milliseconds      : 929
Ticks             : 29296322
TotalSeconds      : 2,9296322
TotalMilliseconds : 2929,6322

PS D:\Sources\BrainfuckBenchmark> Measure-Command { java -jar .\bf2.jar .\bench.b }
Seconds           : 2
Milliseconds      : 591
Ticks             : 25910151
TotalSeconds      : 2,5910151
TotalMilliseconds : 2591,0151

Deleted
()
Ответ на: комментарий от Deleted
$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (IcedTea 3.13.0) (Gentoo icedtea-3.13.0)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

$ time scala bf.scala  bench.b
warmup
time: 3.01478475s
run
ZYXWVUTSRQPONMLKJIHGFEDCBA
time: 4.423599998s

real    0m8,273s
user    0m9,039s
sys     0m0,080s

$ time ./cpp bench.b 
ZYXWVUTSRQPONMLKJIHGFEDCBA

real    0m1,377s
user    0m1,377s
sys     0m0,000s

Может, конечно, если я оракловский рантайм поставлю - оно что-то изменит.

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

Архивы с бинарниками, качаешь, export PATH и можно тестить.
Kotlin: https://github.com/JetBrains/kotlin/releases/download/v1.3.50/kotlin-compiler...
OpenJDK: https://download.java.net/java/GA/jdk13/5b8a42f3905b406298b72d750b6919f6/33/G...

java -version

openjdk version "13" 2019-09-17
OpenJDK Runtime Environment (build 13+33)
OpenJDK 64-Bit Server VM (build 13+33, mixed mode, sharing)

scala

Шутишь? Kotlin же.

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

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

А, дак я даун. Оказывается там в попе котлин, а не скала. А скала в говне там тоже. Ну щас накачу котлин тогда.

anonymous
()
Ответ на: комментарий от anonymous
import java.io.IOException
import java.nio.file.Files
import java.nio.file.Paths

sealed class Op() {
    class Inc(val v: Int): Op()
    class Move(val v: Int): Op()
    class Loop(val loop: Array<Op>): Op()
    object Print: Op()
}

class Tape {
    private var tape: IntArray = IntArray(1)
    private var pos: Int = 0
    
    fun get(): Int {
        return tape[pos]
    }
    
    fun inc(x: Int) {
        tape[pos] += x
    }
    
    fun move(x: Int) {
        pos += x
        while (pos >= tape.size) {
            val tape = IntArray(this.tape.size * 2)
            System.arraycopy(this.tape, 0, tape, 0, this.tape.size)
            this.tape = tape
        }
    }
}
  
class Program(code: String) {
    private val ops: Array<Op>

    init {
        val it = code.iterator()
        ops = parse(it)
    }

    private fun parse(it: CharIterator): Array<Op> {
        val res = arrayListOf<Op>()
        while (it.hasNext()) {
            when (it.next()) {
                '+' -> res.add(Op.Inc(1))
                '-' -> res.add(Op.Inc(-1))
                '>' -> res.add(Op.Move(1))
                '<' -> res.add(Op.Move(-1))
                '.' -> res.add(Op.Print)
                '[' -> res.add(Op.Loop(parse(it)))
                ']' -> return res.toTypedArray()
            }
        }
        return res.toTypedArray()
    }

    fun run() {
        _run(ops, Tape())
    }
    
    private fun _run(program: Array<Op>, tape: Tape) {
        for (op in program) {
            when (op) {
                is Op.Inc -> tape.inc(op.v)
                is Op.Move -> tape.move(op.v)
                is Op.Loop -> while (tape.get() > 0) {
                    _run(op.loop, tape)
                }
                is Op.Print -> print(tape.get().toChar())
            }
        }
    }
}

@Throws(IOException::class)
fun main(args: Array<String>) {
    val code = String(Files.readAllBytes(Paths.get(args[0])))
    val program = Program(code)
    program.run()
}
Deleted
()
Ответ на: комментарий от Deleted
$ time ./jdk-13/bin/java -jar bf2.jar bench.b 
ZYXWVUTSRQPONMLKJIHGFEDCBA

real    0m1,419s
user    0m1,432s
sys     0m0,014s

Сливает оно крестам(причём говну на «крестах»).

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

Попробуй скопировать если не лень 7 раз ту программу на брейнфаке. Разрыв увеличивается у меня.

Deleted
()
Ответ на: комментарий от 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
()
Ответ на: комментарий от no-such-file

Вообщем, решил я пойти и посмотреть на это жсон-говно - как всегда дошколята обделались. Я заменил чтение файла на нормальное:

#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>

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


int main() {
  auto fd = open("1.json", O_RDONLY);
  auto size = file_size(fd);
  auto data = (const char *)mmap(nullptr, size, PROT_READ, MAP_PRIVATE|MAP_POPULATE, fd, 0);
  StringStream ss{data};
  Reader reader;
  CoordinateHandler handler;
  reader.Parse(ss, handler);
}

И о чудо - как же так? К тому же, это либа дерьма + говнорасте генератор, а в цэпэпэ обычный парсер, причём крайне тупой.

Но очевидно, что жсон для плебеев и этот мусорный бенчмарк ничего не бенчит. Никто в здравом уме не будет тратить время на написание нормального парсера для этого плебейского говна(кроме раст-секнтов с помойки. И то даже не осиливается).

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

. Лучше список watch выражений которые перевыполняются при каждом изменении кода и пересборки. Добавил три нужные вызова функций и редактирует код, смотришь результаты.

Миллениалы изобрели CI

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

Кстати REPL как по мне не удобная идея. Лучше список watch выражений которые перевыполняются при каждом изменении кода и пересборки. Добавил три нужные вызова функций и редактирует код, смотришь результаты.

https://confluence.jetbrains.com/pages/viewpage.action?pageId=93130956

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

Да, я как раз смотрел на это и ещё на демку Unison-lang. Обычно во время активного прототипирования таким scratchpad становится main, в можно было бы что-то чище

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от Smetchik

Современные реалии такие что ЯП нужна своя большая помойка говна в стиле npm, иначе сильно много гемора. В Ada вроде было что-то маленькое

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от vertexua

Вот из-за огромной кучки г0вн@ python переживёт нас всех, хотя как язык г0вн0 редкостное.

anonymous
()

А зачем оно надо, если уже есть C? Это собственно и есть причина, по которой все языки после C - говно. Потому что чтобы народ схавал новый язык, он должен отличаться от C. У него должна быть киллер-фича, он не может просто следовать золотой середине, как C, он должен от него чем-то отличаться. А поскольку разработчики C создали язык, в котором есть ВСЯ необходимая для промышленного программирования семантика и даже немножко лишнего сахара, то все эти новые языки должны ухудшать свой язык, чтобы он как-то отличался от предыдущих, и вся эта шизофрения с каждым новым языком уходит всё дальше в тёмные дебри дизайнерских материй, которые мешают нормально программировать, бьют по рукам, ограничивают семантику итд.

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

Программы это просто байты в памяти компьютера. Тут нечего обсуждать. Из палки можно построить идеально ровный треугольник, а из квадрата уже нельзя. Поэтому чем ниже язык, тем больше возможностей. Люди рассказывают сказки, якобы high-level язык может дать огромный буст в скорости разработки. Это сказки, потому что опытный программист реализует нужные ему концепции с помощью отдельной программы-метаязыка. Чем больше в языке концепций, тем сложнее сделать умный компилятор для этого языка. Поэтому чем проще, тем лучше. High-level язык даёт одно преимущество - портабельность, и тут у C нет конкурентов. Зачем что-то ещё для программирования(не скриптования)?

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

Поэтому чем ниже язык, тем больше возможностей

отстрелить себе яйца.

опытный программист реализует нужные ему концепции

За это время конкуренты выкатят готовый продукт (кривой убогий, но готовый). Контора разорится, и опытный пограмист вылетит на мороз.

anonymous
()

С++

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

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