Подтвердить что ты не робот

Программист С++, стремящийся расширить перспективы

Я программировал С++ уже около 5 лет, и теперь я понимаю ценность знания того, как думать "по-другому".

Этот вопрос предназначен для программистов на С++, которые опробовали другие языки программирования и наткнулись на такие моменты, как:

  • "Whaoo..Это ооочень круто! Я не знал, что могу так программировать".
  • "Ого, я никогда не думал, что проблема дизайна может быть решена именно так!"

Итак, какой язык сделал это для вас? Я ищу максимальный эффект, поэтому я не думаю, что Java будет соответствовать законопроекту. = p Я открыт для любых предложений, хотя!

Отказ от ответственности: я задаю этот вопрос прежде всего потому, что хочу расширить свой разум. Здесь нет намерения начать любую языковую языковую языковую технику!

4b9b3361

Ответ 1

Я, наверное, в глубине души, в основном программист на С++, потому что я использовал его так, чтобы вы могли найти мой интерес.

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

  • Atari Basic - Cool Я могу сделать свой компьютер практически чем угодно, но я продолжаю работать в моем 8k-диапазоне памяти (или у меня заканчиваются номера строк)!
  • Логотип - нет номеров строк. Я могу наращивать и запускать мои программы (позже я увидел это в Lisp, схеме и форте)
  • Pascal - он просто как Basic, но с большей функциональностью (и без номеров строк).
  • C - Итак, какие указатели (теперь я понимаю, заглядываю и выкапываю).
  • Ассамблея - Ах, почему C спроектирован так, как есть. Я мог бы просто использовать C вместо сборки.
  • С++ - Объекты - отличный способ структурировать мою программу в логические фрагменты
  • BASH - Программирование с потоком (фильтры, источники и приемники) может быть очень мощным
  • PostScript - Шрифты - это программы! Основанное на стеках программирование - очень сильная парадигма.
  • Prolog - Таким образом, вы можете просто написать кучу ограничений и заставить компьютер самостоятельно выработать ответ. Но, черт возьми, трудно понять, какие ограничения заставить его делать то, что я хочу!
  • Perl - Не важно, знают ли люди все правила. Я думаю, что некоторые языки предназначены для того, чтобы их было легче писать, чем читать.
  • SQL - удобный способ запроса данных. Это напоминает мне Пролог. (позже это напоминает мне функциональное программирование).
  • Lisp - Поэтому вам не нужно ручное управление памятью, чтобы сделать связанные списки! (Заметьте, что я не потратил достаточно времени на Lisp. После этого с ним можно было изучить многие последующие уроки.)
  • Object Pascal - Cool, Pascal также может иметь объекты.
  • Modula-2 - Странно, это выглядит как Паскаль.
  • Simula-67 - Хммм... так откуда взялись объектно-ориентированные языки?
  • Java - Все может быть объектом (позже я узнал, что еще больше вещей могут быть объектами, см. ниже Smalltalk), а код можно компилировать-один раз и запускать на разных платформах. Другие эпифайны, которые у меня были, были интерфейсами - отличный способ создать программное обеспечение и сбор мусора действительно мощный.
  • Delphi - Вау, библиотеки GUI могут быть просты в использовании. События - это удивительная абстракция.
  • С++ templates - Написание кода во время компиляции чрезвычайно мощное (см. Схему и Lisp).
  • Функторы и связки С++ - Передача функций в функции является мощной, но синтаксис ужасен. (На самом деле это был мой первый реальный опыт функционального программирования, большинство языков, очевидно, делают это лучше).
  • JavaScript - Прототипы и функции eval действительно мощные.
  • XSLT - Я не могу поверить, что это Тьюринг закончен. Должно быть, это происходит, когда академики идут плохо.
  • Eiffel - Контракты - отличный способ выразить дизайнерские предположения и требования.
  • AspectJ - Многогранные проблемы имеют прекрасный смысл, и это правда, что их трудно выразить в других OOPL. Но определить их по имени функции кажется взломом?
  • Scala - Поля и методы одинаковы. Функции более высокого порядка могут быть простыми для записи. Компилятор может угадать тип простых выражений (но не шаблонов). Код объекта может быть намного проще. Согласование шаблонов является аккуратным, но когда я их использую? Черты и микширование даже лучше, чем интерфейсы.
  • С# - это как Delphi, смешанный с С++ и Scala. Я могу отражать все во время выполнения и даже легко испускать код.
  • D - Таким образом, похоже на то, что он сочетает модульное тестирование с дизайном по контракту и множество других вещей, сохраняя менталитет С++.
  • Smalltalk - на самом деле это не изучалось, но программисты Smalltalk указали мне примерно в это время, что в Smalltalk все действительно было объектом (без необходимости бокса/распаковки), включая блоки кода.
  • LINQ - SQL - это просто функциональное программирование.
  • Lua - Все может быть таблицей! Звучит как JavaScript, но его проще встраивать.
  • ML - Когда вы используете только шаблоны, вы можете написать много кода намного проще.
  • Исчисление лямбды - Итак, здесь Lisp и функциональное программирование произошло от.
  • Схема - Генерирование кода во время компиляции может быть очень простым. Это действительно легко расширить. Цифровая обработка может быть выполнена очень хорошо. Функции, поддерживающие состояние, являются мощными. Продолжения аккуратные, но мне все равно.
  • Фринк - Я никогда не понимал, что единицы измерения могут быть настолько сложными.
  • Радость - Это самый короткий код, который я когда-либо видел. Это самый недооцененный язык.
  • Комбинирующая логика (SKI-Calculus) - вам не нужны аргументы, но вместо этого можно использовать комбинаторы. Это для Радости, что лямбда-исчисление Lisp.
  • Haskell - Мне жаль, что я не смог скомпилировать свой код. Стандартная прелюдия Haskell, должна стать одной из самых элегантных библиотек, которые я когда-либо видел.
  • Фактор - Там так много классных вещей, мне просто жаль, что я не мог бы изучить синтаксис.
  • K - Массивные (векторные) примитивные операции чрезвычайно мощные.
  • Forth - Это похоже на сверхмощную сборку высокого уровня. Однако есть чему поучиться.
  • Python - это действительно читаемый материал. Это похоже на сочетание множества других языков.
  • Erlang - Выражение программ в качестве актеров - отличный способ выразить parallelism.
  • Исполняемый UML - Асинхронная передача сообщений - отличный способ выразить параллельные алгоритмы без необходимости думать о потоках.
  • Ruby - Системы сборки (Rake) могут быть написаны на реальном языке программирования. Кодовые блоки также могут быть данными (хорошо технически я узнал, что с Scala).

