![]() |
Why to use LV/C++/C?
Hey guys,
The text in the middle is quite insignificant for the topic and I decided to keep it 'cause maybe someone would like to comment about. But if not, so you can just skip it all and go down to the rest of the topic. If you really want to read it, just mark the text area. I'll be the veteran of the programming team this year. I'll be helping out the younger sub-team members while they do all the hard working, and I'll help fix major errors in critical times. I've been programming with C for the past two years and I've taken courses of C and C++ way before FIRST, so when it comes to the point of this year's decision of which programming language to use (Labview, C or C++) I'll with no doubt chose C/C++ over Labview, since writing raw code is more appealing and more challenging to me and it is quite clearer for me to understand the logic of the algorithim than in LV. Right now, the only programming invorment that is available to us is MPLab and Labview. Since we're looking ahead towards 2009, we're looking only at Labview. The younger members have taken it to themselves to learn programming Labview (and they've done it splendidly, they're (almost) literaly masters in it) and they taught the rest of us the basic use of LV. I still felt a bit intimidated by the use of Visual blocks to draw a flowchart. Now, I have nothing to use right now, to show them that writing in C++ is probablly better than using LV (except of explaining the genreal uses of principals of C++ [Object Orianted Programming,....and other stuff.] that can be used for programming the robot). I don't have any way to show that to them, not untill a default code + instructions to use Windriver's Workbench are released. So, what I'd like to do is start a discussion ('cause I'm quite sure this hasn't been done "formaly" before) about the pro's and con's of using Labview and C++ for programming the robot this year. |
Re: Why to use LV/C++/C?
I think the goal is that they are functionally equivalent, that is, they both have the same capabilities and efficiency. I believe the reason for that goal is to allow the programmer(s) to choose which one they prefer to use. Some of us are more comfortable using text based languages rather than flowchart like programming languages.
I think the list of pros and cons will be too programmer specific. Similar to why some people like c++ and others like java. For some people one works and is more efficient for others it is the opposite. Personally I like LV because I don't know c++. But if our programmers decide they want to use c++ because they feel more comfortable in it that is fine for them. |
Re: Why to use LV/C++/C?
The discussion of which language to use for **** has been repeated many times, in many ways. However, it's useful to have the discussion here with LabView and C++ as the subjects.
Most discussions boil down to one point: Use the language with which you are most comfortable. LabView can do anything that can be done in C++, and vice-versa. For a less experienced programmer, LabView's graphical interface may be easier to develop into complex structures, but that really depends on the person - some people are not wired for graphical interfaces and prefer text. Both are very common in industry, so learning one or the other isn't particularly useless. Learning both is good, too. C++ is far more common, but not many engineers would have much need to be other than familiar in passing, whereas LabView is really used heavily in engineering, since it interfaces with so much instrumentation. Of course, if you're not planning to be an engineer, this is moot. I know and use both, albeit for widely different kinds of tasks. For FRC, my personal choice is LabView, as Ii find it better suited to the task-oriented nature of robot programming. Again, this is my personal preference; yours may differ :cool: |
Re: Why to use LV/C++/C?
Our team is struggling with the question ourselves. While we want to use C++, we understand that LabView has some strengths that we would like to take advantage of. We be believe it will be easier to do our vision programming as well as interfacing our sensors with LabView. We hope to then using LabView's external code capabilities to interface the stuff LabView's doing with our C++ code.
|
Re: Why to use LV/C++/C?
Our team is going with LabView because it is what our mentor uses at work, and students learn it if they are in the engineering academy.
|
Re: Why to use LV/C++/C?
One of the main reasons we will be using C/C++ is that it requires less overhead and setup. LabVIEW is a fairly large and resource-intensive program, and based on past experience (with the CMUCam) we think that it would be more of a hassle to install and get running on every computer we want to program on (whereas all you really need for C/C++ is a text editor).
Given that we have mentors and students who are already familiar with C/C++, and that all indication to date has been that the control system will have the same functionality either way, there just isn't enough incentive for us to switch. |
Re: Why to use LV/C++/C?
Quick question to everyone, does labview have the same amount of power as C/C++ and how long does it to make code on labview then on C/C++ IDE.
|
Re: Why to use LV/C++/C?
Depends how fast you write (C/C++) and how fast you click, drag and type (Labview). :D
But really, it all depends on how easier it is to you in think about the code in each IDE's enviorment (text-written or graphical presentation). Now that you mention the point of speed, it doesn't matter how fast you can create blocks or code, but what matters is how easy it is to find solutions to algorithim problems in each enviorment, because no matter how smart you are, most of the chances are that you will encouter bugs in your code (or the robot will respond unexpectidly) and you'll want to be able to figure out that problem using the best debuging tools out there. |
Re: Why to use LV/C++/C?
Our team will be using C++ for all of the reasons that have been mentioned already. While I will admit I haven't worked with LabVIEW, I personally prefer writing raw code as opposed to designing a program using a graphical interface. I have also already created some data structure classes in C++ that I hope to implement this year. Our code team is also fairly well-versed in C++ and I look forward to showing it to the new members of the code team.
|
Re: Why to use LV/C++/C?
There are so many ways to do the comparison. Years ago I read a book on comparing languages, and I thought their system was a pretty good one.
My disclaimer -- I work for NI, on LV. That means I'm a C/C++ programmer, and I also program in LV. My opinion is that they both have their strengths, and that is as it should be. In Atlanta, the question came up, "What is the most important language for the kids to learn?" There are many answers this, but my favorite answer is that the most important computer language for you to learn is your second one. Learning a language gives you a logic tool. You begin to look at problems from the perspective of that tool. It is the "If you are holding a hammer, everything looks like a nail" psychology. Learning a second language, especially one that is considerably different, results in having a second perspective, and learning the tradeoffs and interplay. Hopefully the second language also opens the eyes to the possibility of other language features, perhaps ones that haven't even been invented yet. To keep with my analogy, learning about other fasteners such as screws, bolts, clips, adhesives, etc. really gets started once you change your point of view and realize that the hammer and nail, while they are amazing, aren't the only tools in the modern toolbox. The book on comparing programming languages was "Comparative Programming Languages" by Wilson and Clark. No, it doesn't cover LV, but it does break down the elements that they think are most useful to measure when looking at languages for a comparison. It is also useful to see the different ideas that languages implement, and to watch that change over time. Inspired by their categorization, I normally condense this to, Expressive Power, Simplicity & Orthogonality, Implementation, Error Detection & Correction, Correctness and Standards. If I were to go into each of these for both LV and C, it would be a mega-post, and besides, I think it is better for people to do it on their own and come to their own conclusions. As an example, C++ scores better on expressive power than C does. Why? They both have the ability for the user to declare new functions, new variables, and even new types. But C++ goes further to allow for operators like + and - to be expanded for new types, and allows for the -> to be used to dispatch to class member functions. C++ also has additional keywords. This power comes at a price, however, as the sorts of errors you can receive from the compiler go way up, and the overall simplicity goes down. Finally, while most new users initially focus on the text versus graphics difference, this is pretty superficial. There could be a graphics C. Arguably you've already seen that. There could be a textual LV, but defining parallel graphs in text is fundamentally hard and we have instead headed down the graphics road. A more fundamental difference is that C/C++ are procedural languages or imperative languages whereas LV is mostly a functional language. These terms may not mean much, but they are the more important ones to look up and think about. I don't have a great analogy, but that won't stop me from trying one anyway. An imperative language to me is like driving a vehicle with a manual transmission. There are discrete gears, combined in various ratios to direct the engine rotation to the wheels. You control this with a clutch, a shifter, possibly more if in a semi or farm equipment where I can control other differentials. Fundamentally I'm exposed to the implementation and am expected to manipulate the system at that level. Not all settings make sense, and grinding of gears, getting stuck in neutral, and stalling the engine are all common occurrences, especially until you learn the system quite well. But once you understand the system, it is quite powerful and adaptable. A functional language in this analogy is more like an automatic transmission system. Fundamentally the big difference is that the driver specifies what the outcome should be, but not the intermediate details. It may be as simple as F-N-R and a pedal. You still control the velocity of the vehicle, but you have traded control for simplicity. When you inspect the automatic transmission system you may find that it is really a manual with an automated shifter, or you may find a CVT or hydrostatic where it isn't even easy to compare them any longer. A CVT isn't limited to a small number of gear combinations, so is it better than a limited manual transmission? Or is it inferior because of the limits on the amount of power it can transfer? Different approaches to the same problem. Isn't it better to focus on understanding both than to be dogmatic about it? Greg McKaskle |
Re: Why to use LV/C++/C?
Quote:
Quote:
Quote:
Quote:
|
Re: Why to use LV/C++/C?
(C/C++ is procedural, LV is functional)
Quote:
|
Re: Why to use LV/C++/C?
Quote:
|
Re: Why to use LV/C++/C?
Quote:
|
Re: Why to use LV/C++/C?
Quote:
|
Re: Why to use LV/C++/C?
Our team has lost all the programers to graduation. The returning group wants no part of programming. The are several 9th graders who have experience with the lego platform. If they join the team it will be interesting to see how thier use of NXT-G aids them in the programming of the FRC in lab view.
|
Re: Why to use LV/C++/C?
I may be sounding like one of the "older" mentors on this board (perhaps I am? lol, no), but my first programming language I learned was Fortran 90/95. My second was ANSI C. Now when I first started work, I was fairly proficient in either language (really, both languages are good because knowing them, mostly Fortran, is a lost art). However, most of our programs are programmed in LabVIEW. A fundamental difference between these languages is that Fortran and C are "top-down" programming, whereas LabVIEW is a "data-flow" programming language. I do know one thing, LabVIEW does things MUCH easier and faster than C or Fortran (programming wise). For example, you have absolutely no pointers, no worry of memory allocation or anything. It is much easier to use, but it can be quite difficult making the transition for your brain to think in data-flow vs. top-down.
|
Re: Why to use LV/C++/C?
Quote:
I look forward with a mix of anticipation and dread to actually having this stuff in front of me to work with. My optimistic expectation is that I'll quickly realize what simple concept is keeping me from completely understanding what I'm reading, and that I'll finally "get it". (My nagging fear is that I'm a programming dinosaur, stuck in a procedural tar pit and doomed to extinction as the dataflow mammals take over.) |
Re: Why to use LV/C++/C?
Quote:
Your written thoughts created an incredible visual. |
Re: Why to use LV/C++/C?
Quote:
|
Re: Why to use LV/C++/C?
Quote:
|
Re: Why to use LV/C++/C?
Quote:
I will defer to Greg as to whether or not Michael's assertion is true 100% of the time, forever and ever. I simply don't know. What I do know is that typical LabVIEW code reminds me of LISP/Scheme in how it handles basic data types. The Liopleurodons among us may benefit of approaching it from that angle - that was the mental leap that made everything "click" for me. Now I think of LabVIEW as Graphical PythonLISP. To over generalize: Quote:
|
Re: Why to use LV/C++/C?
Several things to comment on.
First -- Eric gets it! Yay. LV is different, not always better or always worse, but because of dataflow, almost always different. It really isn't magic either. Like most industry languages, LV is a mixed bag. A functional core with grafts to allow easier looping and structured programming, more grafts to allow for I/O APIs that use references, and of course the implementation is still missing many of the things that we want it to have. Second -- Michael is correct. LV isn't an ideal realtime language, because it does do allocations implicitly. Some languages alloc almost everything in sight, others make it very explicit. LV has many scalar types, or flat types as we refer to them that are statically allocated, but the string and array in particular, are dynamic. There are in fact bounded and fixed variations of them, which will give you better determinism, but they are not used that often. More on LV memory model later in the post. Third -- I agree with slavik262. There are certainly situations that benefit from tightly controlling memory allocation as well as other resources. But not only is there a tradeoff in the number of details you need to take on for explicit control, but the power of C's syntax in particular is way into the "user beware" camp. Is x=rand(); *x=5; ever what you meant? The time spent finding an outright nasty memory corruption is quite the tradeoff to make. Finally -- Alan, you don't sound like a dinosaur, but perhaps a skeptic. I find skepticism to be a critical element in making new things work. Getting back to the LV memory approach. I'm not sure this statement will help, but the primary LV types have by-value semantics, even if their implementation is by reference. What this means is that each wire acts as an unnamed temporary storage element. It has one writer and as many readers as you like. So if a wire simply runs between the output of + and the input of =, it is really just binding those together functionally. If the wire forks and delivers the data to multiple inputs, there are no side effects to worry about. The data value is delivered to each. It is impossible for another location on the diagram to modify the wire, no matter what order they are scheduled in, how long it takes to execute, etc. This doesn't seem like a big deal at first, but in a parallel language, it is a cornerstone. This is why variables, global or local ones weren't even in the language for quite some time, and why they need to be used very carefully. Multiple writers allow for race conditions, and the parallel dataflow scheduling makes the race conditions a common occurrence. If the actual implementation used a by-value approach, LV would be quite a bit slower and bigger than it is. Instead, the compiler analyzes the graph and allows for temporaries to be folded together. It also takes statements that are more parallel than needed by the computer architecture and serializes them into a statically scheduled snippet to help further with memory reuse. Finally, arrays and string wire forks mean the same as a Boolean, but their implementation is different. They are really alloc'ed buffers, and the buffers are commonly shallow copied to improve efficiency, but not at the cost of simplicity to the user. The exceptions to the by-value semantics are the reference types. Primary ones are I/O such as TCP, files, and UI elements. Copying an entire file around with by-value semantics just wasn't feasible in '83 when they started working on LV, so some APIs expose a reference type which should be closed when completed, similar to most POSIX libs. But trying to improve it slightly, LV does shadow these refs and will close them at program completion or termination, even if you don't. LV certainly isn't magic, and I'll be happy to explain how things work if you ask the questions. Greg McKaskle |
Re: Why to use LV/C++/C?
Quote:
|
| All times are GMT -5. The time now is 16:04. |
Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi