
Нет, это не эмоциональный срыв. Однако, если вы пришли сюда просто чтобы сказать несколько приятных слов ободрения, все равно говорите их. Не то чтобы они мне нужны, у меня просто есть друг ...
На самом деле я здесь, чтобы поговорить о выборе между языками программирования более низкого уровня (C ++, C) и языками программирования более высокого уровня (Java) при рассмотрении новой концепции случайной информатики.
Для обсуждения предположим, что у вас есть задание, и вы должны выбрать между двумя вариантами, указанными выше. Я планирую поделиться с вами цепочкой своих мыслей и тем, почему я решил пойти якобы более простым путем, хотя мне нравится C / C ++.
Вы сделали свой выбор? Тогда приступим ...
Уровень абстракции языка программирования обычно связан с количеством шагов от процессора, на котором он работает. Ассемблер известен своей низкоуровневостью. Если вы пишете что-то на ассемблере, это означает, что вы разговариваете напрямую с процессором, буквально передавая ему инструкции по одной, точно так, как он понимает. Однако, если вы, например, используете Java, между включением виртуальной машины и до тех пор, пока ваш код не будет окончательно скомпилирован и выполнен как машинный код, нужно пройти множество шагов.

Насколько я могу стать ниже?
Я задумался об этом после того, как прошел первый курс по 3D-программированию с использованием OpenGL в аспирантуре по разработке игр. OpenGL - это многоплатформенная спецификация для определения графики. Мы даже не ушли очень далеко, на самом деле всего два класса, если быть точным, и я уже увлекся тонкостями ручной обработки 3D-графики.
Из того факта, что это универсальный API, не зависящий от платформы, для связи с графическим процессором нетрудно сделать вывод, что он должен быть несколько низкоуровневым. Спецификация в основном ориентирована на C и C ++ с многочисленными портами для других языков. Отсутствие контекста на стороне API в сочетании с постоянным беспокойством о узких местах связи CPU с GPU также не способствует дружелюбию API. На нашем первом занятии по 3D-программированию нам потребовалось несколько тяжелых часов, чтобы понять концепции рисования простейшей из фигур - треугольника.

Чтобы иметь возможность только делать вышеупомянутое, вы должны быть знакомы со многими терминами: массивы вершин, буферы массивов, вершинный шейдер, фрагментный шейдер, GLSL ... После того, как вы закончите, это определенно похоже на добавление новой строки кода поставит под угрозу всю систему.
Для разработки мы используем реализацию Java, которая, по крайней мере, ослепляет нас от всей этой компиляции, компоновки, зависящей от платформы теневой (каламбурной) вещи. Кроме того, библиотека JOML поможет с математическими концепциями, такими как составные матрицы преобразования.
После введения в класс у моего маленького «Я хочу сделать это с нуля, маленький мой мозг» начала приходить в голову идея:
Насколько я могу стать ниже?
Для компьютерных фанатов не редкость неконтролируемая воля стремиться к более низким уровням. Мысль о том, чтобы спуститься дальше в иерархию абстракции и получить доступ к таким необработанным вещам, как он есть, всегда сияет в глазах тех, кто хвалит за дополнительную задачу. Это чувство незаслуженного достижения возникает, когда вы кодируете что-то, что не было полностью реализовано вами.
Насколько я могу стать ниже?
Первое, о чем я подумал, - это избавиться от вспомогательной математической библиотеки. Я мог бы использовать дополнительные знания по 3D-геометрии, так что все равно не помешало бы выучить ее принудительно. Кроме того, Java слишком добрая, вся эта автоматическая обработка памяти делает вас мягкими. Я бы лучше со всем справился сам и выбрал C ++. Хотя выбор C ++ довольно удобен. Он объектно-ориентированный, поэтому вы получаете всю эту парадигму поведения, диспетчеризацию динамических функций, иерархии и т. Д., Происходящие бесплатно. Нет, мне не нужна такая помощь.
Давайте погрузимся глубже.
В свете старых добрых времен я мог использовать язык C. Давайте поиграемся со структурами, магией препроцессора, mallocs и frees. Я даже, возможно, напишу некоторые детали в сборке, чтобы убедиться, что компьютер делает именно то, что ему говорят.
Но опять же, зачем останавливаться сейчас?
Так я только на столько способен? Нет! Давайте займемся ассемблерным кодом, вроде того, который там выгравирован, может быть, еще лучше. Я собираюсь создать прототип своего собственного графического процессора и заставить его реализовать спецификацию OpenGL, а затем я буду готов писать код. Ха, в конце концов, это было не так уж сложно, я рад, что мы разобрались с этим.
Я, может быть, даже построю компьютер, на котором спроектирую свой собственный графический процессор. Возможно, я захочу узнать, как развести огонь, пока я на нем.
Думаю, становится довольно ясно, что основная цель класса давно потеряна. Я должен был изучать 3D-программирование с OpenGL. Это все равно, что пойти на кулинарный урок для новичков, и вас попросят вычистить себе еду, прежде чем научиться ее готовить. Я не говорю, что это не важно, это просто бессмысленно.
Поворотный момент на самом деле случился, когда я не мог понять, спускаться ли вниз на ступеньку ниже или просто спускаться до упора. Итак, я решил, что вместо того, чтобы раздвигать границы, я буду увеличивать цели.

Я имею в виду, что люди уже какое-то время рисуют фигуры на экране, верно? Зачем усложнять мне жизнь?
Я подумал, что застревать при попытке настроить среду разработки не стоит, поэтому я принял Java. Вместо того, чтобы писать свою собственную математическую библиотеку, я решил научиться ее использовать и, наконец, посмотреть, что некоторые неортодоксальные векторные операции сделают для меня. Вместо того, чтобы тратить время на что-либо еще, я решил сосредоточиться на простом изучении 3D-программирования с помощью OpenGL.
Не зацикливайтесь на самом языке. В конце концов, это всего лишь инструмент!
Я полностью удовлетворен таким подходом, так как наконец-то могу уделять время предметам, которые важны для класса. Я все настроен и готов к работе, однако мое любопытство все еще вызывает вопрос:
Насколько низко вы готовы попасть?