Итак, конечно, этот список намного длиннее, чем вы (или кто-либо еще), вероятно, захотите. Для максимального эффекта моим кратким списком будет: Scheme (или Lisp), Joy (или PostScript), Erlang, Eiffel, AspectJ, Erlang, ML и Haskell. Если вы хотите сосредоточиться на нескольких языках и готовы вдаваться в них на большой глубине, вы можете получить много удовольствия от освоения Scala или С#. Конечно, возможно, еще кое-что, что вы могли бы узнать из С++ 0x, особенно если вы немного нажмете и немного подталкиваете его.

Ответ 2

Python дал мне "такую ​​крутую" реакцию

Ответ 3

Для чего-то действительно другого, попробуйте Lisp или схему.

Ответ 4

Конечно, Haskell, но на самом деле все из них действительно изменили мои перспективы:

Я начал в GWBasic несколько лет назад, будучи ребенком, поэтому я естественным образом относился к процедурным языкам.

Моя карьера началась в С++, и это основа, из которой я строю.

  • JavaScript - Ввел меня в функции первого класса, замыкания, динамическую типизацию.
  • Python - познакомил меня с более простым синтаксисом и динамическими языками в целом.
  • SQL - познакомил меня с языками, которые "есть" против языков, которые "делают", код "есть" ответ.
  • Lua - минимализм и использование простых структур данных (таблиц) для основы всех структур данных.
  • С# - мой новый хлеб и масло... Преимущества сборки мусора, встроенные библиотеки и т.д.
  • C - У меня есть сила!

Ответ 5

Я заставлю Lisp/Scheme, а также предложить Haskell как язык, который бросит вызов тому, как вы думаете программирование. Книга O'Reilly "Real World Haskell" - это прагматичное введение, хорошо иллюстрированное конкретными вариантами использования.

Ответ 6

В целом "Whaoo..это круто!" Я не знал, что могу так программировать ". откровение пришло ко мне, когда я впервые узнал функциональное программирование. В моем случае это произошло благодаря моим исследованиям в Tcl/Tk, который является мультипарадигмой, но я полагаю, что вы можете получить тот же эффект от любой из сильно функциональных языков (например, Lisp или схема).

Ответ 7

