Переход с Java на С++

Я занимаюсь разработкой приложений на основе С# (.net) и Java (J2EE) в течение последних 3 лет.

Но теперь я чувствую, что Java, С# делает вас хромым (с точки зрения обучения), и вы можете быстро развивать свои приложения, но не понимаете основные базовые концепции программирования.

Итак, я пытаюсь изучить С++, но я нахожу его немного "запутанным" из-за указателя, множественного наследования, некоторых условностей и других понятий С++, которых нет в Java. Итак, что вы предлагаете? Как я должен к этому относиться?

Спасибо

PS: Я студент, так что все время в мире и на самом деле смену.

Ответы

Ответ 1

По-моему, сначала нужно изучить C, чтобы правильно понять базу, на которой построен С++. Возьмите копию "языка программирования C" Кернигана и Ричи, который считается лучшей ссылкой на язык и начинает читать через него. Когда вы полностью поймете C, у вас будет база низкого уровня, в которой вы нуждаетесь.

Ответ 2

С++ не более "базовый и базовый", чем любой другой современный язык программирования. Он имеет модель компьютера (плоское адресное пространство памяти), но ОС и ЦП просто имитируют эту модель, используя множество уровней кеширования и подкачки, поэтому она не "реальна". В результате одна и та же операция может длиться в 1000 раз дольше, чем в другое время.

Кроме того, современный С++ имеет множество мощных абстракций, которые не имеют более прямой связи с тем, как работает компьютер, чем абстракции, предоставляемые в Java и С#. OP упоминает множественное наследование - явно не более элементарное, чем наследование на других языках OO. Многие другие функции С++, опущенные из Java, представляют собой абстракции высокого уровня (или позволяют создавать их), и поэтому в некоторых случаях Java является языком более низкого уровня. В Java значение символов оператора всегда одно и то же, тогда как в С++ простой == может создать объект, который позже будет использоваться для генерации выражения SQL вместо того, чтобы выполняться в процессе.

Время работы JVM и CLR (почти наверняка) написано на C и/или С++, поэтому в этом смысле очевидно, что сегодня они формируют слои. Но на уровне C/С++ вы по-прежнему будете работать в абстракции, которая не "как работает машина", поэтому вы действительно будете просто изучать другой набор абстракций, а не "реальность". И ОС (или, действительно, аппаратный чип) может быть спроектирован специально, так что JVM или CLR, такие как runtimes, являются нативным низкоуровневым уровнем системы; на такой системе будет работать среда выполнения C/С++, для которой требуется работать "высокий уровень" (дорогой) уровень эмуляции.

Поэтому, вероятно, не стоит пытаться научиться программировать в "реальности". В наши дни никто не делает этого; это пустая трата времени. Вам лучше узнать, как программирование абстракций помогает вам писать правильные программы. Если язык затрудняет жизнь, это не доказывает, что вы делаете "реальную вещь". Это просто означает, что вы выбрали неправильный язык для того, что вы пытаетесь сделать.

Ответ 3

Я не согласен с тем, что вам нужно сначала изучить язык C или ассемблера. С++ и C могут быть похожими в теории, но очень различны с точки зрения практического использования. Вряд ли на идиомах С++ почти ничего не получается, используя только C, и, хотя хорошо иметь практический опыт на нескольких языках, это бесполезное упражнение для определения предпосылок в обучении языку. Я думаю, что лучший способ изучить концепции программирования - это сесть с тем, кто их хорошо понимает и просто говорить об этом, будь то StackOverflow, на форумах или, если вам повезет, лично.

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

Ответ 4

Для изучения С++ я рекомендую читать С++ для программистов Java Марк Аллен Вайс. Это очень помогло мне при переходе с Java на С++, так как очень хорошо выделяет различия между языками.

Ответ 5

Но теперь я чувствую, что Java, С# делает вас хромым (с точки зрения обучения), и вы можете быстро разрабатывать приложения, но не понимаете основные базовые концепции программирования.

Если вы пытаетесь изучить концепции программирования, а не машинной архитектуры, не так много пользы для обучения С++. Я бы предложил пойти с чем-то отличным от Java все вместе. Вариант Lisp, возможно.

Как разработать программы - довольно хорошая книга.

Ответ 6

