LINUX.ORG.RU

А куда, если не в веб?

 , ,


3

4

Хай, Лор. Давно сюда не писал, многое поменялось, многое перепробовал.

Но вот незадача - присутствует чувство, что всё идёт сейчас в веб. Я уже было смирился с этой мыслью, но тут начинается…Чертов фронтенд. Вот не нравится мне размечать документы и объяснять машине по полчаса, почему и какая кнопка, где должна находиться.

Хотелось бы такую отрасль, в которой я бы смог набивать руку на фрилансе, но чтобы это не было связано с этим визуальным рукоблудием.

Подскажите, есть ли истории успеха? Что-то алгоритмическое/техническое? Буду рад всем отписавшимся по вопросу.

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

Каких, и какое отношение они имеют в разговору?

я даже 5 доп методов оптимизации(кроме вашего) этого кода насчитал… а вот какие они - попробуйте ответить сами.

а какое отношение это имеет? вы же сами сказали, что оптимизация ненужна, потому вы вынесли выражение из цикла и на этом оптимизация закончилась. а она вовсе не закончилась. вот и ищите сами.

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

Так, хорошо, у нас есть read-only MM IO. Как ты собираешь его оптимизировать?

ты не догоняешь для чего нужен volatile - он нужен чтобы указать компилятору не оптимизировать

#define readl(a)   (*(unsigned int *)(a))
#define vreadl(a)  (*(volatile unsigned int *)(a))

#define IRQ_STATUS 0x4000

int irq_poll(void)
{
	unsigned int i;

	for (i = 0; i < 1000; i++) {
		if (readl(IRQ_STATUS))
			return 1;
	}
	return 0;
}

int virq_poll(void)
{
	unsigned int i;

	for (i = 0; i < 1000; i++) {
		if (vreadl(IRQ_STATUS))
			return 1;
	}
	return 0;
}

gcc -O3 -S 1.c

без указания компилятору что переменная по адресу 0x4000 может измениться он просто выкинул цикл ожидания

irq_poll:
.LFB0:
        .cfi_startproc
        movl    16384, %edx
        xorl    %eax, %eax
        testl   %edx, %edx
        setne   %al
        ret
        .cfi_endproc
...

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

virq_poll:
.LFB1:
        .cfi_startproc
        movl    $1000, %eax
        jmp     .L5
        .p2align 4,,10
        .p2align 3
.L9:
        subl    $1, %eax
        je      .L8
.L5:
        movl    16384, %edx
        testl   %edx, %edx
        je      .L9
        movl    $1, %eax
        ret
        .p2align 4,,10
        .p2align 3
.L8:
        xorl    %eax, %eax
        ret
        .cfi_endproc
anonymous ()
Ответ на: комментарий от alysnix

я даже 5 доп методов оптимизации(кроме вашего) этого кода насчитал… а вот какие они - попробуйте ответить сами

Здесь основная оптимизация - инлайн, который может привести к оправданности разворачивания цикла, а также на некоторых платформах есть смысл упрощать инкремент (но не на x86). Еще обработка блоками машинных слов имеет смысл, если массив items маленький, но такой сценарий здесь не имеет смысла, потому что тогда можно было бы просто передавать аргумент по значению. После инлайна внутренней функции могут появляться новые варианты, но мой вопрос остается прежним: какое отношение они имеют в разговору?

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

ты не догоняешь для чего нужен volatile - он нужен чтобы указать компилятору не оптимизировать

Ну здрасти, очередной вернулся с википедии, и рассказывает мне, для чего НА САМОМ ДЕЛЕ нужен volatile.

без указания компилятору что переменная по адресу 0x4000 может измениться он просто выкинул цикл ожидания

Это некорректная оптимизация. Как я отвечал в прошлом треде: давайте просто выкидывать случайные инструкции из программы, ведь меньше инструкций — быстрее выполнение. Всё гениальное — просто.

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

Без RAII то куда уж проще, ага

Установил себе nighty pascal отсюда: https://sourceforge.net/projects/lazarus-snapshots/files/

Теперь у меня в pascal есть RAII:

program Test;

{$mode delphi}

type
  TMyRAII = record
    i: int32;
    class operator finalize(var o: TMyRAII);
  end;

  class operator TMyRAII.finalize(var o: TMyRAII);
  begin
    writeln('Destructor for TMyRAII: ', o.i);
  end;

var
  res: TMyRAII;

begin
  res.i := 42;
  writeln('Working...');
end.   

https://i.imgur.com/wJTBcSY.png

https://wiki.freepascal.org/management_operators

C++ деструктор

Finalize

Finalize is called when a record goes out of scope.

It is useful for automatic custom finalization code.

C++ конструктор по-умолчанию.

Initialize

The initialize operator is called directly after stack (or heap) memory allocation for a record happens.

It allows for custom automatic initialization code.

fsb4000 ★★★ ()

Есть большие заказы, где разделение, можно писать чисто бэкенд. Есть спрос на боты и парсеры. Иногда попадаются задачи по ИИ, но очень редко. Бэкенд под мобильные приложения - чаще. На темах, связанных с криптой, тоже почти никакого фронтенда. Всякие там торговые боты и прочее. Плагины под CMS, разные допиливания, дебаггинг - тоже почти никакого фронта.

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

Его же на Денди не запустишь :) И скорость вызывает сомнения. Есть определённые компиляторы языков высокого уровня для старых приставок, но они зачастую больше на RPG Maker похоже.

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

Перлы обычно читают и сразу забывают, но чтобы учить их…

Я учу перл 6 - раку. Давай учить с тобой вместе, ты вроде умный мальчонка. У меня книжка есть, будем читать и проверять друг за другом.

anonymous ()

Просто тут спрошу...

Возможно ли найти работу/работать программистом, имея среднее образование, но не связанное с программированием ?

vamo956 ()

вот реально хотел почитать тред, но невозможно ничего понять. На хабре каменты читать легко, например. Когда новый дизайн завезуд?

anonymous ()