Assembly (который я узнал до С++ и использовал для написания обработчиков прерываний TSR в DOS): мне понравилось иметь иллюзию того, что на самом деле делает машина.

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

Ответ 8

Python может быть ответом.
Он может улучшить ваш образ мышления и дизайна на С++ и научить вас новым идеям и методологиям, таким как функциональное программирование.
Утиная печать может показаться странной и проблематичной сначала, но она имеет свои преимущества.
И вы можете использовать его даже для продуктивных целей

Другой вариант - попытаться написать "hello world" в brain fu_k. Возможно, это не лучшее использование для вашего времени, но после этого вы никогда не будете пытаться "расширить перспективы":)

Ответ 9

Пролог является обязательным. Любой другой язык другой парадигмы был бы хорошим началом. Пролог имеет логическую парадигму. Еще один отличный, но очень отличный язык - это Scheme. Это семейство функциональных языков.

Вот несколько примеров валидатора Palindrome.

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

Схема факториала


 (define (fact n)
    (if (= n 0)
        1
        (* n (fact (- n 1)))))

Пролог факториал


factorial(0,1). 

factorial(N,F) :-  
   N>0, 
   N1 is N-1, 
   factorial(N1,F1), 
   F is N * F1.

И мои оригинальные примеры:

Пролог:


:- set_prolog_flag(toplevel_print_options, [quoted(true), portray(true), max_depth(0), attributes(portray)]).


readline(Line) :-
 get0(Ch),
 readline(Ch, Line),
 !.

readline(10, []).

readline(Ch, [LowerCasedCh | RestOfLine]) :-
 is_alpha(Ch),
 name(N, [Ch]),
 downcase_atom(N, LowerCasedN),    
        %Drops element down to lowercase
 name( LowerCasedN, [LowerCasedCh]),
 get0(NextCh ),
 readline(NextCh, RestOfLine).

%Character Trimming

readline(Ch, RestOfLine) :-
 \+is_alpha(Ch),
 get0(NextCh ),
 readline(NextCh, RestOfLine).



palindrome:-
 readline(List),
 sarahPalindrome(List).


sarahPalindrome(List):-
 reverse( List, ReversedList),
 List = ReversedList.
 

Здесь решение в схеме для той же задачи!


(define palindrome
  (lambda (x)
     (equal? (filter-non-char-alpha (reverse (string->list x))) (filter-non-char-alpha (string->list x))
    )
  )
)
(define filter-non-char-alpha
  (lambda (x)  
        (if (equal? x '()) #t 
                    (if (char-alphabetic? (car x)) 
                        (cons (char-downcase (car x)) (filter-non-char-alpha (cdr x)))
                        (filter-non-char-alpha (cdr x)) 
                    )
        )
   )
)

Ответ 10

Я бы попробовал как Scheme (или Lisp), так и Python в этом порядке. Схема будет деформировать ваш ум в положительном ключе (это было для меня), а затем перейти на Python, где вы будете (квази), чтобы собрать свои С++ и новые функциональные знания. Я обещаю, что вы получите большой заряд.

Ответ 11

Недавнее "Это так здорово!" для меня было Scala. Он отлично сочетает функциональное программирование, объекты и потоки, и все это работает в JVM.

Для меня это была первая действительно крутая вещь, которую я видел, это была связанная с Java.:)

О, хорошо, это было второе. Первым был обратимый отладчик, который я забыл имя, но он позволяет запускать виртуальную машину "назад", чтобы найти ошибку.

Ответ 12

Я второй Python и Ruby тоже.

Перечитайте шаблоны проектирования... затем изучите Python и реализуйте довольно много шаблонов проектирования, фактически остановитесь, пытаясь исправить дефектный язык, например С++.

Когда классы являются объектами первого класса, например, шаблон Factory становится устаревшим. Просто передайте класс, это, в конце концов, экземпляр factory. Python classmethods также является чрезвычайно мощным инструментом, и наследование работает.

Многие шаблоны проектирования являются обходными способами для языков, которым не хватает закрытий, встроенных делегатов и т.д.

Например, в Javascript:

button.onclick = function() {some code}

Простая, элегантная и мощная... на С++ у вас будет гораздо больше работы!

Ответ 13

Я запрограммировал в Pascal, Delphi, Assembly, C, С++, Scheme, Lisp, Java, С# и CUDA.

С# - ответ - вы можете писать чрезвычайно динамические программы с использованием отражения, а WPF действительно размещает С# на краю.

Ответ 14

