Quorum Release Notes
We post changes to Quorum here.
Quorum 4.0 Patches
This is a list of patches pushed to live. For small patches pushed by the team, we sometimes write notes for the last several. This should be considered an abridged list of changes.
Quorum 4.0.5 September 9th, 2016
This patch includes a variety of small changes as we continue with Quorum 4:
- We have finished the 3D collision system for Quorum 4. This system now works similarly to how 2D collision works.
- Added a new feature allowing fonts to have colors other than black. We had planned this feature for some time and are glad to finally have it in the build.
- Fixed a bug causing SetVolume to set the volume for all sounds, not the individual instance.
- Fixed a bug causing models to scale incorrectly if the object has been rotated.
- Added a way to rotate children embedded in a model, which is called RotateChildren in the Item3D class. An example use case might be if we want to do things like spin spheres around a model.
- Added an action to Item3D allowing the user to Rotate Around a point in space. This new action is in Item3D and has the following signature: action RotateAround(Vector3 point, Vector3 axis, number degrees).
- Added a way to obtain a unique key for each loaded 3D model on the system. To get it, we call GetBlueprintKey in the model class.
- Fixed several small bugs causing an error to be thrown for certain keys inside of a text box.
- Fixed a bug with streamed and non-streamed audio, causing them to share the same ID. This was causing some programs to have side effects if both were used.
- Added an action called GetSource to Mouse Events, which allows the user to determine what fired the event.
- We adjusted the SetVolume and SetBalance actions in audio so that they properly clamp values to between -1 and 1.
- Many of the examples for SetListenerPosition were incorrect in the online documentation. These have been fixed.
- Added a way to connect the game engine into a Java Canvas.
Quorum 4.0.4 August 6th, 2016
This patch fixes a variety of issues found at EPIQ 2016 and after by users. This patch includes:
- Made Several fixes to the sound system, including a case where we accidentally flipped the axis in 3D sound for certain helper actions (e.g., rotation).
- Increased the number of sounds that can be played at the same time in the game engine.
- Fixed a bug causing rotation in the z-axis to rotate counterclockwise instead of clockwise. The other axes had the intended behavior.
- Fixed a bug causing rotation hierarchies (e.g., children several levels deep) to not properly rotate.
- Fixed a bug causing projects loaded on a networked drive in Windows 7 or 10 to not load game engine projects correctly.
- Finished more documentation for the game classes. There is still more left to complete, but this adds quite a bit. Many examples are now included where they were previously missing.
- Added actions to get and set the cursor position in a text box.
- Fixed a bug in text box causing an exception to be thrown if the user typed a space.
- Fixed a minor bug in the compiler causing the system to throw an exception if casts are used incorrectly in a particularly peculiar way.
- Fixed a bug causing layers to not properly handle event listeners if a listener is added directly to the item.
- Added sphere primitives.
- Fixed a usability issue with the Camera class. Its parameter lists were inconsistent, which is now corrected.
We would like to thank Sina Bahram, Pranav Lal, and DJ Prater for their help in identifying some of the problems in the above list.
Quorum 4.0 July 5th, 2016
Quorum 4.0 is the next major update to the programming language. In it, we have provided a variety of new features and improvements for many systems. The highlights of this release include support for 3D gaming (audio + visual), mobile support (iOS only), and significant improvements across the board to the development environment (e.g., navigation, folding). Besides these larger changes, we have spent considerable time making improvements to a large number of systems in Quorum and have expanded on many. This includes the addition of linear algebra libraries, improvements to the existing LEGO libraries, and significant improvements to the design of the game engine. Finally, we have added many new tutorials on a variety of systems.
One of the major features in Quorum 4.0 is a new 3D gaming system. On the backend, Quorum uses OpenGL, one of several standard gaming engines for commercial games. On the user level, however, we have spent significant effort working with people writing games in Quorum to try and iterate on our design. Overall, the 2D system has been improved and simplified in a variety of ways, the overall libraries have been unified, and accessibility support is now baked in in ways we think are easier to understand.
Besides this, 3D support itself has been modeled similarly to 2D. In other words, with 2D, you could load an image or sound and move it around. With 3D, while traditional modeling applications in OpenGL or Direct3D require quite a bit of knowledge about computer graphics, our libraries try to simplify those aspects of the system that we can. The idea is, besides the added dimension, to make the 2D and 3D systems feel as similar as possible to the programmer to aid in learning. Here are some additional highlights for the new engine:
- We added a linear algebra library. The linear algebra libraries include:
- Affine Transformations
- Frustrum Calculations
- Ray calculations
- Games can now be compiled to mobile platforms. In Quorum 4, we are starting with iPhone support, but hope to add Android support in a patch.
- Games now consist of a system of layers. Each layer can contain either 2D, or 3D, content, but may not contain both. Each layer is controlled separately and includes support for both visuals and sound. The application of this approach is that it makes it easier to create independent visuals or aural components, like a user interface on top of a 3D game. Many users will have no need of layers and their use is not required.
- Changed the Item class considerably in order to work for both 2D and 3D. Many actions have been slightly altered or moved to either an Item2D class or Item3D class. We tried not to make changes that broke previous games, except in the case where usability testing revealed a system was difficult to use.
- Collision system: In focus groups and interviews for Quorum 3.0, users consistently had difficulty with the collision system. For Quorum 4.0, we rewrote the system from scratch. It is now, we hope, significantly easier to use. In addition, we have rewritten the technical side from scratch, now using standard approaches from the scientific literature. More enhancements are planned for the future.
The visual aspect of Quorum has now been significantly improved. We now support 3D games, built on our linear algebra library. We have also conducted significant user testing on creating games with our libraries and have spent considerable time re-tooling them in order to make them easier to use. This was conducted for both the 2D game system and the newer 3D one. To make things easier, we have also unified the libraries for 2D and 3D games, so that the way you interact with them is as similar as possible. Below are some highlights from the visual part of the system.
- Cameras: Quorum has now integrated a camera system for both 2D and 3D games. This includes the standard perspective and orthographic modes and the interfaces are unified to make it simpler across dimensions or systems.
- Models: We are supporting two different kinds of modeling formats in this first release, namely g3db, the format used by the well known libGDX library, and wavefront's .obj and .mtl format's. We hope to support more formats in the future.
- Added in a lighting system. Currently, we support:
- Ambient lights: In graphics, these lights indicate the overall lighting of the scene.
- Directional lights: In graphics, these lights indicate the overall lighting coming from a particular direction.
- Point lights: Point lights are those that can be added to the engine and moved around like any other object. You can also attach them other game objects and they will adjust automatically (e.g., a sphere that emits light).
- Adjusted many internal classes to account for multiple operating systems (e.g., various mobile platforms).
- Added support for 3D textures and materials.
- Adjusted the input system to account for changes to all of the others.
- Primitives: Like with 2D, we wanted to simplify making basic images and shapes. For 3D, we continued this by providing a variety of 3D shapes that can be loaded easily and by default.
- After conducting some internal and informal pilot tests, we adjusted OpenGL's coordinate system to be left-handed instead of right-handed. We then unified this across all systems in Quorum. This has no impact on, but is consistent with, the 2D system.
In addition to broad gaming features, we have expanded on the auditory system in Quorum. Here are the features we now support.
- Added in support for creating 3D scenes. This includes making an "Item" version of sounds that you can attach to the game engine and manipulate in real-time. The application is that it allows you to make a character and walk around a 3D environment.
- Added in support to change the listener position in a scene.
- Added in the ability to have doppler shift on sounds.
- Fully tied the auditory system with the visual system so that the libraries match. This make it easier to create games where, once characters are setup, the sounds automatically set themselves up logically without much input from the programmer.
Development Environment Improvements
This update adds a variety of development environment features. This includes brace matchers, highlighters, a rewrite of the navigator, efficiency improvements, and a variety of other features.
- Added brace matching into the development environment. This feature existed in a previous version of Quorum, but was removed in 3.0 temporarily. It is now back and significantly improved.
- The navigator system has been rewritten from scratch. The new version now includes:
- Significant improvements to user behavior like sorting.
- Improvements to keyboard accessibility.
- The addition of control structures into the navigator window. The reason this change was made is due to the study run by Baker, Milne, and Ladner. The design of this new system is not identical to StructJumper, but it hits on the key properties and allows you to easily obtain much of the same information accessibly.
- A fix to an issue that was causing the navigator to be unresponsive when the development environment boots for a short time.
- A few new visual icons for control structures.
- Added code folding into the system. By default, the folds are open.
- Added semantic coloring into the environment. This includes coloring fields green, bolding action and method names, and other features common to programming languages.
- Added occurrence marking. This includes highlighting components that are semantically related (e.g., variables in the same scope).
- Included a number of improvements to code completion. This includes:
- Better responsiveness overall.
- Primitive types now correctly show code completion values.
- Types involving parent variables now correctly walk you through a call. For example, if you type parent:, it will provide you what words are legal next. Similarly, once a parent is chosen, the actions and fields from that parent will be shown.
- Quorum 4.0 now includes editor hints. When a user makes a mistake, like
having a compiler error or other problem, in some cases Quorum can detect
what the problem was and automatically fix it on request. This does
not work for all possible types of errors that can be made, but is useful
for common situations. In all cases, editor hints have the keyboard shortcut of
ALT + ENTER. Some examples of the hints provided by the system are:
- Automatically Find Use Statements: If you want to use a library, but do not remember the correct use statement, you no longer have to. For example, if you type Game game, and get a red line, Quorum will ask if you want to "fix" the error, which will put the correct "use" on the top of the file.
- Automatically Compute Return Types: If you have an action that is called, like MyAction(), but you don't remember its return type, Quorum will now automatically fill in the left hand side of that expression. So for example, it may convert "MyAction()" to "text value = MyAction()"
- Fixed a wide variety of bugs involving parsing. Some of these caused red lines to show up in inappropriate times.
- Added accessibility support for most of the new development features. The two exceptions in this release are improved accessibility support for GIT/version systems and code folding. Both systems are possible to make accessible, we think, but the way they are integrated into NetBeans. We plan to focus group the known issues this summer to evaluate whether the fixes should prioritized over other potential features.
General Improvements and Bug Fixes
This section includes a variety of improvements or bug fixes the team worked on for this release.
- Added support for the LEGO Gyro sensor.
- Significantly reduced the delay on booting up LEGO robots in Quorum
- Made significant improvements to the documentation generator in Quorum. These include:
- Updated the look and feel to try and make it easier to read.
- Added a summary table for actions.
- Added a summary table for variables.
- Significantly filled out the backend of Quorum in regard to how it tracks source code. This should make it easier to add support for other development environments in the future, if we decide to do so.
- Significantly re-tooled Quorum's web support. This is part of a long-term project on the team. Technically, it could be used today, but we are intentionally not creating tutorials or lessons for it, as we are actively adjusting the system in the lab. Eventually, Quorum's website will be rewritten in Quorum using this system.
- We rewrote the random number generator class to use the standard Mersenne Twister algorithm.
- Included one minor bugfix to bitwise operations.
- We made a variety of optimizations to Quorum, which ultimately causes the compiler to compile itself approximately 17 percent faster on average. As the Quorum project continues, we will optimize further, and test under a variety of other conditions, over time. Users needing optimizations for particular applications can make requests on the mailing list.
- We removed the blueprint package for data structures. This was a small optimization in our system and the package was not really used in a meaningful way anyway. This simplifies the inheritance hierarchy of our data structures.
- We moved the Iterator class to Libraries.Containers.Iterator, out of the now removed blueprint package.
- We have included a variety of minor compiler bug fixes the team has completed over the last year. As the compiler has become more mature, these have become increasingly esoteric (e.g., better accounting for user error).
- Improved the clarity of some compiler messages based on user feedback. We think there is more work to do here, but we are making these changes slowly, carefully, and with user feedback.
- We fixed a number of issues related to how various screen readers work with Sodbeans. This especially includes details of our startup scripts.
- We changed the startup script to now say Sodbeans 6.0 instead of NetBeans. So far as we could tell, some users seemed to prefer it says Sodbeans so they can identify it when it starts up. This used to be the case, but changed in Sodbeans 5.0. It has now been changed back.
- A list of bug fixes tracked by our bug tracker (Jira) can be found on that site.
We have made a number of changes to the online documentation in Quorum, including adding a variety of lessons and tutorials. These include:
- The events tutorial has been split into four separate ones. These include input polling, mouse events, collision, and touch events.
- Added a touch events tutorial for mobile platforms.
- Updated the collision tutorial for Quorum 4.0.
- The drawing and animation tutorials have been renamed to account for changes to the system.
- Added a tutorial on loading 3D models and drawing them in 3D.
- Added a tutorial on basic animations in 3D (e.g., rotations, scaling, moving)
- Added a tutorial system on how to manipulate the camera.
- Added a tutorial on lighting.
- Modified the tutorial on creating 3D sound scenes, now including the use of doppler and the new Audio3D class. This new class is used to attach Audio objects to 3D moving items.
- Added a tutorial on using 2D or 3D layers.
- Adjusted the LEGO tutorials to include the gyro sensor.
- Added a tutorial on team programming in Quorum.
Minor Quorum 3 Update Releases
This section includes a variety of minor releases for Quorum that were released to the update servers between Quorum 3 and Quorum 4. All of these bug fixes were rolled into Quorum 4.0.
Quorum 3.0 Update 48 July 22nd, 2015
This update is deployed to the update centers.
- Added a new action for custom colors in the Color class.
- Fixed a bug in the speech engine causing some say statements to not output sound correctly.
- Fixed a bug with the Error Window hotkey causing it to not work if the C++ modules are loaded.
- Changed the Error window hotkey to CTRL + ALT + SHIFT + 9
- Changed the text-to-speech toggle to CTRL + ALT + SHIFT + T
Quorum 3.0 Update 44 July 21st, 2015
This update is deployed to the update centers.
- Changed the loading of the game engine plugins to include a static initializer.
- Fixed a bug causing the Enable Looping action in Audio to not work correctly.
- Fixed a few additional minor bugs.
Quorum 3.0 Update 43 July 16th, 2015
This update is deployed to the update centers only.
- Fixed a bug causing self-voicing to fail on bootup if you were using JAWS or NVDA and you installed the sleep scripts.
- Fixed a bug in the game engine causing children to not properly respect the scale, rotation, and orientation of their parents.
- Added a hotkey and menu item for turning text-to-speech on and off.
- Changed the name of the menu called Magnification to Accessibility.
- Fixed a bug in the project properties window forcing the user to reboot NetBeans in order for a name change to take effect.
- A few additional minor bug fixes.
Quorum 3.0 Update 42 July 9th, 2015
This update is deployed to NetBeans only, but not as a separate zip file on the release servers.
- Actually fixed bug with Lego Robot files not properly being sent over to the robot on Windows.
- Added a test case and fixed a compiler bug.
Quorum 3.0 Update 41 July 8th, 2015
This update is deployed to NetBeans only, but not as a separate zip file on the release servers.
- Fixed a bug with scaling in the game engine.
- Fixed a bug with code completion showing the wrong documentation.
- Fixed a bug with Lego Robot files not properly being sent over to the robot on Windows.
- Finished the documentation for the game engine. Items should now show up correctly in code completion.
- Finished the documentation for the lego robot systems. These should also now show up correctly in code completion.
- Fixed an issue in the documentation generator causing robots to not show up properly.
Quorum 3.0 June 30th, 2015
Quorum 3.0 represents the most significant change to the Quorum programming language since its inception and is a near-complete rewrite. When the Quorum project first began, it was written in Java, was interpreted, and we were really just trying to make programming a little easier. As of 3.0, the project has gone further than we ever imagined: Quorum is now faster, robust, and written in itself. As is a long tradition in programming language design, once a language is sufficiently powerful to write the next version in itself, so-called self-hosting, it is a sign that the language is becoming increasingly mature. On Quorum, we have finally reached this milestone and will now be shifting our attention to improved library and development environment support. Library requests to the team, or contributions, are welcome.
We had a number of technical goals in mind for the Quorum 3.0 release. We highlight some of the most significant alterations below:
Standard library changes
- Game Engine 1.0: Quorum now supports a computer gaming engine (in OpenGL). In the first release
we are supporting 2D graphics and basic 3D sound (through OpenAL). The design
of the system was inspired in part by the excellent LibGDX project. Some of the
major features include:
- OpenGL 2D graphics. The OpenGL aspect is wrapped using LWJGL for efficiency and is used similarly to other toolkits on the market.
- Event handling (e.g., keyboard, mouse)
- Font rendering through the FreeType font libraries.
- Open AL support for audio. In this first release, we support .ogg and .wav files. This library replaces (and upgrades) the existing sound libraries.
- A game creation architecture. This includes a variety of support classes to try and make it easier to create computer games.
- Automatic collision detection support.
- Basic support for texture atlases (ImageSheet objects in Quorum speak).
- A significant amount of documentation and curricular lessons designed to help people learn how to program games in Quorum. Some of this material will come out on the June 30th release, while more will trickle out over time as we write it.
- Lego NXT robotics toolkits are now supported. Specifically, we now support connecting to lego robot kits, which can be used for a wide variety of purposes. Most major functionality in the lego kits are supported.
- Removed support for Botball robots. We feel as if this library was generally not used much by the community and have decided to cease support. Continuing support for this would have required us to re-tool the system to support the new Botball kits, but we decided to focus time on Lego instead, as these kits are cheaper and more popular.
- Included a wide variety of small changes or improvements to the standard library. Many of these came about due to the bootstrapping process, or teaching Quorum to compile itself.
Integrated Development Support changes
- Sodbeans has largely been rewritten from scratch. The reason we did this is because we largely had to, given the new compiler.
- The module system used by Quorum has been significantly condensed. This will make the update process easier in the future.
- Accessibility Support is now in its own module. A new Accessibility preferences pane provides a variety of new accessibility options.
- Speech now works in IDE on Mac OS X.10, even for components that do not read properly in JDK8 or NetBeans. This is only true if self-voicing is active.
- Several bug fixes to the Quorum debugger have been implemented compared to the 4.6 release. This includes fixes for efficiency as well as user interface improvements.
- The IDE experience has been significantly improved, with much more responsiveness from Quorum generally.
- Integrated an Image Sheet Generator for the new game engine. This generator allows the user to automatically generate ImageSheets in IDE to simplify the process compared to kits like LibGDX, where the process can be somewhat confusing.
- Fixed a bug related to the IDE using too many CPU cycles after a number of runs of Quorum.
- Changed all API calls to use the new Quorum 3 implementation, with relatively little supporting Java code in the IDE. This should make it easier to port Quorum to other IDEs, for those that prefer different systems.
- Improved the project user interface in the properties window of Quorum projects.
- Added support to wrap in custom plugins or jar files into Quorum projects. Users should only do this if they know what they are doing, but this new system provides a much more convenient method for connecting between Java, C/C++, and Quorum, including full access to the JDK, C libraries, etc.
Major language changes
- Quorum now uses an ANTLR 4 backend. Many compiler phases in the language are now considerably faster, thanks largely to Terence Parr's clever work.
- Quorum's exception (called Errors in Quorum) system has been redesigned from the ground up. In the new approach, users will always see Quorum errors, never the Java/other equivalent, providing a unified approach.
- Quorum can now generate Java bytecode directly using the excellent ASM bytecode library. Others can use this library for bytecode generation as well. The entire JDK spec is not supported in our hooks to ASM, as we started with features specific to the Quorum compiler, but quite a bit is supported.
- Fixed a bug in Quorum 2.0 that didn't allow us to support action chaining (e.g., a:b():c()). Code completion is not yet finished for chained values.
- A significant optimization pass has occurred for programs generated in Quorum, making programs have faster execution and bootup times under some circumstances.
- Quorum is now fully written, and compiles in, itself. In other words, Quorum 3.0 was compiled in Quorum 2.2 (and then 3.0). The final version of Quorum 3.0 is compiled in Quorum 3.0.
- Quorum's compiler error messages have been redesigned using evidence gathered by Lee and Ko as a loose guide. More work is needed here, as the language and messages are different than Lee/Ko's, but it's a potential improvement until more or better evidence is found.
- Fixed a bug in the way Quorum handles inheritance, which ultimately changes how plugins are written. While users generally do not have to use this system, this causes any hidden variables written by the compiler to have slightly different names (e.g., $Interface to _). Also, because of this change, variables, actions, and classes can no longer have an underscore as its last character.
Type system/variable changes
- Removed a number of cases where Quorum was being slightly "too flexible" in its conversions between various types, especially in regard to auto-boxing.
- Fixed several issues where Quorum was making strange decisions in what it was allowing users to do (e.g., action Test returns text would allow return false).
- Fixed issues with not being able to pass undefined values to text fields under some circumstances.
- Fixed a couple bugs with how fields and variables were implemented in bytecode.
- Carefully adjusted the amount of type inference allowed on the inside of actions. The value is somewhat conservative and needs to be evaluated in empirical studies. Currently, we know of no randomized controlled trials on how much inference to allow. Users that do have evidence from randomized controlled trials should get in touch with our team on the mailing list.
- Made auto-boxing as transparent as possible, with the hopes that we can eventually disallow use of capital letter types (e.g., Text vs. text).
- In almost all cases now, actions can be called, and chained, on primitive values without any auto-boxing. In other words, calling actions on primitives is quite efficient in Quorum, as values have low memory footprints, but yet still "look like" calls to objects in other languages, even though they technically are not. Users should not notice a difference with previous releases, with the exception that chaining is allowed.
- Significantly redesigned the testing for the type system, with future improvements in mind. Especially, we have been designing programs to auto-generate test cases that ensure each part of the type system is properly exercised, where, importantly, we can regenerate the entire suite if a change to the type system is made (hopefully with corresponding evidence).
Exceptions (Error) system changes
- This system has been fully redesigned. This is a backend change and does change how user's use errors. It does, however, make the system work considerably better.
- In the new system, Quorum Error classes, must inherit from Error, and only, Error. The reason is due to a quirk in Quorum's inheritance system. This is a potential issue that needs further study, but allows the runtime system to have considerable flexibility in how it handles errors.
- Errors generated by the underlying backend are now caught and automatically converted to Quorum style. This allows us flexibility in the system, so that we can study aspects of it in future empirical studies. Previously, we could not modify these internal aspects, giving us too little wiggle room when designing empirical studies to study this system.
- Detect blocks can still contain multiple types (e.g., detect e is CastError), but the compiler now guarantees these are unique. the Quorum 2.0 branch was intended to work similarly, and was close, but this fixes a few edge cases.
- Detect blocks may now be rewritten to a new location by the bytecode generator. This will not impact the semantics of a program, but we have it in the notes in case it is confusing to someone that looks at the generated bytecode.
- Leaving off a type for a detect block makes it automatically of type Error, which is now a catch-all for all possible kinds of system or Quorum errors. This error is guaranteed to be written last in the bytecode generation. In other words, any block of type Error is written last and catches any and all errors, even if these errors were generated by the underlying virtual machine.
- Users that find a Java/other error that gives an error message that is difficult to understand should email the mailing list. These issues are easily adjusted now without changes to the compiler itself.
- Fixed a bug that caused Quorum to run forever and need to be killed if an exception occurred in a generated program.
- Adjusted the API for the Error classes making them more consistent, generally, and also making them conform to more modern naming schemes used in Quorum. For example, previous studies showed the word "output" was more intuitive than "print," so this release changes PrintStackTrace to OutputStackTrace. Obviously, the difference is pretty minor, but increases consistency overall.
- Considerably improved the stack trace information presented from errors.
- Errors do not now have a corresponding interface type generated, unlike all other Quorum classes in bytecode. The reason is because of the way Java handles exceptions in regard to its inheritance hierarchy (e.g., Throwable and below).
Control Structure changes
- If statements now properly short circuit. This was a bug in Quorum 2.
- Included a number of optimizations at various points in the control structure pipeline.
- Simplified the bytecode generation for various kinds of expressions.
- Fixed a bug in if statements that, under very rare circumstances, caused a bytecode verification error.
- Added preliminary support for the ASM bytecode library to Quorum. This initial version is somewhat bare bones in this first release, but still is sufficient to implement much of a modern compiler built on JDK 7 or 8. Teams interested in using Quorum to generate bytecode that need additional support are encouraged to get in touch, as generating bytecode in Quorum is relatively easy (so far as bytecode writing goes).
- Added parsing/semantic analysis libraries for Quorum. Others can inherit from these and garner full ANTLR 4 support for reading Quorum source
- All symbol tables, analyzers, and generators are public and easily modified for those wanting to write support for Quorum into IDEs or tools, either online or offline.
- Bytecode generation/semantic analysis is now done in two-passes, which simplifies finding/fixing bugs and the generation process compared to the Quorum 2 branch.
- Fixed a host of minor bugs throughout the language.
- Considerably improved Quorum's automated test suite generally, giving us increasing confidence that we are properly exercising each system. There's always more work to do on testing, but it's a substantial improvement.
- Fixed a bug causing compiled Quorum programs to load very slowly.
- Input commands now work from the command line, but do not pop-up a window. To make input scalable we have changed the in-IDE behavior as well, now using the standard input box line in NetBeans. This behavior is, we feel, somewhat confusing, but is a tradeoff that fixes a significant bug in Quorum 2.0.
- Added a separate command called input, with no parameters, which allows the user to request input without outputting information first.
- Quorum now requires default values for variables on the inside of actions or in fields. The reason is because Quorum was allowing seemingly rather arbitrary defaults to be selected, which appeared confusing to some users. For example, "boolean a" could default to either true or false. While we could argue one way or the other, forcing a right-hand-side makes the decision explicit.
- Because of the flexibility of the ALL-STAR algorithm in ANTLR 4, it was relatively easy to fix an issue with negative numbers not correctly parsing under a few (relatively unimportant) circumstances. This was never a major problem, but does make expressions just slightly more flexible and was an annoying bug the team wanted fixed.
- Fixed a number of issues with the way parent actions or fields were called.
- In classes that explicitly declare system actions, the plugin generated is now accessible from inside the plugin architecture. To access it, users can access the variable named plugin_.
Quorum 2.1 December 16th, 2013
- Added a peer review system for Quorum's standard library.
- Added a submission system for the standard library.
- Added a badging system for recognizing users that contribute to Quorum.
- Added an information page on the submission system and process.
- Fixed a broken connection causing the accessibility libraries to not properly show up in the library list.
- Fixed a bug causing certain primitive types to not hash correctly.
- Fixed several minor bugs in the standard library.
- Added new data libraries for reading XML files and CSV files.
- Added a number of new additional test cases for various components.
- Fixed a rare verifier error in the compiler.
- Fixed several other small compiler issues.
Standard Library and compiler Fixes/Changes
Quorum 2.0.1 August 13th, 2013
This is a bug fix release for the Quorum 2.0 branch.
- Finished and integrated the Mac OS X version of the accessibility libraries. While the accessibility model on Mac is very different than on PC, the Quorum libraries should work as similarly as we could make them on each platform.
- Fixed a bug causing the output buffer to not be cleared correctly on shutdown of a program.
- Fixed a number of bugs in the accessibility libraries.
- This is a Sodbeans release only. We are in the process of fixing one more important bug on the 2.0 branch before we put out a new Quorum installer. As such, those wanting this particular version of Quorum will need to get the updates in Sodbeans.
Quorum 2.0 June 6th, 2013
Quorum 2.0 includes a host of improvements to the type system, adds the ability to call actions on primitives, includes minor syntactic improvements, and enhances the code completion helper libraries.
- Type System Changes:
- Actions that return a primitive text value can now return undefined.
- Text primitives can now be assigned as undefined.
- Added the ability to call actions on primitive values. For example, we can now add a colon after an integer and call any action provided by the Object version of the primitive. Generally, this makes it far less necessary to instantiate an object for a primitive type. The solution for this is relatively efficient, as behind the scenes, Quorum calls a static action, with only very slightly more overhead than calling the action on the object.
- Added all of the new type system features into the code completion APIs, meaning that integrated development environments using Quorum, like Sodbeans, should get them for automatically and without alteration.
- Language Additions/Changes:
- The "print" keyword has been changed to "output." This change conforms to data from our surveys with novices, in addition to conforming to common sense. For example, getting input from Quorum required using the word input, but getting output previously required using the word print. This made little sense, as print could have meant printing to a printer, not necessarily printing to a console. This way, input implies input and output implies output, making the language more consistent. All standard library materials, book materials, and curricular materials have been altered for the change.
- Changed the phrase "of type" in the Error architecture to "is."
- Changed the phrase "is a" in the inheritance system to "is."
- Finished a very basic initial version of accessibility APIs for Quorum. This version is largely a proof of concept, but provides some infrastructure calls down to various operating systems and unifies accessibility calls (NSAccessible, IAccessible). This first version is available only for the Windows operating system and only works when using compiled mode. It does not yet function in interpreted mode or on Mac or Linux.
- Fixed a bug in the compiler causing extra items to sometimes be wrapped into an output .jar file.
- Added the -server command line flag. This flag turns Quorum into an HTTP server, where code can be sent to it and the output is returned. Additionally, the -server insecure can be called turn off security settings while in this mode. This last mode is not recommended unless the user is running the server locally.
- Added a new flag, -java. This flag allows the user to pass an existing Java jar file to Quorum. When passed, Quorum will automatically wrap any code into the built jar's manifest on compile. This should make it easier for external groups to combine their existing Java code with Quorum projects.
- Finished a significant optimization pass of the compiler. There is always more work that can be done in this area, but a number of the bottlenecks in the Quorum 1.7 branch and earlier have been hammered out.
- Significantly improved the -verify flag, which now gives a much better idea as to which methods have non-compiling, missing, or otherwise broken examples in the documentation.
- Removed the "quote" token from the language. Now, the text primitive or object can return special character codes by calling actions, including arbitrary unicode values. Helper methods are available for common special characters (e.g., newline, quotes, tabs).
- Lots of bug fixes.
- New Quorum Website
- The website now has a much improved look and feel.
- The page for finding files in the standard library is now grouped by category, hopefully making it easier to find classes.
- The Quorum website is now easily searchable.
- Users can now login to the website through google or a custom account.
- Pages with documentation generated by the compiler now allow the user to rate various attributes of a class (e.g., the class name, variable names, action names). The user must be logged into to rate.
A number of changes have been made to the type system, finishing off
a set of long planned alterations. We hope now that Quorum conforms to
the best available empirical evidence.
We have substantially revamped the Quorum website, including adding the
ability to run some Quorum programs online and the ability to rate
the words/symbols used in the standard library, in an effort to improve
Quorum 1.7 February 25th, 2013
Quorum 1.7 adds in a new type inference system, upgrades the internal architecture substantially, and fixes a number of known bugs.
- Quorum now has a type inference system that can be used on the inside of actions (but not in declarations). In effect, this means that users can write phrases like "a = 5" and the compiler will still statically check, but will allow the type declaration to be excluded under many circumstances. This new system partially completes changes to the Quorum 2.0 type system, which conforms to user studies with humans done by our team and Stefan Hanenberg.
- Substantially altered the static analysis tools internally to Quorum. This greatly increases the quality of the types of tools that can be built on top of the compiler. For example, Sodbeans now has much better code completion support due to this upgrade.
- Added new web libraries for Quorum. This initial version is in beta and will be completed in Quorum 2.0. The current version, located in Libraries.Web supports the HTML 5 specification (or by calling print "my page here"). There are a number of limitations in this first release, but a basic web server can be created by passing the -web tag to the compiler (or in Sodbeans).
- Added a hash table to the standard library under Libraries.Containers.HashTable.
- Added a class for handling bitwise operations to the standard library under Libraries.Compute.BitwiseOperations.
- Made more changes to the compiler errors output by Quorum as part of our continuing mission to make Quorum easier to use.
- Updated and expanded the curriculum and documentation for Quorum.
- Added a way to pass and use command line arguments.
- Fixed a bug with the "me" keyword.
- Fixed a rare, but critical, bug in the inheritance system.
- Fixed an odd bug in the scoping system.
- Fixed a number of small edge-case bugs.
Quorum 1.6 September 9th, 2012
Quorum 1.6 contains a number of important bug fixes.
- Fixed a number of bugs with the error system (called exceptions in other languages). These changes include a near rewrite of the bytecode generation algorithms for this system.
- In order to help identify problems in the future, we have added a considerable number of test cases for the errors system. We think these tests offer a much more complete automated suite for this part of the compiler.
- Fixed some bugs in the control flow analysis algorithms. These fixes will not impact the runtime behavior of any Quorum programs, but will make alternative control flow sequences that are illegal or impossible a little bit more obvious.
- Improved the clarity slightly of a few compiler errors. As always, making compiler errors easier to understand is a work in progress.
- Fixed a number of small edge-case bugs.
Quorum 1.5 June 26th, 2012
- Significantly altered the syntax for conditional statements (if). The reason for this change is because we ran an empirical study, which showed evidence that novices using this construct made consistent errors, especially in the use of the token "then" and "end" on the inside of else if constructs. There is still one more set of tests we would like to run on this construct, to reveal whether the keywords "else if" lead to higher accuracy than our current choice, "elseif." We have not yet discovered clear empirical evidence in the academic literature, so will probably end up running the tests on our own. Below we give a quick example of the change.
We previously had the following:
if a = b then end else if c = d then end else then end
The syntax is now the following:
if a = b elseif c = d else end
We may change the design of this construct again in the future if we find more, or better, evidence for against any particular design. Users, or other researchers, that have conducted formal empirical studies, with corresponding evidence, that they think might illuminate more decisions here should let us know.
- Made minor changes to check-detect syntax. Like if statements, we removed the inner "end" statements. We did not run a formal empirical study on this change, but we thought it was a likely conclusion, given the if statement results. Further, this change keeps our language consistent across language constructs.
- We now have a new Quorum Interpreter
- In internal tests, this includes a speed increase from between 1,100% and 21,000% speed improvement for simple examples. This timing data includes just the speed the interpreter runs, not compilation speed.
- This interpreter is now used by default if the -interpret flag is used. For example, "quorum -interpret Main.quorum" would use the new version.
- Added quite a few new compiler tests. These tests have helped us to identify and fix a host of bugs (mostly minor) in the compiler, including a host of edge cases.
- Quorum now has a significantly improved documentation generation system
- Changed the -document flag so that it now auto-generates HTML5 documentation for Quorum libraries.
- Added a new flag called -verify, which automatically checks that any "examples" used in the documentation compile.
- Updated the online wiki Quorum documentation to the 1.5 syntax.
- Significantly improved the quality of code examples in Quorum documentation.
- Fixed a major compiler bug that didn't allow the user to access parent variables.
- Library Changes
- Completed a total redesign of the File class. We're looking for feedback on this class, but hope that it will be easier to use.
- Minor bug fixes in the music and sound classes.
- Fixed a number of bugs in classes like Random and the Containers.
- Added a new class called Libraries.Sound.Audio, which can playback media files. In this first release, it is designed to make it easy to playback .wav files easily. Future releases will probably expand the functionality further, depending on whether we get any user requests.
- Added a new set of Robot Control Libraries for interacting with iCreate's CBC robot controller.
- Adjusted the design of Compiler error messages. Our changes here are pretty minor, but our goal was to generally make the messages more consistent and obvious to users. users that find error messages that still are not clear should please feel free to file a bug report.
- Lots of bug fixes.
Quorum 1.0 January 30th, 2012
This is the initial release of the Quorum programming language. Currently, Quorum has the following features:
- Fully compiled down to Java bytecode
- Static, but flexible, type checking
- Unique control structures, heavily tested to be easy to understand by novices and professionals
- Object-oriented language
- Standard Library (e.g., data structures, music generation, text-to-speech)
- Plugin system for extending Quorum
- Integration with the NetBeans IDE
- Talking Omniscient debugger (The debugger literally talks to you and tells you what is going on).