Если вы хотите понять основные понятия языков программирования, я бы предложил книгу, такую ​​как концепции Джона Митчелла на языках программирования. Следуйте этому, написав несколько парсеров/переводчиков для простых языков. Другими хорошими ресурсами являются SICP, который специфичен для Scheme (диалект LISP) и доступен здесь полностью. После того, как вы изучили несколько языков, не требуется слишком много времени, чтобы забрать синтаксис и семантику нового (основные библиотеки, с другой стороны, могут занять некоторое время, чтобы ознакомиться с ним).

Если вы хотите узнать, как работают компьютеры сегодня, я бы рекомендовал изучать C и читать книги, такие как современные операционные системы Tanenbaum. C полезен в этом контексте в основном для чтения кода уровня системы. Внедрение (очень) простой операционной системы может быть невероятно образованным. Тем не менее, что-то простое, как реализация базовой оболочки (например, оболочки bourne, кроме более простого), вероятно, лучше начать. Я также рекомендую узнать, как работает сеть, поскольку она является неотъемлемой частью современных компьютерных систем.

Ответ 7

C и С++ делают некоторые основные базовые концепции программирования более очевидными, но они не были разработаны Богом. Я бы предпочел изучить фактические низкоуровневые системы за вашим низкоуровневым кодом: операционные системы, компиляторы/среды выполнения (попробуйте "Основы языков программирования" ) и архитектуру машины.

P.S. В общем, может быть лучше изучить С++ самостоятельно, а не начинать с C, но для вашей конкретной цели - более интимно с низкоуровневыми, небезопасными конструкциями, такими как указатели, после изучения Java - я думаю, что это лучше для начала с C (и K & R), где они расположены спереди и в центре.

Ответ 8

Я бы предложил сначала изучить язык ассемблера. Это даст вам очень прочную основу в том, что происходит на низком уровне. Это также поможет укрепить идею о том, что "все действительно просто адрес".

Взятие класса, который фокусируется на языке ассемблера, желательно, поскольку он "заставит" вас изучить его (лично я не думаю, что ASM есть/это/забавно, но это стоило [и требование для окончания] для я возьму класс).

После того, как вы знаете сборку, перейдите к C и С++.

Имейте очень весело!

Ответ 9

Похоже, вы избегаете первой ошибки большинства людей, которая предполагает, что новый язык такой же, как старый. С++ отличается и должен изучаться как новый (-иш) язык.
Ссылка, которую я бы предложил, была бы С++, как программа, которая используется в моем университете для вводных классов С++.

После этого просмотрите предыдущее программное обеспечение Java, которое вы написали, и посмотрите, как вы переводите их на С++. Синтаксис можно легко ссылаться на CPlusPlus.com. При этом важно помнить, что представляет собой весь различный синтаксис, и как он изменяет то, что происходит в программном обеспечении (т.е. Различия между двумя языками). Это дает дополнительное преимущество, позволяя вам увидеть, как базовая архитектура представлена ​​для обоих языков (и для языков программирования в целом). Я не знаю хорошей книги, которая объясняет, как языки программирования работают под обложками, или я бы рекомендовал это.

Если вы, однако, заинтересованы в том, чтобы узнать, как работает программирование, тогда язык Ассамблеи будет хорошим началом. Язык ассемблера для компьютеров на базе Intel - это то, что я использовал для изучения ассемблера, и это было очень полезно.

Ответ 10

Язык сборки.

Начните с Z-80. Затем добавьте 'x86. Затем попробуйте 68000. Затем TI 320 серии DSP. Вы также можете добавить Z-8. Просто посмотреть, как это делают разные машины.

Ответ 12

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