Во-первых, хорошо, что вы хотите сделать что-то другое! Если вы это сделаете, это отличная возможность попробовать что-то, что работает совершенно по-другому, хотя бы для того, чтобы расширить ваше понимание того, как все работает. Я бы откликнул комментарии ManicMailman о Prolog, что очень отличается от подхода Pascal/C/Java. Я бы также предложил две другие идеи.

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

Кроме того, если вы готовы к чему-то очень отличающемуся от того, к чему привыкли, вам следует рассмотреть функциональный язык программирования. Я лично не очень разбираюсь в них, но я понимаю, что Lisp и Haskell имеют своих поклонников.

Наконец, вы предполагали, что переход на новый язык программирования - это путь вперед. Если вы даже умеренно академически настроены, вы можете обнаружить, что чтение данных и алгоритмов может серьезно улучшить то, как вы понимаете и решаете компьютерные проблемы. Одним из стандартных текстов является Sedgewick Алгоритмы в C, хотя, на мой взгляд, Knuth Искусство компьютерного программирования является лучшим в этой области.

Удачи!: -)

Ответ 15

Ruby должен быть тем, что заставляет меня сказать "Прохладный взгляд, как вы можете это сделать" больше всего. Но я снова нашел новую привязанность к JavaScript.

Ответ 16

Я разместил выше:

For instance, in Javascript :
button.onclick = function(){ some code }

И получил этот комментарий:

этот пример button.onclick был определенно круто. и это выглядит очень интуитивно. благодарю! - ShaChris23

Я нахожу это очень интересным.

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

ShaChris23 думает, как программист на C, обнаруживающий JavaScript: это "круто". Что является правдой! Но программист JavaScript, открывающий С++, подумает об обратном, например, "как грубо говоря, я даже не могу добавить метод в класс во время выполнения!" и он тоже будет прав.

Например, вы бы использовали шаблон Factory, когда программист Python просто поместил класс в переменную и передал его. Тот, кто никогда не узнал ничего, кроме С++, не будет мечтать об этом!

Например, в Python я написал планировщик времени, который был вызван как:

task_handle = scheduler.execute_at (время, функция)

Использование замыкания для "функции" делает это чрезвычайно мощным. Те, кто не знает концепции "закрытия", не могут думать об этом.

Изучение новых языков, даже изучение основных понятий, сделает вас лучшим программистом на всех языках, потому что это расширит вашу перспективу.

Даже если вы никогда не используете его, узнайте Lisp...

JavaScript тоже хорош, у него есть сильные функциональные прог-гены!

Я бы хотел, чтобы КАЖДЫЙ узнал хотя бы Python.

Тогда никто никогда не напишет обработанную ошибками текстовую манипуляцию в C, lol.

Ответ 17

С++ делает "whaoo" все время.. и каждые несколько лет или около того в невероятных приложениях.

Если бы мне пришлось выбирать что-то другое, что было неправильно понято и легко истолковано, но невероятно в выражении, то легко: JavaScript.

Следующий ведущий и полезный индикатор снова явно является фаворитом Google, Python, но они движутся в два выше с более быстрым темпом, чем когда-либо раньше. Go figure.

Ответ 18

Я бы порекомендовал J (jsoftware.com), как всегда. Он отличается от большинства других языков тем, что он символичен (хотя символы все отображаются в ASCII) и функционально. Что еще более важно, он динамичен, интерактивен и имеет много встроенных концепций высокого уровня.

Например, беря кий из одного из других сообщений здесь, факториал в J равен:

   !10
3628800

для, например. factorial 10. Расширение этого, чтобы оценить количество 10 вещей, взятых по 5 за раз:

   5!10
252

Массивы являются объектами первого класса, поэтому факториал 5, 10 и 15:

   !5 10 15
120 3628800 1.3076744e12

и количество способов сделать 3 вещи из 6, 8 и 10 вещей:

   3!6 8 10
20 56 120

Проверка палиндрома может быть записана

   palincheck=: 3 : '(]-:|.)tolower y-.'' '''

Это соответствует (-:) против "флип" (|.) аргумент с нижним овалом без (-.) любых пробелов. Применяем это к трем аргументам и возвращаем "1" для true и "0" для false:

   palincheck&>'Able was I ere I saw Elba';'Step on no pets';'Not palindrome'
1 1 0

Первоначально трудно привыкнуть к программированию так кратко на таком продвинутом уровне, но вы можете обнаружить, что он растет на вас, особенно если вам нравится быстро пробовать идеи.