Существует также более низкий уровень вашей виртуальной машины, который, как вам кажется, пока не известен, и который вы, возможно, захотите изучить. Чтобы узнать о внутренних компонентах Java, я бы посоветовал узнать, как программировать JVM на языке Java (Java). Jasmin (http://jasmin.sourceforge.net/) является ссылочным ассемблером/синтаксисом для такого рода программирования. Еще один замечательный ресурс - спецификация Java Language (http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html), которая содержит много внутренних элементов Java. Когда вы изучили C, вы также можете использовать некоторые API более низкого уровня, которые предоставляет JVM (http://java.sun.com/javase/6/docs/technotes/guides/jvmti/), которые позволяют вам получать информацию низкого уровня о запускать JVM и писать интересные вещи, такие как отладчики.

Если вы изучите этот материал и сделаете некоторые взломы самостоятельно, вы узнаете, как работает JVM и что компилятор действительно помещает в ваши файлы классов. Также очень вероятно, что вы обнаружите некоторые новые вещи о языке программирования Java, о которых вы не знали раньше, даже если думаете, что знаете все об этом.

Вы также можете запрограммировать .Net VM в сборке.

Ответ 13

Я думаю, вы должны начать с C, но не в качестве необходимой преамбулы для обучения С++. Скорее, для обучения C. Другими словами, пока вы учите C, приложите свои усилия к изучению языка, чувствуя философию языка и сосредоточившись на том, чтобы позволить ему глотать вашу кожу. Будьте хорошим программистом на C, и вы станете хорошим программистом, период. Не просто хороший программист на C++ - это не имеет никакого отношения к обучению С, но хороший программист.

Есть еще одна причина для обучения C сначала. Это проще, чем С++, намного проще, чем С++, и он хорошо подходит для С++ (в отличие от Java, который не во всех аспектах, а в большинстве поверхностных объектно-ориентированных). Я не говорю о сходстве синтаксиса: я говорю о низкоуровневом программировании. Я говорю о понятиях указателей, которые существуют как сами, так и в виде итераторов в С++. Вы можете передавать функции в C, и вы можете передавать объекты функции в С++. C быстро учится, и он будет очень сильно нагревать вас.

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

Начните с получения книги K & R и пропустите ее. Вы не пожалеете об этом.

Ответ 14

Что бы вы ни начали, мое предложение было бы сбросить полноценные IDE. Используйте хорошие текстовые редакторы (vim/emacs)

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

У вас есть все лучшие ответы выше, в любом случае.:)

  • Ивар

Ответ 15

Изучайте C и С++ одновременно, я говорю из опыта здесь. Очень часто я сталкиваюсь с кодом, который смешивает C и С++, поэтому лучше знать и то, и другое. Возьмите K & R для C (понимайте указатели, заголовочные файлы и распределение и очистку памяти вручную... которые не используются Java!) И любая достойная книга начинающего С++ (я выбрал Prata, но с вашим комфортом). Практикуйте те же примеры, которые производят версии C, С++ последовательно, объектно-ориентированный (OO) стиль, общий/шаблонный стиль и т.д. С++ имеет большую стандартную библиотеку, чем C: шаблоны, контейнеры STL (нет необходимости в указателях, но вы может делать точную настройку указателя, записывая собственный контейнер), потоки (начиная с С++ 11). Вы всегда можете использовать C, если у вас нет выбора (или библиотеки Boost), любой компилятор С++ позволит это.

Если вы пришли из Java, вы уже должны знать концепции OO для С++ и, возможно, некоторые общие программы, как в шаблонах С++. С++ ошибочно считается языком OO, но это больше, чем это. BTW, объекты - это динамическая концепция (runtime), тогда как шаблоны являются статическими (время компиляции), поэтому изучите язык CONCEPTS, а не только синтаксис! После того, как вы изучите концепции, прочитайте книгу Страуструпа (он создал С++), чтобы узнать его философию для лучших правил проектирования для кода на С++.

Изучите новейший стандарт С++ (С++ 11), поскольку он добавляет много нового на язык (auto, nullptr, threads, лямбда-функции, новые контейнеры и т.д.). И последнее, но не менее важное: используйте Doxygen в C/С++ так же, как вы использовали Javadoc... нет ничего хуже, чем недокументированный, нечитаемый код, независимо от того, какой язык вы используете.

Ответ 16

Учись. Он имеет лучшие объекты. И это виртуальная машина. Если вы не хотите, чтобы настоящая машина увидела Green Arrays или Sandpiper/John Rible для этого.

Свободные потоковые интерпретируемые версии находятся по всей сети. Для практики. Когда вы это понимаете, напишите собственную версию Direct Threaded. Или посмотрите Forth Inc и купите его для своей машины или используйте их бесплатную версию Windows.

Java - это гибрид Forth/C, поэтому, если вы хотите перейти на Java, у вас появятся некоторые вещи под вашим поясом.

Образование:

Начало Форт - Броди Мышление Forth - Brodie

Вторая отличная для любого языка, потому что это лучшая книга по факторингу, которую я знаю. Бесплатные версии обоих в сети.

Если вы хотите сделать аппаратное обеспечение /FPGA Forth Stack Machines: The New Wave by Koopman

Все вышеперечисленные книги бесплатны в сети.